Compare commits
188 Commits
5e1d43b5a0
...
dev_vite
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5eaa77596e | ||
|
|
848e7b4692 | ||
|
|
fd140ebc56 | ||
|
|
34094c8c92 | ||
|
|
e4dc2bf729 | ||
|
|
7f226179d9 | ||
|
|
3edff6b05c | ||
|
|
6fd1212298 | ||
| e093cccb8d | |||
| b2c6c61515 | |||
| 0219b1a2f4 | |||
| 133433a260 | |||
| 90a59a3dc5 | |||
| c8a65ee2cb | |||
| 226918e941 | |||
|
|
494bfd68ca | ||
|
|
95b70792ba | ||
|
|
a0fffa5896 | ||
|
|
06eaabc742 | ||
|
|
27da4739a6 | ||
| 52576aa0a1 | |||
| 22aa7c37cd | |||
| 752b33f196 | |||
| f3b873b7ae | |||
| 006c2e3f9c | |||
|
|
1f413b36ca | ||
|
|
e7b052f100 | ||
|
|
19bb412470 | ||
|
|
a1e071f7bc | ||
|
|
5388b2df4c | ||
|
|
76e507cae3 | ||
|
|
d4e9462d39 | ||
|
|
4a11d172d2 | ||
|
|
e20092c77f | ||
|
|
5f4656c629 | ||
|
|
14eca9aff2 | ||
|
|
88f0528553 | ||
|
|
afbea289fb | ||
| eb2baa26a7 | |||
|
|
62829395ce | ||
|
|
16532ce44b | ||
|
|
27de720137 | ||
|
|
acf2029efe | ||
|
|
49398aac48 | ||
|
|
b3d9bce440 | ||
|
|
596bc75b83 | ||
|
|
c673948dd3 | ||
|
|
1f8ee2e48e | ||
| e5ae549a3d | |||
| 88c2ae8583 | |||
|
|
f4897e2c92 | ||
| aab96bbe70 | |||
| 4004fa2703 | |||
|
|
4a078186a9 | ||
| fafccf0352 | |||
| 64844105b5 | |||
| d6a07e7fc7 | |||
| 7eff1b0506 | |||
| 2dc98e5dd8 | |||
|
|
3e7a90bd2d | ||
|
|
d42a1bef8d | ||
| 5d184bf1f9 | |||
| 56825fcbb1 | |||
| 7cf37e2da6 | |||
| 59a7c169ad | |||
| fc997a1cce | |||
|
|
8abcdb151d | ||
|
|
55481c6d51 | ||
| ca39910f4c | |||
| 646b48ca6b | |||
| 45f150769e | |||
|
|
7115feb20c | ||
| 00d488cbc2 | |||
| 12233b952b | |||
| 4b8554f41e | |||
| f30a749f65 | |||
|
|
af544d2da8 | ||
| aedd633f8e | |||
| 1e4134f8b9 | |||
|
|
27da8f6680 | ||
|
|
88c66c634f | ||
| 5cfccabcd7 | |||
| 04ad920590 | |||
| 05178c4cb0 | |||
| a385aba49f | |||
|
|
813918eb39 | ||
|
|
f77a2f2e01 | ||
|
|
9dc25ddced | ||
|
|
e453d1efd4 | ||
|
|
78922a5b91 | ||
|
|
b04bcb5918 | ||
|
|
6d41e8cc34 | ||
|
|
9dca4e3155 | ||
|
|
0c140c2896 | ||
|
|
bd603e1bf9 | ||
| f269a40431 | |||
| 55a8675806 | |||
|
|
c0e5611897 | ||
|
|
821f35b7c7 | ||
|
|
39c0ee110a | ||
|
|
22e8efda25 | ||
|
|
114a998031 | ||
|
|
ee4eef1558 | ||
|
|
a9e5b979a1 | ||
|
|
7bb38bf2e5 | ||
|
|
e4fc51c574 | ||
|
|
071930f257 | ||
|
|
136c24ce30 | ||
|
|
2708c5442c | ||
|
|
0cbd0c848d | ||
|
|
9845b2ebb0 | ||
|
|
41f8bed6a3 | ||
|
|
ca21169fda | ||
|
|
b1458de4e0 | ||
|
|
743fc762d6 | ||
| 7297e4e7a4 | |||
| 3bff1ebb66 | |||
| 0d1656ee0a | |||
| 7d0873d874 | |||
| d8caa472ea | |||
| 6b138b7a04 | |||
| 82941bca7c | |||
| 949ff9292d | |||
| 19230f6c5a | |||
| 583f61d875 | |||
|
|
44250f2f79 | ||
|
|
11c9de8ced | ||
|
|
06d78524ed | ||
|
|
fd518ad9b3 | ||
| 19ef5b031e | |||
| 4394158d30 | |||
| ec632554e2 | |||
| 429c7db195 | |||
| 8a9b217314 | |||
| f9caa4b279 | |||
| 68f17ba87b | |||
| 92c789510f | |||
| 0a442f8132 | |||
|
|
1fe1bd4aa2 | ||
|
|
a2b45e2041 | ||
|
|
da64b57c1c | ||
|
|
7ad29081af | ||
|
|
ce6522ef90 | ||
| 9758c562c3 | |||
| 9e12d54540 | |||
|
|
44abb1b1ee | ||
|
|
27b71f1bec | ||
|
|
ddb7a366b5 | ||
| d4d104c690 | |||
| 48516a5f42 | |||
| 646ecd072c | |||
| ce0f9f0bbf | |||
| 0985a004de | |||
| 1d9fdfa9f8 | |||
| f56718e93a | |||
|
|
91cfcd7e40 | ||
|
|
7c14b1d831 | ||
|
|
8966b52430 | ||
| 8a9e7205eb | |||
| 0778cb7081 | |||
| 66a5f632fb | |||
|
|
5df602e26f | ||
|
|
9707615b63 | ||
|
|
4d6a1f512e | ||
|
|
d7d66b8da4 | ||
|
|
5fa049f73d | ||
|
|
575445f767 | ||
|
|
0ea664f32a | ||
|
|
68de44236d | ||
|
|
f43c56236b | ||
|
|
54cc7bd359 | ||
|
|
88f3bed2c1 | ||
|
|
74d8723ecd | ||
|
|
4352f7c2f4 | ||
|
|
c6b1bdbdf1 | ||
|
|
3be24cad90 | ||
|
|
b33a2e1d08 | ||
|
|
f16aa6ea14 | ||
|
|
a25abeb527 | ||
|
|
3b70ed2830 | ||
|
|
5e77348913 | ||
|
|
7fdd22fe63 | ||
| a525d4f54a | |||
| 46b264e69e | |||
| 27651e3a46 | |||
|
|
d359cd7763 | ||
| 23085d9a9b | |||
|
|
35c6dfe29c |
4
.env.dev
@@ -3,11 +3,13 @@ VITE_USER_NODE_ENV = 'development'
|
||||
# VITE_APP_BASE_URL = 'https://api.aida.com.hk'
|
||||
|
||||
# VITE_APP_BASE_URL = 'http://18.167.251.121:10086'
|
||||
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://18.167.251.121:10094'
|
||||
# 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.82:5567'
|
||||
# VITE_APP_BASE_URL = 'http://192.168.31.82:5569'
|
||||
# 海波
|
||||
# VITE_APP_BASE_URL = 'http://192.168.31.34:5567'
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
VITE_USER_NODE_ENV = 'development'
|
||||
VITE_USER_NODE_ENV = 'development_cloud'
|
||||
# VITE_APP_BASE_URL = 'https://aida.com.hk/test'
|
||||
# VITE_APP_BASE_URL = 'http://18.167.251.121:10088'
|
||||
# VITE_APP_BASE_URL = 'https://api.aida.com.hk'
|
||||
VITE_APP_BASE_URL = 'https://develop.api.aida.com.hk'
|
||||
# VITE_APP_BASE_URL = 'https://develop.api.aida.com.hk'
|
||||
VITE_APP_BASE_URL = 'https://www.develop-ms.api.aida.com.hk'
|
||||
|
||||
# VITE_APP_BASE_URL = 'http://localhost:22170'
|
||||
|
||||
2
.gitignore
vendored
@@ -25,3 +25,5 @@ dist.rar
|
||||
.eslintrc-auto-import.json
|
||||
components.d.ts
|
||||
.cursor
|
||||
*.zip
|
||||
*.7z
|
||||
@@ -1,33 +0,0 @@
|
||||
/** @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',
|
||||
};
|
||||
17
.prettierrc.json
Normal file
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"printWidth": 100,
|
||||
"tabWidth": 4,
|
||||
"useTabs": true,
|
||||
"endOfLine": "lf",
|
||||
"semi": false,
|
||||
"singleQuote": false,
|
||||
"trailingComma": "none",
|
||||
"jsxSingleQuote": false,
|
||||
"bracketSpacing": true,
|
||||
"bracketSameLine": false,
|
||||
"arrowParens": "always",
|
||||
"htmlWhitespaceSensitivity": "css",
|
||||
"vueIndentScriptAndStyle": true,
|
||||
"proseWrap": "preserve",
|
||||
"embeddedLanguageFormatting": "auto"
|
||||
}
|
||||
@@ -36,7 +36,7 @@
|
||||
line-height: 150%;
|
||||
}
|
||||
:deep(.ant-form) .ant-form-item-label > label.ant-form-item-required:not(.ant-form-item-required-mark-optional)::before {
|
||||
content: "";
|
||||
display: none;
|
||||
}
|
||||
:deep(.ant-form) .ant-form-item-label > label.ant-form-item-required:not(.ant-form-item-required-mark-optional):after {
|
||||
display: inline-block;
|
||||
|
||||
@@ -167,8 +167,7 @@ li {
|
||||
padding: 0.6rem 0.5rem;
|
||||
}
|
||||
.ant-modal-mask {
|
||||
background-color: #666666;
|
||||
opacity: 0.5;
|
||||
background-color: rgba(102, 102, 102, 0.5);
|
||||
}
|
||||
.select_block {
|
||||
height: 4rem;
|
||||
@@ -1251,8 +1250,8 @@ tr > .ant-picker-cell-in-view.ant-picker-cell-range-hover-start:last-child::afte
|
||||
border-color: #000 !important;
|
||||
}
|
||||
.ant-spin .ant-spin-dot {
|
||||
width: 1.5em;
|
||||
height: 1.5em;
|
||||
width: 4.5rem;
|
||||
height: 4.5rem;
|
||||
}
|
||||
.ant-spin-dot-item {
|
||||
background-color: #000000 !important;
|
||||
@@ -2477,6 +2476,15 @@ textarea:focus {
|
||||
border-radius: 0.4rem;
|
||||
background: rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
.mosaic-bg {
|
||||
--mosaic-bg-size: 1rem;
|
||||
--mosaic-bg-color1: #efefef;
|
||||
--mosaic-bg-color2: #fff;
|
||||
background-image: repeating-conic-gradient(var(--mosaic-bg-color1) 0% 25%, var(--mosaic-bg-color2) 0% 50%);
|
||||
background-repeat: repeat;
|
||||
background-position: 50% 50%;
|
||||
background-size: var(--mosaic-bg-size) var(--mosaic-bg-size);
|
||||
}
|
||||
.mark_loading {
|
||||
position: fixed;
|
||||
width: 100%;
|
||||
|
||||
3
src/assets/icons/CCrop.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M24 18H20V7C20 6.20435 19.6839 5.44129 19.1213 4.87868C18.5587 4.31607 17.7956 4 17 4H6V0H4V4H0V6H4V17C4 17.7956 4.31607 18.5587 4.87868 19.1213C5.44129 19.6839 6.20435 20 7 20H18V24H20V20H24V18ZM7 18C6.73478 18 6.48043 17.8946 6.29289 17.7071C6.10536 17.5196 6 17.2652 6 17V6H17C17.2652 6 17.5196 6.10536 17.7071 6.29289C17.8946 6.48043 18 6.73478 18 7V18H7Z" fill="currentColor"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 495 B |
3
src/assets/icons/CPublish.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M14 8H12C11.2647 8 10.6667 8.598 10.6667 9.33333C10.6667 10.0687 10.0687 10.6667 9.33333 10.6667H6.66667C5.93133 10.6667 5.33333 10.0687 5.33333 9.33333C5.33333 8.598 4.73533 8 4 8H2C0.897333 8 0 8.89733 0 10V12.6667C0 14.5047 1.49533 16 3.33333 16H12.6667C14.5047 16 16 14.5047 16 12.6667V10C16 8.89733 15.1027 8 14 8ZM14.6667 12.6667C14.6667 13.7693 13.7693 14.6667 12.6667 14.6667H3.33333C2.23067 14.6667 1.33333 13.7693 1.33333 12.6667V10C1.33333 9.632 1.632 9.33333 2 9.33333L4 9.332V9.33333C4 10.804 5.196 12 6.66667 12H9.33333C10.804 12 12 10.804 12 9.33333H14C14.368 9.33333 14.6667 9.632 14.6667 10V12.6667ZM4.862 3.52867C4.60133 3.268 4.60133 2.84667 4.862 2.586L7.05733 0.390667C7.31467 0.133333 7.65267 0.004 7.99067 0.002L8 0L8.00933 0.002C8.348 0.004 8.68533 0.133333 8.94267 0.390667L11.138 2.586C11.3987 2.84667 11.3987 3.268 11.138 3.52867C11.008 3.65867 10.8373 3.724 10.6667 3.724C10.496 3.724 10.3253 3.65867 10.1953 3.52867L8.66667 2V6.66667C8.66667 7.03533 8.36867 7.33333 8 7.33333C7.63133 7.33333 7.33333 7.03533 7.33333 6.66667V2L5.80467 3.52867C5.544 3.78933 5.12267 3.78933 4.862 3.52867Z" fill="currentColor"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.2 KiB |
3
src/assets/icons/CSave.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M15.024 2.74801L13.252 0.976013C12.9432 0.665575 12.576 0.419466 12.1714 0.251935C11.7669 0.0844031 11.3332 -0.00122304 10.8953 1.31975e-05H3.33333C2.4496 0.00107177 1.60237 0.352601 0.97748 0.977493C0.352588 1.60239 0.00105857 2.44962 0 3.33335L0 12.6667C0.00105857 13.5504 0.352588 14.3976 0.97748 15.0225C1.60237 15.6474 2.4496 15.999 3.33333 16H12.6667C13.5504 15.999 14.3976 15.6474 15.0225 15.0225C15.6474 14.3976 15.9989 13.5504 16 12.6667V5.10468C16.0012 4.66684 15.9156 4.2331 15.7481 3.82858C15.5805 3.42405 15.3344 3.05678 15.024 2.74801ZM11.3333 1.38668V2.00001C11.3333 2.53045 11.1226 3.03915 10.7475 3.41423C10.3725 3.7893 9.86377 4.00001 9.33333 4.00001H6.66667C6.13623 4.00001 5.62753 3.7893 5.25245 3.41423C4.87738 3.03915 4.66667 2.53045 4.66667 2.00001V1.33335H10.8953C11.0429 1.33466 11.1898 1.35255 11.3333 1.38668ZM14.6667 12.6667C14.6667 13.1971 14.456 13.7058 14.0809 14.0809C13.7058 14.456 13.1971 14.6667 12.6667 14.6667H3.33333C2.8029 14.6667 2.29419 14.456 1.91912 14.0809C1.54405 13.7058 1.33333 13.1971 1.33333 12.6667V3.33335C1.33333 2.80291 1.54405 2.29421 1.91912 1.91913C2.29419 1.54406 2.8029 1.33335 3.33333 1.33335V2.00001C3.33439 2.88374 3.68592 3.73097 4.31081 4.35587C4.93571 4.98076 5.78294 5.33229 6.66667 5.33335H9.33333C10.1717 5.33074 10.9781 5.01179 11.5914 4.44026C12.2047 3.86872 12.5797 3.08674 12.6413 2.25068L14.0813 3.69068C14.455 4.0666 14.6653 4.57468 14.6667 5.10468V12.6667Z" fill="currentColor"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.5 KiB |
3
src/assets/icons/home.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M13.4872 5.28094L9.06266 0.853126C8.51506 0.306793 7.7733 0 7 0C6.2267 0 5.48494 0.306793 4.93734 0.853126L0.512757 5.28094C0.349671 5.44308 0.220373 5.636 0.132355 5.84851C0.0443375 6.06102 -0.000647733 6.2889 7.04636e-06 6.51894V12.249C7.04636e-06 12.7134 0.184381 13.1587 0.51257 13.4871C0.840758 13.8155 1.28588 14 1.75001 14H12.25C12.7141 14 13.1592 13.8155 13.4874 13.4871C13.8156 13.1587 14 12.7134 14 12.249V6.51894C14.0006 6.2889 13.9557 6.06102 13.8676 5.84851C13.7796 5.636 13.6503 5.44308 13.4872 5.28094ZM8.75 12.8326H5.25V10.5364C5.25 10.072 5.43438 9.62663 5.76256 9.29825C6.09075 8.96986 6.53587 8.78538 7 8.78538C7.46413 8.78538 7.90925 8.96986 8.23744 9.29825C8.56562 9.62663 8.75 10.072 8.75 10.5364V12.8326ZM12.8333 12.249C12.8333 12.4038 12.7719 12.5522 12.6625 12.6617C12.5531 12.7711 12.4047 12.8326 12.25 12.8326H9.91666V10.5364C9.91666 9.76241 9.60937 9.0201 9.06239 8.47279C8.51541 7.92549 7.77355 7.61801 7 7.61801C6.22645 7.61801 5.48459 7.92549 4.93761 8.47279C4.39063 9.0201 4.08334 9.76241 4.08334 10.5364V12.8326H1.75001C1.5953 12.8326 1.44692 12.7711 1.33753 12.6617C1.22813 12.5522 1.16667 12.4038 1.16667 12.249V6.51894C1.16721 6.36425 1.22862 6.216 1.33759 6.10627L5.76217 1.6802C6.09099 1.35272 6.53605 1.16887 7 1.16887C7.46394 1.16887 7.90901 1.35272 8.23783 1.6802L12.6624 6.10802C12.771 6.21732 12.8323 6.36486 12.8333 6.51894V12.249Z" fill="#585858"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.5 KiB |
3
src/assets/icons/seller/download.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M13.4167 14H0.583333C0.2625 14 0 13.7375 0 13.4167C0 13.0958 0.2625 12.8333 0.583333 12.8333H13.4167C13.7375 12.8333 14 13.0958 14 13.4167C14 13.7375 13.7375 14 13.4167 14ZM8.61583 11.0017L12.32 7.06417C12.8275 6.55667 12.9733 5.83333 12.6992 5.17417C12.425 4.515 11.8125 4.10083 11.095 4.095H9.8875L9.87 2.31583C9.87 1.03833 8.83167 0 7.55417 0H6.39917C5.12167 0 4.08333 1.03833 4.08333 2.32167V4.08333H2.8875C2.17 4.08333 1.5575 4.4975 1.28333 5.1625C1.00917 5.82167 1.155 6.55083 1.65083 7.04083L5.34333 11.0075C5.7925 11.4567 6.3875 11.6842 6.9825 11.6842C7.5775 11.6842 8.16667 11.4567 8.62167 11.0075L8.61583 11.0017ZM4.66667 5.25C4.82417 5.25 4.97 5.18583 5.08083 5.08083C5.19167 4.97 5.25 4.82417 5.25 4.66667V2.31583C5.25 1.68 5.76333 1.16667 6.39917 1.16667H7.55417C8.19 1.16667 8.70333 1.68583 8.70333 2.32167L8.72083 4.68417C8.72083 5.005 8.98333 5.26167 9.30417 5.26167H11.0833C11.4392 5.26167 11.5792 5.53583 11.6083 5.6175C11.6433 5.69917 11.7367 5.99083 11.4683 6.25333L7.77583 10.1792C7.32667 10.6225 6.60333 10.6167 6.17167 10.185L2.47917 6.21833C2.22833 5.9675 2.32167 5.67583 2.35667 5.59417C2.39167 5.5125 2.53167 5.23833 2.88167 5.23833H4.66667V5.25Z" fill="white"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.3 KiB |
11
src/assets/icons/seller/draft.svg
Normal file
@@ -0,0 +1,11 @@
|
||||
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_1622_6669)">
|
||||
<path d="M15.9998 13.3334C14.945 13.3334 13.9139 13.6462 13.0368 14.2322C12.1597 14.8182 11.4761 15.6512 11.0725 16.6257C10.6688 17.6003 10.5632 18.6726 10.769 19.7072C10.9748 20.7418 11.4827 21.6921 12.2286 22.4379C12.9745 23.1838 13.9248 23.6918 14.9594 23.8976C15.9939 24.1034 17.0663 23.9977 18.0408 23.5941C19.0154 23.1904 19.8483 22.5068 20.4343 21.6297C21.0204 20.7527 21.3332 19.7215 21.3332 18.6667C21.3332 17.2522 20.7713 15.8957 19.7711 14.8955C18.7709 13.8953 17.4143 13.3334 15.9998 13.3334ZM15.9998 21.3334C15.4724 21.3334 14.9569 21.177 14.5183 20.884C14.0798 20.5909 13.738 20.1745 13.5362 19.6872C13.3343 19.1999 13.2815 18.6637 13.3844 18.1465C13.4873 17.6292 13.7413 17.154 14.1142 16.7811C14.4872 16.4081 14.9623 16.1542 15.4796 16.0513C15.9969 15.9484 16.5331 16.0012 17.0203 16.203C17.5076 16.4049 17.9241 16.7467 18.2171 17.1852C18.5101 17.6237 18.6665 18.1393 18.6665 18.6667C18.6665 19.374 18.3856 20.0522 17.8855 20.5523C17.3854 21.0524 16.7071 21.3334 15.9998 21.3334Z" fill="white"/>
|
||||
<path d="M30.048 5.49603L26.504 1.95203C25.8865 1.33115 25.1519 0.838932 24.3429 0.503869C23.5338 0.168806 22.6664 -0.00244608 21.7907 2.6395e-05H6.66667C4.89921 0.00214354 3.20474 0.705202 1.95496 1.95499C0.705176 3.20477 0.00211714 4.89923 0 6.66669L0 25.3334C0.00211714 27.1008 0.705176 28.7953 1.95496 30.0451C3.20474 31.2949 4.89921 31.9979 6.66667 32H25.3333C27.1008 31.9979 28.7953 31.2949 30.045 30.0451C31.2948 28.7953 31.9979 27.1008 32 25.3334V10.2094C32.0025 9.33368 31.8312 8.4662 31.4962 7.65715C31.1611 6.8481 30.6689 6.11355 30.048 5.49603ZM22.6667 2.77336V4.00003C22.6667 5.06089 22.2452 6.07831 21.4951 6.82845C20.7449 7.5786 19.7275 8.00003 18.6667 8.00003H13.3333C12.2725 8.00003 11.2551 7.5786 10.5049 6.82845C9.75476 6.07831 9.33333 5.06089 9.33333 4.00003V2.66669H21.7907C22.0857 2.66931 22.3796 2.70509 22.6667 2.77336ZM29.3333 25.3334C29.3333 26.3942 28.9119 27.4116 28.1618 28.1618C27.4116 28.9119 26.3942 29.3334 25.3333 29.3334H6.66667C5.6058 29.3334 4.58839 28.9119 3.83824 28.1618C3.08809 27.4116 2.66667 26.3942 2.66667 25.3334V6.66669C2.66667 5.60583 3.08809 4.58841 3.83824 3.83827C4.58839 3.08812 5.6058 2.66669 6.66667 2.66669V4.00003C6.66878 5.76749 7.37184 7.46195 8.62163 8.71173C9.87141 9.96152 11.5659 10.6646 13.3333 10.6667H18.6667C20.3433 10.6615 21.9562 10.0236 23.1828 8.88051C24.4095 7.73745 25.1594 6.17348 25.2827 4.50136L28.1627 7.38136C28.9099 8.13319 29.3306 9.14935 29.3333 10.2094V25.3334Z" fill="white"/>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_1622_6669">
|
||||
<rect width="32" height="32" fill="white"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.7 KiB |
3
src/assets/icons/seller/dui.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg width="24" height="17" viewBox="0 0 24 17" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M7.77 16.402C7.37319 16.4028 6.98013 16.3253 6.61339 16.1737C6.24666 16.0222 5.91348 15.7997 5.633 15.519L0 9.886L1.424 8.461L7.057 14.094C7.24602 14.2829 7.50229 14.389 7.7695 14.389C8.03671 14.389 8.29298 14.2829 8.482 14.094L22.576 0L24 1.425L9.906 15.519C9.62571 15.7997 9.2927 16.0222 8.92613 16.1737C8.55956 16.3252 8.16666 16.4028 7.77 16.402Z" fill="white"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 479 B |
11
src/assets/icons/seller/edit.svg
Normal file
@@ -0,0 +1,11 @@
|
||||
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_1571_1813)">
|
||||
<path d="M24.8745 1.24001L8.61853 17.496C7.99765 18.1135 7.50544 18.8481 7.17037 19.6571C6.83531 20.4662 6.66406 21.3337 6.66653 22.2093V24C6.66653 24.3536 6.80701 24.6928 7.05705 24.9428C7.3071 25.1929 7.64624 25.3333 7.99986 25.3333H9.79053C10.6662 25.3358 11.5337 25.1646 12.3427 24.8295C13.1518 24.4944 13.8863 24.0022 14.5039 23.3813L30.7599 7.12535C31.5391 6.34424 31.9766 5.28598 31.9766 4.18268C31.9766 3.07938 31.5391 2.02112 30.7599 1.24001C29.9674 0.48254 28.9134 0.0598145 27.8172 0.0598145C26.721 0.0598145 25.667 0.48254 24.8745 1.24001ZM28.8745 5.24002L12.6185 21.496C11.8667 22.2433 10.8505 22.6639 9.79053 22.6667H9.3332V22.2093C9.33598 21.1493 9.75662 20.1332 10.5039 19.3813L26.7599 3.12535C27.0446 2.85329 27.4233 2.70147 27.8172 2.70147C28.2111 2.70147 28.5897 2.85329 28.8745 3.12535C29.1545 3.40603 29.3116 3.78627 29.3116 4.18268C29.3116 4.57909 29.1545 4.95933 28.8745 5.24002Z" fill="white"/>
|
||||
<path d="M30.6667 11.972C30.313 11.972 29.9739 12.1125 29.7239 12.3625C29.4738 12.6126 29.3333 12.9517 29.3333 13.3053V20H24C22.9391 20 21.9217 20.4214 21.1716 21.1716C20.4214 21.9217 20 22.9391 20 24V29.3333H6.66667C5.6058 29.3333 4.58839 28.9119 3.83824 28.1618C3.08809 27.4116 2.66667 26.3942 2.66667 25.3333V6.66667C2.66667 5.6058 3.08809 4.58839 3.83824 3.83824C4.58839 3.08809 5.6058 2.66667 6.66667 2.66667H18.7227C19.0763 2.66667 19.4154 2.52619 19.6655 2.27614C19.9155 2.02609 20.056 1.68696 20.056 1.33333C20.056 0.979711 19.9155 0.640573 19.6655 0.390524C19.4154 0.140476 19.0763 0 18.7227 0L6.66667 0C4.89921 0.00211714 3.20474 0.705176 1.95496 1.95496C0.705176 3.20474 0.00211714 4.89921 0 6.66667L0 25.3333C0.00211714 27.1008 0.705176 28.7953 1.95496 30.045C3.20474 31.2948 4.89921 31.9979 6.66667 32H21.7907C22.6666 32.0025 23.5342 31.8313 24.3435 31.4962C25.1528 31.1612 25.8876 30.6689 26.5053 30.048L30.0467 26.504C30.6677 25.8865 31.1601 25.152 31.4953 24.3429C31.8306 23.5339 32.0022 22.6664 32 21.7907V13.3053C32 12.9517 31.8595 12.6126 31.6095 12.3625C31.3594 12.1125 31.0203 11.972 30.6667 11.972ZM24.62 28.1627C24.084 28.6973 23.4062 29.0675 22.6667 29.2293V24C22.6667 23.6464 22.8071 23.3072 23.0572 23.0572C23.3072 22.8071 23.6464 22.6667 24 22.6667H29.2333C29.0684 23.4047 28.6987 24.0812 28.1667 24.6187L24.62 28.1627Z" fill="white"/>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_1571_1813">
|
||||
<rect width="32" height="32" fill="white"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.5 KiB |
11
src/assets/icons/seller/eye.svg
Normal file
@@ -0,0 +1,11 @@
|
||||
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_1696_371)">
|
||||
<path d="M17.4527 7.06427C16.2894 5.16977 13.6434 1.99127 8.99943 1.99127C4.35543 1.99127 1.70943 5.16977 0.546178 7.06427C0.186574 7.6459 -0.00390625 8.3162 -0.00390625 9.00002C-0.00390625 9.68384 0.186574 10.3541 0.546178 10.9358C1.70943 12.8303 4.35543 16.0088 8.99943 16.0088C13.6434 16.0088 16.2894 12.8303 17.4527 10.9358C17.8123 10.3541 18.0028 9.68384 18.0028 9.00002C18.0028 8.3162 17.8123 7.6459 17.4527 7.06427ZM16.1739 10.1505C15.1749 11.775 12.9137 14.5088 8.99943 14.5088C5.08518 14.5088 2.82393 11.775 1.82493 10.1505C1.61128 9.80481 1.49812 9.40643 1.49812 9.00002C1.49812 8.59362 1.61128 8.19524 1.82493 7.84952C2.82393 6.22502 5.08518 3.49127 8.99943 3.49127C12.9137 3.49127 15.1749 6.22202 16.1739 7.84952C16.3876 8.19524 16.5007 8.59362 16.5007 9.00002C16.5007 9.40643 16.3876 9.80481 16.1739 10.1505Z" fill="black"/>
|
||||
<path d="M9 5.25C8.25832 5.25 7.5333 5.46993 6.91661 5.88199C6.29993 6.29404 5.81928 6.87971 5.53545 7.56494C5.25162 8.25016 5.17736 9.00416 5.32206 9.73159C5.46675 10.459 5.8239 11.1272 6.34835 11.6517C6.8728 12.1761 7.54098 12.5333 8.26841 12.6779C8.99584 12.8226 9.74984 12.7484 10.4351 12.4645C11.1203 12.1807 11.706 11.7001 12.118 11.0834C12.5301 10.4667 12.75 9.74168 12.75 9C12.7488 8.0058 12.3533 7.05267 11.6503 6.34967C10.9473 5.64666 9.9942 5.25119 9 5.25ZM9 11.25C8.55499 11.25 8.11998 11.118 7.74997 10.8708C7.37996 10.6236 7.09157 10.2722 6.92127 9.86104C6.75098 9.4499 6.70642 8.9975 6.79323 8.56105C6.88005 8.12459 7.09434 7.72368 7.40901 7.40901C7.72368 7.09434 8.12459 6.88005 8.56105 6.79323C8.99751 6.70642 9.44991 6.75097 9.86104 6.92127C10.2722 7.09157 10.6236 7.37996 10.8708 7.74997C11.118 8.11998 11.25 8.55499 11.25 9C11.25 9.59674 11.0129 10.169 10.591 10.591C10.169 11.0129 9.59674 11.25 9 11.25Z" fill="black"/>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_1696_371">
|
||||
<rect width="18" height="18" fill="white"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.0 KiB |
11
src/assets/icons/seller/gouwudai.svg
Normal file
@@ -0,0 +1,11 @@
|
||||
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_1696_334)">
|
||||
<path d="M17.252 14.2499H15.752V12.7499C15.752 12.551 15.6729 12.3603 15.5323 12.2196C15.3916 12.079 15.2009 11.9999 15.002 11.9999C14.803 11.9999 14.6123 12.079 14.4716 12.2196C14.331 12.3603 14.252 12.551 14.252 12.7499V14.2499H12.752C12.553 14.2499 12.3623 14.329 12.2216 14.4696C12.081 14.6103 12.002 14.801 12.002 14.9999C12.002 15.1989 12.081 15.3896 12.2216 15.5303C12.3623 15.6709 12.553 15.7499 12.752 15.7499H14.252V17.2499C14.252 17.4489 14.331 17.6396 14.4716 17.7803C14.6123 17.9209 14.803 17.9999 15.002 17.9999C15.2009 17.9999 15.3916 17.9209 15.5323 17.7803C15.6729 17.6396 15.752 17.4489 15.752 17.2499V15.7499H17.252C17.4509 15.7499 17.6416 15.6709 17.7823 15.5303C17.9229 15.3896 18.002 15.1989 18.002 14.9999C18.002 14.801 17.9229 14.6103 17.7823 14.4696C17.6416 14.329 17.4509 14.2499 17.252 14.2499Z" fill="black"/>
|
||||
<path d="M15.75 4.5H13.5C13.5 3.30653 13.0259 2.16193 12.182 1.31802C11.3381 0.474106 10.1935 0 9 0C7.80653 0 6.66193 0.474106 5.81802 1.31802C4.97411 2.16193 4.5 3.30653 4.5 4.5H2.25C1.65326 4.5 1.08097 4.73705 0.65901 5.15901C0.237053 5.58097 0 6.15326 0 6.75L0 14.25C0.00119089 15.2442 0.396661 16.1973 1.09966 16.9003C1.80267 17.6033 2.7558 17.9988 3.75 18H10.5C10.6989 18 10.8897 17.921 11.0303 17.7803C11.171 17.6397 11.25 17.4489 11.25 17.25C11.25 17.0511 11.171 16.8603 11.0303 16.7197C10.8897 16.579 10.6989 16.5 10.5 16.5H3.75C3.15326 16.5 2.58097 16.2629 2.15901 15.841C1.73705 15.419 1.5 14.8467 1.5 14.25V6.75C1.5 6.55109 1.57902 6.36032 1.71967 6.21967C1.86032 6.07902 2.05109 6 2.25 6H4.5V7.5C4.5 7.69891 4.57902 7.88968 4.71967 8.03033C4.86032 8.17098 5.05109 8.25 5.25 8.25C5.44891 8.25 5.63968 8.17098 5.78033 8.03033C5.92098 7.88968 6 7.69891 6 7.5V6H12V7.5C12 7.69891 12.079 7.88968 12.2197 8.03033C12.3603 8.17098 12.5511 8.25 12.75 8.25C12.9489 8.25 13.1397 8.17098 13.2803 8.03033C13.421 7.88968 13.5 7.69891 13.5 7.5V6H15.75C15.9489 6 16.1397 6.07902 16.2803 6.21967C16.421 6.36032 16.5 6.55109 16.5 6.75V10.5C16.5 10.6989 16.579 10.8897 16.7197 11.0303C16.8603 11.171 17.0511 11.25 17.25 11.25C17.4489 11.25 17.6397 11.171 17.7803 11.0303C17.921 10.8897 18 10.6989 18 10.5V6.75C18 6.15326 17.7629 5.58097 17.341 5.15901C16.919 4.73705 16.3467 4.5 15.75 4.5ZM6 4.5C6 3.70435 6.31607 2.94129 6.87868 2.37868C7.44129 1.81607 8.20435 1.5 9 1.5C9.79565 1.5 10.5587 1.81607 11.1213 2.37868C11.6839 2.94129 12 3.70435 12 4.5H6Z" fill="black"/>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_1696_334">
|
||||
<rect width="18" height="18" fill="white"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.6 KiB |
3
src/assets/icons/seller/preview.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M0 7V5C0 2.243 2.243 0 5 0H7C7.552 0 8 0.448 8 1C8 1.552 7.552 2 7 2H5C3.346 2 2 3.346 2 5V7C2 7.552 1.552 8 1 8C0.448 8 0 7.552 0 7ZM12 10C10.895 10 10 10.895 10 12C10 13.105 10.895 14 12 14C13.105 14 14 13.105 14 12C14 10.895 13.105 10 12 10ZM7 22H5C3.346 22 2 20.654 2 19V17C2 16.448 1.552 16 1 16C0.448 16 0 16.448 0 17V19C0 21.757 2.243 24 5 24H7C7.552 24 8 23.552 8 23C8 22.448 7.552 22 7 22ZM19 0H17C16.448 0 16 0.448 16 1C16 1.552 16.448 2 17 2H19C20.654 2 22 3.346 22 5V7C22 7.552 22.448 8 23 8C23.552 8 24 7.552 24 7V5C24 2.243 21.757 0 19 0ZM12 18C7.423 18 4.479 13.979 3.941 12.903C3.654 12.33 3.654 11.673 3.941 11.098C4.478 10.021 7.421 6 12 6C16.579 6 19.522 10.021 20.059 11.098C20.344 11.67 20.344 12.327 20.059 12.9C19.521 13.978 16.578 17.999 11.999 17.999L12 18ZM18.27 11.992C17.942 11.335 15.534 8 12 8C8.466 8 6.058 11.335 5.73 11.992C6.058 12.666 8.467 16 12 16C15.533 16 17.942 12.648 18.27 11.992ZM23 16C22.448 16 22 16.448 22 17V19C22 20.654 20.654 22 19 22H17C16.448 22 16 22.448 16 23C16 23.552 16.448 24 17 24H19C21.757 24 24 21.757 24 19V17C24 16.448 23.552 16 23 16Z" fill="black"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.2 KiB |
3
src/assets/icons/seller/qiandaizi.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg width="17" height="18" viewBox="0 0 17 18" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M10.236 4.11975C10.8907 3.594 11.565 2.8875 11.907 2.028C12.0855 1.5795 12.0278 1.07025 11.7533 0.666C11.4705 0.249 11.0017 0 10.5 0H6C5.49825 0 5.0295 0.249 4.74675 0.666C4.47225 1.07025 4.41525 1.5795 4.593 2.028C4.935 2.88675 5.60925 3.594 6.264 4.11975C2.772 5.41575 0 9.86925 0 13.5C0 15.9818 2.01825 18 4.5 18H12C14.4818 18 16.5 15.9818 16.5 13.5C16.5 9.86925 13.728 5.41575 10.236 4.11975ZM10.5128 1.47375C10.1258 2.4465 8.94225 3.2685 8.2485 3.65625C7.55625 3.2715 6.37725 2.45625 5.99925 1.5L10.5128 1.47375ZM11.9993 16.5H4.5C2.8455 16.5 1.5 15.1545 1.5 13.5C1.5 9.56775 5.0325 5.25 8.25 5.25C11.4675 5.25 15 9.56775 15 13.5C15 15.1545 13.6538 16.5 11.9993 16.5ZM8.24925 16.5C7.83525 16.5 7.49925 16.164 7.49925 15.75V15H7.29825C6.49725 15 5.751 14.5695 5.34975 13.8757C5.14275 13.5173 5.265 13.059 5.6235 12.8512C5.9805 12.6435 6.44025 12.7657 6.648 13.125C6.7815 13.356 7.03125 13.5 7.29825 13.5H8.99925C9.4125 13.5 9.74925 13.1632 9.74925 12.75C9.74925 12.4665 9.546 12.2265 9.26625 12.18L6.98475 11.7997C5.979 11.6325 5.2485 10.77 5.2485 9.75C5.2485 8.5095 6.258 7.5 7.4985 7.5V6.75C7.4985 6.336 7.8345 6 8.2485 6C8.6625 6 8.9985 6.336 8.9985 6.75V7.5H9.1995C9.99975 7.5 10.7467 7.93125 11.148 8.625C11.355 8.9835 11.2327 9.44175 10.8742 9.6495C10.5165 9.85725 10.0575 9.735 9.84975 9.37575C9.7155 9.144 9.4665 9.00075 9.1995 9.00075H7.4985C7.08525 9.00075 6.7485 9.3375 6.7485 9.75075C6.7485 10.0343 6.95175 10.2743 7.2315 10.3207L9.513 10.701C10.5188 10.8682 11.2492 11.7307 11.2492 12.7507C11.2492 13.9913 10.2397 15.0007 8.99925 15.0007V15.7507C8.99925 16.1647 8.66325 16.5 8.24925 16.5Z" fill="black"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.7 KiB |
3
src/assets/icons/seller/search.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M19.7663 18.5889L14.7962 13.6188C16.1506 11.9623 16.8165 9.84866 16.6562 7.71497C16.4959 5.58128 15.5216 3.59083 13.9349 2.15534C12.3482 0.719841 10.2704 -0.0508742 8.13136 0.00260835C5.99233 0.0560909 3.95568 0.929679 2.44268 2.44268C0.929679 3.95568 0.0560909 5.99233 0.00260835 8.13136C-0.0508742 10.2704 0.719841 12.3482 2.15534 13.9349C3.59083 15.5216 5.58128 16.4959 7.71497 16.6562C9.84866 16.8165 11.9623 16.1506 13.6188 14.7962L18.5889 19.7663C18.7459 19.9179 18.9563 20.0019 19.1746 20C19.3929 19.9981 19.6017 19.9105 19.7561 19.7561C19.9105 19.6017 19.9981 19.3929 20 19.1746C20.0019 18.9563 19.9179 18.7459 19.7663 18.5889ZM8.35314 15.0143C7.03568 15.0143 5.74781 14.6237 4.65238 13.8917C3.55695 13.1598 2.70317 12.1194 2.199 10.9023C1.69483 9.6851 1.56292 8.34575 1.81994 7.05361C2.07697 5.76146 2.71138 4.57455 3.64297 3.64297C4.57455 2.71138 5.76146 2.07697 7.05361 1.81994C8.34575 1.56292 9.6851 1.69483 10.9023 2.199C12.1194 2.70317 13.1598 3.55695 13.8917 4.65238C14.6237 5.74781 15.0143 7.03568 15.0143 8.35314C15.0124 10.1192 14.3099 11.8123 13.0611 13.0611C11.8123 14.3099 10.1192 15.0124 8.35314 15.0143Z" fill="black"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.2 KiB |
3
src/assets/icons/seller/share.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M28 16H24C22.5293 16 21.3333 17.196 21.3333 18.6667C21.3333 20.1373 20.1373 21.3333 18.6667 21.3333H13.3333C11.8627 21.3333 10.6667 20.1373 10.6667 18.6667C10.6667 17.196 9.47067 16 8 16H4C1.79467 16 0 17.7947 0 20V25.3333C0 29.0093 2.99067 32 6.66667 32H25.3333C29.0093 32 32 29.0093 32 25.3333V20C32 17.7947 30.2053 16 28 16ZM29.3333 25.3333C29.3333 27.5387 27.5387 29.3333 25.3333 29.3333H6.66667C4.46133 29.3333 2.66667 27.5387 2.66667 25.3333V20C2.66667 19.264 3.264 18.6667 4 18.6667L8 18.664V18.6667C8 21.608 10.392 24 13.3333 24H18.6667C21.608 24 24 21.608 24 18.6667H28C28.736 18.6667 29.3333 19.264 29.3333 20V25.3333ZM9.724 7.05733C9.20267 6.536 9.20267 5.69333 9.724 5.172L14.1147 0.781333C14.6293 0.266667 15.3053 0.008 15.9813 0.004L16 0L16.0187 0.004C16.696 0.008 17.3707 0.266667 17.8853 0.781333L22.276 5.172C22.7973 5.69333 22.7973 6.536 22.276 7.05733C22.016 7.31733 21.6747 7.448 21.3333 7.448C20.992 7.448 20.6507 7.31733 20.3907 7.05733L17.3333 4V13.3333C17.3333 14.0707 16.7373 14.6667 16 14.6667C15.2627 14.6667 14.6667 14.0707 14.6667 13.3333V4L11.6093 7.05733C11.088 7.57867 10.2453 7.57867 9.724 7.05733Z" fill="white"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 84 KiB |
|
Before Width: | Height: | Size: 198 B |
@@ -1,3 +0,0 @@
|
||||
<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>
|
||||
|
Before Width: | Height: | Size: 212 B |
|
Before Width: | Height: | Size: 327 B |
|
Before Width: | Height: | Size: 492 KiB |
|
Before Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 231 KiB |
|
Before Width: | Height: | Size: 913 B |
@@ -1,4 +0,0 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M19.6144 18.7388L5.16736 4.29184C4.95412 4.0786 4.60838 4.0786 4.39514 4.29184C4.18189 4.50509 4.18189 4.85082 4.39514 5.06407L18.8421 19.5111C19.0554 19.7243 19.4011 19.7243 19.6144 19.5111C19.8276 19.2978 19.8276 18.9521 19.6144 18.7388Z" fill="#232323"/>
|
||||
<path d="M5.15908 19.5378L19.6061 5.09079C19.8193 4.87755 19.8193 4.53181 19.6061 4.31857C19.3928 4.10533 19.0471 4.10533 18.8339 4.31857L4.38685 18.7656C4.17361 18.9788 4.17361 19.3246 4.38685 19.5378C4.6001 19.751 4.94583 19.751 5.15908 19.5378Z" fill="#232323"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 636 B |
|
Before Width: | Height: | Size: 137 KiB |
|
Before Width: | Height: | Size: 339 KiB |
|
Before Width: | Height: | Size: 443 KiB |
|
Before Width: | Height: | Size: 184 KiB |
|
Before Width: | Height: | Size: 280 KiB |
|
Before Width: | Height: | Size: 400 KiB |
|
Before Width: | Height: | Size: 4.3 MiB |
|
Before Width: | Height: | Size: 40 KiB |
|
Before Width: | Height: | Size: 68 KiB |
|
Before Width: | Height: | Size: 35 KiB |
@@ -1,9 +0,0 @@
|
||||
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<rect width="20" height="20" rx="2.79453" fill="url(#pattern0_226_198)"/>
|
||||
<defs>
|
||||
<pattern id="pattern0_226_198" patternContentUnits="objectBoundingBox" width="1" height="1">
|
||||
<use xlink:href="#image0_226_198" transform="scale(0.0104167)"/>
|
||||
</pattern>
|
||||
<image id="image0_226_198" width="96" height="96" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAKcUlEQVR4AeydSewlRR3H3xtHUXAZdz2YGQ+aeDDiCYgCMxwENFGMMdF4cDx48gB6VOOuiR4UPWlkGSAsBxK2BMI6wxYgLMOSEJYAQ9jXGbZh58/n0/Oq6ffmLd3Vr1/369f/1PfV0lW/qvr+flVdr7pe/9f1Cv6tra1tAseDU8FDYDdYVWffd9L584CcbCpIZy+3AqhgK9hOBQ+BE8FWYIUb8FfV2feD6fxxQE40SBXyU+K53EwFQPpmIOmnInEz6Nx0BlTINjkDMxUxUQEU3gDUqlavpU+vtrs6yoCcqYh/waMjZfR6Eh+rAApYWOKPT3J1H2UYOIHCTktySnDY7aeADPkOpeHcXSyWAcnfPuB2SMaQAsjgUNHyLTCUsYuUZkBOXS3JcSpsSAGk/gGYEa9zFTDgrPL7rNxUAVi/y8puzs+yU034BLhOV5OpAqhrSDPEO1cdAy7pE+mJAtCI1r86U0/S9Vo/3E1IviMkCqApqzj1rNHvebl3EFRUnkbfW4f1a/neHJDRuUgGipJvNe4wbHQEfM/YCmCUpP6gz1rvs4QfBXeDO8GN4HpwNdgxgiuJXwvM8zD+XvA+EOQRzO2OUwHpHTl3seXLOEp+tgevEbkX3ADOBaeD/4C/gz8O4PJc/I74b8Ffwb/BNeAZEOsOVgFOQbEClqGc5Gudwva+zccT4H5wIXBF8n/8k8Apot/vnw0uAtvBDnD1ANfi3wguBeeQ92LwJIh1m9uuAMkfJedVErT2M/G1dBXgtHI7ca35Zfy8bg8Z3wCxboMKGPpqHCupoeW0eqEiXqSNEn0G/n/B/7DiK8Gt4FHwNNgL3uTaRMeiRXnhugqYmj9knOAnCphwrVXJr9Abb6qn4Z8FbgLeePGKORSkMkOh9xPQiPHiXKnCcVVWXipLkCuc56jR6cZ53rn9Okh8EbxFeuJGrDpJy/nh6idn1vHZ2qiAbE93E7kMuLrZmSWdtNSRnlVamr6IwAIVUHl3AonO0Ya9mUr8yRB8BdgVWoDFN6bfjWlIICfSl/BsUW+4flnS+h/IXjCMMpyaDNaOtihAqxeB0FsInA0uhOys5WfzcLl+1xYFBCb9kuXUcx8JD0J+eqMl3iM+OlJMrhVtUECW1Kdh83JwPrgLJG6ecz6ysqNIhSd1xH60QQHZvr9E5A7ghpqbZAR7Wn5Vc74jrJTsNigga5H39Ho992ueZLqRHKL53IhlTyyE3OyI+xgZ/TKGF+faoAB7rhVq8Y8QeQEUcnnJHyP046R9AES7tijgeRi4DdwM0t3JPMSaR6sWlO0RPwB8AXwVHAGOBFuAD1AOxz8UHAN+TP5jwOdAtGuLAtzhfBwWJD/dnQykkj7WQWJ2+pJ8404r36TAT8BvgIcV/oQfng34LODXxH2MeyT+p0G0a4sCvPk6/wuXobkIUUEik/nrhH8AfgF+Dr4FtgAVcgS+4aPwDweHgI3gQOD9JntvIGmfm/XZFgVIgN9+heFZ/R66zkhw2vksiZJ67MD/BH5e56acoydv/jRfWxTgDfgxrHk3iNmfl3wt22nHeX19ytC+wCzrjiJf0W1RgFav9dunGDjvf42CXwGj5JPUiybYwtPQFgVo9bnn/jGEuJx0/nfaqYzsMfXm/4nSuMINSpM0Edsky5b6QhVbcVtGQGz/Qzl5yCpg1pwfypX2rbi0kBYIkHC/TYeuOCJCuFJ/mRUgaYGc6GXgQICEi0G0l5Ud0irxl1kBWUJcuZTpi+QrIytzIeEyja6igVpediqYVoekhesuQV0JhXhR32Ws36ZDuazskDbNt93Trk+81jQF2NCYznj6Id0D6imlGFSeSixW6r3cGk1Muxu3DNXynM89SOXJYw9Q+XD9KvrqjwfDSWXTPJ18Keme0bwE3404vChnWc95eopCmR5d9OBtqC/4tuEKavCQ1058z5h6uNc223aSirkmjgB74Kk1j4b7Q3F3Hz2R7K5k2JH0lLI7lV4zj3k912nZGPgoU3L/SeG/AevzNHSoL/jW607oP8jjQV6V4PFEonGuqQrQsi5hX+cc4EnkG/B90uVJ5YCrBmk34T8M9rKpth7ktkTy+gOV9ZR9BewC1nMNvrLDyehQn76n6m7muqeqt0G5I0FjIRjnmqoA52Tn9aK9ehtycs/F5HXujn2w7j3H+4ZtLdrONH9TFWDn0keLWGouq4bQ3OQHBmLKDNrjvF+4vlBv8JuqANuVbg3EkBQ6WJF/AHLdQRVpO0kr7Oxo4UILKKDFa2ELqCqqChXwGUoKwwTjXFMVENebxZXSOD5EdaLUN+hOAbAY4bT6T1LuU6A7lgIJi3ZhBHyQig3jxbk5joC4BixpKUeAx1GE4ehudAqIo06rP4iiwjDBONdUBbi+Tr8gDdbdcT2sppRLT+8BrR0BKsAt4mroi5A6YgQuk53/RStXQXbqI4GnvF/ERkgKxSf65ge5ZoGRNnwYoZ4lso2tnIIc4n7LpJ+FnJtrWmeRQkXzK9v1/0cNlEUu7ZetJKL85ylzLNb5Q3A0OAx4UtkTygFHkRZOK28kfCBWWnQzbs0ylD0IKOMQfGUqO5yItj7r/gbXTPe86Hdp35dBaddUBXhz8yDsr+ih++9/wXd/3mcCwtPKPgvwmYCnlD04axmyRTm/UHnS2Xd8hvp8BmBdwvCfkezzAOv8DmGNBK+ca5oC3B725uvyzre4HEr3JNdzmyrEV+sITyd77Wiu/wh8G5Q5py+ZHspVlmdDD0OedVhXgPWrJNvzJa47/7tSc8FANM41TQG2J+am5gtHymwJeM/xeGJRFm1vzD0krUcBaaQhgTwd0upEaLIKkMQQL+pbNnvTz8qeJqs/7WKea01UQJ52qyQR8vpUyukrxIv6Eq6MUC4rO6RV4i+rAkbJcC4eTSsSVwFlZRSpL83bFgWkHVq2QKeAmjXWKaBTQM0M1Fx9NwI6BdTMQM3VdyOgU0DNDNRc/XKOgJpJm2f1nQLmyWaErE4BEaTNs0ingHmyGSGrU0AEafMsogJK/cRmno1ZQVl7OgXUq/VdKsBfANbbjNWtPVGA/zlidSmot+c7HAEX1NuGla79gnX9ft+XW3fT0OLt4Ha5dwRYtf/aQ38KuktzZsAfmO97VQGa8EfHjoQ519GJm8CAPwpPjD6MAPP9zI8OC2HAY5ZJRakCGAXeB5JhkVzpPqpi4ES4TqzfClIFGAEeQu2WpRBRkXOal+NU/JAC0IzbEt/nqhnxOjdHBuR0y4DjVOyQAkwlQ5KRsD5eY52n2ULjYg70hrL6fT6yMrKyuVTaOatI/n6c7qcAqxoowReZLss9wZ80je2L/ckBFaCMHFkLZ5HDseQraWKjUcIe8EsyuTraT3Ok1+0kLbThKQK+uQovyr1OKV/ahJe4rOwkIeJDzjbLIXBqHytiogJCbgpvA18kriIcSgQb4zwRnby4mxb5PwTwopxlfUmUilBmlJBBIVeTW+UM+CavQfJ4b6YCQjGEqQinJZXhT3n8T0UqZKJ2Q9kKfa1ey3UESF5sVZb1lWe+/cp3FaVyZgTsu5buF1k52QRPTjfpMnNG+d67AAAA///vdBW6AAAABklEQVQDAJAXvRKwmZ6CAAAAAElFTkSuQmCC"/>
|
||||
</defs>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 340 KiB |
|
Before Width: | Height: | Size: 930 KiB |
|
Before Width: | Height: | Size: 262 KiB |
|
Before Width: | Height: | Size: 65 KiB |
|
Before Width: | Height: | Size: 95 KiB |
|
Before Width: | Height: | Size: 198 KiB |
@@ -1,10 +0,0 @@
|
||||
<svg width="21" height="21" viewBox="0 0 21 21" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_226_195)">
|
||||
<path d="M-0.00195312 1.4335C-0.00195312 0.641696 0.656004 0 1.46782 0H18.5422C19.354 0 20.0119 0.641696 20.0119 1.4335V18.5804C20.0119 19.3722 19.354 20.0139 18.5422 20.0139H1.46782C0.656004 20.0139 -0.00195312 19.3722 -0.00195312 18.5804V1.4335ZM6.18109 16.7541V7.71661H3.17776V16.7541H6.18109ZM4.68005 6.482C5.72703 6.482 6.37873 5.78902 6.37873 4.92092C6.35996 4.03405 5.72828 3.35983 4.70006 3.35983C3.67185 3.35983 3.00013 4.0353 3.00013 4.92092C3.00013 5.78902 3.65183 6.482 4.66003 6.482H4.68005ZM10.8193 16.7541V11.7069C10.8193 11.4367 10.8393 11.1665 10.9194 10.9739C11.1358 10.4347 11.6299 9.87561 12.4605 9.87561C13.5475 9.87561 13.9815 10.7037 13.9815 11.9195V16.7541H16.9848V11.5705C16.9848 8.79361 15.5038 7.50271 13.5274 7.50271C11.9338 7.50271 11.2196 8.37832 10.8193 8.995V9.02627H10.7993L10.8193 8.995V7.71661H7.81723C7.85475 8.5647 7.81723 16.7541 7.81723 16.7541H10.8193Z" fill="white"/>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_226_195">
|
||||
<rect width="20.0139" height="20.0139" rx="1.55252" fill="white"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 7.5 KiB |
|
Before Width: | Height: | Size: 4.3 MiB |
|
Before Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 253 KiB |
|
Before Width: | Height: | Size: 2.6 MiB |
|
Before Width: | Height: | Size: 48 KiB |
|
Before Width: | Height: | Size: 6.3 KiB |
|
Before Width: | Height: | Size: 91 KiB |
|
Before Width: | Height: | Size: 2.2 MiB |
|
Before Width: | Height: | Size: 225 KiB |
|
Before Width: | Height: | Size: 7.7 KiB |
|
Before Width: | Height: | Size: 47 KiB |
@@ -1,12 +0,0 @@
|
||||
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_226_203)">
|
||||
<path d="M20 17C20 18.6569 18.6569 20 17 20H3C1.34307 20 0 18.6569 0 17V3C0 1.34313 1.34313 0 3 0H17C18.6569 0 20 1.34313 20 3V17Z" fill="white"/>
|
||||
<path d="M13.3881 7.45803C11.7739 7.54236 10.3702 8.03169 9.2306 9.13723C8.0792 10.2542 7.55366 11.6228 7.69726 13.3195C7.06633 13.2414 6.49166 13.1554 5.91373 13.1067C5.71413 13.0899 5.47726 13.1138 5.3082 13.2092C4.747 13.5258 4.20906 13.8834 3.57133 14.282C3.68833 13.7528 3.76406 13.2894 3.89813 12.8437C3.99673 12.5161 3.95106 12.3338 3.64926 12.1204C1.71153 10.7523 0.894728 8.70496 1.50599 6.59703C2.07153 4.64703 3.46033 3.46443 5.3474 2.84796C7.92313 2.00663 10.8177 2.86483 12.3839 4.90976C12.9495 5.64843 13.2964 6.47749 13.3881 7.45803ZM5.95893 6.80123C5.9738 6.41569 5.63973 6.06836 5.24293 6.05676C4.83666 6.04483 4.50253 6.35529 4.49066 6.75563C4.47866 7.16136 4.789 7.48649 5.1982 7.49689C5.60386 7.50716 5.94393 7.19629 5.95893 6.80123ZM9.835 6.05649C9.43673 6.06383 9.1002 6.40303 9.10726 6.79009C9.11453 7.19129 9.44466 7.50516 9.8542 7.50023C10.2648 7.49529 10.5762 7.17809 10.5723 6.76843C10.5689 6.36629 10.2403 6.04909 9.835 6.05649Z" fill="#232323"/>
|
||||
<path d="M17.0146 17.5216C16.5035 17.294 16.0346 16.9525 15.5354 16.9004C15.0381 16.8484 14.5154 17.1353 13.9951 17.1885C12.4104 17.3506 10.9907 16.909 9.82001 15.8264C7.59355 13.767 7.91168 10.6094 10.4876 8.92184C12.777 7.42197 16.1345 7.92197 17.7487 10.0031C19.1573 11.8191 18.9917 14.2298 17.2721 15.7554C16.7745 16.1969 16.5955 16.5602 16.9148 17.1423C16.9737 17.2498 16.9804 17.3858 17.0146 17.5216ZM11.1963 11.8883C11.5217 11.8886 11.7897 11.634 11.802 11.3126C11.815 10.9723 11.5413 10.6869 11.2006 10.6855C10.8632 10.684 10.5806 10.9734 10.5924 11.3086C10.6035 11.6288 10.8733 11.8879 11.1963 11.8883ZM14.9471 10.6868C14.6314 10.6846 14.3631 10.9431 14.3502 11.2621C14.3365 11.6032 14.6017 11.8834 14.9393 11.8842C15.2658 11.8854 15.5239 11.6384 15.5357 11.3134C15.5483 10.9715 15.2831 10.6892 14.9471 10.6868Z" fill="#232323"/>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_226_203">
|
||||
<rect width="20" height="20" fill="white"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 7.9 KiB |
|
Before Width: | Height: | Size: 811 B |
BIN
src/assets/images/seller/checked.png
Normal file
|
After Width: | Height: | Size: 479 B |
BIN
src/assets/images/seller/image-placeholder.png
Normal file
|
After Width: | Height: | Size: 621 B |
BIN
src/assets/images/seller/selectCollectionNullStatus.png
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
src/assets/images/seller/setting/alipay-chinese.png
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
BIN
src/assets/images/seller/setting/alipay-hk.png
Normal file
|
After Width: | Height: | Size: 7.3 KiB |
BIN
src/assets/images/seller/setting/paypal.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
src/assets/images/seller/setting/stripe.png
Normal file
|
After Width: | Height: | Size: 4.5 KiB |
BIN
src/assets/images/seller/tips.png
Normal file
|
After Width: | Height: | Size: 686 B |
@@ -9,6 +9,11 @@
|
||||
"id": 2,
|
||||
"title": "AiDA X SFT AI Fashion Award 2024",
|
||||
"imgUrl": "/image/events/Fashion-Award-2024.png"
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"title": "AiDA Global Design Awards 2026",
|
||||
"imgUrl": "/image/events/award-poster.gif"
|
||||
}
|
||||
],
|
||||
"eventsItem": [
|
||||
@@ -16,18 +21,19 @@
|
||||
"id": 3,
|
||||
"title": "AiDA Global Design Awards 2026",
|
||||
"imgUrl": "/image/events/award-poster.gif",
|
||||
"tips": "For inquiries: awards2026@code-create.com.hk",
|
||||
"textList": [
|
||||
{
|
||||
"paragraph": [
|
||||
{
|
||||
"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."
|
||||
"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 worldwide 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": [
|
||||
{
|
||||
"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."
|
||||
"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 allowance, allowing them to showcase their talent, network with professionals, and celebrate their achievements on an international stage."
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -9,6 +9,11 @@
|
||||
"id": 2,
|
||||
"title": "AiDA X SFT AI时尚设计比赛2024",
|
||||
"imgUrl": "/image/events/Fashion-Award-2024.png"
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"title": "AiDA全球设计奖 2026",
|
||||
"imgUrl": "/image/events/award-poster-zh.gif"
|
||||
}
|
||||
],
|
||||
"eventsItem": [
|
||||
@@ -16,18 +21,19 @@
|
||||
"id": 3,
|
||||
"title": "AiDA全球设计奖 2026",
|
||||
"imgUrl": "/image/events/award-poster-zh.gif",
|
||||
"tips": "如有疑问,请联系:awards2026@code-create.com.hk",
|
||||
"textList": [
|
||||
{
|
||||
"paragraph": [
|
||||
{
|
||||
"text": "秉承推动 AI 赋能创意设计的初衷,Code‑Create 举办了「AiDA 全球设计大奖 2026」,面向来自香港、中国、新加坡、韩国及全球的设计师,鼓励大家探索 AI 与时尚设计的无限可能,突破传统界限,释放科技与想象力的创新潜能。点击“查看详情”按钮获取更多比赛信息,抓住成为 AI 时尚先锋的机会吧!"
|
||||
"text": "秉承推动 AI 赋能创意设计的初衷,Code‑Create 举办了「AiDA 全球设计大奖 2026」,面向来全球的设计师,鼓励大家探索 AI 与时尚设计的无限可能,突破传统界限,释放科技与想象力的创新潜能。点击“查看详情”按钮获取更多比赛信息,抓住成为 AI 时尚先锋的机会吧!"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"paragraph": [
|
||||
{
|
||||
"text": "参赛者将有机会赢取总奖金 9,000 美元,作品还将获得国际媒体展示机会,并与全球设计师和行业领袖建立联系。入围决赛者将受邀参加在香港举办的 专属颁奖典礼,主办方提供差旅支持,让设计师在国际舞台展示才华、拓展人脉,并共同庆祝创意成果。"
|
||||
"text": "参赛者将有机会赢取总奖金 9,000 美元,作品还将获得国际媒体展示机会,并与全球设计师和行业领袖建立联系。入围决赛者将受邀参加在香港举办的 专属颁奖典礼,主办方提供差旅津贴,让设计师在国际舞台展示才华、拓展人脉,并共同庆祝创意成果。"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
|
||||
&.ant-form-item-required:not(.ant-form-item-required-mark-optional) {
|
||||
&::before {
|
||||
content: "";
|
||||
display: none;
|
||||
}
|
||||
|
||||
&:after {
|
||||
|
||||
@@ -1251,8 +1251,8 @@ tr > .ant-picker-cell-in-view.ant-picker-cell-range-hover-start:last-child::afte
|
||||
border-color: #000 !important;
|
||||
}
|
||||
.ant-spin .ant-spin-dot {
|
||||
width: 1.5em;
|
||||
height: 1.5em;
|
||||
width: 4.5rem;
|
||||
height: 4.5rem;
|
||||
}
|
||||
.ant-spin-dot-item {
|
||||
background-color: #000000 !important;
|
||||
@@ -2470,6 +2470,22 @@ textarea:focus {
|
||||
opacity: 0.8;
|
||||
border-radius: 0.7rem;
|
||||
}
|
||||
.mini-scrollbar::-webkit-scrollbar {
|
||||
width: 0.4rem;
|
||||
}
|
||||
.mini-scrollbar::-webkit-scrollbar-thumb {
|
||||
border-radius: 0.4rem;
|
||||
background: rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
.mosaic-bg {
|
||||
--mosaic-bg-size: 1rem;
|
||||
--mosaic-bg-color1: #efefef;
|
||||
--mosaic-bg-color2: #fff;
|
||||
background-image: repeating-conic-gradient(var(--mosaic-bg-color1) 0% 25%, var(--mosaic-bg-color2) 0% 50%);
|
||||
background-repeat: repeat;
|
||||
background-position: 50% 50%;
|
||||
background-size: var(--mosaic-bg-size) var(--mosaic-bg-size);
|
||||
}
|
||||
.mark_loading {
|
||||
position: fixed;
|
||||
width: 100%;
|
||||
@@ -2507,6 +2523,6 @@ textarea:focus {
|
||||
.justify-center {
|
||||
justify-content: center;
|
||||
}
|
||||
.flex-1{
|
||||
.flex-1 {
|
||||
flex: 1;
|
||||
}
|
||||
@@ -172,8 +172,9 @@ input:focus{
|
||||
}
|
||||
}
|
||||
.ant-modal-mask{
|
||||
background-color: #666666;
|
||||
opacity: .5;
|
||||
background-color: rgba(102,102,102,0.5);
|
||||
// background-color: #666666;
|
||||
// opacity: .5;
|
||||
}
|
||||
.select_block{
|
||||
height: 4rem;
|
||||
@@ -1379,8 +1380,8 @@ tr > .ant-picker-cell-in-view.ant-picker-cell-range-hover-start:last-child::afte
|
||||
}
|
||||
//loding样式
|
||||
.ant-spin .ant-spin-dot{
|
||||
width: 1.5em;
|
||||
height: 1.5em;
|
||||
width: 4.5rem;
|
||||
height: 4.5rem;
|
||||
}
|
||||
.ant-spin-dot-item{
|
||||
background-color: #000000 !important;
|
||||
@@ -2397,6 +2398,16 @@ textarea:focus{
|
||||
}
|
||||
}
|
||||
|
||||
.mosaic-bg{
|
||||
--mosaic-bg-size: 1rem;
|
||||
--mosaic-bg-color1: #efefef;
|
||||
--mosaic-bg-color2: #fff;
|
||||
background-image: repeating-conic-gradient(var(--mosaic-bg-color1) 0% 25%, var(--mosaic-bg-color2) 0% 50%);
|
||||
background-repeat: repeat;
|
||||
background-position: 50% 50%;
|
||||
background-size: var(--mosaic-bg-size) var(--mosaic-bg-size);
|
||||
}
|
||||
|
||||
//蒙层样式
|
||||
.mark_loading{
|
||||
position: fixed;
|
||||
|
||||
@@ -266,9 +266,11 @@ export default defineComponent({
|
||||
.account_page{
|
||||
height: 100%;
|
||||
// overflow-y: auto;
|
||||
padding: 0 26rem;
|
||||
// padding: 0 26rem;
|
||||
// padding: 0 7rem;
|
||||
padding-top: 4rem;
|
||||
max-width: 100rem;
|
||||
margin: 0 auto;
|
||||
display: flex;
|
||||
overflow: hidden;
|
||||
.account_page_titleImg{
|
||||
|
||||
@@ -2,21 +2,36 @@
|
||||
<div class="account_systemMessage">
|
||||
<div class="account_generalMessage_title modal_title_text">
|
||||
<!-- <span>系统消息</span> -->
|
||||
<div class="account_generalMessage_title_setting" @click="allRead">{{$t('account.AllRead')}}</div>
|
||||
<div class="account_generalMessage_title_setting" @click="allRead">
|
||||
{{ $t("account.AllRead") }}
|
||||
</div>
|
||||
<div class="account_generalMessage_item modal_title_text" v-for="item in dataList" :key="item.id" @click="setRead(item)">
|
||||
</div>
|
||||
<div
|
||||
class="account_generalMessage_item modal_title_text"
|
||||
v-for="item in dataList"
|
||||
:key="item.id"
|
||||
@click="setRead(item)"
|
||||
>
|
||||
<a-badge :dot="item.isRead == 0"></a-badge>
|
||||
<div class="account_generalMessage_item_title">
|
||||
<div class="account_generalMessage_item_title_text" :title="item.content">{{ item.content.title }}</div>
|
||||
<div class="account_generalMessage_item_title_text" :title="item.content">
|
||||
{{ item.content.title }}
|
||||
</div>
|
||||
<div class="modal_title_text_intro">{{ item.createTime }}</div>
|
||||
</div>
|
||||
<div class="modal_title_text_intro">
|
||||
{{ item.content.content }}
|
||||
<span v-if="item.content.link" class="account_generalMessage_item_link">{{ item.content.link }}</span>
|
||||
<span v-if="item.content.link" class="account_generalMessage_item_link">{{
|
||||
item.content.link
|
||||
}}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="account_generalMessage_item modal_title_text" style="display:flex;justify-content: center;" v-if="dataList.length == 0 && isNoData">
|
||||
{{$t('account.dataNull')}}
|
||||
<div
|
||||
class="account_generalMessage_item modal_title_text"
|
||||
style="display: flex; justify-content: center"
|
||||
v-if="dataList.length == 0 && isNoData"
|
||||
>
|
||||
{{ $t("account.dataNull") }}
|
||||
</div>
|
||||
<div class="page_loading_box" v-show="!isNoData">
|
||||
<span class="page_loading" ref="loadingDom" v-show="!isShowMark"></span>
|
||||
@@ -27,117 +42,135 @@
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts">
|
||||
import { defineComponent,computed,ref,reactive,nextTick,toRefs,createVNode, onMounted} from 'vue'
|
||||
import { Https } from "@/tool/https";
|
||||
import { useRouter,useRoute } from 'vue-router'
|
||||
import { useStore } from "vuex";
|
||||
import { useI18n } from 'vue-i18n'
|
||||
import {
|
||||
defineComponent,
|
||||
computed,
|
||||
ref,
|
||||
reactive,
|
||||
nextTick,
|
||||
toRefs,
|
||||
createVNode,
|
||||
onMounted
|
||||
} from "vue"
|
||||
import { Https } from "@/tool/https"
|
||||
import { useRouter, useRoute } from "vue-router"
|
||||
import { useStore } from "vuex"
|
||||
import { useI18n } from "vue-i18n"
|
||||
import { isValidUrl } from "@/tool/util"
|
||||
export default defineComponent({
|
||||
components:{
|
||||
},
|
||||
components: {},
|
||||
// emits:['putListData'],
|
||||
props:['setReadStatus','setAllmessage','getHistory'],
|
||||
setup(prop,{emit}) {
|
||||
props: ["setReadStatus", "setAllmessage", "getHistory"],
|
||||
setup(prop, { emit }) {
|
||||
const router = useRouter()
|
||||
const store = useStore();
|
||||
const store = useStore()
|
||||
let accountMessage = reactive({
|
||||
dataList: [],
|
||||
page:1,
|
||||
size:10,
|
||||
page: 1,
|
||||
size: 10,
|
||||
isNoData: false,
|
||||
isShowMark: false,
|
||||
isShowMark: false
|
||||
})
|
||||
let loadingDom:any = ref(null)
|
||||
let setmessageList = ()=>{
|
||||
let loadingDom: any = ref(null)
|
||||
let setmessageList = () => {
|
||||
accountMessage.isShowMark = true
|
||||
let data = {
|
||||
page: accountMessage.page,
|
||||
size: accountMessage.size,
|
||||
size: accountMessage.size
|
||||
}
|
||||
prop.getHistory(data).then((rv:any)=>{
|
||||
prop.getHistory(data)
|
||||
.then((rv: any) => {
|
||||
accountMessage.isShowMark = false
|
||||
|
||||
if(rv.content.length == 0) {
|
||||
if (rv.content.length == 0) {
|
||||
accountMessage.isNoData = true
|
||||
}else{
|
||||
rv.content.forEach((item:any) => {
|
||||
} else {
|
||||
rv.content.forEach((item: any) => {
|
||||
item.content = JSON.parse(item.content)
|
||||
});
|
||||
})
|
||||
accountMessage.dataList.push(...rv.content)
|
||||
}
|
||||
}).catch(() => {
|
||||
})
|
||||
.catch(() => {
|
||||
accountMessage.isShowMark = false
|
||||
accountMessage.isNoData = true
|
||||
})
|
||||
}
|
||||
let setRead = (item:any)=>{
|
||||
prop.setReadStatus(item).then((rv:any)=>{
|
||||
item.isRead = 1
|
||||
}).catch((err:any)=>{
|
||||
})
|
||||
let setRead = (item: any) => {
|
||||
let content = item.content.content
|
||||
if (isValidUrl(content)) {
|
||||
if (import.meta.env.VITE_APP_BASE_URL === "https://develop.api.aida.com.hk") {
|
||||
content += "&env=dev"
|
||||
}
|
||||
let allRead = ()=>{
|
||||
// emit('setAllmessage')
|
||||
prop.setAllmessage().then(()=>{
|
||||
accountMessage.dataList.forEach((item:any)=>{
|
||||
window.open(content, "_blank")
|
||||
}
|
||||
|
||||
prop.setReadStatus(item)
|
||||
.then((rv: any) => {
|
||||
item.isRead = 1
|
||||
})
|
||||
}).catch((err:any)=>{
|
||||
.catch((err: any) => {})
|
||||
}
|
||||
let allRead = () => {
|
||||
// emit('setAllmessage')
|
||||
prop.setAllmessage()
|
||||
.then(() => {
|
||||
accountMessage.dataList.forEach((item: any) => {
|
||||
item.isRead = 1
|
||||
})
|
||||
})
|
||||
.catch((err: any) => {})
|
||||
}
|
||||
// provide('exhibitionList',exhibitionList)
|
||||
onMounted (()=>{
|
||||
onMounted(() => {
|
||||
accountMessage.isNoData = false
|
||||
accountMessage.page = 0
|
||||
let imgParent:any = document.querySelector('.account_systemMessage .page_loading')
|
||||
let imgParent: any = document.querySelector(".account_systemMessage .page_loading")
|
||||
new IntersectionObserver(
|
||||
(entries, observer) => {
|
||||
// 如果不是相交,则直接返回
|
||||
// console.log(entries[0]);
|
||||
if (!entries[0].intersectionRatio) return;
|
||||
accountMessage.page+=1
|
||||
if (!entries[0].intersectionRatio) return
|
||||
accountMessage.page += 1
|
||||
setmessageList()
|
||||
},
|
||||
}
|
||||
// { root:worksPage }
|
||||
).observe(loadingDom.value);
|
||||
).observe(loadingDom.value)
|
||||
})
|
||||
return{
|
||||
return {
|
||||
...toRefs(accountMessage),
|
||||
setmessageList,
|
||||
setRead,
|
||||
allRead,
|
||||
loadingDom,
|
||||
loadingDom
|
||||
}
|
||||
},
|
||||
data(){
|
||||
return{
|
||||
|
||||
data() {
|
||||
return {}
|
||||
}
|
||||
},
|
||||
})
|
||||
</script>
|
||||
<style lang="less" scoped>
|
||||
.account_systemMessage{
|
||||
.account_systemMessage {
|
||||
width: 100%;
|
||||
.account_generalMessage_item{
|
||||
.account_generalMessage_item {
|
||||
font-size: var(--aida-fsize1-6);
|
||||
.account_generalMessage_item_title{
|
||||
.account_generalMessage_item_title {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom: 2rem;
|
||||
.account_generalMessage_item_title_text{
|
||||
.account_generalMessage_item_title_text {
|
||||
max-width: 80%;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
.modal_title_text_intro{
|
||||
.modal_title_text_intro {
|
||||
margin-left: 4rem;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
.modal_title_text_intro{
|
||||
.modal_title_text_intro {
|
||||
word-break: break-word;
|
||||
white-space: pre-wrap;
|
||||
font-family: Arial, sans-serif;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div class="admin_page">
|
||||
<div class="admin_table_search" :style="{height:isAwayOrUnfold?'7rem':''}">
|
||||
<div class="admin_table_search" :style="{ height: isAwayOrUnfold ? '7rem' : '' }">
|
||||
<div class="admin_state">
|
||||
<div class="admin_state_item">
|
||||
<span>Create Time:</span>
|
||||
@@ -8,16 +8,11 @@
|
||||
style="width: 250px"
|
||||
class="range_picker"
|
||||
v-model:value="rangePickerValue"
|
||||
:placeholder="[
|
||||
$t('HistoryPage.StartDate'),
|
||||
$t('HistoryPage.EndDate'),
|
||||
]"
|
||||
:placeholder="[$t('HistoryPage.StartDate'), $t('HistoryPage.EndDate')]"
|
||||
valueFormat="YYYY-MM-DD"
|
||||
>
|
||||
<template #suffixIcon>
|
||||
<span
|
||||
class="icon iconfont range_picker_icon icon-rili"
|
||||
></span>
|
||||
<span class="icon iconfont range_picker_icon icon-rili"></span>
|
||||
</template>
|
||||
</a-range-picker>
|
||||
</div>
|
||||
@@ -63,38 +58,50 @@
|
||||
show-search
|
||||
></a-select>
|
||||
</div>
|
||||
<div class="admin_state_item">
|
||||
<span>Orgnization:</span>
|
||||
<a-select
|
||||
v-model:value="organizationId"
|
||||
placeholder="Select the organization"
|
||||
allow-clear
|
||||
style="width: 250px"
|
||||
@popupScroll="handleOrganizationScroll"
|
||||
>
|
||||
<a-select-option
|
||||
v-for="item in organizationOptions"
|
||||
:key="item.id"
|
||||
:value="item.id"
|
||||
>
|
||||
{{ item.name }}
|
||||
</a-select-option>
|
||||
</a-select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="admin_search">
|
||||
<div class="admin_search_item" @click="searchHistoryList" :style="{height:isAwayOrUnfold?'4rem':''}">
|
||||
<div
|
||||
class="admin_search_item"
|
||||
@click="searchHistoryList"
|
||||
:style="{ height: isAwayOrUnfold ? '4rem' : '' }"
|
||||
>
|
||||
Search
|
||||
</div>
|
||||
<div class="admin_search_item" @click="addhHistoryList">
|
||||
Add
|
||||
</div>
|
||||
<div class="admin_search_item" @click="addhHistoryList">Add</div>
|
||||
</div>
|
||||
<div class="admin_state_list">
|
||||
<div
|
||||
class="admin_state_list_item"
|
||||
@click="lastGeTrialList('year')"
|
||||
>
|
||||
<div class="admin_state_list_item" @click="lastGeTrialList('year')">
|
||||
Nearly a year
|
||||
</div>
|
||||
<div
|
||||
class="admin_state_list_item"
|
||||
@click="lastGeTrialList('month')"
|
||||
>
|
||||
<div class="admin_state_list_item" @click="lastGeTrialList('month')">
|
||||
Last month
|
||||
</div>
|
||||
<div
|
||||
class="admin_state_list_item"
|
||||
@click="lastGeTrialList('week')"
|
||||
>
|
||||
Last week
|
||||
<div class="admin_state_list_item" @click="lastGeTrialList('week')">Last week</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="awayOrUnfold" :class="{active:isAwayOrUnfold}">
|
||||
<span class="icon iconfont menu_icon icon-xiala" @click="()=>isAwayOrUnfold = !isAwayOrUnfold"></span>
|
||||
<div class="awayOrUnfold" :class="{ active: isAwayOrUnfold }">
|
||||
<span
|
||||
class="icon iconfont menu_icon icon-xiala"
|
||||
@click="() => (isAwayOrUnfold = !isAwayOrUnfold)"
|
||||
></span>
|
||||
</div>
|
||||
<div class="admin_table_content" ref="historyTable">
|
||||
<a-table
|
||||
@@ -104,24 +111,19 @@
|
||||
:data-source="dataList"
|
||||
:scroll="{ y: historyTableHeight }"
|
||||
@change="changePage"
|
||||
:showSorterTooltip='false'
|
||||
:showSorterTooltip="false"
|
||||
:pagination="{
|
||||
showSizeChanger: true,
|
||||
current: currentPage,
|
||||
pageSize: pageSize,
|
||||
total: total,
|
||||
showQuickJumper: true,
|
||||
bordered: false,
|
||||
bordered: false
|
||||
}"
|
||||
>
|
||||
<template #bodyCell="{ column, text, record, index }">
|
||||
<div class="operate_list" v-if="column?.Operations">
|
||||
<div
|
||||
class="operate_item"
|
||||
@click="setAagree(record)"
|
||||
>
|
||||
Edit
|
||||
</div>
|
||||
<div class="operate_item" @click="setAagree(record)">Edit</div>
|
||||
<!-- <div
|
||||
class="operate_item"
|
||||
@click="deleteGroup(record, index)"
|
||||
@@ -132,34 +134,29 @@
|
||||
</template>
|
||||
</a-table>
|
||||
</div>
|
||||
<allUserPoerationsVue ref="allUserPoerationsVue" @searchHistoryList="searchHistoryList"></allUserPoerationsVue>
|
||||
<allUserPoerationsVue
|
||||
ref="allUserPoerationsVue"
|
||||
@searchHistoryList="searchHistoryList"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts">
|
||||
import {
|
||||
defineComponent,
|
||||
ref,
|
||||
createVNode,
|
||||
computed,
|
||||
reactive,
|
||||
toRefs,
|
||||
onMounted,
|
||||
} from "vue";
|
||||
import { formatTime } from "@/tool/util";
|
||||
import { useStore } from "vuex";
|
||||
import { Https } from "@/tool/https";
|
||||
import allUserPoerationsVue from "./allUserPoerations.vue";
|
||||
import SelectUser from '@/component/common/SelectUser.vue'
|
||||
import { defineComponent, ref, createVNode, computed, reactive, toRefs, onMounted } from "vue"
|
||||
import { formatTime } from "@/tool/util"
|
||||
import { useStore } from "vuex"
|
||||
import { Https } from "@/tool/https"
|
||||
import allUserPoerationsVue from "./allUserPoerations.vue"
|
||||
import SelectUser from "@/component/common/SelectUser.vue"
|
||||
export default defineComponent({
|
||||
components: {allUserPoerationsVue,SelectUser},
|
||||
components: { allUserPoerationsVue, SelectUser },
|
||||
setup() {
|
||||
const store:any = useStore()
|
||||
const store: any = useStore()
|
||||
let filter: any = reactive({
|
||||
dataList: [],
|
||||
tableLoading: false,
|
||||
allCountry:[],
|
||||
isAwayOrUnfold:false
|
||||
});
|
||||
allCountry: [],
|
||||
isAwayOrUnfold: false
|
||||
})
|
||||
let filterData: any = reactive({
|
||||
rangePickerValue: [],
|
||||
currentPage: 1,
|
||||
@@ -172,40 +169,41 @@ export default defineComponent({
|
||||
occupation: "",
|
||||
systemUser: "",
|
||||
order: "", //'Ascending 升序 Descending 降序'
|
||||
orderBy:'',
|
||||
orderBy: "",
|
||||
userName: "",
|
||||
});
|
||||
organizationId: null
|
||||
})
|
||||
let state: any = ref([
|
||||
{
|
||||
label: "all",
|
||||
value: "",
|
||||
value: ""
|
||||
},
|
||||
{
|
||||
label:'visitor',
|
||||
value:'0',
|
||||
label: "visitor",
|
||||
value: "0"
|
||||
},
|
||||
{
|
||||
label:'yearly',
|
||||
value:'1',
|
||||
label: "yearly",
|
||||
value: "1"
|
||||
},
|
||||
{
|
||||
label:'monthly',
|
||||
value:'2',
|
||||
label: "monthly",
|
||||
value: "2"
|
||||
},
|
||||
{
|
||||
label:'trial',
|
||||
value:'3',
|
||||
label: "trial",
|
||||
value: "3"
|
||||
},
|
||||
{
|
||||
label: "userInEvent",
|
||||
value: "4",
|
||||
value: "4"
|
||||
},
|
||||
{
|
||||
label: "Edu Admin",
|
||||
value: "7",
|
||||
},
|
||||
]);
|
||||
let renameData: any = ref({}); //修改名字选中的数据
|
||||
value: "7"
|
||||
}
|
||||
])
|
||||
let renameData: any = ref({}) //修改名字选中的数据
|
||||
const columns: any = computed(() => {
|
||||
return [
|
||||
{
|
||||
@@ -213,25 +211,25 @@ export default defineComponent({
|
||||
align: "center",
|
||||
dataIndex: "id",
|
||||
key: "id",
|
||||
width:100,
|
||||
width: 100,
|
||||
fixed: "left",
|
||||
sorter: true,
|
||||
sorter: true
|
||||
},
|
||||
{
|
||||
title: "Email",
|
||||
align: "center",
|
||||
dataIndex: "userEmail",
|
||||
key: "userEmail",
|
||||
width:200,
|
||||
ellipsis:true
|
||||
width: 200,
|
||||
ellipsis: true
|
||||
},
|
||||
{
|
||||
title: "User Name",
|
||||
align: "center",
|
||||
dataIndex: "userName",
|
||||
key: "userName",
|
||||
width:150,
|
||||
ellipsis:true
|
||||
width: 150,
|
||||
ellipsis: true
|
||||
// customRender: (record: any) => {
|
||||
// let time = formatTime(
|
||||
// record.text / 1000,
|
||||
@@ -245,77 +243,77 @@ export default defineComponent({
|
||||
align: "center",
|
||||
dataIndex: "language",
|
||||
key: "language",
|
||||
width:100,
|
||||
ellipsis:true,
|
||||
width: 100,
|
||||
ellipsis: true
|
||||
},
|
||||
{
|
||||
title: "Valid Start Time",
|
||||
align: "center",
|
||||
dataIndex: "validStartTime",
|
||||
key: "validstartTime",
|
||||
width:200,
|
||||
ellipsis:true,
|
||||
width: 200,
|
||||
ellipsis: true,
|
||||
customRender: (record: any) => {
|
||||
let time = ''
|
||||
if(record.text){
|
||||
time = formatTime(record.text / 1000, 'YYYY-MM-DD hh:mm:ss')
|
||||
let time = ""
|
||||
if (record.text) {
|
||||
time = formatTime(record.text / 1000, "YYYY-MM-DD hh:mm:ss")
|
||||
}
|
||||
return time
|
||||
},
|
||||
}
|
||||
},
|
||||
{
|
||||
title: "Valid End Time",
|
||||
align: "center",
|
||||
dataIndex: "validEndTime",
|
||||
key: "validendTime",
|
||||
width:200,
|
||||
ellipsis:true,
|
||||
width: 200,
|
||||
ellipsis: true,
|
||||
customRender: (record: any) => {
|
||||
let time = ''
|
||||
if(record.text){
|
||||
time = formatTime(record.text / 1000, 'YYYY-MM-DD hh:mm:ss')
|
||||
let time = ""
|
||||
if (record.text) {
|
||||
time = formatTime(record.text / 1000, "YYYY-MM-DD hh:mm:ss")
|
||||
}
|
||||
return time
|
||||
},
|
||||
}
|
||||
},
|
||||
{
|
||||
title: "Country or Region",
|
||||
align: "center",
|
||||
dataIndex: "country",
|
||||
key: "country",
|
||||
width:200,
|
||||
width: 200
|
||||
},
|
||||
{
|
||||
title: "Create Date",
|
||||
align: "center",
|
||||
dataIndex: "createDate",
|
||||
key: "createDate",
|
||||
width:200,
|
||||
sorter: true,
|
||||
width: 200,
|
||||
sorter: true
|
||||
},
|
||||
{
|
||||
title: "Is Beginner",
|
||||
align: "center",
|
||||
dataIndex: "isBeginner",
|
||||
key: "isBeginner",
|
||||
width:80,
|
||||
ellipsis:true,
|
||||
width: 80,
|
||||
ellipsis: true,
|
||||
customRender: (record: any) => {
|
||||
let str;
|
||||
let str
|
||||
if (record.value == 1) {
|
||||
str = "Yes";
|
||||
str = "Yes"
|
||||
} else {
|
||||
str = "No";
|
||||
str = "No"
|
||||
}
|
||||
return str
|
||||
}
|
||||
return str;
|
||||
},
|
||||
},
|
||||
{
|
||||
title: 'Machine Room Ip',
|
||||
title: "Machine Room Ip",
|
||||
align: "center",
|
||||
dataIndex: "browserIdentifiers",
|
||||
key: "browserIdentifiers",
|
||||
width:200,
|
||||
width: 200
|
||||
},
|
||||
{
|
||||
title: "Credits",
|
||||
@@ -326,11 +324,11 @@ export default defineComponent({
|
||||
// resizable: true,
|
||||
dataIndex: "credits",
|
||||
key: "credits",
|
||||
width:100,
|
||||
sorter: true,
|
||||
width: 100,
|
||||
sorter: true
|
||||
},
|
||||
{
|
||||
title: 'User Type',
|
||||
title: "User Type",
|
||||
align: "center",
|
||||
// width: 150,
|
||||
// minWidth: 100,
|
||||
@@ -338,84 +336,84 @@ export default defineComponent({
|
||||
// resizable: true,
|
||||
dataIndex: "systemUser",
|
||||
key: "systemUser",
|
||||
width:100,
|
||||
width: 100,
|
||||
customRender: (record: any) => {
|
||||
let str;
|
||||
let str
|
||||
if (record.value == 0) {
|
||||
str = "visitor";
|
||||
str = "visitor"
|
||||
} else if (record.value == 1) {
|
||||
str = "yearly";
|
||||
str = "yearly"
|
||||
} else if (record.value == 2) {
|
||||
str = "monthly";
|
||||
str = "monthly"
|
||||
} else if (record.value == 3) {
|
||||
str = "trial";
|
||||
str = "trial"
|
||||
} else if (record.value == 4) {
|
||||
str = "userInEvent";
|
||||
str = "userInEvent"
|
||||
} else if (record.value == 7) {
|
||||
str = "Edu Admin";
|
||||
str = "Edu Admin"
|
||||
}
|
||||
return str
|
||||
}
|
||||
return str;
|
||||
},
|
||||
},
|
||||
{
|
||||
title: "Operations",
|
||||
key: "operation",
|
||||
width:120,
|
||||
width: 120,
|
||||
align: "center",
|
||||
fixed: "right",
|
||||
// slots:{customRender:'action'}
|
||||
Operations: true,
|
||||
},
|
||||
];
|
||||
});
|
||||
Operations: true
|
||||
}
|
||||
]
|
||||
})
|
||||
//改变页码
|
||||
let changePage = (e: any, filters:any, sorter:any) => {
|
||||
filterData.currentPage = e.current;
|
||||
filterData.pageSize = e.pageSize;
|
||||
if(sorter.order){
|
||||
if(sorter.columnKey == 'id'){
|
||||
filterData.orderBy = 'id'
|
||||
}else if(sorter.columnKey == "createDate"){
|
||||
filterData.orderBy = 'time'
|
||||
}else if(sorter.columnKey == "credits"){
|
||||
filterData.orderBy = 'credits'
|
||||
let changePage = (e: any, filters: any, sorter: any) => {
|
||||
filterData.currentPage = e.current
|
||||
filterData.pageSize = e.pageSize
|
||||
if (sorter.order) {
|
||||
if (sorter.columnKey == "id") {
|
||||
filterData.orderBy = "id"
|
||||
} else if (sorter.columnKey == "createDate") {
|
||||
filterData.orderBy = "time"
|
||||
} else if (sorter.columnKey == "credits") {
|
||||
filterData.orderBy = "credits"
|
||||
}
|
||||
}
|
||||
if(sorter.order){
|
||||
filterData.order = sorter.order == "descend" ? "Descending" : "Ascending";
|
||||
}else{
|
||||
filterData.order = ''
|
||||
if (sorter.order) {
|
||||
filterData.order = sorter.order == "descend" ? "Descending" : "Ascending"
|
||||
} else {
|
||||
filterData.order = ""
|
||||
}
|
||||
gettrialList()
|
||||
}
|
||||
gettrialList();
|
||||
};
|
||||
|
||||
//查询列表
|
||||
let searchHistoryList = () => {
|
||||
filterData.currentPage = 1;
|
||||
gettrialList();
|
||||
};
|
||||
filterData.currentPage = 1
|
||||
gettrialList()
|
||||
}
|
||||
let clearHistoryList = () => {
|
||||
filterData.rangePickerValue = [],
|
||||
filterData.currentPage = 1,
|
||||
filterData.pageSize = 10,
|
||||
filterData.total = 0,
|
||||
filterData.country = "",
|
||||
filterData.email = "",
|
||||
filterData.userType = "",
|
||||
filterData.ids = [],
|
||||
filterData.occupation = "",
|
||||
filterData.order = "", //'Ascending 升序 Descending 降序'
|
||||
filterData.orderBy = "", //'Ascending 升序 Descending 降序'
|
||||
filterData.systemUser = "",
|
||||
filterData.userName = "";
|
||||
};
|
||||
;((filterData.rangePickerValue = []),
|
||||
(filterData.currentPage = 1),
|
||||
(filterData.pageSize = 10),
|
||||
(filterData.total = 0),
|
||||
(filterData.country = ""),
|
||||
(filterData.email = ""),
|
||||
(filterData.userType = ""),
|
||||
(filterData.ids = []),
|
||||
(filterData.occupation = ""),
|
||||
(filterData.order = ""), //'Ascending 升序 Descending 降序'
|
||||
(filterData.orderBy = ""), //'Ascending 升序 Descending 降序'
|
||||
(filterData.systemUser = ""),
|
||||
(filterData.userName = ""))
|
||||
}
|
||||
let setHistoryListData = () => {
|
||||
let startDate: any = filterData.rangePickerValue?.[0]
|
||||
? filterData.rangePickerValue[0] + " " + "00:00:00"
|
||||
: "";
|
||||
: ""
|
||||
let endDate: any = filterData.rangePickerValue?.[1]
|
||||
? filterData.rangePickerValue[1] + " " + "23:59:59"
|
||||
: "";
|
||||
: ""
|
||||
let data = {
|
||||
endTime: endDate,
|
||||
startTime: startDate,
|
||||
@@ -430,63 +428,118 @@ export default defineComponent({
|
||||
order: filterData.order,
|
||||
orderBy: filterData.orderBy,
|
||||
userName: filterData.userName,
|
||||
};
|
||||
return data;
|
||||
};
|
||||
organizationId: filterData.organizationId
|
||||
}
|
||||
return data
|
||||
}
|
||||
//获取列表
|
||||
let gettrialList = () => {
|
||||
filter.tableLoading = true;
|
||||
let data = setHistoryListData();
|
||||
Https.axiosPost(Https.httpUrls.getUserInfo, data).then(
|
||||
(rv: any) => {
|
||||
filter.tableLoading = true
|
||||
let data = setHistoryListData()
|
||||
Https.axiosPost(Https.httpUrls.getUserInfo, data).then((rv: any) => {
|
||||
if (rv) {
|
||||
// this.dataList = rv
|
||||
filter.dataList = rv.records;
|
||||
filterData.total = rv.total;
|
||||
filter.tableLoading = false;
|
||||
filter.dataList = rv.records
|
||||
filterData.total = rv.total
|
||||
filter.tableLoading = false
|
||||
|
||||
// this.workspaceItem.position = this.singleTypeList[0].label
|
||||
}
|
||||
})
|
||||
}
|
||||
);
|
||||
};
|
||||
let lastGeTrialList = (str: string) => {
|
||||
clearHistoryList();
|
||||
let currentDate = new Date();
|
||||
let currentTimestamp = Math.floor(currentDate.getTime() / 1000);
|
||||
clearHistoryList()
|
||||
let currentDate = new Date()
|
||||
let currentTimestamp = Math.floor(currentDate.getTime() / 1000)
|
||||
// 计算30天前的时间戳
|
||||
let thirtyDaysAgoTimestamp;
|
||||
let thirtyDaysAgoTimestamp
|
||||
if (str == "year") {
|
||||
thirtyDaysAgoTimestamp = currentTimestamp - 360 * 24 * 60 * 60;
|
||||
thirtyDaysAgoTimestamp = currentTimestamp - 360 * 24 * 60 * 60
|
||||
} else if (str == "month") {
|
||||
thirtyDaysAgoTimestamp = currentTimestamp - 30 * 24 * 60 * 60;
|
||||
thirtyDaysAgoTimestamp = currentTimestamp - 30 * 24 * 60 * 60
|
||||
} else if (str == "week") {
|
||||
thirtyDaysAgoTimestamp = currentTimestamp - 7 * 24 * 60 * 60;
|
||||
thirtyDaysAgoTimestamp = currentTimestamp - 7 * 24 * 60 * 60
|
||||
}
|
||||
filterData.rangePickerValue[0] = formatTime(thirtyDaysAgoTimestamp, "YYYY-MM-DD")
|
||||
gettrialList()
|
||||
}
|
||||
filterData.rangePickerValue[0] = formatTime(
|
||||
thirtyDaysAgoTimestamp,
|
||||
"YYYY-MM-DD"
|
||||
);
|
||||
gettrialList();
|
||||
};
|
||||
let filterOption = (input: any, option: any) => {
|
||||
// 使用 option.label 进行搜索
|
||||
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0;
|
||||
};
|
||||
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
|
||||
}
|
||||
let addhHistoryList = () => {
|
||||
allUserPoerationsVue.value.init('Add','')
|
||||
};
|
||||
allUserPoerationsVue.value.init("Add", "")
|
||||
}
|
||||
let allUserPoerationsVue = ref()
|
||||
let setAagree = (data:any) =>{
|
||||
allUserPoerationsVue.value.init('Edit',data)
|
||||
let setAagree = (data: any) => {
|
||||
allUserPoerationsVue.value.init("Edit", data)
|
||||
}
|
||||
|
||||
const organizationOptions = ref([])
|
||||
const organizationParams = reactive({
|
||||
page: 1,
|
||||
size: 10,
|
||||
total: 0
|
||||
})
|
||||
const organizationLoading = ref(false)
|
||||
const getOrganizationList = async (isLoadMore = false) => {
|
||||
console.log("111111")
|
||||
if (organizationLoading.value) return
|
||||
if (isLoadMore) {
|
||||
const loaded = organizationParams.page * organizationParams.size
|
||||
if (organizationParams.total && loaded >= organizationParams.total) return
|
||||
organizationParams.page += 1
|
||||
} else {
|
||||
organizationParams.page = 1
|
||||
organizationOptions.value = []
|
||||
}
|
||||
organizationLoading.value = true
|
||||
try {
|
||||
const { total, ...requestParams } = organizationParams
|
||||
const rv: any = await Https.axiosPost(
|
||||
Https.httpUrls.queryOrganization,
|
||||
requestParams
|
||||
)
|
||||
if (rv) {
|
||||
const newRecords = rv.records || []
|
||||
// 遍历新数据,如果已存在则覆盖,不存在则追加
|
||||
newRecords.forEach((newOrg: any) => {
|
||||
const newOrgId = String(newOrg.id)
|
||||
const existingIndex = organizationOptions.value.findIndex(
|
||||
(org: any) => String(org.id) === newOrgId
|
||||
)
|
||||
if (existingIndex !== -1) {
|
||||
// 如果已存在,用新数据覆盖旧项
|
||||
organizationOptions.value[existingIndex] = newOrg
|
||||
} else {
|
||||
// 如果不存在,追加到末尾
|
||||
organizationOptions.value.push(newOrg)
|
||||
}
|
||||
})
|
||||
organizationParams.total = rv.total || 0
|
||||
}
|
||||
} finally {
|
||||
organizationLoading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
const handleOrganizationScroll = (e: any) => {
|
||||
const target = e?.target
|
||||
if (!target) return
|
||||
const nearBottom = target.scrollTop + target.clientHeight >= target.scrollHeight - 20
|
||||
if (nearBottom) {
|
||||
getOrganizationList(true)
|
||||
}
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
let allCountry: any = sessionStorage.getItem("allCountry");
|
||||
let allCountry: any = sessionStorage.getItem("allCountry")
|
||||
if (allCountry) {
|
||||
filter.allCountry = JSON.parse(allCountry);
|
||||
filter.allCountry = JSON.parse(allCountry)
|
||||
}
|
||||
gettrialList();
|
||||
});
|
||||
gettrialList()
|
||||
getOrganizationList()
|
||||
})
|
||||
return {
|
||||
...toRefs(filter),
|
||||
...toRefs(filterData),
|
||||
@@ -501,29 +554,32 @@ export default defineComponent({
|
||||
filterOption,
|
||||
allUserPoerationsVue,
|
||||
setAagree,
|
||||
};
|
||||
handleOrganizationScroll,
|
||||
getOrganizationList,
|
||||
organizationOptions,
|
||||
organizationParams
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
historyTableHeight: 0,
|
||||
handleResizeColumn: (w: any, col: any) => {
|
||||
col.width = w;
|
||||
},
|
||||
};
|
||||
col.width = w
|
||||
}
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
let historyTable: any = this.$refs.historyTable;
|
||||
this.historyTableHeight = historyTable.clientHeight - 200;
|
||||
let historyTable: any = this.$refs.historyTable
|
||||
this.historyTableHeight = historyTable.clientHeight - 200
|
||||
},
|
||||
methods: {},
|
||||
});
|
||||
methods: {}
|
||||
})
|
||||
</script>
|
||||
<style lang="less" scoped>
|
||||
.admin_page .admin_table_search .admin_state {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
.admin_page{
|
||||
|
||||
.admin_page {
|
||||
}
|
||||
</style>
|
||||
@@ -55,6 +55,7 @@ commandManager.setChangeCallback((info) => {
|
||||
emit("undo-redo-status-changed", {
|
||||
canUndo: canUndo.value,
|
||||
canRedo: canRedo.value,
|
||||
type: info.type,
|
||||
commandManager,
|
||||
});
|
||||
});
|
||||
|
||||
@@ -907,7 +907,8 @@
|
||||
}
|
||||
emit("changeCanvas", commandData)
|
||||
canvasManager.changeCanvas()
|
||||
if ((command.canUndo || command.canRedo) && props.enabledRedGreenMode) {
|
||||
const type = command.type
|
||||
if (props.enabledRedGreenMode && (type === "undo" || type === "redo")) {
|
||||
setTimeout(async () => {
|
||||
try {
|
||||
const imageData = await canvasManager.exportImage({
|
||||
@@ -1040,6 +1041,7 @@
|
||||
},
|
||||
// 导出图片
|
||||
exportImage: async ({
|
||||
isFrontBackUpdata = false, // 更新红绿图时候需要用,直接更新红绿图
|
||||
isContainBg = false, // 是否包含背景图层
|
||||
isContainFixed = false, // 是否包含固定图层
|
||||
isContainFixedOther = true, // 是否包含其他固定图层--颜色图层
|
||||
@@ -1056,6 +1058,10 @@
|
||||
} = {}) => {
|
||||
loading.value = true
|
||||
canvasManager?.canvas?.discardActiveObject()
|
||||
if (isFrontBackUpdata) {
|
||||
await canvasManager?.setSpecialCliptInfo(true, true)
|
||||
canvasManager.canvas.renderAll()
|
||||
}
|
||||
var base64 = await canvasManager.exportImage({
|
||||
isContainBg,
|
||||
isContainFixed,
|
||||
|
||||
@@ -409,7 +409,7 @@ export class BrushIndicator {
|
||||
// this.show(e.e);
|
||||
this._mouseEnterHandler && this._mouseEnterHandler(e)
|
||||
} else {
|
||||
// requestIdleCallback(() => {
|
||||
// setTimeout(() => {
|
||||
// this.updatePosition(e.e);
|
||||
// });
|
||||
|
||||
|
||||
@@ -47,7 +47,7 @@ import { getObjectAlphaToCanvas } from "../utils/objectHelper";
|
||||
import { AddLayerCommand, RemoveLayerCommand, ToggleChildLayerVisibilityCommand } from "../commands/LayerCommands";
|
||||
import { fa, id } from "element-plus/es/locales.mjs";
|
||||
import i18n from "@/lang/index.ts";
|
||||
const {t} = i18n.global;
|
||||
const { t } = i18n.global;
|
||||
|
||||
export class CanvasManager {
|
||||
constructor(canvasElement, options) {
|
||||
@@ -70,7 +70,7 @@ export class CanvasManager {
|
||||
this.handleCanvasInit = null; // 画布初始化回调函数
|
||||
this.partManager = options.partManager || null;
|
||||
this.props = options.props || {};
|
||||
this.emit = options.emit || (() => {});
|
||||
this.emit = options.emit || (() => { });
|
||||
this.awaitCanvasRun = null;
|
||||
this.canvasChangeing = false;
|
||||
// 初始化画布
|
||||
@@ -176,9 +176,9 @@ export class CanvasManager {
|
||||
// 添加笔刷图像转换处理回调
|
||||
this.canvas.onBrushImageConverted = async (fabricImage) => {
|
||||
const activeTool = this.toolManager?.activeTool?.value;
|
||||
if(activeTool === OperationType.PART_BRUSH){
|
||||
if (activeTool === OperationType.PART_BRUSH) {
|
||||
this.partManager?.addDrawPartImage(fabricImage);
|
||||
}else{
|
||||
} else {
|
||||
await this.addImageToLayer({ fabricImage, targetLayerId: null });
|
||||
}
|
||||
// 返回false表示使用默认行为(直接添加到画布)
|
||||
@@ -203,7 +203,7 @@ export class CanvasManager {
|
||||
// 可以在这里保存状态到命令管理器
|
||||
const affectedObjects = e.targets || [];
|
||||
const activeTool = this.toolManager?.activeTool?.value;
|
||||
if(activeTool === OperationType.PART_ERASER){
|
||||
if (activeTool === OperationType.PART_ERASER) {
|
||||
return this.partManager?.onErasingEnd(affectedObjects);
|
||||
}
|
||||
const command = this.eraserStateManager.endErasing(affectedObjects);
|
||||
@@ -461,7 +461,7 @@ export class CanvasManager {
|
||||
// this.canvas.renderAll();
|
||||
}
|
||||
// 重置画布大小参照固定图层
|
||||
async resetCanvasSizeByFixedLayer(){
|
||||
async resetCanvasSizeByFixedLayer() {
|
||||
// 重置画布大小为固定图层的大小
|
||||
const fixedLayerObj = this.getFixedLayerObject();
|
||||
const backgroundObject = this.getBackgroundLayerObject();
|
||||
@@ -475,10 +475,10 @@ export class CanvasManager {
|
||||
fixedLayerObj.height,
|
||||
fixedLayerObj.scaleY,
|
||||
backgroundObject.width,
|
||||
backgroundObject.scaleX,
|
||||
backgroundObject.height,
|
||||
backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
||||
if(Math.abs(fwidth/bwidth - fheight/bheight) < 0.1) return;
|
||||
backgroundObject.scaleX,
|
||||
backgroundObject.height,
|
||||
backgroundObject.scaleY, 'CanvasManager resetCanvasSizeByFixedLayer')
|
||||
if (Math.abs(fwidth / bwidth - fheight / bheight) < 0.1) return;
|
||||
this.canvasWidth.value = fwidth
|
||||
this.canvasHeight.value = fheight
|
||||
backgroundObject.set({
|
||||
@@ -489,7 +489,7 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
||||
width: this.canvasWidth.value,
|
||||
height: this.canvasHeight.value,
|
||||
})
|
||||
}
|
||||
}
|
||||
/**
|
||||
* 重置视图变换,使元素回到原始位置
|
||||
* @private
|
||||
@@ -623,17 +623,7 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
||||
this.updateMaskPosition(backgroundObject);
|
||||
}
|
||||
|
||||
// 更新颜色层信息
|
||||
// const colorObject = this.getLayerObjectById(SpecialLayerId.COLOR);
|
||||
// if(colorObject){
|
||||
// await this.setObjecCliptInfo(colorObject);
|
||||
// }
|
||||
const groupLayer = this.layerManager.getLayerById(SpecialLayerId.SPECIAL_GROUP);
|
||||
if(groupLayer){
|
||||
const groupRect = new fabric.Rect({});
|
||||
await this.setObjecCliptInfo(groupRect);
|
||||
groupLayer.clippingMask = groupRect.toObject();
|
||||
}
|
||||
this.setSpecialCliptInfo(false, true)
|
||||
|
||||
// 重新渲染画布
|
||||
this.canvas.renderAll();
|
||||
@@ -868,7 +858,7 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
||||
|
||||
return layerObjectByLayerId;
|
||||
}
|
||||
getObjectsByIdOrLayerId(ids){
|
||||
getObjectsByIdOrLayerId(ids) {
|
||||
const objects = this.canvas.getObjects().filter((obj) => {
|
||||
return ids.includes(obj.id) || ids.includes(obj.layerId);
|
||||
});
|
||||
@@ -1035,16 +1025,16 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
||||
|
||||
// 处理特殊图层的显示状态
|
||||
const ptlids = [];
|
||||
if(!enhancedOptions.isPrintTrimsNoRepeat || !enhancedOptions.isPrintTrimsRepeat){
|
||||
if (!enhancedOptions.isPrintTrimsNoRepeat || !enhancedOptions.isPrintTrimsRepeat) {
|
||||
let layers = this.layers?.value?.find((layer) => layer.isPrintTrimsGroup)?.children || [];
|
||||
for(let layer of layers){
|
||||
if(!layer.visible) continue;
|
||||
for (let layer of layers) {
|
||||
if (!layer.visible) continue;
|
||||
let repeat = layer.fabricObjects?.[0]?.fill?.repeat || "no-repeat";
|
||||
if(typeof repeat !== "string") repeat = "no-repeat";
|
||||
if(repeat === "no-repeat"){
|
||||
if(enhancedOptions.isPrintTrimsNoRepeat) continue;
|
||||
}else{
|
||||
if(enhancedOptions.isPrintTrimsRepeat) continue;
|
||||
if (typeof repeat !== "string") repeat = "no-repeat";
|
||||
if (repeat === "no-repeat") {
|
||||
if (enhancedOptions.isPrintTrimsNoRepeat) continue;
|
||||
} else {
|
||||
if (enhancedOptions.isPrintTrimsRepeat) continue;
|
||||
}
|
||||
ptlids.push(layer.id);
|
||||
const command = new ToggleChildLayerVisibilityCommand({
|
||||
@@ -1059,8 +1049,8 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
||||
}
|
||||
const res = await this.exportManager.exportImage(enhancedOptions);
|
||||
// 恢复特殊图层的显示状态
|
||||
if(ptlids.length > 0){
|
||||
for(let id of ptlids){
|
||||
if (ptlids.length > 0) {
|
||||
for (let id of ptlids) {
|
||||
const command = new ToggleChildLayerVisibilityCommand({
|
||||
canvas: this.canvas,
|
||||
layers: this.layers,
|
||||
@@ -1086,7 +1076,7 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
||||
// 导出颜色图层信息
|
||||
const color = await this.exportColorLayer().catch(() => (null));
|
||||
// 导出印花和元素图层信息
|
||||
const printTrimsData = await this.exportPrintTrimsLayers().catch(() => ({prints: null, trims: null}));
|
||||
const printTrimsData = await this.exportPrintTrimsLayers().catch(() => ({ prints: null, trims: null }));
|
||||
|
||||
const obj = {
|
||||
color,
|
||||
@@ -1106,7 +1096,7 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
||||
return Promise.reject("颜色图层不存在");
|
||||
}
|
||||
const object = this.getLayerObjectById(SpecialLayerId.COLOR);
|
||||
if(!object){
|
||||
if (!object) {
|
||||
console.warn("颜色图层不存在,请确保已添加颜色图层");
|
||||
return Promise.reject("颜色图层不存在");
|
||||
}
|
||||
@@ -1137,7 +1127,7 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
||||
});
|
||||
canvas.clear();
|
||||
const color = object.originColor;
|
||||
return {css, base64, color};
|
||||
return { css, base64, color };
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1145,11 +1135,11 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
||||
*/
|
||||
async exportPrintTrimsLayers() {
|
||||
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 objects = this.getObjectsByIdOrLayerId(ids);
|
||||
const fixedLayerObj = this.getFixedLayerObject();
|
||||
if(!fixedLayerObj) return Promise.reject("固定图层不存在");
|
||||
if (!fixedLayerObj) return Promise.reject("固定图层不存在");
|
||||
const flWidth = fixedLayerObj.width
|
||||
const flHeight = fixedLayerObj.height
|
||||
const flTop = fixedLayerObj.top
|
||||
@@ -1161,7 +1151,7 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
||||
objects.forEach((v, i) => {
|
||||
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 = {
|
||||
ifSingle: typeof v.fill === "string",
|
||||
level2Type: sourceData.level2Type,
|
||||
@@ -1173,7 +1163,7 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
||||
angle: v.angle,
|
||||
name: sourceData.name,
|
||||
priority: i + 1,
|
||||
object:{
|
||||
object: {
|
||||
top: 0,
|
||||
left: 0,
|
||||
scaleX: 0,//对象的缩放比例
|
||||
@@ -1192,8 +1182,8 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
||||
let top = (v.top - (flTop - flHeight * flScaleY / 2));
|
||||
let width = (v.width * v.scaleX);
|
||||
let height = (v.height * v.scaleY);
|
||||
if(v.originX === "center" && v.originY === "center") {
|
||||
let {x:cx, y:cy} = calculateTopLeftPoint(width, height, left, top, v.angle);
|
||||
if (v.originX === "center" && v.originY === "center") {
|
||||
let { x: cx, y: cy } = calculateTopLeftPoint(width, height, left, top, v.angle);
|
||||
left = cx;
|
||||
top = cy;
|
||||
}
|
||||
@@ -1205,18 +1195,18 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
||||
obj.object.left = oX;
|
||||
obj.object.scaleX = oScaleX;
|
||||
obj.object.scaleY = oScaleY;
|
||||
if(obj.ifSingle){
|
||||
if (obj.ifSingle) {
|
||||
// 单个的是从中心计算的
|
||||
let {x:cx, y:cy} = calculateCenterPoint(width, height, left, top, v.angle);
|
||||
let oX = (cx-width/2) / flScaleX;
|
||||
let oY = (cy-height/2) / flScaleY;
|
||||
let { x: cx, y: cy } = calculateCenterPoint(width, height, left, top, v.angle);
|
||||
let oX = (cx - width / 2) / flScaleX;
|
||||
let oY = (cy - height / 2) / flScaleY;
|
||||
obj.location = [oX, oY];
|
||||
obj.scale = [oScaleX, oScaleY];
|
||||
}else{
|
||||
} else {
|
||||
let fill = v.fill;
|
||||
let fill_ = v.fill_;
|
||||
if(!fill || !fill_) return console.warn("印花元素不存在fill或fill_属性");
|
||||
let {scale, angle} = getTransformScaleAngle(fill.patternTransform);
|
||||
if (!fill || !fill_) return console.warn("印花元素不存在fill或fill_属性");
|
||||
let { scale, angle } = getTransformScaleAngle(fill.patternTransform);
|
||||
let scaleX = scale * 5 * v.fill_.width / flWidth;
|
||||
let scaleY = scale * 5 * v.fill_.height / flHeight;
|
||||
let scaleXY = flWidth > flHeight ? scaleX : scaleY;
|
||||
@@ -1231,16 +1221,16 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
||||
obj.object.gapY = fill_.gapY;
|
||||
obj.object.fill_repeat = fill.repeat;
|
||||
}
|
||||
if(sourceData.type === "print"){
|
||||
if (sourceData.type === "print") {
|
||||
prints.push(obj);
|
||||
}else if(sourceData.type === "trims"){
|
||||
} else if (sourceData.type === "trims") {
|
||||
trims.push(obj);
|
||||
}
|
||||
})
|
||||
// prints.sort((a, b) => a.ifSingle ? 1 : -1);
|
||||
// prints.forEach((v, i) => v.priority = i + 1);
|
||||
// trims.forEach((v, i) => v.priority = i + 1);
|
||||
return {prints, trims};
|
||||
return { prints, trims };
|
||||
}
|
||||
|
||||
|
||||
@@ -1283,7 +1273,7 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
||||
// 排除颜色图层和特殊组图层
|
||||
const excludedLayers = [SpecialLayerId.COLOR, SpecialLayerId.SPECIAL_GROUP];
|
||||
this.layers.value.forEach((layer) => {
|
||||
if(excludedLayers.includes(layer.id)){
|
||||
if (excludedLayers.includes(layer.id)) {
|
||||
excludedLayers.push(...layer.children?.map((child) => child.id));
|
||||
}
|
||||
})
|
||||
@@ -1465,16 +1455,16 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
||||
}
|
||||
}
|
||||
/** 修复JSON数据中的ID丢失问题 */
|
||||
FixJsonIdLoss(json){
|
||||
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){
|
||||
if (!layer.fabricObjects?.[0]?.id && !layer.fabricObject?.id) {
|
||||
const obj = objects?.find((o) => o.layerId === layer.id);
|
||||
if(obj) {
|
||||
if (obj) {
|
||||
layer.fabricObjects = [{
|
||||
id: obj.id,
|
||||
type: obj.type,
|
||||
@@ -1491,11 +1481,11 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
||||
const excludedObjects = [SpecialLayerId.PART_SELECTOR];
|
||||
json.canvas.objects = objects.filter((v) => {
|
||||
// 指定ID排除
|
||||
if(excludedObjects.includes(v.id)) return false;
|
||||
if (excludedObjects.includes(v.id)) return false;
|
||||
|
||||
if(v.isBackground || v.isFixed) return true;
|
||||
if (v.isBackground || v.isFixed) return true;
|
||||
// 当前图层不存在当前对象
|
||||
if(!layerIds.includes(v.layerId)) return false;
|
||||
if (!layerIds.includes(v.layerId)) return false;
|
||||
return true
|
||||
});
|
||||
}
|
||||
@@ -1507,22 +1497,22 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
||||
*/
|
||||
async createOtherLayers(otherData) {
|
||||
if (!otherData) return console.warn("otherData 为空不需要添加");
|
||||
let resolve = ()=>{};
|
||||
this.awaitCanvasRun = ()=>(new Promise((v) => resolve = v))
|
||||
let resolve = () => { };
|
||||
this.awaitCanvasRun = () => (new Promise((v) => resolve = v))
|
||||
const otherData_ = JSON.parse(JSON.stringify(otherData));
|
||||
console.log("==========创建其他图层", otherData_);
|
||||
|
||||
// 删除颜色图层和特殊组图层
|
||||
const ids = [SpecialLayerId.COLOR, SpecialLayerId.SPECIAL_GROUP];
|
||||
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));
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
})
|
||||
this.canvas.getObjects().forEach((v) => {
|
||||
if(ids.includes(v.id) || ids.includes(v.layerId)){
|
||||
if (ids.includes(v.id) || ids.includes(v.layerId)) {
|
||||
this.canvas.remove(v)
|
||||
}
|
||||
})
|
||||
@@ -1536,18 +1526,18 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
||||
otherData_.printObject?.prints?.forEach((print, index) => {// 印花
|
||||
print.name = t("Canvas.Print") + (index + 1);
|
||||
print.type = "print";
|
||||
if(print.ifSingle){
|
||||
printTrimsLayers.unshift({...print});
|
||||
}else{
|
||||
singleLayers.unshift({...print});
|
||||
if (print.ifSingle) {
|
||||
printTrimsLayers.unshift({ ...print });
|
||||
} else {
|
||||
singleLayers.unshift({ ...print });
|
||||
}
|
||||
})
|
||||
otherData_.trims?.prints?.forEach((trims, index) => {// 元素
|
||||
trims.name = t("Canvas.Elements") + (index + 1);
|
||||
trims.type = "trims";
|
||||
printTrimsLayers.unshift({...trims});
|
||||
printTrimsLayers.unshift({ ...trims });
|
||||
})
|
||||
if(printTrimsLayers.length || singleLayers.length){
|
||||
if (printTrimsLayers.length || singleLayers.length) {
|
||||
await this.createPrintTrimsLayers(printTrimsLayers, singleLayers);
|
||||
}
|
||||
await this.changeCanvas();
|
||||
@@ -1556,10 +1546,30 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
||||
this.awaitCanvasRun = null;
|
||||
}
|
||||
|
||||
//设置印花元素颜色的裁剪信息
|
||||
async setSpecialCliptInfo(isColor = true, isGroup = true) {
|
||||
// 更新颜色层信息
|
||||
if (isColor) {
|
||||
const colorObject = this.getLayerObjectById(SpecialLayerId.COLOR);
|
||||
if (colorObject) {
|
||||
await this.setObjecCliptInfo(colorObject);
|
||||
}
|
||||
|
||||
}
|
||||
// 更新特殊组图层信息
|
||||
if (isGroup) {
|
||||
const groupLayer = this.layerManager.getLayerById(SpecialLayerId.SPECIAL_GROUP);
|
||||
if (groupLayer) {
|
||||
const groupRect = new fabric.Rect({});
|
||||
await this.setObjecCliptInfo(groupRect);
|
||||
groupLayer.clippingMask = groupRect.toObject();
|
||||
}
|
||||
}
|
||||
}
|
||||
// 设置画布对象的裁剪信息
|
||||
async setObjecCliptInfo(tagObject, data){
|
||||
async setObjecCliptInfo(tagObject, data) {
|
||||
const fixedLayerObj = this.getFixedLayerObject();
|
||||
if(!fixedLayerObj) return console.warn("固定图层为空");
|
||||
if (!fixedLayerObj) return console.warn("固定图层为空");
|
||||
tagObject.set({
|
||||
top: fixedLayerObj.top,
|
||||
left: fixedLayerObj.left,
|
||||
@@ -1572,7 +1582,7 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
||||
});
|
||||
var object = fixedLayerObj;
|
||||
const imageUrl = this.props.clothingImageUrl2;
|
||||
if(imageUrl){
|
||||
if (imageUrl) {
|
||||
object = await new Promise((resolve, reject) => {
|
||||
fabric.Image.fromURL(imageUrl, (imgObject) => {
|
||||
tagObject.set({
|
||||
@@ -1592,8 +1602,8 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
||||
});
|
||||
tagObject.set('clipPath', transparentMask);
|
||||
}
|
||||
async createColorLayer(color_){
|
||||
const color = color_ || {r:0,g:0,b:0,a:0};
|
||||
async createColorLayer(color_) {
|
||||
const color = color_ || { r: 0, g: 0, b: 0, a: 0 };
|
||||
// if(findLayer(this.layers.value, SpecialLayerId.COLOR)) {
|
||||
// return console.warn("画布中已存在颜色图层");
|
||||
// }
|
||||
@@ -1637,7 +1647,7 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
||||
}
|
||||
|
||||
// 创建印花和元素图层
|
||||
async createPrintTrimsLayers(printTrimsLayers, singleLayers){
|
||||
async createPrintTrimsLayers(printTrimsLayers, singleLayers) {
|
||||
// if(findLayer(this.layers.value, SpecialLayerId.SPECIAL_GROUP)) {
|
||||
// return console.warn("画布中已存在印花和元素组图层");
|
||||
// }
|
||||
@@ -1651,12 +1661,12 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
||||
const flScaleY = fixedLayerObj.scaleY
|
||||
const children = [];
|
||||
// 添加印花和元素图层
|
||||
for(let index = 0; index < printTrimsLayers.length; index++){
|
||||
for (let index = 0; index < printTrimsLayers.length; index++) {
|
||||
let item = printTrimsLayers[index];
|
||||
let id = generateId("layer_image_");
|
||||
let name = item.name;
|
||||
let image = await new Promise(resolve => {
|
||||
fabric.Image.fromURL(item.path, (fabricImage)=>{
|
||||
fabric.Image.fromURL(item.path, (fabricImage) => {
|
||||
resolve(fabricImage);
|
||||
}, { crossOrigin: "anonymous" });
|
||||
})
|
||||
@@ -1664,7 +1674,7 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
||||
let top = flTop - flHeight * flScaleY / 2 + (item.location?.[1] || 0) * flScaleY
|
||||
let scaleX = flWidth * (item.scale?.[0] || 1) / image.width * flScaleX
|
||||
let scaleY = flHeight * (item.scale?.[1] || 1) / image.height * flScaleY
|
||||
let {x, y} = calculateRotatedTopLeftDeg(
|
||||
let { x, y } = calculateRotatedTopLeftDeg(
|
||||
image.width * scaleX,
|
||||
image.height * scaleY,
|
||||
left,
|
||||
@@ -1679,11 +1689,11 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
||||
let flipY = false;
|
||||
let blendMode = BlendMode.NORMAL;
|
||||
// if(item.type === "trims") blendMode = BlendMode.NORMAL;// 元素正常
|
||||
if(item.object){
|
||||
if (item.object) {
|
||||
opacity = item.object.opacity
|
||||
flipX = item.object.flipX
|
||||
flipY = item.object.flipY
|
||||
if(item.object.blendMode) blendMode = item.object.blendMode;
|
||||
if (item.object.blendMode) blendMode = item.object.blendMode;
|
||||
}
|
||||
image.set({
|
||||
left: x,
|
||||
@@ -1714,18 +1724,18 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
||||
isPrintTrims: true,
|
||||
blendMode: blendMode,
|
||||
fabricObjects: [image.toObject(["id", "layerId", "layerName"])],
|
||||
metadata: {sourceData: item},
|
||||
metadata: { sourceData: item },
|
||||
object: image,
|
||||
})
|
||||
children.push(layer);
|
||||
};
|
||||
// 添加平铺图层
|
||||
for(let index = 0; index < singleLayers.length; index++){
|
||||
for (let index = 0; index < singleLayers.length; index++) {
|
||||
let item = singleLayers[index];
|
||||
let id = generateId("layer_image_");
|
||||
let name = item.name;
|
||||
let image = await new Promise(resolve => {
|
||||
fabric.Image.fromURL(item.path, (fabricImage)=>{
|
||||
fabric.Image.fromURL(item.path, (fabricImage) => {
|
||||
const imgElement = fabricImage.getElement();
|
||||
const tcanvas = document.createElement('canvas');
|
||||
tcanvas.width = imgElement.width;
|
||||
@@ -1754,7 +1764,7 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
||||
let flipY = false;
|
||||
let blendMode = BlendMode.NORMAL;
|
||||
let fill_repeat = "repeat"
|
||||
if(item.object){
|
||||
if (item.object) {
|
||||
top += item.object.top * flScaleY
|
||||
left += item.object.left * flScaleX
|
||||
scaleX *= item.object.scaleX
|
||||
@@ -1763,11 +1773,11 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
||||
angle = item.object.angle
|
||||
flipX = item.object.flipX
|
||||
flipY = item.object.flipY
|
||||
if(item.object.blendMode) blendMode = item.object.blendMode;
|
||||
if (item.object.blendMode) blendMode = item.object.blendMode;
|
||||
gapX = item.object.gapX
|
||||
gapY = item.object.gapY
|
||||
fillSource = imageAddGapToCanvas(image, gapX, gapY);
|
||||
if(item.object.fill_repeat) fill_repeat = item.object.fill_repeat;
|
||||
if (item.object.fill_repeat) fill_repeat = item.object.fill_repeat;
|
||||
}
|
||||
let rect = new fabric.Rect({
|
||||
id: id,
|
||||
@@ -1791,7 +1801,7 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
||||
offsetX: offsetX, // 水平偏移
|
||||
offsetY: offsetY, // 垂直偏移
|
||||
}),
|
||||
fill_ : {
|
||||
fill_: {
|
||||
source: item.path,
|
||||
gapX: gapX,
|
||||
gapY: gapY,
|
||||
@@ -1811,7 +1821,7 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
||||
isPrintTrims: true,
|
||||
blendMode: blendMode,
|
||||
fabricObjects: [rect.toObject(["id", "layerId", "layerName"])],
|
||||
metadata: {sourceData: item},
|
||||
metadata: { sourceData: item },
|
||||
object: rect,
|
||||
})
|
||||
children.push(layer);
|
||||
@@ -1828,9 +1838,9 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
||||
// })
|
||||
// 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){
|
||||
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 => {
|
||||
@@ -1858,21 +1868,21 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
||||
/**
|
||||
* 画布事件变更后
|
||||
*/
|
||||
async changeCanvas(fids = [], isBeforeChange = false){
|
||||
if(!isBeforeChange) this.canvasChangeing = false;
|
||||
async changeCanvas(fids = [], isBeforeChange = false) {
|
||||
if (!isBeforeChange) this.canvasChangeing = false;
|
||||
const fixedLayerObj = this.getFixedLayerObject();
|
||||
if(!fixedLayerObj) return console.warn("固定图层对象不存在", fixedLayerObj)
|
||||
if (!fixedLayerObj) return console.warn("固定图层对象不存在", fixedLayerObj)
|
||||
const colorObject = this.getLayerObjectById(SpecialLayerId.COLOR);
|
||||
if(colorObject){
|
||||
if (colorObject) {
|
||||
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);
|
||||
await this.setObjecCliptInfo(colorObject);
|
||||
this.canvas.renderAll();
|
||||
return;
|
||||
}
|
||||
const base64 = await this.exportManager.exportImage({layerIdArray2: ids, isEnhanceImg: true});
|
||||
if(!base64) return console.warn("导出图片失败", base64)
|
||||
const base64 = await this.exportManager.exportImage({ layerIdArray2: ids, isEnhanceImg: true });
|
||||
if (!base64) return console.warn("导出图片失败", base64)
|
||||
const canvas = await base64ToCanvas(base64, fixedLayerObj.scaleX * 2, true);
|
||||
const ctx = canvas.getContext('2d');
|
||||
const width = fixedLayerObj.width;
|
||||
@@ -1885,15 +1895,15 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
||||
}
|
||||
}
|
||||
/** 画布变更之前 */
|
||||
async beforeChangeCanvas(objects){
|
||||
if(this.canvasChangeing) return;
|
||||
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){
|
||||
if (ids.length > 0) {
|
||||
this.canvasChangeing = true;
|
||||
this.canvas.getObjects().forEach(v => {
|
||||
if(ids.includes(v.layerId)){
|
||||
if (ids.includes(v.layerId)) {
|
||||
v.globalCompositeOperation_ = v.globalCompositeOperation;
|
||||
v.globalCompositeOperation = BlendMode.NORMAL;
|
||||
}
|
||||
@@ -2103,13 +2113,13 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
||||
moveActiveObject(direction, step = 1) {
|
||||
const objects = [];
|
||||
const activeObject = this.canvas.getActiveObject();
|
||||
if(!activeObject) return;
|
||||
if (!activeObject) return;
|
||||
const initPos = {
|
||||
id: activeObject.id,
|
||||
left: activeObject.left,
|
||||
top: activeObject.top,
|
||||
};
|
||||
switch(direction) {
|
||||
switch (direction) {
|
||||
case "up":
|
||||
activeObject.top -= step;
|
||||
break;
|
||||
@@ -2123,7 +2133,7 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
|
||||
activeObject.left += step;
|
||||
break;
|
||||
}
|
||||
if(!activeObject.id) return this.canvas.renderAll();
|
||||
if (!activeObject.id) return this.canvas.renderAll();
|
||||
const cmd = new ObjectMoveCommand({
|
||||
canvas: this.canvas,
|
||||
initPos,
|
||||
|
||||
@@ -606,7 +606,9 @@ export class ExportManager {
|
||||
imageSmoothingEnabled: true,
|
||||
});
|
||||
// tempFabricCanvas.setZoom(1);
|
||||
console.log("==========", fixedLayerObject)
|
||||
const ox = fixedLayerObject.left - fixedLayerObject.width * fixedLayerObject.scaleX / 2
|
||||
const oy = fixedLayerObject.top - fixedLayerObject.height * fixedLayerObject.scaleY / 2
|
||||
// console.log("==========", fixedLayerObject, ox, oy)
|
||||
try {
|
||||
// 克隆并添加所有对象到临时画布,需要调整位置相对于固定图层
|
||||
for (let i = 0; i < objectsToExport.length; i++) {
|
||||
@@ -616,15 +618,20 @@ export class ExportManager {
|
||||
restoreOpacityInRedGreen && true
|
||||
);
|
||||
if (cloned) {
|
||||
let scaleX = cloned.scaleX / fixedLayerObject.scaleX
|
||||
let scaleY = cloned.scaleY / fixedLayerObject.scaleY
|
||||
let top = (cloned.top - oy) * scaleY
|
||||
let left = (cloned.left - ox) * scaleX
|
||||
if (cloned.originX === "center" && cloned.originY === "center") {
|
||||
top = canvasHeight / 2
|
||||
left = canvasWidth / 2
|
||||
}
|
||||
cloned.set({
|
||||
left: canvasWidth / 2,
|
||||
top: canvasHeight / 2,
|
||||
scaleX: cloned.scaleX / fixedLayerObject.scaleX,
|
||||
scaleY: cloned.scaleY / fixedLayerObject.scaleY,
|
||||
originX: "center",
|
||||
originY: "center",
|
||||
left: left,
|
||||
top: top,
|
||||
scaleX: scaleX,
|
||||
scaleY: scaleY,
|
||||
});
|
||||
console.log("==========", {...cloned})
|
||||
// 更新对象坐标
|
||||
cloned.setCoords();
|
||||
tempFabricCanvas.add(cloned);
|
||||
|
||||
@@ -133,11 +133,12 @@ export class RedGreenModeManager {
|
||||
this.canvas.on("mouse:up", (event) => {
|
||||
// 可以在这里添加更多逻辑,比如生成图片或更新状态
|
||||
nextTick(() => {
|
||||
requestIdleCallback(async () => {
|
||||
setTimeout(async () => {
|
||||
if (!this.isInitialized) {
|
||||
console.warn("红绿图模式未初始化,无法处理鼠标事件");
|
||||
return;
|
||||
}
|
||||
console.log("鼠标抬起事件触发", this.onImageGenerated);
|
||||
if (this.onImageGenerated) {
|
||||
const imageData = await this.canvasManager.exportImage({
|
||||
restoreOpacityInRedGreen: true, // 恢复红绿图模式下的透明度
|
||||
|
||||
@@ -37,7 +37,6 @@ export class ThumbnailManager {
|
||||
|
||||
// 延迟执行,避免阻塞UI
|
||||
fabricObjects.length > 0 &&
|
||||
requestIdleCallback(() => {
|
||||
setTimeout(async () => {
|
||||
const base64 = await this._generateLayerThumbnailNow(fabricObjects, layer);
|
||||
// this.layerThumbnails.set(layerId, base64);
|
||||
@@ -55,7 +54,6 @@ export class ThumbnailManager {
|
||||
console.error("生成图层缩略图时出错:", error);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -65,7 +63,7 @@ export class ThumbnailManager {
|
||||
generateAllLayerThumbnails(layers) {
|
||||
if (!layers || !Array.isArray(layers)) return;
|
||||
|
||||
requestIdleCallback(() => {
|
||||
setTimeout(() => {
|
||||
setTimeout(() => {
|
||||
layers.forEach((layer) => {
|
||||
if (layer && layer.id) {
|
||||
|
||||
@@ -180,7 +180,7 @@ export class CommandManager {
|
||||
this._recordPerformance("execute", command.constructor.name, duration);
|
||||
|
||||
// 通知状态变化
|
||||
this._notifyStateChange();
|
||||
this._notifyStateChange("execute");
|
||||
|
||||
console.log(`✅ 命令执行成功: ${command.constructor.name}`);
|
||||
return result;
|
||||
@@ -219,7 +219,7 @@ export class CommandManager {
|
||||
this._recordPerformance("undo", command.constructor.name, duration);
|
||||
|
||||
// 通知状态变化
|
||||
this._notifyStateChange();
|
||||
this._notifyStateChange("undo");
|
||||
|
||||
console.log(`✅ 命令撤销成功: ${command.constructor.name}`);
|
||||
return result;
|
||||
@@ -258,7 +258,7 @@ export class CommandManager {
|
||||
this._recordPerformance("redo", command.constructor.name, duration);
|
||||
|
||||
// 通知状态变化
|
||||
this._notifyStateChange();
|
||||
this._notifyStateChange("redo");
|
||||
|
||||
console.log(`✅ 命令重做成功: ${command.constructor.name}`);
|
||||
return result;
|
||||
@@ -298,7 +298,7 @@ export class CommandManager {
|
||||
|
||||
this.undoStack = [];
|
||||
this.redoStack = [];
|
||||
this._notifyStateChange();
|
||||
this._notifyStateChange("clear");
|
||||
// console.log("📝 命令历史已清空");
|
||||
}
|
||||
|
||||
@@ -417,10 +417,12 @@ export class CommandManager {
|
||||
* 通知状态变化
|
||||
* @private
|
||||
*/
|
||||
_notifyStateChange() {
|
||||
_notifyStateChange(type) {
|
||||
if (this.onStateChange) {
|
||||
try {
|
||||
this.onStateChange(this.getState());
|
||||
const obj = this.getState();
|
||||
obj.type = type;
|
||||
this.onStateChange(obj);
|
||||
} catch (error) {
|
||||
console.error("状态变化回调执行失败:", error);
|
||||
}
|
||||
|
||||
@@ -85,7 +85,7 @@ export class LiquifyRealTimeUpdater {
|
||||
|
||||
if (isDrawing && this.config.useDirectUpdate) {
|
||||
// 拖拽过程中使用快速更新(降低质量以提高性能)
|
||||
this._fastUpdate(imageData);
|
||||
await this._fastUpdate(imageData);
|
||||
} else {
|
||||
// 拖拽结束后使用完整更新(最高质量)
|
||||
await this._fullUpdate(imageData);
|
||||
@@ -124,7 +124,7 @@ export class LiquifyRealTimeUpdater {
|
||||
* @param {ImageData} imageData 图像数据
|
||||
* @private
|
||||
*/
|
||||
_fastUpdate(imageData) {
|
||||
async _fastUpdate(imageData) {
|
||||
if (!this.targetObject || !this.targetObject._element) {
|
||||
return;
|
||||
}
|
||||
@@ -138,12 +138,14 @@ export class LiquifyRealTimeUpdater {
|
||||
|
||||
// 直接更新fabric对象的图像源(使用PNG格式保持质量)
|
||||
const targetElement = this.targetObject._element;
|
||||
|
||||
// 方案1: 直接设置src属性(最高性能)
|
||||
const dataURL = this.tempCanvas.toDataURL("image/png", quality);
|
||||
|
||||
if (targetElement.src !== dataURL) {
|
||||
targetElement.src = dataURL;
|
||||
// targetElement.src = dataURL;
|
||||
const image = new Image();
|
||||
image.src = dataURL;
|
||||
await image.decode();
|
||||
this.targetObject.setElement(image);
|
||||
|
||||
// 关键优化:直接设置fabric对象为脏状态,但不立即渲染
|
||||
// this.targetObject.dirty = false; // 标记为不需要立即渲染
|
||||
@@ -153,7 +155,7 @@ export class LiquifyRealTimeUpdater {
|
||||
// 使用requestAnimationFrame进行批量渲染优化
|
||||
// if (!this.renderingScheduled && !this.config.skipRenderDuringDrag) {
|
||||
// this.renderingScheduled = true;
|
||||
// requestIdleCallback(() => {
|
||||
// setTimeout(() => {
|
||||
// this.canvas.renderAll();
|
||||
// this.renderingScheduled = false;
|
||||
// });
|
||||
|
||||
@@ -447,6 +447,7 @@
|
||||
</template>
|
||||
</CanvasEditor>
|
||||
</div>
|
||||
<img src="" alt="" id="canvas-test-dom">
|
||||
</div>
|
||||
</template>
|
||||
<style>
|
||||
@@ -458,6 +459,13 @@
|
||||
height: 600px !important;
|
||||
z-index: 99999999;
|
||||
}
|
||||
#canvas-test-dom{
|
||||
position: fixed;
|
||||
z-index: 9999999999;
|
||||
top: 0;
|
||||
left: 0;
|
||||
pointer-events: none;
|
||||
}
|
||||
</style>
|
||||
<style scoped lang="less">
|
||||
* {
|
||||
|
||||
@@ -163,7 +163,6 @@ export default defineComponent({
|
||||
const privewDetail = async (oldSelectDetail = detailData.selectDetail)=>{
|
||||
// if(!detailDom.editCanvas)return
|
||||
return new Promise(async (res,reject)=>{
|
||||
console.log(detailDom.editCanvas)
|
||||
await detailDom.editCanvas.exportImage({
|
||||
isContainFixed:true,
|
||||
width:props.sketchSize.width,
|
||||
@@ -245,17 +244,27 @@ export default defineComponent({
|
||||
|
||||
|
||||
const frontBackChange = async (value:any)=>{
|
||||
let front = detailData.frontBack.front[detailData.imgDomIndex]
|
||||
let back = detailData.frontBack.back[detailData.imgDomIndex]
|
||||
store.commit('DesignDetail/updataDetailItem',{maskUrl:value})
|
||||
await nextTick()
|
||||
if(!detailData.selectDetail.partialDesign.partialDesignPath && !detailData.selectDetail.partialDesign.partialDesignBase64){
|
||||
await privewDetail()
|
||||
}else{
|
||||
await detailDom.editCanvas.exportImage({
|
||||
isFrontBackUpdata: true,
|
||||
isContainFixed:true,
|
||||
width:props.sketchSize.width,
|
||||
height:props.sketchSize.height,
|
||||
}).then((rv)=>{
|
||||
if(detailData.selectDetail?.partialDesign)detailData.selectDetail.partialDesign.partialDesignBase64 = rv
|
||||
})
|
||||
}
|
||||
let full = detailData.selectDetail.partialDesign.partialDesignBase64 || detailData.selectDetail.partialDesign.partialDesignPath || detailData.selectDetail.path
|
||||
let size = {
|
||||
...detailData.canvasConfig,
|
||||
}
|
||||
store.commit('DesignDetail/updataDetailItem',{maskUrl:value})
|
||||
segmentImage(value,full,size).then(async (rv)=>{
|
||||
let front = detailData.frontBack.front[detailData.imgDomIndex]
|
||||
let back = detailData.frontBack.back[detailData.imgDomIndex]
|
||||
if(!front?.oldImageUrl)front.oldImageUrl = front.imageUrl
|
||||
if(!front?.oldMaskUrl)front.oldMaskUrl = front.maskUrl
|
||||
if(!back?.oldImageUrl)back.oldImageUrl = back.imageUrl
|
||||
@@ -267,7 +276,6 @@ export default defineComponent({
|
||||
back.imageUrl = rv.targetBackUrl
|
||||
// store.commit('DesignDetail/updataDetailItem',{maskUrl:value})
|
||||
})
|
||||
|
||||
}
|
||||
const editSketchCanvasInit = async (value:any)=>{
|
||||
detailData.canvasInstance = value
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
<div class="upload_item">
|
||||
<div class="upload_file_item upload_component">
|
||||
<a-upload
|
||||
:action="uploadUrl + (upLoadHttpsUrl?upLoadHttpsUrl:'/api/element/upload')"
|
||||
:action="uploadUrl + (upLoadHttpsUrl?upLoadHttpsUrl:'/aida/api/element/upload')"
|
||||
list-type="picture-card"
|
||||
:capture="null"
|
||||
:multiple="true"
|
||||
|
||||
@@ -233,10 +233,10 @@ export default defineComponent({
|
||||
let sketchH = editPrintElementData.sketchWH.height * editPrintElementData.sketchWH.scale[1]
|
||||
let x = sketchW / 2 - (sketchW * (width / editPrintElementData.sketchWH.width)/2)
|
||||
let y = sketchH / 2 -(sketchH * height/2)
|
||||
if(editPrintElementData.stateOverallSingle !== 'single'){
|
||||
x = sketchW / 2
|
||||
y = sketchH / 2
|
||||
}
|
||||
// if(editPrintElementData.stateOverallSingle !== 'single'){
|
||||
// x = sketchW / 2
|
||||
// y = sketchH / 2
|
||||
// }
|
||||
let location = [x,y]
|
||||
resolve({scale,location})
|
||||
}
|
||||
@@ -393,8 +393,8 @@ export default defineComponent({
|
||||
angle: 0,
|
||||
flipX: false,
|
||||
flipY: false,
|
||||
// blendMode: "multiply",
|
||||
blendMode: "source-over",
|
||||
blendMode: "multiply",
|
||||
// blendMode: "source-over",
|
||||
gapX: 0,
|
||||
gapY: 0,
|
||||
}
|
||||
|
||||
@@ -189,11 +189,11 @@ export default defineComponent({
|
||||
}
|
||||
return { scaleX, scaleY, rotate };
|
||||
}
|
||||
const initMoveableForSelected = () => {
|
||||
const initMoveableForSelected = async (isDestroy:boolean = false) => {
|
||||
// 销毁旧的实例
|
||||
if(selectItem.imgDomIndex == -1)return
|
||||
if (moveableInstance.value) {
|
||||
moveableInstance.value.destroy();
|
||||
if (moveableInstance?.value?.destroy && !isDestroy) {
|
||||
moveableInstance?.value?.destroy();
|
||||
}
|
||||
|
||||
const selectedEl = elementRefs.value[selectItem.imgDomIndex];
|
||||
@@ -509,7 +509,7 @@ export default defineComponent({
|
||||
watch(()=>detailData.frontBack.front.length,(newValue,oldValue)=>{
|
||||
if(selectItem.selectDetail?.id)selectItem.imgDomIndex = detailData.frontBack.front.findIndex((item:any)=>item.id == selectItem.selectDetail?.id)
|
||||
setTimeout(()=>{
|
||||
initMoveableForSelected()
|
||||
initMoveableForSelected(oldValue == 0)
|
||||
},100)
|
||||
})
|
||||
const setRevocation = async ()=>{
|
||||
|
||||
@@ -21,7 +21,11 @@
|
||||
{{ $t("event.detail") }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal_title_text content" v-for="item in eventsDetail.textList">
|
||||
<div
|
||||
class="modal_title_text content"
|
||||
v-for="item in eventsDetail.textList"
|
||||
:class="{ award: eventsDetail.id === 3 }"
|
||||
>
|
||||
<div class="eventsDetail_content_right_btn_box">
|
||||
<div
|
||||
class="eventsDetail_content_right_btn"
|
||||
@@ -43,6 +47,7 @@
|
||||
v-detailText="introItem.text"
|
||||
></div>
|
||||
</div>
|
||||
<div class="tips" v-if="eventsDetail.tips">{{ eventsDetail.tips }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -120,8 +125,13 @@ export default defineComponent({
|
||||
})
|
||||
}
|
||||
const openDetail = () => {
|
||||
let language = locale.value === "ENGLISH" ? "en" : "zh"
|
||||
let language = locale.value === "ENGLISH" ? "en" : "cn"
|
||||
let url = `https://aida-global-design-awards.com.hk/${language}`
|
||||
// 如果是dev环境把域名换成http://192.168.31.198
|
||||
|
||||
if (import.meta.env.VITE_APP_BASE_URL === "https://develop.api.aida.com.hk") {
|
||||
url += "?env=dev"
|
||||
}
|
||||
window.open(url, "_blank")
|
||||
|
||||
// router.push("/award/index")
|
||||
@@ -233,7 +243,7 @@ export default defineComponent({
|
||||
}
|
||||
.eventsDetail_content_right {
|
||||
.modal_title_text {
|
||||
letter-spacing: 0.4rem;
|
||||
letter-spacing: 0.3rem;
|
||||
font-weight: 600;
|
||||
&-header {
|
||||
display: flex;
|
||||
@@ -265,18 +275,21 @@ export default defineComponent({
|
||||
.eventsDetail_content_right_btn_box {
|
||||
display: flex;
|
||||
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 {
|
||||
content: "";
|
||||
display: block;
|
||||
border-top: 3px solid;
|
||||
height: 6rem;
|
||||
}
|
||||
.modal_title_text.award:last-child:after {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -293,4 +306,13 @@ export default defineComponent({
|
||||
white-space: nowrap;
|
||||
cursor: pointer;
|
||||
}
|
||||
.tips{
|
||||
color: rgba(0, 0, 0, 0.45);
|
||||
font-size: var(--aida-fsize1-4);
|
||||
font-weight: 400;
|
||||
letter-spacing: 0.3rem;
|
||||
}
|
||||
.modal_title_text.content.award{
|
||||
line-height: 1.3;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -63,7 +63,7 @@
|
||||
<a-upload
|
||||
class="search_upImg"
|
||||
:capture="null"
|
||||
:action="uploadUrl + '/api/element/upload'"
|
||||
:action="uploadUrl + '/aida/api/element/upload'"
|
||||
list-type="picture-card"
|
||||
:data="{
|
||||
...upload
|
||||
@@ -161,7 +161,7 @@
|
||||
<a-upload
|
||||
class="search_upImg"
|
||||
:capture="null"
|
||||
:action="uploadUrl + '/api/element/upload'"
|
||||
:action="uploadUrl + '/aida/api/element/upload'"
|
||||
list-type="picture-card"
|
||||
:data="{
|
||||
...upload
|
||||
@@ -531,7 +531,7 @@ export default defineComponent({
|
||||
}
|
||||
)
|
||||
const setSpeed = (item: any) => {
|
||||
speed.speedData = item
|
||||
speed.speedData = {...item}
|
||||
}
|
||||
onMounted(() => {
|
||||
if (props.msg == 'Sketchboard') {
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
<div class="upload_file_item upload_component" v-show="fileList.length < 15">
|
||||
<a-upload
|
||||
:capture="null"
|
||||
:action="uploadUrl + '/api/element/upload'"
|
||||
:action="uploadUrl + '/aida/api/element/upload'"
|
||||
list-type="picture-card"
|
||||
:data="{
|
||||
...upload
|
||||
|
||||