Compare commits
213 Commits
d31a809fa8
...
research
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ae1d7245f4 | ||
| bb021ae9ac | |||
| bfb4e128f5 | |||
| 2f9b33e4ca | |||
|
|
48c37e0810 | ||
| b869a82fae | |||
| e61a8e372d | |||
|
|
f5a74991c9 | ||
|
|
e58e8540c9 | ||
| e75ed7684e | |||
| 918d71072b | |||
|
|
242bc7a01d | ||
|
|
02ad8a340a | ||
|
|
0c250a21b4 | ||
|
|
f781060e7b | ||
|
|
832c9101ab | ||
|
|
c48e836f8e | ||
|
|
6f0780ac2e | ||
|
|
5acb91e584 | ||
|
|
f66ba9e6fa | ||
| 7a90cb8db9 | |||
| dafe87fad8 | |||
| c44747e2c2 | |||
|
|
341c765c73 | ||
|
|
ed6cc294a5 | ||
|
|
a77dc718f9 | ||
|
|
86953a91a1 | ||
|
|
b8f38db351 | ||
| cabbb653bd | |||
| 99533c12b6 | |||
|
|
7fb7ffaced | ||
|
|
59da67e4b4 | ||
|
|
1428f191dd | ||
|
|
13024cdd99 | ||
|
|
fd85ea02c1 | ||
|
|
c196ab6678 | ||
|
|
c005b85c06 | ||
|
|
b50dbbc246 | ||
|
|
01d09f4c34 | ||
|
|
79c9a66296 | ||
|
|
761b1b3512 | ||
|
|
b2cb7378d6 | ||
| 4d9ea75146 | |||
| f7e6926ee9 | |||
| 7aba4e30c9 | |||
| dc1ab330cf | |||
|
|
18c70fe6a3 | ||
|
|
5c746aca4d | ||
|
|
72c4898101 | ||
|
|
a905971dae | ||
| 69643dbc83 | |||
| f3a707d6d8 | |||
| 8f4a43db14 | |||
| 186a158114 | |||
| 3da4a97400 | |||
|
|
96b3636aea | ||
| 228e3d56b5 | |||
| 99ea7eedc7 | |||
| d4fb435db9 | |||
| 0c8b3ee8f1 | |||
| ca782d0aff | |||
|
|
3dfb607b91 | ||
|
|
981b4dad5c | ||
|
|
181e6a87b8 | ||
| 287825b4bf | |||
| 1ffc303721 | |||
|
|
bdf1bb2669 | ||
|
|
1fe79ffcf9 | ||
| 758f63615a | |||
| 20145742c5 | |||
| 8ec9b1bcea | |||
| a9cb6e16e9 | |||
|
|
5690fc6c5b | ||
|
|
9db6a589f0 | ||
|
|
896490e57b | ||
| fca04ba44b | |||
| 25e4fc06c6 | |||
|
|
4bd7740753 | ||
|
|
c428bfd93b | ||
|
|
2a29c6b2cc | ||
|
|
e9d7203804 | ||
|
|
5d7cec520b | ||
|
|
fe72df0c07 | ||
|
|
7c04332290 | ||
|
|
73d912d3cd | ||
|
|
b320294764 | ||
|
|
4913d02c93 | ||
|
|
56916c8d10 | ||
|
|
393a06eceb | ||
|
|
fdb6a87ab4 | ||
| 6d868c7c7a | |||
| 89a89ea5ef | |||
|
|
811e179889 | ||
|
|
0e0eed2566 | ||
|
|
8588c74ffd | ||
|
|
62e7f34c98 | ||
|
|
8f0a56965f | ||
|
|
59422e54d8 | ||
|
|
012f0ef1b5 | ||
|
|
ec4ae4a259 | ||
|
|
8da66d54c0 | ||
|
|
2839953d8e | ||
|
|
2d5d1b7a5e | ||
|
|
33aaf0b600 | ||
|
|
bf4d7bdba8 | ||
|
|
944071201d | ||
|
|
f6556ec9a9 | ||
|
|
8967439d4e | ||
|
|
85ae158952 | ||
|
|
813d2e9645 | ||
|
|
d94ade6641 | ||
|
|
eda893ce10 | ||
|
|
c8cb2de9ab | ||
|
|
7cda2cce27 | ||
| 41893cab86 | |||
| b23531f18b | |||
| de78bfc051 | |||
|
|
0a507fb158 | ||
|
|
a18dead4ff | ||
|
|
76047b763d | ||
| 0930e8cc77 | |||
|
|
9f09a2f31b | ||
|
|
1e0bf83d12 | ||
|
|
1764e2a0bf | ||
|
|
0729917a7e | ||
|
|
b7f7aea0b7 | ||
|
|
4dfa9433fd | ||
|
|
79293901b3 | ||
|
|
03a9e2f52c | ||
|
|
fb1d09d98e | ||
|
|
8ff7a31e92 | ||
|
|
65323febee | ||
|
|
b158341d6e | ||
|
|
44674b5396 | ||
|
|
9cecbdcf9b | ||
|
|
a6b0a60eb6 | ||
|
|
68067aa777 | ||
|
|
ca6fe65dd8 | ||
| 564e179082 | |||
| dc469add22 | |||
| d54e656192 | |||
|
|
ba49b02ebe | ||
|
|
06fa763f26 | ||
|
|
6ad81a1896 | ||
|
|
9b0ec12738 | ||
|
|
26abb2aa88 | ||
|
|
07b7a6f1d7 | ||
| bff3ea8459 | |||
| 29e68757a6 | |||
| 12ea0f7c35 | |||
|
|
920d01a972 | ||
|
|
13b4767992 | ||
|
|
086481bfb9 | ||
|
|
89bdba45be | ||
|
|
8d0b792fd4 | ||
|
|
a6bfca3b2f | ||
|
|
a1b51d5807 | ||
|
|
2f32cee502 | ||
|
|
a05655da1c | ||
|
|
6cdc8c5486 | ||
|
|
972743d3b8 | ||
|
|
df5cb918a2 | ||
|
|
bc8ce0bd47 | ||
|
|
4afe1b637e | ||
|
|
55ede508cb | ||
|
|
fbb66fd192 | ||
|
|
c87b41ae11 | ||
|
|
142c24a947 | ||
|
|
2ee200e1ba | ||
|
|
86db2f22a1 | ||
|
|
9cc012b851 | ||
|
|
c5b7365977 | ||
|
|
43464ae85e | ||
|
|
39c85cd1d1 | ||
|
|
3c77c97532 | ||
|
|
2ab23d0f30 | ||
|
|
85d4569a25 | ||
|
|
cd7d572e43 | ||
| 37157ca94d | |||
| a30897a4b2 | |||
| 9a62d277f2 | |||
|
|
0de5fe276a | ||
|
|
ca17956135 | ||
| 028c6a6540 | |||
| 9d8c3155e6 | |||
|
|
6c921730ef | ||
|
|
eaa94edfac | ||
|
|
1b30a7a873 | ||
|
|
59399d672f | ||
|
|
bb5c319a7f | ||
|
|
b114d352f6 | ||
|
|
ea4b27776a | ||
|
|
faa6db9c73 | ||
|
|
6b5c2c0b2e | ||
|
|
de3cb37bc1 | ||
|
|
9a69450fb6 | ||
|
|
513eac9e49 | ||
|
|
8c4f4c206b | ||
|
|
c731df2ae7 | ||
|
|
40c9bb1190 | ||
|
|
ef1c1c349d | ||
| 1c49dc25b1 | |||
| 542583efc6 | |||
| f8f5b98854 | |||
|
|
39a65add7c | ||
|
|
0feade1f5b | ||
|
|
5d45eee7a3 | ||
|
|
07c261d74c | ||
|
|
fc28d78357 | ||
| fb1bfc353c | |||
| cc0127f195 | |||
|
|
f4043d6f61 | ||
|
|
1df7b62fe6 |
2
.env.dev
@@ -7,5 +7,7 @@ VITE_APP_BASE_URL = 'https://develop.api.aida.com.hk'
|
|||||||
# VITE_APP_BASE_URL = 'https://www.api.aida.com.hk'
|
# VITE_APP_BASE_URL = 'https://www.api.aida.com.hk'
|
||||||
# 徐佩
|
# 徐佩
|
||||||
# VITE_APP_BASE_URL = 'http://192.168.31.118:5567'
|
# VITE_APP_BASE_URL = 'http://192.168.31.118:5567'
|
||||||
|
# 李天祥
|
||||||
|
# VITE_APP_BASE_URL = 'http://192.168.31.82:5567'
|
||||||
# 海波
|
# 海波
|
||||||
# VITE_APP_BASE_URL = 'http://192.168.31.34:5567'
|
# VITE_APP_BASE_URL = 'http://192.168.31.34:5567'
|
||||||
|
|||||||
@@ -5,4 +5,3 @@ VITE_USER_NODE_ENV = 'development'
|
|||||||
VITE_APP_BASE_URL = 'https://develop.api.aida.com.hk'
|
VITE_APP_BASE_URL = 'https://develop.api.aida.com.hk'
|
||||||
|
|
||||||
# VITE_APP_BASE_URL = 'http://localhost:22170'
|
# VITE_APP_BASE_URL = 'http://localhost:22170'
|
||||||
|
|
||||||
|
|||||||
33
.prettierrc.js
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
/** @type {import('prettier').Config} */
|
||||||
|
module.exports = {
|
||||||
|
// 打印宽度
|
||||||
|
printWidth: 100,
|
||||||
|
// 使用 4 空格缩进
|
||||||
|
tabWidth: 4,
|
||||||
|
// 使用 4 空格缩进,不使用制表符
|
||||||
|
useTabs: true,
|
||||||
|
// 行尾使用 LF (Unix 风格)
|
||||||
|
endOfLine: 'lf',
|
||||||
|
// 语句末尾使用分号
|
||||||
|
semi: false,
|
||||||
|
// 使用单引号
|
||||||
|
singleQuote: false,
|
||||||
|
// 对象和数组末尾不添加尾随逗号
|
||||||
|
trailingComma: 'none',
|
||||||
|
// JSX 引号使用单引号
|
||||||
|
jsxSingleQuote: false,
|
||||||
|
// 括号内侧空格
|
||||||
|
bracketSpacing: true,
|
||||||
|
// JSX 标签不换行
|
||||||
|
bracketSameLine: false,
|
||||||
|
// 箭头函数参数始终使用括号
|
||||||
|
arrowParens: 'always',
|
||||||
|
// HTML、Vue、Angular 和 Markdown 使用 LF
|
||||||
|
htmlWhitespaceSensitivity: 'css',
|
||||||
|
// Vue 文件脚本和样式缩进
|
||||||
|
vueIndentScriptAndStyle: false,
|
||||||
|
// 行注释位置在注释上方,不加空格
|
||||||
|
proseWrap: 'preserve',
|
||||||
|
// 根据文件类型自动推断
|
||||||
|
embeddedLanguageFormatting: 'auto',
|
||||||
|
};
|
||||||
BIN
public/css/fonts/InstrumentSans-Bold.ttf
Normal file
BIN
public/css/fonts/InstrumentSans-Regular.ttf
Normal file
@@ -1,31 +1,41 @@
|
|||||||
/* 字体定义 */
|
/* 字体定义 */
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'Arial';
|
font-family: 'Arial';
|
||||||
src: url('./fonts/ARIAL.ttf') format('ttf');
|
src: url('./fonts/ARIAL.ttf') format('truetype');
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'ArialBold';
|
font-family: 'ArialBold';
|
||||||
src: url('./fonts/ARIALBD.ttf') format('ttf');
|
src: url('./fonts/ARIALBD.ttf') format('truetype');
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'ArialMedium';
|
font-family: 'ArialMedium';
|
||||||
src: url('./fonts/ArialMdm.ttf') format('ttf');
|
src: url('./fonts/ArialMdm.ttf') format('truetype');
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'Poppins';
|
font-family: 'Poppins';
|
||||||
src: url('./fonts/Poppins-Regular.ttf') format('ttf');
|
src: url('./fonts/Poppins-Regular.ttf') format('truetype');
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'PoppinsMedium';
|
font-family: 'PoppinsMedium';
|
||||||
src: url('./fonts/Poppins-Medium.ttf') format('ttf');
|
src: url('./fonts/Poppins-Medium.ttf') format('truetype');
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'PoppinsBold';
|
font-family: 'PoppinsBold';
|
||||||
src: url('./fonts/Poppins-SemiBold.ttf') format('ttf');
|
src: url('./fonts/Poppins-SemiBold.ttf') format('truetype');
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Instrument';
|
||||||
|
src: url('./InstrumentSans-Regular.ttf') format('truetype');
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'InstrumentBold';
|
||||||
|
src: url('./InstrumentSans-Bold.ttf') format('truetype');
|
||||||
}
|
}
|
||||||
|
|||||||
BIN
public/image/events/award-poster-zh.gif
Normal file
|
After Width: | Height: | Size: 15 MiB |
BIN
public/image/events/award-poster.gif
Normal file
|
After Width: | Height: | Size: 15 MiB |
1
src/assets/icons/CFile.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg focusable="false" class="" data-icon="paper-clip" width="1em" height="1em" fill="#00000073" aria-hidden="true" viewBox="64 64 896 896"><path d="M779.3 196.6c-94.2-94.2-247.6-94.2-341.7 0l-261 260.8c-1.7 1.7-2.6 4-2.6 6.4s.9 4.7 2.6 6.4l36.9 36.9a9 9 0 0012.7 0l261-260.8c32.4-32.4 75.5-50.2 121.3-50.2s88.9 17.8 121.2 50.2c32.4 32.4 50.2 75.5 50.2 121.2 0 45.8-17.8 88.8-50.2 121.2l-266 265.9-43.1 43.1c-40.3 40.3-105.8 40.3-146.1 0-19.5-19.5-30.2-45.4-30.2-73s10.7-53.5 30.2-73l263.9-263.8c6.7-6.6 15.5-10.3 24.9-10.3h.1c9.4 0 18.1 3.7 24.7 10.3 6.7 6.7 10.3 15.5 10.3 24.9 0 9.3-3.7 18.1-10.3 24.7L372.4 653c-1.7 1.7-2.6 4-2.6 6.4s.9 4.7 2.6 6.4l36.9 36.9a9 9 0 0012.7 0l215.6-215.6c19.9-19.9 30.8-46.3 30.8-74.4s-11-54.6-30.8-74.4c-41.1-41.1-107.9-41-149 0L463 364 224.8 602.1A172.22 172.22 0 00174 724.8c0 46.3 18.1 89.8 50.8 122.5 33.9 33.8 78.3 50.7 122.7 50.7 44.4 0 88.8-16.9 122.6-50.7l309.2-309C824.8 492.7 850 432 850 367.5c.1-64.6-25.1-125.3-70.7-170.9z"></path></svg>
|
||||||
|
After Width: | Height: | Size: 985 B |
|
Before Width: | Height: | Size: 80 KiB After Width: | Height: | Size: 84 KiB |
3
src/assets/images/award/arrow_down.svg
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<svg width="22" height="12" viewBox="0 0 22 12" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M1 1L11 11L21 1" stroke="#585858" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 212 B |
|
Before Width: | Height: | Size: 252 B After Width: | Height: | Size: 327 B |
BIN
src/assets/images/award/banner.mp4
Normal file
|
Before Width: | Height: | Size: 5.0 MiB |
BIN
src/assets/images/award/banner_chinese.mp4
Normal file
|
Before Width: | Height: | Size: 1.5 MiB After Width: | Height: | Size: 492 KiB |
BIN
src/assets/images/award/expired.png
Normal file
|
After Width: | Height: | Size: 35 KiB |
BIN
src/assets/images/award/form_bg.png
Normal file
|
After Width: | Height: | Size: 930 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 7.5 KiB |
BIN
src/assets/images/award/upload_video_icon.png
Normal file
|
After Width: | Height: | Size: 7.7 KiB |
@@ -1,93 +1,124 @@
|
|||||||
{
|
{
|
||||||
"eventsList": [
|
"eventsList": [
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"title": "Just post your design work, you could have the chance to come to Hong Kong and interact with industry leaders face-to-face!",
|
||||||
|
"imgUrl": "/image/events/workshop-En.jpg"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id": 1,
|
|
||||||
"title":"Just post your design work, you could have the chance to come to Hong Kong and interact with industry leaders face-to-face!",
|
|
||||||
"imgUrl": "/image/events/workshop-En.jpg"
|
|
||||||
},{
|
|
||||||
"id": 2,
|
"id": 2,
|
||||||
"title":"AiDA X SFT AI Fashion Award 2024",
|
"title": "AiDA X SFT AI Fashion Award 2024",
|
||||||
"imgUrl": "/image/events/Fashion-Award-2024.png"
|
"imgUrl": "/image/events/Fashion-Award-2024.png"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"eventsItem":[
|
"eventsItem": [
|
||||||
{
|
{
|
||||||
"id":1,
|
"id": 3,
|
||||||
"title":"Just post your design work, you could have the chance to come to Hong Kong and interact with industry leaders face-to-face!",
|
"title": "AiDA Global Design Awards 2026",
|
||||||
"imgUrl": "/image/events/workshop-En.jpg",
|
"imgUrl": "/image/events/award-poster.gif",
|
||||||
"textList":[
|
"textList": [
|
||||||
{
|
{
|
||||||
"paragraph":[
|
"paragraph": [
|
||||||
{
|
{
|
||||||
"text":"🎨AiDA Workshop!"
|
"text": "Click the “View Details” button for more information and to join the competition! The AiDA Global Design Award 2026 is an international design competition hosted by Code‑Create, a globally leading AI fashion solutions provider, celebrating the future of creativity powered by artificial intelligence. Open to designers from Hong Kong, China, Singapore, South Korea, and beyond, the competition brings together global talent, empowering AI as a creative partner—pushing fashion beyond traditional boundaries and unlocking new possibilities where technology amplifies human imagination."
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},{
|
},
|
||||||
"paragraph":[
|
{
|
||||||
{
|
"paragraph": [
|
||||||
"text":"The process is simple: use AiDA to post your design work on the 'Gallery', and the one with the most likes(at least 20 likes) will be invited to the AiDA Workshop offline event in Hong Kong on November 14th, to exchange ideas with the Royal College of Art (RCA), Jae Lim, co-founder of the renowned fashion brand BESFXXK, and outstanding designers! "
|
{
|
||||||
}
|
"text": "Participants have the opportunity to compete for cash prizes totaling up to US$9,000, gain global media exposure showcased by top international platforms, and connect with designers and industry leaders worldwide. Finalists will also attend an exclusive award ceremony in Hong Kong, with travel support provided, allowing them to showcase their talent, network with professionals, and celebrate their achievements on an international stage."
|
||||||
]
|
}
|
||||||
},{
|
]
|
||||||
"paragraph":[
|
}
|
||||||
{
|
]
|
||||||
"text":"<b>⚠️ATTENTION❗❗</b>"
|
},
|
||||||
}
|
{
|
||||||
]
|
"id": 1,
|
||||||
},{
|
"title": "Just post your design work, you could have the chance to come to Hong Kong and interact with industry leaders face-to-face!",
|
||||||
"paragraph":[
|
"imgUrl": "/image/events/workshop-En.jpg",
|
||||||
{
|
"textList": [
|
||||||
"text":"1. Add the tag in the work description #AiDAworkshop_2024"
|
{
|
||||||
},{
|
"paragraph": [
|
||||||
"text":"2. One winner only"
|
{
|
||||||
}
|
"text": "🎨AiDA Workshop!"
|
||||||
]
|
}
|
||||||
},{
|
]
|
||||||
"paragraph":[
|
},
|
||||||
{
|
{
|
||||||
"text":"<b>🤩Code-Create will provide (Terms and conditions apply):</b>"
|
"paragraph": [
|
||||||
}
|
{
|
||||||
]
|
"text": "The process is simple: use AiDA to post your design work on the 'Gallery', and the one with the most likes(at least 20 likes) will be invited to the AiDA Workshop offline event in Hong Kong on November 14th, to exchange ideas with the Royal College of Art (RCA), Jae Lim, co-founder of the renowned fashion brand BESFXXK, and outstanding designers! "
|
||||||
},{
|
}
|
||||||
"paragraph":[
|
]
|
||||||
{
|
},
|
||||||
"text":"✅Round-trip transportation fee (only within China)"
|
{
|
||||||
}
|
"paragraph": [
|
||||||
]
|
{
|
||||||
},{
|
"text": "<b>⚠️ATTENTION❗❗</b>"
|
||||||
"paragraph":[
|
}
|
||||||
{
|
]
|
||||||
"text":"✅One night accommodation fee"
|
},
|
||||||
}
|
{
|
||||||
]
|
"paragraph": [
|
||||||
},{
|
{
|
||||||
"paragraph":[
|
"text": "1. Add the tag in the work description #AiDAworkshop_2024"
|
||||||
{
|
},
|
||||||
"text":"⌛️Deadline: October 31, 2024"
|
{
|
||||||
}
|
"text": "2. One winner only"
|
||||||
]
|
}
|
||||||
}
|
]
|
||||||
]
|
},
|
||||||
},
|
{
|
||||||
{
|
"paragraph": [
|
||||||
"id":2,
|
{
|
||||||
"title":"AiDA X SFT AI Fashion Award 2024",
|
"text": "<b>🤩Code-Create will provide (Terms and conditions apply):</b>"
|
||||||
"imgUrl": "/image/events/Fashion-Award-2024.png",
|
}
|
||||||
"textList":[
|
]
|
||||||
{
|
},
|
||||||
"paragraph":[
|
{
|
||||||
{
|
"paragraph": [
|
||||||
"text":"With the aim of inspiring students to innovate in fashion design using AI, Code-Create and The Hong Kong Polytechnic University School of Fashion and Textiles (SFT) have jointly launched the 'AiDA X SFT AI Fashion Award 2024'. This competition provides students with valuable practical AiDA experience, laying the foundation for the future fashion design industry and positioning them as pioneers in AI fashion."
|
{
|
||||||
}
|
"text": "✅Round-trip transportation fee (only within China)"
|
||||||
]
|
}
|
||||||
},{
|
]
|
||||||
"paragraph":[
|
},
|
||||||
{
|
{
|
||||||
"text":"The competition is open to all SFT students, with the winners having the chance to win cash prizes (up to 20,000 HKD), internship opportunity at BESFXXK (will work with the renowned designer, Mr Jae Hyuk Lim, for the BESFXXK collection, that will be featured at NY Fashion Week and Paris Fashion Week) and more surprises! Scan the QR code to learn more."
|
"paragraph": [
|
||||||
}
|
{
|
||||||
]
|
"text": "✅One night accommodation fee"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"paragraph": [
|
||||||
|
{
|
||||||
|
"text": "⌛️Deadline: October 31, 2024"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 2,
|
||||||
|
"title": "AiDA X SFT AI Fashion Award 2024",
|
||||||
|
"imgUrl": "/image/events/Fashion-Award-2024.png",
|
||||||
|
"textList": [
|
||||||
|
{
|
||||||
|
"paragraph": [
|
||||||
|
{
|
||||||
|
"text": "With the aim of inspiring students to innovate in fashion design using AI, Code-Create and The Hong Kong Polytechnic University School of Fashion and Textiles (SFT) have jointly launched the 'AiDA X SFT AI Fashion Award 2024'. This competition provides students with valuable practical AiDA experience, laying the foundation for the future fashion design industry and positioning them as pioneers in AI fashion."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"paragraph": [
|
||||||
|
{
|
||||||
|
"text": "The competition is open to all SFT students, with the winners having the chance to win cash prizes (up to 20,000 HKD), internship opportunity at BESFXXK (will work with the renowned designer, Mr Jae Hyuk Lim, for the BESFXXK collection, that will be featured at NY Fashion Week and Paris Fashion Week) and more surprises! Scan the QR code to learn more."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,93 +1,124 @@
|
|||||||
{
|
{
|
||||||
"eventsList": [
|
"eventsList": [
|
||||||
{
|
{
|
||||||
"id": 1,
|
"id": 1,
|
||||||
"title":"什么?只要发布设计作品就有机会来香港与大佬面对面交流?!",
|
"title": "什么?只要发布设计作品就有机会来香港与大佬面对面交流?!",
|
||||||
"imgUrl": "/image/events/workshop-Cn.jpg"
|
"imgUrl": "/image/events/workshop-Cn.jpg"
|
||||||
},{
|
},
|
||||||
"id": 2,
|
{
|
||||||
"title":"AiDA X SFT AI时尚设计比赛2024",
|
"id": 2,
|
||||||
"imgUrl": "/image/events/Fashion-Award-2024.png"
|
"title": "AiDA X SFT AI时尚设计比赛2024",
|
||||||
}
|
"imgUrl": "/image/events/Fashion-Award-2024.png"
|
||||||
|
}
|
||||||
],
|
],
|
||||||
"eventsItem":[
|
"eventsItem": [
|
||||||
{
|
{
|
||||||
"id":1,
|
"id": 3,
|
||||||
"title":"什么?只要发布设计作品就有机会来香港与大佬面对面交流?!",
|
"title": "AiDA全球设计奖 2026",
|
||||||
"imgUrl": "/image/events/workshop-Cn.jpg",
|
"imgUrl": "/image/events/award-poster-zh.gif",
|
||||||
"textList":[
|
"textList": [
|
||||||
{
|
{
|
||||||
"paragraph":[
|
"paragraph": [
|
||||||
{
|
{
|
||||||
"text":"🎨这是一趟艺术巅峰之旅!AiDA Workshop!"
|
"text": "秉承推动 AI 赋能创意设计的初衷,Code‑Create 举办了「AiDA 全球设计大奖 2026」,面向来自香港、中国、新加坡、韩国及全球的设计师,鼓励大家探索 AI 与时尚设计的无限可能,突破传统界限,释放科技与想象力的创新潜能。点击“查看详情”按钮获取更多比赛信息,抓住成为 AI 时尚先锋的机会吧!"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},{
|
},
|
||||||
"paragraph":[
|
{
|
||||||
{
|
"paragraph": [
|
||||||
"text":"参与过程很简单,利用AiDA 在 “Gallery广场 ”发布设计作品,最终获赞最高者(至少20个赞)将被邀请至11月14日 举办的AiDA Workshop香港线下活动,与英国皇家艺术学院(RCA)、韩国知名时尚品牌BESFXXK创始人JAE以及优秀设计师一同交流!(名额仅限1名)"
|
{
|
||||||
}
|
"text": "参赛者将有机会赢取总奖金 9,000 美元,作品还将获得国际媒体展示机会,并与全球设计师和行业领袖建立联系。入围决赛者将受邀参加在香港举办的 专属颁奖典礼,主办方提供差旅支持,让设计师在国际舞台展示才华、拓展人脉,并共同庆祝创意成果。"
|
||||||
]
|
}
|
||||||
},{
|
]
|
||||||
"paragraph":[
|
}
|
||||||
{
|
]
|
||||||
"text":"<b>⚠️注意❗❗</b>"
|
},
|
||||||
}
|
{
|
||||||
]
|
"id": 1,
|
||||||
},{
|
"title": "什么?只要发布设计作品就有机会来香港与大佬面对面交流?!",
|
||||||
"paragraph":[
|
"imgUrl": "/image/events/workshop-Cn.jpg",
|
||||||
{
|
"textList": [
|
||||||
"text":"1. 作品描述添加tag: #AiDAworkshop_2024"
|
{
|
||||||
},{
|
"paragraph": [
|
||||||
"text":"2. 一个冠军名额"
|
{
|
||||||
}
|
"text": "🎨这是一趟艺术巅峰之旅!AiDA Workshop!"
|
||||||
]
|
}
|
||||||
},{
|
]
|
||||||
"paragraph":[
|
},
|
||||||
{
|
{
|
||||||
"text":"<b>🤩Code-Create将提供(适用条款条规):</b>"
|
"paragraph": [
|
||||||
}
|
{
|
||||||
]
|
"text": "参与过程很简单,利用AiDA 在 “Gallery广场 ”发布设计作品,最终获赞最高者(至少20个赞)将被邀请至11月14日 举办的AiDA Workshop香港线下活动,与英国皇家艺术学院(RCA)、韩国知名时尚品牌BESFXXK创始人JAE以及优秀设计师一同交流!(名额仅限1名)"
|
||||||
},{
|
}
|
||||||
"paragraph":[
|
]
|
||||||
{
|
},
|
||||||
"text":"✅往返机票/动车费用(仅限中国地区)"
|
{
|
||||||
}
|
"paragraph": [
|
||||||
]
|
{
|
||||||
},{
|
"text": "<b>⚠️注意❗❗</b>"
|
||||||
"paragraph":[
|
}
|
||||||
{
|
]
|
||||||
"text":"✅一晚酒店住宿费用"
|
},
|
||||||
}
|
{
|
||||||
]
|
"paragraph": [
|
||||||
},{
|
{
|
||||||
"paragraph":[
|
"text": "1. 作品描述添加tag: #AiDAworkshop_2024"
|
||||||
{
|
},
|
||||||
"text":"⌛️截止时间:2024.10.31"
|
{
|
||||||
}
|
"text": "2. 一个冠军名额"
|
||||||
]
|
}
|
||||||
}
|
]
|
||||||
]
|
},
|
||||||
},
|
{
|
||||||
{
|
"paragraph": [
|
||||||
"id":2,
|
{
|
||||||
"title":"AiDA X SFT AI时尚设计比赛2024",
|
"text": "<b>🤩Code-Create将提供(适用条款条规):</b>"
|
||||||
"imgUrl": "/image/events/Fashion-Award-2024.png",
|
}
|
||||||
"textList":[
|
]
|
||||||
{
|
},
|
||||||
"paragraph":[
|
{
|
||||||
{
|
"paragraph": [
|
||||||
"text":"秉承着激发学生使用AI进行时尚设计的创新能力的初衷,Code-Create和香港理工大学时装及纺织学院(SFT)共同举办了“AiDA X SFT AI时尚设计比赛2024”让学生们在比赛中获得宝贵的AiDA实践经验,为未来的时尚设计行业打下了坚实的基础,成为时尚界的AI先锋。"
|
{
|
||||||
}
|
"text": "✅往返机票/动车费用(仅限中国地区)"
|
||||||
]
|
}
|
||||||
},{
|
]
|
||||||
"paragraph":[
|
},
|
||||||
{
|
{
|
||||||
"text":" 此次比赛面向全体SFT 学生,最终获奖者将赢取丰厚奖金(最高可达2万港币),获得在BESFXXK的实习机会(将与著名设计师Lim Jae Hyuk先生合作设计BESFXXK 系列,该系列将在纽约时装周和巴黎时装周上展出)及更多惊喜哦!扫描二维码获取更多比赛信息。"
|
"paragraph": [
|
||||||
}
|
{
|
||||||
]
|
"text": "✅一晚酒店住宿费用"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
},
|
||||||
]
|
{
|
||||||
|
"paragraph": [
|
||||||
|
{
|
||||||
|
"text": "⌛️截止时间:2024.10.31"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 2,
|
||||||
|
"title": "AiDA X SFT AI时尚设计比赛2024",
|
||||||
|
"imgUrl": "/image/events/Fashion-Award-2024.png",
|
||||||
|
"textList": [
|
||||||
|
{
|
||||||
|
"paragraph": [
|
||||||
|
{
|
||||||
|
"text": "秉承着激发学生使用AI进行时尚设计的创新能力的初衷,Code-Create和香港理工大学时装及纺织学院(SFT)共同举办了“AiDA X SFT AI时尚设计比赛2024”让学生们在比赛中获得宝贵的AiDA实践经验,为未来的时尚设计行业打下了坚实的基础,成为时尚界的AI先锋。"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"paragraph": [
|
||||||
|
{
|
||||||
|
"text": " 此次比赛面向全体SFT 学生,最终获奖者将赢取丰厚奖金(最高可达2万港币),获得在BESFXXK的实习机会(将与著名设计师Lim Jae Hyuk先生合作设计BESFXXK 系列,该系列将在纽约时装周和巴黎时装周上展出)及更多惊喜哦!扫描二维码获取更多比赛信息。"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
@@ -2507,3 +2507,6 @@ textarea:focus {
|
|||||||
.justify-center {
|
.justify-center {
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
}
|
}
|
||||||
|
.flex-1{
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
@@ -2425,3 +2425,6 @@ textarea:focus{
|
|||||||
.justify-center {
|
.justify-center {
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
}
|
}
|
||||||
|
.flex-1{
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
@@ -148,6 +148,7 @@
|
|||||||
total: total,
|
total: total,
|
||||||
showQuickJumper: true,
|
showQuickJumper: true,
|
||||||
bordered: false,
|
bordered: false,
|
||||||
|
showTotal: (total) => `Total Transaction: ${total}`
|
||||||
}"
|
}"
|
||||||
>
|
>
|
||||||
<template #bodyCell="{ column, text, record, index }">
|
<template #bodyCell="{ column, text, record, index }">
|
||||||
@@ -465,13 +466,16 @@ export default defineComponent({
|
|||||||
(rv: any) => {
|
(rv: any) => {
|
||||||
if (rv) {
|
if (rv) {
|
||||||
// this.dataList = rv
|
// this.dataList = rv
|
||||||
|
// console.log('rv----',rv);
|
||||||
|
|
||||||
filter.dataList = rv.content;
|
filter.dataList = rv.content;
|
||||||
filterData.total = rv.total;
|
filterData.total = rv.total;
|
||||||
filter.tableLoading = false;
|
filter.tableLoading = false;
|
||||||
filterData.totalPayer = rv.content.reduce((total: number, item: any) => {
|
filterData.totalPayer = rv.totalAmount;
|
||||||
const value = item && item.status === 'Success' ? parseFloat(item.payerTotal) : 0;
|
// filterData.totalPayer = rv.content.reduce((total: number, item: any) => {
|
||||||
return total + (isNaN(value) ? 0 : value);
|
// const value = item && item.status === 'Success' ? parseFloat(item.payerTotal) : 0;
|
||||||
}, 0);
|
// return total + (isNaN(value) ? 0 : value);
|
||||||
|
// }, 0);
|
||||||
|
|
||||||
// this.workspaceItem.position = this.singleTypeList[0].label
|
// this.workspaceItem.position = this.singleTypeList[0].label
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -207,7 +207,8 @@ export class BackgroundSizeCommand extends Command {
|
|||||||
this.bgLayer = this.layers.value.find((layer) => layer.isBackground);
|
this.bgLayer = this.layers.value.find((layer) => layer.isBackground);
|
||||||
|
|
||||||
// 记录原尺寸
|
// 记录原尺寸
|
||||||
this.backgroundObject = findObjectById(this.canvas, this.bgLayer.fabricObject.id).object;
|
this.bgId = this.bgLayer.fabricObject?.id || this.bgLayer.fabricObjects?.[0]?.id;
|
||||||
|
this.backgroundObject = findObjectById(this.canvas, this.bgId).object;
|
||||||
|
|
||||||
this.oldWidth = this.backgroundObject.width;
|
this.oldWidth = this.backgroundObject.width;
|
||||||
this.oldHeight = this.backgroundObject.height;
|
this.oldHeight = this.backgroundObject.height;
|
||||||
|
|||||||
@@ -106,7 +106,6 @@ export class FillGroupLayerBackgroundCommand extends Command {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 判断fabricObjects是否是组对象
|
// 判断fabricObjects是否是组对象
|
||||||
const firstObj = layer.fabricObjects?.[0] || null;
|
const firstObj = layer.fabricObjects?.[0] || null;
|
||||||
// 如果没有找到第一个对象,则直接添加到当前画布
|
// 如果没有找到第一个对象,则直接添加到当前画布
|
||||||
@@ -173,8 +172,8 @@ export class FillGroupLayerBackgroundCommand extends Command {
|
|||||||
}
|
}
|
||||||
const canvasObj = findObjectById(this.canvas, firstObj?.id)?.object;
|
const canvasObj = findObjectById(this.canvas, firstObj?.id)?.object;
|
||||||
if (
|
if (
|
||||||
(canvasObj && canvasObj.type === "group") ||
|
canvasObj && (canvasObj.type === "group" ||
|
||||||
canvasObj._objects?.length > 0
|
canvasObj._objects?.length > 0)
|
||||||
) {
|
) {
|
||||||
this.newFill.set({
|
this.newFill.set({
|
||||||
left: 0,
|
left: 0,
|
||||||
|
|||||||
@@ -7,12 +7,11 @@ import {
|
|||||||
insertObjectAtZIndex,
|
insertObjectAtZIndex,
|
||||||
removeCanvasObjectByObject,
|
removeCanvasObjectByObject,
|
||||||
createPatternTransform,
|
createPatternTransform,
|
||||||
|
getTransformScaleAngle,
|
||||||
imageAddGapToCanvas,
|
imageAddGapToCanvas,
|
||||||
} from "../utils/helper";
|
} from "../utils/helper";
|
||||||
import { restoreFabricObject } from "../utils/objectHelper";
|
import { restoreFabricObject } from "../utils/objectHelper";
|
||||||
|
|
||||||
const scale = 0.3;// 默认缩放比例
|
|
||||||
|
|
||||||
export const FillSourceToBase64 = (source) => {
|
export const FillSourceToBase64 = (source) => {
|
||||||
if (source?.toDataURL) {
|
if (source?.toDataURL) {
|
||||||
return source.toDataURL?.();
|
return source.toDataURL?.();
|
||||||
@@ -39,7 +38,6 @@ export class FillRepeatCommand extends Command {
|
|||||||
this.fillRepeat = options.fillRepeat;
|
this.fillRepeat = options.fillRepeat;
|
||||||
this.oldObjects = null;
|
this.oldObjects = null;
|
||||||
this.oldLocked = null;
|
this.oldLocked = null;
|
||||||
this.oldIsDisableUnlock = null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async execute() {
|
async execute() {
|
||||||
@@ -64,17 +62,15 @@ export class FillRepeatCommand extends Command {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
image.set({
|
image.set({
|
||||||
id: object.id,
|
...this.copyObjectProperties(object),
|
||||||
layerId: object.layerId,
|
|
||||||
layerName: object.layerName,
|
|
||||||
...(fill_.originalInfo || {
|
...(fill_.originalInfo || {
|
||||||
top: object.top,
|
top: object.top,
|
||||||
left: object.left,
|
left: object.left,
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
layer.fabricObjects = [image.toObject(["id", "layerId", "layerName"])];
|
layer.fabricObjects = [image.toObject(["id", "layerId", "layerName"])];
|
||||||
this.oldLocked = layer.locked;
|
// this.oldLocked = layer.locked;
|
||||||
layer.locked = false;
|
// layer.locked = false;
|
||||||
|
|
||||||
this.canvas.add(image);
|
this.canvas.add(image);
|
||||||
this.canvas.remove(object);
|
this.canvas.remove(object);
|
||||||
@@ -113,23 +109,32 @@ export class FillRepeatCommand extends Command {
|
|||||||
const fdObject = this.canvasManager.getFixedLayerObject();
|
const fdObject = this.canvasManager.getFixedLayerObject();
|
||||||
const bgObject = this.canvasManager.getBackgroundLayerObject();
|
const bgObject = this.canvasManager.getBackgroundLayerObject();
|
||||||
const tObject = fdObject || bgObject;
|
const tObject = fdObject || bgObject;
|
||||||
|
const tWidth = tObject.width;
|
||||||
|
const tHeight = tObject.height;
|
||||||
|
|
||||||
|
// const offsetX = object.fill?.hasOwnProperty("offsetX") ? object.fill.offsetX : tObject.width / 2;
|
||||||
|
// const offsetY = object.fill?.hasOwnProperty("offsetY") ? object.fill.offsetY : tObject.height / 2;
|
||||||
|
const scaleX_ = tWidth / img.width / 5;
|
||||||
|
const scaleY_ = tHeight / img.height / 5;
|
||||||
|
const scale_ = tWidth > tHeight ? scaleX_ : scaleY_;
|
||||||
|
|
||||||
|
const patternTransform = object.fill?.hasOwnProperty("patternTransform") ? object.fill.patternTransform : createPatternTransform(scale_, 0);
|
||||||
|
const scale = getTransformScaleAngle(patternTransform).scale;
|
||||||
|
const offsetX = tWidth / 2 - img.width * scale / 2;
|
||||||
|
const offsetY = tHeight / 2 - img.height * scale / 2;
|
||||||
const pattern = new fabric.Pattern({
|
const pattern = new fabric.Pattern({
|
||||||
source: img,
|
source: img,
|
||||||
repeat: this.fillRepeat,
|
repeat: this.fillRepeat,
|
||||||
patternTransform: object.fill?.hasOwnProperty("patternTransform") ? object.fill.patternTransform : createPatternTransform(scale, 0),
|
patternTransform,
|
||||||
offsetX: object.fill?.hasOwnProperty("offsetX") ? object.fill.offsetX : tObject.width / 2, // 水平偏移
|
offsetX, // 水平偏移
|
||||||
offsetY: object.fill?.hasOwnProperty("offsetY") ? object.fill.offsetY : tObject.height / 2, // 垂直偏移
|
offsetY, // 垂直偏移
|
||||||
});
|
});
|
||||||
const rect = new fabric.Rect({
|
const rect = new fabric.Rect({
|
||||||
id: object.id,
|
...this.copyObjectProperties(object),
|
||||||
layerId: object.layerId,
|
|
||||||
layerName: object.layerName,
|
|
||||||
fill_,
|
fill_,
|
||||||
});
|
});
|
||||||
layer.fabricObjects = [rect.toObject(["id", "layerId", "layerName"])];
|
layer.fabricObjects = [rect.toObject(["id", "layerId", "layerName"])];
|
||||||
this.oldLocked = layer.locked;
|
// this.oldLocked = layer.locked;
|
||||||
// this.oldIsDisableUnlock = layer.isDisableUnlock;
|
|
||||||
// layer.isDisableUnlock = true;
|
|
||||||
if (this.oldObjects.type === "rect") {
|
if (this.oldObjects.type === "rect") {
|
||||||
rect.set({
|
rect.set({
|
||||||
width: object.width,
|
width: object.width,
|
||||||
@@ -148,14 +153,14 @@ export class FillRepeatCommand extends Command {
|
|||||||
let scaleX = tObject.scaleX || 1;
|
let scaleX = tObject.scaleX || 1;
|
||||||
let scaleY = tObject.scaleY || 1;
|
let scaleY = tObject.scaleY || 1;
|
||||||
rect.set({
|
rect.set({
|
||||||
width: tObject.width,
|
width: tWidth,
|
||||||
height: tObject.height,
|
height: tHeight,
|
||||||
top: tObject.top - tObject.height * scaleY / 2,
|
top: tObject.top - tHeight * scaleY / 2,
|
||||||
left: tObject.left - tObject.width * scaleX / 2,
|
left: tObject.left - tWidth * scaleX / 2,
|
||||||
scaleX,
|
scaleX,
|
||||||
scaleY,
|
scaleY,
|
||||||
});
|
});
|
||||||
layer.locked = true;
|
// layer.locked = true;
|
||||||
}
|
}
|
||||||
rect.set("fill", pattern);
|
rect.set("fill", pattern);
|
||||||
this.canvas.add(rect);
|
this.canvas.add(rect);
|
||||||
@@ -184,14 +189,23 @@ export class FillRepeatCommand extends Command {
|
|||||||
this.canvas.remove(object);
|
this.canvas.remove(object);
|
||||||
this.canvas.add(this.oldObjects);
|
this.canvas.add(this.oldObjects);
|
||||||
layer.fabricObjects = [this.oldObjects.toObject(["id", "layerId", "layerName"])];
|
layer.fabricObjects = [this.oldObjects.toObject(["id", "layerId", "layerName"])];
|
||||||
layer.locked = this.oldLocked;
|
// layer.locked = this.oldLocked;
|
||||||
// layer.isDisableUnlock = this.oldIsDisableUnlock;
|
|
||||||
await this.layerManager?.updateLayersObjectsInteractivity();
|
await this.layerManager?.updateLayersObjectsInteractivity();
|
||||||
await this.layerManager?.sortLayersWithTool?.();
|
await this.layerManager?.sortLayersWithTool?.();
|
||||||
this.canvas.renderAll();
|
this.canvas.renderAll();
|
||||||
this.canvasManager.thumbnailManager?.generateLayerThumbnail(this.layerId);
|
this.canvasManager.thumbnailManager?.generateLayerThumbnail(this.layerId);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 复制原对象的属性
|
||||||
|
copyObjectProperties(object) {
|
||||||
|
return {
|
||||||
|
id: object.id,
|
||||||
|
layerId: object.layerId,
|
||||||
|
layerName: object.layerName,
|
||||||
|
isPrintTrims: object.isPrintTrims,
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -230,6 +244,10 @@ export class FillRepeatChangeCommand extends Command {
|
|||||||
...this.newPattern,
|
...this.newPattern,
|
||||||
});
|
});
|
||||||
object.set("fill", pattern);
|
object.set("fill", pattern);
|
||||||
|
if (object.globalCompositeOperation_) {
|
||||||
|
object.globalCompositeOperation = object.globalCompositeOperation_;
|
||||||
|
object.globalCompositeOperation_ = null;
|
||||||
|
}
|
||||||
this.canvas.renderAll();
|
this.canvas.renderAll();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -276,7 +294,7 @@ export class FillRepeatGapChangeCommand extends Command {
|
|||||||
this.oldGapY = null;
|
this.oldGapY = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
async execute(isUndo = false) {
|
async execute(isCommand = true, isUndo = false) {
|
||||||
const { layer } = findLayerRecursively(this.layers.value, this.layerId);
|
const { layer } = findLayerRecursively(this.layers.value, this.layerId);
|
||||||
if (!layer || !layer.fabricObjects || layer.fabricObjects.length === 0) {
|
if (!layer || !layer.fabricObjects || layer.fabricObjects.length === 0) {
|
||||||
console.warn("图层不存在或没有 fabric 对象");
|
console.warn("图层不存在或没有 fabric 对象");
|
||||||
@@ -315,6 +333,10 @@ export class FillRepeatGapChangeCommand extends Command {
|
|||||||
const fill = object.get("fill");
|
const fill = object.get("fill");
|
||||||
fill.source = imageAddGapToCanvas(image, object.fill_.gapX, object.fill_.gapY);
|
fill.source = imageAddGapToCanvas(image, object.fill_.gapX, object.fill_.gapY);
|
||||||
object.set("fill", new fabric.Pattern(fill));
|
object.set("fill", new fabric.Pattern(fill));
|
||||||
|
if (isCommand && object.globalCompositeOperation_) {
|
||||||
|
object.globalCompositeOperation = object.globalCompositeOperation_;
|
||||||
|
object.globalCompositeOperation_ = null;
|
||||||
|
}
|
||||||
this.canvas.renderAll();
|
this.canvas.renderAll();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -324,7 +346,7 @@ export class FillRepeatGapChangeCommand extends Command {
|
|||||||
console.warn("没有旧间隙可恢复");
|
console.warn("没有旧间隙可恢复");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
await this.execute(true);
|
await this.execute(true, true);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -147,11 +147,11 @@ export class LassoCutoutCommand extends CompositeCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 确定源图层
|
// 确定源图层
|
||||||
const sourceLayer = this.layerManager.getActiveLayer();
|
// const sourceLayer = this.layerManager.getActiveLayer();
|
||||||
if (!sourceLayer) {
|
// if (!sourceLayer) {
|
||||||
console.error("无法执行套索抠图:源图层无效");
|
// console.error("无法执行套索抠图:源图层无效");
|
||||||
return false;
|
// return false;
|
||||||
}
|
// }
|
||||||
|
|
||||||
// 获取源图层的所有对象(包括子图层)
|
// 获取源图层的所有对象(包括子图层)
|
||||||
// const sourceObjects = this._getLayerObjects(sourceLayer);
|
// const sourceObjects = this._getLayerObjects(sourceLayer);
|
||||||
@@ -225,7 +225,7 @@ export class LassoCutoutCommand extends CompositeCommand {
|
|||||||
|
|
||||||
const layers = this.layerManager.layers.value;
|
const layers = this.layerManager.layers.value;
|
||||||
var topLayerIndex = 0;
|
var topLayerIndex = 0;
|
||||||
layers.forEach((layer, index) => {
|
if(this.originalLayer)layers.forEach((layer, index) => {
|
||||||
if (layer.id === this.originalLayer.id) {
|
if (layer.id === this.originalLayer.id) {
|
||||||
topLayerIndex = index;
|
topLayerIndex = index;
|
||||||
}else if (layer.children.length > 0) {
|
}else if (layer.children.length > 0) {
|
||||||
|
|||||||
@@ -280,8 +280,13 @@ export class PasteLayerCommand extends Command {
|
|||||||
isCut: undefined,
|
isCut: undefined,
|
||||||
serializedObjects: undefined,
|
serializedObjects: undefined,
|
||||||
};
|
};
|
||||||
|
if(this.newLayer.isPrintTrims){
|
||||||
if (this.insertIndex !== undefined && this.insertIndex !== null) {
|
this.layers.value.forEach((layer) => {
|
||||||
|
if (layer.isPrintTrimsGroup) {
|
||||||
|
layer.children.unshift(this.newLayer);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}else if (this.insertIndex !== undefined && this.insertIndex !== null) {
|
||||||
this.layers.value.splice(this.insertIndex, 0, this.newLayer);
|
this.layers.value.splice(this.insertIndex, 0, this.newLayer);
|
||||||
} else {
|
} else {
|
||||||
this.layers.value.push(this.newLayer);
|
this.layers.value.push(this.newLayer);
|
||||||
|
|||||||
56
src/component/Canvas/CanvasEditor/commands/PartCommands.js
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
import { Command } from "./Command.js";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 部件绘制命令
|
||||||
|
*/
|
||||||
|
export class PartDrawCommand extends Command {
|
||||||
|
constructor(options) {
|
||||||
|
super({
|
||||||
|
name: "部件绘制命令",
|
||||||
|
saveState: false,
|
||||||
|
});
|
||||||
|
|
||||||
|
this.canvas = options.canvas;
|
||||||
|
this.partManager = options.partManager;
|
||||||
|
this.partCanvas = options.partCanvas;
|
||||||
|
this.oldPartCanvas = this.partManager.partCanvas;
|
||||||
|
}
|
||||||
|
execute() {
|
||||||
|
this.partManager.drawPartCanvas(this.partCanvas);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
undo() {
|
||||||
|
this.partManager.drawPartCanvas(this.oldPartCanvas);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 部件点选绘制命令
|
||||||
|
*/
|
||||||
|
export class PartPointDrawCommand extends Command {
|
||||||
|
constructor(options) {
|
||||||
|
super({
|
||||||
|
name: "部件点选绘制命令",
|
||||||
|
saveState: false,
|
||||||
|
});
|
||||||
|
|
||||||
|
this.canvas = options.canvas;
|
||||||
|
this.partManager = options.partManager;
|
||||||
|
this.partCanvas = options.partCanvas;
|
||||||
|
this.pointList = options.pointList;
|
||||||
|
this.oldPartCanvas = this.partManager.partCanvas;
|
||||||
|
this.oldPointList = [...this.partManager.pointList];
|
||||||
|
}
|
||||||
|
async execute() {
|
||||||
|
const list = [...this.pointList];
|
||||||
|
const canvas = this.partCanvas;
|
||||||
|
const res = await this.partManager.pointDrawPartCanvas(list, canvas);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
async undo() {
|
||||||
|
const list = [...this.oldPointList];
|
||||||
|
const canvas = this.oldPartCanvas;
|
||||||
|
const res = await this.partManager.pointDrawPartCanvas(list, canvas);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -25,7 +25,7 @@ export class TransformCommand extends Command {
|
|||||||
this.layerManager = options.layerManager;
|
this.layerManager = options.layerManager;
|
||||||
this.layers = options.layers || null;
|
this.layers = options.layers || null;
|
||||||
this.lastSelectLayerId = options.lastSelectLayerId || null; // 最后选择的图层ID
|
this.lastSelectLayerId = options.lastSelectLayerId || null; // 最后选择的图层ID
|
||||||
|
this.isCommand = options.isCommand == undefined ? true : options.isCommand
|
||||||
const targetObject =
|
const targetObject =
|
||||||
findObjectById(this.canvas, this.objectId)?.object || null;
|
findObjectById(this.canvas, this.objectId)?.object || null;
|
||||||
|
|
||||||
@@ -189,6 +189,11 @@ export class TransformCommand extends Command {
|
|||||||
object.set(key, value);
|
object.set(key, value);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if(this.isCommand && object.globalCompositeOperation_){
|
||||||
|
object.globalCompositeOperation = object.globalCompositeOperation_;
|
||||||
|
object.globalCompositeOperation_ = null;
|
||||||
|
}
|
||||||
|
|
||||||
// 确保对象更新
|
// 确保对象更新
|
||||||
object.setCoords();
|
object.setCoords();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -154,6 +154,8 @@ const isVisible = computed(() => {
|
|||||||
OperationType.ERASER,
|
OperationType.ERASER,
|
||||||
OperationType.RED_BRUSH,
|
OperationType.RED_BRUSH,
|
||||||
OperationType.GREEN_BRUSH,
|
OperationType.GREEN_BRUSH,
|
||||||
|
OperationType.PART_BRUSH,
|
||||||
|
OperationType.PART_ERASER,
|
||||||
].includes(props.activeTool);
|
].includes(props.activeTool);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ const layerManager = inject("layerManager");
|
|||||||
const isShowLayerPanel = inject("isShowLayerPanel", ref(false));
|
const isShowLayerPanel = inject("isShowLayerPanel", ref(false));
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
|
title: String,
|
||||||
activeTool: String,
|
activeTool: String,
|
||||||
canvasWidth: Number,
|
canvasWidth: Number,
|
||||||
canvasHeight: Number,
|
canvasHeight: Number,
|
||||||
@@ -22,6 +23,7 @@ const props = defineProps({
|
|||||||
default: true, // 是否显示图层面板
|
default: true, // 是否显示图层面板
|
||||||
},
|
},
|
||||||
isBackgroundChangeable: Boolean,
|
isBackgroundChangeable: Boolean,
|
||||||
|
isChangeCanvasSize: Boolean,
|
||||||
});
|
});
|
||||||
|
|
||||||
const emit = defineEmits([
|
const emit = defineEmits([
|
||||||
@@ -273,7 +275,7 @@ onMounted(() => {
|
|||||||
<template>
|
<template>
|
||||||
<div class="canvas-header">
|
<div class="canvas-header">
|
||||||
<div class="canvas-header-wrapper">
|
<div class="canvas-header-wrapper">
|
||||||
<span class="canvas-title">{{ $t('Canvas.Canvas') }}</span>
|
<span class="canvas-title">{{ props.title || $t("Canvas.Canvas") }}</span>
|
||||||
<!-- 默认设置 -->
|
<!-- 默认设置 -->
|
||||||
<!-- v-if="
|
<!-- v-if="
|
||||||
!activeTool ||
|
!activeTool ||
|
||||||
@@ -284,6 +286,7 @@ onMounted(() => {
|
|||||||
<div class="setting-group">
|
<div class="setting-group">
|
||||||
<span class="setting-label">{{ $t("Canvas.width") }}</span>
|
<span class="setting-label">{{ $t("Canvas.width") }}</span>
|
||||||
<a-input-number
|
<a-input-number
|
||||||
|
:disabled="!isChangeCanvasSize"
|
||||||
:value="canvasWidth?.toFixed(2)"
|
:value="canvasWidth?.toFixed(2)"
|
||||||
class="setting-input"
|
class="setting-input"
|
||||||
:min="1"
|
:min="1"
|
||||||
@@ -300,6 +303,7 @@ onMounted(() => {
|
|||||||
<div class="setting-group">
|
<div class="setting-group">
|
||||||
<span class="setting-label">{{ $t("Canvas.height") }}</span>
|
<span class="setting-label">{{ $t("Canvas.height") }}</span>
|
||||||
<a-input-number
|
<a-input-number
|
||||||
|
:disabled="!isChangeCanvasSize"
|
||||||
:value="canvasHeight?.toFixed(2)"
|
:value="canvasHeight?.toFixed(2)"
|
||||||
class="setting-input"
|
class="setting-input"
|
||||||
:min="1"
|
:min="1"
|
||||||
|
|||||||
@@ -242,7 +242,7 @@ const canDeleteComputed = computed(() => {
|
|||||||
return parentLayer?.children?.length > 1;
|
return parentLayer?.children?.length > 1;
|
||||||
}
|
}
|
||||||
// 否则直接返回根图层的可删除状态
|
// 否则直接返回根图层的可删除状态
|
||||||
return props.layers.length > 3;
|
return true;
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
@@ -414,14 +414,14 @@ function deleteSelectedLayers() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 检查删除后是否还有足够的普通图层
|
// 检查删除后是否还有足够的普通图层
|
||||||
const remainingNormalLayers = layers.value.filter(
|
// const remainingNormalLayers = layers.value.filter(
|
||||||
(layer) => !layer.isBackground && !layer.isFixed && !selectedLayerIds.value.includes(layer.id)
|
// (layer) => !layer.isBackground && !layer.isFixed && !selectedLayerIds.value.includes(layer.id)
|
||||||
).length;
|
// ).length;
|
||||||
|
|
||||||
if (remainingNormalLayers < 1) {
|
// if (remainingNormalLayers < 1) {
|
||||||
console.warn("不能删除所有普通图层");
|
// console.warn("不能删除所有普通图层");
|
||||||
return;
|
// return;
|
||||||
}
|
// }
|
||||||
|
|
||||||
// 确认删除
|
// 确认删除
|
||||||
if (selectedLayers.length > 1) {
|
if (selectedLayers.length > 1) {
|
||||||
@@ -584,15 +584,16 @@ function handleLayerClick(layer, event) {
|
|||||||
// 如果不是多选模式,才可激活图层
|
// 如果不是多选模式,才可激活图层
|
||||||
// 1.如果是组,则设置组下的第一个子图层为活动图层
|
// 1.如果是组,则设置组下的第一个子图层为活动图层
|
||||||
// 2.否则直接设置活动图层
|
// 2.否则直接设置活动图层
|
||||||
if (isGroupLayerType(layer) && layer.children && layer.children.length > 0) {
|
if (isGroupLayerType(layer) && layer.children && layer.children.length > 0 && !layer.isPrintTrimsGroup) {
|
||||||
// 如果是组图层,设置第一个子图层为活动图层
|
// 如果是组图层,设置第一个子图层为活动图层
|
||||||
layerManager?.setAllActiveGroupLayerCanvasObject?.(layer);
|
layerManager?.setAllActiveGroupLayerCanvasObject?.(layer);
|
||||||
setActiveLayer(layer.children[0].id, { parentId: layer.id });
|
setActiveLayer(layer.children[0].id, { parentId: layer.id });
|
||||||
} else {
|
} else {
|
||||||
|
let id = layer.isPrintTrimsGroup ? layer.children?.[0]?.id || layer.id : layer.id;
|
||||||
// 选中画布中的图层对象
|
// 选中画布中的图层对象
|
||||||
layerManager?.selectLayerObjects(layer.id);
|
layerManager?.selectLayerObjects(id);
|
||||||
// 否则直接设置当前图层为活动图层
|
// 否则直接设置当前图层为活动图层
|
||||||
setActiveLayer(layer.id);
|
setActiveLayer(id);
|
||||||
layerManager?.updateLayersObjectsInteractivity();
|
layerManager?.updateLayersObjectsInteractivity();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -876,13 +877,15 @@ function toggleSelectedLayersVisibility() {
|
|||||||
|
|
||||||
function canDeleteLayers() {
|
function canDeleteLayers() {
|
||||||
const selectedLayers = getSelectedLayers();
|
const selectedLayers = getSelectedLayers();
|
||||||
|
console.log(selectedLayers);
|
||||||
if (selectedLayers.length === 0) return false;
|
if (selectedLayers.length === 0) return false;
|
||||||
|
|
||||||
// 检查是否包含不能删除的图层
|
// 检查是否包含不能删除的图层
|
||||||
const undeletableLayers = selectedLayers.filter((layer) => layer.isBackground || layer.isFixed);
|
const undeletableLayers = selectedLayers.filter((layer) => layer.isBackground || layer.isFixed);
|
||||||
|
|
||||||
if (undeletableLayers.length > 0) return false;
|
if (undeletableLayers.length > 0) return false;
|
||||||
|
|
||||||
|
return true
|
||||||
|
|
||||||
// 检查删除后是否还有足够的普通图层
|
// 检查删除后是否还有足够的普通图层
|
||||||
const remainingNormalLayers = layers.value.filter(
|
const remainingNormalLayers = layers.value.filter(
|
||||||
(layer) => !layer.isBackground && !layer.isFixed && !selectedLayerIds.value.includes(layer.id)
|
(layer) => !layer.isBackground && !layer.isFixed && !selectedLayerIds.value.includes(layer.id)
|
||||||
|
|||||||
@@ -119,7 +119,7 @@ export default defineComponent({
|
|||||||
})
|
})
|
||||||
const palletRef = ref(null)
|
const palletRef = ref(null)
|
||||||
watch(()=>palletData.color_,(newVal:any)=>{
|
watch(()=>palletData.color_,(newVal:any)=>{
|
||||||
if(!newVal?.rgba?.r)return
|
if(newVal?.rgba?.r == null)return
|
||||||
if(palletData.color?.gradient?.gradientShow){
|
if(palletData.color?.gradient?.gradientShow){
|
||||||
palletData.color.gradient.gradientList[palletData.color.gradient.selectIndex].rgba = {
|
palletData.color.gradient.gradientList[palletData.color.gradient.selectIndex].rgba = {
|
||||||
r:newVal.rgba.r,
|
r:newVal.rgba.r,
|
||||||
@@ -143,7 +143,7 @@ export default defineComponent({
|
|||||||
},{deep: true })
|
},{deep: true })
|
||||||
const setOperate = ()=>{
|
const setOperate = ()=>{
|
||||||
if(!palletData.color.rgba)return message.info(t('DesignDetailAlter.jsContent7'))
|
if(!palletData.color.rgba)return message.info(t('DesignDetailAlter.jsContent7'))
|
||||||
palletData.color.rgba = palletData.color?.rgba?.r?palletData.color.rgba:{r:0,g:0,b:0,a:1}
|
palletData.color.rgba = palletData.color?.rgba?.r != null?palletData.color.rgba:{r:0,g:0,b:0,a:1}
|
||||||
palletData.gradient.selectIndex = 0
|
palletData.gradient.selectIndex = 0
|
||||||
palletData.gradient.gradientShow = true
|
palletData.gradient.gradientShow = true
|
||||||
if(!palletData.color.gradient){
|
if(!palletData.color.gradient){
|
||||||
@@ -257,7 +257,7 @@ export default defineComponent({
|
|||||||
|
|
||||||
}
|
}
|
||||||
const openPallet = ()=>{
|
const openPallet = ()=>{
|
||||||
if(palletData.palletShow && props.selectColor?.rgba?.r){
|
if(palletData.palletShow && props.selectColor?.rgba?.r != null){
|
||||||
if(props.selectColor.gradient){
|
if(props.selectColor.gradient){
|
||||||
palletData.color_.rgba = props.selectColor.gradient.gradientList[0].rgba
|
palletData.color_.rgba = props.selectColor.gradient.gradientList[0].rgba
|
||||||
}else{
|
}else{
|
||||||
|
|||||||
@@ -20,13 +20,13 @@
|
|||||||
<img
|
<img
|
||||||
src="/src/assets/images/canvas/shubiao-l.png"
|
src="/src/assets/images/canvas/shubiao-l.png"
|
||||||
/>
|
/>
|
||||||
<span>Left Click: Add</span>
|
<span>{{ t("Canvas.LeftClickAdd") }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<img
|
<img
|
||||||
src="/src/assets/images/canvas/shubiao-r.png"
|
src="/src/assets/images/canvas/shubiao-r.png"
|
||||||
/>
|
/>
|
||||||
<span>Right Click: Remove</span>
|
<span>{{ t("Canvas.RightClickRemove") }}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -57,15 +57,15 @@
|
|||||||
$t("Canvas.creation")
|
$t("Canvas.creation")
|
||||||
}}</span>
|
}}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="action-btn" @click="onCopyCreate">
|
<!-- <div class="action-btn" @click="onCopyCreate">
|
||||||
<svg-icon name="CCut" size="26" />
|
<svg-icon name="CCut" size="26" />
|
||||||
<span class="btn-text">{{
|
<span class="btn-text">{{
|
||||||
$t("Canvas.CreateAndCopy")
|
$t("Canvas.CreateAndCopy")
|
||||||
}}</span>
|
}}</span>
|
||||||
</div>
|
</div> -->
|
||||||
<div class="action-btn" @click="onReset">
|
<div class="action-btn" @click="onReset">
|
||||||
<svg-icon name="CCut" size="26" />
|
<svg-icon name="CCut" size="26" />
|
||||||
<span class="btn-text">清空当前点位</span>
|
<span class="btn-text">{{ $t("Canvas.TheClearlySelectedContent") }}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -76,23 +76,9 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { ref, onMounted, watch } from "vue";
|
import { ref, onMounted, watch } from "vue";
|
||||||
import { useI18n } from "vue-i18n";
|
import { useI18n } from "vue-i18n";
|
||||||
import {
|
|
||||||
CreateSelectionCommand,
|
|
||||||
InvertSelectionCommand,
|
|
||||||
FeatherSelectionCommand,
|
|
||||||
FillSelectionCommand,
|
|
||||||
} from "../commands/SelectionCommands";
|
|
||||||
import { ToolCommand } from "../commands/ToolCommands";
|
|
||||||
import {
|
|
||||||
LassoCutoutCommand,
|
|
||||||
ClearSelectionCommand,
|
|
||||||
// CutSelectionToNewLayerCommand,
|
|
||||||
} from "../commands/LassoCutoutCommand";
|
|
||||||
|
|
||||||
import { OperationType } from "../utils/layerHelper";
|
import { OperationType } from "../utils/layerHelper";
|
||||||
import { ClearSelectionContentCommand } from "../commands/ClearSelectionContentCommand";
|
// 国际化
|
||||||
import { CutSelectionToNewLayerCommand } from "../commands/CutSelectionToNewLayerCommand";
|
const { t } = useI18n();
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
canvas: {
|
canvas: {
|
||||||
type: Object,
|
type: Object,
|
||||||
@@ -137,32 +123,30 @@
|
|||||||
const toolList = [
|
const toolList = [
|
||||||
{
|
{
|
||||||
type: OperationType.PART,
|
type: OperationType.PART,
|
||||||
label: "Point Selection",
|
label: t("Canvas.PointSelection"),
|
||||||
icon: "CPoint",
|
icon: "CPoint",
|
||||||
size: "20",
|
size: "20",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: OperationType.PART_RECTANGLE,
|
type: OperationType.PART_RECTANGLE,
|
||||||
label: "Marquee Selection",
|
label: t("Canvas.MarqueeSelection"),
|
||||||
icon: "CMarquee",
|
icon: "CMarquee",
|
||||||
size: "20",
|
size: "20",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: OperationType.PART_BRUSH,
|
type: OperationType.PART_BRUSH,
|
||||||
label: "Brush Selection",
|
label: t("Canvas.BrushSelection"),
|
||||||
icon: "CBrush2",
|
icon: "CBrush2",
|
||||||
size: "16",
|
size: "16",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: OperationType.PART_ERASER,
|
type: OperationType.PART_ERASER,
|
||||||
label: "Erase",
|
label: t("Canvas.Erase"),
|
||||||
icon: "CEraser2",
|
icon: "CEraser2",
|
||||||
size: "22",
|
size: "22",
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
// 国际化
|
|
||||||
const { t } = useI18n();
|
|
||||||
|
|
||||||
onMounted(() => {});
|
onMounted(() => {});
|
||||||
|
|
||||||
@@ -182,12 +166,6 @@
|
|||||||
show();
|
show();
|
||||||
// 根据工具类型设置选区类型
|
// 根据工具类型设置选区类型
|
||||||
toolType.value = newTool;
|
toolType.value = newTool;
|
||||||
|
|
||||||
// 更新选区管理器的选区类型
|
|
||||||
// if (props.partManager) {
|
|
||||||
// props.partManager.setPartType(toolType.value);
|
|
||||||
// props.partManager.setupPartEvents();
|
|
||||||
// }
|
|
||||||
} else {
|
} else {
|
||||||
close();
|
close();
|
||||||
}
|
}
|
||||||
@@ -220,12 +198,6 @@
|
|||||||
if (props.toolManager) {
|
if (props.toolManager) {
|
||||||
props.toolManager.setToolWithCommand(type);
|
props.toolManager.setToolWithCommand(type);
|
||||||
}
|
}
|
||||||
|
|
||||||
// // 备用方案:如果没有 toolManager,直接更新 partManager
|
|
||||||
// else if (props.partManager) {
|
|
||||||
// props.partManager.setPartType(type);
|
|
||||||
// props.partManager.setupPartEvents();
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 创建
|
// 创建
|
||||||
@@ -418,35 +390,11 @@
|
|||||||
|
|
||||||
.tool-actions {
|
.tool-actions {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: repeat(3, 1fr);
|
grid-template-columns: repeat(2, 1fr);
|
||||||
gap: 5px;
|
gap: 5px;
|
||||||
padding: 0 30px;
|
padding: 0 30px;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 平板适配 - 每行4个按钮 */
|
|
||||||
@media screen and (max-width: 768px) {
|
|
||||||
.tool-actions {
|
|
||||||
grid-template-columns: repeat(3, 1fr);
|
|
||||||
gap: 8px 6px;
|
|
||||||
padding: 0 8px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 手机适配 - 每行3个按钮 */
|
|
||||||
@media screen and (max-width: 480px) {
|
|
||||||
.tool-actions {
|
|
||||||
grid-template-columns: repeat(3, 1fr);
|
|
||||||
gap: 6px 4px;
|
|
||||||
padding: 0 6px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.header-btn {
|
|
||||||
font-size: 11px;
|
|
||||||
padding: 2px 4px;
|
|
||||||
min-width: 28px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.action-btn {
|
.action-btn {
|
||||||
display: flex;
|
display: flex;
|
||||||
// flex-direction: column;
|
// flex-direction: column;
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
<span class="label">{{ t("Canvas.scale") }}</span>
|
<span class="label">{{ t("Canvas.scale") }}</span>
|
||||||
<slider
|
<slider
|
||||||
:min="1"
|
:min="1"
|
||||||
:max="500"
|
:max="1000"
|
||||||
:step="1"
|
:step="1"
|
||||||
is-input
|
is-input
|
||||||
:tipFormatter="(v) => `${scale}%`"
|
:tipFormatter="(v) => `${scale}%`"
|
||||||
@@ -52,19 +52,19 @@
|
|||||||
<div class="repeat-setting-item">
|
<div class="repeat-setting-item">
|
||||||
<span class="label">{{ t("Canvas.offset") }}</span>
|
<span class="label">{{ t("Canvas.offset") }}</span>
|
||||||
<offset-tool
|
<offset-tool
|
||||||
:left="offsetX"
|
:left="offset.x"
|
||||||
:top="offsetY"
|
:top="offset.y"
|
||||||
@input="(e) => emit('inputFillOffset', e)"
|
@input="inputFillOffset"
|
||||||
@change="(e) => emit('changeFillOffset', e)"
|
@change="changeFillOffset"
|
||||||
:show-dish="false"
|
:show-dish="false"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class="repeat-setting-item offset">
|
<div class="repeat-setting-item offset">
|
||||||
<offset-tool
|
<offset-tool
|
||||||
:left="offsetX"
|
:left="offset.x"
|
||||||
:top="offsetY"
|
:top="offset.y"
|
||||||
@input="(e) => emit('inputFillOffset', e)"
|
@input="inputFillOffset"
|
||||||
@change="(e) => emit('changeFillOffset', e)"
|
@change="changeFillOffset"
|
||||||
:show-input="false"
|
:show-input="false"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
@@ -79,29 +79,6 @@
|
|||||||
import Slider from "../tools/Slider.vue";
|
import Slider from "../tools/Slider.vue";
|
||||||
import { useI18n } from "vue-i18n";
|
import { useI18n } from "vue-i18n";
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
const props = defineProps({
|
|
||||||
object: {
|
|
||||||
required: true,
|
|
||||||
type: Object,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
const angle = computed(
|
|
||||||
() => getTransformScaleAngle(props.object.fill?.patternTransform).angle
|
|
||||||
);
|
|
||||||
const scale = computed(() => {
|
|
||||||
const patternTransform = props.object.fill?.patternTransform;
|
|
||||||
const scaleValue = getTransformScaleAngle(patternTransform).scale * 100;
|
|
||||||
return Number(Number(scaleValue).toFixed(2));
|
|
||||||
});
|
|
||||||
const gapX = computed(() => props.object.fill_?.gapX || 0);
|
|
||||||
const gapY = computed(() => props.object.fill_?.gapY || 0);
|
|
||||||
const offsetX = computed(
|
|
||||||
() => (props.object.fill?.offsetX / props.object.width) * 100
|
|
||||||
);
|
|
||||||
const offsetY = computed(
|
|
||||||
() => (props.object.fill?.offsetY / props.object.height) * 100
|
|
||||||
);
|
|
||||||
const emit = defineEmits([
|
const emit = defineEmits([
|
||||||
"inputFillAngle",
|
"inputFillAngle",
|
||||||
"changeFillAngle",
|
"changeFillAngle",
|
||||||
@@ -112,13 +89,63 @@
|
|||||||
"inputFillGap",
|
"inputFillGap",
|
||||||
"changeFillGap",
|
"changeFillGap",
|
||||||
]);
|
]);
|
||||||
const inputFillScale = (e) => {
|
|
||||||
|
const props = defineProps({
|
||||||
|
object: {
|
||||||
|
required: true,
|
||||||
|
type: Object,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
const angle = computed(
|
||||||
|
() => getTransformScaleAngle(props.object.fill?.patternTransform).angle
|
||||||
|
);
|
||||||
|
const gapX = computed(() => props.object.fill_?.gapX || 0);
|
||||||
|
const gapY = computed(() => props.object.fill_?.gapY || 0);
|
||||||
|
|
||||||
|
// 缩放比例
|
||||||
|
const scale = computed(() => {
|
||||||
|
const object = props.object;
|
||||||
|
const patternTransform = object.fill?.patternTransform;
|
||||||
|
const scaleValue = getTransformScaleAngle(patternTransform).scale;
|
||||||
|
const scaleX = scaleValue / (object.width / object.fill_.width / 5);
|
||||||
|
const scaleY = scaleValue / (object.height / object.fill_.height / 5);
|
||||||
|
const scaleXY = object.width > object.height ? scaleX : scaleY;
|
||||||
|
return Number(Number(scaleXY * 100).toFixed(2));
|
||||||
|
});
|
||||||
|
const inputFillScale = (e) => setFillScale(e, true);
|
||||||
|
const changeFillScale = (e) => setFillScale(e, false);
|
||||||
|
const setFillScale = (e, isInput) => {
|
||||||
|
const object = props.object;
|
||||||
const scale = e / 100;
|
const scale = e / 100;
|
||||||
emit("inputFillScale", scale);
|
const scaleX = (object.width / object.fill_.width / 5) * scale;
|
||||||
|
const scaleY = (object.height / object.fill_.height / 5) * scale;
|
||||||
|
const scaleXY = object.width > object.height ? scaleX : scaleY;
|
||||||
|
emit(isInput ? "inputFillScale" : "changeFillScale", scaleXY);
|
||||||
};
|
};
|
||||||
const changeFillScale = (e) => {
|
|
||||||
const scale = e / 100;
|
// 偏移量
|
||||||
emit("changeFillScale", scale);
|
const offset = computed(() => {
|
||||||
|
const object = props.object;
|
||||||
|
const patternTransform = object.fill?.patternTransform;
|
||||||
|
const scale = getTransformScaleAngle(patternTransform).scale;
|
||||||
|
const offsetX = object.fill?.offsetX;
|
||||||
|
const offsetY = object.fill?.offsetY;
|
||||||
|
const twidth = object.fill_?.width;
|
||||||
|
const theight = object.fill_?.height;
|
||||||
|
const x = ((offsetX + (twidth * scale) / 2) * 100) / object.width;
|
||||||
|
const y = ((offsetY + (theight * scale) / 2) * 100) / object.height;
|
||||||
|
return { x, y };
|
||||||
|
});
|
||||||
|
const inputFillOffset = (e) => setFillOffset(e, true);
|
||||||
|
const changeFillOffset = (e) => setFillOffset(e, false);
|
||||||
|
const setFillOffset = (e, isInput) => {
|
||||||
|
const { left, top } = e;
|
||||||
|
const object = props.object;
|
||||||
|
const patternTransform = object.fill?.patternTransform;
|
||||||
|
const scale = getTransformScaleAngle(patternTransform).scale;
|
||||||
|
const x = (left / 100) * object.width - (object.fill_?.width * scale) / 2;
|
||||||
|
const y = (top / 100) * object.height - (object.fill_?.height * scale) / 2;
|
||||||
|
emit(isInput ? "inputFillOffset" : "changeFillOffset", { x, y });
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@@ -126,6 +153,7 @@
|
|||||||
.repeat-setting {
|
.repeat-setting {
|
||||||
user-select: none;
|
user-select: none;
|
||||||
width: 228px;
|
width: 228px;
|
||||||
|
overflow: hidden;
|
||||||
> .title {
|
> .title {
|
||||||
line-height: 35px;
|
line-height: 35px;
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
v-for="v in activeObjects"
|
v-for="v in activeObjects"
|
||||||
:key="v.id"
|
:key="v.id"
|
||||||
>
|
>
|
||||||
<div class="title">{{ v.layer?.name }}</div>
|
<!-- <div class="title">{{ v.layer?.name }}</div> -->
|
||||||
<div class="list">
|
<div class="list">
|
||||||
<div
|
<div
|
||||||
class="input"
|
class="input"
|
||||||
@@ -125,7 +125,10 @@
|
|||||||
"
|
"
|
||||||
:options="selectOptions"
|
:options="selectOptions"
|
||||||
@change="(e) => changeFillRepeat(e, v)"
|
@change="(e) => changeFillRepeat(e, v)"
|
||||||
:disabled="v.layer?.metadata?.level2Type === 'Embroidery'"
|
:disabled="
|
||||||
|
v.layer?.metadata?.sourceData?.type ===
|
||||||
|
'trims'
|
||||||
|
"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<!-- 平铺设置 -->
|
<!-- 平铺设置 -->
|
||||||
@@ -283,10 +286,10 @@
|
|||||||
activeObjects.value.forEach((v) => {
|
activeObjects.value.forEach((v) => {
|
||||||
v.layer = props.layerManager.getLayerById(v.layerId);
|
v.layer = props.layerManager.getLayerById(v.layerId);
|
||||||
});
|
});
|
||||||
if (activeObjects.value.length === 0) {
|
if (activeObjects.value.length === 1) {
|
||||||
close();
|
|
||||||
} else {
|
|
||||||
show();
|
show();
|
||||||
|
} else {
|
||||||
|
close();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
//取消当前选中
|
//取消当前选中
|
||||||
@@ -312,6 +315,7 @@
|
|||||||
layerManager: props.layerManager,
|
layerManager: props.layerManager,
|
||||||
layers: layers,
|
layers: layers,
|
||||||
lastSelectLayerId: lastSelectLayerId,
|
lastSelectLayerId: lastSelectLayerId,
|
||||||
|
isCommand,
|
||||||
});
|
});
|
||||||
if (isCommand) {
|
if (isCommand) {
|
||||||
props.commandManager.execute(cmd);
|
props.commandManager.execute(cmd);
|
||||||
@@ -333,6 +337,7 @@
|
|||||||
const finalState = computeAngleState(angle, obj, initialState);
|
const finalState = computeAngleState(angle, obj, initialState);
|
||||||
transformObject(obj, initialState, finalState, false);
|
transformObject(obj, initialState, finalState, false);
|
||||||
if (!obj.hasOwnProperty("oldState")) obj.oldState = initialState;
|
if (!obj.hasOwnProperty("oldState")) obj.oldState = initialState;
|
||||||
|
props.canvasManager.beforeChangeCanvas([obj]);
|
||||||
};
|
};
|
||||||
const changeAngle = (angle, obj) => {
|
const changeAngle = (angle, obj) => {
|
||||||
var initialState;
|
var initialState;
|
||||||
@@ -425,6 +430,7 @@
|
|||||||
});
|
});
|
||||||
obj.set("fill", pattern);
|
obj.set("fill", pattern);
|
||||||
props.canvas.renderAll();
|
props.canvas.renderAll();
|
||||||
|
props.canvasManager.beforeChangeCanvas([obj]);
|
||||||
};
|
};
|
||||||
const changeFillAngle = (angle, obj) => {
|
const changeFillAngle = (angle, obj) => {
|
||||||
const fill = obj.get("fill");
|
const fill = obj.get("fill");
|
||||||
@@ -439,16 +445,17 @@
|
|||||||
if (!obj.oldPattern) obj.oldPattern = obj.get("fill");
|
if (!obj.oldPattern) obj.oldPattern = obj.get("fill");
|
||||||
const pattern = new fabric.Pattern({
|
const pattern = new fabric.Pattern({
|
||||||
...obj.get("fill"),
|
...obj.get("fill"),
|
||||||
offsetX: (value.left / 100) * obj.width,
|
offsetX: value.x,
|
||||||
offsetY: (value.top / 100) * obj.height,
|
offsetY: value.y,
|
||||||
});
|
});
|
||||||
obj.set("fill", pattern);
|
obj.set("fill", pattern);
|
||||||
props.canvas.renderAll();
|
props.canvas.renderAll();
|
||||||
|
props.canvasManager.beforeChangeCanvas([obj]);
|
||||||
};
|
};
|
||||||
const changeFillOffset = (value, obj) => {
|
const changeFillOffset = (value, obj) => {
|
||||||
const pattern = new fabric.Pattern({
|
const pattern = new fabric.Pattern({
|
||||||
offsetX: (value.left / 100) * obj.width,
|
offsetX: value.x,
|
||||||
offsetY: (value.top / 100) * obj.height,
|
offsetY: value.y,
|
||||||
});
|
});
|
||||||
changeFill(obj, pattern);
|
changeFill(obj, pattern);
|
||||||
};
|
};
|
||||||
@@ -463,6 +470,7 @@
|
|||||||
});
|
});
|
||||||
obj.set("fill", pattern);
|
obj.set("fill", pattern);
|
||||||
props.canvas.renderAll();
|
props.canvas.renderAll();
|
||||||
|
props.canvasManager.beforeChangeCanvas([obj]);
|
||||||
};
|
};
|
||||||
const changeFillScale = (scale, obj) => {
|
const changeFillScale = (scale, obj) => {
|
||||||
const fill = obj.get("fill");
|
const fill = obj.get("fill");
|
||||||
@@ -495,7 +503,8 @@
|
|||||||
newGapY: gapY,
|
newGapY: gapY,
|
||||||
record: true,
|
record: true,
|
||||||
});
|
});
|
||||||
cmd.execute();
|
cmd.execute(false);
|
||||||
|
props.canvasManager.beforeChangeCanvas([obj]);
|
||||||
};
|
};
|
||||||
const changeFillGap = (gapX, gapY, obj) => {
|
const changeFillGap = (gapX, gapY, obj) => {
|
||||||
if (obj.oldFill_) {
|
if (obj.oldFill_) {
|
||||||
@@ -761,7 +770,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.tool-content {
|
.tool-content {
|
||||||
overflow-y: auto;
|
// overflow-y: auto;
|
||||||
max-height: 20rem;
|
max-height: 20rem;
|
||||||
margin-top: 1rem;
|
margin-top: 1rem;
|
||||||
padding: 0 1.5rem;
|
padding: 0 1.5rem;
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import {
|
|||||||
isGroupLayer,
|
isGroupLayer,
|
||||||
OperationType,
|
OperationType,
|
||||||
OperationTypes,
|
OperationTypes,
|
||||||
findLayer,
|
|
||||||
createLayer,
|
createLayer,
|
||||||
LayerType,
|
LayerType,
|
||||||
SpecialLayerId,
|
SpecialLayerId,
|
||||||
@@ -20,7 +19,6 @@ import { AnimationManager } from "./animation/AnimationManager";
|
|||||||
import { createCanvas } from "../utils/canvasFactory";
|
import { createCanvas } from "../utils/canvasFactory";
|
||||||
import { CanvasEventManager } from "./events/CanvasEventManager";
|
import { CanvasEventManager } from "./events/CanvasEventManager";
|
||||||
import CanvasConfig from "../config/canvasConfig";
|
import CanvasConfig from "../config/canvasConfig";
|
||||||
import { RedGreenModeManager } from "./RedGreenModeManager";
|
|
||||||
import { EraserStateManager } from "./EraserStateManager";
|
import { EraserStateManager } from "./EraserStateManager";
|
||||||
import {
|
import {
|
||||||
deepClone,
|
deepClone,
|
||||||
@@ -70,8 +68,11 @@ export class CanvasManager {
|
|||||||
this.isFixedErasable = options.isFixedErasable || false; // 是否允许擦除固定图层
|
this.isFixedErasable = options.isFixedErasable || false; // 是否允许擦除固定图层
|
||||||
this.eraserStateManager = null; // 橡皮擦状态管理器引用
|
this.eraserStateManager = null; // 橡皮擦状态管理器引用
|
||||||
this.handleCanvasInit = null; // 画布初始化回调函数
|
this.handleCanvasInit = null; // 画布初始化回调函数
|
||||||
|
this.partManager = options.partManager || null;
|
||||||
this.props = options.props || {};
|
this.props = options.props || {};
|
||||||
this.emit = options.emit || (() => {});
|
this.emit = options.emit || (() => {});
|
||||||
|
this.awaitCanvasRun = null;
|
||||||
|
this.canvasChangeing = false;
|
||||||
// 初始化画布
|
// 初始化画布
|
||||||
this.initializeCanvas();
|
this.initializeCanvas();
|
||||||
}
|
}
|
||||||
@@ -174,7 +175,12 @@ export class CanvasManager {
|
|||||||
_initCanvasEvents() {
|
_initCanvasEvents() {
|
||||||
// 添加笔刷图像转换处理回调
|
// 添加笔刷图像转换处理回调
|
||||||
this.canvas.onBrushImageConverted = async (fabricImage) => {
|
this.canvas.onBrushImageConverted = async (fabricImage) => {
|
||||||
await this.addImageToLayer({ fabricImage, targetLayerId: null });
|
const activeTool = this.toolManager?.activeTool?.value;
|
||||||
|
if(activeTool === OperationType.PART_BRUSH){
|
||||||
|
this.partManager?.addDrawPartImage(fabricImage);
|
||||||
|
}else{
|
||||||
|
await this.addImageToLayer({ fabricImage, targetLayerId: null });
|
||||||
|
}
|
||||||
// 返回false表示使用默认行为(直接添加到画布)
|
// 返回false表示使用默认行为(直接添加到画布)
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
@@ -196,6 +202,10 @@ export class CanvasManager {
|
|||||||
console.log("擦除完成", e.targets);
|
console.log("擦除完成", e.targets);
|
||||||
// 可以在这里保存状态到命令管理器
|
// 可以在这里保存状态到命令管理器
|
||||||
const affectedObjects = e.targets || [];
|
const affectedObjects = e.targets || [];
|
||||||
|
const activeTool = this.toolManager?.activeTool?.value;
|
||||||
|
if(activeTool === OperationType.PART_ERASER){
|
||||||
|
return this.partManager?.onErasingEnd(affectedObjects);
|
||||||
|
}
|
||||||
const command = this.eraserStateManager.endErasing(affectedObjects);
|
const command = this.eraserStateManager.endErasing(affectedObjects);
|
||||||
if (command && this.commandManager) {
|
if (command && this.commandManager) {
|
||||||
await this.commandManager?.executeCommand?.(command);
|
await this.commandManager?.executeCommand?.(command);
|
||||||
@@ -327,6 +337,7 @@ export class CanvasManager {
|
|||||||
setupCanvasEvents(activeElementId, layerManager) {
|
setupCanvasEvents(activeElementId, layerManager) {
|
||||||
// 创建画布事件管理器
|
// 创建画布事件管理器
|
||||||
this.eventManager = new CanvasEventManager(this.canvas, {
|
this.eventManager = new CanvasEventManager(this.canvas, {
|
||||||
|
canvasManager: this,
|
||||||
toolManager: this.toolManager,
|
toolManager: this.toolManager,
|
||||||
animationManager: this.animationManager,
|
animationManager: this.animationManager,
|
||||||
thumbnailManager: this.thumbnailManager,
|
thumbnailManager: this.thumbnailManager,
|
||||||
@@ -857,9 +868,9 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
|||||||
|
|
||||||
return layerObjectByLayerId;
|
return layerObjectByLayerId;
|
||||||
}
|
}
|
||||||
getObjectsByIds(ids){
|
getObjectsByIdOrLayerId(ids){
|
||||||
const objects = this.canvas.getObjects().filter((obj) => {
|
const objects = this.canvas.getObjects().filter((obj) => {
|
||||||
return ids.includes(obj.id);
|
return ids.includes(obj.id) || ids.includes(obj.layerId);
|
||||||
});
|
});
|
||||||
return objects;
|
return objects;
|
||||||
}
|
}
|
||||||
@@ -1136,7 +1147,7 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
|||||||
const glayer = this.layerManager.getLayerById(SpecialLayerId.SPECIAL_GROUP);
|
const glayer = this.layerManager.getLayerById(SpecialLayerId.SPECIAL_GROUP);
|
||||||
if(!glayer) return Promise.reject("印花和元素图层组不存在");
|
if(!glayer) return Promise.reject("印花和元素图层组不存在");
|
||||||
const ids = glayer.children.map((v) => v.id);
|
const ids = glayer.children.map((v) => v.id);
|
||||||
const objects = this.getObjectsByIds(ids);
|
const objects = this.getObjectsByIdOrLayerId(ids);
|
||||||
const fixedLayerObj = this.getFixedLayerObject();
|
const fixedLayerObj = this.getFixedLayerObject();
|
||||||
if(!fixedLayerObj) return Promise.reject("固定图层不存在");
|
if(!fixedLayerObj) return Promise.reject("固定图层不存在");
|
||||||
const flWidth = fixedLayerObj.width
|
const flWidth = fixedLayerObj.width
|
||||||
@@ -1147,8 +1158,9 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
|||||||
const flScaleY = fixedLayerObj.scaleY
|
const flScaleY = fixedLayerObj.scaleY
|
||||||
const prints = [];
|
const prints = [];
|
||||||
const trims = [];
|
const trims = [];
|
||||||
objects.forEach((v) => {
|
objects.forEach((v, i) => {
|
||||||
const sourceData = glayer.children.find((v_) => v_.id === v.id)?.metadata?.sourceData;
|
const label = glayer.children.find((v_) => (v_.id === v.layerId || v_.id === v.id));
|
||||||
|
const sourceData = label?.metadata?.sourceData;
|
||||||
if(!sourceData) return;
|
if(!sourceData) return;
|
||||||
const obj = {
|
const obj = {
|
||||||
ifSingle: typeof v.fill === "string",
|
ifSingle: typeof v.fill === "string",
|
||||||
@@ -1160,7 +1172,7 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
|||||||
scale: [0, 0],
|
scale: [0, 0],
|
||||||
angle: v.angle,
|
angle: v.angle,
|
||||||
name: sourceData.name,
|
name: sourceData.name,
|
||||||
priority: sourceData.priority,
|
priority: i + 1,
|
||||||
object:{
|
object:{
|
||||||
top: 0,
|
top: 0,
|
||||||
left: 0,
|
left: 0,
|
||||||
@@ -1173,6 +1185,7 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
|||||||
blendMode: v.globalCompositeOperation,
|
blendMode: v.globalCompositeOperation,
|
||||||
gapX: 0,// 平铺模式下的间距
|
gapX: 0,// 平铺模式下的间距
|
||||||
gapY: 0,// 平铺模式下的间距
|
gapY: 0,// 平铺模式下的间距
|
||||||
|
fill_repeat: "",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let left = (v.left - (flLeft - flWidth * flScaleX / 2));
|
let left = (v.left - (flLeft - flWidth * flScaleX / 2));
|
||||||
@@ -1216,16 +1229,17 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
|||||||
obj.location = [left, top];
|
obj.location = [left, top];
|
||||||
obj.object.gapX = fill_.gapX;
|
obj.object.gapX = fill_.gapX;
|
||||||
obj.object.gapY = fill_.gapY;
|
obj.object.gapY = fill_.gapY;
|
||||||
|
obj.object.fill_repeat = fill.repeat;
|
||||||
}
|
}
|
||||||
if(obj.level2Type === "Pattern"){
|
if(sourceData.type === "print"){
|
||||||
prints.push(obj);
|
prints.push(obj);
|
||||||
}else if(obj.level2Type === "Embroidery"){
|
}else if(sourceData.type === "trims"){
|
||||||
trims.push(obj);
|
trims.push(obj);
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
// prints.sort((a, b) => a.ifSingle ? 1 : -1);
|
// prints.sort((a, b) => a.ifSingle ? 1 : -1);
|
||||||
prints.forEach((v, i) => v.priority = i + 1);
|
// prints.forEach((v, i) => v.priority = i + 1);
|
||||||
trims.forEach((v, i) => v.priority = i + 1);
|
// trims.forEach((v, i) => v.priority = i + 1);
|
||||||
return {prints, trims};
|
return {prints, trims};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1312,6 +1326,7 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
|||||||
canvasColor: this.canvasColor.value,
|
canvasColor: this.canvasColor.value,
|
||||||
activeLayerId: this.layerManager?.activeLayerId?.value,
|
activeLayerId: this.layerManager?.activeLayerId?.value,
|
||||||
};
|
};
|
||||||
|
this.FixJsonIdLoss(data);
|
||||||
console.log("获取画布JSON数据...", data);
|
console.log("获取画布JSON数据...", data);
|
||||||
return JSON.stringify(data);
|
return JSON.stringify(data);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -1319,9 +1334,8 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
|||||||
throw new Error("获取画布JSON失败");
|
throw new Error("获取画布JSON失败");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
loadJSON(json, calllBack) {
|
loadJSON(json, calllBack) {
|
||||||
|
this.canvas.loading.value = true;
|
||||||
// 确保传入的json是字符串格式
|
// 确保传入的json是字符串格式
|
||||||
if (typeof json === "object") {
|
if (typeof json === "object") {
|
||||||
json = JSON.stringify(json);
|
json = JSON.stringify(json);
|
||||||
@@ -1330,8 +1344,9 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
|||||||
}
|
}
|
||||||
// 解析JSON字符串
|
// 解析JSON字符串
|
||||||
try {
|
try {
|
||||||
const parsedJson = JSON.parse(json);
|
const parsedJson = window.testCanvasJson || JSON.parse(json);
|
||||||
console.log("加载画布JSON数据:", parsedJson);
|
console.log("加载画布JSON数据:", parsedJson);
|
||||||
|
this.FixJsonIdLoss(parsedJson);
|
||||||
this.canvasWidth.value = parsedJson.canvasWidth || this.width;
|
this.canvasWidth.value = parsedJson.canvasWidth || this.width;
|
||||||
this.canvasHeight.value = parsedJson.canvasHeight || this.height;
|
this.canvasHeight.value = parsedJson.canvasHeight || this.height;
|
||||||
this.canvasColor.value = parsedJson.canvasColor || this.backgroundColor;
|
this.canvasColor.value = parsedJson.canvasColor || this.backgroundColor;
|
||||||
@@ -1398,7 +1413,7 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
|||||||
// 重置画布数据
|
// 重置画布数据
|
||||||
await this.setCanvasSize(this.canvas.width, this.canvas.height);
|
await this.setCanvasSize(this.canvas.width, this.canvas.height);
|
||||||
await this.centerBackgroundLayer(this.canvas.width, this.canvas.height);
|
await this.centerBackgroundLayer(this.canvas.width, this.canvas.height);
|
||||||
// await this.resetCanvasSizeByFixedLayer();
|
await this.resetCanvasSizeByFixedLayer();
|
||||||
// 重新构建对象关系
|
// 重新构建对象关系
|
||||||
// restoreObjectLayerAssociations(this.layers.value, this.canvas.getObjects());
|
// restoreObjectLayerAssociations(this.layers.value, this.canvas.getObjects());
|
||||||
// 验证图层关联关系 - 稳定后可以注释
|
// 验证图层关联关系 - 稳定后可以注释
|
||||||
@@ -1410,7 +1425,7 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
|||||||
// console.log("图层关联验证结果:", isValidate);
|
// console.log("图层关联验证结果:", isValidate);
|
||||||
// 排序
|
// 排序
|
||||||
// 使用LayerSort工具重新排列画布对象(如果可用)
|
// 使用LayerSort工具重新排列画布对象(如果可用)
|
||||||
await this?.layerManager?.layerSort?.rearrangeObjects();
|
await this?.layerManager?.layerSort?.rearrangeObjectsAsync();
|
||||||
|
|
||||||
this.layerManager.activeLayerId.value = this.layers.value[0]
|
this.layerManager.activeLayerId.value = this.layers.value[0]
|
||||||
.children?.length
|
.children?.length
|
||||||
@@ -1449,27 +1464,56 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
|||||||
throw new Error("解析JSON失败,请检查输入格式: " + error.message);
|
throw new Error("解析JSON失败,请检查输入格式: " + error.message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/** 修复JSON数据中的ID丢失问题 */
|
||||||
|
FixJsonIdLoss(json){
|
||||||
|
const layerIds = [];
|
||||||
|
const layers = json?.layers || [];
|
||||||
|
const objects = json?.canvas?.objects || [];
|
||||||
|
layers.forEach((layer) => {
|
||||||
|
layerIds.push(layer.id);
|
||||||
|
layer.children?.forEach((child) => layerIds.push(child.id));
|
||||||
|
if(!layer.fabricObjects?.[0]?.id && !layer.fabricObject?.id){
|
||||||
|
const obj = objects?.find((o) => o.layerId === layer.id);
|
||||||
|
if(obj) {
|
||||||
|
layer.fabricObjects = [{
|
||||||
|
id: obj.id,
|
||||||
|
type: obj.type,
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
// 排序
|
||||||
|
objects.sort((a, b) => {
|
||||||
|
if (a.isBackground) return -1;
|
||||||
|
if (b.isBackground) return 1;
|
||||||
|
})
|
||||||
|
// 排除的对象id
|
||||||
|
const excludedObjects = [SpecialLayerId.PART_SELECTOR];
|
||||||
|
json.canvas.objects = objects.filter((v) => {
|
||||||
|
// 指定ID排除
|
||||||
|
if(excludedObjects.includes(v.id)) return false;
|
||||||
|
|
||||||
|
if(v.isBackground || v.isFixed) return true;
|
||||||
|
// 当前图层不存在当前对象
|
||||||
|
if(!layerIds.includes(v.layerId)) return false;
|
||||||
|
return true
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建其他图层:印花、颜色、元素...
|
* 创建其他图层:印花、颜色、元素...
|
||||||
* @param {Object} otherData - 其他图层数据
|
* @param {Object} otherData - 其他图层数据
|
||||||
*/
|
*/
|
||||||
async createOtherLayers(otherData, isUpdate = false) {
|
async createOtherLayers(otherData) {
|
||||||
if (!otherData) return console.warn("otherData 为空不需要添加");
|
if (!otherData) return console.warn("otherData 为空不需要添加");
|
||||||
|
let resolve = ()=>{};
|
||||||
|
this.awaitCanvasRun = ()=>(new Promise((v) => resolve = v))
|
||||||
const otherData_ = JSON.parse(JSON.stringify(otherData));
|
const otherData_ = JSON.parse(JSON.stringify(otherData));
|
||||||
console.log("==========创建其他图层", otherData_);
|
console.log("==========创建其他图层", otherData_);
|
||||||
|
|
||||||
const updateColor = !!otherData_.color;
|
|
||||||
const updateSpecialGroup = !!otherData_.printObject || !!otherData_.trims;
|
|
||||||
// 删除颜色图层和特殊组图层
|
// 删除颜色图层和特殊组图层
|
||||||
const ids = [];
|
const ids = [SpecialLayerId.COLOR, SpecialLayerId.SPECIAL_GROUP];
|
||||||
if(isUpdate){
|
|
||||||
updateColor && ids.push(SpecialLayerId.COLOR)
|
|
||||||
updateSpecialGroup && ids.push(SpecialLayerId.SPECIAL_GROUP)
|
|
||||||
}else{
|
|
||||||
ids.push(SpecialLayerId.COLOR)
|
|
||||||
ids.push(SpecialLayerId.SPECIAL_GROUP)
|
|
||||||
}
|
|
||||||
this.layers.value = this.layers.value.filter((layer) => {
|
this.layers.value = this.layers.value.filter((layer) => {
|
||||||
if(ids.includes(layer.id)){
|
if(ids.includes(layer.id)){
|
||||||
ids.push(...layer.children?.map((child) => child.id));
|
ids.push(...layer.children?.map((child) => child.id));
|
||||||
@@ -1477,16 +1521,21 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
})
|
})
|
||||||
this.canvas.getObjects().forEach((v) => ids.includes(v.id) && this.canvas.remove(v))
|
this.canvas.getObjects().forEach((v) => {
|
||||||
|
if(ids.includes(v.id) || ids.includes(v.layerId)){
|
||||||
|
this.canvas.remove(v)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
// 创建颜色图层
|
// 创建颜色图层
|
||||||
otherData_.color && await this.createColorLayer(otherData_.color);
|
await this.createColorLayer(otherData_.color);
|
||||||
|
|
||||||
const printTrimsLayers = [];// 印花和元素图层
|
const printTrimsLayers = [];// 印花和元素图层
|
||||||
const singleLayers = [];// 平铺图层
|
const singleLayers = [];// 平铺图层
|
||||||
otherData_.printObject?.prints?.forEach((print, index) => {// 印花
|
otherData_.printObject?.prints?.forEach((print, index) => {// 印花
|
||||||
print.name = t("Canvas.Print") + (index + 1);
|
print.name = t("Canvas.Print") + (index + 1);
|
||||||
|
print.type = "print";
|
||||||
if(print.ifSingle){
|
if(print.ifSingle){
|
||||||
printTrimsLayers.unshift({...print});
|
printTrimsLayers.unshift({...print});
|
||||||
}else{
|
}else{
|
||||||
@@ -1495,12 +1544,16 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
|||||||
})
|
})
|
||||||
otherData_.trims?.prints?.forEach((trims, index) => {// 元素
|
otherData_.trims?.prints?.forEach((trims, index) => {// 元素
|
||||||
trims.name = t("Canvas.Elements") + (index + 1);
|
trims.name = t("Canvas.Elements") + (index + 1);
|
||||||
|
trims.type = "trims";
|
||||||
printTrimsLayers.unshift({...trims});
|
printTrimsLayers.unshift({...trims});
|
||||||
})
|
})
|
||||||
if(isUpdate ? updateSpecialGroup : true){
|
if(printTrimsLayers.length || singleLayers.length){
|
||||||
await this.createPrintTrimsLayers(printTrimsLayers, singleLayers);
|
await this.createPrintTrimsLayers(printTrimsLayers, singleLayers);
|
||||||
}
|
}
|
||||||
await this.changeCanvas();
|
await this.changeCanvas();
|
||||||
|
console.log("==========创建其他图层成功");
|
||||||
|
resolve();
|
||||||
|
this.awaitCanvasRun = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 设置画布对象的裁剪信息
|
// 设置画布对象的裁剪信息
|
||||||
@@ -1624,8 +1677,8 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
|||||||
let opacity = 1
|
let opacity = 1
|
||||||
let flipX = false;
|
let flipX = false;
|
||||||
let flipY = false;
|
let flipY = false;
|
||||||
let blendMode = BlendMode.MULTIPLY;
|
let blendMode = BlendMode.NORMAL;
|
||||||
if(item.level2Type === "Embroidery") blendMode = BlendMode.NORMAL;// 元素正常
|
// if(item.type === "trims") blendMode = BlendMode.NORMAL;// 元素正常
|
||||||
if(item.object){
|
if(item.object){
|
||||||
opacity = item.object.opacity
|
opacity = item.object.opacity
|
||||||
flipX = item.object.flipX
|
flipX = item.object.flipX
|
||||||
@@ -1650,7 +1703,7 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
|||||||
hasBorders: true,
|
hasBorders: true,
|
||||||
isPrintTrims: true,
|
isPrintTrims: true,
|
||||||
});
|
});
|
||||||
this.canvas.add(image);
|
// this.canvas.add(image);
|
||||||
let layer = createLayer({
|
let layer = createLayer({
|
||||||
id: id,
|
id: id,
|
||||||
name: name,
|
name: name,
|
||||||
@@ -1661,7 +1714,8 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
|||||||
isPrintTrims: true,
|
isPrintTrims: true,
|
||||||
blendMode: blendMode,
|
blendMode: blendMode,
|
||||||
fabricObjects: [image.toObject(["id", "layerId", "layerName"])],
|
fabricObjects: [image.toObject(["id", "layerId", "layerName"])],
|
||||||
metadata: {sourceData: item, level2Type: item.level2Type},
|
metadata: {sourceData: item},
|
||||||
|
object: image,
|
||||||
})
|
})
|
||||||
children.push(layer);
|
children.push(layer);
|
||||||
};
|
};
|
||||||
@@ -1682,15 +1736,15 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
|||||||
resolve(tcanvas);
|
resolve(tcanvas);
|
||||||
}, { crossOrigin: "anonymous" });
|
}, { crossOrigin: "anonymous" });
|
||||||
})
|
})
|
||||||
let scaleX_ = fixedLayerObj.width / image.width * (item.scale?.[0] || 1) / 5;
|
let scaleX_ = flWidth / image.width * (item.scale?.[0] || 1) / 5;
|
||||||
let scaleY_ = fixedLayerObj.height / image.height * (item.scale?.[1] || 1) / 5;
|
let scaleY_ = flHeight / image.height * (item.scale?.[1] || 1) / 5;
|
||||||
let scale = fixedLayerObj.width > fixedLayerObj.height ? scaleX_ : scaleY_;
|
let scale = flWidth > flHeight ? scaleX_ : scaleY_;
|
||||||
let offsetX = (item.location?.[0] || 0) - image.width * scale / 2
|
let offsetX = (item.location?.[0] || 0) - image.width * scale / 2
|
||||||
let offsetY = (item.location?.[1] || 0) - image.height * scale / 2
|
let offsetY = (item.location?.[1] || 0) - image.height * scale / 2
|
||||||
let top = fixedLayerObj.top - fixedLayerObj.height * fixedLayerObj.scaleY / 2
|
let top = flTop - flHeight * flScaleY / 2
|
||||||
let left = fixedLayerObj.left - fixedLayerObj.width * fixedLayerObj.scaleX / 2
|
let left = flLeft - flWidth * flScaleX / 2
|
||||||
let scaleX = fixedLayerObj.scaleX
|
let scaleX = flScaleX
|
||||||
let scaleY = fixedLayerObj.scaleY
|
let scaleY = flScaleY
|
||||||
let opacity = 1
|
let opacity = 1
|
||||||
let angle = 0
|
let angle = 0
|
||||||
let gapX = 0
|
let gapX = 0
|
||||||
@@ -1698,27 +1752,29 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
|||||||
let fillSource = image
|
let fillSource = image
|
||||||
let flipX = false;
|
let flipX = false;
|
||||||
let flipY = false;
|
let flipY = false;
|
||||||
let blendMode = BlendMode.MULTIPLY;
|
let blendMode = BlendMode.NORMAL;
|
||||||
|
let fill_repeat = "repeat"
|
||||||
if(item.object){
|
if(item.object){
|
||||||
top += item.object.top * fixedLayerObj.scaleY
|
top += item.object.top * flScaleY
|
||||||
left += item.object.left * fixedLayerObj.scaleX
|
left += item.object.left * flScaleX
|
||||||
scaleX *= item.object.scaleX
|
scaleX *= item.object.scaleX
|
||||||
scaleY *= item.object.scaleY
|
scaleY *= item.object.scaleY
|
||||||
opacity = item.object.opacity
|
opacity = item.object.opacity
|
||||||
angle = item.object.angle
|
angle = item.object.angle
|
||||||
flipX = item.object.flipX
|
flipX = item.object.flipX
|
||||||
flipY = item.object.flipY
|
flipY = item.object.flipY
|
||||||
blendMode = item.object.blendMode || BlendMode.MULTIPLY;
|
if(item.object.blendMode) blendMode = item.object.blendMode;
|
||||||
gapX = item.object.gapX
|
gapX = item.object.gapX
|
||||||
gapY = item.object.gapY
|
gapY = item.object.gapY
|
||||||
fillSource = imageAddGapToCanvas(image, gapX, gapY);
|
fillSource = imageAddGapToCanvas(image, gapX, gapY);
|
||||||
|
if(item.object.fill_repeat) fill_repeat = item.object.fill_repeat;
|
||||||
}
|
}
|
||||||
let rect = new fabric.Rect({
|
let rect = new fabric.Rect({
|
||||||
id: id,
|
id: id,
|
||||||
layerId: id,
|
layerId: id,
|
||||||
layerName: name,
|
layerName: name,
|
||||||
width: fixedLayerObj.width,
|
width: flWidth,
|
||||||
height: fixedLayerObj.height,
|
height: flHeight,
|
||||||
top: top,
|
top: top,
|
||||||
left: left,
|
left: left,
|
||||||
scaleX: scaleX,
|
scaleX: scaleX,
|
||||||
@@ -1730,7 +1786,7 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
|||||||
globalCompositeOperation: blendMode,
|
globalCompositeOperation: blendMode,
|
||||||
fill: new fabric.Pattern({
|
fill: new fabric.Pattern({
|
||||||
source: fillSource,
|
source: fillSource,
|
||||||
repeat: "repeat",
|
repeat: fill_repeat,
|
||||||
patternTransform: createPatternTransform(scale, item.angle || 0),
|
patternTransform: createPatternTransform(scale, item.angle || 0),
|
||||||
offsetX: offsetX, // 水平偏移
|
offsetX: offsetX, // 水平偏移
|
||||||
offsetY: offsetY, // 垂直偏移
|
offsetY: offsetY, // 垂直偏移
|
||||||
@@ -1744,18 +1800,19 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
|||||||
},
|
},
|
||||||
isPrintTrims: true,
|
isPrintTrims: true,
|
||||||
});
|
});
|
||||||
this.canvas.add(rect);
|
// this.canvas.add(rect);
|
||||||
let layer = createLayer({
|
let layer = createLayer({
|
||||||
id: id,
|
id: id,
|
||||||
name: name,
|
name: name,
|
||||||
type: LayerType.BITMAP,
|
type: LayerType.BITMAP,
|
||||||
visible: true,
|
visible: true,
|
||||||
locked: true,
|
locked: false,
|
||||||
opacity: opacity,
|
opacity: opacity,
|
||||||
isPrintTrims: true,
|
isPrintTrims: true,
|
||||||
blendMode: BlendMode.MULTIPLY,
|
blendMode: blendMode,
|
||||||
fabricObjects: [rect.toObject(["id", "layerId", "layerName"])],
|
fabricObjects: [rect.toObject(["id", "layerId", "layerName"])],
|
||||||
metadata: {sourceData: item},
|
metadata: {sourceData: item},
|
||||||
|
object: rect,
|
||||||
})
|
})
|
||||||
children.push(layer);
|
children.push(layer);
|
||||||
};
|
};
|
||||||
@@ -1772,6 +1829,13 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
|||||||
// children.push(layer);
|
// children.push(layer);
|
||||||
// }
|
// }
|
||||||
if(children.length === 0) return;
|
if(children.length === 0) return;
|
||||||
|
// 印花元素排序
|
||||||
|
if(new Set(children.map(v => v.metadata.sourceData.priority)).size === children.length){
|
||||||
|
children.sort((a, b) => b.metadata.sourceData.priority - a.metadata.sourceData.priority);
|
||||||
|
}
|
||||||
|
children.forEach(layer => {
|
||||||
|
this.canvas.add(layer.object);
|
||||||
|
});
|
||||||
const groupRect = new fabric.Rect({});
|
const groupRect = new fabric.Rect({});
|
||||||
await this.setObjecCliptInfo(groupRect);
|
await this.setObjecCliptInfo(groupRect);
|
||||||
// 插入组图层
|
// 插入组图层
|
||||||
@@ -1794,12 +1858,13 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
|||||||
/**
|
/**
|
||||||
* 画布事件变更后
|
* 画布事件变更后
|
||||||
*/
|
*/
|
||||||
async changeCanvas(){
|
async changeCanvas(fids = [], isBeforeChange = false){
|
||||||
|
if(!isBeforeChange) this.canvasChangeing = false;
|
||||||
const fixedLayerObj = this.getFixedLayerObject();
|
const fixedLayerObj = this.getFixedLayerObject();
|
||||||
if(!fixedLayerObj) return console.warn("固定图层对象不存在", fixedLayerObj)
|
if(!fixedLayerObj) return console.warn("固定图层对象不存在", fixedLayerObj)
|
||||||
const colorObject = this.getLayerObjectById(SpecialLayerId.COLOR);
|
const colorObject = this.getLayerObjectById(SpecialLayerId.COLOR);
|
||||||
if(colorObject){
|
if(colorObject){
|
||||||
const ids = this.layerManager.getBlendModeLayerIds(SpecialLayerId.SPECIAL_GROUP);
|
const ids = this.layerManager.getBlendModeLayerIds(SpecialLayerId.SPECIAL_GROUP).filter(id => !fids.includes(id));
|
||||||
if(ids.length === 0){
|
if(ids.length === 0){
|
||||||
ids.unshift(SpecialLayerId.SPECIAL_GROUP);
|
ids.unshift(SpecialLayerId.SPECIAL_GROUP);
|
||||||
await this.setObjecCliptInfo(colorObject);
|
await this.setObjecCliptInfo(colorObject);
|
||||||
@@ -1819,6 +1884,24 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
|||||||
this.canvas.renderAll();
|
this.canvas.renderAll();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/** 画布变更之前 */
|
||||||
|
async beforeChangeCanvas(objects){
|
||||||
|
if(this.canvasChangeing) return;
|
||||||
|
const ids = objects.filter(v => {
|
||||||
|
return v.isPrintTrims && v.globalCompositeOperation && v.globalCompositeOperation !== BlendMode.NORMAL
|
||||||
|
}).map(v => v.layerId);
|
||||||
|
if(ids.length > 0){
|
||||||
|
this.canvasChangeing = true;
|
||||||
|
this.canvas.getObjects().forEach(v => {
|
||||||
|
if(ids.includes(v.layerId)){
|
||||||
|
v.globalCompositeOperation_ = v.globalCompositeOperation;
|
||||||
|
v.globalCompositeOperation = BlendMode.NORMAL;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
this.canvas.renderAll();
|
||||||
|
await this.changeCanvas(ids, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 缩放红绿图模式内容以适应当前画布大小
|
* 缩放红绿图模式内容以适应当前画布大小
|
||||||
|
|||||||
@@ -1580,7 +1580,7 @@ export class LayerManager {
|
|||||||
/**
|
/**
|
||||||
* 排序图层,确保图层顺序: 普通图层 > 固定图层 > 背景图层
|
* 排序图层,确保图层顺序: 普通图层 > 固定图层 > 背景图层
|
||||||
*/
|
*/
|
||||||
sortLayers() {
|
async sortLayers() {
|
||||||
// 对图层进行排序:背景图层在最底层(数组最后),固定图层在中间
|
// 对图层进行排序:背景图层在最底层(数组最后),固定图层在中间
|
||||||
this.layers.value.sort((a, b) => {
|
this.layers.value.sort((a, b) => {
|
||||||
// 如果a是背景图层,它应该排在后面(最底层)
|
// 如果a是背景图层,它应该排在后面(最底层)
|
||||||
@@ -1604,17 +1604,17 @@ export class LayerManager {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// 更新画布对象顺序
|
// 更新画布对象顺序
|
||||||
this._rearrangeObjects();
|
await this._rearrangeObjects();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 重新排列画布上的对象以匹配图层顺序
|
* 重新排列画布上的对象以匹配图层顺序
|
||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
_rearrangeObjects() {
|
async _rearrangeObjects() {
|
||||||
if (this.layerSort) {
|
if (this.layerSort) {
|
||||||
// 使用LayerSort的高级排序
|
// 使用LayerSort的高级排序
|
||||||
this.layerSort.rearrangeObjects();
|
await this.layerSort.rearrangeObjects();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1750,7 +1750,7 @@ export class LayerManager {
|
|||||||
layer.serializedObjects = layer.fabricObjects
|
layer.serializedObjects = layer.fabricObjects
|
||||||
.map((obj) => {
|
.map((obj) => {
|
||||||
if (typeof obj.toObject === "function") {
|
if (typeof obj.toObject === "function") {
|
||||||
return obj.toObject(["id", "layerId", "layerName"]);
|
return obj.toObject(["id", "layerId", "layerName", "fill_"]);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
})
|
})
|
||||||
@@ -1763,7 +1763,7 @@ export class LayerManager {
|
|||||||
if (layer.fabricObject) {
|
if (layer.fabricObject) {
|
||||||
layer.serializedBackgroundObject =
|
layer.serializedBackgroundObject =
|
||||||
typeof layer.fabricObject.toObject === "function"
|
typeof layer.fabricObject.toObject === "function"
|
||||||
? layer.fabricObject.toObject(["id", "layerId", "layerName"])
|
? layer.fabricObject.toObject(["id", "layerId", "layerName", "fill_"])
|
||||||
: null;
|
: null;
|
||||||
|
|
||||||
delete layer.fabricObject;
|
delete layer.fabricObject;
|
||||||
@@ -1793,7 +1793,7 @@ export class LayerManager {
|
|||||||
return layer.fabricObjects
|
return layer.fabricObjects
|
||||||
.map((obj) => {
|
.map((obj) => {
|
||||||
const { object } = findObjectById(this.canvas, obj.id);
|
const { object } = findObjectById(this.canvas, obj.id);
|
||||||
if (object) return object.toObject(["id", "layerId", "layerName"]);
|
if (object) return object.toObject(["id", "layerId", "layerName", "fill_"]);
|
||||||
return false;
|
return false;
|
||||||
})
|
})
|
||||||
.filter(Boolean);
|
.filter(Boolean);
|
||||||
@@ -1839,6 +1839,7 @@ export class LayerManager {
|
|||||||
|
|
||||||
// 存储到剪贴板
|
// 存储到剪贴板
|
||||||
this.clipboardData = layerCopy;
|
this.clipboardData = layerCopy;
|
||||||
|
console.log("复制图层:", layerCopy);
|
||||||
const input = document.createElement("input");
|
const input = document.createElement("input");
|
||||||
input.value = "aida_copy_canvas_layer: " + layer.name;
|
input.value = "aida_copy_canvas_layer: " + layer.name;
|
||||||
document.body.appendChild(input);
|
document.body.appendChild(input);
|
||||||
@@ -1884,7 +1885,7 @@ export class LayerManager {
|
|||||||
layerCopy.serializedObjects = layer.fabricObjects
|
layerCopy.serializedObjects = layer.fabricObjects
|
||||||
.map((obj) =>
|
.map((obj) =>
|
||||||
typeof obj.toObject === "function"
|
typeof obj.toObject === "function"
|
||||||
? obj.toObject(["id", "layerId", "layerName"])
|
? obj.toObject(["id", "layerId", "layerName", "fill_"])
|
||||||
: null
|
: null
|
||||||
)
|
)
|
||||||
.filter(Boolean);
|
.filter(Boolean);
|
||||||
@@ -1935,10 +1936,6 @@ export class LayerManager {
|
|||||||
return this.clipboardData;
|
return this.clipboardData;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 粘贴图层
|
|
||||||
* @returns {string} 新创建的图层ID
|
|
||||||
*/
|
|
||||||
/**
|
/**
|
||||||
* 粘贴图层
|
* 粘贴图层
|
||||||
* @returns {string} 新创建的图层ID
|
* @returns {string} 新创建的图层ID
|
||||||
|
|||||||
@@ -1,14 +1,12 @@
|
|||||||
import { fabric } from "fabric-with-all";
|
import { fabric } from "fabric-with-all";
|
||||||
import { traceImageContour, imageToCanvas } from "../utils/helper";
|
import { traceImageContour, imageToCanvas } from "../utils/helper";
|
||||||
import { OperationType } from "../utils/layerHelper";
|
import { OperationType, SpecialLayerId } from "../utils/layerHelper";
|
||||||
import { CreateSelectionCommand } from "../commands/SelectionCommands";
|
import { LassoCutoutCommand } from "../commands/LassoCutoutCommand";
|
||||||
import { ClearSelectionCommand } from "../commands/LassoCutoutCommand";
|
|
||||||
import addIcon from "@/assets/images/canvas/add.png";
|
import addIcon from "@/assets/images/canvas/add.png";
|
||||||
import removeIcon from "@/assets/images/canvas/remove.png";
|
import removeIcon from "@/assets/images/canvas/remove.png";
|
||||||
import { Https } from "@/tool/https";
|
|
||||||
import store from "@/store";
|
|
||||||
import { createStaticCanvas } from "../utils/canvasFactory";
|
|
||||||
import { getObjectAlphaToCanvas } from "../utils/objectHelper";
|
import { getObjectAlphaToCanvas } from "../utils/objectHelper";
|
||||||
|
import { Https } from "@/tool/https";
|
||||||
|
import { PartDrawCommand, PartPointDrawCommand } from "../commands/PartCommands";
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -27,11 +25,31 @@ export class PartManager {
|
|||||||
constructor(options = {}) {
|
constructor(options = {}) {
|
||||||
this.canvas = options.canvas;
|
this.canvas = options.canvas;
|
||||||
this.commandManager = options.commandManager;
|
this.commandManager = options.commandManager;
|
||||||
|
this.selectionManager = options.selectionManager;
|
||||||
this.layerManager = options.layerManager;
|
this.layerManager = options.layerManager;
|
||||||
this.canvasManager = options.canvasManager;
|
this.canvasManager = options.canvasManager;
|
||||||
this.toolManager = options.toolManager;
|
this.toolManager = options.toolManager;
|
||||||
this.props = options.props;
|
this.props = options.props;
|
||||||
|
|
||||||
|
// 选区样式配置
|
||||||
|
this.selectionStyle = {
|
||||||
|
stroke: "#0096ff",
|
||||||
|
strokeWidth: 1,
|
||||||
|
strokeDashArray: [5, 5],
|
||||||
|
fill: "rgba(0, 150, 255, 0.1)",
|
||||||
|
strokeUniform: true, // 保持描边宽度不随缩放改变
|
||||||
|
// fill: "rgba(127, 255, 127, 0.3)",
|
||||||
|
// stroke: "#2AA81B",
|
||||||
|
// strokeWidth: 2,
|
||||||
|
// strokeDashArray: [8, 4],
|
||||||
|
// strokeLineCap: "round",// 折线端点样式
|
||||||
|
// strokeLineJoin: "bevel", // 折线连接样式
|
||||||
|
selectable: false,
|
||||||
|
evented: false,
|
||||||
|
excludeFromExport: true,
|
||||||
|
hoverCursor: "default",
|
||||||
|
moveCursor: "default",
|
||||||
|
};
|
||||||
// 状态
|
// 状态
|
||||||
this.isActive = false;
|
this.isActive = false;
|
||||||
|
|
||||||
@@ -53,11 +71,12 @@ export class PartManager {
|
|||||||
// 当前工具
|
// 当前工具
|
||||||
this.activeTool = this.toolManager.activeTool;
|
this.activeTool = this.toolManager.activeTool;
|
||||||
|
|
||||||
|
this.rgba = { r: 0, g: 255, b: 0, a: 200 };
|
||||||
|
this.partId = SpecialLayerId.PART_SELECTOR;
|
||||||
this.partGroup = null; // 当前选区对象
|
this.partGroup = null; // 当前选区对象
|
||||||
this.partId = "part_selector";
|
|
||||||
this.partCanvas = null;// 选区画布
|
this.partCanvas = null;// 选区画布
|
||||||
// 点选工具相关
|
this.rectangleObject = null; // 矩形对象
|
||||||
this.pointList = []; // 存储点选坐标
|
this.pointList = []; // 点位列表 存储点选坐标
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -69,6 +88,20 @@ export class PartManager {
|
|||||||
const wasActive = this.isActive;
|
const wasActive = this.isActive;
|
||||||
this.isActive = this.tools.includes(toolId);
|
this.isActive = this.tools.includes(toolId);
|
||||||
|
|
||||||
|
if (toolId === OperationType.PART_ERASER) {
|
||||||
|
this.setEraserTool();
|
||||||
|
}
|
||||||
|
// else if (toolId === OperationType.PART || toolId === OperationType.PART_RECTANGLE) {
|
||||||
|
// this.clearPointData();
|
||||||
|
// this.resetPartObject();
|
||||||
|
// }
|
||||||
|
// if (toolId === OperationType.PART_ERASER || toolId === OperationType.PART_BRUSH) {
|
||||||
|
// if (this.pointList.length > 0) {
|
||||||
|
// this.clearPointData();
|
||||||
|
// this.resetPartObject();
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
// 如果从非选区工具切换到选区工具,初始化事件
|
// 如果从非选区工具切换到选区工具,初始化事件
|
||||||
if (!wasActive && this.isActive) {
|
if (!wasActive && this.isActive) {
|
||||||
this.initEvents();
|
this.initEvents();
|
||||||
@@ -80,6 +113,10 @@ export class PartManager {
|
|||||||
this.clearPartObject();
|
this.clearPartObject();
|
||||||
this.clearPointData();
|
this.clearPointData();
|
||||||
}
|
}
|
||||||
|
// 如果从选区工具切换到选区工具,重置选区
|
||||||
|
else if (wasActive && this.isActive) {
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 初始化选区相关事件 */
|
/** 初始化选区相关事件 */
|
||||||
@@ -205,12 +242,7 @@ export class PartManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** 点选工具模式下点击事件处理 */
|
/** 点选工具模式下点击事件处理 */
|
||||||
_pointDownkHandler(options) {
|
_pointDownkHandler(options) { }
|
||||||
// const button = options.button;
|
|
||||||
// const isLeft = button === 1;// 左键1(添加) 右键3(删除)
|
|
||||||
// const icon = `url("${isLeft ? addIcon : removeIcon}") 16 16, default`
|
|
||||||
// this.canvas.upperCanvasEl.style.cursor = icon;
|
|
||||||
}
|
|
||||||
/** 点选工具模式下移动事件处理 */
|
/** 点选工具模式下移动事件处理 */
|
||||||
_pointMoveHandler(options) { }
|
_pointMoveHandler(options) { }
|
||||||
/** 点选工具模式下抬起事件处理 */
|
/** 点选工具模式下抬起事件处理 */
|
||||||
@@ -219,57 +251,79 @@ export class PartManager {
|
|||||||
const isLeft = button === 1;// 左键1(添加) 右键3(删除)
|
const isLeft = button === 1;// 左键1(添加) 右键3(删除)
|
||||||
const fixedObject = this.canvasManager.getFixedLayerObject();
|
const fixedObject = this.canvasManager.getFixedLayerObject();
|
||||||
if (!fixedObject) return console.warn("未找到固定图层");
|
if (!fixedObject) return console.warn("未找到固定图层");
|
||||||
const { x, y } = options.absolutePointer;
|
const { x, y } = this.handleMousePosition(options, fixedObject);
|
||||||
const width = fixedObject.width * fixedObject.scaleX;
|
|
||||||
const height = fixedObject.height * fixedObject.scaleY;
|
|
||||||
const X = (x - (fixedObject.left - width / 2)) / fixedObject.scaleX;
|
|
||||||
const Y = (y - (fixedObject.top - height / 2)) / fixedObject.scaleY;
|
|
||||||
const label = isLeft ? 1 : 0;
|
const label = isLeft ? 1 : 0;
|
||||||
const points = [];
|
const points = [];
|
||||||
const labels = [];
|
const labels = [];
|
||||||
this.pointList.forEach((item) => {
|
const pointList = [...this.pointList];
|
||||||
|
pointList.forEach((item) => {
|
||||||
points.push([item.x, item.y]);
|
points.push([item.x, item.y]);
|
||||||
labels.push(item.label);
|
labels.push(item.label);
|
||||||
});
|
});
|
||||||
points.push([X, Y]);
|
points.push([x, y]);
|
||||||
labels.push(label);
|
labels.push(label);
|
||||||
const url = await this.getSegAnythingImage({
|
const url = await this.getSegAnythingImage({
|
||||||
image_path: this.props.clothingMinIOPath,
|
|
||||||
type: "point",
|
type: "point",
|
||||||
points,
|
points,
|
||||||
labels,
|
labels,
|
||||||
// type: "box",
|
|
||||||
// box: [0,0,0,0],
|
|
||||||
});
|
});
|
||||||
this.pointList.push({
|
pointList.push({
|
||||||
x: X,
|
x: x,
|
||||||
y: Y,
|
y: y,
|
||||||
label: label,
|
label: label,
|
||||||
})
|
})
|
||||||
const image1 = await this.loadImageToObject(url);
|
const image1 = await this.loadImageToObject(url);
|
||||||
|
const canvas = getObjectAlphaToCanvas(image1, null, 0, this.rgba);
|
||||||
|
this.partPointDrawCommand(pointList, canvas);
|
||||||
|
}
|
||||||
|
partPointDrawCommand(list, canvas) {
|
||||||
|
const cmd = new PartPointDrawCommand({
|
||||||
|
canvas: this.canvas,
|
||||||
|
partManager: this,
|
||||||
|
partCanvas: canvas,
|
||||||
|
pointList: [...list],
|
||||||
|
})
|
||||||
|
if (this.commandManager?.execute) {
|
||||||
|
this.commandManager.execute(cmd);
|
||||||
|
} else {
|
||||||
|
cmd.execute();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
async pointDrawPartCanvas(list, canvas) {
|
||||||
|
this.selectionManager.clearSelection();
|
||||||
|
const fixedObject = this.canvasManager.getFixedLayerObject();
|
||||||
|
if (!fixedObject) {
|
||||||
|
console.warn("未找到固定图层")
|
||||||
|
return false;
|
||||||
|
}
|
||||||
this.resetPartObject();
|
this.resetPartObject();
|
||||||
const group = this.partGroup;
|
this.pointList = [...list];
|
||||||
const rgba = { r: 0, g: 255, b: 0, a: 200 }
|
|
||||||
const canvas = getObjectAlphaToCanvas(image1, null, 0, rgba);
|
|
||||||
this.partCanvas = canvas;
|
this.partCanvas = canvas;
|
||||||
const image2 = new fabric.Image(canvas);
|
const image2 = new fabric.Image(canvas);
|
||||||
image2.set({
|
image2.set({
|
||||||
originX: fixedObject.originX,
|
originX: fixedObject.originX,
|
||||||
originY: fixedObject.originY,
|
originY: fixedObject.originY,
|
||||||
});
|
});
|
||||||
group.add(image2);
|
this.partGroup.add(image2);
|
||||||
for (let i = 0; i < this.pointList.length; i++) {
|
for (let i = 0; i < list.length; i++) {
|
||||||
const item = this.pointList[i];
|
const item = list[i];
|
||||||
const icon = await this.loadImageToObject(item.label === 1 ? addIcon : removeIcon);
|
const icon = await this.loadImageToObject(item.label === 1 ? addIcon : removeIcon);
|
||||||
|
let size = 20;
|
||||||
|
let scaleX = size / (icon.width * this.partGroup.scaleX);
|
||||||
|
let scaleY = size / (icon.height * this.partGroup.scaleY);
|
||||||
icon.set({
|
icon.set({
|
||||||
left: item.x - group.width / 2,
|
scaleX: scaleX,
|
||||||
top: item.y - group.height / 2,
|
scaleY: scaleY,
|
||||||
|
left: item.x - this.partGroup.width / 2,
|
||||||
|
top: item.y - this.partGroup.height / 2,
|
||||||
originX: fixedObject.originX,
|
originX: fixedObject.originX,
|
||||||
originY: fixedObject.originY,
|
originY: fixedObject.originY,
|
||||||
})
|
})
|
||||||
group.add(icon);
|
this.partGroup.add(icon);
|
||||||
}
|
}
|
||||||
|
console.log(this.partGroup);
|
||||||
this.canvas.renderAll();
|
this.canvas.renderAll();
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
/** 清空点选数据 */
|
/** 清空点选数据 */
|
||||||
clearPointData() {
|
clearPointData() {
|
||||||
@@ -280,43 +334,57 @@ export class PartManager {
|
|||||||
|
|
||||||
/** 框选工具模式下点击事件处理 */
|
/** 框选工具模式下点击事件处理 */
|
||||||
_rectangleDownHandler(options) {
|
_rectangleDownHandler(options) {
|
||||||
console.log(options.absolutePointer);
|
this.pointList = [];
|
||||||
|
const fixedObject = this.canvasManager.getFixedLayerObject();
|
||||||
|
if (!fixedObject) return console.warn("未找到固定图层");
|
||||||
|
const { x, y } = this.handleMousePosition(options, fixedObject);
|
||||||
|
this.pointList.push(x, y);
|
||||||
|
|
||||||
|
this.rectangleObject = new fabric.Rect({
|
||||||
|
left: x - fixedObject.width / 2,
|
||||||
|
top: y - fixedObject.height / 2,
|
||||||
|
width: 0,
|
||||||
|
height: 0,
|
||||||
|
...this.selectionStyle,
|
||||||
|
fill: "transparent", // 在绘制过程中不显示填充
|
||||||
|
strokeUniform: true,
|
||||||
|
});
|
||||||
|
this.partGroup.add(this.rectangleObject);
|
||||||
|
this.canvas.renderAll();
|
||||||
}
|
}
|
||||||
/** 框选工具模式下移动事件处理 */
|
/** 框选工具模式下移动事件处理 */
|
||||||
_rectangleMoveHandler(options) {
|
_rectangleMoveHandler(options) {
|
||||||
|
if (!this.rectangleObject) return console.warn("未找到框选对象");
|
||||||
|
const fixedObject = this.canvasManager.getFixedLayerObject();
|
||||||
|
if (!fixedObject) return console.warn("未找到固定图层");
|
||||||
|
const { x, y } = this.handleMousePosition(options, fixedObject);
|
||||||
|
this.rectangleObject.set({
|
||||||
|
width: x - this.rectangleObject.left - fixedObject.width / 2,
|
||||||
|
height: y - this.rectangleObject.top - fixedObject.height / 2,
|
||||||
|
});
|
||||||
|
this.canvas.renderAll();
|
||||||
}
|
}
|
||||||
/** 框选工具模式下抬起事件处理 */
|
/** 框选工具模式下抬起事件处理 */
|
||||||
_rectangleUpHandler(options) {
|
async _rectangleUpHandler(options) {
|
||||||
console.log(options.absolutePointer);
|
if (this.rectangleObject) {
|
||||||
|
this.partGroup.remove(this.rectangleObject);
|
||||||
|
this.canvas.renderAll();
|
||||||
|
}
|
||||||
|
const fixedObject = this.canvasManager.getFixedLayerObject();
|
||||||
|
if (!fixedObject) return console.warn("未找到固定图层");
|
||||||
|
const { x, y } = this.handleMousePosition(options, fixedObject);
|
||||||
|
this.pointList.push(x, y);
|
||||||
|
|
||||||
|
if (this.pointList.length !== 4) return console.warn("框选工具选择区域必须是矩形");
|
||||||
|
const url = await this.getSegAnythingImage({
|
||||||
|
type: "box",
|
||||||
|
box: [...this.pointList],
|
||||||
|
});
|
||||||
|
const image = await this.loadImageToObject(url);
|
||||||
|
const data = this.partCanvas?.getContext("2d")?.getImageData(0, 0, this.partCanvas.width, this.partCanvas.height);
|
||||||
|
const canvas = getObjectAlphaToCanvas(image, data, 0, this.rgba, !!data);
|
||||||
|
this.partDrawCommand(canvas);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/** 绘制工具模式下点击事件处理 */
|
|
||||||
_brushDownHandler(options) {
|
|
||||||
}
|
|
||||||
/** 绘制工具模式下移动事件处理 */
|
|
||||||
_brushMoveHandler(options) {
|
|
||||||
|
|
||||||
}
|
|
||||||
/** 绘制工具模式下抬起事件处理 */
|
|
||||||
_brushUpHandler(options) {
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** 擦除工具模式下抬起事件处理 */
|
|
||||||
_eraseUpHandler(options) {
|
|
||||||
}
|
|
||||||
/** 擦除工具模式下点击事件处理 */
|
|
||||||
_eraseDownHandler(options) {
|
|
||||||
}
|
|
||||||
/** 擦除工具模式下移动事件处理 */
|
|
||||||
_eraseMoveHandler(options) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** 获取分隔后图片 */
|
/** 获取分隔后图片 */
|
||||||
async getSegAnythingImage(obj) {
|
async getSegAnythingImage(obj) {
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
@@ -326,6 +394,7 @@ export class PartManager {
|
|||||||
// const user_id = store.state.UserHabit.userDetail.userId;
|
// const user_id = store.state.UserHabit.userDetail.userId;
|
||||||
const user_id = 24299;
|
const user_id = 24299;
|
||||||
const data = {
|
const data = {
|
||||||
|
image_path: this.props.clothingMinIOPath,
|
||||||
user_id,
|
user_id,
|
||||||
...obj,
|
...obj,
|
||||||
}
|
}
|
||||||
@@ -344,6 +413,128 @@ export class PartManager {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
/** 处理鼠标点位 */
|
||||||
|
handleMousePosition(options, fixedObject) {
|
||||||
|
const pos = options.absolutePointer;
|
||||||
|
const { x, y } = options.absolutePointer;
|
||||||
|
const width = fixedObject.width * fixedObject.scaleX;
|
||||||
|
const height = fixedObject.height * fixedObject.scaleY;
|
||||||
|
const X = (x - (fixedObject.left - width / 2)) / fixedObject.scaleX;
|
||||||
|
const Y = (y - (fixedObject.top - height / 2)) / fixedObject.scaleY;
|
||||||
|
return {
|
||||||
|
x: Math.round(X),
|
||||||
|
y: Math.round(Y),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** 绘制工具模式下点击事件处理 */
|
||||||
|
_brushDownHandler(options) { }
|
||||||
|
/** 绘制工具模式下移动事件处理 */
|
||||||
|
_brushMoveHandler(options) { }
|
||||||
|
/** 绘制工具模式下抬起事件处理 */
|
||||||
|
_brushUpHandler(options) { }
|
||||||
|
/** 绘制模式添加画笔 */
|
||||||
|
async addDrawPartImage(fabricImage) {
|
||||||
|
const scaleX = fabricImage.scaleX / this.partGroup.scaleX;
|
||||||
|
const scaleY = fabricImage.scaleY / this.partGroup.scaleY;
|
||||||
|
const top = (fabricImage.top - this.partGroup.top) / this.partGroup.scaleY;
|
||||||
|
const left = (fabricImage.left - this.partGroup.left) / this.partGroup.scaleX;
|
||||||
|
fabricImage.set({
|
||||||
|
scaleX,
|
||||||
|
scaleY,
|
||||||
|
top: top + this.partGroup.height / 2,
|
||||||
|
left: left + this.partGroup.width / 2,
|
||||||
|
})
|
||||||
|
const tcanvas = new fabric.StaticCanvas(document.createElement("canvas"), {
|
||||||
|
width: this.partGroup.width,
|
||||||
|
height: this.partGroup.height,
|
||||||
|
enableRetinaScaling: false,
|
||||||
|
});
|
||||||
|
if (this.partCanvas) {
|
||||||
|
let image = new fabric.Image(this.partCanvas);
|
||||||
|
tcanvas.add(image)
|
||||||
|
}
|
||||||
|
tcanvas.add(fabricImage)
|
||||||
|
tcanvas.renderAll();
|
||||||
|
const canvas = getObjectAlphaToCanvas(tcanvas, null, 0, this.rgba);
|
||||||
|
this.partDrawCommand(canvas);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** 切换到擦除工具 */
|
||||||
|
setEraserTool() {
|
||||||
|
if (!this.canvas) return console.warn("未找到画布");
|
||||||
|
const objects = this.canvas.getObjects();
|
||||||
|
objects.forEach(obj => {
|
||||||
|
if (obj.id === this.partId) {
|
||||||
|
obj.set({
|
||||||
|
erasable: true
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
/** 擦除工具模式下擦除完成事件处理 */
|
||||||
|
async onErasingEnd(affectedObjects) {
|
||||||
|
console.log("擦除完成", affectedObjects);
|
||||||
|
const tcanvas = new fabric.StaticCanvas(document.createElement("canvas"), {
|
||||||
|
width: this.partGroup.width,
|
||||||
|
height: this.partGroup.height,
|
||||||
|
enableRetinaScaling: false,
|
||||||
|
});
|
||||||
|
await new Promise((resolve, reject) => {
|
||||||
|
this.partGroup.clone((clone) => {
|
||||||
|
clone.set({
|
||||||
|
scaleX: 1,
|
||||||
|
scaleY: 1,
|
||||||
|
top: this.partGroup.height / 2,
|
||||||
|
left: this.partGroup.width / 2,
|
||||||
|
})
|
||||||
|
tcanvas.add(clone);
|
||||||
|
resolve(clone);
|
||||||
|
})
|
||||||
|
});
|
||||||
|
tcanvas.renderAll();
|
||||||
|
const canvas = getObjectAlphaToCanvas(tcanvas, null, 0, this.rgba);
|
||||||
|
this.partDrawCommand(canvas);
|
||||||
|
}
|
||||||
|
/** 擦除工具模式下点击事件处理 */
|
||||||
|
_eraseDownHandler(options) {
|
||||||
|
}
|
||||||
|
/** 擦除工具模式下移动事件处理 */
|
||||||
|
_eraseMoveHandler(options) {
|
||||||
|
}
|
||||||
|
/** 擦除工具模式下抬起事件处理 */
|
||||||
|
_eraseUpHandler(options) {
|
||||||
|
|
||||||
|
}
|
||||||
|
partDrawCommand(canvas) {
|
||||||
|
const cmd = new PartDrawCommand({
|
||||||
|
canvas: this.canvas,
|
||||||
|
partManager: this,
|
||||||
|
partCanvas: canvas,
|
||||||
|
})
|
||||||
|
if (this.commandManager?.execute) {
|
||||||
|
this.commandManager.execute(cmd);
|
||||||
|
} else {
|
||||||
|
cmd.execute();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/** 绘制部件画布 */
|
||||||
|
drawPartCanvas(canvas) {
|
||||||
|
this.selectionManager.clearSelection();
|
||||||
|
this.partCanvas = canvas;
|
||||||
|
const image = new fabric.Image(canvas);
|
||||||
|
image.set({
|
||||||
|
originX: this.partGroup.originX,
|
||||||
|
originY: this.partGroup.originY,
|
||||||
|
erasable: true,
|
||||||
|
});
|
||||||
|
this.resetPartObject();
|
||||||
|
this.partGroup.add(image);
|
||||||
|
this.canvas.renderAll();
|
||||||
|
}
|
||||||
|
|
||||||
/** 删除指定ID的对象 */
|
/** 删除指定ID的对象 */
|
||||||
removeObjectsById(id) {
|
removeObjectsById(id) {
|
||||||
@@ -381,6 +572,7 @@ export class PartManager {
|
|||||||
originY: fixedObject.originY,
|
originY: fixedObject.originY,
|
||||||
selectable: false,
|
selectable: false,
|
||||||
evented: false,
|
evented: false,
|
||||||
|
erasable: true,
|
||||||
})
|
})
|
||||||
this.canvas.add(group);
|
this.canvas.add(group);
|
||||||
this.partGroup = group;
|
this.partGroup = group;
|
||||||
@@ -392,10 +584,33 @@ export class PartManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** 创建当前选区 */
|
/** 创建当前选区 */
|
||||||
createPart() {
|
async createPart() {
|
||||||
if (!this.partCanvas) return console.warn("没有点位画布");
|
if (!this.partCanvas) return console.warn("没有点位画布");
|
||||||
const fixedObject = this.canvasManager.getFixedLayerObject();
|
const fixedObject = this.canvasManager.getFixedLayerObject();
|
||||||
if (!fixedObject) return console.warn("未找到固定图层");
|
if (!fixedObject) return console.warn("未找到固定图层");
|
||||||
|
// const tcanvas = new fabric.StaticCanvas(document.createElement("canvas"), {
|
||||||
|
// width: fixedObject.width,
|
||||||
|
// height: fixedObject.height,
|
||||||
|
// enableRetinaScaling: false,
|
||||||
|
// });
|
||||||
|
// await new Promise((resolve, reject) => {
|
||||||
|
// fixedObject.clone((clone) => {
|
||||||
|
// const clipPath = new fabric.Image(this.partCanvas);
|
||||||
|
// clipPath.set({
|
||||||
|
// originX: fixedObject.originX,
|
||||||
|
// originY: fixedObject.originY,
|
||||||
|
// })
|
||||||
|
// clone.set({
|
||||||
|
// scaleX: 1,
|
||||||
|
// scaleY: 1,
|
||||||
|
// clipPath: clipPath,
|
||||||
|
// })
|
||||||
|
// tcanvas.add(clone);
|
||||||
|
// resolve(clone);
|
||||||
|
// })
|
||||||
|
// });
|
||||||
|
// tcanvas.renderAll();
|
||||||
|
|
||||||
const scaleY = fixedObject.scaleY
|
const scaleY = fixedObject.scaleY
|
||||||
const scaleX = fixedObject.scaleX
|
const scaleX = fixedObject.scaleX
|
||||||
const top = fixedObject.top - fixedObject.height * scaleY / 2;
|
const top = fixedObject.top - fixedObject.height * scaleY / 2;
|
||||||
@@ -414,23 +629,26 @@ export class PartManager {
|
|||||||
top: top + minY * scaleY,
|
top: top + minY * scaleY,
|
||||||
scaleX: scaleX,
|
scaleX: scaleX,
|
||||||
scaleY: scaleY,
|
scaleY: scaleY,
|
||||||
fill: "rgba(127, 255, 127, 0.3)",
|
...this.selectionStyle,
|
||||||
stroke: "#2AA81B",
|
|
||||||
strokeWidth: 2,
|
|
||||||
strokeDashArray: [8, 4],
|
|
||||||
strokeLineCap: "round",// 折线端点样式
|
|
||||||
strokeLineJoin: "bevel", // 折线连接样式
|
|
||||||
strokeUniform: true, // 保持描边宽度不随缩放改变
|
|
||||||
});
|
});
|
||||||
// this.partGroup.add(path);
|
|
||||||
this.canvas.add(path);
|
|
||||||
this.canvas.renderAll();
|
|
||||||
this.clearPart();
|
this.clearPart();
|
||||||
|
this.selectionManager.setSelectionObject(path);
|
||||||
|
const cmd = new LassoCutoutCommand({
|
||||||
|
canvas: this.canvas,
|
||||||
|
layerManager: this.layerManager,
|
||||||
|
selectionManager: this.selectionManager,
|
||||||
|
toolManager: this.toolManager,
|
||||||
|
})
|
||||||
|
this.commandManager.execute(cmd)
|
||||||
}
|
}
|
||||||
/** 清空点位 */
|
/** 清空点位 */
|
||||||
clearPart() {
|
clearPart() {
|
||||||
this.pointList = [];
|
if (this.activeTool.value === OperationType.PART) {
|
||||||
this.resetPartObject(true);
|
this.partPointDrawCommand([], null);
|
||||||
|
} else {
|
||||||
|
this.pointList = [];
|
||||||
|
this.partDrawCommand(null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -197,7 +197,7 @@ export class ToolManager {
|
|||||||
[OperationType.PART_RECTANGLE]: {
|
[OperationType.PART_RECTANGLE]: {
|
||||||
name: "部件选取工具-矩形",
|
name: "部件选取工具-矩形",
|
||||||
icon: "part",
|
icon: "part",
|
||||||
cursor: "default",
|
cursor: "crosshair",
|
||||||
setup: this.setupPartRectangleTool.bind(this),
|
setup: this.setupPartRectangleTool.bind(this),
|
||||||
},
|
},
|
||||||
[OperationType.PART_BRUSH]: {
|
[OperationType.PART_BRUSH]: {
|
||||||
@@ -422,7 +422,7 @@ export class ToolManager {
|
|||||||
if (tool && typeof tool.setup === "function") {
|
if (tool && typeof tool.setup === "function") {
|
||||||
// console.log(`画布切换工具:${tool.name}(${toolId})`)
|
// console.log(`画布切换工具:${tool.name}(${toolId})`)
|
||||||
this.canvas.toolId = toolId;
|
this.canvas.toolId = toolId;
|
||||||
tool.setup();
|
tool.setup(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 通知选区管理器工具已改变
|
// 通知选区管理器工具已改变
|
||||||
@@ -482,7 +482,7 @@ export class ToolManager {
|
|||||||
|
|
||||||
// 如有必要,可以调用当前工具的setup方法来全面恢复状态
|
// 如有必要,可以调用当前工具的setup方法来全面恢复状态
|
||||||
if (tool && typeof tool.setup === "function") {
|
if (tool && typeof tool.setup === "function") {
|
||||||
tool.setup();
|
tool.setup(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -707,45 +707,69 @@ export class ToolManager {
|
|||||||
/**
|
/**
|
||||||
* 设置部件选取工具
|
* 设置部件选取工具
|
||||||
*/
|
*/
|
||||||
setupPartTool() {
|
setupPartTool(isExecute = false) {
|
||||||
if (!this.canvas) return;
|
if (!this.canvas) return;
|
||||||
this.canvas.isDrawingMode = false;
|
this.canvas.isDrawingMode = false;
|
||||||
this.canvas.selection = false;
|
this.canvas.selection = false;
|
||||||
|
if (!isExecute && this.canvasManager && this.canvasManager.partManager) {
|
||||||
if (this.canvasManager && this.canvasManager.partManager) {
|
|
||||||
this.canvasManager.partManager.setCurrentTool(OperationType.PART);
|
this.canvasManager.partManager.setCurrentTool(OperationType.PART);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* 设置部件选取工具--矩形
|
* 设置部件选取工具--矩形
|
||||||
*/
|
*/
|
||||||
setupPartRectangleTool() {
|
setupPartRectangleTool(isExecute = false) {
|
||||||
if (!this.canvas) return;
|
if (!this.canvas) return;
|
||||||
this.canvas.isDrawingMode = false;
|
this.canvas.isDrawingMode = false;
|
||||||
this.canvas.selection = true;
|
this.canvas.selection = false;
|
||||||
if (this.canvasManager && this.canvasManager.partManager) {
|
if (!isExecute && this.canvasManager && this.canvasManager.partManager) {
|
||||||
this.canvasManager.partManager.setCurrentTool(OperationType.PART_RECTANGLE);
|
this.canvasManager.partManager.setCurrentTool(OperationType.PART_RECTANGLE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* 设置部件选取工具--画笔
|
* 设置部件选取工具--画笔
|
||||||
*/
|
*/
|
||||||
setupPartBrushTool() {
|
setupPartBrushTool(isExecute = false) {
|
||||||
if (!this.canvas) return;
|
if (!this.canvas) return;
|
||||||
this.canvas.isDrawingMode = true;
|
this.canvas.isDrawingMode = true;
|
||||||
this.canvas.selection = false;
|
this.canvas.selection = false;
|
||||||
if (this.canvasManager && this.canvasManager.partManager) {
|
if (!isExecute && this.canvasManager && this.canvasManager.partManager) {
|
||||||
this.canvasManager.partManager.setCurrentTool(OperationType.PART_BRUSH);
|
this.canvasManager.partManager.setCurrentTool(OperationType.PART_BRUSH);
|
||||||
}
|
}
|
||||||
|
const greenColor = "#0f0";
|
||||||
|
// 确保有笔刷管理器
|
||||||
|
if (this.brushManager) {
|
||||||
|
// 设置绿色笔刷
|
||||||
|
this.brushManager.setBrushColor(greenColor); // 纯绿色
|
||||||
|
this.brushManager.setBrushOpacity(200/255); // 完全不透明
|
||||||
|
this.brushManager.setBrushType("pencil"); // 铅笔类型
|
||||||
|
|
||||||
|
// 更新笔刷大小(使用当前大小)
|
||||||
|
if (BrushStore && BrushStore.state.size) {
|
||||||
|
this.brushManager.setBrushSize(BrushStore.state.size);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新应用到画布
|
||||||
|
this.brushManager.updateBrush();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 启用笔刷指示器并设置绿色
|
||||||
|
this._enableBrushIndicator(greenColor);
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* 设置部件选取工具--橡皮擦
|
* 设置部件选取工具--橡皮擦
|
||||||
*/
|
*/
|
||||||
setupPartEraserTool() {
|
setupPartEraserTool(isExecute = false) {
|
||||||
if (!this.canvas) return;
|
if (!this.canvas) return;
|
||||||
this.canvas.isDrawingMode = false;
|
this.canvas.isDrawingMode = true;
|
||||||
this.canvas.selection = false;
|
this.canvas.selection = false;
|
||||||
if (this.canvasManager && this.canvasManager.partManager) {
|
if (this.brushManager) {
|
||||||
|
this.brushManager.createEraser();
|
||||||
|
}
|
||||||
|
// 启用笔刷指示器
|
||||||
|
this._enableBrushIndicator();
|
||||||
|
|
||||||
|
if (!isExecute && this.canvasManager && this.canvasManager.partManager) {
|
||||||
this.canvasManager.partManager.setCurrentTool(OperationType.PART_ERASER);
|
this.canvasManager.partManager.setCurrentTool(OperationType.PART_ERASER);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1603,7 +1627,9 @@ export class ToolManager {
|
|||||||
OperationType.ERASER,
|
OperationType.ERASER,
|
||||||
OperationType.RED_BRUSH,
|
OperationType.RED_BRUSH,
|
||||||
OperationType.GREEN_BRUSH,
|
OperationType.GREEN_BRUSH,
|
||||||
OperationType.LIQUIFY,
|
OperationType.LIQUIFY,
|
||||||
|
OperationType.PART_BRUSH,
|
||||||
|
OperationType.PART_ERASER,
|
||||||
];
|
];
|
||||||
|
|
||||||
return brushTools.includes(currentTool);
|
return brushTools.includes(currentTool);
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import { OperationType, OperationTypes } from "../../utils/layerHelper";
|
|||||||
export class CanvasEventManager {
|
export class CanvasEventManager {
|
||||||
constructor(canvas, options = {}) {
|
constructor(canvas, options = {}) {
|
||||||
this.canvas = canvas;
|
this.canvas = canvas;
|
||||||
|
this.canvasManager = options.canvasManager;
|
||||||
this.toolManager = options.toolManager || null;
|
this.toolManager = options.toolManager || null;
|
||||||
this.animationManager = options.animationManager;
|
this.animationManager = options.animationManager;
|
||||||
this.thumbnailManager = options.thumbnailManager;
|
this.thumbnailManager = options.thumbnailManager;
|
||||||
@@ -691,7 +692,9 @@ export class CanvasEventManager {
|
|||||||
// 清除临时状态记录
|
// 清除临时状态记录
|
||||||
delete activeObj._initialTransformState;
|
delete activeObj._initialTransformState;
|
||||||
}
|
}
|
||||||
}
|
}else{
|
||||||
|
this.canvasManager.changeCanvas();
|
||||||
|
}
|
||||||
|
|
||||||
if (this.thumbnailManager && e.target) {
|
if (this.thumbnailManager && e.target) {
|
||||||
if (e.target.id) {
|
if (e.target.id) {
|
||||||
@@ -975,6 +978,13 @@ export class CanvasEventManager {
|
|||||||
// 添加调试日志(可选)
|
// 添加调试日志(可选)
|
||||||
// console.log(`捕获对象 ${obj.id} (${obj.type}) 的初始变换状态`);
|
// console.log(`捕获对象 ${obj.id} (${obj.type}) 的初始变换状态`);
|
||||||
}
|
}
|
||||||
|
const arrs = [];
|
||||||
|
if (e.target._objects) {
|
||||||
|
e.target._objects.forEach((v) => arrs.push(v));
|
||||||
|
} else {
|
||||||
|
arrs.push(e.target);
|
||||||
|
}
|
||||||
|
this.canvasManager.beforeChangeCanvas(arrs);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -30,27 +30,30 @@ export class LayerSort {
|
|||||||
if (canvasObjects.length === 0) return;
|
if (canvasObjects.length === 0) return;
|
||||||
|
|
||||||
// 使用画布渲染优化
|
// 使用画布渲染优化
|
||||||
await optimizeCanvasRendering(this.canvas, () => {
|
await new Promise((resolve) => {
|
||||||
// 计算每个对象应该在的 z-index 位置
|
optimizeCanvasRendering(this.canvas, () => {
|
||||||
const objectZIndexMap = this.calculateObjectZIndexes();
|
// 计算每个对象应该在的 z-index 位置
|
||||||
|
const objectZIndexMap = this.calculateObjectZIndexes();
|
||||||
|
|
||||||
// 按照新的 z-index 排序对象
|
// 按照新的 z-index 排序对象
|
||||||
const sortedObjects = canvasObjects
|
const sortedObjects = canvasObjects
|
||||||
.map((obj) => ({
|
.map((obj) => ({
|
||||||
object: obj,
|
object: obj,
|
||||||
targetZIndex: objectZIndexMap.get(obj.id) ?? -1,
|
targetZIndex: objectZIndexMap.get(obj.id) ?? -1,
|
||||||
}))
|
}))
|
||||||
.filter((item) => item.targetZIndex >= 0) // 过滤掉无效对象
|
.filter((item) => item.targetZIndex >= 0) // 过滤掉无效对象
|
||||||
.sort((a, b) => a.targetZIndex - b.targetZIndex);
|
.sort((a, b) => a.targetZIndex - b.targetZIndex);
|
||||||
|
|
||||||
// 使用 fabric.js 的 moveTo 方法重新排序
|
// 使用 fabric.js 的 moveTo 方法重新排序
|
||||||
sortedObjects.forEach((item, index) => {
|
sortedObjects.forEach((item, index) => {
|
||||||
const currentIndex = this.canvas.getObjects().indexOf(item.object);
|
const currentIndex = this.canvas.getObjects().indexOf(item.object);
|
||||||
if (currentIndex !== index && currentIndex !== -1) {
|
if (currentIndex !== index && currentIndex !== -1) {
|
||||||
// 将对象移动到正确的位置
|
// 将对象移动到正确的位置
|
||||||
this.canvas.moveTo(item.object, index);
|
this.canvas.moveTo(item.object, index);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
resolve();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -71,17 +74,17 @@ export class LayerSort {
|
|||||||
// if (!layer.visible) {
|
// if (!layer.visible) {
|
||||||
// continue;
|
// continue;
|
||||||
// }
|
// }
|
||||||
|
let id = layer.fabricObject?.id || layer.fabricObjects?.[0]?.id || null;
|
||||||
// 处理不同类型的图层
|
// 处理不同类型的图层
|
||||||
if (layer.isBackground && layer.fabricObject) {
|
if (layer.isBackground && id) {
|
||||||
// 背景图层对象放在最底层
|
// 背景图层对象放在最底层
|
||||||
zIndexMap.set(layer.fabricObject.id, currentZIndex++);
|
zIndexMap.set(id, currentZIndex++);
|
||||||
} else if (layer.isFixed && layer.fabricObject) {
|
} else if (layer.isFixed && id) {
|
||||||
// 固定图层对象
|
// 固定图层对象
|
||||||
zIndexMap.set(layer.fabricObject.id, currentZIndex++);
|
zIndexMap.set(id, currentZIndex++);
|
||||||
} else if (layer.isFixedOther && layer.fabricObject) {
|
} else if (layer.isFixedOther && id) {
|
||||||
// 其他固定图层对象
|
// 其他固定图层对象
|
||||||
zIndexMap.set(layer.fabricObject.id, currentZIndex++);
|
zIndexMap.set(id, currentZIndex++);
|
||||||
} else if (!layer.isBackground && !layer.isFixed) {
|
} else if (!layer.isBackground && !layer.isFixed) {
|
||||||
// 普通图层
|
// 普通图层
|
||||||
currentZIndex = this.processLayerObjects(
|
currentZIndex = this.processLayerObjects(
|
||||||
@@ -91,7 +94,6 @@ export class LayerSort {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return zIndexMap;
|
return zIndexMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1045,6 +1045,7 @@ export async function imageToCanvas(image, scale = 1, sr = false) {
|
|||||||
/**
|
/**
|
||||||
* 图片边界跟踪算法(透明底)
|
* 图片边界跟踪算法(透明底)
|
||||||
* @param {HTMLCanvasElement} canvas - canvas元素
|
* @param {HTMLCanvasElement} canvas - canvas元素
|
||||||
|
* @param {Number} scale - 缩放比例
|
||||||
* @returns {Array} 边界点数组 [{x, y}, ...]
|
* @returns {Array} 边界点数组 [{x, y}, ...]
|
||||||
*/
|
*/
|
||||||
export function traceImageContour(canvas) {
|
export function traceImageContour(canvas) {
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ export const LayerType = {
|
|||||||
export const SpecialLayerId = {
|
export const SpecialLayerId = {
|
||||||
SPECIAL_GROUP: "group_special", // 特殊组
|
SPECIAL_GROUP: "group_special", // 特殊组
|
||||||
COLOR: "special_color", // 颜色图层
|
COLOR: "special_color", // 颜色图层
|
||||||
|
PART_SELECTOR: "part_selector", // 部件选择器图层
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -65,10 +65,15 @@ export async function restoreFabricObject(serializedObject, canvas) {
|
|||||||
* @param {ImageData} revData - 相反的ImageData,白通道的相同位置是否为透明,revData为白色为透明,黑色为不透明
|
* @param {ImageData} revData - 相反的ImageData,白通道的相同位置是否为透明,revData为白色为透明,黑色为不透明
|
||||||
* @param {number} diff - 差值,默认 25
|
* @param {number} diff - 差值,默认 25
|
||||||
* @param {Object} rgba - 自定义 rgba 值,默认 { r: 255, g: 255, b: 255, a: 255 }
|
* @param {Object} rgba - 自定义 rgba 值,默认 { r: 255, g: 255, b: 255, a: 255 }
|
||||||
|
* @param {boolean} isMerge - 是否合并,true=合并revData,false=反转revData
|
||||||
* @returns {HTMLCanvasElement|null} 包含黑白通道的画布,或 null 如果失败
|
* @returns {HTMLCanvasElement|null} 包含黑白通道的画布,或 null 如果失败
|
||||||
*/
|
*/
|
||||||
export function getObjectAlphaToCanvas(object, revData, diff = 30, rgba = { r: 255, g: 255, b: 255, a: 255 }) {
|
export function getObjectAlphaToCanvas(object, revData, diff = 30, rgba = { r: 255, g: 255, b: 255, a: 255 }, isMerge = false) {
|
||||||
const image = object.getElement();
|
const image = object.getElement();
|
||||||
|
if (image.nodeName !== "IMG" && image.nodeName !== "CANVAS") {
|
||||||
|
console.warn("对象不是图片");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
const { width, height } = image;
|
const { width, height } = image;
|
||||||
if (!width || !height) {
|
if (!width || !height) {
|
||||||
console.warn("对象没有元素");
|
console.warn("对象没有元素");
|
||||||
@@ -89,18 +94,20 @@ export function getObjectAlphaToCanvas(object, revData, diff = 30, rgba = { r: 2
|
|||||||
const revG = revData?.data[i + 1] || 0;
|
const revG = revData?.data[i + 1] || 0;
|
||||||
const revB = revData?.data[i + 2] || 0;
|
const revB = revData?.data[i + 2] || 0;
|
||||||
const revA = revData?.data[i + 3] || 0;
|
const revA = revData?.data[i + 3] || 0;
|
||||||
|
let isHave = false;
|
||||||
if (r || g || b || a) {
|
if (r || g || b || a) {
|
||||||
if (revR > diff || revG > diff || revB > diff || revA > diff) {
|
if (revR > diff || revG > diff || revB > diff || revA > diff) {
|
||||||
data.data[i + 0] = 0;
|
isHave = false;
|
||||||
data.data[i + 1] = 0;
|
|
||||||
data.data[i + 2] = 0;
|
|
||||||
data.data[i + 3] = 0;
|
|
||||||
} else {
|
} else {
|
||||||
data.data[i + 0] = rgba.r;
|
isHave = true;
|
||||||
data.data[i + 1] = rgba.g;
|
|
||||||
data.data[i + 2] = rgba.b;
|
|
||||||
data.data[i + 3] = rgba.a;
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
if (isMerge && (revR || revG || revB || revA)) isHave = true;
|
||||||
|
if (isHave) {
|
||||||
|
data.data[i + 0] = rgba.r;
|
||||||
|
data.data[i + 1] = rgba.g;
|
||||||
|
data.data[i + 2] = rgba.b;
|
||||||
|
data.data[i + 3] = rgba.a;
|
||||||
} else {
|
} else {
|
||||||
data.data[i + 0] = 0;
|
data.data[i + 0] = 0;
|
||||||
data.data[i + 1] = 0;
|
data.data[i + 1] = 0;
|
||||||
|
|||||||
@@ -184,16 +184,17 @@ const createClippedDataURLByCanvas = async ({
|
|||||||
// console.log("🖼️ 使用图像遮罩裁剪方法生成DataURL");
|
// console.log("🖼️ 使用图像遮罩裁剪方法生成DataURL");
|
||||||
|
|
||||||
// 使用优化后的边界计算,确保包含描边区域
|
// 使用优化后的边界计算,确保包含描边区域
|
||||||
// const optimizedBounds = calculateOptimizedBounds(
|
const optimizedBounds = calculateOptimizedBounds(
|
||||||
// clippingObject,
|
clippingObject,
|
||||||
// fabricObjects
|
fabricObjects
|
||||||
// );
|
);
|
||||||
const optimizedBounds = {
|
console.log("📐 优化后的选区边界框:", optimizedBounds);
|
||||||
left: clippingObject.left - clippingObject.width / 2,
|
// const optimizedBounds = {
|
||||||
top: clippingObject.top - clippingObject.height / 2,
|
// left: clippingObject.left - clippingObject.width / 2,
|
||||||
width: clippingObject.width,
|
// top: clippingObject.top - clippingObject.height / 2,
|
||||||
height: clippingObject.height,
|
// width: clippingObject.width,
|
||||||
}
|
// height: clippingObject.height,
|
||||||
|
// }
|
||||||
|
|
||||||
// 使用高分辨率以保证质量
|
// 使用高分辨率以保证质量
|
||||||
const pixelRatio = window.devicePixelRatio || 1;
|
const pixelRatio = window.devicePixelRatio || 1;
|
||||||
|
|||||||
@@ -375,6 +375,7 @@ const confirm = ()=>{
|
|||||||
/* 图片网格 */
|
/* 图片网格 */
|
||||||
.image-grid {
|
.image-grid {
|
||||||
display: grid;
|
display: grid;
|
||||||
|
align-content: start;
|
||||||
grid-template-columns: repeat(auto-fill, minmax(20rem, 1fr));
|
grid-template-columns: repeat(auto-fill, minmax(20rem, 1fr));
|
||||||
gap: 16px;
|
gap: 16px;
|
||||||
min-height: 20rem;
|
min-height: 20rem;
|
||||||
|
|||||||
@@ -25,6 +25,7 @@
|
|||||||
O_FLIPX: "object.flipX",
|
O_FLIPX: "object.flipX",
|
||||||
O_FLIPY: "object.flipY",
|
O_FLIPY: "object.flipY",
|
||||||
O_BLENDMODE: "object.blendMode",
|
O_BLENDMODE: "object.blendMode",
|
||||||
|
O_FILL_REPEAT: "object.fill_repeat",
|
||||||
};
|
};
|
||||||
const ACTIONS = {
|
const ACTIONS = {
|
||||||
ADD: "add",
|
ADD: "add",
|
||||||
@@ -223,7 +224,7 @@
|
|||||||
ctx.drawImage(image, 0, 0);
|
ctx.drawImage(image, 0, 0);
|
||||||
let pattern = new fabric.Pattern({
|
let pattern = new fabric.Pattern({
|
||||||
source: tcanvas,
|
source: tcanvas,
|
||||||
repeat: "repeat",
|
repeat: item.object?.fill_repeat || "repeat",
|
||||||
patternTransform,
|
patternTransform,
|
||||||
offsetX, // 水平偏移
|
offsetX, // 水平偏移
|
||||||
offsetY, // 垂直偏移
|
offsetY, // 垂直偏移
|
||||||
@@ -281,6 +282,7 @@
|
|||||||
case KEYS.FILL_SCALEY:
|
case KEYS.FILL_SCALEY:
|
||||||
case KEYS.FILL_GAPX:
|
case KEYS.FILL_GAPX:
|
||||||
case KEYS.FILL_GAPY:
|
case KEYS.FILL_GAPY:
|
||||||
|
case KEYS.O_FILL_REPEAT:
|
||||||
let pattern = await setFill(
|
let pattern = await setFill(
|
||||||
list.value.find((v) => v.token === item.token)
|
list.value.find((v) => v.token === item.token)
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -333,6 +333,7 @@
|
|||||||
]);
|
]);
|
||||||
const canvasLoadJsonSuccess = () => {
|
const canvasLoadJsonSuccess = () => {
|
||||||
console.log("画布加载JSON成功");
|
console.log("画布加载JSON成功");
|
||||||
|
return;
|
||||||
canvasEditor.value?.updateOtherLayers({
|
canvasEditor.value?.updateOtherLayers({
|
||||||
color: { rgba: { r: 255, g: 0, b: 0, a: 1 } },
|
color: { rgba: { r: 255, g: 0, b: 0, a: 1 } },
|
||||||
printObject: {
|
printObject: {
|
||||||
@@ -342,32 +343,34 @@
|
|||||||
level2Type: "Pattern",
|
level2Type: "Pattern",
|
||||||
designType: "Library",
|
designType: "Library",
|
||||||
path: "/src/assets/images/canvas/yinhua1.jpg",
|
path: "/src/assets/images/canvas/yinhua1.jpg",
|
||||||
location: [250, 780],
|
location: [800, 600],
|
||||||
scale: [1.2, 1.6],
|
scale: [1, 1],
|
||||||
angle: 0,
|
angle: 0,
|
||||||
|
priority: 1,
|
||||||
object: {
|
object: {
|
||||||
top: 600,
|
top: 300,
|
||||||
left: 800,
|
left: 400,
|
||||||
scaleX: 0.5,
|
scaleX: 0.5,
|
||||||
scaleY: 0.5,
|
scaleY: 0.5,
|
||||||
opacity: 1,
|
opacity: 1,
|
||||||
angle: 45,
|
angle: 0,
|
||||||
flipX: false,
|
flipX: false,
|
||||||
flipY: false,
|
flipY: false,
|
||||||
blendMode: "multiply",
|
// blendMode: "multiply",
|
||||||
gapX: 0,
|
gapX: 0,
|
||||||
gapY: 0,
|
gapY: 0,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
// {
|
{
|
||||||
// ifSingle: true,
|
ifSingle: true,
|
||||||
// level2Type: "Pattern",
|
level2Type: "Pattern",
|
||||||
// designType: "Library",
|
designType: "Library",
|
||||||
// path: "/src/assets/images/canvas/yinhua1.jpg",
|
path: "/src/assets/images/canvas/yinhua1.jpg",
|
||||||
// location: [550, 650],
|
location: [550, 650],
|
||||||
// scale: [0.15, 0.2],
|
scale: [0.15, 0.2],
|
||||||
// angle: 0,
|
angle: 0,
|
||||||
// },
|
priority: 2,
|
||||||
|
},
|
||||||
// {
|
// {
|
||||||
// ifSingle: true,
|
// ifSingle: true,
|
||||||
// level2Type: "Pattern",
|
// level2Type: "Pattern",
|
||||||
@@ -376,6 +379,7 @@
|
|||||||
// location: [700, 400],
|
// location: [700, 400],
|
||||||
// scale: [0.1, 0.133],
|
// scale: [0.1, 0.133],
|
||||||
// angle: 0,
|
// angle: 0,
|
||||||
|
// priority: 3,
|
||||||
// },
|
// },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
@@ -411,13 +415,13 @@
|
|||||||
:clothingMinIOPath="clothingMinIOPath"
|
:clothingMinIOPath="clothingMinIOPath"
|
||||||
:clothingImageUrl="clothingImageUrl"
|
:clothingImageUrl="clothingImageUrl"
|
||||||
:clothingImageUrl2="clothingImageUrlInit"
|
:clothingImageUrl2="clothingImageUrlInit"
|
||||||
|
@canvasLoadJsonSuccess="canvasLoadJsonSuccess"
|
||||||
:config="editorConfig"
|
:config="editorConfig"
|
||||||
:clothing-image-opts="{
|
:clothing-image-opts="{
|
||||||
imageMode: 'contains', // 设置底图包含在画布内
|
imageMode: 'contains', // 设置底图包含在画布内
|
||||||
}"
|
}"
|
||||||
@change-canvas="changeCanvas"
|
@change-canvas="changeCanvas"
|
||||||
@canvas-init="canvasInit"
|
@canvas-init="canvasInit"
|
||||||
isFixedErasable
|
|
||||||
showFixedLayer
|
showFixedLayer
|
||||||
>
|
>
|
||||||
<template #existsImageList>
|
<template #existsImageList>
|
||||||
@@ -445,7 +449,16 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
<style>
|
||||||
|
body > .lower-canvas {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 800px !important;
|
||||||
|
height: 600px !important;
|
||||||
|
z-index: 99999999;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
<style scoped lang="less">
|
<style scoped lang="less">
|
||||||
* {
|
* {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
:enabledRedGreenMode="false"
|
:enabledRedGreenMode="false"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class="btn">123
|
<div class="btn">
|
||||||
<div class="gallery_btn" @click="exportElement">Export</div>
|
<div class="gallery_btn" @click="exportElement">Export</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -53,7 +53,7 @@
|
|||||||
};
|
};
|
||||||
});
|
});
|
||||||
// 边界追踪
|
// 边界追踪
|
||||||
function traceImageContour(canvas) {
|
function traceImageContour(canvas, scale = 1) {
|
||||||
const ctx = canvas.getContext("2d");
|
const ctx = canvas.getContext("2d");
|
||||||
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
|
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
|
||||||
const data = imageData.data;
|
const data = imageData.data;
|
||||||
|
|||||||
@@ -131,6 +131,7 @@ import { useStore } from "vuex";
|
|||||||
import { openGuide,driverObj__ } from "@/tool/guide";
|
import { openGuide,driverObj__ } from "@/tool/guide";
|
||||||
import { KeyValueDB } from "@/tool/indexedDB";
|
import { KeyValueDB } from "@/tool/indexedDB";
|
||||||
import { useI18n } from 'vue-i18n'
|
import { useI18n } from 'vue-i18n'
|
||||||
|
import { convertToEC4StyleForCustomSerise } from 'echarts/types/src/util/styleCompat.js'
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components:{
|
components:{
|
||||||
detailLeft,model,detailRight,canvasBox
|
detailLeft,model,detailRight,canvasBox
|
||||||
@@ -275,7 +276,6 @@ export default defineComponent({
|
|||||||
const setRevocation = async ()=>{//设置撤销
|
const setRevocation = async ()=>{//设置撤销
|
||||||
let itemDetail = JSON.parse(JSON.stringify(detailData.designDetail))
|
let itemDetail = JSON.parse(JSON.stringify(detailData.designDetail))
|
||||||
let revocation:any = JSON.parse((await KeyValueDB.get("revocation") as any) || 'null')
|
let revocation:any = JSON.parse((await KeyValueDB.get("revocation") as any) || 'null')
|
||||||
console.log(itemDetail,revocation,'=========')
|
|
||||||
if(!revocation)revocation = []
|
if(!revocation)revocation = []
|
||||||
// let oppositeRevocation = JSON.parse((await KeyValueDB.get("oppositeRevocation") as any))
|
// let oppositeRevocation = JSON.parse((await KeyValueDB.get("oppositeRevocation") as any))
|
||||||
// if(revocation?.[0]?.designItemId != itemDetail.designItemId || revocation?.[0]?.designItemId == undefined){
|
// if(revocation?.[0]?.designItemId != itemDetail.designItemId || revocation?.[0]?.designItemId == undefined){
|
||||||
@@ -291,7 +291,6 @@ export default defineComponent({
|
|||||||
const revocation = async ()=>{//撤回
|
const revocation = async ()=>{//撤回
|
||||||
let oppositeRevocation = JSON.parse((await KeyValueDB.get("oppositeRevocation") as any) || 'null')
|
let oppositeRevocation = JSON.parse((await KeyValueDB.get("oppositeRevocation") as any) || 'null')
|
||||||
let revocation = JSON.parse((await KeyValueDB.get("revocation") as any) || 'null')
|
let revocation = JSON.parse((await KeyValueDB.get("revocation") as any) || 'null')
|
||||||
console.log(oppositeRevocation,revocation,'=========')
|
|
||||||
if(revocation.length <= 1)return
|
if(revocation.length <= 1)return
|
||||||
oppositeRevocation.push(revocation[revocation.length-1])
|
oppositeRevocation.push(revocation[revocation.length-1])
|
||||||
revocation.splice(revocation.length-1,1)
|
revocation.splice(revocation.length-1,1)
|
||||||
@@ -332,22 +331,25 @@ export default defineComponent({
|
|||||||
store.commit('DesignDetail/setCurrentDetailType',str)
|
store.commit('DesignDetail/setCurrentDetailType',str)
|
||||||
}
|
}
|
||||||
const setClothes = async (list:any,str:string)=>{
|
const setClothes = async (list:any,str:string)=>{
|
||||||
|
console.log(JSON.parse(JSON.stringify(list)))
|
||||||
let clothesList:any = []
|
let clothesList:any = []
|
||||||
await uploadElement()
|
|
||||||
if(detailData.isEditPattern.value == 'editSketch')await detailDom.canvasBox.submitBase64Data().then((rv)=>{
|
if(detailData.isEditPattern.value == 'editSketch')await detailDom.canvasBox.submitBase64Data().then((rv)=>{
|
||||||
detailData.selectDetail.sketchString = rv
|
detailData.selectDetail.sketchString = rv
|
||||||
})
|
})
|
||||||
if(detailDom.detailRight?.privewDetail)await (detailDom.detailRight as any).privewDetail()
|
if(detailDom.detailRight?.privewDetail)await (detailDom.detailRight as any).privewDetail()
|
||||||
if(detailDom.canvasBox && (detailData.currentDetailType != 'sketch' || detailData.isEditPattern.value == 'canvasEditor')){
|
if(detailDom.canvasBox && (detailData.currentDetailType != 'sketch' || detailData.isEditPattern.value == 'canvasEditor')){
|
||||||
let otherData = await updateOtherLayers('single')
|
// if(detailData.isEditPattern.value !== 'editSketch'){
|
||||||
await detailDom.canvasBox.updateOtherLayers(otherData)
|
// let otherDataupDateFrontBackSketch = await updateOtherLayers(detailData.isEditPattern.value == 'canvasEditor'?'all':'single')
|
||||||
|
// await detailDom.canvasBox.updateOtherLayers(otherData)
|
||||||
|
// }
|
||||||
await detailDom.canvasBox.privewDetail()
|
await detailDom.canvasBox.privewDetail()
|
||||||
|
await uploadSelectDetail()
|
||||||
|
// await uploadElement()
|
||||||
}
|
}
|
||||||
for(let i = 0;i<list.length;i++){
|
for(let i = 0;i<list.length;i++){
|
||||||
detailData.selectDetail
|
detailData.selectDetail
|
||||||
let {scale,offset,priority,transpose,rotate,maskUrl,maskMinioUrl} = await (detailDom.model as any).getSubmitData(list[i])
|
let {scale,offset,priority,transpose,rotate,maskUrl,maskMinioUrl} = await (detailDom.model as any).getSubmitData(list[i])
|
||||||
let gradient = null
|
let newData = list[i]?.newDetail
|
||||||
let newData = list[i]?.newDetail?.[detailData.currentDetailType]
|
|
||||||
// newData[0].location=[
|
// newData[0].location=[
|
||||||
// -233.13985,
|
// -233.13985,
|
||||||
// 406.90964
|
// 406.90964
|
||||||
@@ -357,13 +359,27 @@ export default defineComponent({
|
|||||||
// 0.35822305
|
// 0.35822305
|
||||||
// ]
|
// ]
|
||||||
let isCurrent = list[i].id == detailData?.selectDetail?.id
|
let isCurrent = list[i].id == detailData?.selectDetail?.id
|
||||||
let color = (detailData.currentDetailType == 'color' && isCurrent && !detailData.isEditPattern.value)?
|
let color = ''
|
||||||
(newData?.rgba?.r?`${newData.rgba.r} ${newData.rgba.g} ${newData.rgba.b}`:''):
|
let gradient = null
|
||||||
(list[i].color?.rgba?.r?
|
// if((detailData.currentDetailType == 'color' && detailData.isEditPattern.value == 'canvasEditor') && isCurrent){
|
||||||
`${list[i].color.rgba.r} ${list[i].color.rgba.g} ${list[i].color.rgba.b}`:
|
// color = newData?.color?.rgba?.r != null?`${newData?.color.rgba.r} ${newData?.color.rgba.g} ${newData?.color.rgba.b}`:''
|
||||||
'')
|
// if(newData?.color?.gradient){
|
||||||
if(detailData.currentDetailType == 'sketch' && newData){
|
// gradient = newData?.color.gradient
|
||||||
color = detailData.designDetail.clothes?.[0]?.color?.rgba?.r?`${detailData.designDetail.clothes?.[0].color.rgba.r} ${detailData.designDetail.clothes[0].color.rgba.g} ${detailData.designDetail.clothes[0].color.rgba.b}`:''
|
// }
|
||||||
|
// }else if(isCurrent){
|
||||||
|
|
||||||
|
// }
|
||||||
|
console.log(JSON.parse(JSON.stringify(detailData.selectDetail.color)),'=====')
|
||||||
|
color = list[i].color?.rgba?.r != null?`${list[i].color.rgba.r} ${list[i].color.rgba.g} ${list[i].color.rgba.b}`:''
|
||||||
|
gradient = list[i].gradient
|
||||||
|
if((detailData.currentDetailType == 'sketch' && newData?.sketch) || detailData.isEditPattern.value == 'editSketch'){
|
||||||
|
if(detailData.isEditPattern.value == 'editSketch'){
|
||||||
|
color = detailData.selectDetail?.color?.rgba?.r != null?`${detailData.selectDetail.color.rgba.r} ${detailData.selectDetail.color.rgba.g} ${detailData.selectDetail.color.rgba.b}`:''
|
||||||
|
gradient = detailData.selectDetail?.gradient || null
|
||||||
|
}else{
|
||||||
|
color = detailData.designDetail.clothes?.[0]?.color?.rgba?.r?`${detailData.designDetail.clothes?.[0].color.rgba.r} ${detailData.designDetail.clothes[0].color.rgba.g} ${detailData.designDetail.clothes[0].color.rgba.b}`:''
|
||||||
|
gradient = detailData.designDetail.clothes?.[0]?.gradient || null
|
||||||
|
}
|
||||||
detailData.selectDetail.maskUrl = ''
|
detailData.selectDetail.maskUrl = ''
|
||||||
detailData.selectDetail.maskMinioUrl = ''
|
detailData.selectDetail.maskMinioUrl = ''
|
||||||
}
|
}
|
||||||
@@ -377,9 +393,10 @@ export default defineComponent({
|
|||||||
let data:any = {
|
let data:any = {
|
||||||
changed:false,
|
changed:false,
|
||||||
color,
|
color,
|
||||||
designType:(newData && detailData.currentDetailType == 'sketch' && isCurrent && !detailData.isEditPattern.value)?newData.designType:list[i].designType,
|
gradient,
|
||||||
id:(newData && detailData.currentDetailType == 'sketch' && isCurrent && !detailData.isEditPattern.value)?newData.id:list[i].id,
|
designType:(newData?.sketch && detailData.currentDetailType == 'sketch' && isCurrent && !detailData.isEditPattern.value)?newData?.sketch.designType:list[i].designType,
|
||||||
maskMinioUrl:((newData && detailData.currentDetailType == 'sketch') || list[i].sketchString)?'':list[i]?.maskMinioUrl,
|
id:(newData?.sketch && detailData.currentDetailType == 'sketch' && isCurrent && !detailData.isEditPattern.value)?newData?.sketch.id:list[i].id,
|
||||||
|
maskMinioUrl:((newData?.sketch && detailData.currentDetailType == 'sketch') || list[i].sketchString)?'':list[i]?.maskMinioUrl,
|
||||||
// maskUrl:'',
|
// maskUrl:'',
|
||||||
maskUrl:list[i]?.maskUrl || '',
|
maskUrl:list[i]?.maskUrl || '',
|
||||||
// offset:[
|
// offset:[
|
||||||
@@ -391,28 +408,29 @@ export default defineComponent({
|
|||||||
rotate,
|
rotate,
|
||||||
partialDesign:list[i].partialDesign,
|
partialDesign:list[i].partialDesign,
|
||||||
// partialDesign:detailData.isEditPattern.value?list[i].partialDesign:{},
|
// partialDesign:detailData.isEditPattern.value?list[i].partialDesign:{},
|
||||||
path:(newData && detailData.currentDetailType == 'sketch' && isCurrent && !detailData.isEditPattern.value)?newData.minIOPath:list[i].minIOPath,
|
path:(newData?.sketch && detailData.currentDetailType == 'sketch' && isCurrent && !detailData.isEditPattern.value)?newData?.sketch.minIOPath:list[i].minIOPath,
|
||||||
printObject:(newData && detailData.currentDetailType == 'print' && isCurrent && !detailData.isEditPattern.value)?{prints:newData}:list[i].printObject?list[i].printObject:{prints:[]},
|
printObject:((newData?.print?.length>0 && (detailData.currentDetailType == 'print' || detailData.isEditPattern.value == 'canvasEditor')) && isCurrent)?{prints:newData.print}:list[i].printObject?list[i].printObject:{prints:[]},
|
||||||
priority,
|
priority,
|
||||||
// scale:[
|
// scale:[
|
||||||
// 0.5,
|
// 0.5,
|
||||||
// 0.35822305
|
// 0.35822305
|
||||||
// ],
|
// ],
|
||||||
scale:[scale[0]?scale[0]:1,scale[1]?scale[1]:1],
|
scale:[scale[0]?scale[0]:1,scale[1]?scale[1]:1],
|
||||||
type:(newData && detailData.currentDetailType == 'sketch' && isCurrent && !detailData.isEditPattern.value)?newData.level2Type || newData.categoryValue:list[i].type,
|
type:(newData?.sketch && detailData.currentDetailType == 'sketch' && isCurrent && !detailData.isEditPattern.value)?newData?.sketch.level2Type || newData?.sketch.categoryValue:list[i].type,
|
||||||
sketchString:list[i].sketchString?list[i].sketchString:'',
|
sketchString:list[i].sketchString?list[i].sketchString:'',
|
||||||
trims:(newData && detailData.currentDetailType == 'element' && isCurrent && !detailData.isEditPattern.value)?{prints:newData}:list[i].trims?.prints?list[i].trims:{prints:[]},
|
trims:((newData?.element?.length>0 && (detailData.currentDetailType == 'element' || detailData.isEditPattern.value == 'canvasEditor')) && isCurrent)?{prints:newData.element}:list[i].trims?.prints?list[i].trims:{prints:[]},
|
||||||
accessory:(newData && detailData.currentDetailType == 'accessory' && isCurrent && !detailData.isEditPattern.value)?{prints:newData}:list[i].trims?.prints?list[i].trims:{prints:[]},
|
|
||||||
}
|
}
|
||||||
// if(!data.partialDesign.partialDesignMinioPath){
|
|
||||||
// data.partialDesign.partialDesignMinioPath = data.path
|
|
||||||
// }
|
|
||||||
printObjectToJSON(data.printObject.prints)
|
printObjectToJSON(data.printObject.prints)
|
||||||
printObjectToJSON(data.trims.prints)
|
printObjectToJSON(data.trims.prints)
|
||||||
if((detailData.isEditPattern.value && list[i].color?.gradient) || (!detailData.isEditPattern.value && (list[i].newDetail?.color?.gradient || list[i].color?.gradient))){
|
console.log(list[i],'=======',isCurrent)
|
||||||
gradient = list[i].newDetail?.color?.gradient || list[i].color.gradient
|
if((list[i]?.color?.gradient)){
|
||||||
|
// if(list[i].color?.gradient || (!detailData.isEditPattern.value && (list[i].newDetail?.color?.gradient || list[i].color?.gradient))){
|
||||||
|
gradient = list[i]?.color?.gradient
|
||||||
|
console.log(gradient,list[i],gradient)
|
||||||
gradient.colorImg = await setGradual(gradient,320,700)
|
gradient.colorImg = await setGradual(gradient,320,700)
|
||||||
data.gradient = gradient
|
data.gradient = gradient
|
||||||
|
}else{
|
||||||
|
data.gradient = null
|
||||||
}
|
}
|
||||||
clothesList.push(data)
|
clothesList.push(data)
|
||||||
}
|
}
|
||||||
@@ -448,7 +466,6 @@ export default defineComponent({
|
|||||||
let value = {
|
let value = {
|
||||||
currentType : JSON.parse(JSON.stringify(detailData.currentDetailType)),
|
currentType : JSON.parse(JSON.stringify(detailData.currentDetailType)),
|
||||||
rv:rv,
|
rv:rv,
|
||||||
fun:setRevocation
|
|
||||||
}
|
}
|
||||||
if(detailData?.designDetail?.newModel)detailData.designDetail.oldModel = JSON.parse(JSON.stringify(detailData.designDetail.newModel))
|
if(detailData?.designDetail?.newModel)detailData.designDetail.oldModel = JSON.parse(JSON.stringify(detailData.designDetail.newModel))
|
||||||
|
|
||||||
@@ -456,6 +473,7 @@ export default defineComponent({
|
|||||||
let el:any = document.querySelector('.molepositon .perview_img')
|
let el:any = document.querySelector('.molepositon .perview_img')
|
||||||
let scale = 0
|
let scale = 0
|
||||||
await new Promise<void>(async (resolve, reject) => {
|
await new Promise<void>(async (resolve, reject) => {
|
||||||
|
if(!detailData.frontBack.body.path)resolve(true)
|
||||||
const img = new Image();
|
const img = new Image();
|
||||||
img.src = detailData.frontBack.body.path;
|
img.src = detailData.frontBack.body.path;
|
||||||
img.onload = () => {
|
img.onload = () => {
|
||||||
@@ -481,6 +499,12 @@ export default defineComponent({
|
|||||||
|
|
||||||
}
|
}
|
||||||
const submit = async ()=>{
|
const submit = async ()=>{
|
||||||
|
detailData.loadingShow = true
|
||||||
|
if(detailData.isEditPattern.value !== 'canvasEditor' && detailDom.canvasBox){
|
||||||
|
if(detailDom.detailRight?.privewDetail)await (detailDom.detailRight as any).privewDetail()
|
||||||
|
let otherData = await updateOtherLayers('single')
|
||||||
|
await detailDom.canvasBox.updateOtherLayers(otherData)
|
||||||
|
}
|
||||||
let workspace = store.state.Workspace.probjects
|
let workspace = store.state.Workspace.probjects
|
||||||
let clothes:any = await setClothes(detailData.designDetail.clothes,'sub')
|
let clothes:any = await setClothes(detailData.designDetail.clothes,'sub')
|
||||||
let data = {
|
let data = {
|
||||||
@@ -497,7 +521,6 @@ export default defineComponent({
|
|||||||
processId:userDetail.value.userId,
|
processId:userDetail.value.userId,
|
||||||
probjectId:store.state.Workspace.probjects.id,
|
probjectId:store.state.Workspace.probjects.id,
|
||||||
}
|
}
|
||||||
detailData.loadingShow = true
|
|
||||||
Https.axiosPost(Https.httpUrls.designSingle, data).then(async (rv)=>{
|
Https.axiosPost(Https.httpUrls.designSingle, data).then(async (rv)=>{
|
||||||
saveCanvasJSONToSession()
|
saveCanvasJSONToSession()
|
||||||
// store.commit('DesignDetail/setPraeview',rv)
|
// store.commit('DesignDetail/setPraeview',rv)
|
||||||
@@ -529,8 +552,10 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
const previwe = async ()=>{
|
const previwe = async ()=>{
|
||||||
detailData.loadingShow = true
|
detailData.loadingShow = true
|
||||||
if((detailData.currentDetailType == 'sketch' && !detailData.isEditPattern.value) || detailData.isEditPattern.value == 'editSketch'){
|
if((detailData.currentDetailType == 'models' && !detailData.isEditPattern.value) || (detailData.currentDetailType == 'sketch' && !detailData.isEditPattern.value) || detailData.isEditPattern.value == 'editSketch'){
|
||||||
await getSubmitData('preview')
|
await getSubmitData('preview')
|
||||||
|
if(detailData.currentDetailType == 'models')return detailData.loadingShow = false
|
||||||
|
detailData.imgDomIndex = detailData.frontBack.front.findIndex((item:any)=>item.id == detailData.selectDetail.id)
|
||||||
await getSketchSize()
|
await getSketchSize()
|
||||||
detailDom.canvasBox.changeSketchUpdateFrontBack = async ()=>{
|
detailDom.canvasBox.changeSketchUpdateFrontBack = async ()=>{
|
||||||
await detailDom.canvasBox.privewDetail()
|
await detailDom.canvasBox.privewDetail()
|
||||||
@@ -547,6 +572,7 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
await detailDom.canvasBox.privewDetail()
|
await detailDom.canvasBox.privewDetail()
|
||||||
await upDateFrontBackSketch()
|
await upDateFrontBackSketch()
|
||||||
|
await uploadSelectDetail()
|
||||||
saveCanvasJSONToSession()
|
saveCanvasJSONToSession()
|
||||||
detailData.loadingShow = false
|
detailData.loadingShow = false
|
||||||
}
|
}
|
||||||
@@ -564,9 +590,9 @@ export default defineComponent({
|
|||||||
let front = detailData.frontBack.front[detailData.imgDomIndex]
|
let front = detailData.frontBack.front[detailData.imgDomIndex]
|
||||||
let back = detailData.frontBack.back[detailData.imgDomIndex]
|
let back = detailData.frontBack.back[detailData.imgDomIndex]
|
||||||
|
|
||||||
front.oldImageUrl = ''
|
if(front?.oldImageUrl)front.oldImageUrl = ''
|
||||||
front.oldMaskUrl = ''
|
if(front?.oldMaskUrl)front.oldMaskUrl = ''
|
||||||
back.oldImageUrl = ''
|
if(back?.oldImageUrl)back.oldImageUrl = ''
|
||||||
front.imageUrl = rv.targetFrontUrl
|
front.imageUrl = rv.targetFrontUrl
|
||||||
back.imageUrl = rv.targetBackUrl
|
back.imageUrl = rv.targetBackUrl
|
||||||
store.commit('DesignDetail/canvasPreviewUpdata',{type:detailData.isEditPattern.value?'all':detailData.currentDetailType,callBack:setRevocation})
|
store.commit('DesignDetail/canvasPreviewUpdata',{type:detailData.isEditPattern.value?'all':detailData.currentDetailType,callBack:setRevocation})
|
||||||
@@ -594,11 +620,12 @@ export default defineComponent({
|
|||||||
await KeyValueDB.set('canvasList', JSON.stringify(list));
|
await KeyValueDB.set('canvasList', JSON.stringify(list));
|
||||||
}
|
}
|
||||||
const detailEdit = async (str:any)=>{
|
const detailEdit = async (str:any)=>{
|
||||||
|
detailData.loadingShow = true
|
||||||
if(str){
|
if(str){
|
||||||
if(detailData.isEditPattern.value && detailData.isEditPattern.value == str){
|
if(detailData.isEditPattern.value && detailData.isEditPattern.value == str){
|
||||||
// await detailDom.canvasBox.saveCanvas()
|
// await detailDom.canvasBox.saveCanvas()
|
||||||
await (detailDom.canvasBox as any).privewDetail()
|
await (detailDom.canvasBox as any).privewDetail()
|
||||||
if(detailData.isEditPattern.value == 'canvasEditor')await uploadElement()
|
if(detailData.isEditPattern.value == 'canvasEditor')await uploadSelectDetail()
|
||||||
detailData.isEditPattern.value = ''
|
detailData.isEditPattern.value = ''
|
||||||
}else{
|
}else{
|
||||||
// if(detailData.isEditPattern.value && (str == 'canvasEditor' || str == 'redGreenExample')){
|
// if(detailData.isEditPattern.value && (str == 'canvasEditor' || str == 'redGreenExample')){
|
||||||
@@ -606,15 +633,20 @@ export default defineComponent({
|
|||||||
// }
|
// }
|
||||||
detailDom.canvasBox.editFront(str)
|
detailDom.canvasBox.editFront(str)
|
||||||
if(str == 'canvasEditor'){
|
if(str == 'canvasEditor'){
|
||||||
let otherData = await updateOtherLayers('single')
|
if((detailData.currentDetailType == 'print' || detailData.currentDetailType == 'element') && !detailDom.detailRight?.privewDetail){
|
||||||
console.log(otherData,'============')
|
store.commit('DesignDetail/changeCanvasKey')
|
||||||
await detailDom.canvasBox.updateOtherLayers(otherData)
|
}else{
|
||||||
|
if(detailDom.detailRight?.privewDetail)await (detailDom.detailRight as any).privewDetail()
|
||||||
|
let otherData = await updateOtherLayers('single')
|
||||||
|
await detailDom.canvasBox.updateOtherLayers(otherData)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
detailData.isEditPattern.value = str
|
detailData.isEditPattern.value = str
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
detailData.isEditPattern.value = ''
|
detailData.isEditPattern.value = ''
|
||||||
}
|
}
|
||||||
|
detailData.loadingShow = false
|
||||||
}
|
}
|
||||||
const getColorName = (color:any)=>{
|
const getColorName = (color:any)=>{
|
||||||
let rgb:any = [color.r, color.g, color.b];
|
let rgb:any = [color.r, color.g, color.b];
|
||||||
@@ -636,14 +668,14 @@ export default defineComponent({
|
|||||||
});
|
});
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
const updateOtherLayers = async (str:any='all')=>{//更新到画布图层
|
const updateOtherLayers = async (str:any='all',type:any='noFirst')=>{//更新到画布图层
|
||||||
let otherData:any = {}
|
let otherData:any = {}
|
||||||
if(detailDom.detailRight?.privewDetail)await (detailDom.detailRight as any).privewDetail()
|
|
||||||
if(str == 'all'){
|
if(str == 'all'){
|
||||||
|
// await uploadSelectDetail()
|
||||||
otherData = {
|
otherData = {
|
||||||
color: detailData.selectDetail.newDetail?.color?.r?detailData.selectDetail.newDetail?.color:detailData.selectDetail.color,
|
color: detailData.selectDetail.color,
|
||||||
printObject: detailData.selectDetail.newDetail?.print?.length>0?{prints:detailData.selectDetail.newDetail?.print}:detailData.selectDetail.printObject || null,
|
printObject: detailData.selectDetail.printObject || null,
|
||||||
trims: detailData.selectDetail.newDetail?.element?.length>0?detailData.selectDetail.newDetail?.element:detailData.selectDetail.trims || null,
|
trims: detailData.selectDetail.trims || null,
|
||||||
}
|
}
|
||||||
}else if(str == 'single'){
|
}else if(str == 'single'){
|
||||||
otherData = {
|
otherData = {
|
||||||
@@ -655,7 +687,7 @@ export default defineComponent({
|
|||||||
let color = detailData.selectDetail.newDetail?.color
|
let color = detailData.selectDetail.newDetail?.color
|
||||||
// let colorData:any = await getColorName(color?.rgba)
|
// let colorData:any = await getColorName(color?.rgba)
|
||||||
if(detailData.selectDetail.newDetail?.color){
|
if(detailData.selectDetail.newDetail?.color){
|
||||||
if(color.r){
|
if(color.r != null){
|
||||||
color.rgba = {r:color.r,g:color.g,b:color.b,a:color.a}
|
color.rgba = {r:color.r,g:color.g,b:color.b,a:color.a}
|
||||||
}else{
|
}else{
|
||||||
color.rgba = {}
|
color.rgba = {}
|
||||||
@@ -664,10 +696,11 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(detailData.currentDetailType == 'print'){
|
if(detailData.currentDetailType == 'print'){
|
||||||
otherData.printObject = detailData.selectDetail.newDetail?.print?.length>0?{prints:detailData.selectDetail.newDetail?.print}:detailData.selectDetail.printObject || null
|
if(detailDom.detailRight?.privewDetail)await (detailDom.detailRight as any).privewDetail()
|
||||||
|
otherData.printObject = {prints:detailData.selectDetail.newDetail?.print || []}
|
||||||
}
|
}
|
||||||
if(detailData.currentDetailType == 'element'){
|
if(detailData.currentDetailType == 'element'){
|
||||||
otherData.trims = detailData.selectDetail.newDetail?.element?.length>0?{prints:detailData.selectDetail.newDetail?.element}:detailData.selectDetail.trims || null
|
otherData.trims = {prints:detailData.selectDetail.newDetail?.element || []}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return otherData
|
return otherData
|
||||||
@@ -676,27 +709,25 @@ export default defineComponent({
|
|||||||
if(detailData.isEditPattern.value == 'canvasEditor'){
|
if(detailData.isEditPattern.value == 'canvasEditor'){
|
||||||
// await detailDom.canvasBox.saveCanvas()
|
// await detailDom.canvasBox.saveCanvas()
|
||||||
const allInfo = await (detailDom.canvasBox as any).getCanvasElement()
|
const allInfo = await (detailDom.canvasBox as any).getCanvasElement()
|
||||||
if(allInfo.trims?.length > 0){
|
let trimsValue = {
|
||||||
// detailData.selectDetail.trims.prints = allInfo.trims
|
data:allInfo.trims || [],
|
||||||
let value = {
|
str:'element'
|
||||||
data:allInfo.trims,
|
|
||||||
str:'element'
|
|
||||||
}
|
|
||||||
store.commit('DesignDetail/setNewDetail',value)
|
|
||||||
}
|
}
|
||||||
if(allInfo.prints?.length > 0){
|
store.commit('DesignDetail/setNewDetail',trimsValue)
|
||||||
// detailData.selectDetail.printObject.prints = allInfo.prints
|
let printValue = {
|
||||||
let value = {
|
data:allInfo.prints || [],
|
||||||
data:allInfo.prints,
|
str:'print'
|
||||||
str:'print'
|
|
||||||
}
|
|
||||||
store.commit('DesignDetail/setNewDetail',value)
|
|
||||||
}
|
}
|
||||||
if(allInfo.color?.color?.rgba){
|
store.commit('DesignDetail/setNewDetail',printValue)
|
||||||
let canvasColor = allInfo.color.color;
|
if(allInfo.color?.color?.rgba || allInfo.color?.color?.gradient){
|
||||||
let colorData:any = await getColorName(allInfo.color.color?.rgba)
|
|
||||||
let value:any = {
|
let value:any = {
|
||||||
data:{
|
str:'color',
|
||||||
|
data:{},
|
||||||
|
}
|
||||||
|
let canvasColor = allInfo.color.color;
|
||||||
|
if(allInfo.color?.color?.rgba){
|
||||||
|
let colorData:any = await getColorName(allInfo.color.color?.rgba)
|
||||||
|
value.data = {
|
||||||
hsv:{
|
hsv:{
|
||||||
h:colorData.h,
|
h:colorData.h,
|
||||||
s:colorData.s,
|
s:colorData.s,
|
||||||
@@ -706,8 +737,7 @@ export default defineComponent({
|
|||||||
tcx:colorData.tcx,
|
tcx:colorData.tcx,
|
||||||
rgba:canvasColor.rgba,
|
rgba:canvasColor.rgba,
|
||||||
hex:rgbaToHex([canvasColor.rgba.r,canvasColor.rgba.g,canvasColor.rgba.b]),
|
hex:rgbaToHex([canvasColor.rgba.r,canvasColor.rgba.g,canvasColor.rgba.b]),
|
||||||
},
|
}
|
||||||
str:'color'
|
|
||||||
}
|
}
|
||||||
if(canvasColor.gradient){
|
if(canvasColor.gradient){
|
||||||
value.data.gradient = canvasColor.gradient
|
value.data.gradient = canvasColor.gradient
|
||||||
@@ -717,9 +747,65 @@ export default defineComponent({
|
|||||||
if(detailData.currentDetailType == 'color'){
|
if(detailData.currentDetailType == 'color'){
|
||||||
detailData.detailLeftColorKey++
|
detailData.detailLeftColorKey++
|
||||||
}
|
}
|
||||||
|
}else{
|
||||||
|
let value = {
|
||||||
|
data:{},
|
||||||
|
str:'color'
|
||||||
|
}
|
||||||
|
store.commit('DesignDetail/setNewDetail',value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
const uploadSelectDetail = async ()=>{//更新选中的detail
|
||||||
|
// await detailDom.canvasBox.saveCanvas()
|
||||||
|
const allInfo = await (detailDom.canvasBox as any).getCanvasElement()
|
||||||
|
let color:any = {}
|
||||||
|
if(allInfo.color?.color?.rgba || allInfo.color?.color?.gradient){
|
||||||
|
let canvasColor = allInfo.color.color;
|
||||||
|
if(canvasColor?.rgba?.r != null){
|
||||||
|
let colorData:any = await getColorName(allInfo.color.color?.rgba)
|
||||||
|
color = {
|
||||||
|
hsv:{
|
||||||
|
h:colorData.h,
|
||||||
|
s:colorData.s,
|
||||||
|
v:colorData.v,
|
||||||
|
},
|
||||||
|
name:colorData.name,
|
||||||
|
tcx:colorData.tcx,
|
||||||
|
rgba:canvasColor.rgba,
|
||||||
|
hex:rgbaToHex([canvasColor.rgba.r,canvasColor.rgba.g,canvasColor.rgba.b]),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(canvasColor?.gradient){
|
||||||
|
color.gradient = canvasColor.gradient
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(detailData.isEditPattern.value == 'canvasEditor'){
|
||||||
|
delete detailData.selectDetail.newDetail
|
||||||
|
detailData.selectDetail.trims.prints = allInfo.trims || []
|
||||||
|
detailData.selectDetail.printObject.prints = allInfo.prints || []
|
||||||
|
detailData.selectDetail.color = color
|
||||||
|
}else{
|
||||||
|
if(detailData.currentDetailType == 'color'){
|
||||||
|
if(detailData.selectDetail.newDetail?.color)delete detailData.selectDetail.newDetail.color
|
||||||
|
detailData.selectDetail.color = color
|
||||||
|
detailData.selectDetail.gradient = color.gradient
|
||||||
|
}
|
||||||
|
if(detailData.currentDetailType == 'print'){
|
||||||
|
if(detailData.selectDetail.newDetail?.print)delete detailData.selectDetail.newDetail.print
|
||||||
|
detailData.selectDetail.printObject.prints = allInfo.prints || []
|
||||||
|
}
|
||||||
|
if(detailData.currentDetailType == 'element'){
|
||||||
|
if(detailData.selectDetail.newDetail?.element)delete detailData.selectDetail.newDetail.element
|
||||||
|
detailData.selectDetail.trims.prints = allInfo.trims || []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(detailData.currentDetailType == 'color'){
|
||||||
|
detailData.detailLeftColorKey++
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
const canvasReload = async ()=>{
|
const canvasReload = async ()=>{
|
||||||
if(detailData.isEditPattern.value){
|
if(detailData.isEditPattern.value){
|
||||||
await detailDom.canvasBox.saveCanvas()
|
await detailDom.canvasBox.saveCanvas()
|
||||||
|
|||||||
@@ -6,18 +6,19 @@
|
|||||||
<div class="content-bottom" ref="canvasContent">
|
<div class="content-bottom" ref="canvasContent">
|
||||||
<div class="contet">
|
<div class="contet">
|
||||||
<div class="canvas" :class="{'active': currentView === 'canvasEditor'}"@click.stop>
|
<div class="canvas" :class="{'active': currentView === 'canvasEditor'}"@click.stop>
|
||||||
<!-- :clothingMinIOPath="selectDetail.minIOPath" 部件选取 -->
|
|
||||||
<editCanvas v-if="canvasLoad" :config="canvasConfig"
|
<editCanvas v-if="canvasLoad" :config="canvasConfig"
|
||||||
|
:title="t('CanvasTitle.ModifyItem')"
|
||||||
@canvasInit="editSketchCanvasInit"
|
@canvasInit="editSketchCanvasInit"
|
||||||
is-edit
|
is-edit
|
||||||
:clothingImageUrl="selectDetail.path"
|
:clothingImageUrl="selectDetail.path"
|
||||||
:clothingImageUrl2="selectDetail.layersObject[0].maskUrl"
|
:clothingImageUrl2="selectDetail.maskUrl || selectDetail.layersObject[0].maskUrl"
|
||||||
showFixedLayer
|
showFixedLayer
|
||||||
:canvasJSON="canvasJSON"
|
:canvasJSON="canvasJSON"
|
||||||
@canvasLoadJsonSuccess="canvasLoadJsonSuccess"
|
@canvasLoadJsonSuccess="canvasLoadJsonSuccess"
|
||||||
:clothing-image-opts="{
|
:clothing-image-opts="{
|
||||||
imageMode:'contains',
|
imageMode:'contains',
|
||||||
}"
|
}"
|
||||||
|
:isChangeCanvasSize="false"
|
||||||
:hideCanvas="hideCanvas || !isEditPattern"
|
:hideCanvas="hideCanvas || !isEditPattern"
|
||||||
ref="editCanvas">
|
ref="editCanvas">
|
||||||
</editCanvas>
|
</editCanvas>
|
||||||
@@ -25,6 +26,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="editFrontBack" v-if="currentView === 'redGreenExample'" @click.stop>
|
<div class="editFrontBack" v-if="currentView === 'redGreenExample'" @click.stop>
|
||||||
<editCanvas v-if="canvasLoad" :config="canvasConfig"
|
<editCanvas v-if="canvasLoad" :config="canvasConfig"
|
||||||
|
:title="t('CanvasTitle.RedGreen')"
|
||||||
@canvasInit="editFrontBackCanvasInit"
|
@canvasInit="editFrontBackCanvasInit"
|
||||||
:enabledRedGreenMode="true"
|
:enabledRedGreenMode="true"
|
||||||
:clothingImageUrl="selectDetail.path"
|
:clothingImageUrl="selectDetail.path"
|
||||||
@@ -39,7 +41,7 @@
|
|||||||
</editCanvas>
|
</editCanvas>
|
||||||
</div>
|
</div>
|
||||||
<div class="editSketch" v-if="currentView === 'editSketch'" @click.stop>
|
<div class="editSketch" v-if="currentView === 'editSketch'" @click.stop>
|
||||||
<generalMiniCanvas ref="generalMiniCanvas" :btnShow="false" :imgUrl="selectDetail.sketchString || selectDetail.path"></generalMiniCanvas>
|
<generalMiniCanvas ref="generalMiniCanvas" :isChangeCanvasSize="false" :canvasTitle="t('CanvasTitle.ModifySketch')" :btnShow="false" :imgUrl="selectDetail.sketchString || selectDetail.path"></generalMiniCanvas>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -49,9 +51,9 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="mark_loading" v-show="isShowMark">
|
<!-- <div class="mark_loading" v-show="isShowMark">
|
||||||
<a-spin size="large" />
|
<a-spin size="large" />
|
||||||
</div>
|
</div> -->
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</template>
|
</template>
|
||||||
@@ -242,8 +244,11 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const frontBackChange = (value:any)=>{
|
const frontBackChange = async (value:any)=>{
|
||||||
let full = detailData.selectDetail.partialDesign.partialDesignBase64 || detailData.selectDetail.path
|
if(!detailData.selectDetail.partialDesign.partialDesignPath && !detailData.selectDetail.partialDesign.partialDesignBase64){
|
||||||
|
await privewDetail()
|
||||||
|
}
|
||||||
|
let full = detailData.selectDetail.partialDesign.partialDesignBase64 || detailData.selectDetail.partialDesign.partialDesignPath || detailData.selectDetail.path
|
||||||
let size = {
|
let size = {
|
||||||
...detailData.canvasConfig,
|
...detailData.canvasConfig,
|
||||||
}
|
}
|
||||||
@@ -284,14 +289,29 @@ export default defineComponent({
|
|||||||
return detailDom?.editCanvas?.getJSON()
|
return detailDom?.editCanvas?.getJSON()
|
||||||
}
|
}
|
||||||
const saveCanvas = async (canvasData:any)=>{
|
const saveCanvas = async (canvasData:any)=>{
|
||||||
const index = detailData.designDetail.clothes.findIndex(item => item.id === canvasData.id);
|
const index = detailData.designDetail.clothes.findIndex(item => item.id === canvasData?.id);
|
||||||
await new Promise<void>((resolve, reject) => {
|
await new Promise<void>((resolve, reject) => {
|
||||||
let canvasJSON = JSON.parse(canvasData.canvasJSON)
|
if(!detailDom?.editCanvas)return resolve()
|
||||||
if(!canvasJSON)return resolve()
|
let canvasJSON = detailDom?.editCanvas?.getJSON()
|
||||||
// canvasData.canvas.objects.forEach((objectsItem:any) => {
|
let canvasData = JSON.parse(canvasJSON)
|
||||||
// if(objectsItem.type == 'image')objectsItem.minioUrl = getMinioUrl(objectsItem.src)
|
if(!canvasData)return resolve()
|
||||||
// });
|
function deepProcessObjects(data:any, callback:any) {
|
||||||
let blob = new Blob([JSON.stringify(canvasJSON)], { type: "application/json" });
|
if (!Array.isArray(data)) return data;
|
||||||
|
return data.map(item => {
|
||||||
|
callback(item)
|
||||||
|
const processedItem = {...item};
|
||||||
|
if (processedItem.objects &&
|
||||||
|
Array.isArray(processedItem.objects) &&
|
||||||
|
processedItem.objects.length > 0) {
|
||||||
|
processedItem.objects = deepProcessObjects(processedItem.objects, callback);
|
||||||
|
}
|
||||||
|
return processedItem;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
canvasData.canvas.objects = deepProcessObjects(canvasData.canvas.objects,(item:any)=>{
|
||||||
|
if(item.type == 'image')item.minioUrl = getMinioUrl(item.src)
|
||||||
|
})
|
||||||
|
let blob = new Blob([JSON.stringify(canvasData)], { type: "application/json" });
|
||||||
let formData = new FormData();
|
let formData = new FormData();
|
||||||
formData.append("file", blob, "data.json");
|
formData.append("file", blob, "data.json");
|
||||||
formData.append("designItemDetailId", detailData.selectDetail.id);
|
formData.append("designItemDetailId", detailData.selectDetail.id);
|
||||||
@@ -320,7 +340,7 @@ export default defineComponent({
|
|||||||
// },3000)
|
// },3000)
|
||||||
// }
|
// }
|
||||||
const canvasLoadJsonSuccess = async ()=>{
|
const canvasLoadJsonSuccess = async ()=>{
|
||||||
let otherData = await props.updateOtherLayers()
|
let otherData = await props.updateOtherLayers('all','first')
|
||||||
await updateOtherLayers(otherData)
|
await updateOtherLayers(otherData)
|
||||||
if(detailData.changeSketchUpdateFrontBack){
|
if(detailData.changeSketchUpdateFrontBack){
|
||||||
await detailData.changeSketchUpdateFrontBack()
|
await detailData.changeSketchUpdateFrontBack()
|
||||||
@@ -409,6 +429,7 @@ export default defineComponent({
|
|||||||
return{
|
return{
|
||||||
...toRefs(detailDom),
|
...toRefs(detailDom),
|
||||||
...toRefs(detailData),
|
...toRefs(detailData),
|
||||||
|
t,
|
||||||
editFront,
|
editFront,
|
||||||
privewDetail,
|
privewDetail,
|
||||||
setFrontBackColor,
|
setFrontBackColor,
|
||||||
|
|||||||
@@ -100,12 +100,15 @@ export default defineComponent({
|
|||||||
tcxToColor:'',
|
tcxToColor:'',
|
||||||
})
|
})
|
||||||
watch(()=>colorData.selectColor,async (newVal,oldVal)=>{
|
watch(()=>colorData.selectColor,async (newVal,oldVal)=>{
|
||||||
if(newVal.rgba && newVal.rgba?.r){
|
if((newVal.rgba && newVal.rgba?.r != null) || newVal.gradient != null){
|
||||||
let data:any = await getColorName(newVal.rgba)
|
let data :any = {}
|
||||||
newVal.name = data.name
|
if(newVal.rgba?.r != null){
|
||||||
newVal.tcx = data.tcx
|
data = await getColorName(newVal.rgba)
|
||||||
colorData.colorList.list[colorData.selectDetail.id][colorData.colorList.index] = newVal
|
newVal.name = data.name
|
||||||
data.rgba = newVal.rgba
|
newVal.tcx = data.tcx
|
||||||
|
colorData.colorList.list[colorData.selectDetail.id][colorData.colorList.index] = newVal
|
||||||
|
data.rgba = newVal.rgba
|
||||||
|
}
|
||||||
if(newVal.gradient){
|
if(newVal.gradient){
|
||||||
data.gradient = newVal.gradient
|
data.gradient = newVal.gradient
|
||||||
}
|
}
|
||||||
@@ -124,13 +127,12 @@ export default defineComponent({
|
|||||||
})
|
})
|
||||||
watch(()=>colorData.selectDetail.id,(newVal,oldVal)=>{
|
watch(()=>colorData.selectDetail.id,(newVal,oldVal)=>{
|
||||||
if(!newVal)return
|
if(!newVal)return
|
||||||
console.log(12312)
|
colorData.colorList.list[newVal] = []
|
||||||
if(!colorData.colorList?.list?.[newVal]){
|
// if(!colorData.colorList?.list?.[newVal]){
|
||||||
colorData.colorList.list[newVal] = []
|
// colorData.colorList.list[newVal] = []
|
||||||
}else{
|
// }else{
|
||||||
return
|
// // return
|
||||||
}
|
// }
|
||||||
console.log(12312)
|
|
||||||
let isNoSelect = false
|
let isNoSelect = false
|
||||||
let pushIndex = 0
|
let pushIndex = 0
|
||||||
for (let index = 0; index < 9; index++) {
|
for (let index = 0; index < 9; index++) {
|
||||||
@@ -140,14 +142,12 @@ export default defineComponent({
|
|||||||
let color = colorData.allBoardData.colorBoards?.[index]
|
let color = colorData.allBoardData.colorBoards?.[index]
|
||||||
if(!color?.rgba && color?.rgbValue)color.rgba = color.rgbValue
|
if(!color?.rgba && color?.rgbValue)color.rgba = color.rgbValue
|
||||||
if(
|
if(
|
||||||
colorData.allBoardData.colorBoards?.[index] &&
|
(colorData.allBoardData.colorBoards?.[index] && color?.rgba &&
|
||||||
colorData.selectDetail.color.rgba?.r == color?.rgba?.r &&
|
colorData.selectDetail.color.rgba?.r == color?.rgba?.r &&
|
||||||
colorData.selectDetail.color.rgba?.g == color?.rgba?.g &&
|
colorData.selectDetail.color.rgba?.g == color?.rgba?.g &&
|
||||||
colorData.selectDetail.color.rgba?.b == color?.rgba?.b ||
|
colorData.selectDetail.color.rgba?.b == color?.rgba?.b) ||
|
||||||
(JSON.stringify(colorData.selectDetail.color.gradient) == JSON.stringify(color?.gradient) && colorData.selectDetail.color.gradient)
|
((JSON.stringify(colorData.selectDetail.color.gradient) == JSON.stringify(color?.gradient) && colorData.selectDetail.color.gradient))
|
||||||
&& colorData.selectDetail.color.rgba?.r
|
|
||||||
){
|
){
|
||||||
console.log(123)
|
|
||||||
isNoSelect = true
|
isNoSelect = true
|
||||||
colorData.selectColor = item
|
colorData.selectColor = item
|
||||||
colorData.colorList.index = index
|
colorData.colorList.index = index
|
||||||
@@ -173,19 +173,22 @@ export default defineComponent({
|
|||||||
colorData.colorList.list[newVal].push(item)
|
colorData.colorList.list[newVal].push(item)
|
||||||
}
|
}
|
||||||
if(!isNoSelect){
|
if(!isNoSelect){
|
||||||
let color = colorData.selectDetail.newDetail?.color?.rgba?.r?colorData.selectDetail.newDetail?.color:colorData.selectDetail.color
|
let color = colorData.selectDetail.newDetail?.color?.rgba?.r != null?colorData.selectDetail.newDetail?.color:colorData.selectDetail.color
|
||||||
if(!color?.rgba?.r)return
|
let item:any = {}
|
||||||
let item = {
|
if(color?.rgba?.r != null){
|
||||||
hex:rgbaToHex([color.rgba.r,color.rgba.g,color.rgba.b]),
|
item = {
|
||||||
id:color.id,
|
hex:rgbaToHex([color.rgba.r,color.rgba.g,color.rgba.b]),
|
||||||
rgba:{
|
id:color.id,
|
||||||
r:color.rgba.r,
|
rgba:{
|
||||||
g:color.rgba.g,
|
r:color.rgba.r,
|
||||||
b:color.rgba.b,
|
g:color.rgba.g,
|
||||||
},
|
b:color.rgba.b,
|
||||||
tcx:color.tcx,
|
},
|
||||||
name:color.name,
|
tcx:color.tcx,
|
||||||
} as any
|
name:color.name,
|
||||||
|
} as any
|
||||||
|
}
|
||||||
|
|
||||||
if(color.gradient){
|
if(color.gradient){
|
||||||
item.gradient = color.gradient
|
item.gradient = color.gradient
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -119,7 +119,7 @@ export default defineComponent({
|
|||||||
})
|
})
|
||||||
const palletRef = ref(null)
|
const palletRef = ref(null)
|
||||||
watch(()=>palletData.color_,(newVal:any)=>{
|
watch(()=>palletData.color_,(newVal:any)=>{
|
||||||
if(!newVal?.rgba?.r)return
|
if(newVal?.rgba?.r == null)return
|
||||||
if(palletData.color?.gradient?.gradientShow){
|
if(palletData.color?.gradient?.gradientShow){
|
||||||
palletData.color.gradient.gradientList[palletData.color.gradient.selectIndex].rgba = {
|
palletData.color.gradient.gradientList[palletData.color.gradient.selectIndex].rgba = {
|
||||||
r:newVal.rgba.r,
|
r:newVal.rgba.r,
|
||||||
@@ -146,7 +146,7 @@ export default defineComponent({
|
|||||||
},{deep: true })
|
},{deep: true })
|
||||||
const setOperate = ()=>{
|
const setOperate = ()=>{
|
||||||
if(!palletData.color.rgba)return message.info(t('DesignDetailAlter.jsContent7'))
|
if(!palletData.color.rgba)return message.info(t('DesignDetailAlter.jsContent7'))
|
||||||
palletData.color.rgba = palletData.color?.rgba?.r?palletData.color.rgba:{r:0,g:0,b:0,a:1}
|
palletData.color.rgba = palletData.color?.rgba?.r != null?palletData.color.rgba:{r:0,g:0,b:0,a:1}
|
||||||
palletData.gradient.selectIndex = 0
|
palletData.gradient.selectIndex = 0
|
||||||
palletData.gradient.gradientShow = true
|
palletData.gradient.gradientShow = true
|
||||||
if(!palletData.color.gradient){
|
if(!palletData.color.gradient){
|
||||||
@@ -262,7 +262,7 @@ export default defineComponent({
|
|||||||
const openPallet = ()=>{
|
const openPallet = ()=>{
|
||||||
palletData.palletShow = !palletData.palletShow
|
palletData.palletShow = !palletData.palletShow
|
||||||
console.log(props.selectColor,palletData.palletShow)
|
console.log(props.selectColor,palletData.palletShow)
|
||||||
if(palletData.palletShow && props.selectColor?.rgba?.r){
|
if(palletData.palletShow && props.selectColor?.rgba?.r != null){
|
||||||
if(props.selectColor.gradient){
|
if(props.selectColor.gradient){
|
||||||
palletData.color_.rgba = props.selectColor.gradient.gradientList[0].rgba
|
palletData.color_.rgba = props.selectColor.gradient.gradientList[0].rgba
|
||||||
}else{
|
}else{
|
||||||
|
|||||||
@@ -40,11 +40,29 @@ export default defineComponent({
|
|||||||
setup(props,{emit}) {
|
setup(props,{emit}) {
|
||||||
const {t} = useI18n();
|
const {t} = useI18n();
|
||||||
const store = useStore();
|
const store = useStore();
|
||||||
|
const updateCatecory = (arr)=>{
|
||||||
|
arr.forEach((v:any) => {
|
||||||
|
if(props.catecoryList)props.catecoryList.forEach((item:any) => {
|
||||||
|
if(v.level2Type == item.value && !v.category){
|
||||||
|
v.category=item.name
|
||||||
|
v.categoryValue=item.value
|
||||||
|
}
|
||||||
|
})
|
||||||
|
});
|
||||||
|
}
|
||||||
const detailData = reactive({
|
const detailData = reactive({
|
||||||
allBoardData:computed(()=>store.state.UploadFilesModule.allBoardData),
|
allBoardData:computed(()=>store.state.UploadFilesModule.allBoardData),
|
||||||
currentList:{
|
currentList:{
|
||||||
sketch:computed(()=>store.state.UploadFilesModule.allBoardData.sketchboardFiles),
|
sketch:computed(()=>{
|
||||||
print:computed(()=>store.state.UploadFilesModule.allBoardData.printboardFiles),
|
let sketch = store.state.UploadFilesModule.allBoardData.sketchboardFiles
|
||||||
|
updateCatecory(sketch)
|
||||||
|
return sketch
|
||||||
|
}),
|
||||||
|
print:computed(()=>{
|
||||||
|
let print = store.state.UploadFilesModule.allBoardData.printboardFiles
|
||||||
|
updateCatecory(print)
|
||||||
|
return print
|
||||||
|
}),
|
||||||
color:computed(()=>store.state.UploadFilesModule.allBoardData.colorBoards),
|
color:computed(()=>store.state.UploadFilesModule.allBoardData.colorBoards),
|
||||||
models:computed(()=>store.state.Workspace.probjects.model),
|
models:computed(()=>store.state.Workspace.probjects.model),
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -76,10 +76,10 @@ export default defineComponent({
|
|||||||
selectImgItem(data)
|
selectImgItem(data)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
data.id = id
|
||||||
if(data?.imgUrl)data.url = data.imgUrl
|
if(data?.imgUrl)data.url = data.imgUrl
|
||||||
let value = {
|
let value = {
|
||||||
data,
|
data,
|
||||||
id,
|
|
||||||
}
|
}
|
||||||
if(detailData.currentDetailType == 'sketch'){
|
if(detailData.currentDetailType == 'sketch'){
|
||||||
detailData.selectDetail.sketchString = ''
|
detailData.selectDetail.sketchString = ''
|
||||||
|
|||||||
@@ -89,8 +89,8 @@
|
|||||||
<img crossOrigin="anonymous" :src="item?.path" :style="{transform:`rotateZ(${item.pattern?.transform?.rotateZ}deg)`}" class="designOpenrtion_imgItme" draggable="false">
|
<img crossOrigin="anonymous" :src="item?.path" :style="{transform:`rotateZ(${item.pattern?.transform?.rotateZ}deg)`}" class="designOpenrtion_imgItme" draggable="false">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- <img :src="selectDetail.path" alt="" class="designOpenrtion_sketch" ref="sketchImg"> -->
|
<!-- <img :src="selectDetail.path" alt="" class="designOpenrtion_sketch" ref="sketchImg" @load="()=>isSketchLoad = true"> -->
|
||||||
<img :src="stateOverallSingle == 'single'?(selectDetail.undividedLayer||selectDetail.path):(selectDetail.undividedLayerColor || selectDetail.path)" alt="" class="designOpenrtion_sketch" ref="sketchImg" @load="()=>isSketchLoad = true">
|
<img :src="(selectDetail.path)" alt="" class="designOpenrtion_sketch" ref="sketchImg" @load="()=>isSketchLoad = true">
|
||||||
<img :src="selectDetail.sketchMask" alt="" class="designOpenrtion_sketchMask" ref="sketchMask">
|
<img :src="selectDetail.sketchMask" alt="" class="designOpenrtion_sketchMask" ref="sketchMask">
|
||||||
<div class="designOpenrtion_btn" v-if="stateOverallSingle == 'single'" >
|
<div class="designOpenrtion_btn" v-if="stateOverallSingle == 'single'" >
|
||||||
<ul v-for="item,index in printStyleList[type][stateOverallSingle]" :key="item" :class="{active:item?.pattern.designOpenrtionBtn?item?.pattern.designOpenrtionBtn:false}" class="designOpenrtion_Mousingle" :style="item?.pattern.style" @mousedown.stop="itemMoveMousedown(index,getMousePosition($event,false))" @touchstart.passive="itemMoveMousedown(index,getMousePosition($event,true))">
|
<ul v-for="item,index in printStyleList[type][stateOverallSingle]" :key="item" :class="{active:item?.pattern.designOpenrtionBtn?item?.pattern.designOpenrtionBtn:false}" class="designOpenrtion_Mousingle" :style="item?.pattern.style" @mousedown.stop="itemMoveMousedown(index,getMousePosition($event,false))" @touchstart.passive="itemMoveMousedown(index,getMousePosition($event,true))">
|
||||||
@@ -160,7 +160,6 @@ export default defineComponent({
|
|||||||
selectDetail:computed(()=>store.state.DesignDetail.selectDetail),
|
selectDetail:computed(()=>store.state.DesignDetail.selectDetail),
|
||||||
currentDetailType:computed(()=>store.state.DesignDetail.currentDetailType),
|
currentDetailType:computed(()=>store.state.DesignDetail.currentDetailType),
|
||||||
currentPrintElement:computed(()=>store.state.DesignDetail.currentPrintElement),
|
currentPrintElement:computed(()=>store.state.DesignDetail.currentPrintElement),
|
||||||
systemDesignerPercentage:0,
|
|
||||||
printStyleList:{
|
printStyleList:{
|
||||||
print:{
|
print:{
|
||||||
single:[],
|
single:[],
|
||||||
@@ -174,7 +173,6 @@ export default defineComponent({
|
|||||||
type:props.type,
|
type:props.type,
|
||||||
imgDomIndex:-1,
|
imgDomIndex:-1,
|
||||||
direction:'',//判断点的那条边
|
direction:'',//判断点的那条边
|
||||||
printZIndex:2,//印花优先级
|
|
||||||
sketchWH:{
|
sketchWH:{
|
||||||
width:0,
|
width:0,
|
||||||
height:0,
|
height:0,
|
||||||
@@ -225,6 +223,7 @@ export default defineComponent({
|
|||||||
img.onload = ()=>{
|
img.onload = ()=>{
|
||||||
let imgScale = img.width / img.height
|
let imgScale = img.width / img.height
|
||||||
let zoom = 2
|
let zoom = 2
|
||||||
|
console.log(editPrintElementData.sketchWH)
|
||||||
let width = editPrintElementData.sketchWH.width / zoom
|
let width = editPrintElementData.sketchWH.width / zoom
|
||||||
let height = width / editPrintElementData.sketchWH.height
|
let height = width / editPrintElementData.sketchWH.height
|
||||||
|
|
||||||
@@ -234,29 +233,47 @@ export default defineComponent({
|
|||||||
let sketchH = editPrintElementData.sketchWH.height * editPrintElementData.sketchWH.scale[1]
|
let sketchH = editPrintElementData.sketchWH.height * editPrintElementData.sketchWH.scale[1]
|
||||||
let x = sketchW / 2 - (sketchW * (width / editPrintElementData.sketchWH.width)/2)
|
let x = sketchW / 2 - (sketchW * (width / editPrintElementData.sketchWH.width)/2)
|
||||||
let y = sketchH / 2 -(sketchH * height/2)
|
let y = sketchH / 2 -(sketchH * height/2)
|
||||||
if(!editPrintElementData.stateOverallSingle == 'single'){
|
if(editPrintElementData.stateOverallSingle !== 'single'){
|
||||||
x = sketchW / 2
|
x = sketchW / 2
|
||||||
y = sketchH / 2
|
y = sketchH / 2
|
||||||
}
|
}
|
||||||
let location = [x,y]
|
let location = [x,y]
|
||||||
resolve({scale,location})
|
resolve({scale,location})
|
||||||
}
|
}
|
||||||
img.src = item.url
|
img.src = item.url || item.path
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
const addPrintELement = async (data:any)=>{
|
const addPrintELement = async (data:any)=>{
|
||||||
if(!editPrintElementData.isSketchLoad)return
|
if(!editPrintElementData.isSketchLoad)return
|
||||||
let {scale,location} = await setScaleLocation(data)
|
let {scale,location} = await setScaleLocation(data)
|
||||||
|
let printIndex = 1
|
||||||
|
let allElementPrint = []
|
||||||
|
if(props.type == 'print'){
|
||||||
|
allElementPrint = [
|
||||||
|
...(editPrintElementData.printStyleList.print.single || []),
|
||||||
|
...(editPrintElementData.printStyleList.print.overall || []),
|
||||||
|
...(editPrintElementData.selectDetail.trims.prints || []),
|
||||||
|
]
|
||||||
|
}else{
|
||||||
|
allElementPrint = [
|
||||||
|
...(editPrintElementData.printStyleList.element.single || []),
|
||||||
|
...(editPrintElementData.selectDetail.printObject.prints || []),
|
||||||
|
]
|
||||||
|
}
|
||||||
|
if(allElementPrint.length >= 1){
|
||||||
|
printIndex = Math.max(...allElementPrint.map(item => Number(item.priority))) + 1
|
||||||
|
}
|
||||||
let item = {
|
let item = {
|
||||||
angle:0,
|
angle:0,
|
||||||
designType:data.designType,
|
designType:data.designType,
|
||||||
ifSingle:editPrintElementData.stateOverallSingle == 'single',
|
ifSingle:editPrintElementData.stateOverallSingle == 'single',
|
||||||
level2Type:data.level2Type,
|
level2Type:data.level2Type,
|
||||||
location:editPrintElementData.stateOverallSingle == 'single'?location:[0,0],
|
location:location,
|
||||||
|
// location:editPrintElementData.stateOverallSingle == 'single'?location:[0,0],
|
||||||
minIOPath:data.minIOPath || data.originalUrl,
|
minIOPath:data.minIOPath || data.originalUrl,
|
||||||
path:data.url,
|
path:data.url,
|
||||||
priority:editPrintElementData.printZIndex,
|
priority:printIndex,
|
||||||
scale,
|
scale:editPrintElementData.stateOverallSingle == 'single'?scale:[1,1],
|
||||||
globalCompositeOperation:'',
|
globalCompositeOperation:'',
|
||||||
}
|
}
|
||||||
getItemPosition(item)
|
getItemPosition(item)
|
||||||
@@ -283,10 +300,10 @@ export default defineComponent({
|
|||||||
// location = [item.pattern.style.left,item.pattern.style.top]
|
// location = [item.pattern.style.left,item.pattern.style.top]
|
||||||
}
|
}
|
||||||
let value ={
|
let value ={
|
||||||
angle : item.pattern.transform.rotateZ,
|
angle:0,
|
||||||
// angle : !this.overallSingle ? 0:item.pattern.transform.rotateZ,
|
// angle : !this.overallSingle ? 0:item.pattern.transform.rotateZ,
|
||||||
location : location,
|
location : location,
|
||||||
priority:index,
|
priority:item.priority,
|
||||||
scale: scale,
|
scale: scale,
|
||||||
designType:item.designType,
|
designType:item.designType,
|
||||||
level2Type:item.level2Type,
|
level2Type:item.level2Type,
|
||||||
@@ -295,16 +312,22 @@ export default defineComponent({
|
|||||||
ifSingle:!!item.ifSingle,
|
ifSingle:!!item.ifSingle,
|
||||||
globalCompositeOperation:'',
|
globalCompositeOperation:'',
|
||||||
}
|
}
|
||||||
if(item.object)value.object = item.object
|
if(item.object)value.object = item.object;
|
||||||
|
value.angle = value.ifSingle?item.pattern.transform.rotateZ:item.angle
|
||||||
|
|
||||||
return value
|
return value
|
||||||
}
|
}
|
||||||
if(editPrintElementData.printStyleList[props.type].single.length>0){
|
if(editPrintElementData.printStyleList[props.type].single.length>0){
|
||||||
sort(editPrintElementData.printStyleList[props.type].single)
|
sort(editPrintElementData.printStyleList[props.type].single)
|
||||||
}
|
}
|
||||||
|
if(editPrintElementData.printStyleList[props.type].overall.length>0){
|
||||||
|
sort(editPrintElementData.printStyleList[props.type].overall)
|
||||||
|
}
|
||||||
editPrintElementData.printStyleList[props.type].overall.forEach((item:any)=>{
|
editPrintElementData.printStyleList[props.type].overall.forEach((item:any)=>{
|
||||||
data.push(setData(item,index))
|
data.push(setData(item,index))
|
||||||
index++
|
index++
|
||||||
})
|
})
|
||||||
|
console.log(editPrintElementData.printStyleList[props.type].single)
|
||||||
editPrintElementData.printStyleList[props.type].single.forEach((item:any)=>{
|
editPrintElementData.printStyleList[props.type].single.forEach((item:any)=>{
|
||||||
data.push(setData(item,index))
|
data.push(setData(item,index))
|
||||||
index++
|
index++
|
||||||
@@ -314,6 +337,7 @@ export default defineComponent({
|
|||||||
str:props.type,
|
str:props.type,
|
||||||
id:id,
|
id:id,
|
||||||
}
|
}
|
||||||
|
console.log('data',value)
|
||||||
store.commit('DesignDetail/setNewDetail',value)
|
store.commit('DesignDetail/setNewDetail',value)
|
||||||
}
|
}
|
||||||
const sort = (list:any)=>{
|
const sort = (list:any)=>{
|
||||||
@@ -335,10 +359,9 @@ export default defineComponent({
|
|||||||
top = item.location[1] / editPrintElementData.sketchWH.scale[1]
|
top = item.location[1] / editPrintElementData.sketchWH.scale[1]
|
||||||
}else{
|
}else{
|
||||||
//overall
|
//overall
|
||||||
editPrintElementData.systemDesignerPercentage = item.scale[0]*1000
|
|
||||||
left = item.location[0] / editPrintElementData.sketchWH.scale[0]
|
left = item.location[0] / editPrintElementData.sketchWH.scale[0]
|
||||||
top = item.location[1] / editPrintElementData.sketchWH.scale[1]
|
top = item.location[1] / editPrintElementData.sketchWH.scale[1]
|
||||||
editPrintElementData.systemDesignerPercentage = item.scale?.[0]?item.scale[0]*100:30
|
item.scale = item.scale || [1,1]
|
||||||
}
|
}
|
||||||
let pattern = {
|
let pattern = {
|
||||||
centers:{left:0,top:0},
|
centers:{left:0,top:0},
|
||||||
@@ -356,7 +379,6 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
designOpenrtionBtn:false
|
designOpenrtionBtn:false
|
||||||
}
|
}
|
||||||
editPrintElementData.printZIndex++
|
|
||||||
item.pattern = pattern
|
item.pattern = pattern
|
||||||
|
|
||||||
if(item.object){
|
if(item.object){
|
||||||
@@ -371,7 +393,8 @@ export default defineComponent({
|
|||||||
angle: 0,
|
angle: 0,
|
||||||
flipX: false,
|
flipX: false,
|
||||||
flipY: false,
|
flipY: false,
|
||||||
blendMode: "multiply",
|
// blendMode: "multiply",
|
||||||
|
blendMode: "source-over",
|
||||||
gapX: 0,
|
gapX: 0,
|
||||||
gapY: 0,
|
gapY: 0,
|
||||||
}
|
}
|
||||||
@@ -379,69 +402,68 @@ export default defineComponent({
|
|||||||
item.object.blendMode = 'source-over'
|
item.object.blendMode = 'source-over'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(item.ifSingle && editPrintElementData.stateOverallSingle == 'single'){
|
if(item.ifSingle){
|
||||||
editPrintElementData.printStyleList[props.type].single.push(item)
|
editPrintElementData.printStyleList[props.type].single.push(item)
|
||||||
}
|
}
|
||||||
if(!item.ifSingle && editPrintElementData.stateOverallSingle == 'overall'){
|
if(!item.ifSingle){
|
||||||
item.token = Date.now().toString() + (editPrintElementData.printStyleList[props.type].overall.length + '')
|
item.token = Date.now().toString() + (editPrintElementData.printStyleList[props.type].overall.length + '')
|
||||||
// editPrintElementData.printStyleList[props.type].overall = []
|
// editPrintElementData.printStyleList[props.type].overall = []
|
||||||
editPrintElementData.printStyleList[props.type].overall.push(item)
|
editPrintElementData.printStyleList[props.type].overall.push(item)
|
||||||
setTimeout(()=>{
|
if(editPrintElementData.stateOverallSingle == 'overall'){
|
||||||
editPrintElementDom.pingpuRef.updataList([
|
setTimeout(()=>{
|
||||||
{
|
editPrintElementDom.pingpuRef.updataList([
|
||||||
action: ACTIONS.ADD,
|
{
|
||||||
data: item,
|
action: ACTIONS.ADD,
|
||||||
},
|
data: item,
|
||||||
]);
|
},
|
||||||
})
|
]);
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const setPosition = ()=>{
|
const setPosition = async ()=>{
|
||||||
nextTick(()=>{
|
await new Promise<void>((resolve, reject) => {
|
||||||
let img = new Image
|
nextTick(()=>{
|
||||||
img.onload = ()=>{
|
let img = new Image
|
||||||
// let sketchScale = editPrintElementData.selectDetail.layersObject[0].scale
|
img.onload = ()=>{
|
||||||
let sketchScale = [1,1]
|
// let sketchScale = editPrintElementData.selectDetail.layersObject[0].scale
|
||||||
let scaleX = img.width * sketchScale[0] / editPrintElementDom.sketchImg.offsetWidth
|
let sketchScale = [1,1]
|
||||||
let scaleY = img.height * sketchScale[1] / editPrintElementDom.sketchImg.offsetHeight
|
let scaleX = img.width * sketchScale[0] / editPrintElementDom.sketchImg.offsetWidth
|
||||||
|
let scaleY = img.height * sketchScale[1] / editPrintElementDom.sketchImg.offsetHeight
|
||||||
|
|
||||||
editPrintElementData.sketchWH = {
|
editPrintElementData.sketchWH = {
|
||||||
width:editPrintElementDom.sketchImg.offsetWidth,
|
width:editPrintElementDom.sketchImg.offsetWidth,
|
||||||
height:editPrintElementDom.sketchImg.offsetHeight,
|
height:editPrintElementDom.sketchImg.offsetHeight,
|
||||||
scale:[scaleX,scaleY],
|
scale:[scaleX,scaleY],
|
||||||
|
}
|
||||||
|
if(!editPrintElementData.selectDetail.printObject.prints)return
|
||||||
|
let state = true
|
||||||
|
// editPrintElementData.stateOverallSingle = 'single'
|
||||||
|
let arr:any = editPrintElementData.selectDetail.printObject.prints
|
||||||
|
if(props.type == 'element'){
|
||||||
|
arr = editPrintElementData.selectDetail.trims.prints
|
||||||
|
}
|
||||||
|
// if(editPrintElementData.selectDetail.newDetail?.[editPrintElementData.currentDetailType]){
|
||||||
|
// arr = editPrintElementData.selectDetail.newDetail[editPrintElementData.currentDetailType]
|
||||||
|
// }
|
||||||
|
if(arr && arr.length > 0){
|
||||||
|
editPrintElementData.printStyleList[props.type].single = []
|
||||||
|
editPrintElementData.printStyleList[props.type].overall = []
|
||||||
|
arr.forEach((item:any)=>{
|
||||||
|
// if(!item.ifSingle){
|
||||||
|
// editPrintElementData.stateOverallSingle = 'overall',
|
||||||
|
// state = false
|
||||||
|
// }
|
||||||
|
getItemPosition(item)
|
||||||
|
})
|
||||||
|
setItemPosition()
|
||||||
|
}
|
||||||
|
resolve('')
|
||||||
}
|
}
|
||||||
if(!editPrintElementData.selectDetail.printObject.prints)return
|
img.src = editPrintElementData.selectDetail.path
|
||||||
let state = true
|
})
|
||||||
// editPrintElementData.stateOverallSingle = 'single'
|
|
||||||
let arr:any = editPrintElementData.selectDetail.newDetail?.print || editPrintElementData.selectDetail.printObject.prints
|
|
||||||
if(props.type == 'element'){
|
|
||||||
arr = editPrintElementData.selectDetail.newDetail?.element || editPrintElementData.selectDetail.trims.prints
|
|
||||||
}
|
|
||||||
if(editPrintElementData.selectDetail.newDetail?.[editPrintElementData.currentDetailType]){
|
|
||||||
arr = editPrintElementData.selectDetail.newDetail[editPrintElementData.currentDetailType]
|
|
||||||
}
|
|
||||||
if(arr && arr.length > 0){
|
|
||||||
editPrintElementData.printStyleList[props.type].single = []
|
|
||||||
editPrintElementData.printStyleList[props.type].overall = []
|
|
||||||
arr.forEach((item:any)=>{
|
|
||||||
// if(!item.ifSingle){
|
|
||||||
// editPrintElementData.stateOverallSingle = 'overall',
|
|
||||||
// state = false
|
|
||||||
// }
|
|
||||||
getItemPosition(item)
|
|
||||||
})
|
|
||||||
setItemPosition()
|
|
||||||
}
|
|
||||||
// if(props.type == 'print'){
|
|
||||||
// editPrintElementData.overallSingle = state
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
// undividedLayer
|
|
||||||
//计算宽高使用editPrintElementData.selectDetail.path
|
|
||||||
// img.src = editPrintElementData.selectDetail.path
|
|
||||||
img.src = editPrintElementData.selectDetail.undividedLayer?editPrintElementData.selectDetail.undividedLayer:editPrintElementData.selectDetail.path
|
|
||||||
})
|
})
|
||||||
|
|
||||||
}
|
}
|
||||||
// watch(()=>editPrintElementData.selectDetail?.id,(newVal)=>{
|
// watch(()=>editPrintElementData.selectDetail?.id,(newVal)=>{
|
||||||
// if(!newVal)return
|
// if(!newVal)return
|
||||||
@@ -472,6 +494,7 @@ export default defineComponent({
|
|||||||
setPosition()
|
setPosition()
|
||||||
},{immediate: true,})
|
},{immediate: true,})
|
||||||
watch(()=>editPrintElementData.stateOverallSingle,(newVal)=>{
|
watch(()=>editPrintElementData.stateOverallSingle,(newVal)=>{
|
||||||
|
previewDetailPrintData()
|
||||||
let arr:any = editPrintElementData.selectDetail.newDetail?.print || editPrintElementData.selectDetail.printObject.prints
|
let arr:any = editPrintElementData.selectDetail.newDetail?.print || editPrintElementData.selectDetail.printObject.prints
|
||||||
if(props.type == 'element'){
|
if(props.type == 'element'){
|
||||||
arr = editPrintElementData.selectDetail.newDetail?.element || editPrintElementData.selectDetail.trims.prints
|
arr = editPrintElementData.selectDetail.newDetail?.element || editPrintElementData.selectDetail.trims.prints
|
||||||
@@ -481,9 +504,8 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
if(arr.length > 0){
|
if(arr.length > 0){
|
||||||
editPrintElementData.imgDomIndex = 0
|
editPrintElementData.imgDomIndex = 0
|
||||||
editPrintElementData.printStyleList[props.type][newVal] = []
|
editPrintElementData.printStyleList[props.type].single = []
|
||||||
// editPrintElementData.printStyleList[props.type].single = []
|
editPrintElementData.printStyleList[props.type].overall = []
|
||||||
// editPrintElementData.printStyleList[props.type].overall = []
|
|
||||||
arr.forEach((item:any,index:number) => {
|
arr.forEach((item:any,index:number) => {
|
||||||
getItemPosition(item)
|
getItemPosition(item)
|
||||||
});
|
});
|
||||||
@@ -515,7 +537,6 @@ export default defineComponent({
|
|||||||
let scale = Number(editPrintElementDom.imgDom.children[0].style.transform?.split('scale(')[1]?.split(')')[0])
|
let scale = Number(editPrintElementDom.imgDom.children[0].style.transform?.split('scale(')[1]?.split(')')[0])
|
||||||
let rotateZ = Number(editPrintElementDom.imgDom.children[0].style.transform?.split('rotateZ(')[1]?.split('deg')[0])
|
let rotateZ = Number(editPrintElementDom.imgDom.children[0].style.transform?.split('rotateZ(')[1]?.split('deg')[0])
|
||||||
editPrintElementData.printStyleList[props.type][editPrintElementData.stateOverallSingle][index].pattern.designOpenrtionBtn = true
|
editPrintElementData.printStyleList[props.type][editPrintElementData.stateOverallSingle][index].pattern.designOpenrtionBtn = true
|
||||||
// editPrintElementData.printStyleList[props.type][editPrintElementData.stateOverallSingle][index].pattern.style.zIndex = editPrintElementData.printZIndex++
|
|
||||||
editPrintElementData.printStyleList[props.type][editPrintElementData.stateOverallSingle][index].pattern.transform = {
|
editPrintElementData.printStyleList[props.type][editPrintElementData.stateOverallSingle][index].pattern.transform = {
|
||||||
scale:scale,
|
scale:scale,
|
||||||
rotateZ:rotateZ?rotateZ:0,
|
rotateZ:rotateZ?rotateZ:0,
|
||||||
@@ -649,7 +670,6 @@ export default defineComponent({
|
|||||||
top:editPrintElementDom.imgDom.offsetTop+'px',
|
top:editPrintElementDom.imgDom.offsetTop+'px',
|
||||||
height:editPrintElementDom.imgDom.offsetHeight+'px',
|
height:editPrintElementDom.imgDom.offsetHeight+'px',
|
||||||
width:editPrintElementDom.imgDom.offsetWidth+'px',
|
width:editPrintElementDom.imgDom.offsetWidth+'px',
|
||||||
// zIndex:editPrintElementData.printZIndex
|
|
||||||
}
|
}
|
||||||
document.removeEventListener('mousemove',sizeMouseMove)
|
document.removeEventListener('mousemove',sizeMouseMove)
|
||||||
document.removeEventListener('touchmove',sizeTouchmove)
|
document.removeEventListener('touchmove',sizeTouchmove)
|
||||||
@@ -801,7 +821,8 @@ export default defineComponent({
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
elList[item.index].sort = moveIndex;
|
let index = elList.findIndex((elListItem:any)=>item.id == elListItem.id)
|
||||||
|
elList[index].sort = moveIndex;
|
||||||
moveItem();
|
moveItem();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -832,6 +853,7 @@ export default defineComponent({
|
|||||||
collItemSize.elList.forEach((elItem:any)=>{
|
collItemSize.elList.forEach((elItem:any)=>{
|
||||||
let clothesIndex = arr.findIndex((item:any)=>item.uniqueId == elItem.uniqueId)
|
let clothesIndex = arr.findIndex((item:any)=>item.uniqueId == elItem.uniqueId)
|
||||||
arr[clothesIndex].pattern.style.zIndex = elItem.sort
|
arr[clothesIndex].pattern.style.zIndex = elItem.sort
|
||||||
|
arr[clothesIndex].priority = elItem.id.split('_')[0]
|
||||||
// let clothesId = editPrintElementData.designDetail.clothes[clothesIndex].id
|
// let clothesId = editPrintElementData.designDetail.clothes[clothesIndex].id
|
||||||
// editPrintElementData.designDetail.clothes[clothesIndex].priority = elItem.sort
|
// editPrintElementData.designDetail.clothes[clothesIndex].priority = elItem.sort
|
||||||
// let frontIndex = editPrintElementData.frontBack_.front.findIndex((item:any)=>item.id == clothesId)
|
// let frontIndex = editPrintElementData.frontBack_.front.findIndex((item:any)=>item.id == clothesId)
|
||||||
@@ -852,7 +874,6 @@ export default defineComponent({
|
|||||||
let arr:any = editPrintElementData.printStyleList[props.type][editPrintElementData.stateOverallSingle]
|
let arr:any = editPrintElementData.printStyleList[props.type][editPrintElementData.stateOverallSingle]
|
||||||
|
|
||||||
arr.forEach((item,index) => {item.uniqueId = `${Date.now()}_${index}`});
|
arr.forEach((item,index) => {item.uniqueId = `${Date.now()}_${index}`});
|
||||||
|
|
||||||
const sortedArray = [...arr].sort((a, b) => a.priority - b.priority);
|
const sortedArray = [...arr].sort((a, b) => a.priority - b.priority);
|
||||||
const sortMap = {} as any;
|
const sortMap = {} as any;
|
||||||
sortedArray.forEach((item, index) => {
|
sortedArray.forEach((item, index) => {
|
||||||
@@ -863,7 +884,8 @@ export default defineComponent({
|
|||||||
el: elArr[i],
|
el: elArr[i],
|
||||||
// sort: elArr.length - i -1,
|
// sort: elArr.length - i -1,
|
||||||
sort: sortMap[arr[i].priority],
|
sort: sortMap[arr[i].priority],
|
||||||
index: i,
|
id: `${arr[i].priority}_${Date.now() + i}`,
|
||||||
|
// index: i,
|
||||||
uniqueId:arr[i]?.uniqueId || 99999,
|
uniqueId:arr[i]?.uniqueId || 99999,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -895,6 +917,7 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
const inputFillAngle = (angle:any)=>{
|
const inputFillAngle = (angle:any)=>{
|
||||||
let arr = editPrintElementData.printStyleList[props.type].overall
|
let arr = editPrintElementData.printStyleList[props.type].overall
|
||||||
|
console.log(angle)
|
||||||
arr[editPrintElementData.imgDomIndex].angle = angle
|
arr[editPrintElementData.imgDomIndex].angle = angle
|
||||||
editPrintElementDom.pingpuRef.updataList([
|
editPrintElementDom.pingpuRef.updataList([
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="repeat-setting">
|
<div class="repeat-setting" v-if="!mask">
|
||||||
{{ }}
|
|
||||||
<div class="repeat-setting-item">
|
<div class="repeat-setting-item">
|
||||||
<span class="label">{{ t("Canvas.angle") }}</span>
|
<span class="label">{{ t("Canvas.angle") }}</span>
|
||||||
<angle-tool
|
<angle-tool
|
||||||
@@ -17,7 +16,7 @@
|
|||||||
:max="1000"
|
:max="1000"
|
||||||
:step="1"
|
:step="1"
|
||||||
is-input
|
is-input
|
||||||
:tipFormatter="(v) => `${scale.toFixed(0)}%`"
|
:tipFormatter="(v) => `${Number(scale)?.toFixed(0)}%`"
|
||||||
:value="scale"
|
:value="scale"
|
||||||
@input="inputFillScale"
|
@input="inputFillScale"
|
||||||
/>
|
/>
|
||||||
@@ -26,7 +25,7 @@
|
|||||||
<div class="repeat-setting-item">
|
<div class="repeat-setting-item">
|
||||||
<span class="label">Gap X</span>
|
<span class="label">Gap X</span>
|
||||||
<slider
|
<slider
|
||||||
:min="0"
|
:min="1"
|
||||||
:max="1000"
|
:max="1000"
|
||||||
:step="1"
|
:step="1"
|
||||||
is-input
|
is-input
|
||||||
@@ -40,7 +39,7 @@
|
|||||||
<div class="repeat-setting-item">
|
<div class="repeat-setting-item">
|
||||||
<span class="label">Gap Y</span>
|
<span class="label">Gap Y</span>
|
||||||
<slider
|
<slider
|
||||||
:min="0"
|
:min="1"
|
||||||
:max="1000"
|
:max="1000"
|
||||||
:step="1"
|
:step="1"
|
||||||
is-input
|
is-input
|
||||||
@@ -85,8 +84,15 @@
|
|||||||
const scale = computed(() => {
|
const scale = computed(() => {
|
||||||
// let scaleValue = props.object?.scale/10;
|
// let scaleValue = props.object?.scale/10;
|
||||||
// return props.object?.scale/10;
|
// return props.object?.scale/10;
|
||||||
return props.object?.scale[0] * 100;
|
return (props.object?.scale[0] * 100).toFixed(0);
|
||||||
});
|
});
|
||||||
|
const scalePrint = computed(() => {
|
||||||
|
let index = sketchWH.value[0] > sketchWH.value[1]?0:1;
|
||||||
|
return sketchWH.value[index] / printWH.value[index] * scale.value / 5;
|
||||||
|
});
|
||||||
|
const printWH = ref([0,0])
|
||||||
|
const sketchWH = ref([0,0])
|
||||||
|
const mask = ref(false)
|
||||||
const offset = ref([0,0])
|
const offset = ref([0,0])
|
||||||
const sketchSize:any = async ()=>{
|
const sketchSize:any = async ()=>{
|
||||||
let img = new Image();
|
let img = new Image();
|
||||||
@@ -102,10 +108,27 @@
|
|||||||
});
|
});
|
||||||
return size
|
return size
|
||||||
}
|
}
|
||||||
|
const printSize:any = async ()=>{
|
||||||
|
let img = new Image();
|
||||||
|
let size = [0,0];
|
||||||
|
img.src = props.sketchPath;
|
||||||
|
console.log(props.sketchPath)
|
||||||
|
await new Promise((resolve, reject) => {
|
||||||
|
img.onload = () => {
|
||||||
|
size = [img.width, img.height]
|
||||||
|
resolve([img.width, img.height]);
|
||||||
|
}
|
||||||
|
img.onerror = reject;
|
||||||
|
});
|
||||||
|
return size
|
||||||
|
}
|
||||||
watch (() => props.object.path || props.object.location, async () => {
|
watch (() => props.object.path || props.object.location, async () => {
|
||||||
let size = await sketchSize();
|
mask.value = true
|
||||||
offset.value[0] = props.object.location[0] / size[0] * 100;
|
sketchWH.value = await sketchSize();
|
||||||
offset.value[1] = props.object.location[1] / size[1] * 100;
|
printWH.value = await printSize();
|
||||||
|
offset.value[0] = props.object.location[0] / sketchWH.value[0] * 100;
|
||||||
|
offset.value[1] = props.object.location[1] / sketchWH.value[1] * 100;
|
||||||
|
mask.value = false
|
||||||
},{immediate: true})
|
},{immediate: true})
|
||||||
const gapX = computed(() => props.object.object?.gapX || 0);
|
const gapX = computed(() => props.object.object?.gapX || 0);
|
||||||
const gapY = computed(() => props.object.object?.gapY || 0);
|
const gapY = computed(() => props.object.object?.gapY || 0);
|
||||||
@@ -121,7 +144,6 @@
|
|||||||
]);
|
]);
|
||||||
const inputFillScale = (e) => {
|
const inputFillScale = (e) => {
|
||||||
const scale = e / 100;
|
const scale = e / 100;
|
||||||
console.log(scale.toFixed(2))
|
|
||||||
emit("inputFillScale", scale.toFixed(2));
|
emit("inputFillScale", scale.toFixed(2));
|
||||||
};
|
};
|
||||||
const inputOffset = async (e:any)=>{
|
const inputOffset = async (e:any)=>{
|
||||||
@@ -133,6 +155,7 @@
|
|||||||
.repeat-setting {
|
.repeat-setting {
|
||||||
user-select: none;
|
user-select: none;
|
||||||
width: 228px;
|
width: 228px;
|
||||||
|
overflow: hidden;
|
||||||
> .title {
|
> .title {
|
||||||
line-height: 35px;
|
line-height: 35px;
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
@click="selectDetailItem(item,index)">
|
@click="selectDetailItem(item,index)">
|
||||||
<div class="iconList">
|
<div class="iconList">
|
||||||
<i class="fi fi-rr-add" :class="{ active:item.scope == 'sys'}" @click.stop="sketchSystemToLibrary(item)"></i>
|
<i class="fi fi-rr-add" :class="{ active:item.scope == 'sys'}" @click.stop="sketchSystemToLibrary(item)"></i>
|
||||||
<i class="fi fi-rr-trash" @click.stop="deleteDetailItem(item?.id)"></i>
|
<i v-if="probjects?.httpType !== 'SINGLE_DESIGN'" class="fi fi-rr-trash" @click.stop="deleteDetailItem(item?.id)"></i>
|
||||||
</div>
|
</div>
|
||||||
<img :src="item.path" alt="">
|
<img :src="item.path" alt="">
|
||||||
<div class="type">{{ getTypeLang(item.type) }}</div>
|
<div class="type">{{ getTypeLang(item.type) }}</div>
|
||||||
@@ -41,6 +41,7 @@ export default defineComponent({
|
|||||||
const store = useStore();
|
const store = useStore();
|
||||||
const {t} = useI18n()
|
const {t} = useI18n()
|
||||||
const detailData = reactive({
|
const detailData = reactive({
|
||||||
|
probjects:computed(()=>store.state.Workspace.probjects),
|
||||||
selectDetail:computed(()=>store.state.DesignDetail.selectDetail),
|
selectDetail:computed(()=>store.state.DesignDetail.selectDetail),
|
||||||
frontBack_:computed(()=>store.state.DesignDetail.frontBack),
|
frontBack_:computed(()=>store.state.DesignDetail.frontBack),
|
||||||
designDetail:computed(()=>store.state.DesignDetail.designDetail),
|
designDetail:computed(()=>store.state.DesignDetail.designDetail),
|
||||||
|
|||||||
705
src/component/Detail/model/modelPosition copy.vue
Normal file
@@ -0,0 +1,705 @@
|
|||||||
|
<template>
|
||||||
|
<div class="molepositon" :class="{active:!imgDesignImg}">
|
||||||
|
<div class="designOpenrtion_imgMask" v-if="frontBack?.body?.path" :style="frontBack?.body?.style">
|
||||||
|
<div class="designOpenrtion_print" v-for="item,index in frontBack.back" :style="frontBack.front[index].style">
|
||||||
|
<img :style="item.imageUrl?'':'display:none;'" :src="item.imageUrl" alt="">
|
||||||
|
</div>
|
||||||
|
<img class="perview_img" @load="setPrintSize()" ref="detailBody" :key="designDetail.designItemId" :src="frontBack?.body?.path" :style="'width:'+ frontBack?.body?.layersObject?.[0].imageSize?.[0] +';height:' + frontBack?.body?.layersObject?.[0].imageSize?.[0] +';'">
|
||||||
|
<!-- <div class="detail_modal_item_front" ref="target" v-for="item,index in frontBack.front" @mousedown.stop="itemMoveMousedown(index,getMousePosition($event,false))" @touchstart.passive="itemMoveMousedown(index,getMousePosition($event,true))" @click="setpitch(item,index)" :style="item.style">
|
||||||
|
<img :src="item.imageUrl" alt="">
|
||||||
|
</div> -->
|
||||||
|
<div class="detail_modal_item_front" :ref="el => { setElementRef(el, index) }" v-for="item,index in frontBack.front" :class="{'active':item.id == selectDetail?.id}" :style="item.style">
|
||||||
|
<img :src="item.imageUrl" alt="">
|
||||||
|
</div>
|
||||||
|
<div ref="moveableContainer" class="moveableContainer"></div>
|
||||||
|
</div>
|
||||||
|
<div class="designOpenrtion_imgMask" v-if="!frontBack?.body?.path">
|
||||||
|
<div class="designOpenrtion_print">
|
||||||
|
<img v-if="frontBack.back?.[0].imageUrl" :src="frontBack.back?.[0].imageUrl" style="object-fit: cover;" alt="">
|
||||||
|
</div>
|
||||||
|
<div class="detail_modal_item_front" style="position: relative;">
|
||||||
|
<img :src="frontBack.front?.[0].imageUrl || selectDetail?.path" style="object-fit: cover;" alt="">
|
||||||
|
</div>
|
||||||
|
<!-- <img @load="setSelectSketch()" :src="designDetail?.currentFullBodyView || selectDetail?.undividedLayer" style="object-fit: cover;" alt=""> -->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="molepositon imgDesignImg" :class="{active:imgDesignImg}">
|
||||||
|
<div class="designOpenrtion_imgMask" style="width: 100%;height: 100%;">
|
||||||
|
<div class="detail_modal_item_front">
|
||||||
|
<img
|
||||||
|
style="object-fit: cover;"
|
||||||
|
:style="observerWH.width > 0?{width:observerWH.width+'px',height:observerWH.height+'px'}:{width:'100%',height:'auto','object-fit': 'contain'}"
|
||||||
|
:src="designDetail.designItemUrl" alt="">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent,computed,inject,watch,nextTick,createVNode,toRefs, reactive, onUnmounted} from 'vue'
|
||||||
|
// import setDesignItem from '@/component/Detail/setDesignItem2.vue'
|
||||||
|
import { ExclamationCircleOutlined } from '@ant-design/icons-vue';
|
||||||
|
import { Https } from "@/tool/https";
|
||||||
|
import { useStore } from "vuex";
|
||||||
|
import { useI18n } from 'vue-i18n'
|
||||||
|
import { getMousePosition } from "@/tool/mdEvent";
|
||||||
|
import { KeyValueDB } from "@/tool/indexedDB";
|
||||||
|
import Vue3Moveable from 'vue3-moveable';
|
||||||
|
import Moveable from 'moveable';
|
||||||
|
import { parse } from 'vue/compiler-sfc';
|
||||||
|
import { scale } from 'echarts/types/src/scale/helper.js';
|
||||||
|
export default defineComponent({
|
||||||
|
components:{
|
||||||
|
},
|
||||||
|
props:{
|
||||||
|
imgDesignImg:{
|
||||||
|
default:false,
|
||||||
|
type:Boolean,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
emits:['addSketch'],
|
||||||
|
setup(props,{emit}) {
|
||||||
|
const {t} = useI18n()
|
||||||
|
const store = useStore();
|
||||||
|
const detailData = reactive({
|
||||||
|
frontBack:computed(()=>store.state.DesignDetail.frontBack),
|
||||||
|
designDetail:computed(()=>store.state.DesignDetail.designDetail),
|
||||||
|
selectDetail:computed(()=>store.state.DesignDetail.selectDetail),
|
||||||
|
isEditPattern:inject('isEditPattern') as any,
|
||||||
|
singleOveral:inject('singleOveral') as any,
|
||||||
|
detailBody:null as any,
|
||||||
|
observer:null as any,
|
||||||
|
observerWH:{
|
||||||
|
width:0,
|
||||||
|
height:0,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
const selectItem = reactive({
|
||||||
|
selectDetail:computed(()=>store.state.DesignDetail.selectDetail),
|
||||||
|
imgDomIndex:-1,
|
||||||
|
printZIndex:store.state.DesignDetail.printZIndex,
|
||||||
|
imgDom:null as any,
|
||||||
|
direction:'',
|
||||||
|
})
|
||||||
|
|
||||||
|
watch(()=>detailData.frontBack?.body?.path,(newVal)=>{
|
||||||
|
setPrintSize()
|
||||||
|
})
|
||||||
|
const setPrintSize = ()=>{
|
||||||
|
nextTick(()=>{
|
||||||
|
let sacle = 0
|
||||||
|
const img = new Image();
|
||||||
|
let dom = document.querySelector('.molepositon .perview_img') as any
|
||||||
|
if(!detailData.frontBack?.body?.path || !dom)return
|
||||||
|
img.onload = () => {
|
||||||
|
//监听模特图片宽度设置整体图片宽度
|
||||||
|
if (detailData.observer) {
|
||||||
|
detailData.observer.disconnect()
|
||||||
|
}
|
||||||
|
detailData.observerWH.width = dom.width
|
||||||
|
detailData.observerWH.height = dom.height
|
||||||
|
detailData.observer = new ResizeObserver((entries) => {
|
||||||
|
if(entries[0].contentRect.width == 0)return
|
||||||
|
detailData.observerWH.width = Math.floor(entries[0].contentRect.width)
|
||||||
|
detailData.observerWH.height = Math.floor(entries[0].contentRect.height)
|
||||||
|
})
|
||||||
|
detailData.observer.observe(dom)
|
||||||
|
|
||||||
|
|
||||||
|
if(detailData.designDetail.clothes.length == 0){
|
||||||
|
store.commit('DesignDetail/addDesignColthes')
|
||||||
|
emit('addSketch')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if(!detailData.selectDetail?.id){
|
||||||
|
let item = detailData.designDetail.clothes.reduce((max, current) => {
|
||||||
|
return current.priority > max.priority ? current : max;
|
||||||
|
});
|
||||||
|
store.commit('DesignDetail/setDesignColthes',item.id)
|
||||||
|
}
|
||||||
|
// resolve(img)
|
||||||
|
sacle = dom.parentNode.offsetWidth / img.width
|
||||||
|
detailData.frontBack.front.forEach((item:any,index:number) => {
|
||||||
|
for (const key in item.style) {
|
||||||
|
if(key == 'zIndex')return
|
||||||
|
let value = item.style[key]
|
||||||
|
if(typeof value !== 'number'){
|
||||||
|
value = value.replace('px','')
|
||||||
|
item.style[key] = value
|
||||||
|
}else{
|
||||||
|
item.style[key] = value*sacle+'px'
|
||||||
|
}
|
||||||
|
// item.style[key] = value*sacle+'px'
|
||||||
|
}
|
||||||
|
for (const key in detailData.frontBack.back[index].style) {
|
||||||
|
if(key == 'zIndex')return
|
||||||
|
if(key == 'transform')return
|
||||||
|
let value = detailData.frontBack.back[index].style[key]
|
||||||
|
if(typeof value !== 'number'){
|
||||||
|
value = value.replace('px','')
|
||||||
|
detailData.frontBack.back[index].style[key] = value
|
||||||
|
}else{
|
||||||
|
detailData.frontBack.back[index].style[key] = value*sacle+'px'
|
||||||
|
}
|
||||||
|
// detailData.frontBack.back[index].style[key] = value*sacle+'px'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
setTimeout(() => {
|
||||||
|
initMoveableForSelected()
|
||||||
|
},500);
|
||||||
|
};
|
||||||
|
img.src = detailData.frontBack?.body?.path;
|
||||||
|
})
|
||||||
|
}
|
||||||
|
const getDetailListDom = reactive({
|
||||||
|
libraryList:null as any,
|
||||||
|
moveableContainer:null as any,//控件层
|
||||||
|
})
|
||||||
|
|
||||||
|
const elementRefs = ref([]) as any;
|
||||||
|
const moveableInstance = ref(null) as any;
|
||||||
|
const setElementRef = (el, index) => {
|
||||||
|
elementRefs.value[index] = el;
|
||||||
|
};
|
||||||
|
const updateRect = ()=>{
|
||||||
|
setTimeout(() => {
|
||||||
|
if(moveableInstance.value)moveableInstance.value.updateRect()
|
||||||
|
}, 200);
|
||||||
|
}
|
||||||
|
const initMoveableForSelected = () => {
|
||||||
|
// 销毁旧的实例
|
||||||
|
if(selectItem.imgDomIndex == -1)return
|
||||||
|
if (moveableInstance.value) {
|
||||||
|
moveableInstance.value.destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
const selectedEl = elementRefs.value[selectItem.imgDomIndex];
|
||||||
|
if (!selectedEl) return;
|
||||||
|
if(!selectedEl.style.left)return
|
||||||
|
moveableInstance.value = new Moveable(getDetailListDom.moveableContainer, {
|
||||||
|
target: selectedEl,
|
||||||
|
draggable: true,
|
||||||
|
scalable: true,
|
||||||
|
rotatable: true,
|
||||||
|
keepRatio: false, // 等比缩放
|
||||||
|
snappable: true,
|
||||||
|
snapThreshold: 5,
|
||||||
|
edge: false,
|
||||||
|
});
|
||||||
|
let startPosition = {//记录初始位置
|
||||||
|
left: 0,
|
||||||
|
top: 0,
|
||||||
|
}
|
||||||
|
moveableInstance.value.on('scaleStart', ({ target, direction }) => {
|
||||||
|
const frontStyle = detailData.frontBack.front[selectItem.imgDomIndex];
|
||||||
|
if (!frontStyle.mirror){
|
||||||
|
let scaleX = frontStyle.style.transform.match(/scaleX\(([-\d.]+)\)/);
|
||||||
|
let scaleY = frontStyle.style.transform.match(/scaleY\(([-\d.]+)\)/);
|
||||||
|
frontStyle.mirror = { x: scaleX[1] == '-1' ? true : false, y: scaleY[1] == '-1' ? true : false };
|
||||||
|
}
|
||||||
|
});
|
||||||
|
moveableInstance.value.on('rotateStart', ({ target, direction }) => {
|
||||||
|
const frontStyle = detailData.frontBack.front[selectItem.imgDomIndex];
|
||||||
|
if (!frontStyle.mirror){
|
||||||
|
let scaleX = frontStyle.style.transform.match(/scaleX\(([-\d.]+)\)/);
|
||||||
|
let scaleY = frontStyle.style.transform.match(/scaleY\(([-\d.]+)\)/);
|
||||||
|
frontStyle.mirror = { x: scaleX[1] == '-1' ? true : false, y: scaleY[1] == '-1' ? true : false };
|
||||||
|
}
|
||||||
|
});
|
||||||
|
moveableInstance.value.on('dragStart', ({ target, clientX, clientY }) => {
|
||||||
|
startPosition = {
|
||||||
|
left:parseFloat(selectedEl.style.left.replace('px','')) || 0,
|
||||||
|
top:parseFloat(selectedEl.style.top.replace('px','')) || 0,
|
||||||
|
}
|
||||||
|
});
|
||||||
|
// 拖拽
|
||||||
|
moveableInstance.value.on('drag', ({ target, beforeTranslate }) => {
|
||||||
|
let x = startPosition.left + beforeTranslate[0]
|
||||||
|
let y = startPosition.top + beforeTranslate[1]
|
||||||
|
detailData.frontBack.front[selectItem.imgDomIndex].style.left = x + 'px'
|
||||||
|
detailData.frontBack.front[selectItem.imgDomIndex].style.top = y + 'px'
|
||||||
|
});
|
||||||
|
const updateElementTransform = (element, rotateDeg = null) => {
|
||||||
|
|
||||||
|
const currentTransform = element.style?.transform || '';
|
||||||
|
// 1. 提取当前的所有rotate
|
||||||
|
const currentRotates = (currentTransform.match(/rotate[XYZ]?\([^)]+\)/g) || []);
|
||||||
|
// 2. 获取除镜像和rotate外的其他所有变换
|
||||||
|
let otherTransforms = currentTransform
|
||||||
|
.replace(/scaleX\(-1\)|scaleY\(-1\)/g, '') // 移除镜像
|
||||||
|
.replace(/rotate[XYZ]?\([^)]+\)/g, '') // 移除rotate
|
||||||
|
.replace(/\s+/g, ' ')
|
||||||
|
.trim();
|
||||||
|
// 3. 构建新transform
|
||||||
|
const transforms = [];
|
||||||
|
// 镜像部分
|
||||||
|
if (element.mirror.x) transforms.push('scaleX(-1)');
|
||||||
|
if (element.mirror.y) transforms.push('scaleY(-1)');
|
||||||
|
if (otherTransforms) transforms.push(otherTransforms);
|
||||||
|
if (rotateDeg !== null) {
|
||||||
|
transforms.push(`rotate(${rotateDeg}deg)`);
|
||||||
|
} else if (currentRotates.length > 0) {
|
||||||
|
transforms.push(...currentRotates);
|
||||||
|
}
|
||||||
|
element.style.transform = transforms.join(' ').trim();
|
||||||
|
};
|
||||||
|
|
||||||
|
moveableInstance.value.on('scale', ({ target, delta, direction }) => {
|
||||||
|
const frontStyle = detailData.frontBack.front[selectItem.imgDomIndex];
|
||||||
|
if (!frontStyle.mirror) frontStyle.mirror = { x: false, y: false };
|
||||||
|
|
||||||
|
const width = parseFloat(frontStyle.style.width);
|
||||||
|
const height = parseFloat(frontStyle.style.height);
|
||||||
|
let left = parseFloat(frontStyle.style.left) || 0;
|
||||||
|
let top = parseFloat(frontStyle.style.top) || 0;
|
||||||
|
let rotation = 0;
|
||||||
|
// 获取原始比例
|
||||||
|
const originalRatio = width / height;
|
||||||
|
if (frontStyle.style.transform) {
|
||||||
|
const transform = frontStyle.style.transform;
|
||||||
|
const match = transform.match(/rotate\(([-\d.]+)deg\)/);
|
||||||
|
if (match) {
|
||||||
|
rotation = parseFloat(match[1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 根据旋转角度重新计算控制点的方向
|
||||||
|
function getAdjustedCorner(originalCorner, rotationAngle) {
|
||||||
|
const angleRad = rotationAngle * (Math.PI / 180);
|
||||||
|
const cosA = Math.cos(angleRad);
|
||||||
|
const sinA = Math.sin(angleRad);
|
||||||
|
const newX = originalCorner.x * cosA - originalCorner.y * sinA;
|
||||||
|
const newY = originalCorner.x * sinA + originalCorner.y * cosA;
|
||||||
|
const threshold = 0.5;
|
||||||
|
return {
|
||||||
|
x: Math.abs(newX) > threshold ? (newX > 0 ? 1 : -1) : 0,
|
||||||
|
y: Math.abs(newY) > threshold ? (newY > 0 ? 1 : -1) : 0
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rotation !== 0) {
|
||||||
|
direction = getAdjustedCorner({x: direction[0], y: direction[1]}, rotation);
|
||||||
|
direction = [direction.x, direction.y];
|
||||||
|
}
|
||||||
|
|
||||||
|
// 判断是否是对角线方向(需要等比缩放)
|
||||||
|
const isDiagonal = Math.abs(direction[0]) === 1 && Math.abs(direction[1]) === 1;
|
||||||
|
|
||||||
|
// 处理轴缩放,包含镜像翻转逻辑
|
||||||
|
const processAxis = (axis, val, deltaVal, dir, originalPosition, originalSize, keepRatio = false, otherAxisResult = null) => {
|
||||||
|
let newVal = val * deltaVal;
|
||||||
|
const mirrorKey = axis === 'width' ? 'x' : 'y';
|
||||||
|
const isWidth = axis === 'width';
|
||||||
|
|
||||||
|
// 检查是否需要镜像翻转(当值小于等于0时)
|
||||||
|
if (newVal <= 0) {
|
||||||
|
frontStyle.mirror[mirrorKey] = !frontStyle.mirror[mirrorKey];
|
||||||
|
newVal = Math.abs(newVal);
|
||||||
|
|
||||||
|
updateElementTransform(frontStyle);
|
||||||
|
|
||||||
|
// 镜像翻转后,位置需要根据原始锚点调整
|
||||||
|
if (dir === -1) {
|
||||||
|
// 从左上/右上缩放时,位置保持不变
|
||||||
|
return {
|
||||||
|
newVal,
|
||||||
|
adjustPos: originalPosition,
|
||||||
|
shouldFlip: true
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
// 从左下/右下缩放时,位置需要调整
|
||||||
|
const newPosition = originalPosition + (originalSize - newVal) * (frontStyle.mirror[mirrorKey] ? -1 : 1);
|
||||||
|
return {
|
||||||
|
newVal,
|
||||||
|
adjustPos: newPosition,
|
||||||
|
shouldFlip: true
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const shouldMove = (!frontStyle.mirror[mirrorKey] && dir === -1) ||
|
||||||
|
(frontStyle.mirror[mirrorKey] && dir === 1);
|
||||||
|
if (keepRatio && otherAxisResult) {
|
||||||
|
newVal = isWidth ?
|
||||||
|
otherAxisResult.newVal * originalRatio :
|
||||||
|
otherAxisResult.newVal / originalRatio;
|
||||||
|
}
|
||||||
|
let adjustPos;
|
||||||
|
if (shouldMove) {
|
||||||
|
adjustPos = originalPosition - (newVal - originalSize);
|
||||||
|
} else {
|
||||||
|
adjustPos = originalPosition;
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
newVal,
|
||||||
|
adjustPos,
|
||||||
|
shouldFlip: false
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
// 自由缩放
|
||||||
|
const widthResult = processAxis('width', width, delta[0], direction[0], left, width);
|
||||||
|
const heightResult = processAxis('height', height, delta[1], direction[1], top, height);
|
||||||
|
|
||||||
|
frontStyle.style.left = widthResult.adjustPos + 'px';
|
||||||
|
frontStyle.style.top = heightResult.adjustPos + 'px';
|
||||||
|
frontStyle.style.width = widthResult.newVal + 'px';
|
||||||
|
frontStyle.style.height = heightResult.newVal + 'px';
|
||||||
|
// }
|
||||||
|
});
|
||||||
|
|
||||||
|
// 旋转
|
||||||
|
moveableInstance.value.on('rotate', ({ target, beforeRotate }) => {
|
||||||
|
let frontStyle = detailData.frontBack.front[selectItem.imgDomIndex];
|
||||||
|
// 确保镜像状态存在
|
||||||
|
if (!frontStyle.mirror) frontStyle.mirror = { x: false, y: false };
|
||||||
|
|
||||||
|
const { x: isMirroredX, y: isMirroredY } = frontStyle.mirror;
|
||||||
|
|
||||||
|
// 计算实际旋转角度
|
||||||
|
let actualRotate = beforeRotate;
|
||||||
|
|
||||||
|
// 关键逻辑:当镜像状态不同时(一个true一个false),旋转方向反转
|
||||||
|
if (isMirroredX !== isMirroredY) {
|
||||||
|
actualRotate = -beforeRotate;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 确保角度在 0-360 度范围内
|
||||||
|
actualRotate = actualRotate % 360;
|
||||||
|
|
||||||
|
// 如果角度为负数,转换为正数
|
||||||
|
if (actualRotate < 0) {
|
||||||
|
actualRotate += 360;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 确保角度在 [0, 360) 范围内
|
||||||
|
actualRotate = ((actualRotate % 360) + 360) % 360;
|
||||||
|
|
||||||
|
updateElementTransform(frontStyle, actualRotate.toFixed(2));
|
||||||
|
});
|
||||||
|
// 调整大小
|
||||||
|
moveableInstance.value.on('resize', ({ target, width, height }) => {
|
||||||
|
// console.log(width, height)
|
||||||
|
// detailData.frontBack.front[selectItem.imgDomIndex].style.width = width
|
||||||
|
// detailData.frontBack.front[selectItem.imgDomIndex].style.height = height
|
||||||
|
});
|
||||||
|
moveableInstance.value.on('dragEnd', ({ target, clientX, clientY }) => {
|
||||||
|
startPosition = {
|
||||||
|
left:0,
|
||||||
|
top:0,
|
||||||
|
}
|
||||||
|
upDataDetail()
|
||||||
|
});
|
||||||
|
moveableInstance.value.on('scaleEnd', () => {
|
||||||
|
upDataDetail()
|
||||||
|
});
|
||||||
|
moveableInstance.value.on('rotateEnd', () => {
|
||||||
|
upDataDetail()
|
||||||
|
});
|
||||||
|
};
|
||||||
|
watch(()=>selectItem.selectDetail,(newValue,oldValue)=>{
|
||||||
|
if(!newValue && newValue?.id == oldValue?.id)return
|
||||||
|
selectItem.imgDomIndex = detailData.frontBack.front.findIndex((item:any)=>item.id == newValue.id)
|
||||||
|
initMoveableForSelected()
|
||||||
|
},{immediate: true,})
|
||||||
|
|
||||||
|
const setRevocation = async ()=>{
|
||||||
|
let frontBack = JSON.parse(JSON.stringify(detailData.frontBack))
|
||||||
|
let revocation:any = JSON.parse((await KeyValueDB.get("revocation") as any) || '[]')
|
||||||
|
revocation.push({designData:null,position:frontBack})
|
||||||
|
KeyValueDB.set('revocation', JSON.stringify(revocation));
|
||||||
|
}
|
||||||
|
const upDataDetail = async ()=>{
|
||||||
|
//同步到selectDetail数据中,
|
||||||
|
// getDetailListData.designDetail
|
||||||
|
let {scale,offset,priority,transpose,rotate,position,imageSize} = await getSubmitData(selectItem.selectDetail)
|
||||||
|
selectItem.selectDetail.layersObject[0].scale = scale
|
||||||
|
selectItem.selectDetail.layersObject[1].scale = scale
|
||||||
|
selectItem.selectDetail.layersObject[0].offset = offset
|
||||||
|
selectItem.selectDetail.layersObject[1].offset = offset
|
||||||
|
selectItem.selectDetail.layersObject[0].priority = priority
|
||||||
|
selectItem.selectDetail.layersObject[1].priority = priority
|
||||||
|
selectItem.selectDetail.layersObject[0].rotate = rotate
|
||||||
|
selectItem.selectDetail.layersObject[1].rotate = rotate
|
||||||
|
selectItem.selectDetail.layersObject[0].transpose = transpose
|
||||||
|
selectItem.selectDetail.layersObject[1].transpose = transpose
|
||||||
|
selectItem.selectDetail.layersObject[0].position = position
|
||||||
|
selectItem.selectDetail.layersObject[1].position = position
|
||||||
|
selectItem.selectDetail.layersObject[0].imageSize = imageSize
|
||||||
|
selectItem.selectDetail.layersObject[1].imageSize = imageSize
|
||||||
|
setRevocation()
|
||||||
|
}
|
||||||
|
const sort = (arr:any)=>{
|
||||||
|
arr.sort((a:any, b:any) => {
|
||||||
|
var a_num = a.style.zIndex;
|
||||||
|
var b_num = b.style.zIndex;
|
||||||
|
return a_num - b_num;
|
||||||
|
});
|
||||||
|
return arr
|
||||||
|
}
|
||||||
|
const getSubmitData = async (value:any)=>{
|
||||||
|
let parentNode = document.getElementsByClassName('molepositon')[0].getElementsByClassName("designOpenrtion_imgMask")[0].getBoundingClientRect()
|
||||||
|
if(!detailData.frontBack?.body?.layersObject?.[0]?.imageSize){
|
||||||
|
return{
|
||||||
|
scale:value.layersObject[0].scale,
|
||||||
|
offset:value.layersObject[0].offset,
|
||||||
|
priority:value.layersObject[0].priority,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let ratio = detailData.frontBack.body.layersObject[0].imageSize[0]/parentNode.width
|
||||||
|
|
||||||
|
let scale = 0
|
||||||
|
let dom:any = document.querySelector('.molepositon .perview_img')
|
||||||
|
const img = new Image();
|
||||||
|
img.src = detailData.frontBack?.body?.path;
|
||||||
|
await new Promise<void>((resolve, reject) => {
|
||||||
|
img.onload = () => {
|
||||||
|
scale = dom.parentNode.offsetWidth / img.width
|
||||||
|
resolve()
|
||||||
|
};
|
||||||
|
})
|
||||||
|
// let arr:any = sort(detailData.frontBack.front)
|
||||||
|
let arr:any = sort(JSON.parse(JSON.stringify(detailData.frontBack.front)))
|
||||||
|
let num = 10
|
||||||
|
arr.forEach((item:any)=>{
|
||||||
|
item.priority = num++
|
||||||
|
})
|
||||||
|
let data:any = {
|
||||||
|
scale:null,
|
||||||
|
offset:null,
|
||||||
|
priority:'',
|
||||||
|
maskUrl:'',
|
||||||
|
maskMinioUrl:'',
|
||||||
|
position:null,
|
||||||
|
imageSize:null,
|
||||||
|
}
|
||||||
|
let state = false
|
||||||
|
for (let index = 0; index < arr.length; index++) {
|
||||||
|
if(value.id == arr[index].id){
|
||||||
|
state = true
|
||||||
|
let y = ((arr[index]?.style?.top.replace(/px/g,'')*ratio).toFixed(0) as any - arr[index]?.position[0])
|
||||||
|
let x = ((arr[index]?.style?.left.replace(/px/g,'')*ratio).toFixed(0) as any - arr[index]?.position[1])
|
||||||
|
let positionX = Number((arr[index]?.style?.left.replace(/px/g,'')/scale)).toFixed(2)
|
||||||
|
let positionY = Number((arr[index]?.style?.top.replace(/px/g,'')/scale)).toFixed(2)
|
||||||
|
let imageSizeW = Number((arr[index]?.style?.width.replace(/px/g,'')/scale)).toFixed(2)
|
||||||
|
let imageSizeH = Number((arr[index]?.style?.height.replace(/px/g,'')/scale)).toFixed(2)
|
||||||
|
|
||||||
|
let scaleWidth = arr[index]?.imageSize?Number(((arr[index]?.style?.width.replace(/px/g,'')*ratio)/(arr[index]?.imageSize[0]/arr[index].scale[0])).toFixed(2)):1
|
||||||
|
let scaleHeight = arr[index]?.imageSize?Number(((arr[index]?.style?.height.replace(/px/g,'')*ratio)/(arr[index]?.imageSize[1]/arr[index].scale[1])).toFixed(2)):1
|
||||||
|
// let widthScale = (arr[index].style.width.replace(/px/g,'')/arr[index].style.height.replace(/px/g,'')).toFixed(2)
|
||||||
|
|
||||||
|
let transformStr = arr[index]?.style?.transform
|
||||||
|
let scaleX = transformStr.match(/scaleX\(([-\d.]+)\)/)
|
||||||
|
let scaleY = transformStr.match(/scaleY\(([-\d.]+)\)/)
|
||||||
|
let rotate = transformStr.match(/rotate\(([-\d.]+)deg\)/);
|
||||||
|
data.transpose = [parseFloat(scaleX?.[1] || 1),parseFloat(scaleY?.[1] || 1)]
|
||||||
|
data.rotate = parseFloat(rotate?.[1] || 0)
|
||||||
|
data.scale = [scaleWidth,scaleHeight]
|
||||||
|
let top = y == 0 ? value.layersObject[0].offset[1]:y+value.layersObject[0].offset[1]
|
||||||
|
let left = x == 0 ? value.layersObject[0].offset[0]:x+value.layersObject[0].offset[0]
|
||||||
|
data.offset = [left?left:0,top?top:0]
|
||||||
|
data.position = [positionY,positionX]
|
||||||
|
data.imageSize = [imageSizeW,imageSizeH]
|
||||||
|
// data.offset = [left?left:0,top?top:0]
|
||||||
|
data.maskUrl = arr[index].maskUrl
|
||||||
|
data.maskMinioUrl = arr[index].maskMinioUrl
|
||||||
|
// data.priority = arr[index].style.zIndex
|
||||||
|
data.priority = arr[index].priority
|
||||||
|
arr[index].similarity = true
|
||||||
|
// item.offset = [(arr[index]?.style?.left.replace(/px/g,'')*ratio).toFixed(0),(i?.style?.top.replace(/px/g,'')*ratio).toFixed(0)]
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!state){
|
||||||
|
data.scale = [1,1]
|
||||||
|
data.offset = [0,0]
|
||||||
|
data.priority = 10+arr.length
|
||||||
|
}
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
const deleteNav = ()=>{
|
||||||
|
|
||||||
|
}
|
||||||
|
const updataPosition = ()=>{
|
||||||
|
let url = detailData.frontBack?.body?.path
|
||||||
|
let sacle = 0
|
||||||
|
const img = new Image();
|
||||||
|
img.onload = () => {
|
||||||
|
let dom:any = document.querySelector('.molepositon .perview_img')
|
||||||
|
// resolve(img)
|
||||||
|
sacle = dom.parentNode.offsetWidth / img.width
|
||||||
|
detailData.frontBack.front.forEach((item:any,index:number) => {
|
||||||
|
for (const key in item.style) {
|
||||||
|
if(key == 'zIndex')return
|
||||||
|
if(key == 'transform')return
|
||||||
|
item.style[key] = item.style[key]*sacle+'px'
|
||||||
|
}
|
||||||
|
for (const key in detailData.frontBack.back[index].style) {
|
||||||
|
if(key == 'zIndex')return
|
||||||
|
if(key == 'transform')return
|
||||||
|
detailData.frontBack.back[index].style[key] = detailData.frontBack.back[index].style[key]*sacle+'px'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
img.src = url;
|
||||||
|
}
|
||||||
|
onUnmounted(()=>{
|
||||||
|
if (detailData.observer) {
|
||||||
|
detailData.observer.disconnect()
|
||||||
|
}
|
||||||
|
if (moveableInstance.value) {
|
||||||
|
moveableInstance.value.destroy();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return{
|
||||||
|
...toRefs(detailData),
|
||||||
|
...toRefs(selectItem),
|
||||||
|
...toRefs(getDetailListDom),
|
||||||
|
setElementRef,
|
||||||
|
|
||||||
|
setPrintSize,
|
||||||
|
deleteNav,
|
||||||
|
getSubmitData,
|
||||||
|
getMousePosition,
|
||||||
|
updataPosition,
|
||||||
|
updateRect,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
directives:{
|
||||||
|
detailBody:{
|
||||||
|
mounted (el,data:any) {
|
||||||
|
let sacle = 0
|
||||||
|
const img = new Image();
|
||||||
|
img.onload = () => {
|
||||||
|
// resolve(img)
|
||||||
|
sacle = el.parentNode.offsetWidth / img.width
|
||||||
|
data.instance.frontBack.front.forEach((item:any,index:number) => {
|
||||||
|
for (const key in item.style) {
|
||||||
|
if(key == 'zIndex')return
|
||||||
|
item.style[key] = item.style[key]*sacle+'px'
|
||||||
|
}
|
||||||
|
for (const key in data.instance.frontBack.back[index].style) {
|
||||||
|
if(key == 'zIndex')return
|
||||||
|
data.instance.frontBack.back[index].style[key] = data.instance.frontBack.back[index].style[key]*sacle+'px'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
img.src = data.value;
|
||||||
|
},
|
||||||
|
updated (el,data:any) {
|
||||||
|
let sacle = 0
|
||||||
|
const img = new Image();
|
||||||
|
img.onload = () => {
|
||||||
|
// resolve(img)
|
||||||
|
sacle = el.parentNode.offsetWidth / img.width
|
||||||
|
data.instance.frontBack.front.forEach((item:any,index:number) => {
|
||||||
|
for (const key in item.style) {
|
||||||
|
if(key == 'zIndex')return
|
||||||
|
item.style[key] = item.style[key].replace(/px/g,'')*sacle+'px'
|
||||||
|
}
|
||||||
|
for (const key in data.instance.frontBack.back[index].style) {
|
||||||
|
if(key == 'zIndex')return
|
||||||
|
data.instance.frontBack.back[index].style[key] = data.instance.frontBack.back[index].style[key].replace(/px/g,'')*sacle+'px'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
img.src = data.value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
provide() {
|
||||||
|
return {
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
<style lang="less" scoped>
|
||||||
|
.molepositon{
|
||||||
|
// width: 30rem;
|
||||||
|
// width: calc(66 * .470rem);
|
||||||
|
width: calc(66 * .457rem);
|
||||||
|
height: 66rem;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
// margin: auto 0;
|
||||||
|
// padding-top: 3rem;
|
||||||
|
position: relative;
|
||||||
|
display: none;
|
||||||
|
&.active{
|
||||||
|
display: flex;
|
||||||
|
z-index: 2;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
&.imgDesignImg{
|
||||||
|
> .designOpenrtion_imgMask{
|
||||||
|
.detail_modal_item_front{
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
img{
|
||||||
|
// height: auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.moveableContainer{
|
||||||
|
:deep(.moveable-origin){
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
:deep(.moveable-control){
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
|
:deep(.moveable-rotation-control){
|
||||||
|
border-radius: 50%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
> .designOpenrtion_imgMask{
|
||||||
|
width: auto;
|
||||||
|
height: auto;
|
||||||
|
position: relative;
|
||||||
|
// height: 100%;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
>img{
|
||||||
|
z-index: 2;
|
||||||
|
position: relative;
|
||||||
|
width: 100%;
|
||||||
|
height: auto;
|
||||||
|
// height: 100%;
|
||||||
|
// object-fit: contain;
|
||||||
|
}
|
||||||
|
>div{
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.detail_modal_item_front,.designOpenrtion_print{
|
||||||
|
z-index: 2;
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
pointer-events: none;
|
||||||
|
&.active{
|
||||||
|
pointer-events: auto;
|
||||||
|
}
|
||||||
|
img{
|
||||||
|
width: 100%;
|
||||||
|
// height: ;
|
||||||
|
height: 100%;
|
||||||
|
float: left;
|
||||||
|
user-select:none;
|
||||||
|
-webkit-user-drag: none;
|
||||||
|
}
|
||||||
|
.modal_imgItem{
|
||||||
|
position: absolute;
|
||||||
|
overflow: hidden;
|
||||||
|
top: 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.designOpenrtion_print{
|
||||||
|
z-index: 1 !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -1,142 +1,175 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="eventsDetail_page" :class="{active:isScroll}">
|
<div class="eventsDetail_page" :class="{ active: isScroll }">
|
||||||
<div class="eventsDetail_title ">
|
<div class="eventsDetail_title">
|
||||||
<div class="modal_title_text" @click="setBack">
|
<div class="modal_title_text" @click="setBack">
|
||||||
<i class="fi fi-sr-left"></i>
|
<i class="fi fi-sr-left"></i>
|
||||||
<div class="eventsDetail_title_text">{{ $t('event.back') }}</div>
|
<div class="eventsDetail_title_text">{{ $t("event.back") }}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="eventsDetail_content">
|
<div class="eventsDetail_content">
|
||||||
<div class="eventsDetail_content_left">
|
<div class="eventsDetail_content_left">
|
||||||
<fullScreenImg :src="eventsDetail.imgUrl" width="100%" :center="true"></fullScreenImg>
|
<fullScreenImg
|
||||||
|
:src="eventsDetail.imgUrl"
|
||||||
|
width="100%"
|
||||||
|
:center="true"
|
||||||
|
></fullScreenImg>
|
||||||
</div>
|
</div>
|
||||||
<div class="eventsDetail_content_right">
|
<div class="eventsDetail_content_right">
|
||||||
<div class="modal_title_text">
|
<div class="modal_title_text modal_title_text-header flex space-between">
|
||||||
<div>{{ eventsDetail.title }}</div>
|
<div>{{ eventsDetail.title }}</div>
|
||||||
|
<div class="detail-btn" v-if="eventsDetail.id === 3" @click="openDetail">
|
||||||
|
{{ $t("event.detail") }}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal_title_text" v-for="item in eventsDetail.textList">
|
<div class="modal_title_text content" v-for="item in eventsDetail.textList">
|
||||||
<div class="eventsDetail_content_right_btn_box">
|
<div class="eventsDetail_content_right_btn_box">
|
||||||
<div class="eventsDetail_content_right_btn" v-for="buttonItem,buttonIndex in item?.button" @click="openButton(buttonItem,buttonIndex)">
|
<div
|
||||||
<div v-show="!loadingShow[buttonIndex]" class="started_btn">{{ buttonItem.text }}</div>
|
class="eventsDetail_content_right_btn"
|
||||||
<div v-show="loadingShow[buttonIndex]" class="started_btn"><i class="fi fi-br-loading"></i></div>
|
v-for="(buttonItem, buttonIndex) in item?.button"
|
||||||
|
@click="openButton(buttonItem, buttonIndex)"
|
||||||
|
>
|
||||||
|
<div v-show="!loadingShow[buttonIndex]" class="started_btn">
|
||||||
|
{{ buttonItem.text }}
|
||||||
|
</div>
|
||||||
|
<div v-show="loadingShow[buttonIndex]" class="started_btn">
|
||||||
|
<i class="fi fi-br-loading"></i>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal_title_text_intro" v-for="introItem in item?.paragraph" :class="{active:introItem.display == 'flex'}" v-detailText="introItem.text">
|
<div
|
||||||
</div>
|
class="modal_title_text_intro"
|
||||||
|
v-for="introItem in item?.paragraph"
|
||||||
|
:class="{ active: introItem.display == 'flex' }"
|
||||||
|
v-detailText="introItem.text"
|
||||||
|
></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
|
||||||
</template>
|
</template>
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { LoadingOutlined } from "@ant-design/icons-vue";
|
import { LoadingOutlined } from "@ant-design/icons-vue"
|
||||||
import { defineComponent,h ,toRefs,ref,reactive,onMounted,nextTick,provide,computed} from 'vue'
|
import {
|
||||||
|
defineComponent,
|
||||||
|
h,
|
||||||
|
toRefs,
|
||||||
|
ref,
|
||||||
|
reactive,
|
||||||
|
onMounted,
|
||||||
|
nextTick,
|
||||||
|
provide,
|
||||||
|
computed
|
||||||
|
} from "vue"
|
||||||
// import RobotAssist from "@/component/HomePage/RobotAssist.vue";
|
// import RobotAssist from "@/component/HomePage/RobotAssist.vue";
|
||||||
import { Https } from "@/tool/https";
|
import { Https } from "@/tool/https"
|
||||||
import { message, Upload, Modal } from "ant-design-vue";
|
import { message, Upload, Modal } from "ant-design-vue"
|
||||||
import fullScreenImg from '@/component/HomePage/fullScreenImg.vue'
|
import fullScreenImg from "@/component/HomePage/fullScreenImg.vue"
|
||||||
import { useRouter } from 'vue-router';
|
import { useRouter } from "vue-router"
|
||||||
import { useI18n } from "vue-i18n";
|
import { useI18n } from "vue-i18n"
|
||||||
import generalMenu from "@/component/HomePage/generalMenu.vue";
|
import generalMenu from "@/component/HomePage/generalMenu.vue"
|
||||||
import eventData from "@/assets/json/events.json";
|
import eventData from "@/assets/json/events.json"
|
||||||
import eventDataCn from "@/assets/json/events_cn.json";
|
import eventDataCn from "@/assets/json/events_cn.json"
|
||||||
import { useStore } from "vuex";
|
import { useStore } from "vuex"
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: {
|
components: {
|
||||||
generalMenu,
|
generalMenu,
|
||||||
fullScreenImg,
|
fullScreenImg
|
||||||
},
|
|
||||||
props:{
|
|
||||||
isScroll:{
|
|
||||||
type:Boolean,
|
|
||||||
default:true,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
setup() {
|
props: {
|
||||||
const router = useRouter();
|
isScroll: {
|
||||||
const store = useStore();
|
type: Boolean,
|
||||||
let filter:any = reactive({
|
default: true
|
||||||
eventsDetail: {
|
|
||||||
},
|
|
||||||
getListDate:{
|
|
||||||
"getLikePortfolio": 0,
|
|
||||||
"getMyPortfolio": 0,
|
|
||||||
page:1,
|
|
||||||
size:10,
|
|
||||||
},
|
|
||||||
isShowMark:false,
|
|
||||||
isNoData:false,//如果数据为空就不加载
|
|
||||||
loadingShow:{},
|
|
||||||
})
|
|
||||||
let likeFile = (item:any,type:string) => {
|
|
||||||
}
|
}
|
||||||
let setBack = ()=>{
|
},
|
||||||
router.go(-1);
|
setup() {
|
||||||
|
const { t, locale } = useI18n()
|
||||||
|
const router = useRouter()
|
||||||
|
const store = useStore()
|
||||||
|
let filter: any = reactive({
|
||||||
|
eventsDetail: {},
|
||||||
|
getListDate: {
|
||||||
|
getLikePortfolio: 0,
|
||||||
|
getMyPortfolio: 0,
|
||||||
|
page: 1,
|
||||||
|
size: 10
|
||||||
|
},
|
||||||
|
isShowMark: false,
|
||||||
|
isNoData: false, //如果数据为空就不加载
|
||||||
|
loadingShow: {}
|
||||||
|
})
|
||||||
|
let likeFile = (item: any, type: string) => {}
|
||||||
|
let setBack = () => {
|
||||||
|
router.go(-1)
|
||||||
// router.push('/home/events')
|
// router.push('/home/events')
|
||||||
}
|
}
|
||||||
let openButton = (data:any,index:number)=>{
|
let openButton = (data: any, index: number) => {
|
||||||
if(filter.loadingShow[index]){
|
if (filter.loadingShow[index]) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
filter.loadingShow[index] = true
|
filter.loadingShow[index] = true
|
||||||
Https.axiosGet(data.https).then(
|
Https.axiosGet(data.https)
|
||||||
(rv: any) => {
|
.then((rv: any) => {
|
||||||
if(rv){
|
if (rv) {
|
||||||
message.success(data.success)
|
message.success(data.success)
|
||||||
filter.loadingShow[index] = false
|
filter.loadingShow[index] = false
|
||||||
}
|
}
|
||||||
}
|
})
|
||||||
).catch(res=>{
|
.catch((res) => {
|
||||||
filter.loadingShow[index] = false
|
filter.loadingShow[index] = false
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
onMounted (()=>{
|
const openDetail = () => {
|
||||||
const { t, locale } = useI18n();
|
let language = locale.value === "ENGLISH" ? "en" : "zh"
|
||||||
const currentLocale = locale.value;
|
let url = `https://aida-global-design-awards.com.hk/${language}`
|
||||||
let eventLangData:any
|
window.open(url, "_blank")
|
||||||
if(currentLocale == 'ENGLISH'){
|
|
||||||
|
// router.push("/award/index")
|
||||||
|
}
|
||||||
|
onMounted(() => {
|
||||||
|
const currentLocale = locale.value
|
||||||
|
let eventLangData: any
|
||||||
|
if (currentLocale == "ENGLISH") {
|
||||||
eventLangData = eventData
|
eventLangData = eventData
|
||||||
}else{
|
} else {
|
||||||
eventLangData = eventDataCn
|
eventLangData = eventDataCn
|
||||||
}
|
}
|
||||||
eventLangData.eventsItem.forEach((item:any)=>{
|
eventLangData.eventsItem.forEach((item: any) => {
|
||||||
if(item.id == router.currentRoute.value.query.eventId){
|
if (item.id == router.currentRoute.value.query.eventId) {
|
||||||
filter.eventsDetail = item;
|
filter.eventsDetail = item
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
return {
|
return {
|
||||||
...toRefs(filter),
|
...toRefs(filter),
|
||||||
likeFile,
|
likeFile,
|
||||||
setBack,
|
setBack,
|
||||||
openButton,
|
openButton,
|
||||||
}
|
openDetail
|
||||||
},
|
}
|
||||||
directives:{
|
},
|
||||||
detailText:{
|
directives: {
|
||||||
mounted (el,binding) {
|
detailText: {
|
||||||
|
mounted(el, binding) {
|
||||||
el.innerHTML = binding.value
|
el.innerHTML = binding.value
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
async mounted(){
|
async mounted() {}
|
||||||
|
|
||||||
},
|
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
<style lang="less">
|
<style lang="less">
|
||||||
.eventsDetail_page {
|
.eventsDetail_page {
|
||||||
min-height: 100%;
|
min-height: 100%;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
padding: 0 6rem;
|
padding: 0 6rem;
|
||||||
padding-top: 5rem;
|
padding-top: 5rem;
|
||||||
|
|
||||||
&.active{
|
&.active {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
.eventsDetail_content{
|
.eventsDetail_content {
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
@@ -146,7 +179,7 @@ export default defineComponent({
|
|||||||
min-height: auto;
|
min-height: auto;
|
||||||
padding-bottom: 10rem;
|
padding-bottom: 10rem;
|
||||||
}
|
}
|
||||||
.eventsDetail_title{
|
.eventsDetail_title {
|
||||||
display: flex;
|
display: flex;
|
||||||
padding: 2rem 0rem;
|
padding: 2rem 0rem;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
@@ -154,21 +187,21 @@ export default defineComponent({
|
|||||||
top: 0;
|
top: 0;
|
||||||
z-index: 222;
|
z-index: 222;
|
||||||
background: #fff;
|
background: #fff;
|
||||||
.modal_title_text{
|
.modal_title_text {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
display: flex;
|
display: flex;
|
||||||
margin-bottom: 0;
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
.modal_title_text:hover .eventsDetail_title_text{
|
.modal_title_text:hover .eventsDetail_title_text {
|
||||||
text-decoration: underline;
|
text-decoration: underline;
|
||||||
}
|
}
|
||||||
i{
|
i {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
margin-right: 1rem;
|
margin-right: 1rem;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.eventsDetail_content{
|
.eventsDetail_content {
|
||||||
border-top: 1px solid #f0f0f0;
|
border-top: 1px solid #f0f0f0;
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
@@ -176,59 +209,69 @@ export default defineComponent({
|
|||||||
@media (max-width: 768px) {
|
@media (max-width: 768px) {
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
}
|
}
|
||||||
.eventsDetail_content_left,.eventsDetail_content_right{
|
.eventsDetail_content_left,
|
||||||
|
.eventsDetail_content_right {
|
||||||
width: 50%;
|
width: 50%;
|
||||||
@media (max-width: 768px) {
|
@media (max-width: 768px) {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.eventsDetail_content_left{
|
.eventsDetail_content_left {
|
||||||
width: 40%;
|
width: 40%;
|
||||||
max-height: 60rem;
|
max-height: 60rem;
|
||||||
@media (max-width: 768px) {
|
@media (max-width: 768px) {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
.ant-image{
|
.ant-image {
|
||||||
// height: auto;
|
// height: auto;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
}
|
}
|
||||||
.eventsDetail_content_left_img{
|
.eventsDetail_content_left_img {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
cursor: zoom-in;
|
cursor: zoom-in;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.eventsDetail_content_right{
|
.eventsDetail_content_right {
|
||||||
.modal_title_text{
|
.modal_title_text {
|
||||||
letter-spacing: .4rem;
|
letter-spacing: 0.4rem;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
.modal_title_text_intro{
|
&-header {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
align-items: flex-end;
|
||||||
|
justify-content: space-between;
|
||||||
|
gap: 1rem;
|
||||||
|
> div:first-child {
|
||||||
|
flex: 1;
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.modal_title_text_intro {
|
||||||
display: block;
|
display: block;
|
||||||
&.active{
|
&.active {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
}
|
}
|
||||||
li{
|
li {
|
||||||
width: 48%;
|
width: 48%;
|
||||||
|
|
||||||
}
|
}
|
||||||
em{
|
em {
|
||||||
// font-family: auto;
|
// font-family: auto;
|
||||||
}
|
}
|
||||||
a{
|
a {
|
||||||
display: inline;
|
display: inline;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.eventsDetail_content_right_btn_box{
|
.eventsDetail_content_right_btn_box {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-evenly;
|
justify-content: space-evenly;
|
||||||
.eventsDetail_content_right_btn{
|
.eventsDetail_content_right_btn {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
.modal_title_text:last-child{
|
.modal_title_text:last-child {
|
||||||
}
|
}
|
||||||
.modal_title_text:last-child::after{
|
.modal_title_text:last-child::after {
|
||||||
content: "";
|
content: "";
|
||||||
display: block;
|
display: block;
|
||||||
border-top: 3px solid;
|
border-top: 3px solid;
|
||||||
@@ -237,4 +280,17 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.detail-btn {
|
||||||
|
// width: 11rem;
|
||||||
|
padding: 0 1.4rem;
|
||||||
|
height: 4rem;
|
||||||
|
line-height: 4rem;
|
||||||
|
text-align: center;
|
||||||
|
color: #fff;
|
||||||
|
border-radius: 2rem;
|
||||||
|
background-color: #000;
|
||||||
|
font-size: 1.4rem;
|
||||||
|
white-space: nowrap;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
@@ -271,7 +271,7 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
selectColor:{
|
selectColor:{
|
||||||
handler(newVal,oldVal){
|
handler(newVal,oldVal){
|
||||||
if(typeof newVal?.rgba?.r !== 'number' && typeof newVal?.rgba?.r !== 'string'){
|
if(newVal?.rgba?.r == null){
|
||||||
this.colorList[this.selectIndex] = {}
|
this.colorList[this.selectIndex] = {}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -388,7 +388,7 @@ export default defineComponent({
|
|||||||
//选择不同的色块
|
//选择不同的色块
|
||||||
selectColorItem(index,color){
|
selectColorItem(index,color){
|
||||||
let hex
|
let hex
|
||||||
if(color?.rgba?.r){
|
if(color?.rgba?.r != null){
|
||||||
hex = this.rgbaToHex([color.rgba.r,color.rgba.g,color.rgba.b,color.rgba.a?color.rgba.a:1])
|
hex = this.rgbaToHex([color.rgba.r,color.rgba.g,color.rgba.b,color.rgba.a?color.rgba.a:1])
|
||||||
}else{
|
}else{
|
||||||
hex = '#FFFFFF'
|
hex = '#FFFFFF'
|
||||||
@@ -402,7 +402,7 @@ export default defineComponent({
|
|||||||
if(this.driver__.driver){
|
if(this.driver__.driver){
|
||||||
driverObj__.moveNext()
|
driverObj__.moveNext()
|
||||||
}
|
}
|
||||||
if(color?.rgba?.r){
|
if(color?.rgba?.r != null){
|
||||||
this.selectColor = color
|
this.selectColor = color
|
||||||
this.selectColor.hex = hex
|
this.selectColor.hex = hex
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -853,9 +853,7 @@ export default defineComponent({
|
|||||||
level2Type = this.sketchboardList?.[0]?.categoryValue
|
level2Type = this.sketchboardList?.[0]?.categoryValue
|
||||||
? this.sketchboardList[0].categoryValue
|
? this.sketchboardList[0].categoryValue
|
||||||
: ''
|
: ''
|
||||||
if (this.workspace.styleName) {
|
sloganText = `${this.workspace.styleName || 'all'},${sloganText}`
|
||||||
sloganText = `${this.workspace.styleName},${sloganText}`
|
|
||||||
}
|
|
||||||
} else if (this.upload.level1Type == 'Printboard') {
|
} else if (this.upload.level1Type == 'Printboard') {
|
||||||
level2Type = this.scene?.value
|
level2Type = this.scene?.value
|
||||||
if (level2Type == 'Slogan' && this.searchPictureName == '') {
|
if (level2Type == 'Slogan' && this.searchPictureName == '') {
|
||||||
@@ -925,7 +923,9 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
onCancel() {}
|
onCancel() {}
|
||||||
})
|
})
|
||||||
}
|
}else{
|
||||||
|
this.fileList = this.fileList.filter((item: any) => item.imgUrl)
|
||||||
|
}
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
setGenerate(dataList: any) {
|
setGenerate(dataList: any) {
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
:get-container="() => $refs.upgradePlan"
|
:get-container="() => $refs.upgradePlan"
|
||||||
width="35%"
|
width="35%"
|
||||||
height="auto"
|
height="auto"
|
||||||
|
zIndex="9999999"
|
||||||
:maskClosable="false"
|
:maskClosable="false"
|
||||||
:centered="true"
|
:centered="true"
|
||||||
:closable="false"
|
:closable="false"
|
||||||
|
|||||||
@@ -790,7 +790,6 @@ export default defineComponent({
|
|||||||
.login_form_content {
|
.login_form_content {
|
||||||
margin-top: 4rem;
|
margin-top: 4rem;
|
||||||
position: relative;
|
position: relative;
|
||||||
|
|
||||||
&[state="2"] {
|
&[state="2"] {
|
||||||
> * {
|
> * {
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
|
|||||||
@@ -854,6 +854,10 @@ export default defineComponent({
|
|||||||
font-size: 2.2rem;
|
font-size: 2.2rem;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
color: #030303;
|
color: #030303;
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
font-size: 1.2rem;
|
||||||
|
margin-left: .5rem;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.email_last_step_block_icon {
|
.email_last_step_block_icon {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
|||||||
@@ -826,7 +826,6 @@ export default defineComponent({
|
|||||||
.login_form_content {
|
.login_form_content {
|
||||||
margin-top: 4rem;
|
margin-top: 4rem;
|
||||||
position: relative;
|
position: relative;
|
||||||
|
|
||||||
&[state="2"] {
|
&[state="2"] {
|
||||||
> * {
|
> * {
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
|
|||||||
@@ -161,6 +161,13 @@
|
|||||||
font-size: 2.4rem;
|
font-size: 2.4rem;
|
||||||
line-height: 8.7rem;
|
line-height: 8.7rem;
|
||||||
outline: none;
|
outline: none;
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
border-radius: .7rem;
|
||||||
|
width: 3.5rem;
|
||||||
|
height: 3.5rem;
|
||||||
|
font-size: 1.8rem;
|
||||||
|
line-height: 3.5rem;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
input:last-of-type {
|
input:last-of-type {
|
||||||
margin-right: 0;
|
margin-right: 0;
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 图片网格 -->
|
<!-- 图片网格 -->
|
||||||
<div class="image-grid" @scroll="handleScroll">
|
<div class="image-grid" v-show="list.length > 0" @scroll="handleScroll">
|
||||||
<div
|
<div
|
||||||
v-for="(item, index) in list"
|
v-for="(item, index) in list"
|
||||||
:key="index"
|
:key="index"
|
||||||
@@ -460,6 +460,7 @@ defineExpose({
|
|||||||
padding: 20px;
|
padding: 20px;
|
||||||
// overflow-y: auto;
|
// overflow-y: auto;
|
||||||
flex: 1;
|
flex: 1;
|
||||||
|
overflow: hidden;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
gap: 20px;
|
gap: 20px;
|
||||||
@@ -516,11 +517,13 @@ defineExpose({
|
|||||||
/* 图片网格 */
|
/* 图片网格 */
|
||||||
.image-grid {
|
.image-grid {
|
||||||
display: grid;
|
display: grid;
|
||||||
|
align-content: start;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
grid-template-columns: repeat(auto-fill, minmax(20rem, 1fr));
|
grid-template-columns: repeat(auto-fill, minmax(20rem, 1fr));
|
||||||
gap: 16px;
|
gap: 16px;
|
||||||
min-height: 22rem;
|
flex: 1;
|
||||||
max-height: 50rem;
|
// min-height: 22rem;
|
||||||
|
// max-height: 50rem;
|
||||||
padding-bottom: 2rem;
|
padding-bottom: 2rem;
|
||||||
|
|
||||||
@media screen and (max-width: 768px) {
|
@media screen and (max-width: 768px) {
|
||||||
@@ -615,9 +618,9 @@ defineExpose({
|
|||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
padding: 60px 20px;
|
|
||||||
color: #666;
|
color: #666;
|
||||||
min-height: 300px;
|
min-height: 300px;
|
||||||
|
margin: auto 0;
|
||||||
|
|
||||||
.empty-icon {
|
.empty-icon {
|
||||||
font-size: 48px;
|
font-size: 48px;
|
||||||
|
|||||||
@@ -283,7 +283,7 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
selectColor:{
|
selectColor:{
|
||||||
handler(newVal,oldVal){
|
handler(newVal,oldVal){
|
||||||
if(typeof newVal?.rgba?.r !== 'number' && typeof newVal?.rgba?.r !== 'string'){
|
if(newVal?.rgba?.r == null){
|
||||||
this.colorList[this.selectIndex] = {}
|
this.colorList[this.selectIndex] = {}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -400,7 +400,7 @@ export default defineComponent({
|
|||||||
//选择不同的色块
|
//选择不同的色块
|
||||||
selectColorItem(index,color){
|
selectColorItem(index,color){
|
||||||
let hex
|
let hex
|
||||||
if(color?.rgba?.r){
|
if(color?.rgba?.r != null){
|
||||||
hex = this.rgbaToHex([color.rgba.r,color.rgba.g,color.rgba.b,color.rgba.a?color.rgba.a:1])
|
hex = this.rgbaToHex([color.rgba.r,color.rgba.g,color.rgba.b,color.rgba.a?color.rgba.a:1])
|
||||||
}else{
|
}else{
|
||||||
hex = '#FFFFFF'
|
hex = '#FFFFFF'
|
||||||
@@ -414,7 +414,7 @@ export default defineComponent({
|
|||||||
if(this.driver__.driver){
|
if(this.driver__.driver){
|
||||||
driverObj__.moveNext()
|
driverObj__.moveNext()
|
||||||
}
|
}
|
||||||
if(color?.rgba?.r){
|
if(color?.rgba?.r != null){
|
||||||
this.selectColor = color
|
this.selectColor = color
|
||||||
this.selectColor.hex = hex
|
this.selectColor.hex = hex
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -379,6 +379,7 @@ export default defineComponent({
|
|||||||
setup(props,{emit}) {
|
setup(props,{emit}) {
|
||||||
const {t,locale} = useI18n()
|
const {t,locale} = useI18n()
|
||||||
const store = useStore();
|
const store = useStore();
|
||||||
|
const route = useRoute()
|
||||||
const editDesignType = reactive({
|
const editDesignType = reactive({
|
||||||
selectProbject:computed(()=>{
|
selectProbject:computed(()=>{
|
||||||
return store.state.Workspace.probjects
|
return store.state.Workspace.probjects
|
||||||
@@ -624,6 +625,7 @@ export default defineComponent({
|
|||||||
collItemSize.collTime = setTimeout(()=>{
|
collItemSize.collTime = setTimeout(()=>{
|
||||||
nextTick(()=>{
|
nextTick(()=>{
|
||||||
let parentWidth = likeItemDom.value.parentElement.offsetWidth
|
let parentWidth = likeItemDom.value.parentElement.offsetWidth
|
||||||
|
if(parentWidth == 0)return
|
||||||
collItemSize.widthValue.value = collItemSize.widthValue.value == -1?100:collItemSize.widthValue.value
|
collItemSize.widthValue.value = collItemSize.widthValue.value == -1?100:collItemSize.widthValue.value
|
||||||
collItemSize.widthValue.value = collItemSize.widthValue.value > parentWidth?parentWidth:collItemSize.widthValue.value
|
collItemSize.widthValue.value = collItemSize.widthValue.value > parentWidth?parentWidth:collItemSize.widthValue.value
|
||||||
collItemSize.collValue = Math.floor(parentWidth / collItemSize.widthValue.value)
|
collItemSize.collValue = Math.floor(parentWidth / collItemSize.widthValue.value)
|
||||||
@@ -634,7 +636,6 @@ export default defineComponent({
|
|||||||
|
|
||||||
collItemSize.collStyle.width = (collItemDom.value.offsetWidth - 30) / 3 * collItemSize.scale[0] + 'px'
|
collItemSize.collStyle.width = (collItemDom.value.offsetWidth - 30) / 3 * collItemSize.scale[0] + 'px'
|
||||||
collItemSize.collStyle.height = (collItemDom.value.offsetWidth - 30) / 3 * collItemSize.scale[1] + 'px'
|
collItemSize.collStyle.height = (collItemDom.value.offsetWidth - 30) / 3 * collItemSize.scale[1] + 'px'
|
||||||
|
|
||||||
collItemSize.likeStyle.width = collItemSize.itemStyle.width + 'px'
|
collItemSize.likeStyle.width = collItemSize.itemStyle.width + 'px'
|
||||||
collItemSize.likeStyle.height = collItemSize.itemStyle.height + 'px'
|
collItemSize.likeStyle.height = collItemSize.itemStyle.height + 'px'
|
||||||
let elArr = likeItemDom.value.children
|
let elArr = likeItemDom.value.children
|
||||||
|
|||||||
@@ -56,7 +56,7 @@
|
|||||||
@changeCanvas="changeCanvas"
|
@changeCanvas="changeCanvas"
|
||||||
@trigger-library="triggerLibrary"
|
@trigger-library="triggerLibrary"
|
||||||
:canvasJSON="canvasJSON"
|
:canvasJSON="canvasJSON"
|
||||||
:hideCanvas="hideCanvas"
|
:hideCanvas="hideCanvas || !key"
|
||||||
ref="editCanvas">
|
ref="editCanvas">
|
||||||
<template #existsImageList>
|
<template #existsImageList>
|
||||||
<ExistsImageList :list="canvasSelectList" @select="handleImageSelect" />
|
<ExistsImageList :list="canvasSelectList" @select="handleImageSelect" />
|
||||||
@@ -135,7 +135,7 @@ export default defineComponent({
|
|||||||
unLikeList:[],
|
unLikeList:[],
|
||||||
locale:null as any,
|
locale:null as any,
|
||||||
t:null as any,
|
t:null as any,
|
||||||
|
key:true as any
|
||||||
})
|
})
|
||||||
const dataDom = reactive({
|
const dataDom = reactive({
|
||||||
toProduct:null as any,
|
toProduct:null as any,
|
||||||
@@ -271,7 +271,7 @@ export default defineComponent({
|
|||||||
allCollectionStr.forEach((itemStr:any)=>{
|
allCollectionStr.forEach((itemStr:any)=>{
|
||||||
let list = [] as any
|
let list = [] as any
|
||||||
allCollection[itemStr.value].forEach((imgItem)=>{
|
allCollection[itemStr.value].forEach((imgItem)=>{
|
||||||
list.push({url:imgItem.url || imgItem.imgUrl})
|
list.push({url:imgItem?.url || imgItem?.imgUrl})
|
||||||
})
|
})
|
||||||
let obj = {
|
let obj = {
|
||||||
value:itemStr.value,
|
value:itemStr.value,
|
||||||
@@ -335,9 +335,22 @@ export default defineComponent({
|
|||||||
let canvasData = JSON.parse(canvasJSON)
|
let canvasData = JSON.parse(canvasJSON)
|
||||||
|
|
||||||
if(!canvasData)return
|
if(!canvasData)return
|
||||||
canvasData.canvas.objects.forEach((objectsItem:any) => {
|
function deepProcessObjects(data:any, callback:any) {
|
||||||
if(objectsItem.type == 'image')objectsItem.minioUrl = getMinioUrl(objectsItem.src)
|
if (!Array.isArray(data)) return data;
|
||||||
});
|
return data.map(item => {
|
||||||
|
callback(item)
|
||||||
|
const processedItem = {...item};
|
||||||
|
if (processedItem.objects &&
|
||||||
|
Array.isArray(processedItem.objects) &&
|
||||||
|
processedItem.objects.length > 0) {
|
||||||
|
processedItem.objects = deepProcessObjects(processedItem.objects, callback);
|
||||||
|
}
|
||||||
|
return processedItem;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
canvasData.canvas.objects = deepProcessObjects(canvasData.canvas.objects,(item:any)=>{
|
||||||
|
if(item.type == 'image')item.minioUrl = getMinioUrl(item.src)
|
||||||
|
})
|
||||||
let blob = new Blob([JSON.stringify(canvasData)], { type: "application/json" });
|
let blob = new Blob([JSON.stringify(canvasData)], { type: "application/json" });
|
||||||
let formData = new FormData();
|
let formData = new FormData();
|
||||||
formData.append("file", blob, "data.json");
|
formData.append("file", blob, "data.json");
|
||||||
@@ -449,9 +462,11 @@ export default defineComponent({
|
|||||||
imgUrl:imageDataURL,
|
imgUrl:imageDataURL,
|
||||||
userlikeGroupId:'',
|
userlikeGroupId:'',
|
||||||
}
|
}
|
||||||
|
data.key = false
|
||||||
dataDom.publish.init(value)
|
dataDom.publish.init(value)
|
||||||
}
|
}
|
||||||
const setPublish = ()=>{
|
const setPublish = ()=>{
|
||||||
|
data.key = true
|
||||||
saveCanvas()
|
saveCanvas()
|
||||||
}
|
}
|
||||||
return{
|
return{
|
||||||
|
|||||||
@@ -196,9 +196,9 @@ export default defineComponent({
|
|||||||
type:rv.process == 'SERIES_DESIGN'?'seriesDesign':'singleProductDesign',
|
type:rv.process == 'SERIES_DESIGN'?'seriesDesign':'singleProductDesign',
|
||||||
httpType:rv.process,//项目类型
|
httpType:rv.process,//项目类型
|
||||||
ageGroup:rv.workspaceVO?.ageGroup,
|
ageGroup:rv.workspaceVO?.ageGroup,
|
||||||
style:rv.workspaceVO?.style,
|
style:rv.workspaceVO?.style || '',
|
||||||
styleId:rv.workspaceVO?.styleId,
|
styleId:rv.workspaceVO?.styleId || null,
|
||||||
styleName:rv.workspaceVO?.styleName,
|
styleName:rv.workspaceVO?.styleName || '',
|
||||||
sex:rv.workspaceVO?.sex,
|
sex:rv.workspaceVO?.sex,
|
||||||
userBrandDnaImg:rv.workspaceVO?.userBrandDnaImg,
|
userBrandDnaImg:rv.workspaceVO?.userBrandDnaImg,
|
||||||
userBrandDnaName:rv.workspaceVO?.userBrandDnaName,
|
userBrandDnaName:rv.workspaceVO?.userBrandDnaName,
|
||||||
|
|||||||
@@ -94,9 +94,9 @@ export default defineComponent({
|
|||||||
type:rv.process == 'SERIES_DESIGN'?'seriesDesign':'singleProductDesign',
|
type:rv.process == 'SERIES_DESIGN'?'seriesDesign':'singleProductDesign',
|
||||||
httpType:rv.process,//项目类型
|
httpType:rv.process,//项目类型
|
||||||
ageGroup:rv.workspaceVO.ageGroup,
|
ageGroup:rv.workspaceVO.ageGroup,
|
||||||
style:rv.workspaceVO.style,
|
style:rv.workspaceVO.style || '',
|
||||||
styleId:rv.workspaceVO.styleId,
|
styleId:rv.workspaceVO.styleId || null,
|
||||||
styleName:rv.workspaceVO.styleName,
|
styleName:rv.workspaceVO.styleName || '',
|
||||||
sex:rv.workspaceVO.sex,
|
sex:rv.workspaceVO.sex,
|
||||||
userBrandDnaImg:rv.workspaceVO.userBrandDnaImg,
|
userBrandDnaImg:rv.workspaceVO.userBrandDnaImg,
|
||||||
userBrandDnaName:rv.workspaceVO.userBrandDnaName,
|
userBrandDnaName:rv.workspaceVO.userBrandDnaName,
|
||||||
|
|||||||
@@ -179,9 +179,9 @@ export default defineComponent({
|
|||||||
dataDom.brandDNA.init(data.selectObject);
|
dataDom.brandDNA.init(data.selectObject);
|
||||||
}
|
}
|
||||||
const setWorkspaceStyle = (value:any)=>{
|
const setWorkspaceStyle = (value:any)=>{
|
||||||
data.selectObject.styleName = value.name
|
data.selectObject.styleName = value.name || ''
|
||||||
data.selectObject.style = value.value
|
data.selectObject.style = value.value || ''
|
||||||
data.selectObject.styleId = value.id
|
data.selectObject.styleId = value.id || null
|
||||||
// store.commit('setProbject',data)
|
// store.commit('setProbject',data)
|
||||||
}
|
}
|
||||||
const setWorkspaceBrandDNA = (value:any)=>{
|
const setWorkspaceBrandDNA = (value:any)=>{
|
||||||
@@ -238,9 +238,9 @@ export default defineComponent({
|
|||||||
// type:rv.process == 'SERIES_DESIGN'?'seriesDesign':'singleProductDesign',
|
// type:rv.process == 'SERIES_DESIGN'?'seriesDesign':'singleProductDesign',
|
||||||
// httpType:rv.process,//项目类型
|
// httpType:rv.process,//项目类型
|
||||||
ageGroup:rv.workspaceVO?.ageGroup,
|
ageGroup:rv.workspaceVO?.ageGroup,
|
||||||
style:rv.workspaceVO?.style,
|
style:rv.workspaceVO?.style || '',
|
||||||
styleId:rv.workspaceVO?.styleId,
|
styleId:rv.workspaceVO?.styleId || null,
|
||||||
styleName:rv.workspaceVO?.styleName,
|
styleName:rv.workspaceVO?.styleName || '',
|
||||||
sex:rv.workspaceVO?.sex,
|
sex:rv.workspaceVO?.sex,
|
||||||
userBrandDnaImg:rv.workspaceVO?.userBrandDnaImg,
|
userBrandDnaImg:rv.workspaceVO?.userBrandDnaImg,
|
||||||
userBrandDnaName:rv.workspaceVO?.userBrandDnaName,
|
userBrandDnaName:rv.workspaceVO?.userBrandDnaName,
|
||||||
|
|||||||
@@ -206,11 +206,22 @@ export default defineComponent({
|
|||||||
if(!canvasJSON)return
|
if(!canvasJSON)return
|
||||||
if(!store.state.Workspace.probjects?.id)return
|
if(!store.state.Workspace.probjects?.id)return
|
||||||
let canvasData = JSON.parse(canvasJSON)
|
let canvasData = JSON.parse(canvasJSON)
|
||||||
console.log(canvasData)
|
function deepProcessObjects(data:any, callback:any) {
|
||||||
canvasData.canvas.objects.forEach((objectsItem:any) => {
|
if (!Array.isArray(data)) return data;
|
||||||
if(objectsItem.type == 'image')objectsItem.minioUrl = getMinioUrl(objectsItem.src)
|
return data.map(item => {
|
||||||
|
callback(item)
|
||||||
});
|
const processedItem = {...item};
|
||||||
|
if (processedItem.objects &&
|
||||||
|
Array.isArray(processedItem.objects) &&
|
||||||
|
processedItem.objects.length > 0) {
|
||||||
|
processedItem.objects = deepProcessObjects(processedItem.objects, callback);
|
||||||
|
}
|
||||||
|
return processedItem;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
canvasData.canvas.objects = deepProcessObjects(canvasData.canvas.objects,(item:any)=>{
|
||||||
|
if(item.type == 'image')item.minioUrl = getMinioUrl(item.src)
|
||||||
|
})
|
||||||
let blob = new Blob([JSON.stringify(canvasData)], { type: "application/json" });
|
let blob = new Blob([JSON.stringify(canvasData)], { type: "application/json" });
|
||||||
let formData = new FormData();
|
let formData = new FormData();
|
||||||
formData.append("file", blob, "data.json");
|
formData.append("file", blob, "data.json");
|
||||||
|
|||||||
@@ -352,7 +352,8 @@ export default defineComponent({
|
|||||||
props: {
|
props: {
|
||||||
isDesignPage: {
|
isDesignPage: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: false
|
default: false,
|
||||||
|
required:false
|
||||||
},
|
},
|
||||||
source: {
|
source: {
|
||||||
type: String,
|
type: String,
|
||||||
@@ -773,7 +774,7 @@ export default defineComponent({
|
|||||||
data.lastSelectImg = res.data
|
data.lastSelectImg = res.data
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// 同步尾帧文件列表到全局 store
|
// 同步尾帧文件列表到全局 store(使用专门的 lastFrameList)
|
||||||
store.commit('setPoseTransferLastFrameList', {
|
store.commit('setPoseTransferLastFrameList', {
|
||||||
str: 'set',
|
str: 'set',
|
||||||
list: [file]
|
list: [file]
|
||||||
@@ -989,6 +990,7 @@ export default defineComponent({
|
|||||||
if (data.lastSelectImg?.id === item.id) {
|
if (data.lastSelectImg?.id === item.id) {
|
||||||
data.lastSelectImg = {}
|
data.lastSelectImg = {}
|
||||||
}
|
}
|
||||||
|
// 使用专门的 lastFrameList mutation 清空列表
|
||||||
store.commit('setPoseTransferLastFrameList')
|
store.commit('setPoseTransferLastFrameList')
|
||||||
} else {
|
} else {
|
||||||
// 如果删除的是当前选中的首帧,清空选中状态
|
// 如果删除的是当前选中的首帧,清空选中状态
|
||||||
@@ -1176,10 +1178,10 @@ export default defineComponent({
|
|||||||
firstFrameList.value = store.state.HomeStoreModule.uploadElement.filter(
|
firstFrameList.value = store.state.HomeStoreModule.uploadElement.filter(
|
||||||
item => item.frameType === 'first'
|
item => item.frameType === 'first'
|
||||||
)
|
)
|
||||||
|
// 注意:尾帧通过专门的 watch (lastFrameList) 监听,不需要从这里过滤
|
||||||
lastFrameList.value = store.state.HomeStoreModule.uploadElement.filter(
|
// lastFrameList.value = store.state.HomeStoreModule.uploadElement.filter(
|
||||||
item => item.frameType === 'last'
|
// item => item.frameType === 'last'
|
||||||
)
|
// )
|
||||||
// 更新 showFirstFrameList 中项的选中状态
|
// 更新 showFirstFrameList 中项的选中状态
|
||||||
showFirstFrameList.value.forEach((listItem: any) => {
|
showFirstFrameList.value.forEach((listItem: any) => {
|
||||||
if (listItem.id == data.selectImg.id) {
|
if (listItem.id == data.selectImg.id) {
|
||||||
|
|||||||
@@ -111,7 +111,7 @@ export default defineComponent({
|
|||||||
type: 'personal',
|
type: 'personal',
|
||||||
info: '您的AI时尚设计助手',
|
info: '您的AI时尚设计助手',
|
||||||
price: 'HK$0',
|
price: 'HK$0',
|
||||||
detail: '自注册之日起 5 天内 · 50 个积分',
|
detail: '自注册之日起 7 天内 · 50 个积分',
|
||||||
highlight: '',
|
highlight: '',
|
||||||
discounts: '9折优惠',
|
discounts: '9折优惠',
|
||||||
detailList: [
|
detailList: [
|
||||||
@@ -190,7 +190,7 @@ export default defineComponent({
|
|||||||
type: 'personal',
|
type: 'personal',
|
||||||
info: '您的AI时尚设计助手',
|
info: '您的AI时尚设计助手',
|
||||||
price: 'HK$0',
|
price: 'HK$0',
|
||||||
detail: '自注册之日起 5 天内 · 50 个积分',
|
detail: '自注册之日起 7 天内 · 50 个积分',
|
||||||
highlight: '',
|
highlight: '',
|
||||||
discounts: '9折优惠',
|
discounts: '9折优惠',
|
||||||
detailList: [
|
detailList: [
|
||||||
@@ -255,7 +255,7 @@ export default defineComponent({
|
|||||||
type: 'personal',
|
type: 'personal',
|
||||||
info: 'Your AI Fashion Design Assistant',
|
info: 'Your AI Fashion Design Assistant',
|
||||||
price: 'HK$0',
|
price: 'HK$0',
|
||||||
detail: '5 days from sign-up · 50 credits',
|
detail: '7 days from sign-up · 50 credits',
|
||||||
highlight: '',
|
highlight: '',
|
||||||
discounts: '10% off',
|
discounts: '10% off',
|
||||||
detailList: [
|
detailList: [
|
||||||
@@ -334,7 +334,7 @@ export default defineComponent({
|
|||||||
type: 'personal',
|
type: 'personal',
|
||||||
info: 'Your AI Fashion Design Assistant',
|
info: 'Your AI Fashion Design Assistant',
|
||||||
price: 'HK$0',
|
price: 'HK$0',
|
||||||
detail: '5 days from sign-up · 50 credits',
|
detail: '7 days from sign-up · 50 credits',
|
||||||
highlight: '',
|
highlight: '',
|
||||||
discounts: '10% off',
|
discounts: '10% off',
|
||||||
detailList: [
|
detailList: [
|
||||||
|
|||||||
@@ -79,7 +79,7 @@
|
|||||||
Forgot password?
|
Forgot password?
|
||||||
</div> -->
|
</div> -->
|
||||||
</div>
|
</div>
|
||||||
<div class="password_input_block">
|
<div class="password_input_block" v-show="emailStap !== 2">
|
||||||
<div v-show="passwordConditionShow" class="conditionShow">
|
<div v-show="passwordConditionShow" class="conditionShow">
|
||||||
<div class="item">
|
<div class="item">
|
||||||
<div class="icon">
|
<div class="icon">
|
||||||
@@ -144,12 +144,13 @@
|
|||||||
@click="changePasswordType()"
|
@click="changePasswordType()"
|
||||||
></div>
|
></div>
|
||||||
</div>
|
</div>
|
||||||
<span style="font-weight: 400; opacity: 0.7"
|
<span style="font-weight: 400; opacity: 0.7" v-show="emailStap !== 2"
|
||||||
>{{ userI18n[selectUserI18n].inputPasswordTip }}</span
|
>{{ userI18n[selectUserI18n].inputPasswordTip }}</span
|
||||||
>
|
>
|
||||||
<div class="login_form_title marign_top30">{{ userI18n[selectUserI18n].Email }}</div>
|
<div class="login_form_title marign_top30" v-show="emailStap !== 2">{{ userI18n[selectUserI18n].Email }}</div>
|
||||||
<input
|
<input
|
||||||
class="login_form_input"
|
class="login_form_input"
|
||||||
|
v-show="emailStap !== 2"
|
||||||
:placeholder="userI18n[selectUserI18n].inputEmail"
|
:placeholder="userI18n[selectUserI18n].inputEmail"
|
||||||
v-model="email"
|
v-model="email"
|
||||||
@keydown.enter="submitPerLogin()"
|
@keydown.enter="submitPerLogin()"
|
||||||
@@ -915,8 +916,13 @@ export default defineComponent({
|
|||||||
.login_form_content {
|
.login_form_content {
|
||||||
margin-top: 4rem;
|
margin-top: 4rem;
|
||||||
position: relative;
|
position: relative;
|
||||||
|
min-height: 34rem;
|
||||||
@media (max-width: 768px) {
|
@media (max-width: 768px) {
|
||||||
margin-top: 2.4rem;
|
margin-top: 2.4rem;
|
||||||
|
min-height: auto;
|
||||||
|
&[state="2"] {
|
||||||
|
height: 20rem;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
&[state="2"] {
|
&[state="2"] {
|
||||||
> * {
|
> * {
|
||||||
@@ -1015,6 +1021,9 @@ export default defineComponent({
|
|||||||
// margin-top: 4rem;
|
// margin-top: 4rem;
|
||||||
.email_last_step_bottom {
|
.email_last_step_bottom {
|
||||||
padding: 0 40px;
|
padding: 0 40px;
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
padding: 0 2rem;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.email_last_step_block {
|
.email_last_step_block {
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
@@ -1028,6 +1037,10 @@ export default defineComponent({
|
|||||||
font-size: 2.2rem;
|
font-size: 2.2rem;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
color: #030303;
|
color: #030303;
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
font-size: 1.2rem;
|
||||||
|
margin-left: .5rem;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.email_last_step_block_icon {
|
.email_last_step_block_icon {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
@@ -1229,6 +1242,9 @@ export default defineComponent({
|
|||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
color: #000;
|
color: #000;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
font-size: 1rem;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.email_last_step_des {
|
.email_last_step_des {
|
||||||
@@ -1237,16 +1253,25 @@ export default defineComponent({
|
|||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
margin-top: 4rem;
|
margin-top: 4rem;
|
||||||
margin-bottom: 2rem;
|
margin-bottom: 2rem;
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
margin-top: 2rem;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
.sent_email_content {
|
.sent_email_content {
|
||||||
font-size: 1.8rem;
|
font-size: 1.8rem;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
color: #a5b0c2;
|
color: #a5b0c2;
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
font-size: 1.2rem;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.email_tip_content {
|
.email_tip_content {
|
||||||
font-size: 1.4rem;
|
font-size: 1.4rem;
|
||||||
color: #030303;
|
color: #030303;
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
font-size: 1.2rem;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,11 +2,13 @@
|
|||||||
<div class="generalCanvas">
|
<div class="generalCanvas">
|
||||||
<div class="canvasBox" ref="canvasBox">
|
<div class="canvasBox" ref="canvasBox">
|
||||||
<editCanvas v-if="canvasLoad" :config="canvasConfig"
|
<editCanvas v-if="canvasLoad" :config="canvasConfig"
|
||||||
|
:title="canvasTitle"
|
||||||
@canvasInit="canvasInit"
|
@canvasInit="canvasInit"
|
||||||
@changeCanvas="changeCanvas"
|
@changeCanvas="changeCanvas"
|
||||||
is-general
|
is-general
|
||||||
:hideCanvas="hideCanvas"
|
:hideCanvas="hideCanvas"
|
||||||
:isBackgroundChangeable="false"
|
:isBackgroundChangeable="false"
|
||||||
|
:isChangeCanvasSize="isChangeCanvasSize"
|
||||||
ref="editCanvas"></editCanvas>
|
ref="editCanvas"></editCanvas>
|
||||||
</div>
|
</div>
|
||||||
<div class="btn" v-if="btnShow">
|
<div class="btn" v-if="btnShow">
|
||||||
@@ -35,6 +37,14 @@ export default defineComponent({
|
|||||||
editCanvas,
|
editCanvas,
|
||||||
},
|
},
|
||||||
props:{
|
props:{
|
||||||
|
canvasTitle:{
|
||||||
|
type:String,
|
||||||
|
default:''
|
||||||
|
},
|
||||||
|
isChangeCanvasSize:{
|
||||||
|
type:Boolean,
|
||||||
|
default:true
|
||||||
|
},
|
||||||
imgUrl:{
|
imgUrl:{
|
||||||
type:String,
|
type:String,
|
||||||
default:''
|
default:''
|
||||||
@@ -174,6 +184,7 @@ export default defineComponent({
|
|||||||
return {
|
return {
|
||||||
...toRefs(data),
|
...toRefs(data),
|
||||||
...toRefs(dataDom),
|
...toRefs(dataDom),
|
||||||
|
...toRefs(props),
|
||||||
isShowMark,
|
isShowMark,
|
||||||
canvasLoadAddImg,
|
canvasLoadAddImg,
|
||||||
getCanvasData,
|
getCanvasData,
|
||||||
|
|||||||
@@ -102,9 +102,9 @@ setup(props,{emit}) {
|
|||||||
// if(habitSetStyleData.styleList.length == 0){
|
// if(habitSetStyleData.styleList.length == 0){
|
||||||
// getStyleList()
|
// getStyleList()
|
||||||
// }
|
// }
|
||||||
oldDataId = data.styleId
|
oldDataId = data.styleId || null
|
||||||
habitSetStyleData.selectStyle.id = data.styleId
|
habitSetStyleData.selectStyle.id = data.styleId || null
|
||||||
habitSetStyleData.selectStyle.name = data.styleName
|
habitSetStyleData.selectStyle.name = data.styleName || ''
|
||||||
// habitSetStyleData.selectStyleId = 'feng2'
|
// habitSetStyleData.selectStyleId = 'feng2'
|
||||||
}
|
}
|
||||||
let setCover = (item:any)=>{
|
let setCover = (item:any)=>{
|
||||||
|
|||||||
@@ -165,9 +165,22 @@ export default defineComponent({
|
|||||||
time = setTimeout(()=>{
|
time = setTimeout(()=>{
|
||||||
let canvasData = JSON.parse(canvasJSON)
|
let canvasData = JSON.parse(canvasJSON)
|
||||||
if(!canvasData)return
|
if(!canvasData)return
|
||||||
canvasData.canvas.objects.forEach((objectsItem:any) => {
|
function deepProcessObjects(data:any, callback:any) {
|
||||||
if(objectsItem.type == 'image')objectsItem.minioUrl = getMinioUrl(objectsItem.src)
|
if (!Array.isArray(data)) return data;
|
||||||
});
|
return data.map(item => {
|
||||||
|
callback(item)
|
||||||
|
const processedItem = {...item};
|
||||||
|
if (processedItem.objects &&
|
||||||
|
Array.isArray(processedItem.objects) &&
|
||||||
|
processedItem.objects.length > 0) {
|
||||||
|
processedItem.objects = deepProcessObjects(processedItem.objects, callback);
|
||||||
|
}
|
||||||
|
return processedItem;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
canvasData.canvas.objects = deepProcessObjects(canvasData.canvas.objects,(item:any)=>{
|
||||||
|
if(item.type == 'image')item.minioUrl = getMinioUrl(item.src)
|
||||||
|
})
|
||||||
let blob = new Blob([JSON.stringify(canvasData)], { type: "application/json" });
|
let blob = new Blob([JSON.stringify(canvasData)], { type: "application/json" });
|
||||||
let formData = new FormData();
|
let formData = new FormData();
|
||||||
formData.append("file", blob, "data.json");
|
formData.append("file", blob, "data.json");
|
||||||
|
|||||||
@@ -1147,6 +1147,11 @@ export default {
|
|||||||
System: '系统',
|
System: '系统',
|
||||||
Library: '库'
|
Library: '库'
|
||||||
},
|
},
|
||||||
|
CanvasTitle: {
|
||||||
|
ModifySketch: '修改草图',
|
||||||
|
ModifyItem: '修改单品',
|
||||||
|
RedGreen: '编辑前片后片',
|
||||||
|
},
|
||||||
Canvas: {
|
Canvas: {
|
||||||
Canvas: '画布',
|
Canvas: '画布',
|
||||||
layer: '图层',
|
layer: '图层',
|
||||||
@@ -1498,6 +1503,12 @@ export default {
|
|||||||
CompositeLuminosity: '亮度',
|
CompositeLuminosity: '亮度',
|
||||||
CompositeLuminosityTip: '亮度:保留原图像颜色,改变新图像亮度',
|
CompositeLuminosityTip: '亮度:保留原图像颜色,改变新图像亮度',
|
||||||
GarmentPartSelector: '服装部件选取',
|
GarmentPartSelector: '服装部件选取',
|
||||||
|
LeftClickAdd: '左键添加',
|
||||||
|
RightClickRemove: '右键移除',
|
||||||
|
PointSelection: '点选',
|
||||||
|
MarqueeSelection: '框选',
|
||||||
|
BrushSelection: '画笔',
|
||||||
|
Erase: '擦除',
|
||||||
},
|
},
|
||||||
speedList: {
|
speedList: {
|
||||||
High: '高级',
|
High: '高级',
|
||||||
@@ -1521,7 +1532,8 @@ export default {
|
|||||||
LiquefactionTool: '液化工具'
|
LiquefactionTool: '液化工具'
|
||||||
},
|
},
|
||||||
event: {
|
event: {
|
||||||
back: '返回'
|
back: '返回',
|
||||||
|
detail:'查看详情'
|
||||||
},
|
},
|
||||||
admin: {
|
admin: {
|
||||||
allUser: '所有用户',
|
allUser: '所有用户',
|
||||||
|
|||||||
3532
src/lang/en.ts
@@ -53,6 +53,12 @@ const routes: Array<RouteRecordRaw> = [
|
|||||||
meta: { enter: "all" },
|
meta: { enter: "all" },
|
||||||
component: () => import("@/views/Register.vue"),
|
component: () => import("@/views/Register.vue"),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: "/register/:lang",
|
||||||
|
name: "registerLang",
|
||||||
|
meta: { enter: "all" },
|
||||||
|
component: () => import("@/views/Register.vue"),
|
||||||
|
},
|
||||||
{
|
{
|
||||||
path: "/upgrade",
|
path: "/upgrade",
|
||||||
name: "upgrade",
|
name: "upgrade",
|
||||||
@@ -437,8 +443,8 @@ const routes: Array<RouteRecordRaw> = [
|
|||||||
component:()=>import('@/views/AwardPage/index.vue')
|
component:()=>import('@/views/AwardPage/index.vue')
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path:'apply',
|
path:'contestants',
|
||||||
name:'Apply',
|
name:'Contestants',
|
||||||
component:()=>import('@/views/AwardPage/apply.vue')
|
component:()=>import('@/views/AwardPage/apply.vue')
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -532,7 +538,7 @@ function isTimeRangePassed(timeRange) {
|
|||||||
router.beforeEach((to: any, from, next) => {
|
router.beforeEach((to: any, from, next) => {
|
||||||
store.commit("set_view_loading", true);
|
store.commit("set_view_loading", true);
|
||||||
//系统维护时间
|
//系统维护时间
|
||||||
const time = '2025-12-19T21:00:00 - 2025-12-19T22:00:00';
|
const time = '2026-01-23T21:00:00 - 2026-01-23T22:00:00';
|
||||||
if (isTimeRangePassed(time) == 'in_progress') {
|
if (isTimeRangePassed(time) == 'in_progress') {
|
||||||
// 系统维护
|
// 系统维护
|
||||||
const toName = to.name === 'upgrade';
|
const toName = to.name === 'upgrade';
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ const DesignDetail : Module<DesignDetail,RootState> = {
|
|||||||
left:v.layersObject[i].position?.[1],
|
left:v.layersObject[i].position?.[1],
|
||||||
width:v.layersObject[i].imageSize?.[0],
|
width:v.layersObject[i].imageSize?.[0],
|
||||||
height:v.layersObject[i].imageSize?.[1],
|
height:v.layersObject[i].imageSize?.[1],
|
||||||
transform:`rotate(${v.layersObject[i]?.rotate || 0}deg) scaleX(${v.layersObject[i].transpose?.[0] || 1}) scaleY(${v.layersObject[i].transpose?.[1] || 1})`,
|
transform:`rotate(${v.layersObject?.[i]?.rotate || 0}deg) scaleX(${v.layersObject[i].transpose?.[0] || 1}) scaleY(${v.layersObject[i].transpose?.[1] || 1})`,
|
||||||
}
|
}
|
||||||
v.layersObject[i].centers={
|
v.layersObject[i].centers={
|
||||||
left:0,
|
left:0,
|
||||||
@@ -277,7 +277,7 @@ const DesignDetail : Module<DesignDetail,RootState> = {
|
|||||||
width:item.layersObject[i].imageSize?.[0] * scale + 'px',
|
width:item.layersObject[i].imageSize?.[0] * scale + 'px',
|
||||||
height:item.layersObject[i].imageSize?.[1] * scale + 'px',
|
height:item.layersObject[i].imageSize?.[1] * scale + 'px',
|
||||||
zIndex:v?.style?.zIndex?v.style.zIndex:v.priority?v.priority:state.frontBack.front.length,
|
zIndex:v?.style?.zIndex?v.style.zIndex:v.priority?v.priority:state.frontBack.front.length,
|
||||||
transform:`rotate(${item.layersObject?.[i]?.rotate || 0}deg) scaleX(${item.layersObject[i].transpose?.[0] || 1}) scaleY(${item.layersObject[i].transpose?.[1] || 1})`,
|
transform:`scaleX(${item.layersObject[i].transpose?.[0] || 1}) scaleY(${item.layersObject[i].transpose?.[1] || 1}) rotate(${item.layersObject?.[i]?.rotate || 0}deg)`,
|
||||||
}
|
}
|
||||||
item.layersObject[i].centers={
|
item.layersObject[i].centers={
|
||||||
left:0,
|
left:0,
|
||||||
@@ -315,6 +315,24 @@ const DesignDetail : Module<DesignDetail,RootState> = {
|
|||||||
detailItem.offset = [0,0]
|
detailItem.offset = [0,0]
|
||||||
detailItem.transpose = item.transpose || [1,1]
|
detailItem.transpose = item.transpose || [1,1]
|
||||||
detailItem.rotate = item.rotate || 0
|
detailItem.rotate = item.rotate || 0
|
||||||
|
function isJSONString(str) {
|
||||||
|
try {
|
||||||
|
JSON.parse(str);
|
||||||
|
return true; // 解析成功,是有效的JSON字符串
|
||||||
|
} catch (e) {
|
||||||
|
return false; // 解析失败,不是有效的JSON字符串
|
||||||
|
}
|
||||||
|
}
|
||||||
|
item.trims?.prints?.forEach((item:any) => {
|
||||||
|
if(isJSONString(item.object)){
|
||||||
|
item.object = JSON.parse(item.object)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
item.printObject?.prints?.forEach((item:any) => {
|
||||||
|
if(isJSONString(item.object)){
|
||||||
|
item.object = JSON.parse(item.object)
|
||||||
|
}
|
||||||
|
});
|
||||||
detailItem.printObject = item.printObject
|
detailItem.printObject = item.printObject
|
||||||
detailItem.trims = item.trims
|
detailItem.trims = item.trims
|
||||||
detailItem.type = item.type
|
detailItem.type = item.type
|
||||||
@@ -345,7 +363,6 @@ const DesignDetail : Module<DesignDetail,RootState> = {
|
|||||||
uploadDetail(state.selectDetail)
|
uploadDetail(state.selectDetail)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(value.fun)value.fun()
|
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ const HomeStoreModule : Module<DesignDetail,RootState> = {
|
|||||||
},
|
},
|
||||||
setPoseTransferLastFrameList(state,data){
|
setPoseTransferLastFrameList(state,data){
|
||||||
// 支持两种方式:set 替换整个列表;add/删除与 uploadElement 一致
|
// 支持两种方式:set 替换整个列表;add/删除与 uploadElement 一致
|
||||||
if(data.str === 'set'){
|
if(data?.str === 'set'){
|
||||||
state.lastFrameList = data.list || []
|
state.lastFrameList = data.list || []
|
||||||
return
|
return
|
||||||
}else{
|
}else{
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ const userHabit : Module<UserHabit,RootState> = {
|
|||||||
followeeCount: '-',
|
followeeCount: '-',
|
||||||
followerCount: '-',
|
followerCount: '-',
|
||||||
accountExtendList:null,
|
accountExtendList:null,
|
||||||
systemList:[],
|
systemList:[1],
|
||||||
expireTime:null,
|
expireTime:null,
|
||||||
language:'',
|
language:'',
|
||||||
organizationId: null,
|
organizationId: null,
|
||||||
@@ -194,7 +194,7 @@ const userHabit : Module<UserHabit,RootState> = {
|
|||||||
followeeCount: '-',
|
followeeCount: '-',
|
||||||
followerCount: '-',
|
followerCount: '-',
|
||||||
accountExtendList:null,
|
accountExtendList:null,
|
||||||
systemList:[],
|
systemList:[1],
|
||||||
expireTime:null,
|
expireTime:null,
|
||||||
language:'',
|
language:'',
|
||||||
organizationId: null,
|
organizationId: null,
|
||||||
@@ -407,7 +407,7 @@ const userHabit : Module<UserHabit,RootState> = {
|
|||||||
item.name = name
|
item.name = name
|
||||||
});
|
});
|
||||||
// const {t} = useI18n()
|
// const {t} = useI18n()
|
||||||
rv.unshift({name:t('Model.all'),value:'',id:''})
|
rv.unshift({name:t('Model.all'),value:'',id:null})
|
||||||
store.commit('setMannequinStyle',rv)
|
store.commit('setMannequinStyle',rv)
|
||||||
resolve('')
|
resolve('')
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -74,7 +74,8 @@ const Workspace: Module<DesignDetail, RootState> = {
|
|||||||
},
|
},
|
||||||
setProbject(state, data) {
|
setProbject(state, data) {
|
||||||
for (const key in data) {
|
for (const key in data) {
|
||||||
if (data[key] == undefined) continue
|
let list = ['styleName','styleId','style']
|
||||||
|
if (data[key] == undefined && !list.includes(key)) continue
|
||||||
state.probjects[key] = data[key]
|
state.probjects[key] = data[key]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -2,18 +2,17 @@ import axios from 'axios'
|
|||||||
// import qs from 'qs'
|
// import qs from 'qs'
|
||||||
// import message from '@/components/public/message/src'
|
// import message from '@/components/public/message/src'
|
||||||
import router from '@/router/index'
|
import router from '@/router/index'
|
||||||
import {getCookie,clonAllCookie} from '@/tool/cookie'
|
import { getCookie, clonAllCookie } from '@/tool/cookie'
|
||||||
// import cookie from '@/tools/cookie.js'
|
// import cookie from '@/tools/cookie.js'
|
||||||
|
|
||||||
axios.defaults.timeout = 60000; //响应时间
|
axios.defaults.timeout = 60000 //响应时间
|
||||||
// axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'; //配置请求头
|
// axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'; //配置请求头
|
||||||
axios.defaults.headers.post["Content-Type"] = "application/json";
|
axios.defaults.headers.post['Content-Type'] = 'application/json'
|
||||||
|
|
||||||
|
axios.defaults.headers.post['lang'] = 'en' //配置语言请求头
|
||||||
axios.defaults.headers.post['lang'] = 'en'; //配置语言请求头
|
axios.defaults.withCredentials = true //跨域携带cookie
|
||||||
axios.defaults.withCredentials = true; //跨域携带cookie
|
import { message } from 'ant-design-vue'
|
||||||
import { message } from 'ant-design-vue';
|
import store from '@/store'
|
||||||
import store from '@/store';
|
|
||||||
// if(import.meta.env.VITE_USER_NODE_ENV == "development"){
|
// if(import.meta.env.VITE_USER_NODE_ENV == "development"){
|
||||||
// axios.defaults.baseURL = ""; //配置接口地址
|
// axios.defaults.baseURL = ""; //配置接口地址
|
||||||
// }else{
|
// }else{
|
||||||
@@ -25,110 +24,128 @@ import store from '@/store';
|
|||||||
// }else{
|
// }else{
|
||||||
// httpIp = ''
|
// httpIp = ''
|
||||||
// }
|
// }
|
||||||
let httpIp = import.meta.env.VITE_USER_NODE_ENV == 'development' ? "" : "";
|
let httpIp = import.meta.env.VITE_USER_NODE_ENV == 'development' ? '' : ''
|
||||||
// let httpIp = import.meta.env.VITE_USER_NODE_ENV == 'development' ? "https://192.168.1.8:10086" : "";
|
// let httpIp = import.meta.env.VITE_USER_NODE_ENV == 'development' ? "https://192.168.1.8:10086" : "";
|
||||||
|
|
||||||
axios.defaults.baseURL = httpIp; //配置接口地址
|
axios.defaults.baseURL = httpIp //配置接口地址
|
||||||
// console.log(axios.defaults.baseURL);
|
// console.log(axios.defaults.baseURL);
|
||||||
axios.defaults.baseURL = import.meta.env.VITE_APP_BASE_URL; //配置接口地址
|
axios.defaults.baseURL = import.meta.env.VITE_APP_BASE_URL //配置接口地址
|
||||||
console.log(import.meta.env.VITE_APP_BASE_URL)
|
console.log(import.meta.env.VITE_APP_BASE_URL)
|
||||||
|
|
||||||
// 创建取消令牌
|
// 创建取消令牌
|
||||||
const CancelToken = axios.CancelToken;
|
const CancelToken = axios.CancelToken
|
||||||
const source = CancelToken.source();
|
const source = CancelToken.source()
|
||||||
// console.log(import.meta.env.VITE_APP_BASE_URL);
|
// console.log(import.meta.env.VITE_APP_BASE_URL);
|
||||||
let isLoginTime = false
|
let isLoginTime = false
|
||||||
//POST传参序列化(添加请求拦截器)
|
//POST传参序列化(添加请求拦截器)
|
||||||
axios.interceptors.request.use((config) => {
|
axios.interceptors.request.use(
|
||||||
//在发送请求之前做某件事
|
config => {
|
||||||
|
//在发送请求之前做某件事
|
||||||
|
|
||||||
|
// config.cancelToken = source.token
|
||||||
|
if (
|
||||||
// config.cancelToken = source.token
|
config.method === 'post' ||
|
||||||
if(config.method === 'post' || config.method === 'put' || config.method === 'delete'){
|
config.method === 'put' ||
|
||||||
// config.data = qs.stringify(config.data);
|
config.method === 'delete'
|
||||||
// config.data = JSON.stringify(config.data);
|
) {
|
||||||
}
|
// config.data = qs.stringify(config.data);
|
||||||
// config.headers.Authorization = 'Bearer-eyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiIyIiwic3ViIjoie1wiaWRcIjoyLFwidXNlcm5hbWVcIjpcImxpcnNcIn0iLCJpYXQiOjE2NjU3NDEwODcsImlzcyI6IkRXSiIsImF1dGhvcml0aWVzIjoiW10iLCJleHAiOjE2NzQzODEwODd9.ShM9R_NNFD7oo1OvxrEgg7PFeWinOuAKkuInUCMQupp66s64Hhv8tN0Wwr83nIN4rHPqtn95wmd4msWcvaFYJA';
|
// config.data = JSON.stringify(config.data);
|
||||||
config.headers.Authorization = getCookie('token');
|
}
|
||||||
return config;
|
// config.headers.Authorization = 'Bearer-eyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiIyIiwic3ViIjoie1wiaWRcIjoyLFwidXNlcm5hbWVcIjpcImxpcnNcIn0iLCJpYXQiOjE2NjU3NDEwODcsImlzcyI6IkRXSiIsImF1dGhvcml0aWVzIjoiW10iLCJleHAiOjE2NzQzODEwODd9.ShM9R_NNFD7oo1OvxrEgg7PFeWinOuAKkuInUCMQupp66s64Hhv8tN0Wwr83nIN4rHPqtn95wmd4msWcvaFYJA';
|
||||||
},(error) =>{
|
config.headers.Authorization = getCookie('token')
|
||||||
return Promise.reject(error);
|
return config
|
||||||
});
|
},
|
||||||
const binaryToUrl = (binary,type = 'application/json',res)=>{
|
error => {
|
||||||
let blob = new Blob([binary], {'content-type':type});
|
return Promise.reject(error)
|
||||||
let url = URL.createObjectURL(blob);
|
}
|
||||||
|
)
|
||||||
|
const binaryToUrl = (binary, type = 'application/json', res) => {
|
||||||
|
let blob = new Blob([binary], { 'content-type': type })
|
||||||
|
let url = URL.createObjectURL(blob)
|
||||||
return url
|
return url
|
||||||
}
|
}
|
||||||
//返回状态判断(添加响应拦截器)
|
//返回状态判断(添加响应拦截器)
|
||||||
axios.interceptors.response.use((res) =>{
|
axios.interceptors.response.use(
|
||||||
// if(res.data.data == null){
|
res => {
|
||||||
// message.warning(res.data.errMsg)
|
// 允许透传完整响应:请求时传 config.fullData = true
|
||||||
// return Promise.reject(res.data);
|
|
||||||
// }else
|
|
||||||
if(res?.config?.env?.binary){
|
|
||||||
let url = binaryToUrl(res.data,res.config.env.binaryType,res)
|
|
||||||
return Promise.resolve({url,data:res.data})
|
|
||||||
}
|
|
||||||
if (res?.data) {
|
|
||||||
if (res?.data?.errCode === 0) {
|
|
||||||
// message.error(res?.data?.errMsg)
|
|
||||||
return Promise.resolve(res?.data?.data);
|
|
||||||
} else if(res?.data?.errCode === 1){
|
|
||||||
message.warning(res?.data?.errMsg)
|
|
||||||
return Promise.reject(res?.data);
|
|
||||||
} else if(res?.data?.errCode === 2){
|
|
||||||
return Promise.reject(res?.data);
|
|
||||||
}else if(res?.data?.errCode === -1){
|
|
||||||
message.error(res?.data?.errMsg)
|
|
||||||
return Promise.reject(res?.data);
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
// if(res.data.data == null){
|
||||||
if (res?.data?.errCode === 0) {
|
// message.warning(res.data.errMsg)
|
||||||
message.warning(res?.data?.errMsg)
|
// return Promise.reject(res.data);
|
||||||
return Promise.reject(res?.data);
|
// }else
|
||||||
} else if(res?.data?.errCode === 1){
|
if (res?.config?.env?.binary) {
|
||||||
message.warning(res?.data?.errMsg)
|
let url = binaryToUrl(res.data, res.config.env.binaryType, res)
|
||||||
return Promise.reject(res?.data);
|
return Promise.resolve({ url, data: res.data })
|
||||||
} else if(res?.data?.errCode === 2){
|
|
||||||
return Promise.reject(res?.data);
|
|
||||||
}else if(res?.data?.errCode === -1){
|
|
||||||
message.error(res?.data?.errMsg)
|
|
||||||
return Promise.reject(res?.data);
|
|
||||||
}
|
}
|
||||||
}
|
if (res?.data) {
|
||||||
}, function(error) {
|
if (res?.data?.errCode === 0) {
|
||||||
if(error?.response?.status === 401 && router.currentRoute._value.name != 'setIdentification'){//如果是记录浏览器页面就不跳转login
|
// message.error(res?.data?.errMsg)
|
||||||
clonAllCookie()
|
if (res?.config?.fullData) {
|
||||||
if(!isLoginTime){
|
return Promise.resolve(res.data)
|
||||||
isLoginTime = true
|
|
||||||
let isSystemUserRouteList = ['/Square']//如果是这两个页面就无需跳转未登录页
|
|
||||||
let sSystemUser = false
|
|
||||||
for (let index = 0; index < isSystemUserRouteList.length; index++) {
|
|
||||||
if(router.currentRoute.value.path.indexOf(isSystemUserRouteList[index]) > -1){
|
|
||||||
sSystemUser = true
|
|
||||||
break
|
|
||||||
}
|
}
|
||||||
|
return Promise.resolve(res?.data?.data)
|
||||||
|
} else if (res?.data?.errCode === 1) {
|
||||||
|
message.warning(res?.data?.errMsg)
|
||||||
|
return Promise.reject(res?.data)
|
||||||
|
} else if (res?.data?.errCode === 2) {
|
||||||
|
return Promise.reject(res?.data)
|
||||||
|
} else if (res?.data?.errCode === -1) {
|
||||||
|
message.error(res?.data?.errMsg)
|
||||||
|
return Promise.reject(res?.data)
|
||||||
}
|
}
|
||||||
if(!sSystemUser){
|
} else {
|
||||||
router.replace('/')
|
if (res?.data?.errCode === 0) {
|
||||||
|
message.warning(res?.data?.errMsg)
|
||||||
|
return Promise.reject(res?.data)
|
||||||
|
} else if (res?.data?.errCode === 1) {
|
||||||
|
message.warning(res?.data?.errMsg)
|
||||||
|
return Promise.reject(res?.data)
|
||||||
|
} else if (res?.data?.errCode === 2) {
|
||||||
|
return Promise.reject(res?.data)
|
||||||
|
} else if (res?.data?.errCode === -1) {
|
||||||
|
message.error(res?.data?.errMsg)
|
||||||
|
return Promise.reject(res?.data)
|
||||||
}
|
}
|
||||||
message.warning('Please login and try again~')
|
|
||||||
store.commit('createDetail')
|
|
||||||
store.commit('createProbject')
|
|
||||||
store.commit('createProjectPath')
|
|
||||||
setTimeout(()=>[
|
|
||||||
isLoginTime = false
|
|
||||||
],2000)
|
|
||||||
}
|
}
|
||||||
// source.cancel('取消后续接口调用');
|
},
|
||||||
return Promise.reject()
|
function (error) {
|
||||||
}
|
if (
|
||||||
let data_new = error?.response?.data
|
error?.response?.status === 401 &&
|
||||||
// message.error(data_new?.errMsg || 'Error: server exception')
|
router.currentRoute._value.name != 'setIdentification'
|
||||||
return Promise.reject(data_new);
|
) {
|
||||||
});
|
//如果是记录浏览器页面就不跳转login
|
||||||
|
clonAllCookie()
|
||||||
|
if (!isLoginTime) {
|
||||||
|
isLoginTime = true
|
||||||
|
let isSystemUserRouteList = ['/Square'] //如果是这两个页面就无需跳转未登录页
|
||||||
|
let sSystemUser = false
|
||||||
|
for (let index = 0; index < isSystemUserRouteList.length; index++) {
|
||||||
|
if (
|
||||||
|
router.currentRoute.value.path.indexOf(
|
||||||
|
isSystemUserRouteList[index]
|
||||||
|
) > -1
|
||||||
|
) {
|
||||||
|
sSystemUser = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!sSystemUser) {
|
||||||
|
router.replace('/')
|
||||||
|
}
|
||||||
|
message.warning('Please login and try again~')
|
||||||
|
store.commit('createDetail')
|
||||||
|
store.commit('createProbject')
|
||||||
|
store.commit('createProjectPath')
|
||||||
|
setTimeout(() => [(isLoginTime = false)], 2000)
|
||||||
|
}
|
||||||
|
// source.cancel('取消后续接口调用');
|
||||||
|
return Promise.reject()
|
||||||
|
}
|
||||||
|
let data_new = error?.response?.data
|
||||||
|
// message.error(data_new?.errMsg || 'Error: server exception')
|
||||||
|
return Promise.reject(data_new)
|
||||||
|
}
|
||||||
|
)
|
||||||
export const Https = {
|
export const Https = {
|
||||||
httpUrls: {
|
httpUrls: {
|
||||||
interfaceUrl: '',
|
interfaceUrl: '',
|
||||||
@@ -447,9 +464,16 @@ export const Https = {
|
|||||||
segAnything: `/api/python/segAnything`, //分割Anything
|
segAnything: `/api/python/segAnything`, //分割Anything
|
||||||
|
|
||||||
// award页面
|
// award页面
|
||||||
uploadPDF: '/api/global-award/uploads/pdf', // 上传pdf
|
checkEmail: '/api/global-award/checkEmail', // 检查邮箱是否存在
|
||||||
uploadVideo: '/api/global-award/uploads/video', // 上传video
|
checkOTP: '/api/global-award/checkCode', // 检查验证码是否正确
|
||||||
|
initPdfUpload: '/api/global-award/uploads/pdf/init', // 初始化pdf上传
|
||||||
|
initVideoUpload: '/api/global-award/uploads/video/init', // 初始化video上传
|
||||||
|
uploadPDF: '/api/global-award/uploads/pdf/chunk', // 上传pdf
|
||||||
|
uploadVideo: '/api/global-award/uploads/video/chunk', // 上传video
|
||||||
|
uploadPDFComplete: '/api/global-award/uploads/pdf/complete', // 上传pdf完成
|
||||||
|
uploadVideoComplete: '/api/global-award/uploads/video/complete', // 上传video完成
|
||||||
|
submitForm: '/api/global-award/contestants/save', // 提交表单
|
||||||
|
getContestantByID: '/api/global-award/contestants/' // 获取表单
|
||||||
},
|
},
|
||||||
|
|
||||||
axiosGet(url, config) {
|
axiosGet(url, config) {
|
||||||
|
|||||||
@@ -272,12 +272,12 @@ const navTypeList = (t)=>{
|
|||||||
// },
|
// },
|
||||||
|
|
||||||
|
|
||||||
// {
|
{
|
||||||
// icon:'fi fi-rr-puzzle-alt',
|
icon:'fi fi-rr-puzzle-alt',
|
||||||
// value:'deReconstruction',
|
value:'deReconstruction',
|
||||||
// label:t('Header.toolsDeReconstruction'),
|
label:t('Header.toolsDeReconstruction'),
|
||||||
// router:'tools=deReconstruction'
|
router:'tools=deReconstruction'
|
||||||
// },
|
},
|
||||||
{
|
{
|
||||||
icon:'fi fi-ss-box-open',
|
icon:'fi fi-ss-box-open',
|
||||||
value:'toProduct',
|
value:'toProduct',
|
||||||
@@ -294,18 +294,18 @@ const navTypeList = (t)=>{
|
|||||||
label:t('Header.toolsToTransferPose'),
|
label:t('Header.toolsToTransferPose'),
|
||||||
router:'tools=poseTransfer'
|
router:'tools=poseTransfer'
|
||||||
},
|
},
|
||||||
// {
|
{
|
||||||
// icon:'fi fi-rr-cubes',
|
icon:'fi fi-rr-cubes',
|
||||||
// value:'patternMaking3D',
|
value:'patternMaking3D',
|
||||||
// label:t('Header.toolsPatternMaking'),
|
label:t('Header.toolsPatternMaking'),
|
||||||
// router:'tools=patternMaking3D'
|
router:'tools=patternMaking3D'
|
||||||
// },
|
},
|
||||||
// {
|
{
|
||||||
// icon:'fi fi-rr-pen-swirl',
|
icon:'fi fi-rr-pen-swirl',
|
||||||
// value:'canvasUpload',
|
value:'canvasUpload',
|
||||||
// label:t('Header.toolsCanvas'),
|
label:t('Header.toolsCanvas'),
|
||||||
// router:'tools=canvasUpload'
|
router:'tools=canvasUpload'
|
||||||
// },
|
},
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
library:{
|
library:{
|
||||||
|
|||||||