335 Commits

Author SHA1 Message Date
X1627315083@163.com
ae1d7245f4 Merge remote-tracking branch 'origin/dev_vite' into research 2026-04-08 09:25:56 +08:00
bb021ae9ac style: 文案修改 2026-03-25 10:12:45 +08:00
bfb4e128f5 Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite 2026-03-25 09:48:39 +08:00
2f9b33e4ca feat: transaction分页器显示总数据数量 2026-03-25 09:48:36 +08:00
X1627315083@163.com
48c37e0810 风格字段全部处理空情况 2026-03-23 17:22:57 +08:00
b869a82fae Merge branch 'StableVersion' of ssh://18.167.251.121:10002/aidlab/aida_front into StableVersion 2026-03-23 14:08:42 +08:00
e61a8e372d feat: Transaction Record页面totalamount改为所有数据总数 2026-03-23 13:59:17 +08:00
X1627315083@163.com
f5a74991c9 fix 2026-03-23 11:57:10 +08:00
X1627315083@163.com
e58e8540c9 fix 2026-03-23 10:41:16 +08:00
e75ed7684e Merge branch 'StableVersion' into dev_vite 2026-03-13 14:05:39 +08:00
918d71072b bugfix: 首尾帧模式上传图片转视频 2026-03-13 14:01:44 +08:00
X1627315083@163.com
242bc7a01d fix 2026-03-06 18:44:48 +08:00
X1627315083@163.com
02ad8a340a 用户身份默认值改为1 2026-03-05 17:33:50 +08:00
X1627315083@163.com
0c250a21b4 Merge remote-tracking branch 'origin/StableVersion' into dev_vite 2026-03-05 10:58:10 +08:00
X1627315083@163.com
f781060e7b fix 2026-03-05 10:55:54 +08:00
李志鹏
832c9101ab Merge branch 'StableVersion' of http://18.167.251.121:10003/aidlab/aida_front into StableVersion 2026-03-02 11:28:42 +08:00
李志鹏
c48e836f8e fix 2026-03-02 11:28:39 +08:00
李志鹏
6f0780ac2e Merge branch 'dev_vite' of http://18.167.251.121:10003/aidlab/aida_front into dev_vite 2026-03-02 11:24:06 +08:00
李志鹏
5acb91e584 fix 2026-03-02 11:24:05 +08:00
X1627315083@163.com
f66ba9e6fa 修复design过程中切换其他页面在切换回来后like异常 2026-03-02 09:50:32 +08:00
7a90cb8db9 feat: 隐藏竞赛活动入口 2026-02-25 15:02:47 +08:00
dafe87fad8 feat: 竞赛页面活动页 2026-02-25 15:01:40 +08:00
c44747e2c2 feat: 竞赛页面地址 2026-02-25 14:48:47 +08:00
X1627315083@163.com
341c765c73 修复getMoudel后直接打开detail印花衣服没有类型我呢提 2026-02-25 13:36:49 +08:00
X1627315083@163.com
ed6cc294a5 注册页面可以根据输入的地址设置不同的语言 2026-02-24 17:27:13 +08:00
X1627315083@163.com
a77dc718f9 fix 2026-02-24 11:30:02 +08:00
X1627315083@163.com
86953a91a1 fix 2026-02-24 11:28:18 +08:00
X1627315083@163.com
b8f38db351 overall印花scale为字符串时候使用toFixed会报错 2026-02-24 11:27:43 +08:00
cabbb653bd Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite 2026-02-09 14:35:33 +08:00
99533c12b6 bugfix: 竞赛表单验证码输入 2026-02-09 11:52:31 +08:00
X1627315083@163.com
7fb7ffaced fix 2026-02-06 16:47:45 +08:00
X1627315083@163.com
59da67e4b4 Merge remote-tracking branch 'origin/StableVersion' into dev_vite 2026-02-06 16:46:37 +08:00
X1627315083@163.com
1428f191dd fix 2026-02-06 14:17:46 +08:00
李志鹏
13024cdd99 画布loading 2026-02-06 13:07:06 +08:00
李志鹏
fd85ea02c1 画布loading 2026-02-06 13:05:19 +08:00
李志鹏
c196ab6678 Merge branch 'dev_vite' of http://18.167.251.121:10003/aidlab/aida_front into dev_vite 2026-02-06 11:11:06 +08:00
李志鹏
c005b85c06 设置画布loading 2026-02-06 11:11:04 +08:00
李志鹏
b50dbbc246 去掉部件选取 2026-02-06 10:36:31 +08:00
X1627315083@163.com
01d09f4c34 修复overall印花和画布中印花scale不同 2026-02-05 17:38:27 +08:00
X1627315083@163.com
79c9a66296 Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite 2026-02-05 16:49:50 +08:00
X1627315083@163.com
761b1b3512 Merge remote-tracking branch 'origin/StableVersion' into dev_vite 2026-02-05 16:49:47 +08:00
X1627315083@163.com
b2cb7378d6 修复overall模式角度设置不上 2026-02-05 16:41:56 +08:00
4d9ea75146 chore: i18n内容 2026-02-05 16:30:24 +08:00
f7e6926ee9 bugfix: events i18n 2026-02-05 16:25:12 +08:00
7aba4e30c9 Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite 2026-02-05 10:33:47 +08:00
dc1ab330cf AiDA跳转竞赛页面 2026-02-05 10:33:42 +08:00
李志鹏
18c70fe6a3 1 2026-02-05 10:32:56 +08:00
李志鹏
5c746aca4d fix 2026-02-05 10:27:53 +08:00
李志鹏
72c4898101 部件选取框选工具合并操作 2026-02-05 10:26:40 +08:00
X1627315083@163.com
a905971dae 测试 2026-02-05 10:16:52 +08:00
69643dbc83 chore: prettier配置 2026-02-05 10:07:39 +08:00
f3a707d6d8 feat: 上传过程中不允许删除文件 2026-02-05 10:07:30 +08:00
8f4a43db14 feat: size改为form内 2026-02-04 17:30:09 +08:00
186a158114 chore: 中文版竞赛海报 2026-02-04 17:27:20 +08:00
3da4a97400 bugfix: i18n问题 2026-02-04 16:10:10 +08:00
X1627315083@163.com
96b3636aea 取消3d 拼贴功能 2026-02-04 15:59:45 +08:00
228e3d56b5 bugfix: 参赛表单i18n 2026-02-04 13:50:55 +08:00
99ea7eedc7 bugfix: award参赛表单 2026-02-04 13:39:13 +08:00
d4fb435db9 feat: 参赛表单页面i18n 2026-02-04 13:33:05 +08:00
0c8b3ee8f1 Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite 2026-02-04 10:57:30 +08:00
ca782d0aff feat: 竞赛主页中文 2026-02-04 10:57:25 +08:00
X1627315083
3dfb607b91 Merge remote-tracking branch 'origin/dev_vite' into StableVersion 2026-02-03 15:29:37 +08:00
X1627315083
981b4dad5c fix 2026-02-03 15:29:07 +08:00
X1627315083
181e6a87b8 Merge remote-tracking branch 'origin/dev_vite' into StableVersion 2026-02-03 10:46:09 +08:00
287825b4bf Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite 2026-02-02 17:18:17 +08:00
1ffc303721 feat: 竞赛页面AiDA入口 2026-02-02 17:00:32 +08:00
李志鹏
bdf1bb2669 Merge branch 'dev_vite' of http://18.167.251.121:10003/aidlab/aida_front into dev_vite 2026-02-02 16:52:11 +08:00
李志鹏
1fe79ffcf9 fix 2026-02-02 16:52:10 +08:00
758f63615a style: 字体大小 2026-02-02 16:13:01 +08:00
20145742c5 style: timeline布局修改 2026-02-02 15:48:50 +08:00
8ec9b1bcea Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite 2026-02-02 14:09:43 +08:00
a9cb6e16e9 style: select样式 2026-02-02 14:09:28 +08:00
X1627315083
5690fc6c5b fix 2026-02-02 13:55:12 +08:00
X1627315083
9db6a589f0 Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite 2026-02-02 13:48:09 +08:00
X1627315083
896490e57b fix 2026-02-02 13:48:07 +08:00
fca04ba44b Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite 2026-02-02 13:41:56 +08:00
25e4fc06c6 style: 样式修改 2026-02-02 13:41:51 +08:00
X1627315083
4bd7740753 修复detail添加印花sort值设置不对 2026-02-02 13:30:43 +08:00
X1627315083
c428bfd93b Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite 2026-02-02 11:48:12 +08:00
X1627315083
2a29c6b2cc fix 2026-02-02 11:48:10 +08:00
李志鹏
e9d7203804 Merge branch 'dev_vite' of http://18.167.251.121:10003/aidlab/aida_front into dev_vite 2026-02-02 11:33:38 +08:00
李志鹏
5d7cec520b 平铺默认参数 2026-02-02 11:33:36 +08:00
X1627315083
fe72df0c07 fix 2026-02-02 11:30:26 +08:00
X1627315083
7c04332290 Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite 2026-02-02 11:08:22 +08:00
X1627315083
73d912d3cd detail设置印花顺序相关问题 2026-02-02 11:08:20 +08:00
李志鹏
b320294764 Merge branch 'dev_vite' of http://18.167.251.121:10003/aidlab/aida_front into dev_vite 2026-02-02 10:37:14 +08:00
李志鹏
4913d02c93 fix 2026-02-02 10:37:13 +08:00
X1627315083
56916c8d10 fix 2026-02-02 10:31:37 +08:00
李志鹏
393a06eceb Merge branch 'dev_vite' of http://18.167.251.121:10003/aidlab/aida_front into dev_vite 2026-02-02 09:47:13 +08:00
李志鹏
fdb6a87ab4 添加印花元素排序priority 2026-02-02 09:47:10 +08:00
6d868c7c7a Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite 2026-01-30 17:21:15 +08:00
89a89ea5ef style: 竞赛主页样式修改 2026-01-30 17:21:11 +08:00
李志鹏
811e179889 fix 2026-01-30 14:52:10 +08:00
李志鹏
0e0eed2566 fix 2026-01-30 14:12:17 +08:00
李志鹏
8588c74ffd 图层可以持续粘贴 2026-01-30 13:54:21 +08:00
李志鹏
62e7f34c98 画布问题更改 2026-01-30 13:47:38 +08:00
李志鹏
8f0a56965f Merge branch 'dev_vite' of http://18.167.251.121:10003/aidlab/aida_front into dev_vite 2026-01-29 17:17:26 +08:00
李志鹏
59422e54d8 fix 2026-01-29 17:16:31 +08:00
X1627315083
012f0ef1b5 修复画布打开发布后仍然可以对画布里面复制内容 2026-01-29 16:55:38 +08:00
X1627315083
ec4ae4a259 画布打开发布界面复制不能再把图片元素复制到画布上 2026-01-29 15:43:27 +08:00
X1627315083
8da66d54c0 Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite 2026-01-29 14:10:57 +08:00
X1627315083
2839953d8e 添加印花默认不正片叠底 2026-01-29 14:10:55 +08:00
X1627315083
2d5d1b7a5e 删除衣服时候imgDom要随着变化 2026-01-29 09:55:15 +08:00
李志鹏
33aaf0b600 Merge branch 'dev_vite' of http://18.167.251.121:10003/aidlab/aida_front into dev_vite 2026-01-29 09:38:36 +08:00
李志鹏
bf4d7bdba8 打开服装选取功能 2026-01-29 09:38:33 +08:00
X1627315083
944071201d 修复detail黑色颜色bug 2026-01-28 17:11:28 +08:00
X1627315083
f6556ec9a9 fix 2026-01-28 17:10:58 +08:00
X1627315083
8967439d4e Merge remote-tracking branch 'origin/StableVersion' into dev_vite 2026-01-28 16:35:58 +08:00
X1627315083
85ae158952 fix 2026-01-28 16:35:40 +08:00
X1627315083
813d2e9645 Merge remote-tracking branch 'origin/StableVersion' into dev_vite 2026-01-28 16:12:36 +08:00
X1627315083
d94ade6641 fix 2026-01-28 16:11:55 +08:00
X1627315083
eda893ce10 fix 2026-01-28 15:20:02 +08:00
X1627315083
c8cb2de9ab Merge branch 'StableVersion' of ssh://18.167.251.121:10002/aidlab/aida_front into StableVersion 2026-01-28 14:24:23 +08:00
X1627315083
7cda2cce27 调整画布遮罩修改了及时更新 2026-01-28 14:23:31 +08:00
41893cab86 Merge branch 'StableVersion' of ssh://18.167.251.121:10002/aidlab/aida_front into StableVersion 2026-01-28 10:14:31 +08:00
b23531f18b Merge branch 'dev_vite' into StableVersion 2026-01-28 10:11:07 +08:00
de78bfc051 Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite 2026-01-28 10:09:48 +08:00
李志鹏
0a507fb158 部件选取icon大小 2026-01-28 10:08:36 +08:00
X1627315083
a18dead4ff fix 2026-01-28 10:05:08 +08:00
X1627315083
76047b763d 修复detail新增衣服报错 2026-01-28 09:32:52 +08:00
0930e8cc77 bugfix: 教育管理员搜索用户 2026-01-27 17:34:25 +08:00
X1627315083
9f09a2f31b fix 2026-01-27 14:18:14 +08:00
X1627315083
1e0bf83d12 fix 2026-01-27 14:18:00 +08:00
李志鹏
1764e2a0bf fix 2026-01-27 13:30:11 +08:00
李志鹏
0729917a7e 打开部件选取 2026-01-27 11:20:56 +08:00
李志鹏
b7f7aea0b7 Merge branch 'StableVersion' of http://18.167.251.121:10003/aidlab/aida_front into StableVersion 2026-01-27 11:01:35 +08:00
李志鹏
4dfa9433fd 画布 部件选取、印花禁用多选 2026-01-27 11:01:33 +08:00
李志鹏
79293901b3 多选解决 2026-01-27 10:58:27 +08:00
X1627315083
03a9e2f52c fix 2026-01-27 10:15:20 +08:00
X1627315083
fb1d09d98e 修改注册输入验证码最小高度 2026-01-27 10:12:13 +08:00
李志鹏
8ff7a31e92 部件选取多语言 2026-01-26 17:07:06 +08:00
李志鹏
65323febee Merge branch 'StableVersion' of http://18.167.251.121:10003/aidlab/aida_front into StableVersion 2026-01-26 16:47:09 +08:00
李志鹏
b158341d6e 印花组禁止多选 2026-01-26 16:47:03 +08:00
李志鹏
44674b5396 Merge branch 'dev_vite' of http://18.167.251.121:10003/aidlab/aida_front into dev_vite 2026-01-26 16:16:42 +08:00
李志鹏
9cecbdcf9b 部件选取 2026-01-26 16:16:40 +08:00
X1627315083
a6b0a60eb6 调整编辑按钮样式 2026-01-26 15:11:03 +08:00
X1627315083
68067aa777 Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite 2026-01-26 15:07:19 +08:00
X1627315083
ca6fe65dd8 detail等比缩放 2026-01-26 15:07:16 +08:00
564e179082 feat: 表单过期 2026-01-26 13:26:46 +08:00
dc469add22 Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite 2026-01-26 12:27:59 +08:00
d54e656192 style: award主页动画 2026-01-26 12:27:55 +08:00
李志鹏
ba49b02ebe 印花组不让多选 2026-01-26 09:40:38 +08:00
X1627315083
06fa763f26 Merge remote-tracking branch 'origin/dev_vite' into StableVersion 2026-01-24 13:26:06 +08:00
X1627315083
6ad81a1896 修复detail角度和镜像问题 2026-01-24 13:25:40 +08:00
X1627315083
9b0ec12738 Merge remote-tracking branch 'origin/dev_vite' into StableVersion 2026-01-24 11:56:10 +08:00
X1627315083
26abb2aa88 修复颜色bug 2026-01-24 11:55:51 +08:00
X1627315083
07b7a6f1d7 FIX 2026-01-23 22:31:51 +08:00
bff3ea8459 Merge branch 'StableVersion' of ssh://18.167.251.121:10002/aidlab/aida_front into StableVersion 2026-01-23 21:44:21 +08:00
29e68757a6 Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite 2026-01-23 21:43:51 +08:00
12ea0f7c35 feat: 试用期5天改为7天 2026-01-23 21:43:48 +08:00
X1627315083
920d01a972 调整维护时间 2026-01-23 21:42:43 +08:00
X1627315083
13b4767992 fix 2026-01-23 19:46:34 +08:00
X1627315083
086481bfb9 Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite 2026-01-23 18:33:06 +08:00
X1627315083
89bdba45be fix 2026-01-23 18:33:04 +08:00
李志鹏
8d0b792fd4 Merge branch 'dev_vite' of http://18.167.251.121:10003/aidlab/aida_front into dev_vite 2026-01-23 17:54:32 +08:00
李志鹏
a6bfca3b2f 111 2026-01-23 17:54:24 +08:00
X1627315083
a1b51d5807 Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite 2026-01-23 17:52:58 +08:00
X1627315083
2f32cee502 fix 2026-01-23 17:52:55 +08:00
李志鹏
a05655da1c 111 2026-01-23 17:50:33 +08:00
李志鹏
6cdc8c5486 111 2026-01-23 17:43:15 +08:00
X1627315083
972743d3b8 fix 2026-01-23 16:58:03 +08:00
X1627315083
df5cb918a2 调整detail前后对比大小 2026-01-23 16:06:47 +08:00
X1627315083
bc8ce0bd47 fix 2026-01-23 15:57:40 +08:00
李志鹏
4afe1b637e Merge branch 'dev_vite' of http://18.167.251.121:10003/aidlab/aida_front into dev_vite 2026-01-23 15:41:45 +08:00
李志鹏
55ede508cb 111 2026-01-23 15:41:43 +08:00
X1627315083
fbb66fd192 fix 2026-01-23 15:31:24 +08:00
X1627315083
c87b41ae11 Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite 2026-01-23 15:25:36 +08:00
X1627315083
142c24a947 fix 2026-01-23 15:25:34 +08:00
李志鹏
2ee200e1ba Merge branch 'dev_vite' of http://18.167.251.121:10003/aidlab/aida_front into dev_vite 2026-01-23 15:24:42 +08:00
李志鹏
86db2f22a1 同步印花的缩放偏移显示 2026-01-23 15:24:39 +08:00
X1627315083
9cc012b851 修复detail相关bug 2026-01-23 14:43:19 +08:00
X1627315083
c5b7365977 调整部署日期修复detail印花累加问题 2026-01-23 13:34:28 +08:00
X1627315083
43464ae85e fix 2026-01-22 16:00:45 +08:00
X1627315083
39c85cd1d1 Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite 2026-01-22 15:40:31 +08:00
X1627315083
3c77c97532 fix 2026-01-22 15:40:28 +08:00
李志鹏
2ab23d0f30 印花元素分类 2026-01-22 15:23:15 +08:00
X1627315083
85d4569a25 Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite 2026-01-22 14:30:42 +08:00
X1627315083
cd7d572e43 更新首次打开detail 应该使用接口数据而不是new数据 2026-01-22 14:30:40 +08:00
37157ca94d bugfix: 文件路径 2026-01-22 14:19:50 +08:00
a30897a4b2 Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite 2026-01-22 14:08:03 +08:00
9a62d277f2 feat: 上传文件Url 2026-01-22 14:07:56 +08:00
李志鹏
0de5fe276a Merge branch 'dev_vite' of http://18.167.251.121:10003/aidlab/aida_front into dev_vite 2026-01-22 13:46:57 +08:00
李志鹏
ca17956135 111 2026-01-22 13:46:55 +08:00
028c6a6540 Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite 2026-01-22 13:34:44 +08:00
9d8c3155e6 feat: 表单回显时禁止操作 2026-01-22 13:34:38 +08:00
李志鹏
6c921730ef 背景报错 2026-01-22 13:17:11 +08:00
李志鹏
eaa94edfac Merge branch 'dev_vite' of http://18.167.251.121:10003/aidlab/aida_front into dev_vite 2026-01-22 11:19:14 +08:00
李志鹏
1b30a7a873 更改画布标题 2026-01-22 11:19:12 +08:00
X1627315083
59399d672f fix 2026-01-22 10:48:42 +08:00
X1627315083
bb5c319a7f 修复detail打开画布直接提交数据没有正确更新 2026-01-22 10:29:58 +08:00
X1627315083
b114d352f6 修复detail印花界面打开花不修改元素preview后没有同步元素数据 2026-01-22 09:51:57 +08:00
李志鹏
ea4b27776a 11 2026-01-21 17:15:56 +08:00
李志鹏
faa6db9c73 Merge branch 'dev_vite' of http://18.167.251.121:10003/aidlab/aida_front into dev_vite 2026-01-21 16:55:18 +08:00
李志鹏
6b5c2c0b2e fix 2026-01-21 16:55:16 +08:00
X1627315083
de3cb37bc1 fix 2026-01-21 16:54:40 +08:00
X1627315083
9a69450fb6 Merge remote-tracking branch 'origin/StableVersion' into dev_vite 2026-01-21 16:54:22 +08:00
X1627315083
513eac9e49 fix 2026-01-21 16:46:51 +08:00
李志鹏
8c4f4c206b 111 2026-01-21 16:38:10 +08:00
李志鹏
c731df2ae7 Merge branch 'StableVersion' of http://18.167.251.121:10003/aidlab/aida_front into StableVersion 2026-01-21 16:31:09 +08:00
李志鹏
40c9bb1190 json修复 2026-01-21 16:31:07 +08:00
X1627315083
ef1c1c349d 画布图片数据递归设置minio地址 2026-01-21 16:27:59 +08:00
1c49dc25b1 feat: 回显表单 2026-01-21 16:24:56 +08:00
542583efc6 Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite 2026-01-21 15:29:38 +08:00
f8f5b98854 feat: 上传文件接口&表单成功提交页面 2026-01-21 15:29:34 +08:00
李志鹏
39a65add7c Merge branch 'dev_vite' of http://18.167.251.121:10003/aidlab/aida_front into dev_vite 2026-01-21 15:05:14 +08:00
李志鹏
0feade1f5b 111 2026-01-21 15:05:12 +08:00
X1627315083
5d45eee7a3 修复直接在印花preview后印花overall丢失 2026-01-21 14:45:39 +08:00
李志鹏
d31a809fa8 Merge branch 'dev_vite' of http://18.167.251.121:10003/aidlab/aida_front into dev_vite 2026-01-21 13:37:52 +08:00
李志鹏
750d90ee0b 瞎改 2026-01-21 13:37:50 +08:00
X1627315083
70537847bc 修复detail撤回存储数据过大问题 2026-01-21 11:55:43 +08:00
X1627315083
4688f234d9 修复印花编辑界面重复对画布上添加 2026-01-21 10:38:03 +08:00
X1627315083
5599edfcd0 Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite 2026-01-21 10:09:31 +08:00
X1627315083
73c2d1d41e fix 2026-01-21 10:09:29 +08:00
李志鹏
2fad680490 Merge branch 'dev_vite' of http://18.167.251.121:10003/aidlab/aida_front into dev_vite 2026-01-21 10:06:13 +08:00
李志鹏
85da122590 平铺按钮位置调整 2026-01-21 10:06:11 +08:00
X1627315083
62e977c703 修复印花overall偏移和画布对不上问题 2026-01-21 09:59:17 +08:00
X1627315083
a1e0e19412 Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite 2026-01-21 09:43:57 +08:00
X1627315083
b10fd72008 fix 2026-01-21 09:43:26 +08:00
X1627315083
a78056c898 fix: 修复canvas快捷键隐藏问题、提交preview后切换sketch再切回来前后片变为最早版本 2026-01-21 09:41:38 +08:00
X1627315083
07c261d74c Merge branch 'StableVersion' of ssh://18.167.251.121:10002/aidlab/aida_front into StableVersion 2026-01-20 16:48:37 +08:00
X1627315083
fc28d78357 处理generate生成失败逻辑 2026-01-20 16:48:34 +08:00
李志鹏
6bee02dfa5 Merge branch 'dev_vite' of http://18.167.251.121:10003/aidlab/aida_front into dev_vite 2026-01-20 16:44:57 +08:00
李志鹏
e19c850214 fix 2026-01-20 16:44:56 +08:00
9bdd0a23d3 Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite 2026-01-20 16:41:41 +08:00
08b8a52d83 style:页面动画 2026-01-20 16:41:37 +08:00
李志鹏
11fb6f908c 平铺不可以添加相同的token 2026-01-20 16:39:02 +08:00
李志鹏
27198cc35b Merge branch 'dev_vite' of http://18.167.251.121:10003/aidlab/aida_front into dev_vite 2026-01-20 16:11:42 +08:00
李志鹏
844694d638 平铺偏移 2026-01-20 16:11:40 +08:00
695a91ac1c bugfix: 教育版管理员页面分页器消失 2026-01-20 15:44:55 +08:00
4fd66fcc05 Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite 2026-01-20 15:42:23 +08:00
aa193f08cb style: 页面动画效果 2026-01-20 15:42:17 +08:00
X1627315083
3692361551 fix 2026-01-20 15:40:36 +08:00
X1627315083
008e14ec57 ifx 2026-01-20 15:31:06 +08:00
X1627315083
248732b085 Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite 2026-01-20 15:29:06 +08:00
X1627315083
033950babe 修复印花界面,切换线稿图印花储存有问题 2026-01-20 15:29:04 +08:00
李志鹏
dbd1651a37 gap 2026-01-20 14:10:10 +08:00
X1627315083
25ad9799f8 修改sketch或者切换sketch bug修复 2026-01-20 13:49:34 +08:00
李志鹏
747a3b0ebc Merge branch 'dev_vite' of http://18.167.251.121:10003/aidlab/aida_front into dev_vite 2026-01-20 13:18:30 +08:00
李志鹏
27e43f3c97 老数据重置画布大小 2026-01-20 13:18:28 +08:00
516ad19db7 Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite 2026-01-20 10:31:57 +08:00
d1af68d60a chore: award页面修改 2026-01-20 10:31:52 +08:00
李志鹏
eb1de5abb3 fix 2026-01-20 10:31:47 +08:00
X1627315083
cdcb18c02c fix 2026-01-19 17:16:20 +08:00
f11805c65a chore: 字体包 2026-01-19 17:08:41 +08:00
ce21acba93 Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite 2026-01-19 17:07:09 +08:00
a48e517e76 feat: award表单页面 2026-01-19 17:07:05 +08:00
李志鹏
f837542797 Merge branch 'dev_vite' of http://18.167.251.121:10003/aidlab/aida_front into dev_vite 2026-01-19 16:57:12 +08:00
李志鹏
74b43e431b 去除画布打印信息 2026-01-19 16:57:11 +08:00
X1627315083
c20ef9d00c fix 2026-01-19 16:55:45 +08:00
X1627315083
a7b5cc1685 当前页面直接提交数据没有存储到衣服上 2026-01-19 16:53:20 +08:00
X1627315083
5971ab56c0 ifx 2026-01-19 16:40:10 +08:00
X1627315083
7ff2c2095a 添加元素图层合并模式由正片叠底改为默认 2026-01-19 16:08:08 +08:00
李志鹏
9613d2b5b2 fix 2026-01-19 15:26:04 +08:00
X1627315083
94b9977ef6 Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite 2026-01-19 14:44:47 +08:00
X1627315083
315254b6d5 fix 2026-01-19 14:44:45 +08:00
李志鹏
31c2ca4e8b 平铺画布更改 2026-01-19 14:44:18 +08:00
李志鹏
af5f178476 Merge branch 'dev_vite' of http://18.167.251.121:10003/aidlab/aida_front into dev_vite 2026-01-19 14:26:07 +08:00
李志鹏
0aae85e94d 添加任务队列 2026-01-19 14:25:44 +08:00
X1627315083
4c25e4a5a3 fix 2026-01-19 13:58:31 +08:00
李志鹏
87fd5b9a93 fix 2026-01-19 13:37:24 +08:00
李志鹏
e81049c332 印花其他属性同步 2026-01-19 11:16:23 +08:00
李志鹏
28bc0f2f0e Merge branch 'dev_vite' of http://18.167.251.121:10003/aidlab/aida_front into dev_vite 2026-01-19 11:07:06 +08:00
李志鹏
4126e0b24d 元素默认正常模式 2026-01-19 11:07:04 +08:00
X1627315083
e4cdebfe40 Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite 2026-01-19 11:03:03 +08:00
X1627315083
55f4e5626e 调整画布previwe后颜色板块变为空了 2026-01-19 11:02:55 +08:00
a0a751c661 Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite 2026-01-19 10:56:44 +08:00
9aa3a2f889 feat: award页面 2026-01-19 10:56:39 +08:00
李志鹏
43e3a79124 点选 2026-01-19 10:47:30 +08:00
李志鹏
6b0d26ed6e 隐藏画布时候关闭键盘事件 2026-01-16 16:42:53 +08:00
李志鹏
9b29939bfe fix 2026-01-16 16:31:54 +08:00
李志鹏
0add8bc412 Merge branch 'dev_vite' of http://18.167.251.121:10003/aidlab/aida_front into dev_vite 2026-01-16 15:16:36 +08:00
李志鹏
618b9bab1f fix 2026-01-16 15:16:33 +08:00
X1627315083
226e183f52 修复印花画布不同步问题和overall模式大小没有同步 2026-01-16 14:57:48 +08:00
X1627315083
b78832875c Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite 2026-01-16 14:37:55 +08:00
X1627315083
c4c4753403 修复detail无法submit 2026-01-16 14:37:53 +08:00
3014414c97 Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite 2026-01-16 14:30:53 +08:00
6a5a0930e9 feat: award页面 2026-01-16 14:30:48 +08:00
X1627315083
f813384a6e 调整修改overall模式印花参数的icon位置 2026-01-16 14:14:30 +08:00
X1627315083
a720fba84e 修复印花线稿合成图显示异常 2026-01-16 13:39:00 +08:00
李志鹏
2b7db933d9 Merge branch 'dev_vite' of http://18.167.251.121:10003/aidlab/aida_front into dev_vite 2026-01-16 13:02:28 +08:00
李志鹏
ba5b1657a5 控制导出图片大小 2026-01-16 13:02:26 +08:00
X1627315083
30109fdb79 Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite 2026-01-16 10:34:17 +08:00
X1627315083
83226f006c fix 2026-01-16 10:34:15 +08:00
李志鹏
a5e21c93b3 Merge branch 'dev_vite' of http://18.167.251.121:10003/aidlab/aida_front into dev_vite 2026-01-16 10:29:05 +08:00
李志鹏
1989c22562 同步印花平铺的位置信息 2026-01-16 10:29:03 +08:00
X1627315083
882740592c fix 2026-01-15 17:34:54 +08:00
X1627315083
0c995054a2 fix 2026-01-15 17:26:56 +08:00
李志鹏
6780c0fbb1 Merge branch 'dev_vite' of http://18.167.251.121:10003/aidlab/aida_front into dev_vite 2026-01-15 17:15:21 +08:00
李志鹏
7101daeb90 fix 2026-01-15 17:15:05 +08:00
X1627315083
0d0de45a25 detail submit preview完善 2026-01-15 17:14:11 +08:00
李志鹏
28b6153ab0 导出图片添加配置 2026-01-15 14:10:05 +08:00
李志鹏
7a4fc0736d 很多很多 2026-01-15 13:42:33 +08:00
fb1bfc353c Merge branch 'StableVersion' of ssh://18.167.251.121:10002/aidlab/aida_front into StableVersion 2026-01-15 10:47:57 +08:00
cc0127f195 bugfix: 教育版管理员页面分页器消失 2026-01-15 10:38:53 +08:00
X1627315083
f4043d6f61 调整手机注册输入验证码样式 2026-01-14 16:56:39 +08:00
李志鹏
9912f310ec token 2026-01-14 15:08:25 +08:00
李志鹏
7bf1a0bd57 Merge branch 'dev_vite' of http://18.167.251.121:10003/aidlab/aida_front into dev_vite 2026-01-14 14:43:46 +08:00
李志鹏
810dd2351b 111 2026-01-14 14:43:43 +08:00
李志鹏
e42975159f Merge branch 'dev_vite' of http://18.167.251.121:10003/aidlab/aida_front into dev_vite 2026-01-14 14:42:23 +08:00
李志鹏
c1cff1d61b Merge branch 'dev_vite' of http://18.167.251.121:10003/aidlab/aida_front into dev_vite 2026-01-14 11:26:53 +08:00
李志鹏
dbe4557dc3 导出图片添加印花平铺判断 2026-01-14 11:26:51 +08:00
X1627315083
bc7099cce2 调整generate输入框出现滚动条问题 2026-01-13 16:16:02 +08:00
李志鹏
d75e956fbf Merge branch 'dev_vite' of http://18.167.251.121:10003/aidlab/aida_front into dev_vite 2026-01-13 14:41:53 +08:00
李志鹏
6eda04a81e 平铺元素ui更改 2026-01-13 14:41:20 +08:00
X1627315083
069b86de13 Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite 2026-01-13 14:07:54 +08:00
X1627315083
833d43d7d1 detail页面sketch支持镜像、detail图片合成由前端来做,但是新增sketch还是要过接口,sketch调整细节位置变更 2026-01-13 14:07:51 +08:00
c9b67c4d3b Merge branch 'dev_vite' of http://18.167.251.121:10003/aidlab/aida_front into dev_vite 2026-01-12 17:23:29 +08:00
a8510445cd feat: award页面 2026-01-12 17:23:25 +08:00
李志鹏
e1ca896764 画布json加载成功事件 2026-01-12 14:07:14 +08:00
李志鹏
7a6bd28de5 111 2026-01-12 13:30:10 +08:00
李志鹏
85a158ea3e 印花图层等禁止添加图层 2026-01-12 09:42:07 +08:00
李志鹏
7fc0e3bace OverallCanvas 2026-01-09 17:31:48 +08:00
李志鹏
7af8bc96c8 1 2026-01-09 17:10:51 +08:00
李志鹏
64ac0c7e16 111 2026-01-09 17:06:04 +08:00
李志鹏
7b071bc585 fix 2026-01-09 17:05:46 +08:00
李志鹏
3058adfdb7 mini画布印花操作同步 2026-01-09 16:41:49 +08:00
李志鹏
88bd58fc66 事件替换颜色等画布 2026-01-09 14:40:18 +08:00
李志鹏
274ea15dcc 略略略 2026-01-08 17:04:37 +08:00
李志鹏
d863376b41 印花图层禁用画笔等工具 2026-01-08 16:37:35 +08:00
李志鹏
5bbc71654a 更改不平铺的样式 2026-01-08 15:25:15 +08:00
李志鹏
9d41602320 Merge branch 'dev_vite' of http://18.167.251.121:10003/aidlab/aida_front into dev_vite 2026-01-08 14:29:12 +08:00
李志鹏
4e0faed88e 略略略略略略略略略略略略 2026-01-08 14:29:10 +08:00
3fa7d407d2 bugfix: 编辑订阅计划管理员用户邮箱回显 2026-01-07 16:43:01 +08:00
1fa60557df feat: 只有PENDING可以修改开始时间&结束时间必须大于之前 2026-01-07 16:17:43 +08:00
2b273ec70a bugfix: 用户名检索 2026-01-07 15:37:57 +08:00
45af83d0b2 bugfix: 编辑时无法回显用户邮箱 2026-01-07 15:06:25 +08:00
b4ea8907d7 Merge branch 'dev_vite' of http://18.167.251.121:10003/aidlab/aida_front into dev_vite 2026-01-07 14:30:30 +08:00
7ed87f59ee feat: 订阅计划表格显示国家或地区 2026-01-07 14:30:26 +08:00
李志鹏
567ae02c48 Merge branch 'dev_vite' of http://18.167.251.121:10003/aidlab/aida_front into dev_vite 2026-01-07 13:02:19 +08:00
李志鹏
ae6f14efa9 平铺组件 2026-01-07 13:02:08 +08:00
048a548df8 Merge branch 'dev_vite' of http://18.167.251.121:10003/aidlab/aida_front into dev_vite 2026-01-07 11:50:06 +08:00
b9112a5606 feat: 修改所有选择用户名 /邮箱的组件 2026-01-07 11:50:02 +08:00
李志鹏
8f1fea30ee Merge branch 'dev_vite' of http://18.167.251.121:10003/aidlab/aida_front into dev_vite 2026-01-07 10:27:50 +08:00
李志鹏
29704f9b36 添加导出gap 2026-01-07 10:27:48 +08:00
X1627315083
1df7b62fe6 调整系统维护页面文案 2025-12-19 21:36:42 +08:00
221 changed files with 18377 additions and 7775 deletions

View File

@@ -7,5 +7,7 @@ VITE_APP_BASE_URL = 'https://develop.api.aida.com.hk'
# VITE_APP_BASE_URL = 'https://www.api.aida.com.hk' # VITE_APP_BASE_URL = 'https://www.api.aida.com.hk'
# 徐佩 # 徐佩
# VITE_APP_BASE_URL = 'http://192.168.31.118:5567' # VITE_APP_BASE_URL = 'http://192.168.31.118:5567'
# 李天祥
# VITE_APP_BASE_URL = 'http://192.168.31.82:5567'
# 海波 # 海波
# VITE_APP_BASE_URL = 'http://192.168.31.34:5567' # VITE_APP_BASE_URL = 'http://192.168.31.34:5567'

View File

@@ -5,4 +5,3 @@ VITE_USER_NODE_ENV = 'development'
VITE_APP_BASE_URL = 'https://develop.api.aida.com.hk' VITE_APP_BASE_URL = 'https://develop.api.aida.com.hk'
# VITE_APP_BASE_URL = 'http://localhost:22170' # VITE_APP_BASE_URL = 'http://localhost:22170'

1
.gitignore vendored
View File

@@ -24,3 +24,4 @@ dist.rar
*.sw? *.sw?
.eslintrc-auto-import.json .eslintrc-auto-import.json
components.d.ts components.d.ts
.cursor

33
.prettierrc.js Normal file
View File

@@ -0,0 +1,33 @@
/** @type {import('prettier').Config} */
module.exports = {
// 打印宽度
printWidth: 100,
// 使用 4 空格缩进
tabWidth: 4,
// 使用 4 空格缩进,不使用制表符
useTabs: true,
// 行尾使用 LF (Unix 风格)
endOfLine: 'lf',
// 语句末尾使用分号
semi: false,
// 使用单引号
singleQuote: false,
// 对象和数组末尾不添加尾随逗号
trailingComma: 'none',
// JSX 引号使用单引号
jsxSingleQuote: false,
// 括号内侧空格
bracketSpacing: true,
// JSX 标签不换行
bracketSameLine: false,
// 箭头函数参数始终使用括号
arrowParens: 'always',
// HTML、Vue、Angular 和 Markdown 使用 LF
htmlWhitespaceSensitivity: 'css',
// Vue 文件脚本和样式缩进
vueIndentScriptAndStyle: false,
// 行注释位置在注释上方,不加空格
proseWrap: 'preserve',
// 根据文件类型自动推断
embeddedLanguageFormatting: 'auto',
};

View File

@@ -17,6 +17,7 @@
<link rel="stylesheet" href="/css/sloganFamily.css"> <link rel="stylesheet" href="/css/sloganFamily.css">
<link rel="stylesheet" href="/css/pingfang.css"> <link rel="stylesheet" href="/css/pingfang.css">
<link rel="stylesheet" href="/css/fonts/fontFamily.css">
</head> </head>
<body> <body>

260
package-lock.json generated
View File

@@ -34,6 +34,7 @@
"vue-draggable-plus": "^0.6.0", "vue-draggable-plus": "^0.6.0",
"vue-i18n": "^9.6.1", "vue-i18n": "^9.6.1",
"vue-router": "^4.0.3", "vue-router": "^4.0.3",
"vue3-moveable": "^0.28.0",
"vuedraggable": "^4.1.0", "vuedraggable": "^4.1.0",
"vuex": "^4.0.0", "vuex": "^4.0.0",
"x-sender": "^1.1.6" "x-sender": "^1.1.6"
@@ -232,6 +233,15 @@
"node": ">=6.9.0" "node": ">=6.9.0"
} }
}, },
"node_modules/@cfcs/core": {
"version": "0.0.6",
"resolved": "https://registry.npmmirror.com/@cfcs/core/-/core-0.0.6.tgz",
"integrity": "sha512-FxfJMwoLB8MEMConeXUCqtMGqxdtePQxRBOiGip9ULcYYam3WfCgoY6xdnMaSkYvRvmosp5iuG+TiPofm65+Pw==",
"license": "MIT",
"dependencies": {
"@egjs/component": "^3.0.2"
}
},
"node_modules/@ctrl/tinycolor": { "node_modules/@ctrl/tinycolor": {
"version": "3.6.1", "version": "3.6.1",
"resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", "resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz",
@@ -240,6 +250,39 @@
"node": ">=10" "node": ">=10"
} }
}, },
"node_modules/@daybrush/utils": {
"version": "1.13.0",
"resolved": "https://registry.npmmirror.com/@daybrush/utils/-/utils-1.13.0.tgz",
"integrity": "sha512-ALK12C6SQNNHw1enXK+UO8bdyQ+jaWNQ1Af7Z3FNxeAwjYhQT7do+TRE4RASAJ3ObaS2+TJ7TXR3oz2Gzbw0PQ==",
"license": "MIT"
},
"node_modules/@egjs/agent": {
"version": "2.4.4",
"resolved": "https://registry.npmmirror.com/@egjs/agent/-/agent-2.4.4.tgz",
"integrity": "sha512-cvAPSlUILhBBOakn2krdPnOGv5hAZq92f1YHxYcfu0p7uarix2C6Ia3AVizpS1SGRZGiEkIS5E+IVTLg1I2Iog==",
"license": "MIT"
},
"node_modules/@egjs/children-differ": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/@egjs/children-differ/-/children-differ-1.0.1.tgz",
"integrity": "sha512-DRvyqMf+CPCOzAopQKHtW+X8iN6Hy6SFol+/7zCUiE5y4P/OB8JP8FtU4NxtZwtafvSL4faD5KoQYPj3JHzPFQ==",
"license": "MIT",
"dependencies": {
"@egjs/list-differ": "^1.0.0"
}
},
"node_modules/@egjs/component": {
"version": "3.0.5",
"resolved": "https://registry.npmmirror.com/@egjs/component/-/component-3.0.5.tgz",
"integrity": "sha512-cLcGizTrrUNA2EYE3MBmEDt2tQv1joVP1Q3oDisZ5nw0MZDx2kcgEXM+/kZpfa/PAkFvYVhRUZwytIQWoN3V/w==",
"license": "MIT"
},
"node_modules/@egjs/list-differ": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/@egjs/list-differ/-/list-differ-1.0.1.tgz",
"integrity": "sha512-OTFTDQcWS+1ZREOdCWuk5hCBgYO4OsD30lXcOCyVOAjXMhgL5rBRDnt/otb6Nz8CzU0L/igdcaQBDLWc4t9gvg==",
"license": "MIT"
},
"node_modules/@element-plus/icons-vue": { "node_modules/@element-plus/icons-vue": {
"version": "2.3.1", "version": "2.3.1",
"resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz", "resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz",
@@ -1224,6 +1267,34 @@
"win32" "win32"
] ]
}, },
"node_modules/@scena/dragscroll": {
"version": "1.4.0",
"resolved": "https://registry.npmmirror.com/@scena/dragscroll/-/dragscroll-1.4.0.tgz",
"integrity": "sha512-3O8daaZD9VXA9CP3dra6xcgt/qrm0mg0xJCwiX6druCteQ9FFsXffkF8PrqxY4Z4VJ58fFKEa0RlKqbsi/XnRA==",
"license": "MIT",
"dependencies": {
"@daybrush/utils": "^1.6.0",
"@scena/event-emitter": "^1.0.2"
}
},
"node_modules/@scena/event-emitter": {
"version": "1.0.5",
"resolved": "https://registry.npmmirror.com/@scena/event-emitter/-/event-emitter-1.0.5.tgz",
"integrity": "sha512-AzY4OTb0+7ynefmWFQ6hxDdk0CySAq/D4efljfhtRHCOP7MBF9zUfhKG3TJiroVjASqVgkRJFdenS8ArZo6Olg==",
"license": "MIT",
"dependencies": {
"@daybrush/utils": "^1.1.1"
}
},
"node_modules/@scena/matrix": {
"version": "1.1.1",
"resolved": "https://registry.npmmirror.com/@scena/matrix/-/matrix-1.1.1.tgz",
"integrity": "sha512-JVKBhN0tm2Srl+Yt+Ywqu0oLgLcdemDQlD1OxmN9jaCTwaFPZ7tY8n6dhVgMEaR9qcR7r+kAlMXnSfNyYdE+Vg==",
"license": "MIT",
"dependencies": {
"@daybrush/utils": "^1.4.0"
}
},
"node_modules/@simonwep/pickr": { "node_modules/@simonwep/pickr": {
"version": "1.8.2", "version": "1.8.2",
"resolved": "https://registry.npmmirror.com/@simonwep/pickr/-/pickr-1.8.2.tgz", "resolved": "https://registry.npmmirror.com/@simonwep/pickr/-/pickr-1.8.2.tgz",
@@ -2904,6 +2975,52 @@
"node": ">= 0.10" "node": ">= 0.10"
} }
}, },
"node_modules/croact": {
"version": "1.0.4",
"resolved": "https://registry.npmmirror.com/croact/-/croact-1.0.4.tgz",
"integrity": "sha512-9GhvyzTY/IVUrMQ2iz/mzgZ8+NcjczmIo/t4FkC1CU0CEcau6v6VsEih4jkTa4ZmRgYTF0qXEZLObCzdDFplpw==",
"license": "MIT",
"dependencies": {
"@daybrush/utils": "^1.13.0",
"@egjs/list-differ": "^1.0.0"
}
},
"node_modules/croact-css-styled": {
"version": "1.1.9",
"resolved": "https://registry.npmmirror.com/croact-css-styled/-/croact-css-styled-1.1.9.tgz",
"integrity": "sha512-G7yvRiVJ3Eoj0ov2h2xR4312hpOzATay2dGS9clK8yJQothjH1sBXIyvOeRP5wBKD9mPcKcoUXPCPsl0tQog4w==",
"license": "MIT",
"dependencies": {
"@daybrush/utils": "^1.13.0",
"css-styled": "~1.0.8",
"framework-utils": "^1.1.0"
}
},
"node_modules/croact-moveable": {
"version": "0.9.0",
"resolved": "https://registry.npmmirror.com/croact-moveable/-/croact-moveable-0.9.0.tgz",
"integrity": "sha512-fc3bieV6CdqqZFtzsSLi9KmvUMFW3oakUfhPCls1BxKjOfUfn8rktteGED2341A/Qghy8tI3Hm6SdocIc68IKg==",
"license": "MIT",
"dependencies": {
"@daybrush/utils": "^1.13.0",
"@egjs/agent": "^2.2.1",
"@egjs/children-differ": "^1.0.1",
"@egjs/list-differ": "^1.0.0",
"@scena/dragscroll": "^1.4.0",
"@scena/event-emitter": "^1.0.5",
"@scena/matrix": "^1.1.1",
"croact-css-styled": "^1.1.9",
"css-to-mat": "^1.1.1",
"framework-utils": "^1.1.0",
"gesto": "^1.19.3",
"overlap-area": "^1.1.0",
"react-css-styled": "^1.1.9",
"react-moveable": "~0.56.0"
},
"peerDependencies": {
"croact": "^1.0.4"
}
},
"node_modules/cross-spawn": { "node_modules/cross-spawn": {
"version": "7.0.6", "version": "7.0.6",
"resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz", "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz",
@@ -3014,6 +3131,25 @@
"url": "https://github.com/fb55/entities?sponsor=1" "url": "https://github.com/fb55/entities?sponsor=1"
} }
}, },
"node_modules/css-styled": {
"version": "1.0.8",
"resolved": "https://registry.npmmirror.com/css-styled/-/css-styled-1.0.8.tgz",
"integrity": "sha512-tCpP7kLRI8dI95rCh3Syl7I+v7PP+2JYOzWkl0bUEoSbJM+u8ITbutjlQVf0NC2/g4ULROJPi16sfwDIO8/84g==",
"license": "MIT",
"dependencies": {
"@daybrush/utils": "^1.13.0"
}
},
"node_modules/css-to-mat": {
"version": "1.1.1",
"resolved": "https://registry.npmmirror.com/css-to-mat/-/css-to-mat-1.1.1.tgz",
"integrity": "sha512-kvpxFYZb27jRd2vium35G7q5XZ2WJ9rWjDUMNT36M3Hc41qCrLXFM5iEKMGXcrPsKfXEN+8l/riB4QzwwwiEyQ==",
"license": "MIT",
"dependencies": {
"@daybrush/utils": "^1.13.0",
"@scena/matrix": "^1.0.0"
}
},
"node_modules/css-tree": { "node_modules/css-tree": {
"version": "1.1.3", "version": "1.1.3",
"resolved": "https://registry.npmmirror.com/css-tree/-/css-tree-1.1.3.tgz", "resolved": "https://registry.npmmirror.com/css-tree/-/css-tree-1.1.3.tgz",
@@ -4354,6 +4490,12 @@
"node": ">=0.10.0" "node": ">=0.10.0"
} }
}, },
"node_modules/framework-utils": {
"version": "1.1.0",
"resolved": "https://registry.npmmirror.com/framework-utils/-/framework-utils-1.1.0.tgz",
"integrity": "sha512-KAfqli5PwpFJ8o3psRNs8svpMGyCSAe8nmGcjQ0zZBWN2H6dZDnq+ABp3N3hdUmFeMrLtjOCTXD4yplUJIWceg==",
"license": "MIT"
},
"node_modules/fs-extra": { "node_modules/fs-extra": {
"version": "10.1.0", "version": "10.1.0",
"resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz", "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz",
@@ -4485,6 +4627,16 @@
"node": ">=10" "node": ">=10"
} }
}, },
"node_modules/gesto": {
"version": "1.19.4",
"resolved": "https://registry.npmmirror.com/gesto/-/gesto-1.19.4.tgz",
"integrity": "sha512-hfr/0dWwh0Bnbb88s3QVJd1ZRJeOWcgHPPwmiH6NnafDYvhTsxg+SLYu+q/oPNh9JS3V+nlr6fNs8kvPAtcRDQ==",
"license": "MIT",
"dependencies": {
"@daybrush/utils": "^1.13.0",
"@scena/event-emitter": "^1.0.2"
}
},
"node_modules/get-intrinsic": { "node_modules/get-intrinsic": {
"version": "1.3.0", "version": "1.3.0",
"resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
@@ -5695,6 +5847,24 @@
"setimmediate": "^1.0.5" "setimmediate": "^1.0.5"
} }
}, },
"node_modules/keycode": {
"version": "2.2.1",
"resolved": "https://registry.npmmirror.com/keycode/-/keycode-2.2.1.tgz",
"integrity": "sha512-Rdgz9Hl9Iv4QKi8b0OlCRQEzp4AgVxyCtz5S/+VIHezDmrDhkp2N2TqBWOLz0/gbeREXOOiI9/4b8BY9uw2vFg==",
"license": "MIT"
},
"node_modules/keycon": {
"version": "1.4.0",
"resolved": "https://registry.npmmirror.com/keycon/-/keycon-1.4.0.tgz",
"integrity": "sha512-p1NAIxiRMH3jYfTeXRs2uWbVJ1WpEjpi8ktzUyBJsX7/wn2qu2VRXktneBLNtKNxJmlUYxRi9gOJt1DuthXR7A==",
"license": "MIT",
"dependencies": {
"@cfcs/core": "^0.0.6",
"@daybrush/utils": "^1.7.1",
"@scena/event-emitter": "^1.0.2",
"keycode": "^2.2.0"
}
},
"node_modules/keyv": { "node_modules/keyv": {
"version": "4.5.4", "version": "4.5.4",
"resolved": "https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz", "resolved": "https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz",
@@ -6212,6 +6382,19 @@
"pathe": "^2.0.1" "pathe": "^2.0.1"
} }
}, },
"node_modules/moveable": {
"version": "0.53.0",
"resolved": "https://registry.npmmirror.com/moveable/-/moveable-0.53.0.tgz",
"integrity": "sha512-71jS9zIoQzMhnNvduhg4tUEdm23+fO/40FN7muVMbZvVwbTku2MIxxLhnU4qFvxI4oVxn75l79SbtgjuA+s7Pw==",
"license": "MIT",
"dependencies": {
"@daybrush/utils": "^1.13.0",
"@scena/event-emitter": "^1.0.5",
"croact": "^1.0.4",
"croact-moveable": "~0.9.0",
"react-moveable": "~0.56.0"
}
},
"node_modules/ms": { "node_modules/ms": {
"version": "2.1.3", "version": "2.1.3",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz",
@@ -6650,6 +6833,15 @@
"node": ">= 0.8.0" "node": ">= 0.8.0"
} }
}, },
"node_modules/overlap-area": {
"version": "1.1.0",
"resolved": "https://registry.npmmirror.com/overlap-area/-/overlap-area-1.1.0.tgz",
"integrity": "sha512-3dlJgJCaVeXH0/eZjYVJvQiLVVrPO4U1ZGqlATtx6QGO3b5eNM6+JgUKa7oStBTdYuGTk7gVoABCW6Tp+dhRdw==",
"license": "MIT",
"dependencies": {
"@daybrush/utils": "^1.7.1"
}
},
"node_modules/own-keys": { "node_modules/own-keys": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmmirror.com/own-keys/-/own-keys-1.0.1.tgz", "resolved": "https://registry.npmmirror.com/own-keys/-/own-keys-1.0.1.tgz",
@@ -7037,6 +7229,46 @@
"safe-buffer": "^5.1.0" "safe-buffer": "^5.1.0"
} }
}, },
"node_modules/react-css-styled": {
"version": "1.1.9",
"resolved": "https://registry.npmmirror.com/react-css-styled/-/react-css-styled-1.1.9.tgz",
"integrity": "sha512-M7fJZ3IWFaIHcZEkoFOnkjdiUFmwd8d+gTh2bpqMOcnxy/0Gsykw4dsL4QBiKsxcGow6tETUa4NAUcmJF+/nfw==",
"license": "MIT",
"dependencies": {
"css-styled": "~1.0.8",
"framework-utils": "^1.1.0"
}
},
"node_modules/react-moveable": {
"version": "0.56.0",
"resolved": "https://registry.npmmirror.com/react-moveable/-/react-moveable-0.56.0.tgz",
"integrity": "sha512-FmJNmIOsOA36mdxbrc/huiE4wuXSRlmon/o+/OrfNhSiYYYL0AV5oObtPluEhb2Yr/7EfYWBHTxF5aWAvjg1SA==",
"license": "MIT",
"dependencies": {
"@daybrush/utils": "^1.13.0",
"@egjs/agent": "^2.2.1",
"@egjs/children-differ": "^1.0.1",
"@egjs/list-differ": "^1.0.0",
"@scena/dragscroll": "^1.4.0",
"@scena/event-emitter": "^1.0.5",
"@scena/matrix": "^1.1.1",
"css-to-mat": "^1.1.1",
"framework-utils": "^1.1.0",
"gesto": "^1.19.3",
"overlap-area": "^1.1.0",
"react-css-styled": "^1.1.9",
"react-selecto": "^1.25.0"
}
},
"node_modules/react-selecto": {
"version": "1.26.3",
"resolved": "https://registry.npmmirror.com/react-selecto/-/react-selecto-1.26.3.tgz",
"integrity": "sha512-Ubik7kWSnZyQEBNro+1k38hZaI1tJarE+5aD/qsqCOA1uUBSjgKVBy3EWRzGIbdmVex7DcxznFZLec/6KZNvwQ==",
"license": "MIT",
"dependencies": {
"selecto": "~1.26.3"
}
},
"node_modules/readable-stream": { "node_modules/readable-stream": {
"version": "2.3.8", "version": "2.3.8",
"resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz", "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz",
@@ -7507,6 +7739,24 @@
"integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==",
"dev": true "dev": true
}, },
"node_modules/selecto": {
"version": "1.26.3",
"resolved": "https://registry.npmmirror.com/selecto/-/selecto-1.26.3.tgz",
"integrity": "sha512-gZHgqMy5uyB6/2YDjv3Qqaf7bd2hTDOpPdxXlrez4R3/L0GiEWDCFaUfrflomgqdb3SxHF2IXY0Jw0EamZi7cw==",
"license": "MIT",
"dependencies": {
"@daybrush/utils": "^1.13.0",
"@egjs/children-differ": "^1.0.1",
"@scena/dragscroll": "^1.4.0",
"@scena/event-emitter": "^1.0.5",
"css-styled": "^1.0.8",
"css-to-mat": "^1.1.1",
"framework-utils": "^1.1.0",
"gesto": "^1.19.4",
"keycon": "^1.2.0",
"overlap-area": "^1.1.0"
}
},
"node_modules/semver": { "node_modules/semver": {
"version": "7.7.2", "version": "7.7.2",
"resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.2.tgz", "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.2.tgz",
@@ -9765,6 +10015,16 @@
"vue": "^3.0.0" "vue": "^3.0.0"
} }
}, },
"node_modules/vue3-moveable": {
"version": "0.28.0",
"resolved": "https://registry.npmmirror.com/vue3-moveable/-/vue3-moveable-0.28.0.tgz",
"integrity": "sha512-vplQO0XkxVEtXMDh2/lZE+c5kMycGXAfYFMvbwFKi8UVYzVk8MTgVHr4fxO9Z+4i4Rb+U/IEIgkhHRMAbx8FJg==",
"license": "MIT",
"dependencies": {
"framework-utils": "^1.1.0",
"moveable": "~0.53.0"
}
},
"node_modules/vuedraggable": { "node_modules/vuedraggable": {
"version": "4.1.0", "version": "4.1.0",
"resolved": "https://registry.npmmirror.com/vuedraggable/-/vuedraggable-4.1.0.tgz", "resolved": "https://registry.npmmirror.com/vuedraggable/-/vuedraggable-4.1.0.tgz",

View File

@@ -40,6 +40,7 @@
"vue-draggable-plus": "^0.6.0", "vue-draggable-plus": "^0.6.0",
"vue-i18n": "^9.6.1", "vue-i18n": "^9.6.1",
"vue-router": "^4.0.3", "vue-router": "^4.0.3",
"vue3-moveable": "^0.28.0",
"vuedraggable": "^4.1.0", "vuedraggable": "^4.1.0",
"vuex": "^4.0.0", "vuex": "^4.0.0",
"x-sender": "^1.1.6" "x-sender": "^1.1.6"

BIN
public/css/fonts/ARIAL.ttf Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,41 @@
/* 字体定义 */
@font-face {
font-family: 'Arial';
src: url('./fonts/ARIAL.ttf') format('truetype');
}
@font-face {
font-family: 'ArialBold';
src: url('./fonts/ARIALBD.ttf') format('truetype');
}
@font-face {
font-family: 'ArialMedium';
src: url('./fonts/ArialMdm.ttf') format('truetype');
}
@font-face {
font-family: 'Poppins';
src: url('./fonts/Poppins-Regular.ttf') format('truetype');
font-weight: normal;
}
@font-face {
font-family: 'PoppinsMedium';
src: url('./fonts/Poppins-Medium.ttf') format('truetype');
}
@font-face {
font-family: 'PoppinsBold';
src: url('./fonts/Poppins-SemiBold.ttf') format('truetype');
}
@font-face {
font-family: 'Instrument';
src: url('./InstrumentSans-Regular.ttf') format('truetype');
}
@font-face {
font-family: 'InstrumentBold';
src: url('./InstrumentSans-Bold.ttf') format('truetype');
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 MiB

View File

@@ -0,0 +1,17 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="201.000000pt" height="200.000000pt" viewBox="0 0 201.000000 200.000000"
preserveAspectRatio="xMidYMid meet">
<g transform="translate(0.000000,200.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M1654 1990 c-26 -8 -153 -110 -162 -129 -1 -3 81 -89 183 -191 l185
-185 56 55 c30 30 62 67 70 82 22 41 18 123 -8 176 -29 57 -126 158 -169 176
-47 20 -118 27 -155 16z"/>
<path d="M868 1243 c-525 -527 -498 -492 -568 -725 -54 -179 -59 -219 -30
-248 19 -19 29 -21 64 -16 113 18 361 105 431 152 28 18 251 235 498 481 l447
448 -188 188 -187 187 -467 -467z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 799 B

View File

@@ -0,0 +1,17 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="200.000000pt" height="200.000000pt" viewBox="0 0 200.000000 200.000000"
preserveAspectRatio="xMidYMid meet">
<g transform="translate(0.000000,200.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M757 1273 c-214 -214 -402 -406 -418 -427 -32 -43 -37 -82 -15 -124
23 -44 327 -338 376 -363 l45 -24 463 -3 462 -3 0 46 0 45 -342 0 -343 0 342
343 c187 188 346 352 352 364 16 32 13 74 -7 105 -9 14 -110 116 -224 227
l-207 201 -47 0 -48 0 -389 -387z m207 -342 l209 -209 -128 -131 c-76 -78
-144 -138 -169 -151 -51 -24 -106 -26 -149 -4 -41 20 -337 314 -337 334 0 13
347 370 360 370 3 0 99 -94 214 -209z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 847 B

View File

@@ -0,0 +1 @@
<svg focusable="false" class="" data-icon="paper-clip" width="1em" height="1em" fill="#00000073" aria-hidden="true" viewBox="64 64 896 896"><path d="M779.3 196.6c-94.2-94.2-247.6-94.2-341.7 0l-261 260.8c-1.7 1.7-2.6 4-2.6 6.4s.9 4.7 2.6 6.4l36.9 36.9a9 9 0 0012.7 0l261-260.8c32.4-32.4 75.5-50.2 121.3-50.2s88.9 17.8 121.2 50.2c32.4 32.4 50.2 75.5 50.2 121.2 0 45.8-17.8 88.8-50.2 121.2l-266 265.9-43.1 43.1c-40.3 40.3-105.8 40.3-146.1 0-19.5-19.5-30.2-45.4-30.2-73s10.7-53.5 30.2-73l263.9-263.8c6.7-6.6 15.5-10.3 24.9-10.3h.1c9.4 0 18.1 3.7 24.7 10.3 6.7 6.7 10.3 15.5 10.3 24.9 0 9.3-3.7 18.1-10.3 24.7L372.4 653c-1.7 1.7-2.6 4-2.6 6.4s.9 4.7 2.6 6.4l36.9 36.9a9 9 0 0012.7 0l215.6-215.6c19.9-19.9 30.8-46.3 30.8-74.4s-11-54.6-30.8-74.4c-41.1-41.1-107.9-41-149 0L463 364 224.8 602.1A172.22 172.22 0 00174 724.8c0 46.3 18.1 89.8 50.8 122.5 33.9 33.8 78.3 50.7 122.7 50.7 44.4 0 88.8-16.9 122.6-50.7l309.2-309C824.8 492.7 850 432 850 367.5c.1-64.6-25.1-125.3-70.7-170.9z"></path></svg>

After

Width:  |  Height:  |  Size: 985 B

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="200.000000pt" height="200.000000pt" viewBox="0 0 200.000000 200.000000"
preserveAspectRatio="xMidYMid meet">
<g transform="translate(0.000000,200.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M250 1545 l0 -205 80 0 80 0 0 -340 0 -340 -80 0 -80 0 0 -205 0
-205 205 0 205 0 0 80 0 80 340 0 340 0 0 -80 0 -80 205 0 205 0 0 205 0 205
-80 0 -80 0 0 340 0 340 80 0 80 0 0 205 0 205 -205 0 -205 0 0 -80 0 -80
-340 0 -340 0 0 80 0 80 -205 0 -205 0 0 -205z m320 0 l0 -125 -120 0 -120 0
0 125 0 125 120 0 120 0 0 -125z m1100 0 l0 -125 -120 0 -120 0 0 125 0 125
120 0 120 0 0 -125z m-330 -125 l0 -80 85 0 85 0 0 -340 0 -340 -85 0 -85 0 0
-80 0 -80 -340 0 -340 0 0 80 0 80 -85 0 -85 0 0 340 0 340 85 0 85 0 0 80 0
80 340 0 340 0 0 -80z m-770 -965 l0 -125 -120 0 -120 0 0 125 0 125 120 0
120 0 0 -125z m1100 0 l0 -125 -120 0 -120 0 0 125 0 125 120 0 120 0 0 -125z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_图层_1" data-name="图层 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 184.06 163.52">
<defs>
<style>
.cls-1, .cls-2 {
fill: #333;
}
.cls-2 {
stroke: #333;
stroke-miterlimit: 10;
}
</style>
</defs>
<path class="cls-2" d="M35.53,54.52c-.76-.96-.84-1.16-2.06-1.12-4.02.13-16.7,6.5-19.81,4.48C12.45,52.21-1.21,21.14.68,18.17c56.98-23.47,125.74-23.63,182.7,0,1.88,2.98-11.77,34.04-12.98,39.72-3.11,2.01-15.78-4.36-19.81-4.48-1.23-.04-1.3.16-2.06,1.12v48c2.87,3.81,14.6,2.98,14.05,8.95-1.06,5.75-12.53,3.84-13.85,8.24l.34,39.85c.08.98-1.55,3.46-2.04,3.46H37.03c-2.08,0-1.5-3.59-1.5-4.5V54.52ZM41.53,47.52v108.5h101v-36c-7.66,1.58-6.82,23.41-12.7,24.86-1.18.17-2.67-.14-3.63-.79-2.98-2.02-6.47-24.26-10.3-25.81-.94-.38-4.46.95-5.31-1.9-1.01-3.4,3.85-4,4.01-5.02-.12-4.15-6.85-15.14-3.84-18.1,4.45-3.04,8.95,1.93,13.76,1.74-1.35-3.15-2.75-11.61,2.46-11.03s3.05,9.89,1.55,13.02l14,4.01v-53.5c0-5.17,22.25,4.69,23.94,3.46,1.7-8.98,7.54-18.42,9.64-26.94.32-1.3.79-1.48-.58-2.5-2.81-2.08-21.4-6.93-25.98-8.02-10.05-2.4-20.36-3.72-30.52-5.53-2.44.17-3.98,7.98-6.05,10.97-13.1,18.91-41.58,12.05-45.92-9.95l-2-1.02c-19.44,3.3-39.69,6.08-57.48,14.6l10.03,28.4c4.22.52,22.41-8.34,23.94-3.46ZM110.53,8.02h-37c4,20.53,33,20.53,37,0Z"/>
<path class="cls-1" d="M89.27,117.8c-.94.96-10.2,1.42-11.25-.78-4.1-8.61,17.67-5.76,11.25.78Z"/>
<path class="cls-1" d="M94.79,117.8c-6.42-6.54,15.35-9.39,11.25-.78-1.05,2.19-10.31,1.74-11.25.78Z"/>
<path class="cls-1" d="M60.62,113.11c1.1-1.64,14.59-2.57,12.84,3.27-1.14,3.81-16.87,2.76-12.84-3.27Z"/>
<path class="cls-1" d="M62.18,46.17h9.69s1.53,3.19,1.53,3.19c-1.22,4.73-18.53,3.97-11.22-3.19Z"/>
<path class="cls-1" d="M112.19,46.18l10.91.77.34,3.47c-.87,2.65-12.93,2.92-12.96-1.9l1.7-2.34Z"/>
<path class="cls-1" d="M56.23,84.18c6.63-1.86,6.45,14.76-.7,11.35-2.24-1.07-2.61-10.42.7-11.35Z"/>
<path class="cls-1" d="M89.37,46.16l.96,3.22c-.81,4.5-16.92,3.98-12.37-2.43l11.42-.79Z"/>
<path class="cls-1" d="M94.68,46.16l11.42.79.34,3.47c-1.03,3.13-16.69,2.9-11.76-4.26Z"/>
<path class="cls-1" d="M54.75,63.76c-1.01-.99-2.01-12.94,3.11-11.63,5.4,1.38,2.78,17.42-3.11,11.63Z"/>
<path class="cls-1" d="M129.31,63.76c-5.88,5.78-8.51-10.25-3.11-11.63,5.12-1.31,4.12,10.64,3.11,11.63Z"/>
<path class="cls-1" d="M59.44,68.12c1.19.8,3.28,13.19-3.02,12.43l-2.23-1.77c-.57-2.83-.34-14.39,5.25-10.66Z"/>
<path class="cls-1" d="M59.44,111.92c-5.59,3.73-5.82-7.83-5.25-10.66l2.23-1.77c6.3-.76,4.22,11.63,3.02,12.43Z"/>
<path class="cls-1" d="M129.32,79.79c-5.12,5.18-7.81-7.81-4.7-11.67l3.28.02,1.48,1.52c-.35,2.45,1.51,8.54-.07,10.13Z"/>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@@ -0,0 +1,31 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="96.000000pt" height="96.000000pt" viewBox="0 0 96.000000 96.000000"
preserveAspectRatio="xMidYMid meet">
<g transform="translate(0.000000,96.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M346 936 c-21 -13 -49 -41 -62 -62 -41 -67 -27 -180 27 -218 47 -32
53 -12 12 40 -71 94 -2 229 116 229 37 0 58 -7 87 -28 32 -22 40 -24 42 -12
14 64 -142 100 -222 51z"/>
<path d="M368 877 c-33 -28 -48 -57 -48 -96 0 -39 9 -61 26 -61 10 0 14 13 14
46 0 57 12 79 50 93 61 21 110 -22 110 -96 0 -48 14 -56 31 -19 31 67 -35 156
-114 156 -29 0 -50 -7 -69 -23z"/>
<path d="M580 794 c0 -58 -9 -84 -43 -121 -19 -21 -19 -23 -2 -29 34 -13 85
75 85 148 0 37 -10 58 -26 58 -10 0 -14 -15 -14 -56z"/>
<path d="M410 749 c-13 -6 -28 -15 -32 -22 -4 -7 -8 -106 -8 -222 l-1 -210
-27 34 c-62 80 -89 101 -126 101 -27 0 -39 -6 -52 -25 -15 -24 -15 -28 0 -68
21 -53 78 -123 94 -113 18 11 16 17 -28 75 -44 58 -48 72 -25 91 21 18 54 -6
93 -68 31 -47 74 -78 93 -67 5 4 9 101 9 224 0 225 3 241 42 241 10 0 19 -1
19 -2 1 -2 5 -86 8 -188 5 -165 8 -185 24 -188 15 -3 17 5 17 61 0 72 17 100
45 77 10 -9 15 -32 15 -77 0 -56 2 -64 18 -61 12 2 16 11 14 34 -5 48 14 86
41 82 20 -3 22 -9 25 -66 3 -53 6 -63 20 -60 12 2 19 16 22 43 4 32 10 41 27
43 36 5 46 -36 39 -166 -6 -127 -19 -160 -75 -195 -48 -29 -176 -34 -246 -10
-48 18 -56 25 -130 128 -16 22 -25 26 -37 19 -15 -8 -11 -18 31 -75 78 -105
94 -113 236 -117 119 -3 121 -3 167 27 69 44 82 74 86 214 6 179 -8 221 -72
216 -22 -2 -39 4 -55 20 -17 17 -32 22 -55 19 -19 -2 -38 2 -45 9 -6 7 -25 13
-40 13 l-29 0 -4 100 c-3 103 -11 122 -53 133 -11 3 -31 1 -45 -4z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@@ -0,0 +1,9 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<rect width="24" height="24" fill="url(#pattern0_2641_12790)"/>
<defs>
<pattern id="pattern0_2641_12790" patternContentUnits="objectBoundingBox" width="1" height="1">
<use xlink:href="#image0_2641_12790" transform="scale(0.0078125)"/>
</pattern>
<image id="image0_2641_12790" width="128" height="128" preserveAspectRatio="none" xlink:href="data:image/png;base64,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"/>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 B

View File

@@ -0,0 +1,3 @@
<svg width="22" height="12" viewBox="0 0 22 12" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1 1L11 11L21 1" stroke="#585858" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 212 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 327 B

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 492 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 231 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 913 B

View File

@@ -0,0 +1,4 @@
<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>

After

Width:  |  Height:  |  Size: 636 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 339 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 443 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 280 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 400 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

View File

@@ -0,0 +1,9 @@
<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,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"/>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 340 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 930 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 262 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 KiB

View File

@@ -0,0 +1,10 @@
<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>

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 253 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

View File

@@ -0,0 +1,12 @@
<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>

After

Width:  |  Height:  |  Size: 2.2 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 811 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 144 KiB

After

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 159 KiB

After

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

@@ -1,93 +1,124 @@
{ {
"eventsList": [ "eventsList": [
{
"id": 1,
"title": "Just post your design work, you could have the chance to come to Hong Kong and interact with industry leaders face-to-face",
"imgUrl": "/image/events/workshop-En.jpg"
},
{ {
"id": 1,
"title":"Just post your design work, you could have the chance to come to Hong Kong and interact with industry leaders face-to-face",
"imgUrl": "/image/events/workshop-En.jpg"
},{
"id": 2, "id": 2,
"title":"AiDA X SFT AI Fashion Award 2024", "title": "AiDA X SFT AI Fashion Award 2024",
"imgUrl": "/image/events/Fashion-Award-2024.png" "imgUrl": "/image/events/Fashion-Award-2024.png"
} }
], ],
"eventsItem":[ "eventsItem": [
{ {
"id":1, "id": 3,
"title":"Just post your design work, you could have the chance to come to Hong Kong and interact with industry leaders face-to-face", "title": "AiDA Global Design Awards 2026",
"imgUrl": "/image/events/workshop-En.jpg", "imgUrl": "/image/events/award-poster.gif",
"textList":[ "textList": [
{ {
"paragraph":[ "paragraph": [
{ {
"text":"🎨AiDA Workshop!" "text": "Click the “View Details” button for more information and to join the competition! The AiDA Global Design Award 2026 is an international design competition hosted by CodeCreate, a globally leading AI fashion solutions provider, celebrating the future of creativity powered by artificial intelligence. Open to designers from Hong Kong, China, Singapore, South Korea, and beyond, the competition brings together global talent, empowering AI as a creative partner—pushing fashion beyond traditional boundaries and unlocking new possibilities where technology amplifies human imagination."
} }
] ]
},{ },
"paragraph":[ {
{ "paragraph": [
"text":"The process is simple: use AiDA to post your design work on the 'Gallery', and the one with the most likes(at least 20 likes) will be invited to the AiDA Workshop offline event in Hong Kong on November 14th, to exchange ideas with the Royal College of Art (RCA), Jae Lim, co-founder of the renowned fashion brand BESFXXK, and outstanding designers! " {
} "text": "Participants have the opportunity to compete for cash prizes totaling up to US$9,000, gain global media exposure showcased by top international platforms, and connect with designers and industry leaders worldwide. Finalists will also attend an exclusive award ceremony in Hong Kong, with travel support provided, allowing them to showcase their talent, network with professionals, and celebrate their achievements on an international stage."
] }
},{ ]
"paragraph":[ }
{ ]
"text":"<b>⚠ATTENTION❗❗</b>" },
} {
] "id": 1,
},{ "title": "Just post your design work, you could have the chance to come to Hong Kong and interact with industry leaders face-to-face",
"paragraph":[ "imgUrl": "/image/events/workshop-En.jpg",
{ "textList": [
"text":"1. Add the tag in the work description #AiDAworkshop_2024" {
},{ "paragraph": [
"text":"2. One winner only" {
} "text": "🎨AiDA Workshop!"
] }
},{ ]
"paragraph":[ },
{ {
"text":"<b>🤩Code-Create will provide (Terms and conditions apply):</b>" "paragraph": [
} {
] "text": "The process is simple: use AiDA to post your design work on the 'Gallery', and the one with the most likes(at least 20 likes) will be invited to the AiDA Workshop offline event in Hong Kong on November 14th, to exchange ideas with the Royal College of Art (RCA), Jae Lim, co-founder of the renowned fashion brand BESFXXK, and outstanding designers! "
},{ }
"paragraph":[ ]
{ },
"text":"✅Round-trip transportation fee (only within China)" {
} "paragraph": [
] {
},{ "text": "<b>⚠ATTENTION❗❗</b>"
"paragraph":[ }
{ ]
"text":"✅One night accommodation fee" },
} {
] "paragraph": [
},{ {
"paragraph":[ "text": "1. Add the tag in the work description #AiDAworkshop_2024"
{ },
"text":"⌛Deadline: October 31, 2024" {
} "text": "2. One winner only"
] }
} ]
] },
}, {
{ "paragraph": [
"id":2, {
"title":"AiDA X SFT AI Fashion Award 2024", "text": "<b>🤩Code-Create will provide (Terms and conditions apply):</b>"
"imgUrl": "/image/events/Fashion-Award-2024.png", }
"textList":[ ]
{ },
"paragraph":[ {
{ "paragraph": [
"text":"With the aim of inspiring students to innovate in fashion design using AI, Code-Create and The Hong Kong Polytechnic University School of Fashion and Textiles (SFT) have jointly launched the 'AiDA X SFT AI Fashion Award 2024'. This competition provides students with valuable practical AiDA experience, laying the foundation for the future fashion design industry and positioning them as pioneers in AI fashion." {
} "text": "✅Round-trip transportation fee (only within China)"
] }
},{ ]
"paragraph":[ },
{ {
"text":"The competition is open to all SFT students, with the winners having the chance to win cash prizes (up to 20,000 HKD), internship opportunity at BESFXXK (will work with the renowned designer, Mr Jae Hyuk Lim, for the BESFXXK collection, that will be featured at NY Fashion Week and Paris Fashion Week) and more surprises! Scan the QR code to learn more." "paragraph": [
} {
] "text": "✅One night accommodation fee"
} }
] ]
},
{
"paragraph": [
{
"text": "⌛Deadline: October 31, 2024"
}
]
}
]
},
{
"id": 2,
"title": "AiDA X SFT AI Fashion Award 2024",
"imgUrl": "/image/events/Fashion-Award-2024.png",
"textList": [
{
"paragraph": [
{
"text": "With the aim of inspiring students to innovate in fashion design using AI, Code-Create and The Hong Kong Polytechnic University School of Fashion and Textiles (SFT) have jointly launched the 'AiDA X SFT AI Fashion Award 2024'. This competition provides students with valuable practical AiDA experience, laying the foundation for the future fashion design industry and positioning them as pioneers in AI fashion."
}
]
},
{
"paragraph": [
{
"text": "The competition is open to all SFT students, with the winners having the chance to win cash prizes (up to 20,000 HKD), internship opportunity at BESFXXK (will work with the renowned designer, Mr Jae Hyuk Lim, for the BESFXXK collection, that will be featured at NY Fashion Week and Paris Fashion Week) and more surprises! Scan the QR code to learn more."
}
]
}
]
} }
] ]
} }

View File

@@ -1,93 +1,124 @@
{ {
"eventsList": [ "eventsList": [
{ {
"id": 1, "id": 1,
"title":"什么?只要发布设计作品就有机会来香港与大佬面对面交流?!", "title": "什么?只要发布设计作品就有机会来香港与大佬面对面交流?!",
"imgUrl": "/image/events/workshop-Cn.jpg" "imgUrl": "/image/events/workshop-Cn.jpg"
},{ },
"id": 2, {
"title":"AiDA X SFT AI时尚设计比赛2024", "id": 2,
"imgUrl": "/image/events/Fashion-Award-2024.png" "title": "AiDA X SFT AI时尚设计比赛2024",
} "imgUrl": "/image/events/Fashion-Award-2024.png"
}
], ],
"eventsItem":[ "eventsItem": [
{ {
"id":1, "id": 3,
"title":"什么?只要发布设计作品就有机会来香港与大佬面对面交流?!", "title": "AiDA全球设计奖 2026",
"imgUrl": "/image/events/workshop-Cn.jpg", "imgUrl": "/image/events/award-poster-zh.gif",
"textList":[ "textList": [
{ {
"paragraph":[ "paragraph": [
{ {
"text":"🎨这是一趟艺术巅峰之旅AiDA Workshop" "text": "秉承推动 AI 赋能创意设计的初衷CodeCreate 举办了「AiDA 全球设计大奖 2026」面向来自香港、中国、新加坡、韩国及全球的设计师鼓励大家探索 AI 与时尚设计的无限可能,突破传统界限,释放科技与想象力的创新潜能。点击“查看详情”按钮获取更多比赛信息,抓住成为 AI 时尚先锋的机会吧"
} }
] ]
},{ },
"paragraph":[ {
{ "paragraph": [
"text":"参与过程很简单利用AiDA 在 “Gallery广场 ”发布设计作品,最终获赞最高者(至少20个赞将被邀请至11月14日 举办的AiDA Workshop香港线下活动与英国皇家艺术学院RCA、韩国知名时尚品牌BESFXXK创始人JAE以及优秀设计师一同交流(名额仅限1名" {
} "text": "参赛者将有机会赢取总奖金 9,000 美元,作品还将获得国际媒体展示机会,并与全球设计师和行业领袖建立联系。入围决赛者将受邀参加在香港举办的 专属颁奖典礼,主办方提供差旅支持,让设计师在国际舞台展示才华、拓展人脉,并共同庆祝创意成果。"
] }
},{ ]
"paragraph":[ }
{ ]
"text":"<b>⚠️注意❗❗</b>" },
} {
] "id": 1,
},{ "title": "什么?只要发布设计作品就有机会来香港与大佬面对面交流?!",
"paragraph":[ "imgUrl": "/image/events/workshop-Cn.jpg",
{ "textList": [
"text":"1. 作品描述添加tag: #AiDAworkshop_2024" {
},{ "paragraph": [
"text":"2. 一个冠军名额" {
} "text": "🎨这是一趟艺术巅峰之旅AiDA Workshop"
] }
},{ ]
"paragraph":[ },
{ {
"text":"<b>🤩Code-Create将提供适用条款条规</b>" "paragraph": [
} {
] "text": "参与过程很简单利用AiDA 在 “Gallery广场 ”发布设计作品,最终获赞最高者(至少20个赞将被邀请至11月14日 举办的AiDA Workshop香港线下活动与英国皇家艺术学院RCA、韩国知名时尚品牌BESFXXK创始人JAE以及优秀设计师一同交流(名额仅限1名"
},{ }
"paragraph":[ ]
{ },
"text":"✅往返机票/动车费用(仅限中国地区)" {
} "paragraph": [
] {
},{ "text": "<b>⚠️注意❗❗</b>"
"paragraph":[ }
{ ]
"text":"✅一晚酒店住宿费用" },
} {
] "paragraph": [
},{ {
"paragraph":[ "text": "1. 作品描述添加tag: #AiDAworkshop_2024"
{ },
"text":"⌛截止时间2024.10.31" {
} "text": "2. 一个冠军名额"
] }
} ]
] },
}, {
{ "paragraph": [
"id":2, {
"title":"AiDA X SFT AI时尚设计比赛2024", "text": "<b>🤩Code-Create将提供适用条款条规</b>"
"imgUrl": "/image/events/Fashion-Award-2024.png", }
"textList":[ ]
{ },
"paragraph":[ {
{ "paragraph": [
"text":"秉承着激发学生使用AI进行时尚设计的创新能力的初衷Code-Create和香港理工大学时装及纺织学院SFT共同举办了“AiDA X SFT AI时尚设计比赛2024”让学生们在比赛中获得宝贵的AiDA实践经验为未来的时尚设计行业打下了坚实的基础成为时尚界的AI先锋。" {
} "text": "✅往返机票/动车费用(仅限中国地区)"
] }
},{ ]
"paragraph":[ },
{ {
"text":" 此次比赛面向全体SFT 学生最终获奖者将赢取丰厚奖金最高可达2万港币获得在BESFXXK的实习机会将与著名设计师Lim Jae Hyuk先生合作设计BESFXXK 系列,该系列将在纽约时装周和巴黎时装周上展出)及更多惊喜哦!扫描二维码获取更多比赛信息。" "paragraph": [
} {
] "text": "✅一晚酒店住宿费用"
} }
] ]
} },
] {
} "paragraph": [
{
"text": "⌛截止时间2024.10.31"
}
]
}
]
},
{
"id": 2,
"title": "AiDA X SFT AI时尚设计比赛2024",
"imgUrl": "/image/events/Fashion-Award-2024.png",
"textList": [
{
"paragraph": [
{
"text": "秉承着激发学生使用AI进行时尚设计的创新能力的初衷Code-Create和香港理工大学时装及纺织学院SFT共同举办了“AiDA X SFT AI时尚设计比赛2024”让学生们在比赛中获得宝贵的AiDA实践经验为未来的时尚设计行业打下了坚实的基础成为时尚界的AI先锋。"
}
]
},
{
"paragraph": [
{
"text": " 此次比赛面向全体SFT 学生最终获奖者将赢取丰厚奖金最高可达2万港币获得在BESFXXK的实习机会将与著名设计师Lim Jae Hyuk先生合作设计BESFXXK 系列,该系列将在纽约时装周和巴黎时装周上展出)及更多惊喜哦!扫描二维码获取更多比赛信息。"
}
]
}
]
}
]
}

View File

@@ -2488,3 +2488,25 @@ textarea:focus {
background: #ffffff; background: #ffffff;
color: #000; color: #000;
} }
.flex {
display: flex;
}
.flex-col {
flex-direction: column;
}
.flex-center {
justify-content: center;
align-items: center;
}
.align-center {
align-items: center;
}
.space-between {
justify-content: space-between;
}
.justify-center {
justify-content: center;
}
.flex-1{
flex: 1;
}

View File

@@ -2406,3 +2406,25 @@ textarea:focus{
color: #000; color: #000;
} }
} }
.flex {
display: flex;
}
.flex-col {
flex-direction: column;
}
.flex-center {
justify-content: center;
align-items: center;
}
.align-center {
align-items: center;
}
.space-between {
justify-content: space-between;
}
.justify-center {
justify-content: center;
}
.flex-1{
flex: 1;
}

File diff suppressed because it is too large Load Diff

View File

@@ -36,27 +36,9 @@
</div> </div>
<div class="admin_state_item"> <div class="admin_state_item">
<span>{{ $t("admin.Email") }}:</span> <span>{{ $t("admin.Email") }}:</span>
<input <SelectUser v-model="email" labelKey="email" valueKey="email" />
v-model="email"
:placeholder="$t('admin.enterEmail')"
@keydown.enter="gettrialList"
type="text"
style="width: 250px"
/>
</div>
<div class="admin_state_item">
<span>{{ $t("admin.UserName") }}:</span>
<a-select
v-model:value="ids"
mode="multiple"
style="width: 250px"
:filter-option="filterOption"
:placeholder="$t('admin.selectUserName')"
max-tag-count="responsive"
:options="allUserList"
@keydown.enter="gettrialList"
></a-select>
</div> </div>
<div class="admin_state_item"> <div class="admin_state_item">
<span>Organization Name:</span> <span>Organization Name:</span>
<input <input
@@ -100,8 +82,9 @@
import { useStore } from "vuex"; import { useStore } from "vuex";
import { Https } from "@/tool/https"; import { Https } from "@/tool/https";
import { useI18n } from "vue-i18n"; import { useI18n } from "vue-i18n";
import SelectUser from "@/component/common/SelectUser.vue";
export default defineComponent({ export default defineComponent({
components: {}, components: { SelectUser },
setup() { setup() {
const store: any = useStore(); const store: any = useStore();
let rangePickerValue: any = ref([]); let rangePickerValue: any = ref([]);
@@ -176,9 +159,6 @@
]; ];
}); });
let allUserList: any = computed(() => {
return store.state.adminPage.allUserList;
});
let ids = ref([]); let ids = ref([]);
let email = ref(""); let email = ref("");
let dataList: any = ref([]); let dataList: any = ref([]);
@@ -193,7 +173,6 @@
rangeTimeValue, rangeTimeValue,
columns, columns,
dataList, dataList,
allUserList,
ids, ids,
email, email,
renameData, renameData,
@@ -251,7 +230,7 @@
endTime: endDate, endTime: endDate,
startTime: startDate, startTime: startDate,
ids: ids, ids: ids,
email: this.email.trim(), email: this.email?.trim(),
organizationName: this.organizationName, organizationName: this.organizationName,
}; };
Https.axiosGet(Https.httpUrls.getDesignStatistic, { Https.axiosGet(Https.httpUrls.getDesignStatistic, {

View File

@@ -220,7 +220,7 @@ export default defineComponent({
changeEvent:this.changeEvent, changeEvent:this.changeEvent,
size:this.pageSize, size:this.pageSize,
page:this.currentPage, page:this.currentPage,
email:this.email.trim(), email:this.email?.trim(),
} }
Https.axiosPost(Https.httpUrls.getGenerateFrequency,data).then((rv: any) => { Https.axiosPost(Https.httpUrls.getGenerateFrequency,data).then((rv: any) => {
if (rv) { if (rv) {

View File

@@ -25,15 +25,7 @@
</div> </div>
<div class="admin_state_item"> <div class="admin_state_item">
<span>{{ $t('admin.UserName') }}:</span> <span>{{ $t('admin.UserName') }}:</span>
<a-select <SelectUser v-model="userIdList" labelKey="email" multiple />
v-model:value="userIdList"
mode="multiple"
style="width: 280px"
:filter-option="filterOption"
:placeholder="$t('admin.selectUserName')"
max-tag-count="responsive"
:options="dataList"
></a-select>
</div> </div>
</div> </div>
@@ -78,16 +70,15 @@ import { LabelLayout } from 'echarts/features';
import { useStore } from "vuex"; import { useStore } from "vuex";
import { CanvasRenderer } from 'echarts/renderers'; import { CanvasRenderer } from 'echarts/renderers';
import { useI18n } from 'vue-i18n' import { useI18n } from 'vue-i18n'
import SelectUser from '@/component/common/SelectUser.vue'
export default defineComponent({ export default defineComponent({
components: { components: {
SelectUser
}, },
setup() { setup() {
const {t} = useI18n() const {t} = useI18n()
const store:any = useStore() const store:any = useStore()
let filter:any = reactive({ let filter:any = reactive({
dataList:computed(()=>{
return store.state.adminPage.allUserList
}),
}) })
let filterData:any = reactive({ let filterData:any = reactive({

View File

@@ -32,27 +32,16 @@
</div> </div>
<div class="admin_state_item"> <div class="admin_state_item">
<span>Email:</span> <span>Email:</span>
<input <!-- <input
v-model="email" v-model="email"
placeholder="Please enter email" placeholder="Please enter email"
@keydown.enter="gettrialList" @keydown.enter="gettrialList"
type="text" type="text"
style="width: 250px" style="width: 250px"
/> /> -->
</div> <SelectUser v-model="email" labelKey="email" valueKey="email" />
<div class="admin_state_item">
<span>User Name:</span>
<a-select
v-model:value="ids"
mode="multiple"
style="width: 250px"
:filter-option="filterOption"
placeholder="Select Item..."
max-tag-count="responsive"
:options="allUserList"
@keydown.enter="gettrialList"
></a-select>
</div> </div>
<div class="admin_state_item"> <div class="admin_state_item">
<span>Organization Name:</span> <span>Organization Name:</span>
<input <input
@@ -95,8 +84,11 @@
import { defineComponent, ref, createVNode, computed } from "vue"; import { defineComponent, ref, createVNode, computed } from "vue";
import { useStore } from "vuex"; import { useStore } from "vuex";
import { Https } from "@/tool/https"; import { Https } from "@/tool/https";
import SelectUser from "@/component/common/SelectUser.vue";
export default defineComponent({ export default defineComponent({
components: {}, components: {
SelectUser
},
setup() { setup() {
const store: any = useStore(); const store: any = useStore();
let rangePickerValue: any = ref([]); let rangePickerValue: any = ref([]);
@@ -238,9 +230,6 @@
]; ];
}); });
let allUserList: any = computed(() => {
return store.state.adminPage.allUserList;
});
let ids = ref([]); let ids = ref([]);
let email = ref(""); let email = ref("");
let dataList: any = ref([]); let dataList: any = ref([]);
@@ -255,7 +244,6 @@
rangeTimeValue, rangeTimeValue,
columns, columns,
dataList, dataList,
allUserList,
ids, ids,
email, email,
renameData, renameData,
@@ -312,7 +300,7 @@
endTime: endDate, endTime: endDate,
startTime: startDate, startTime: startDate,
ids: ids, ids: ids,
email: this.email.trim(), email: this.email?.trim(),
organizationName: this.organizationName, organizationName: this.organizationName,
}; };
Https.axiosGet(Https.httpUrls.getDesignStatistic, { Https.axiosGet(Https.httpUrls.getDesignStatistic, {

View File

@@ -148,6 +148,7 @@
total: total, total: total,
showQuickJumper: true, showQuickJumper: true,
bordered: false, bordered: false,
showTotal: (total) => `Total Transaction: ${total}`
}" }"
> >
<template #bodyCell="{ column, text, record, index }"> <template #bodyCell="{ column, text, record, index }">
@@ -465,13 +466,16 @@ export default defineComponent({
(rv: any) => { (rv: any) => {
if (rv) { if (rv) {
// this.dataList = rv // this.dataList = rv
// console.log('rv----',rv);
filter.dataList = rv.content; filter.dataList = rv.content;
filterData.total = rv.total; filterData.total = rv.total;
filter.tableLoading = false; filter.tableLoading = false;
filterData.totalPayer = rv.content.reduce((total: number, item: any) => { filterData.totalPayer = rv.totalAmount;
const value = item && item.status === 'Success' ? parseFloat(item.payerTotal) : 0; // filterData.totalPayer = rv.content.reduce((total: number, item: any) => {
return total + (isNaN(value) ? 0 : value); // const value = item && item.status === 'Success' ? parseFloat(item.payerTotal) : 0;
}, 0); // return total + (isNaN(value) ? 0 : value);
// }, 0);
// this.workspaceItem.position = this.singleTypeList[0].label // this.workspaceItem.position = this.singleTypeList[0].label
} }

View File

@@ -139,9 +139,6 @@ export default defineComponent({
let filter: any = reactive({ let filter: any = reactive({
dataList: [], dataList: [],
tableLoading: false, tableLoading: false,
allUserList: computed(()=>{
return store.state.adminPage.allUserList
}),
rowSelection:computed(() => { rowSelection:computed(() => {
return { return {
selectedRowKeys: unref(selectedRowKeys), selectedRowKeys: unref(selectedRowKeys),

View File

@@ -40,27 +40,16 @@
</div> </div>
<div class="admin_state_item"> <div class="admin_state_item">
<span>Email:</span> <span>Email:</span>
<input <!-- <input
v-model="email" v-model="email"
placeholder="Please enter email" placeholder="Please enter email"
@keydown.enter="gettrialList" @keydown.enter="gettrialList"
type="text" type="text"
style="width: 250px" style="width: 250px"
/> /> -->
</div> <SelectUser v-model="email" labelKey="email" valueKey="email" />
<div class="admin_state_item">
<span>User Name:</span>
<a-select
v-model:value="ids"
mode="multiple"
style="width: 250px"
:filter-option="filterOption"
placeholder="Select Item..."
max-tag-count="responsive"
:options="allUserList"
@keydown.enter="gettrialList"
></a-select>
</div> </div>
<div class="admin_state_item"> <div class="admin_state_item">
<span>User Type:</span> <span>User Type:</span>
<a-select <a-select
@@ -160,16 +149,14 @@ import { formatTime } from "@/tool/util";
import { useStore } from "vuex"; import { useStore } from "vuex";
import { Https } from "@/tool/https"; import { Https } from "@/tool/https";
import allUserPoerationsVue from "./allUserPoerations.vue"; import allUserPoerationsVue from "./allUserPoerations.vue";
import SelectUser from '@/component/common/SelectUser.vue'
export default defineComponent({ export default defineComponent({
components: {allUserPoerationsVue,}, components: {allUserPoerationsVue,SelectUser},
setup() { setup() {
const store:any = useStore() const store:any = useStore()
let filter: any = reactive({ let filter: any = reactive({
dataList: [], dataList: [],
tableLoading: false, tableLoading: false,
allUserList: computed(()=>{
return store.state.adminPage.allUserList
}),
allCountry:[], allCountry:[],
isAwayOrUnfold:false isAwayOrUnfold:false
}); });
@@ -436,7 +423,7 @@ export default defineComponent({
page: filterData.currentPage, page: filterData.currentPage,
systemUser: filterData.systemUser, systemUser: filterData.systemUser,
country: filterData.country, country: filterData.country,
email: filterData.email.trim(), email: filterData.email?.trim(),
userType: filterData.userType, userType: filterData.userType,
ids: filterData.ids, ids: filterData.ids,
occupation: filterData.occupation, occupation: filterData.occupation,

View File

@@ -25,15 +25,7 @@
</div> </div>
<div class="admin_state_item"> <div class="admin_state_item">
<span>User:</span> <span>User:</span>
<a-select <SelectUser v-model="userIdList" labelKey="email" multiple />
v-model:value="userIdList"
mode="multiple"
style="width: 280px"
:filter-option="filterOption"
placeholder="Select Item..."
max-tag-count="responsive"
:options="dataList"
></a-select>
</div> </div>
</div> </div>
@@ -62,15 +54,14 @@ import { PieChart } from 'echarts/charts';
import { LabelLayout } from 'echarts/features'; import { LabelLayout } from 'echarts/features';
import { useStore } from "vuex"; import { useStore } from "vuex";
import { CanvasRenderer } from 'echarts/renderers'; import { CanvasRenderer } from 'echarts/renderers';
import SelectUser from '@/component/common/SelectUser.vue';
export default defineComponent({ export default defineComponent({
components: { components: {
SelectUser
}, },
setup() { setup() {
const store:any = useStore() const store:any = useStore()
let filter:any = reactive({ let filter:any = reactive({
dataList:computed(()=>{
return store.state.adminPage.allUserList
}),
}) })
let filterData:any = reactive({ let filterData:any = reactive({

View File

@@ -11,13 +11,13 @@
<a-form-item label="ID"> <a-form-item label="ID">
<a-input v-model:value="searchForm.id" allow-clear placeholder="Input the id" /> <a-input v-model:value="searchForm.id" allow-clear placeholder="Input the id" />
</a-form-item> </a-form-item>
<a-form-item label="Name"> <!-- <a-form-item label="Name">
<a-input <a-input
v-model:value="searchForm.name" v-model:value="searchForm.name"
allow-clear allow-clear
placeholder="Input the name" placeholder="Input the name"
/> />
</a-form-item> </a-form-item> -->
<a-form-item label="Time Range"> <a-form-item label="Time Range">
<a-range-picker <a-range-picker
v-model:value="searchForm.dateRange" v-model:value="searchForm.dateRange"
@@ -48,16 +48,7 @@
</a-select> </a-select>
</a-form-item> </a-form-item>
<a-form-item label="Admin Account"> <a-form-item label="Admin Account">
<!-- <a-select <SelectUser v-model="searchForm.adminAccId" labelKey="email" />
v-model:value="searchForm.adminAccId"
allow-clear
show-search
:filter-option="filterOption"
placeholder="Select Account"
style="width: 180px"
:options="allUserList"
></a-select> -->
<SelectUser v-model="testuser" />
</a-form-item> </a-form-item>
<a-form-item label="Status"> <a-form-item label="Status">
<a-select <a-select
@@ -71,12 +62,12 @@
</a-form-item> </a-form-item>
<a-form-item label="Country or Region"> <a-form-item label="Country or Region">
<a-select <a-select
v-model:value="searchForm.country" v-model:value="searchForm.countryOrRegion"
:allowClear="true" :allowClear="true"
show-search show-search
style="width: 250px" style="width: 250px"
:filter-option="filterOption" :filter-option="filterOption"
placeholder="Select Item..." placeholder="Select the country or region"
max-tag-count="responsive" max-tag-count="responsive"
:options="countryList" :options="countryList"
/> />
@@ -127,9 +118,6 @@
{{ record.status }} {{ record.status }}
</a-tag> </a-tag>
</template> </template>
<template v-if="column.key === 'adminAccId'">
{{ allUserList.find(item => item.value === record.adminAccId)?.label }}
</template>
<template v-else-if="column.key === 'actions'"> <template v-else-if="column.key === 'actions'">
<a-space> <a-space>
@@ -239,19 +227,26 @@
</div> </div>
<div class="admin_state_item"> <div class="admin_state_item">
<span> <span>
Admin Account: Country Or Region:
<span>*</span> <span>*</span>
</span> </span>
<a-select <a-select
v-model:value="formState.adminAccId" v-model:value="formState.countryOrRegion"
placeholder="Select the admin account" placeholder="Select the country or region"
allow-clear allow-clear
show-search show-search
:filter-option="filterOption" :filter-option="filterOption"
style="width: 250px" style="width: 250px"
:options="allUserList" :options="countryList"
></a-select> ></a-select>
</div> </div>
<div class="admin_state_item">
<span>
Admin Account:
<span>*</span>
</span>
<SelectUser ref="userRef" v-model="formState.adminAccId" labelKey="email" />
</div>
<div class="admin_state_item"> <div class="admin_state_item">
<span> <span>
Start Time: Start Time:
@@ -260,6 +255,7 @@
<a-date-picker <a-date-picker
v-model:value="formState.currentPeriodStart" v-model:value="formState.currentPeriodStart"
value-format="X" value-format="X"
:disabled="isEditMode && formState.status !== 'PENDING'"
style="width: 250px" style="width: 250px"
:disabledDate="disabledDate" :disabledDate="disabledDate"
:show-time="{ format: 'HH:mm' }" :show-time="{ format: 'HH:mm' }"
@@ -280,7 +276,9 @@
v-model:value="formState.currentPeriodEnd" v-model:value="formState.currentPeriodEnd"
value-format="X" value-format="X"
:show-time="{ format: 'HH:mm' }" :show-time="{ format: 'HH:mm' }"
:disabledDate="disabledDate" :disabledDate="disableEndDate"
:disabledTime="disableEndTime"
:show-now="!isEditMode"
style="width: 250px" style="width: 250px"
class="range_picker" class="range_picker"
placeholder="Select the end time" placeholder="Select the end time"
@@ -408,8 +406,6 @@ import type { FormInstance, Rule } from 'ant-design-vue/es/form'
import { debounce } from 'lodash-es' import { debounce } from 'lodash-es'
import dayjs, { Dayjs } from 'dayjs' import dayjs, { Dayjs } from 'dayjs'
const testuser = ref('')
type PlanStatus = 'PENDING' | 'ACTIVE' | 'EXPIRED' type PlanStatus = 'PENDING' | 'ACTIVE' | 'EXPIRED'
interface SubscriptionPlan { interface SubscriptionPlan {
id: number id: number
@@ -425,11 +421,8 @@ interface SubscriptionPlan {
endStamp: number endStamp: number
} }
const disabledDate = (current: Dayjs) => {
return current && current < dayjs().subtract(1, 'days').endOf('day')
}
const countryList = ref([]) const countryList = ref([])
const userRef = ref(null)
const searchForm = reactive({ const searchForm = reactive({
name: '', name: '',
@@ -439,6 +432,7 @@ const searchForm = reactive({
adminAccId: undefined as string | undefined, adminAccId: undefined as string | undefined,
status: [] as PlanStatus[] | [], status: [] as PlanStatus[] | [],
id: '', id: '',
countryOrRegion: null,
page: 1, page: 1,
size: 10, size: 10,
total: 0 total: 0
@@ -461,7 +455,8 @@ const formState = reactive({
adminAccId: undefined as string | undefined, adminAccId: undefined as string | undefined,
creditLimit: null as number | null, creditLimit: null as number | null,
accountNum: null as number | null, accountNum: null as number | null,
status: undefined as PlanStatus | undefined status: undefined as PlanStatus | undefined,
countryOrRegion: null as string | null
}) })
const organizationModalVisible = ref(false) const organizationModalVisible = ref(false)
@@ -496,6 +491,64 @@ const statusOption = ref([
} }
]) ])
const disabledDate = (current: Dayjs) => {
return current && current < dayjs().subtract(1, 'days').endOf('day')
}
const disableEndDate = (current: Dayjs) => {
if (isEditMode.value) {
const specificTime = dayjs(formState.currentPeriodEnd)
return current && current < dayjs(formState.currentPeriodEnd * 1000).startOf('day')
}
return disabledDate(current)
}
const range = (start: number, end: number) => {
const result = []
for (let i = start; i < end; i++) {
result.push(i)
}
return result
}
const disableEndTime = date => {
if (!formState.currentPeriodEnd || !isEditMode.value)
return {
disabledHours: () => [],
disabledMinutes: () => [],
disabledSeconds: () => []
}
const specificTime = dayjs.unix(formState.currentPeriodEnd)
if (date && date.isSame(specificTime, 'day')) {
// 如果是指定日期当天,禁用时间戳之前的时间
const hour = specificTime.hour()
const minute = specificTime.minute()
const second = specificTime.second()
return {
disabledHours: () => Array.from({ length: hour }, (_, i) => i), // 禁用小时之前
disabledMinutes: selectedHour => {
if (selectedHour === hour) {
return Array.from({ length: minute }, (_, i) => i) // 同小时,禁用分钟之前
}
return []
},
disabledSeconds: (selectedHour, selectedMinute) => {
if (selectedHour === hour && selectedMinute === minute) {
return Array.from({ length: second }, (_, i) => i) // 同小时分钟,禁用秒之前
}
return []
}
}
}
return {
disabledHours: () => [],
disabledMinutes: () => [],
disabledSeconds: () => []
}
}
const normalizeStatus = (status?: string): PlanStatus | undefined => { const normalizeStatus = (status?: string): PlanStatus | undefined => {
if (!status) return undefined if (!status) return undefined
const upper = status.toUpperCase() as PlanStatus const upper = status.toUpperCase() as PlanStatus
@@ -530,6 +583,14 @@ const columns = [
width: 120, width: 120,
ellipsis: true ellipsis: true
}, },
{
title: 'Country or Region',
dataIndex: 'countryOrRegion',
key: 'countryOrRegion',
align: 'center',
width: 120,
ellipsis: true
},
{ {
title: 'Start Time', title: 'Start Time',
dataIndex: 'currentPeriodStart', dataIndex: 'currentPeriodStart',
@@ -607,6 +668,7 @@ const resetFormState = () => {
formState.creditLimit = null formState.creditLimit = null
formState.accountNum = null formState.accountNum = null
formState.status = undefined formState.status = undefined
formState.countryOrRegion = null
} }
const changePage = (pagination: any) => { const changePage = (pagination: any) => {
@@ -628,12 +690,10 @@ const handleReset = () => {
searchForm.adminAccId = undefined searchForm.adminAccId = undefined
searchForm.status = [] searchForm.status = []
searchForm.id = '' searchForm.id = ''
searchForm.countryOrRegion = null
handleSearch() handleSearch()
} }
const allUserList = computed(() => {
return store.state.adminPage.allUserList
})
const openCreate = () => { const openCreate = () => {
modalTitle.value = 'New Subscription Plan' modalTitle.value = 'New Subscription Plan'
isEditMode.value = false isEditMode.value = false
@@ -653,6 +713,7 @@ const openEdit = (record: SubscriptionPlan) => {
formState.accountNum = (record as any).accountNum || null formState.accountNum = (record as any).accountNum || null
formState.status = record.status formState.status = record.status
formState.id = record.id formState.id = record.id
formState.countryOrRegion = (record as any).countryOrRegion || null
// 检查组织ID是否在已加载的组织列表中如果不在则添加临时项 // 检查组织ID是否在已加载的组织列表中如果不在则添加临时项
if (record.organizationId) { if (record.organizationId) {
@@ -662,7 +723,6 @@ const openEdit = (record: SubscriptionPlan) => {
String(org.id) === String(record.organizationId) String(org.id) === String(record.organizationId)
) )
if (!orgExists) { if (!orgExists) {
// 从表格数据中获取组织名称,如果存在则添加临时项
const orgName = (record as any).organizationName const orgName = (record as any).organizationName
if (orgName) { if (orgName) {
organizationOptions.value = [ organizationOptions.value = [
@@ -675,8 +735,16 @@ const openEdit = (record: SubscriptionPlan) => {
} }
} }
} }
modalVisible.value = true modalVisible.value = true
if (record.adminAccId) {
nextTick(() => {
userRef.value.patchList({
label: record.name,
value: record.adminAccId,
email: record.adminAccEmail
})
})
}
} }
const validateForm = (): boolean => { const validateForm = (): boolean => {
@@ -971,7 +1039,7 @@ const filterOption = (input: string, option: any) => {
} }
.subscriptionPlan_modal { .subscriptionPlan_modal {
.form_content{ .form_content {
width: 100%; width: 100%;
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;

View File

@@ -37,26 +37,7 @@
</div> </div>
<div class="admin_state_item"> <div class="admin_state_item">
<span>Email:</span> <span>Email:</span>
<input <SelectUser v-model="email" labelKey="email" valueKey="email" />
v-model="email"
placeholder="Please enter email"
@keydown.enter="gettrialList"
type="text"
style="width: 250px"
/>
</div>
<div class="admin_state_item">
<span>User Name:</span>
<a-select
v-model:value="ids"
mode="multiple"
style="width: 250px"
:filter-option="filterOption"
placeholder="Select Item..."
max-tag-count="responsive"
:options="allUserList"
@keydown.enter="gettrialList"
></a-select>
</div> </div>
</div> </div>
<div class="admin_search"> <div class="admin_search">
@@ -96,17 +77,17 @@ import { defineComponent, ref, createVNode, computed, reactive, toRefs, onMounte
import { formatTime } from "@/tool/util"; import { formatTime } from "@/tool/util";
import { useStore } from "vuex"; import { useStore } from "vuex";
import { Https } from "@/tool/https"; import { Https } from "@/tool/https";
import SelectUser from '@/component/common/SelectUser.vue'
export default defineComponent({ export default defineComponent({
components: { components: {
SelectUser
}, },
setup() { setup() {
const store:any = useStore() const store:any = useStore()
let filter:any = reactive({ let filter:any = reactive({
dataList:[], dataList:[],
tableLoading:false, tableLoading:false,
allUserList: computed(()=>{
return store.state.adminPage.allUserList
}),
allCountry:[] allCountry:[]
}) })
let filterData:any = reactive({ let filterData:any = reactive({

View File

@@ -207,7 +207,8 @@ export class BackgroundSizeCommand extends Command {
this.bgLayer = this.layers.value.find((layer) => layer.isBackground); this.bgLayer = this.layers.value.find((layer) => layer.isBackground);
// 记录原尺寸 // 记录原尺寸
this.backgroundObject = findObjectById(this.canvas, this.bgLayer.fabricObject.id).object; this.bgId = this.bgLayer.fabricObject?.id || this.bgLayer.fabricObjects?.[0]?.id;
this.backgroundObject = findObjectById(this.canvas, this.bgId).object;
this.oldWidth = this.backgroundObject.width; this.oldWidth = this.backgroundObject.width;
this.oldHeight = this.backgroundObject.height; this.oldHeight = this.backgroundObject.height;

View File

@@ -50,7 +50,6 @@ export class FillGroupLayerBackgroundCommand extends Command {
); );
this.layer = layer; this.layer = layer;
this.parent = parent; this.parent = parent;
console.log("==========",layer);
if (!layer) return false; if (!layer) return false;
if(!isUndo){ if(!isUndo){
@@ -107,7 +106,6 @@ export class FillGroupLayerBackgroundCommand extends Command {
}); });
} }
} }
// 判断fabricObjects是否是组对象 // 判断fabricObjects是否是组对象
const firstObj = layer.fabricObjects?.[0] || null; const firstObj = layer.fabricObjects?.[0] || null;
// 如果没有找到第一个对象,则直接添加到当前画布 // 如果没有找到第一个对象,则直接添加到当前画布
@@ -174,8 +172,8 @@ export class FillGroupLayerBackgroundCommand extends Command {
} }
const canvasObj = findObjectById(this.canvas, firstObj?.id)?.object; const canvasObj = findObjectById(this.canvas, firstObj?.id)?.object;
if ( if (
(canvasObj && canvasObj.type === "group") || canvasObj && (canvasObj.type === "group" ||
canvasObj._objects?.length > 0 canvasObj._objects?.length > 0)
) { ) {
this.newFill.set({ this.newFill.set({
left: 0, left: 0,
@@ -343,10 +341,6 @@ export class FillGroupLayerBackgroundCommand extends Command {
minTop = Infinity, minTop = Infinity,
maxRight = -Infinity, maxRight = -Infinity,
maxBottom = -Infinity; maxBottom = -Infinity;
console.log(
"计算当前所有对象的边界信息:===>",
this.originalfabricObjects.length
);
this.originalfabricObjects?.forEach((obj) => { this.originalfabricObjects?.forEach((obj) => {
const { object } = findObjectById(this.canvas, obj.id) || {}; const { object } = findObjectById(this.canvas, obj.id) || {};
if (object) { if (object) {

View File

@@ -7,11 +7,11 @@ import {
insertObjectAtZIndex, insertObjectAtZIndex,
removeCanvasObjectByObject, removeCanvasObjectByObject,
createPatternTransform, createPatternTransform,
getTransformScaleAngle,
imageAddGapToCanvas,
} from "../utils/helper"; } from "../utils/helper";
import { restoreFabricObject } from "../utils/objectHelper"; import { restoreFabricObject } from "../utils/objectHelper";
const scale = 0.3;// 默认缩放比例
export const FillSourceToBase64 = (source) => { export const FillSourceToBase64 = (source) => {
if (source?.toDataURL) { if (source?.toDataURL) {
return source.toDataURL?.(); return source.toDataURL?.();
@@ -38,7 +38,6 @@ export class FillRepeatCommand extends Command {
this.fillRepeat = options.fillRepeat; this.fillRepeat = options.fillRepeat;
this.oldObjects = null; this.oldObjects = null;
this.oldLocked = null; this.oldLocked = null;
this.oldIsDisableUnlock = null;
} }
async execute() { async execute() {
@@ -52,83 +51,121 @@ export class FillRepeatCommand extends Command {
console.warn("当前对象不能平铺", object.type); console.warn("当前对象不能平铺", object.type);
return false; return false;
} }
console.log("===========", object.toObject(["id", "layerId", "layerName"]))
this.oldObjects = object; this.oldObjects = object;
const img = await new Promise((resolve, reject) => { if (this.fillRepeat === "no-repeat") {
if (object.type === "rect") { const fill_ = object.fill_;
let source = object.fill.source; const image = await new Promise((resolve, reject) => {
resolve(source); fabric.Image.fromURL(
} else if (object.type === "image") { fill_.source,
// resolve(object.getElement()); v => resolve(v),
// fabric.Image.fromURL( { crossOrigin: "anonymous" }
// object.src, );
// v => resolve(v),
// { crossOrigin: "anonymous" }
// );
const imgElement = object.getElement();
// 创建透明 Canvas
const tcanvas = document.createElement('canvas');
tcanvas.width = imgElement.width;
tcanvas.height = imgElement.height;
const ctx = tcanvas.getContext('2d');
ctx.clearRect(0, 0, tcanvas.width, tcanvas.height);
ctx.drawImage(imgElement, 0, 0);
resolve(tcanvas);
}
});
const fill_ = {
source: FillSourceToBase64(img),
gapX: 0,
gapY: 0,
width: img.width,
height: img.height,
};
const bgObject = this.canvasManager.getBackgroundLayerObject();
const pattern = new fabric.Pattern({
source: img,
repeat: this.fillRepeat,
patternTransform: object.fill?.hasOwnProperty("patternTransform") ? object.fill.patternTransform : createPatternTransform(scale, 0),
offsetX: object.fill?.hasOwnProperty("offsetX") ? object.fill.offsetX : bgObject.width / 2, // 水平偏移
offsetY: object.fill?.hasOwnProperty("offsetY") ? object.fill.offsetY : bgObject.height / 2, // 垂直偏移
});
const rect = new fabric.Rect({
id: object.id,
layerId: object.layerId,
layerName: object.layerName,
fill_,
});
layer.fabricObjects = [rect.toObject(["id", "layerId", "layerName"])];
this.oldLocked = layer.locked;
// this.oldIsDisableUnlock = layer.isDisableUnlock;
// layer.isDisableUnlock = true;
if (this.oldObjects.type === "rect") {
rect.set({
width: object.width,
height: object.height,
top: object.top,
left: object.left,
originX: object.originX,
originY: object.originY,
angle: object.angle,
scaleX: object.scaleX,
scaleY: object.scaleY,
flipX: object.flipX,
flipY: object.flipY,
}); });
image.set({
...this.copyObjectProperties(object),
...(fill_.originalInfo || {
top: object.top,
left: object.left,
})
});
layer.fabricObjects = [image.toObject(["id", "layerId", "layerName"])];
// this.oldLocked = layer.locked;
// layer.locked = false;
this.canvas.add(image);
this.canvas.remove(object);
} else { } else {
rect.set({ const img = await new Promise((resolve, reject) => {
width: bgObject.width, if (object.type === "rect") {
height: bgObject.height, let source = object.fill.source;
top: bgObject.top, resolve(source);
left: bgObject.left, } else if (object.type === "image") {
originX: bgObject.originX, const imgElement = object.getElement();
originY: bgObject.originY, // 创建透明 Canvas
const tcanvas = document.createElement('canvas');
tcanvas.width = imgElement.width;
tcanvas.height = imgElement.height;
const ctx = tcanvas.getContext('2d');
ctx.clearRect(0, 0, tcanvas.width, tcanvas.height);
ctx.drawImage(imgElement, 0, 0);
resolve(tcanvas);
}
}); });
layer.locked = true; const fill_ = object.fill_ || {
source: FillSourceToBase64(img),
gapX: 0,
gapY: 0,
width: img.width,
height: img.height,
originalInfo: {
top: object.top,
left: object.left,
scaleX: object.scaleX,
scaleY: object.scaleY,
width: object.width,
height: object.height,
}
};
const fdObject = this.canvasManager.getFixedLayerObject();
const bgObject = this.canvasManager.getBackgroundLayerObject();
const tObject = fdObject || bgObject;
const tWidth = tObject.width;
const tHeight = tObject.height;
// const offsetX = object.fill?.hasOwnProperty("offsetX") ? object.fill.offsetX : tObject.width / 2;
// const offsetY = object.fill?.hasOwnProperty("offsetY") ? object.fill.offsetY : tObject.height / 2;
const scaleX_ = tWidth / img.width / 5;
const scaleY_ = tHeight / img.height / 5;
const scale_ = tWidth > tHeight ? scaleX_ : scaleY_;
const patternTransform = object.fill?.hasOwnProperty("patternTransform") ? object.fill.patternTransform : createPatternTransform(scale_, 0);
const scale = getTransformScaleAngle(patternTransform).scale;
const offsetX = tWidth / 2 - img.width * scale / 2;
const offsetY = tHeight / 2 - img.height * scale / 2;
const pattern = new fabric.Pattern({
source: img,
repeat: this.fillRepeat,
patternTransform,
offsetX, // 水平偏移
offsetY, // 垂直偏移
});
const rect = new fabric.Rect({
...this.copyObjectProperties(object),
fill_,
});
layer.fabricObjects = [rect.toObject(["id", "layerId", "layerName"])];
// this.oldLocked = layer.locked;
if (this.oldObjects.type === "rect") {
rect.set({
width: object.width,
height: object.height,
top: object.top,
left: object.left,
originX: object.originX,
originY: object.originY,
angle: object.angle,
scaleX: object.scaleX,
scaleY: object.scaleY,
flipX: object.flipX,
flipY: object.flipY,
});
} else {
let scaleX = tObject.scaleX || 1;
let scaleY = tObject.scaleY || 1;
rect.set({
width: tWidth,
height: tHeight,
top: tObject.top - tHeight * scaleY / 2,
left: tObject.left - tWidth * scaleX / 2,
scaleX,
scaleY,
});
// layer.locked = true;
}
rect.set("fill", pattern);
this.canvas.add(rect);
this.canvas.remove(object);
} }
rect.set("fill", pattern);
this.canvas.add(rect);
this.canvas.remove(object);
await this.layerManager?.updateLayersObjectsInteractivity(); await this.layerManager?.updateLayersObjectsInteractivity();
await this.layerManager?.sortLayersWithTool?.(); await this.layerManager?.sortLayersWithTool?.();
await this.canvasManager.thumbnailManager?.generateLayerThumbnail( await this.canvasManager.thumbnailManager?.generateLayerThumbnail(
@@ -152,14 +189,23 @@ export class FillRepeatCommand extends Command {
this.canvas.remove(object); this.canvas.remove(object);
this.canvas.add(this.oldObjects); this.canvas.add(this.oldObjects);
layer.fabricObjects = [this.oldObjects.toObject(["id", "layerId", "layerName"])]; layer.fabricObjects = [this.oldObjects.toObject(["id", "layerId", "layerName"])];
layer.locked = this.oldLocked; // layer.locked = this.oldLocked;
// layer.isDisableUnlock = this.oldIsDisableUnlock;
await this.layerManager?.updateLayersObjectsInteractivity(); await this.layerManager?.updateLayersObjectsInteractivity();
await this.layerManager?.sortLayersWithTool?.(); await this.layerManager?.sortLayersWithTool?.();
this.canvas.renderAll(); this.canvas.renderAll();
this.canvasManager.thumbnailManager?.generateLayerThumbnail(this.layerId); this.canvasManager.thumbnailManager?.generateLayerThumbnail(this.layerId);
return true; return true;
} }
// 复制原对象的属性
copyObjectProperties(object) {
return {
id: object.id,
layerId: object.layerId,
layerName: object.layerName,
isPrintTrims: object.isPrintTrims,
}
}
} }
@@ -198,6 +244,10 @@ export class FillRepeatChangeCommand extends Command {
...this.newPattern, ...this.newPattern,
}); });
object.set("fill", pattern); object.set("fill", pattern);
if (object.globalCompositeOperation_) {
object.globalCompositeOperation = object.globalCompositeOperation_;
object.globalCompositeOperation_ = null;
}
this.canvas.renderAll(); this.canvas.renderAll();
return true; return true;
} }
@@ -244,7 +294,7 @@ export class FillRepeatGapChangeCommand extends Command {
this.oldGapY = null; this.oldGapY = null;
} }
async execute(isUndo = false) { async execute(isCommand = true, isUndo = false) {
const { layer } = findLayerRecursively(this.layers.value, this.layerId); const { layer } = findLayerRecursively(this.layers.value, this.layerId);
if (!layer || !layer.fabricObjects || layer.fabricObjects.length === 0) { if (!layer || !layer.fabricObjects || layer.fabricObjects.length === 0) {
console.warn("图层不存在或没有 fabric 对象"); console.warn("图层不存在或没有 fabric 对象");
@@ -275,21 +325,18 @@ export class FillRepeatGapChangeCommand extends Command {
object.fill_.gapY = this.newGapY; object.fill_.gapY = this.newGapY;
} }
const image = new Image(); const image = new Image();
image.crossOrigin = "anonymous";
image.src = object.fill_.source; image.src = object.fill_.source;
await image.decode(); await image.decode();
object.fill_.width = image.width; object.fill_.width = image.width;
object.fill_.height = image.height; object.fill_.height = image.height;
// 创建透明 Canvas
const tcanvas = document.createElement('canvas');
tcanvas.width = image.width + object.fill_.gapX;
tcanvas.height = image.height + object.fill_.gapY;
const ctx = tcanvas.getContext('2d');
ctx.clearRect(0, 0, tcanvas.width, tcanvas.height);
ctx.drawImage(image, 0, 0);
const fill = object.get("fill"); const fill = object.get("fill");
fill.source = tcanvas; fill.source = imageAddGapToCanvas(image, object.fill_.gapX, object.fill_.gapY);
object.set("fill", new fabric.Pattern(fill)); object.set("fill", new fabric.Pattern(fill));
if (isCommand && object.globalCompositeOperation_) {
object.globalCompositeOperation = object.globalCompositeOperation_;
object.globalCompositeOperation_ = null;
}
this.canvas.renderAll(); this.canvas.renderAll();
return true; return true;
} }
@@ -299,7 +346,7 @@ export class FillRepeatGapChangeCommand extends Command {
console.warn("没有旧间隙可恢复"); console.warn("没有旧间隙可恢复");
return false; return false;
} }
await this.execute(true); await this.execute(true, true);
return true; return true;
} }

View File

@@ -147,11 +147,11 @@ export class LassoCutoutCommand extends CompositeCommand {
} }
// 确定源图层 // 确定源图层
const sourceLayer = this.layerManager.getActiveLayer(); // const sourceLayer = this.layerManager.getActiveLayer();
if (!sourceLayer) { // if (!sourceLayer) {
console.error("无法执行套索抠图:源图层无效"); // console.error("无法执行套索抠图:源图层无效");
return false; // return false;
} // }
// 获取源图层的所有对象(包括子图层) // 获取源图层的所有对象(包括子图层)
// const sourceObjects = this._getLayerObjects(sourceLayer); // const sourceObjects = this._getLayerObjects(sourceLayer);
@@ -225,7 +225,7 @@ export class LassoCutoutCommand extends CompositeCommand {
const layers = this.layerManager.layers.value; const layers = this.layerManager.layers.value;
var topLayerIndex = 0; var topLayerIndex = 0;
layers.forEach((layer, index) => { if(this.originalLayer)layers.forEach((layer, index) => {
if (layer.id === this.originalLayer.id) { if (layer.id === this.originalLayer.id) {
topLayerIndex = index; topLayerIndex = index;
}else if (layer.children.length > 0) { }else if (layer.children.length > 0) {

View File

@@ -144,7 +144,7 @@ export class AddLayerCommand extends Command {
// 先在一级图层中查找 // 先在一级图层中查找
for (let i = 0; i < layers.length; i++) { for (let i = 0; i < layers.length; i++) {
const layer = layers[i]; const layer = layers[i];
if (layer.isPrintTrimsGroup) continue;
if (layer.id === layerId) { if (layer.id === layerId) {
return { return {
layer: layer, layer: layer,
@@ -280,8 +280,13 @@ export class PasteLayerCommand extends Command {
isCut: undefined, isCut: undefined,
serializedObjects: undefined, serializedObjects: undefined,
}; };
if(this.newLayer.isPrintTrims){
if (this.insertIndex !== undefined && this.insertIndex !== null) { this.layers.value.forEach((layer) => {
if (layer.isPrintTrimsGroup) {
layer.children.unshift(this.newLayer);
}
})
}else if (this.insertIndex !== undefined && this.insertIndex !== null) {
this.layers.value.splice(this.insertIndex, 0, this.newLayer); this.layers.value.splice(this.insertIndex, 0, this.newLayer);
} else { } else {
this.layers.value.push(this.newLayer); this.layers.value.push(this.newLayer);
@@ -872,13 +877,13 @@ export class ToggleChildLayerVisibilityCommand extends Command {
// this.oldVisibility = this.childLayer ? this.childLayer.visible : null; // this.oldVisibility = this.childLayer ? this.childLayer.visible : null;
} }
async execute() { async execute(visible) {
if (!this.childLayer) { if (!this.childLayer) {
throw new Error("找不到要切换可见性的子图层"); throw new Error("找不到要切换可见性的子图层");
} }
// 切换可见性 // 切换可见性
this.childLayer.visible = !this.childLayer.visible; this.childLayer.visible = typeof visible === "boolean" ? visible : !this.childLayer.visible;
// 更新画布上图层对象的可见性 // 更新画布上图层对象的可见性
if (this.canvas) { if (this.canvas) {
@@ -3684,7 +3689,7 @@ export class ChangeFixedImageCommand extends Command {
opacity: currentObj.opacity, opacity: currentObj.opacity,
}; };
console.log(`保存渲染顺序: z-index = ${this.previousZIndex}`); // console.log(`保存渲染顺序: z-index = ${this.previousZIndex}`);
} }
} }
@@ -3794,7 +3799,7 @@ export class ChangeFixedImageCommand extends Command {
false false
); );
if (insertSuccess) { if (insertSuccess) {
console.log(`新图像插入到z-index位置: ${this.previousZIndex}`); // console.log(`新图像插入到z-index位置: ${this.previousZIndex}`);
} else { } else {
// 如果插入失败,回退到普通添加 // 如果插入失败,回退到普通添加
this.canvas.add(newImage); this.canvas.add(newImage);

View File

@@ -600,7 +600,7 @@ export class ChangeFixedImageCommand extends Command {
opacity: currentObj.opacity, opacity: currentObj.opacity,
}; };
console.log(`保存渲染顺序: z-index = ${this.previousZIndex}`); // console.log(`保存渲染顺序: z-index = ${this.previousZIndex}`);
} }
} }
@@ -716,7 +716,7 @@ export class ChangeFixedImageCommand extends Command {
false false
); );
if (insertSuccess) { if (insertSuccess) {
console.log(`新图像插入到z-index位置: ${this.previousZIndex}`); // console.log(`新图像插入到z-index位置: ${this.previousZIndex}`);
} else { } else {
// 如果插入失败,回退到普通添加 // 如果插入失败,回退到普通添加
this.canvas.add(newImage); this.canvas.add(newImage);

View File

@@ -0,0 +1,56 @@
import { Command } from "./Command.js";
/**
* 部件绘制命令
*/
export class PartDrawCommand extends Command {
constructor(options) {
super({
name: "部件绘制命令",
saveState: false,
});
this.canvas = options.canvas;
this.partManager = options.partManager;
this.partCanvas = options.partCanvas;
this.oldPartCanvas = this.partManager.partCanvas;
}
execute() {
this.partManager.drawPartCanvas(this.partCanvas);
return true;
}
undo() {
this.partManager.drawPartCanvas(this.oldPartCanvas);
return true;
}
}
/**
* 部件点选绘制命令
*/
export class PartPointDrawCommand extends Command {
constructor(options) {
super({
name: "部件点选绘制命令",
saveState: false,
});
this.canvas = options.canvas;
this.partManager = options.partManager;
this.partCanvas = options.partCanvas;
this.pointList = options.pointList;
this.oldPartCanvas = this.partManager.partCanvas;
this.oldPointList = [...this.partManager.pointList];
}
async execute() {
const list = [...this.pointList];
const canvas = this.partCanvas;
const res = await this.partManager.pointDrawPartCanvas(list, canvas);
return res;
}
async undo() {
const list = [...this.oldPointList];
const canvas = this.oldPartCanvas;
const res = await this.partManager.pointDrawPartCanvas(list, canvas);
return res;
}
}

View File

@@ -285,17 +285,15 @@ export class RasterizeLayerCommand extends Command {
// 提取排序后的对象 // 提取排序后的对象
this.objectsToRasterize = objectsWithZIndex.map((item) => item.object); this.objectsToRasterize = objectsWithZIndex.map((item) => item.object);
console.log( // console.log(`📊 收集到 ${this.layersToRasterize.length} 个图层,${this.objectsToRasterize.length} 个对象进行组合` );
`📊 收集到 ${this.layersToRasterize.length} 个图层,${this.objectsToRasterize.length} 个对象进行组合` // console.log(
); // "🔢 对象z-index顺序:",
console.log( // objectsWithZIndex.map((item) => ({
"🔢 对象z-index顺序:", // id: item.object.id,
objectsWithZIndex.map((item) => ({ // type: item.object.type,
id: item.object.id, // zIndex: item.zIndex,
type: item.object.type, // }))
zIndex: item.zIndex, // );
}))
);
} }
/** /**
@@ -611,17 +609,17 @@ export class ExportLayerToImageCommand extends Command {
// 提取排序后的对象 // 提取排序后的对象
this.objectsToRasterize = objectsWithZIndex.map((item) => item.object); this.objectsToRasterize = objectsWithZIndex.map((item) => item.object);
console.log( // console.log(
`📊 收集到 ${this.layersToRasterize.length} 个图层,${this.objectsToRasterize.length} 个对象进行组合` // `📊 收集到 ${this.layersToRasterize.length} 个图层,${this.objectsToRasterize.length} 个对象进行组合`
); // );
console.log( // console.log(
"🔢 对象z-index顺序:", // "🔢 对象z-index顺序:",
objectsWithZIndex.map((item) => ({ // objectsWithZIndex.map((item) => ({
id: item.object.id, // id: item.object.id,
type: item.object.type, // type: item.object.type,
zIndex: item.zIndex, // zIndex: item.zIndex,
})) // }))
); // );
} }
/** /**

Some files were not shown because too many files have changed in this diff Show More