395 Commits

Author SHA1 Message Date
shahaibo
9e28d579d1 Merge branch 'dev/dev' into dev/dev_shb
# Conflicts:
#	src/main/java/com/ai/da/controller/AccountController.java
#	src/main/java/com/ai/da/controller/SavedCollectionController.java
#	src/main/java/com/ai/da/service/AccountService.java
#	src/main/java/com/ai/da/service/UserLikeGroupService.java
#	src/main/java/com/ai/da/service/impl/AccountServiceImpl.java
2024-12-09 13:44:07 +08:00
shahaibo
1c96522447 TASK:AiDA 2024-12-09 13:31:30 +08:00
ea0332851d Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-12-02 14:35:20 +08:00
a25a7dc023 high || fast 生成次数修改 2024-12-02 14:34:10 +08:00
shahaibo
b4fe1ca199 TASK:toproductimage prompt; 2024-12-02 13:51:46 +08:00
shahaibo
b315ae5644 TASK:toproductimage prompt; 2024-12-02 12:02:19 +08:00
徐佩
8d6e3e9644 sketchboard-prompt 修改 2024-12-01 19:48:12 +08:00
徐佩
be1119be6f bugfix : fast || high 2024-12-01 16:51:38 +08:00
徐佩
b836e7fd67 bugfix : fast || high 2024-12-01 16:32:51 +08:00
a237b4041d 模型选择 添加high || fast 2024-11-29 15:09:34 +08:00
ea4cd29723 to dev 2024-11-28 17:26:53 +08:00
13397fa1f7 to dev 2024-11-28 17:22:57 +08:00
2fab472150 to dev 2024-11-28 17:21:58 +08:00
8c71b4845a Merge branch 'release/3.0' into dev/dev
# Conflicts:
#	src/main/java/com/ai/da/service/impl/AccountServiceImpl.java
2024-11-28 17:19:40 +08:00
b70f909a32 优化-自动将Code-Create注册的新用户添加到AiDA 2024-11-28 17:14:11 +08:00
shahaibo
9f064609e7 TASK:谷歌登录 2024-11-13 15:45:40 +08:00
shahaibo
fd10d4dbc4 TASK:谷歌登录 2024-11-13 15:44:48 +08:00
shahaibo
fadb5faf0d TASK:谷歌登录 2024-11-12 15:34:43 +08:00
e5e514b522 ws优化 2024-11-11 17:31:55 +08:00
74e6d5a1da ws 联调修改 2024-11-11 17:24:49 +08:00
3cf0570912 ws 引入心跳 2024-11-11 16:34:55 +08:00
shahaibo
8da51a0a82 TASK:谷歌登录 2024-11-11 16:08:49 +08:00
shahaibo
37ff7fbb91 Merge remote-tracking branch 'origin/dev/dev' into dev/dev
# Conflicts:
#	src/main/java/com/ai/da/service/AccountService.java
2024-11-11 16:06:21 +08:00
shahaibo
8c20b51e13 TASK:谷歌登录 2024-11-11 16:04:26 +08:00
391a28d659 ws 2024-11-11 15:21:35 +08:00
4535fb7dfb ws 2024-11-11 15:07:02 +08:00
546d1b4c44 ws 设置session2分钟超时,以及心跳回复 2024-11-11 15:03:21 +08:00
5fe605c130 长连接 关闭日志打印 2024-11-11 10:45:57 +08:00
4408c0ecc6 to dev 2024-11-11 10:29:06 +08:00
49f08d1191 管理员系统优化-1 2024-11-06 17:51:51 +08:00
903bafb245 管理员系统优化 2024-11-06 17:27:16 +08:00
59b02b3f28 to prod 2024-11-04 10:49:29 +08:00
4a23e33080 BUGFIX:作品删除后,获取点赞详细报错 2024-11-04 10:42:35 +08:00
1e1b06fc48 chat-robot返回sketch图片地址变更 2024-10-29 16:53:17 +08:00
7c56d2bf4e to dev 2024-10-29 10:33:48 +08:00
4add0a806c 游客转试用用户,添加积分 2024-10-29 10:25:36 +08:00
c9bb7fe502 to prod 2024-10-29 10:03:21 +08:00
a8a7a129c9 Merge branch 'dev/dev' into release/3.0 2024-10-29 09:59:39 +08:00
c3c5532cb5 Merge branch 'dev/dev_xp' into dev/dev 2024-10-29 09:58:43 +08:00
78bfc16287 BUGFIX:imageToSketch 积分扣除校验 2024-10-29 09:57:34 +08:00
shahaibo
6c6162df74 BUGFIX:定时任务开启; 2024-10-23 08:54:00 +08:00
shahaibo
a837aff0fb BUGFIX:定时任务开启; 2024-10-22 10:06:12 +08:00
shahaibo
f673afc7fc TASK:配置 2024-10-21 10:59:50 +08:00
shahaibo
0ea96c728c BUGFIX:模特预览默认颜色添加; 2024-10-20 13:39:01 +08:00
shahaibo
77e71e3296 TASK:aida作品集查询; 2024-10-20 13:27:45 +08:00
shahaibo
ce870b9acf TASK:aida; 2024-10-20 11:50:52 +08:00
shahaibo
7f889b54e0 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-10-20 10:52:24 +08:00
shahaibo
ebd596d0d2 TASK:aida; 2024-10-20 10:52:14 +08:00
04ce95caa4 添加preview_submit字段to python 2024-10-15 10:44:26 +08:00
29bf172187 取消用户自定义mask的功能 2024-10-15 10:30:02 +08:00
shahaibo
41619febb9 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-10-14 11:18:30 +08:00
shahaibo
0f4b769d49 BUGFIX:moodboard合成图 裁剪; 2024-10-14 11:18:18 +08:00
66cd8217b9 更新undividedLayer临时访问地址缓存 2024-10-14 11:16:57 +08:00
e684c4e547 Merge branch 'release/3.0' into dev/dev
# Conflicts:
#	src/main/java/com/ai/da/common/constant/CommonConstant.java
#	src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java
#	src/main/java/com/ai/da/controller/PortfolioController.java
#	src/main/java/com/ai/da/model/dto/QueryPortfolioPageDTO.java
#	src/main/java/com/ai/da/service/PortfolioService.java
#	src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java
#	src/main/resources/messages_en.properties
#	src/main/resources/messages_zh.properties
2024-10-10 23:26:20 +08:00
c439f41d69 bugfix:参与活动作品为0时查询出错 2024-10-09 16:42:45 +08:00
823e96b014 发布准备 2024-10-09 15:47:29 +08:00
0cca24ee30 修改环境及打开监听 2024-10-09 15:44:47 +08:00
66cccd0867 添加校验,二创作品不能参与活动 2024-10-09 15:40:29 +08:00
463ddf3cb2 1、为发布的作品添加标签
2、修改标签
3、不允许用户重复参与活动
4、查询所有参与活动的作品
2024-10-09 13:51:16 +08:00
shahaibo
f0e0987f31 BUGFIX:发布作品返回作品ID; 2024-10-09 13:10:48 +08:00
shahaibo
16bea58ab5 BUGFIX:更新作品集作品名重复判断; 2024-10-09 11:43:05 +08:00
shahaibo
f2bbbaaeb6 BUGFIX:history retrieval返回新增portfolio信息; 2024-10-09 11:34:04 +08:00
shahaibo
5098f6f4a1 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-10-08 17:07:43 +08:00
shahaibo
bc1815ae1b TASK:pantone提示词; 2024-10-08 17:07:30 +08:00
6256c90958 bugfix:修改提取的sketch,图片后缀问题 2024-10-08 16:36:48 +08:00
f0bfe249e0 bugfix:修改提取的sketch,图片后缀问题 2024-10-08 16:17:45 +08:00
7bbfd7c506 Merge branch 'dev/dev_xp' into dev/dev 2024-10-08 15:49:39 +08:00
3c7cbe28a1 design single preview_submit 2024-10-08 15:48:53 +08:00
c834aacf3a Merge branch 'dev/dev_xp' into dev/dev 2024-10-08 15:44:36 +08:00
90b0ef41e3 bugfix:修改提取出的sketch 2024-10-08 15:44:01 +08:00
shahaibo
2aeeec4468 TASK:裁剪; 2024-10-08 14:05:13 +08:00
a7c5723e10 保存修改 2024-10-08 13:34:10 +08:00
shahaibo
ba595b9d2c Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-10-08 13:18:12 +08:00
shahaibo
d9118aaf93 TASK:AiDA workshop活动; 2024-10-08 13:17:55 +08:00
1bdc71998b 按标签查询作品 2024-10-08 13:13:13 +08:00
a597f7a67a 为作品添加标签 2024-10-07 21:27:37 +08:00
195964ef5a 重新获取修改后的sketch的临时访问地址 2024-10-07 11:28:48 +08:00
shahaibo
c27ca77717 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-10-06 14:33:44 +08:00
shahaibo
7d0d460e5c bugfix:redesign bug; 2024-10-06 14:33:31 +08:00
5ac9df3056 Merge branch 'dev/dev_xp' into dev/dev 2024-10-06 14:28:18 +08:00
b8d64f1f28 获取指定用户的个人主页作品 2024-10-06 14:27:55 +08:00
c8dd9664be Merge branch 'dev/dev_xp' into dev/dev 2024-10-04 16:10:05 +08:00
8899a3a6bb SketchStyle 去除自定义风格 2024-10-04 11:45:00 +08:00
shahaibo
67f56f9b84 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-10-04 10:41:23 +08:00
shahaibo
fd12b9e571 TASK:male sketch style逻辑添加; 2024-10-04 10:40:32 +08:00
fb329c94aa Merge branch 'dev/dev_xp' into dev/dev 2024-10-03 16:49:03 +08:00
16d06582ee 重置designSingle返回的sketch在minio的临时访问凭证 2024-10-03 16:41:48 +08:00
shahaibo
6f98f111dd TASK:十月优惠邮件发送接口; 2024-10-03 12:15:55 +08:00
shahaibo
51a1c1d8e1 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-10-03 12:14:43 +08:00
shahaibo
8445c23984 TASK:十月优惠邮件发送接口; 2024-10-03 12:14:30 +08:00
961f8f874e 获取消息 按时间逆序 2024-10-01 16:08:40 +08:00
283b6244b1 消息推送连接关闭时避免报错 2024-10-01 10:29:06 +08:00
f19a15dbe8 Merge branch 'dev/dev_xp' into dev/dev 2024-09-30 17:16:11 +08:00
791d44df02 消息推送 bug修改 2024-09-30 17:15:11 +08:00
shahaibo
28e67db78d TASK:aida redesign不修改位置信息√接口修改; 2024-09-30 15:41:29 +08:00
shahaibo
63a120c652 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-09-30 14:49:05 +08:00
shahaibo
f60cabbbc0 TASK:aida design统计; 2024-09-30 14:48:44 +08:00
06db759749 my work bug修复 2024-09-30 11:28:53 +08:00
shahaibo
373608d989 TASK:aida design统计; 2024-09-29 18:32:06 +08:00
shahaibo
45e3dde03f Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-09-29 17:59:00 +08:00
shahaibo
3625180a6e Merge branch 'release/3.0' into dev/dev
# Conflicts:
#	src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java
#	src/main/java/com/ai/da/controller/ThirdPartyController.java
#	src/main/java/com/ai/da/service/AccountService.java
#	src/main/java/com/ai/da/service/impl/AccountServiceImpl.java
2024-09-29 17:56:49 +08:00
aae1442a6f websocket获取关注数与粉丝数 2024-09-29 15:55:12 +08:00
08dcd03468 修改默认头像 2024-09-28 20:14:19 +08:00
shahaibo
deda511e32 TASK:aida; 2024-09-27 16:43:02 +08:00
shahaibo
9bcf615b4b TASK:aida; 2024-09-27 16:30:58 +08:00
shahaibo
70912c4c43 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-09-27 16:24:56 +08:00
shahaibo
fa013c1974 TASK:aida; 2024-09-27 16:24:45 +08:00
11fbeb1ed0 Merge branch 'dev/dev_xp' into dev/dev
# Conflicts:
#	src/main/java/com/ai/da/common/utils/RedisUtil.java
#	src/main/java/com/ai/da/service/AccountService.java
2024-09-27 15:43:48 +08:00
f432b8cce6 修改提取的sketch 2024-09-27 15:40:30 +08:00
shahaibo
05ddd33bcd TASK:aida; 2024-09-27 15:33:20 +08:00
shahaibo
9f5c901502 TASK:aida; 2024-09-27 14:42:30 +08:00
33d5d3a2ea 上传图片超时,邮件提醒开发相关人员 2024-09-26 11:46:23 +08:00
2668dd3c47 redis 添加key 2024-09-25 16:17:55 +08:00
2bc5fef175 1、修改用户名
2、更改账号绑定邮箱地址
2024-09-25 16:15:18 +08:00
ea92e1f20d to dev 2024-09-25 11:38:11 +08:00
9f1cf1d90e Merge branch 'dev/dev_xp' into dev/dev 2024-09-25 11:31:40 +08:00
b43f9baead 修改 imageToSketch 2024-09-25 11:30:51 +08:00
shahaibo
41ffe335fc TASK:mq配置 2024-09-24 15:43:37 +08:00
shahaibo
56d0dcd25f TASK:数据迁移 2024-09-24 15:20:24 +08:00
shahaibo
4304acbe6f BUGFIX:作品广场 2024-09-24 14:37:22 +08:00
2f1b22d423 Merge branch 'refs/heads/release/3.0' into dev/dev_xp
# Conflicts:
#	src/main/java/com/ai/da/common/utils/RedisUtil.java
#	src/main/java/com/ai/da/service/impl/AccountServiceImpl.java
#	src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java
2024-09-24 10:27:18 +08:00
3eb8626831 修改 imageToSketch 2024-09-24 10:20:08 +08:00
5a86f2e649 修改 imageToSketch 2024-09-23 11:13:44 +08:00
93e9c61943 1、新增 imageToSketch
2、删除无用代码
2024-09-20 11:32:09 +08:00
shahaibo
c5e9941adb BUGFIX:design colorboard元素混入sketchboard; 2024-09-20 11:31:48 +08:00
56679808e9 mask更新 从sketch分割 2024-09-19 09:50:56 +08:00
shahaibo
40f5705e7a TASK:凭证更新; 2024-09-13 11:24:14 +08:00
shahaibo
32975d9900 TASK:链接注册试用; 2024-09-13 11:16:17 +08:00
shahaibo
72db49e7f5 Merge remote-tracking branch 'origin/release/3.0' into release/3.0 2024-09-13 11:13:42 +08:00
shahaibo
472f5e65b4 TASK:凭证更新; 2024-09-13 11:13:23 +08:00
e2f8fb082c 广场用户注册修改 添加账户开始时间并设置积分为0 2024-09-13 10:43:28 +08:00
a47e53b19e mask 数据替换,代码暂存 2024-09-13 10:09:33 +08:00
c01acec9e6 Merge branch 'dev/dev_xp' into dev/dev 2024-09-09 10:50:14 +08:00
969d7586fc mask替换相关接口--未完善版,暂存 2024-09-06 12:34:36 +08:00
31a40ff7ca 关闭dev定时任务 2024-09-06 10:01:28 +08:00
afb9c99228 Merge branch 'dev/dev_xp' into dev/dev 2024-09-06 09:32:40 +08:00
8ee6a529a0 作品广场优化,将点赞前三和浏览量前三的作品放在第一页的最前面 2024-09-02 12:02:54 +08:00
cebc05d132 BUGFIX:管理员系统 添加新用户邮箱校验,相同的邮箱只能创建一个账号 2024-08-27 11:32:47 +08:00
d23ac82b1b TASK:code-create 注册用户添加为AiDA的游客
BUGFIX:0关注状态下获取动态
2024-08-27 11:27:05 +08:00
e86b576050 TASK:动态 2024-08-23 17:34:38 +08:00
8a774aa328 管理员系统 优化 按用户名或用户邮箱 查询用户design频率 2024-08-21 15:07:14 +08:00
c5da68dc47 1、获取关注、粉丝列表、消息详细 返回参数统一
2、管理员系统 按用户名或用户邮箱 查询用户design频率
2024-08-21 14:31:10 +08:00
28df672a7d 优化 获取关注、粉丝列表 2024-08-21 10:23:55 +08:00
203c88dd70 添加头像 2024-08-19 15:10:41 +08:00
fa86a2af45 添加关注、取消关注、获取关注列表、粉丝列表相关接口 2024-08-19 11:52:53 +08:00
ac28ba233c 消息通知系统-一键已读;反复点赞、关注及取消 数据存储处理, 2024-08-16 10:32:15 +08:00
shahaibo
47dc2bfc6e BUGFIX:二创变原创 2024-08-15 16:37:24 +08:00
085dac0630 消息通知系统 2024-08-15 16:25:44 +08:00
7b27b1362d Merge branch 'dev/dev_xp' into release/3.0
# Conflicts:
#	src/main/java/com/ai/da/service/impl/AccountServiceImpl.java
2024-08-12 09:54:28 +08:00
704e3c25bf BUG修复:用户更改套餐,积分/用户角色不变更问题 2024-08-12 09:51:39 +08:00
7e5b10aab3 通过邮箱查询账户,忽略邮箱大小写 2024-08-08 10:54:22 +08:00
3ccbd8f905 账号置为游客日志添加 2024-08-08 10:13:47 +08:00
89a234e77d to prod 2024-08-06 11:43:20 +08:00
388dd54bfa to prod 2024-08-06 11:41:48 +08:00
035c4412f1 Merge branch 'dev/dev' into release/3.0 2024-08-06 11:35:55 +08:00
d4eb7c846b to dev 2024-08-06 11:35:11 +08:00
fef50d7a37 Merge branch 'dev/dev_xp' into dev/dev 2024-08-06 11:30:02 +08:00
e5a95972a5 modify : 管理员系统 2024-08-06 11:29:33 +08:00
shahaibo
36a796b38b BUGFIX:多个印花 2024-08-05 17:44:53 +08:00
94927ae0a4 modify 2024-08-05 15:48:50 +08:00
4d7153661c Merge branch 'release/3.0' into dev/dev 2024-08-05 15:39:01 +08:00
76062136d6 Merge branch 'dev/dev_xp' into dev/dev 2024-08-05 15:38:05 +08:00
ea4ba74989 管理员系统功能添加 2024-08-05 15:19:02 +08:00
shahaibo
5a09d7a195 BUGFIX:过滤已废弃 2024-08-02 12:28:58 +08:00
shahaibo
e0332b9ddf BUGFIX:过滤已废弃 2024-08-02 12:21:30 +08:00
shahaibo
685ba09f7d BUGFIX:过滤已废弃 2024-08-02 12:13:32 +08:00
shahaibo
7aa1fc0342 BUGFIX:过滤已废弃 2024-08-02 11:56:17 +08:00
shahaibo
653264151a BUGFIX:过滤已废弃 2024-08-02 11:53:50 +08:00
shahaibo
fada00c738 BUGFIX:过滤已废弃 2024-08-02 11:36:58 +08:00
a10d30337a 支付切换为live 2024-08-01 10:30:44 +08:00
85ffed114b 语言适配 2024-08-01 10:07:24 +08:00
1093ac68b6 查询指定用户各功能使用情况 2024-08-01 10:00:26 +08:00
71e6abd816 to prod 2024-07-29 17:52:06 +08:00
00c948116e to prod 2024-07-29 17:50:40 +08:00
b6efd598bd to prod 2024-07-29 17:50:09 +08:00
bfe7ad4aa6 to prod 2024-07-29 17:49:16 +08:00
018ccef46a to prod 2024-07-29 17:47:09 +08:00
feb836f849 调查问卷 2024-07-29 17:36:32 +08:00
0106f21b86 Merge branch 'dev/dev_xp' into dev/dev 2024-07-29 17:31:21 +08:00
1b5f64785d 调查问卷查看 2024-07-29 17:24:14 +08:00
77a4aee88e 取消英文字母的正则匹配 2024-07-24 09:44:32 +08:00
shahaibo
ce1e2f3eab TASK:取消定时任务 2024-07-22 11:18:43 +08:00
shahaibo
75fbd2844b TASK:mq配置 2024-07-22 11:15:25 +08:00
shahaibo
832f331603 TASK:配置文件dev分支改为dev 2024-07-22 11:14:19 +08:00
9a2d58d922 正则匹配输入的英文文本 2024-07-22 09:46:11 +08:00
徐佩
34c4cd47ef Merge remote-tracking branch 'origin/release/3.0' into dev/dev
# Conflicts:
#	src/main/java/com/ai/da/common/task/AccountTask.java
2024-07-21 09:54:42 +08:00
c46f65600f 添加 开展活动接口 2024-07-19 15:40:54 +08:00
56ebcfbce2 stripe 设置支付链接语言 2024-07-17 17:17:04 +08:00
aa1eb7411e stripe 设置支付链接语言 2024-07-17 17:12:25 +08:00
4626ea3c55 prod stripe->live 2024-07-17 16:21:05 +08:00
5858f7dcf1 添加stripe接口路由到过滤器 2024-07-17 16:05:33 +08:00
440dfdcceb push to prod 开启定时任务 2024-07-17 15:32:58 +08:00
36e41ecd89 push to prod 配置修改 2024-07-17 15:28:55 +08:00
e1b08a9979 modify:Stripe 2024-07-17 15:26:11 +08:00
b9041d9c09 添加新的支付方式:Stripe 2024-07-16 16:59:58 +08:00
037a0d12ff Merge branch 'release/3.0' into dev/dev_xp 2024-07-15 13:57:20 +08:00
956b72729f Merge remote-tracking branch 'origin/release/3.0' into release/3.0 2024-07-15 13:48:00 +08:00
9b185e6919 游客到试用用户身份转换 2024-07-15 13:47:43 +08:00
shahaibo
f77de3a1f4 BUGFIX:token filter 2024-07-15 13:43:44 +08:00
f03d32030d 1、stripe
2、游客到试用用户身份转换
2024-07-15 13:42:18 +08:00
shahaibo
6a098ffa13 BUGFIX:发送每日申请试用用户邮件 2024-07-13 12:40:13 +08:00
shahaibo
12c10167f1 Merge remote-tracking branch 'origin/release/3.0' into release/3.0 2024-07-11 15:54:49 +08:00
shahaibo
679b213b6f BUGFIX:aida 2024-07-11 15:54:08 +08:00
shahaibo
6fa6c38398 BUGFIX:试用用户 2024-07-11 10:50:24 +08:00
925da9fa03 prod->local 合代码配置修改 2024-07-10 14:28:50 +08:00
8f0d45adf9 design 将未分割的图层添加到design_item_detail表中 2024-07-10 13:53:52 +08:00
505288fdb7 代码合并修改 2024-07-10 11:01:25 +08:00
44e045ece3 开启account-task 2024-07-10 11:00:17 +08:00
429fdad2b7 Merge branch 'test/stable' into release/3.0 2024-07-10 10:56:07 +08:00
46fbbd747e alipay-hk 配置文件位置修改 2024-07-10 10:47:36 +08:00
803bdfd291 alipay-hk 配置文件路径修改 2024-07-10 10:08:20 +08:00
shahaibo
6cbc4882fa BUGFIX:问卷调查 2024-07-10 09:49:41 +08:00
shahaibo
54f8d4b5e0 TASK:消费开启 2024-07-10 09:30:40 +08:00
shahaibo
314ad7a4f8 TASK:定时任务开启 2024-07-09 23:46:54 +08:00
shahaibo
a56510c35a TASK:变回develop环境 2024-07-09 23:44:40 +08:00
shahaibo
c2e2140ce6 Merge branch 'test/stable' into release/3.0
# Conflicts:
#	src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java
#	src/main/java/com/ai/da/service/impl/AccountServiceImpl.java
2024-07-09 23:40:58 +08:00
83915d332f Merge branch 'dev/dev' into test/stable 2024-07-09 17:30:54 +08:00
751aeb785d Merge branch 'dev/dev_xp' into dev/dev 2024-07-09 17:29:42 +08:00
7cadab9345 付费用户邮件通知 2024-07-09 17:28:38 +08:00
shahaibo
8a7b64dd65 Merge remote-tracking branch 'origin/test/stable' into test/stable 2024-07-09 17:11:05 +08:00
shahaibo
4c598200e5 TASK:邮件通知 2024-07-09 17:10:50 +08:00
shahaibo
d052918725 BUGFIX:t_design_item_detail_print level2type; 2024-07-09 17:10:50 +08:00
shahaibo
8fd6a3462e BUGFIX:颜色没返回; 2024-07-09 17:10:50 +08:00
shahaibo
11eb6595dd BUGFIX:游客注册主题; 2024-07-09 17:10:50 +08:00
shahaibo
0adfcb745d BUGFIX:喜欢的作品; 2024-07-09 17:10:50 +08:00
shahaibo
779e1e8be3 BUGFIX:like; 2024-07-09 17:10:49 +08:00
shahaibo
5297880c3b BUGFIX:aida; 2024-07-09 17:10:49 +08:00
shahaibo
6028ef8cdd TASK:邮件通知 2024-07-09 17:07:22 +08:00
shahaibo
c7de1779bd BUGFIX:t_design_item_detail_print level2type; 2024-07-09 15:25:20 +08:00
shahaibo
95bfb00a9d BUGFIX:颜色没返回; 2024-07-09 14:55:21 +08:00
shahaibo
5fc50f2d96 BUGFIX:游客注册主题; 2024-07-09 14:04:12 +08:00
shahaibo
22d7395e11 BUGFIX:喜欢的作品; 2024-07-09 13:53:57 +08:00
shahaibo
3d4ea89516 BUGFIX:like; 2024-07-09 13:14:46 +08:00
shahaibo
2ed63cafd0 TASK:生产消费暂时关闭; 2024-07-09 11:44:18 +08:00
shahaibo
701652c6b2 BUGFIX:aida; 2024-07-09 11:07:01 +08:00
shahaibo
df66b51e5c Merge branch 'dev/dev' into test/stable
# Conflicts:
#	src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java
2024-07-09 11:04:37 +08:00
shahaibo
0c6187a759 BUGFIX:aida; 2024-07-09 10:13:32 +08:00
shahaibo
2d6867b729 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-07-09 09:46:54 +08:00
shahaibo
0b8d0a1843 BUGFIX:aida; 2024-07-09 09:46:41 +08:00
64c7b8c1fd 机器人 total_cast 上限调整 2024-07-08 19:05:38 +08:00
shahaibo
42f1d47f82 BUGFIX:aida; 2024-07-08 16:17:13 +08:00
shahaibo
9ca0cd7c43 BUGFIX:aida; 2024-07-08 15:24:50 +08:00
shahaibo
4c187d1fbd BUGFIX:aida; 2024-07-08 14:42:59 +08:00
shahaibo
733de89883 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-07-08 09:32:54 +08:00
shahaibo
0e1a5a70df BUGFIX:aida; 2024-07-08 09:31:42 +08:00
5ecebd5117 修改印花 允许同时single和overall 2024-07-05 18:47:12 +08:00
c6626b230a Merge branch 'dev/dev' into dev/dev_xp 2024-07-05 18:42:03 +08:00
shahaibo
1cab7332f9 BUGFIX:aida; 2024-07-05 16:52:56 +08:00
shahaibo
c1d88943a9 BUGFIX:aida; 2024-07-05 11:26:46 +08:00
bc85e561d2 Merge branch 'dev/dev' into dev/dev_xp 2024-07-05 10:34:05 +08:00
shahaibo
be8968605b BUGFIX:aida; 2024-07-04 16:52:06 +08:00
569c2e719f Merge branch 'dev/dev' into dev/dev_xp
# Conflicts:
#	src/main/java/com/ai/da/service/impl/DesignServiceImpl.java
#	src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java
2024-07-04 14:42:51 +08:00
shahaibo
5fa7e36dc2 BUGFIX:aida; 2024-07-04 13:02:47 +08:00
shahaibo
4a533b3cf0 BUGFIX:aida; 2024-07-04 11:34:51 +08:00
d2129459fe S3Util 工具类修改 2024-07-03 16:43:22 +08:00
shahaibo
9784d07680 BUGFIX:aida; 2024-07-03 15:22:01 +08:00
shahaibo
a71fa4df51 BUGFIX:aida; 2024-07-02 15:23:27 +08:00
shahaibo
ce384dbba9 BUGFIX:aida; 2024-07-02 13:48:53 +08:00
shahaibo
dd8f5696a2 BUGFIX:aida; 2024-06-28 16:52:16 +08:00
shahaibo
4211bce256 BUGFIX:aida; 2024-06-28 15:45:39 +08:00
shahaibo
bc240cd2ee TASK:aida; 2024-06-27 17:36:47 +08:00
shahaibo
f869f8eb10 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-06-27 15:33:38 +08:00
shahaibo
9b438c78a3 TASK:aida; 2024-06-27 15:33:26 +08:00
a5b435b80f S3 Util 新增工具类 2024-06-26 18:00:47 +08:00
a64d4e30de Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-06-26 14:02:45 +08:00
0759452381 积分相关修改
1、BUGFIX: 用户表中的积分与积分详细中不统一;
2、To_Product_Image 添加扣除积分
3、每周刷新付费用户积分
2024-06-26 13:55:20 +08:00
shahaibo
58a78a5366 TASK:aida; 2024-06-26 13:24:27 +08:00
shahaibo
9bd695a24d TASK:aida; 2024-06-26 10:47:56 +08:00
e614e3a07a Merge branch 'dev/dev' into dev/dev_xp
# Conflicts:
#	src/main/java/com/ai/da/service/GenerateService.java
2024-06-25 16:59:41 +08:00
shahaibo
8c65592394 TASK:aida; 2024-06-25 16:43:54 +08:00
shahaibo
e093d694fd Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-06-25 16:43:44 +08:00
shahaibo
a5bfc4e41d TASK:aida; 2024-06-25 16:43:29 +08:00
be001477ce Merge branch 'dev/dev' into dev/dev_xp
# Conflicts:
#	src/main/java/com/ai/da/service/impl/ChatRobotServiceImpl.java
2024-06-25 15:42:22 +08:00
3e150b2067 获取服装category bug修改 2024-06-25 15:29:19 +08:00
8ea06c05e9 1、generate 积分扣除并添加相关积分详细
2、获取服装category bug修改
2024-06-25 12:18:18 +08:00
shahaibo
9b589eece6 TASK:aida; 2024-06-25 10:59:58 +08:00
shahaibo
ba4388b87d Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-06-25 10:57:22 +08:00
shahaibo
5b3a668ce7 TASK:aida; 2024-06-25 10:56:54 +08:00
aacbe92cdc generate cancel 2024-06-24 17:02:25 +08:00
57ab6c64ef flask 迁移到fast-api 9992 -> 9994 2024-06-24 14:33:34 +08:00
ffaef2ff6c Merge branch 'dev/dev' into dev/dev_xp 2024-06-24 10:43:50 +08:00
5113cb0606 to product image 9996 -> 9994 2024-06-22 17:27:50 +08:00
30d5466805 添加查询Code-Create数据库,监控新增付费记录并对付费用户进行账号新增或延长账号有效期的操作 2024-06-21 15:11:31 +08:00
8457a61ded generate 添加积分扣除 2024-06-20 15:26:22 +08:00
e7f9b77fe5 Merge branch 'dev/dev' into dev/dev_xp
# Conflicts:
#	src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java
2024-06-20 10:39:36 +08:00
shahaibo
6c0f65b801 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-06-20 10:31:13 +08:00
shahaibo
ad1fa0e4c2 TASK:aida; 2024-06-20 10:27:28 +08:00
227c742f0d 新增接口:调查问卷 2024-06-20 10:27:04 +08:00
c317942447 BUGFIX: getDetail印花不显示 2024-06-19 11:41:39 +08:00
shahaibo
a6f02bf22f BUGFIX:试用用户积分为0; 2024-06-18 14:57:52 +08:00
4f12aa92b6 slogan 参数校验 2024-06-18 13:13:20 +08:00
e6a2ce2b69 dev 配置文件修改 2024-06-18 10:19:56 +08:00
shahaibo
1f0439c7f9 BUGFIX:aida; 2024-06-17 19:33:54 +08:00
shahaibo
676ef74bdc TASK:aida; 2024-06-17 19:25:37 +08:00
shahaibo
b2bc47da99 Merge remote-tracking branch 'origin/dev/dev' into dev/dev
# Conflicts:
#	src/main/resources/application-dev.properties
2024-06-17 17:38:04 +08:00
shahaibo
02787db0a1 TASK:aida; 2024-06-17 17:37:15 +08:00
19524520f4 BUGFIX:sr 2024-06-17 17:34:27 +08:00
2a2c4b1d39 slogan访问地址变更 2024-06-17 13:31:44 +08:00
257c99698e fastapi -> flask 2024-06-17 13:21:58 +08:00
8ff8a7480f slogan 恢复 2024-06-17 11:21:54 +08:00
5e1ff16052 slogan 暂停监听 2024-06-17 10:51:35 +08:00
dbd89798d5 slogan 暂停监听 2024-06-17 10:42:45 +08:00
b5b6f737aa slogan 暂停监听 2024-06-17 10:41:36 +08:00
1d60a6a129 Merge branch 'dev/dev_xp' into dev/dev
# Conflicts:
#	src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java
2024-06-17 10:25:20 +08:00
0017568cc7 slogan 2024-06-17 10:21:49 +08:00
shahaibo
375f717721 TASK:aida; 2024-06-17 09:43:59 +08:00
shahaibo
18914bea7e TASK:aida; 2024-06-17 09:34:48 +08:00
fc48d8931f 2024-06-12 11:27:21 +08:00
619d33b412 Merge branch 'dev/dev' into dev/dev_xp
# Conflicts:
#	src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java
#	src/main/java/com/ai/da/service/impl/AccountServiceImpl.java
#	src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java
#	src/main/resources/application-dev.properties
#	src/main/resources/messages_en.properties
#	src/main/resources/messages_zh.properties
2024-06-12 10:50:05 +08:00
1a48527c70 1、design single 添加 design elements
2、design single -- print添加level2Type
3、替换部分flask接口 为 fastAPI接口
2024-06-12 10:41:59 +08:00
shahaibo
ee68a5d782 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-06-12 09:48:11 +08:00
shahaibo
3a29d25060 TASK:aida; 2024-06-12 09:47:55 +08:00
77f514a03b Merge branch 'release/3.0' into dev/dev_xp
# Conflicts:
#	src/main/java/com/ai/da/python/PythonService.java
#	src/main/java/com/ai/da/service/impl/DesignItemServiceImpl.java
2024-06-11 15:23:24 +08:00
954f6207ec design Single 允许画笔修改sketch后进行design 2024-06-05 11:43:35 +08:00
891f6fb15f Printboard level2Type 语言适配 2024-06-04 15:19:30 +08:00
49b086ad10 generate 添加Logo与Slogan 2024-06-03 17:13:48 +08:00
86e7119cfb AlipayHK 回调及相关数据处理 2024-05-31 16:28:23 +08:00
shahaibo
775ae3266c BUGFIX:定时任务开启; 2024-05-31 09:59:08 +08:00
1aea8e93f2 AlipayHK 新增指定订单查询接口 2024-05-30 09:54:49 +08:00
804dc9b1b4 添加aws S3访问工具类 2024-05-29 16:30:27 +08:00
bd543e56d5 开启消息队列的监听 2024-05-28 14:25:03 +08:00
shahaibo
3dc7866fba BUGFIX:渐变色回退; 2024-05-28 11:52:33 +08:00
shahaibo
ffd371e5b4 BUGFIX:渐变色回退; 2024-05-28 11:48:35 +08:00
shahaibo
40aad9d1a3 BUGFIX:渐变色回退; 2024-05-28 11:32:49 +08:00
709393a9a6 paypal 切换为live环境 2024-05-28 11:20:58 +08:00
fb8de15eca 不等比缩放 2024-05-28 11:17:46 +08:00
f4e9a3474a Merge branch 'test/stable' into release/3.0
# Conflicts:
#	src/main/java/com/ai/da/service/impl/AccountServiceImpl.java
2024-05-28 10:59:34 +08:00
shahaibo
890389843f BUGFIX:试用时间link14天; 2024-05-28 10:43:50 +08:00
db04267591 Merge branch 'dev/dev' into test/stable
# Conflicts:
#	src/main/resources/paypal-sandbox.properties
2024-05-27 18:26:36 +08:00
5ff2bf11d7 alipay 密钥文件 2024-05-27 18:10:20 +08:00
76618de386 不等比缩放 2024-05-27 18:07:33 +08:00
eda92b3f0b Merge branch 'dev/dev' into dev/dev_xp
# Conflicts:
#	src/main/java/com/ai/da/service/impl/WorkspaceServiceImpl.java
2024-05-27 15:13:20 +08:00
shahaibo
b1b4b4147c TASK:配置文件; 2024-05-27 15:06:24 +08:00
shahaibo
4ba5f63a62 TASK:workspace; 2024-05-27 15:05:46 +08:00
shahaibo
8b274b2822 Merge remote-tracking branch 'origin/release/3.0' into dev/dev
# Conflicts:
#	pom.xml
#	src/main/java/com/ai/da/common/utils/SendEmailUtil.java
#	src/main/java/com/ai/da/service/impl/WorkspaceServiceImpl.java
2024-05-27 15:03:02 +08:00
54cbaf4b80 Merge branch 'dev/dev' into dev/dev_xp
# Conflicts:
#	src/main/java/com/ai/da/service/impl/WorkspaceServiceImpl.java
#	src/main/resources/application-dev.properties
2024-05-27 13:24:51 +08:00
c688af01f2 Merge branch 'release/3.0' into dev/dev_xp
# Conflicts:
#	pom.xml
#	src/main/java/com/ai/da/common/utils/SendEmailUtil.java
2024-05-27 13:20:31 +08:00
shahaibo
37de7d9276 BUGFIX:design; 2024-05-24 15:18:01 +08:00
shahaibo
02b3a407a9 BUGFIX:色块重复 2024-05-23 16:38:40 +08:00
5ebf0669f5 alipay-hk 切换到live环境 2024-05-23 15:48:55 +08:00
shahaibo
031d71bf99 BUGFIX:design; 2024-05-22 15:12:37 +08:00
shahaibo
205f0d54c5 BUGFIX:workspace; 2024-05-22 14:09:16 +08:00
shahaibo
50e46fed02 Merge remote-tracking branch 'origin/dev/dev' into dev/dev
# Conflicts:
#	src/main/resources/application-dev.properties
2024-05-22 14:05:01 +08:00
shahaibo
1303b1805a TASK:style; 2024-05-22 11:40:01 +08:00
shahaibo
2845c2c8b9 BUGFIX:male_top; 2024-05-22 10:26:29 +08:00
shahaibo
cd817dbf57 TASK:style; 2024-05-22 09:50:34 +08:00
f9ce559915 paypal 切换回sandbox环境 2024-05-21 14:40:46 +08:00
e40401f61f paypal webhook切换到prod 2024-05-21 14:27:17 +08:00
shahaibo
6e64eb741a TASK:邮箱; 2024-05-20 22:32:45 +08:00
shahaibo
c4a37f5d73 TASK:邮件; 2024-05-20 09:34:20 +08:00
shahaibo
8f5a86db0b TASK:监听; 2024-05-18 08:19:55 +08:00
shahaibo
14c99f6c6b TASK:监听; 2024-05-18 01:31:26 +08:00
shahaibo
bf072e35f5 TASK:监听; 2024-05-18 01:16:15 +08:00
shahaibo
b8048704ba TASK:监听; 2024-05-18 01:00:42 +08:00
shahaibo
b6704c3caf TASK:取消监听; 2024-05-18 00:34:18 +08:00
shahaibo
6b07c84c80 TASK:检查令牌日志注释; 2024-05-17 21:14:39 +08:00
shahaibo
980e1547cd TASK:检查令牌日志注释; 2024-05-17 21:07:20 +08:00
shahaibo
ae2191f369 TASK:检查令牌日志注释; 2024-05-17 21:03:56 +08:00
shahaibo
4b1a58c036 TASK:检查令牌日志注释; 2024-05-17 20:58:54 +08:00
shahaibo
4dbd5a1fad TASK:检查令牌日志注释; 2024-05-17 20:27:58 +08:00
shahaibo
b063cad764 TASK:配置文件; 2024-05-17 19:40:52 +08:00
shahaibo
f1eb48ae74 TASK:配置文件; 2024-05-17 19:25:50 +08:00
shahaibo
7233540ab4 Merge branch 'test/stable' into release/3.0
# Conflicts:
#	src/main/resources/application-dev.properties
#	src/main/resources/application-prod.properties
#	src/main/resources/application-test.properties
2024-05-17 18:14:12 +08:00
shahaibo
e634481113 TASK:配置文件; 2024-05-17 17:59:04 +08:00
shahaibo
b3591f879d TASK:试用时间; 2024-05-17 15:23:26 +08:00
shahaibo
12c447d6b0 TASK:配置文件; 2024-05-17 12:14:20 +08:00
shahaibo
c73876e8b0 TASK:配置文件; 2024-05-17 12:13:35 +08:00
shahaibo
a726ceca59 TASK:配置文件; 2024-05-17 11:40:38 +08:00
shahaibo
51db8b4ec2 TASK:无新增用户邮件; 2024-05-17 11:36:53 +08:00
shahaibo
9f4dbda152 TASK:无新增用户邮件; 2024-05-17 10:39:00 +08:00
shahaibo
8e1766eed0 Merge remote-tracking branch 'origin/temp0516' into test/stable
# Conflicts:
#	pom.xml
#	src/main/java/com/ai/da/common/config/MyTaskScheduler.java
#	src/main/java/com/ai/da/service/impl/AccountServiceImpl.java
2024-05-17 10:31:29 +08:00
shahaibo
f1d67f2f7d Merge branch 'release/3.0' into test/stable 2024-05-17 10:22:42 +08:00
shahaibo
ebb6577e98 TASK:portfolio; 2024-05-17 10:19:34 +08:00
5318e5d32a generate text存db内容简化 2024-05-16 15:32:39 +08:00
2aabb2347b Merge branch 'dev/dev' into dev/dev_xp
# Conflicts:
#	pom.xml
2024-05-15 15:39:28 +08:00
3790b8ee72 Alipay-HK 创建订单和异步回调 2024-05-15 15:38:11 +08:00
f4766d4ab4 designSingle 入参记录 2024-05-13 17:22:21 +08:00
d1fab003d2 designSingle 加入渐变色 2024-05-13 16:23:37 +08:00
718198bcfe Merge branch 'dev/dev' into dev/dev_xp
# Conflicts:
#	src/main/java/com/ai/da/python/vo/DesignPythonItem.java
2024-05-13 14:30:15 +08:00
shahaibo
7b83f42ed8 TASK:design 渐变色; 2024-05-13 14:23:08 +08:00
f23f4133d0 Merge branch 'dev/dev' into dev/dev_xp
# Conflicts:
#	src/main/java/com/ai/da/model/dto/DesignSingleItemDTO.java
#	src/main/java/com/ai/da/python/vo/DesignPythonItem.java
2024-05-10 17:25:06 +08:00
shahaibo
fb29310ba1 TASK:design 渐变色; 2024-05-10 17:18:25 +08:00
shahaibo
b86f168fe8 TASK:design 渐变色; 2024-05-10 17:17:28 +08:00
shahaibo
a54f7e7c30 BUGFIX:邮件; 2024-05-01 11:54:19 +08:00
shahaibo
de865b918f BUGFIX:邮件; 2024-04-30 10:32:55 +08:00
shahaibo
d2e917e3ce BUGFIX:邮件; 2024-04-30 10:27:39 +08:00
shahaibo
e70580c388 BUGFIX:邮件; 2024-04-30 10:19:40 +08:00
shahaibo
7454e16076 BUGFIX:登录邮箱精确匹配; 2024-04-23 10:52:10 +08:00
shahaibo
c3ae729466 BUGFIX:登录邮箱精确匹配; 2024-04-23 10:50:45 +08:00
shahaibo
faeb59bae5 BUGFIX:登录邮箱精确匹配回退; 2024-04-23 10:32:24 +08:00
shahaibo
5a69a770ac BUGFIX:登录邮箱精确匹配; 2024-04-23 10:22:26 +08:00
shahaibo
d1772be737 BUGFIX:登录邮箱精确匹配; 2024-04-23 10:10:51 +08:00
shahaibo
95aee1daae BUGFIX:试用订单; 2024-04-09 11:55:15 +08:00
shahaibo
9bae02406c TASK:dev分支调用python端端口修改; 2024-02-19 11:03:28 +08:00
shahaibo
fda2a3120b TASK:试用时间增加; 2024-02-15 15:19:09 +08:00
523 changed files with 17200 additions and 4859 deletions

View File

9
files/COD-public-key.txt Normal file
View File

@@ -0,0 +1,9 @@
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAymkBAWixxUi9IAeMWgsq
K92AzFbe0qzzYPdkoh15ymL2A5MkYH7asnhFwclgdiFmd9a0TbZP+t/SzWW8UUzN
1pXoEp48R+eguGTt5xkJwb10+H6quVXF/Ezzid5yzVW3dcYRp8qUlFr0XBpvkK9l
FpPzh2+mwVEAsgBMXq/K50ZiX2dlkPZ7ffkVPWaK2ESIo3YgfM6dmiiza0hPWJ35
UgTH5rwJ7vN3IdOJTlkQOvrIrj2ocPcrudeEwqybIbCGhgRBwQSBsXQOO4U//rE4
VU+0LF/3uQgXkvVY1+a1JLiTncZYKGEQ/NtxM+dGtYWV2gPhQRyJ7Z77OX0XCbcn
zwIDAQAB
-----END PUBLIC KEY-----

View File

@@ -1,28 +0,0 @@
-----BEGIN PRIVATE KEY-----
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC1XpZ0+EIoJvQk
GHAdpcpr35S+UnxNdOE+1sZsIDWuyzXG0d6vOudITmYFTqVzJRaAArhwp+NQ/R9y
onsuUsEc0x2qTntySYMedHfI2TSl6qTsqpHykSLr6u0E4TuYUiGs/nf3t0A/rEvm
KK6OP4vNgUlANhOKDwiCAdmJkiOBEHJwLsN1xlcnBkUR0Wr+uauVo+A0opkM7HrB
aXXTcy+gpold+uCgCbRzFCiDr0uKsLJgb3Ce1aXTwa8k2dDg6mzhE0U65yhsNzjC
Cqg+g8tfEVha9Nrsmd6hG2iFHnk4rCqRXhjuI1V10GiZUppMWJtGD2tj7ZK0XXKh
5sAclu9RAgMBAAECggEBAKSQy8IclKKsHbA2wFwWV6Ijv2olnAYH/G0xId9wJmWQ
mx3oxb6Hmt3fzPAZ2UOuLkk+rq4Bl9+fnQ494bk5e2G1KWCjT512mFNk6F9EvmGh
k73uUvkeueoIQsG/wHxIYaf/SUlqbBCaPE/9L82AWVDBc36g0n/dfiHAnesWv8JV
agiTF/SIWDPtzRaVh8VObFOusHdqnRuLqV7n0FSVJePSNBFSSOz5XTttOtM4whg8
kw3jlCHbVMVKtPYcebxGf0vkDapyGJiZ6wc1rD4MXJTciG+WQNfNE+Af2UB606VC
Nlq/CRkXr2Ix9ASSMeE4TcH+0EoxeITpP2NV+3hAzgECgYEA7mWSd6HgPXMdwO33
efmx0qky+I/4bhicG9Go6021fRY+jUhRcj6VtDWBzuZwblgTSiDH4t2TbfB+hvQD
GVTJNc21+hXEVNu0ajqLuMiCgqaZCeNeJYYYowbLSbYd4t/nQh1vCZ/44aRWqG8G
eWEGruMaqSlGyFG7kyaoQaY1X6ECgYEAwsMGiupkNZ/JU3PZd2X2X+37b8BXcIt7
itL413GDiLwCNII5pArD7GHYFQzN4GaUCt/VjrRXbTY1xYCk2RA0FyBMsxAGa+eH
9iTSLQvDJpxV/44UY3L9ZFcz4t0WjRcsdqPt30yUBNWiAIGcjtae2tMvtfxKICLQ
sYXAS+ciMbECgYEA4tnerV5pfq/7QSpw0y4Ky5ZcPXDqiwF6E3LH1dlleTlgnpqR
fjAVzp0X/+UCWc4P1PsqmjQU5YnzLMIn7MPkkAFHSEnMQJ+sp2U8rcKHhoG3oVQt
s3FOIlwFuAfHmqtLaXuOvM7wSu9R0weLVpdAf8z2AsCXbWlxH86qT4Y0xeECgYBM
NJkbw8i//qx8vciqYjf7oxeNy1mrTLhjQldhnSXVW5MVTpsVJ60vkb1Fx0PK+PgW
JSzfcIsAzYROqh5WXHO1VMsOCUgp8mcNlayzOXX7ZpJzsvkhTH3/Q+umadGIFTgt
l8jcZY9JMPn5br1+WlW/04BImdW7K0QzId1zFZYYkQKBgQDqswTLEpbBDOE/3uk4
laZ9kTLJMP/hVmDJ0/jbETMdCkzIORnr3xFxmZIHG17E2In9PVumD0ESCh7qbCDE
isbfLSgfJR6ItdOM6W2R0GAsXQ3e0byBpR7qm0j9J3zYRhQwfVbZtkX0uywB9a/4
q2bz4491ESrbryx16FZKUJeX8g==
-----END PRIVATE KEY-----

View File

@@ -1,9 +0,0 @@
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtV6WdPhCKCb0JBhwHaXK
a9+UvlJ8TXThPtbGbCA1rss1xtHerzrnSE5mBU6lcyUWgAK4cKfjUP0fcqJ7LlLB
HNMdqk57ckmDHnR3yNk0peqk7KqR8pEi6+rtBOE7mFIhrP5397dAP6xL5iiujj+L
zYFJQDYTig8IggHZiZIjgRBycC7DdcZXJwZFEdFq/rmrlaPgNKKZDOx6wWl103Mv
oKaJXfrgoAm0cxQog69LirCyYG9wntWl08GvJNnQ4Ops4RNFOucobDc4wgqoPoPL
XxFYWvTa7JneoRtohR55OKwqkV4Y7iNVddBomVKaTFibRg9rY+2StF1yoebAHJbv
UQIDAQAB
-----END PUBLIC KEY-----

View File

@@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDD+NUduhLJcb2Z
ryLwtIHdmjfh6Wn73E9umHmdPf6yF7IbDoTDBmIAfaPU/oiLgrka3fKGCkn/yHvW
QcL+Ry96/Uu+iIN9SbG5vPVvLtLfx+5++IE8p3RxcSDQggqFuJ+osebXeVIrOcTZ
s7nXCqGenTcagv2eJESiq712fcBvY1wVgilT6ERVQy+zdvwAOiS6wXF/51AueP+E
rNDHuPLkGH6JhLtO4LffeYgM/Th7eCl/WWLkiVMSoeJt7vWFe4bYV/IYW1qI2aQX
H1DYmvwgDfDv8jRORD9D191YBqq1l3Tw7VSjFrpydFvSK46dbXKBj3oA5ZiJ+Ttj
ZCtBRiOdAgMBAAECggEAUKl4Fs9C8lV1o+85Y3f4yBy1CbCIZhltPGlYDUe6MNWe
ApL8REW5Sthr+bx2uW2qAQv/yfosMTL0/eB9gSoNugLODXOlI4mUtI25O/U66M8j
NHHWx/9o51SYHBqaeCXg2Y+4I1KVZqNVigH26TNACMhPKQNnnpLxCT/FMSNbdLzo
wfFMyjN7R3Hc8ZB1C2zx+fLJm1DNZeOJOHAkW1LprlotRv6eq3lOwZaDDUTB5xhT
0Erev3djC/R08Fne1y09ukar8z0tX3Fm9SzHJDFVoh1HOYPWayCiAxOhip+JnFct
rtK5jjuB8DAP4Q1k12yOWUFwb6NOG9Hf/G6XExRPBQKBgQD1P2SnKD1IlNSrvVJn
2HzKnBVllVo50fbv7SpnP8H1B5vt2Qo/mgOGtzbeXyK4mcLFaWg9++BrsjTXwZFi
wmKeJgNI822DPhF5qQhK7Cc+WMwesufGrTnmRUOEFYehz9ffZBvMa1s/ObIEyLcr
tYitT74+nFdRPtr+8PN06QMEcwKBgQDMkGFWhSO7p7VMuV0H0uC1fj3GGtVvM+Ps
a9ASs0HBhQaOpberkKY9vgry6HoJ8CGvbrxlmc3JoYPRwKN3oQRYLvGSF96HAg9i
643FmVAWiVzHpjYX9fMJyCzXiOw6Qet8Zp3Ewaw9BBG0200Fj6/zGc8XEqNjIv5Q
DQ9MosRDrwKBgQCU5i5IRugeXy5YLxQPNKNfqDBdgrZLEK2qsgXithUencYQPIw6
XVnyut43WO+NwN0+WmcN6xUwjfwDWuTYX0jc2Bt6eUFuQ4r8oKIGSybwdZ1IrjqG
p7nVkwwQ77lvhu98FB3EmRHHa1IoEW0Uvp0DDL1m6ikhjNYNn2FRA//u/QKBgGbY
a+eo1ldBMPha9Te6wLjeuEYCNa5L41p4tcrBDt0xeSN8k4QRHFNMWYrYcIrQjM77
mIJoOjsWFgT9mfHKJToEl/VAROORmJS+Iq/mrYo3E0tY+DdBsygG2Oyf7Uw42iDY
IpfKW0Lt6c0IuIeEPwy0vBY4i6aK8Frkxf1ck9oHAoGBAKFQg/c36J6tjnttpmes
R/zijp1ROE+z+dMmm3icDhCDvvR6MnHa2Y9ittNWdEUosZk9FsFn62YNtJJV2SIN
DDn0ASLtBkeCd8yad5uzUb7Umci9V7TP5c0NE3DK95FmciLGOuRbFyq1Z8edHnaS
zgLnf4yb25eCMLEG0Z2ugN3C
-----END PRIVATE KEY-----

View File

@@ -0,0 +1,9 @@
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw/jVHboSyXG9ma8i8LSB
3Zo34elp+9xPbph5nT3+sheyGw6EwwZiAH2j1P6Ii4K5Gt3yhgpJ/8h71kHC/kcv
ev1LvoiDfUmxubz1by7S38fufviBPKd0cXEg0IIKhbifqLHm13lSKznE2bO51wqh
np03GoL9niREoqu9dn3Ab2NcFYIpU+hEVUMvs3b8ADokusFxf+dQLnj/hKzQx7jy
5Bh+iYS7TuC333mIDP04e3gpf1li5IlTEqHibe71hXuG2FfyGFtaiNmkFx9Q2Jr8
IA3w7/I0TkQ/Q9fdWAaqtZd08O1Uoxa6cnRb0iuOnW1ygY96AOWYifk7Y2QrQUYj
nQIDAQAB
-----END PUBLIC KEY-----

83
pom.xml
View File

@@ -28,7 +28,19 @@
<jaxb-core>4.0.0</jaxb-core> <jaxb-core>4.0.0</jaxb-core>
<activation>1.1.1</activation> <activation>1.1.1</activation>
<easy-captcha>1.6.2</easy-captcha> <easy-captcha>1.6.2</easy-captcha>
<aws.java.sdk.version>2.20.43</aws.java.sdk.version>
</properties> </properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>bom</artifactId>
<version>${aws.java.sdk.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
@@ -202,6 +214,13 @@
<version>20230618</version> <version>20230618</version>
</dependency> </dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.17.1</version>
</dependency>
<dependency> <dependency>
<groupId>org.apache.poi</groupId> <groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId> <artifactId>poi</artifactId>
@@ -226,6 +245,70 @@
<version>2.17.1</version> <version>2.17.1</version>
</dependency> </dependency>
<dependency>
<groupId>com.stripe</groupId>
<artifactId>stripe-java</artifactId>
<version>26.2.0</version>
</dependency>
<!-- aws s3 -->
<!-- S3 dependency -->
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3</artifactId>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3-transfer-manager</artifactId>
<version>2.17.103-PREVIEW</version>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>kms</artifactId>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3control</artifactId>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
<groupId>com.google.auth</groupId>
<artifactId>google-auth-library-oauth2-http</artifactId>
<version>1.8.0</version>
</dependency>
<dependency>
<groupId>com.google.api-client</groupId>
<artifactId>google-api-client</artifactId>
<version>1.32.1</version>
</dependency>
<dependency>
<groupId>com.google.oauth-client</groupId>
<artifactId>google-oauth-client</artifactId>
<version>1.32.1</version>
</dependency>
<dependency>
<groupId>com.google.http-client</groupId>
<artifactId>google-http-client-jackson2</artifactId>
<version>1.41.5</version>
</dependency>
</dependencies> </dependencies>

View File

@@ -14,6 +14,7 @@ import org.apache.tomcat.jni.Time;
import org.springframework.amqp.core.Message; import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitHandler; import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@@ -30,6 +31,9 @@ public class GenerateConsumer {
@Resource @Resource
private GenerateService generateService; private GenerateService generateService;
@Autowired
private RabbitMQProperties rabbitMQProperties;
@Resource @Resource
private RedisUtil redisUtil; private RedisUtil redisUtil;
@@ -44,6 +48,10 @@ public class GenerateConsumer {
@Value("${redis.key.generateResult}") @Value("${redis.key.generateResult}")
private String generateResultKey; private String generateResultKey;
@Value("${redis.key.toProductImageResultKey}")
private String toProductImageResultKey;
@Value("${redis.key.relightResultKey}")
private String relightResultKey;
public void generate(Message msg, Channel channel, String consumerName) { public void generate(Message msg, Channel channel, String consumerName) {
log.info("============start listening=========="); log.info("============start listening==========");
@@ -63,23 +71,14 @@ public class GenerateConsumer {
} catch (IOException ex) { } catch (IOException ex) {
log.error("手动确认,不返回队列重新消费"); log.error("手动确认,不返回队列重新消费");
} }
// 2.2 将该消息从取消列表中删除
// redisUtil.removeFromSet(cancelSetKey, uniqueId);
} else { } else {
// GenerateCollectionVO generateCollectionVO = generateService.generateThroughImageText(generateThroughImageTextDTO);
generateService.generateThroughImageText(generateThroughImageTextDTO); generateService.generateThroughImageText(generateThroughImageTextDTO);
// 将消息从redis排队队列中删除,需保证被消费的消息存储到db之后再从redis删除 // 将消息从redis排队队列中删除,需保证被消费的消息存储到db之后再从redis删除
redisUtil.removeFromZSet(consumptionOrderKey, uniqueId); redisUtil.removeFromZSet(consumptionOrderKey, uniqueId);
/*if (!Objects.isNull(generateCollectionVO)) {
HashMap<String, String> generateResult = new HashMap<>();
generateResult.put(uniqueId, JSONObject.toJSONString(generateCollectionVO));
// 将结果存在redis中 ,为空时不要存
redisUtil.addToMap(resultMapKey, generateResult);
}*/
} }
} catch (BusinessException e) { } catch (Exception e) {
log.error(e.getMsg()); log.error(e.getMessage());
// channel.basicNack() 为不确认deliveryTag对应的消息第二个参数是否应用于多消息第三个参数是否requeue // channel.basicNack() 为不确认deliveryTag对应的消息第二个参数是否应用于多消息第三个参数是否requeue
try { try {
// 第二个参数是否批量确认消息当传false时只确认当前 deliveryTag对应的消息;当传true时会确认当前及之前所有未确认的消息。 // 第二个参数是否批量确认消息当传false时只确认当前 deliveryTag对应的消息;当传true时会确认当前及之前所有未确认的消息。
@@ -94,7 +93,7 @@ public class GenerateConsumer {
} }
// 将入参和错误信息存入数据库 // 将入参和错误信息存入数据库
String exceptionMessage = JSONObject.toJSONString(generateThroughImageTextDTO) + String exceptionMessage = JSONObject.toJSONString(generateThroughImageTextDTO) +
" Exception message " + e.getMsg(); " Exception message " + e.getMessage();
HashMap<String, String> exceptionInfo = new HashMap<>(); HashMap<String, String> exceptionInfo = new HashMap<>();
exceptionInfo.put(String.valueOf(uniqueId), exceptionMessage); exceptionInfo.put(String.valueOf(uniqueId), exceptionMessage);
// 存redis // 存redis
@@ -154,63 +153,169 @@ public class GenerateConsumer {
} }
@RabbitListener(queues = MQConfig.GENERATE_QUEUE) public void processToProductImageResult(Message msg, Channel channel) {
log.info("============processToProductImageResult listening==========");
long start = System.currentTimeMillis();
Map<String, String> generateResult = JSONObject.parseObject(msg.getBody(), Map.class);
log.info("toProductImage response : {}", generateResult);
try {
log.info("tasks_id : {} start ", generateResult.get("tasks_id"));
if (generateResult.get("status").equals("SUCCESS")) {
String url = generateResult.get("image_url");
String taskId = generateResult.get("tasks_id");
String category = generateResult.get("category");
generateService.processToProductImageResult(taskId, url, category);
} else {
// 修改redis中的数据状态为exception
String key = toProductImageResultKey + ":" + generateResult.get("tasks_id");
redisUtil.addToString(key, new Gson().toJson(new GenerateResultVO(generateResult.get("tasks_id"), null, null, "Fail")), CommonConstant.GENERATE_RESULT_EXPIRE_TIME);
// 将异常信息存到exception中
HashMap<String, String> exceptionInfo = new HashMap<>();
exceptionInfo.put(generateResult.get("tasks_id"), generateResult.get("data"));
// 存redis
redisUtil.addToMap(exceptionMapKey, exceptionInfo);
}
} catch (Exception e) {
log.error(e.getMessage());
try {
channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false);
// 将消息从redis排队队列中删除,需保证被消费的消息存储到db之后再从redis删除
redisUtil.removeFromZSet(consumptionOrderKey, generateResult.get("tasks_id"));
} catch (IOException exception) {
log.error("手动确认,取消返回队列,不再重新消费");
}
// 将入参和错误信息存入数据库
String exceptionMessage = JSONObject.toJSONString(generateResult) +
" Exception message " + e.getMessage();
HashMap<String, String> exceptionInfo = new HashMap<>();
exceptionInfo.put(String.valueOf(generateResult.get("tasks_id")), exceptionMessage);
// 存redis
redisUtil.addToMap(exceptionMapKey, exceptionInfo);
}
long end = System.currentTimeMillis();
log.info("tasks_id : {}, end , message : {}, 执行时长: {} 毫秒", generateResult.get("tasks_id"), generateResult.get("message"), (end - start));
log.info("============ProcessToProductImageResult End listening==========");
}
private void processRelightResult(Message msg, Channel channel) {
log.info("============processRelightResult listening==========");
long start = System.currentTimeMillis();
Map<String, String> generateResult = JSONObject.parseObject(msg.getBody(), Map.class);
log.info("toProductImage response : {}", generateResult);
try {
log.info("tasks_id : {} start ", generateResult.get("tasks_id"));
if (generateResult.get("status").equals("SUCCESS")) {
String url = generateResult.get("image_url");
String taskId = generateResult.get("tasks_id");
String category = generateResult.get("category");
generateService.processRelightResult(taskId, url, category);
} else {
// 修改redis中的数据状态为exception
String key = relightResultKey + ":" + generateResult.get("tasks_id");
redisUtil.addToString(key, new Gson().toJson(new GenerateResultVO(generateResult.get("tasks_id"), null, null, "Fail")), CommonConstant.GENERATE_RESULT_EXPIRE_TIME);
// 将异常信息存到exception中
HashMap<String, String> exceptionInfo = new HashMap<>();
exceptionInfo.put(generateResult.get("tasks_id"), generateResult.get("data"));
// 存redis
redisUtil.addToMap(exceptionMapKey, exceptionInfo);
}
} catch (Exception e) {
log.error(e.getMessage());
try {
channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false);
// 将消息从redis排队队列中删除,需保证被消费的消息存储到db之后再从redis删除
redisUtil.removeFromZSet(consumptionOrderKey, generateResult.get("tasks_id"));
} catch (IOException exception) {
log.error("手动确认,取消返回队列,不再重新消费");
}
// 将入参和错误信息存入数据库
String exceptionMessage = JSONObject.toJSONString(generateResult) +
" Exception message " + e.getMessage();
HashMap<String, String> exceptionInfo = new HashMap<>();
exceptionInfo.put(String.valueOf(generateResult.get("tasks_id")), exceptionMessage);
// 存redis
redisUtil.addToMap(exceptionMapKey, exceptionInfo);
}
long end = System.currentTimeMillis();
log.info("tasks_id : {}, end , message : {}, 执行时长: {} 毫秒", generateResult.get("tasks_id"), generateResult.get("message"), (end - start));
log.info("============ProcessRelightResult End listening==========");
}
@RabbitListener(queues = "#{rabbitMQProperties.queues.generate}")
@RabbitHandler @RabbitHandler
public void generateConsumer1(Message msg, Channel channel) { public void generateConsumer1(Message msg, Channel channel) {
generate(msg, channel, "consumer 1"); generate(msg, channel, "consumer 1");
} }
@RabbitListener(queues = MQConfig.GENERATE_QUEUE) @RabbitListener(queues = "#{rabbitMQProperties.queues.generate}")
@RabbitHandler @RabbitHandler
public void generateConsumer2(Message msg, Channel channel) { public void generateConsumer2(Message msg, Channel channel) {
generate(msg, channel, "consumer 2"); generate(msg, channel, "consumer 2");
} }
@RabbitListener(queues = MQConfig.GENERATE_QUEUE) @RabbitListener(queues = "#{rabbitMQProperties.queues.generate}")
@RabbitHandler @RabbitHandler
public void generateConsumer3(Message msg, Channel channel) { public void generateConsumer3(Message msg, Channel channel) {
generate(msg, channel, "consumer 3"); generate(msg, channel, "consumer 3");
} }
@RabbitListener(queues = MQConfig.GENERATE_QUEUE) @RabbitListener(queues = "#{rabbitMQProperties.queues.generate}")
@RabbitHandler @RabbitHandler
public void generateConsumer4(Message msg, Channel channel) { public void generateConsumer4(Message msg, Channel channel) {
generate(msg, channel, "consumer 4"); generate(msg, channel, "consumer 4");
} }
@RabbitListener(queues = MQConfig.GENERATE_QUEUE) @RabbitListener(queues = "#{rabbitMQProperties.queues.generate}")
@RabbitHandler @RabbitHandler
public void generateConsumer5(Message msg, Channel channel) { public void generateConsumer5(Message msg, Channel channel) {
generate(msg, channel, "consumer 5"); generate(msg, channel, "consumer 5");
} }
@RabbitListener(queues = MQConfig.GENERATE_QUEUE) @RabbitListener(queues = "#{rabbitMQProperties.queues.generate}")
@RabbitHandler @RabbitHandler
public void generateConsumer6(Message msg, Channel channel) { public void generateConsumer6(Message msg, Channel channel) {
generate(msg, channel, "consumer 6"); generate(msg, channel, "consumer 6");
} }
@RabbitListener(queues = MQConfig.GENERATE_QUEUE) @RabbitListener(queues = "#{rabbitMQProperties.queues.generate}")
@RabbitHandler @RabbitHandler
public void generateConsumer7(Message msg, Channel channel) { public void generateConsumer7(Message msg, Channel channel) {
generate(msg, channel, "consumer 7"); generate(msg, channel, "consumer 7");
} }
@RabbitListener(queues = MQConfig.GENERATE_QUEUE) @RabbitListener(queues = "#{rabbitMQProperties.queues.generate}")
@RabbitHandler @RabbitHandler
public void generateConsumer8(Message msg, Channel channel) { public void generateConsumer8(Message msg, Channel channel) {
generate(msg, channel, "consumer 8"); generate(msg, channel, "consumer 8");
} }
@RabbitListener(queues = MQConfig.GENERATE_QUEUE) @RabbitListener(queues = "#{rabbitMQProperties.queues.generate}")
@RabbitHandler @RabbitHandler
public void generateConsumer9(Message msg, Channel channel) { public void generateConsumer9(Message msg, Channel channel) {
generate(msg, channel, "consumer 9"); generate(msg, channel, "consumer 9");
} }
@RabbitListener(queues = MQConfig.GENERATE_RESULT_QUEUE) @RabbitListener(queues = "#{rabbitMQProperties.queues.generateResult}")
@RabbitHandler @RabbitHandler
public void getGenerateResult(Message msg, Channel channel) { public void getGenerateResult(Message msg, Channel channel) {
processGenerateResult(msg, channel); processGenerateResult(msg, channel);
} }
@RabbitListener(queues = "#{rabbitMQProperties.queues.toProductImageResult}")
@RabbitHandler
public void getToProductImageResult(Message msg, Channel channel) {
processToProductImageResult(msg, channel);
}
@RabbitListener(queues = "#{rabbitMQProperties.queues.relightResult}")
@RabbitHandler
public void getRelightResult(Message msg, Channel channel) {
processRelightResult(msg, channel);
}
} }

View File

@@ -1,60 +1,43 @@
package com.ai.da.common.RabbitMQ; package com.ai.da.common.RabbitMQ;
import org.springframework.amqp.core.Queue; import org.springframework.amqp.core.Queue;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
@Configuration @Configuration
public class MQConfig { public class MQConfig {
public static final String GENERATE_EXCHANGE_FANOUT = "generate-exchange"; @Autowired
// public static final String GENERATE_QUEUE = "generate-queue-prod"; private RabbitMQProperties rabbitMQProperties;
// public static final String GENERATE_QUEUE = "generate-queue-test";
// ==================================================================
// public static final String GENERATE_QUEUE = "generate-queue-local";
public static final String GENERATE_QUEUE = "generate-queue-dev";
// public static final String SR_QUEUE = "SR-queue-local";
public static final String SR_QUEUE = "SR-queue-dev";
// public static final String SR_RESULT_QUEUE = "SuperResolution-local";
public static final String SR_RESULT_QUEUE = "SuperResolution-dev";
// public static final String GENERATE_RESULT_QUEUE = "GenerateImage-local";
public static final String GENERATE_RESULT_QUEUE = "GenerateImage-dev";
public MQConfig() {
}
// @Bean
// FanoutExchange fanoutRasaExchange() {
// return new FanoutExchange(GENERATE_EXCHANGE_FANOUT);
// }
/**
* 创建队列,使用工作模式,不用定义交换机
*/
@Bean @Bean
public Queue generateQueue() { public Queue generateQueue() {
return new Queue(GENERATE_QUEUE); return new Queue(rabbitMQProperties.getQueues().getGenerate());
} }
@Bean @Bean
public Queue SRQueue() { public Queue SRQueue() {
return new Queue(SR_QUEUE); return new Queue(rabbitMQProperties.getQueues().getSr());
} }
@Bean @Bean
public Queue SRResultQueue() { public Queue SRResultQueue() {
return new Queue(SR_RESULT_QUEUE); return new Queue(rabbitMQProperties.getQueues().getSrResult());
} }
/** @Bean
* 将队列绑定到交换机上【队列订阅交换机】 public Queue generateResultQueue() {
*/ return new Queue(rabbitMQProperties.getQueues().getGenerateResult());
// @Bean }
// Binding bindingExchangeRasa() {
// return BindingBuilder.bind(queueRasa()).to(fanoutRasaExchange());
// }
@Bean
public Queue toProductImageResultQueue() {
return new Queue(rabbitMQProperties.getQueues().getToProductImageResult());
}
@Bean
public Queue relightResultQueue() {
return new Queue(rabbitMQProperties.getQueues().getRelightResult());
}
} }

View File

@@ -2,6 +2,7 @@ package com.ai.da.common.RabbitMQ;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.AmqpTemplate; import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.annotation.Resource; import javax.annotation.Resource;
@@ -10,19 +11,19 @@ import javax.annotation.Resource;
@Component @Component
public class MQPublisher { public class MQPublisher {
// private final String url = "http://localhost:15672/api/queues/%2f/generate-queue"; @Autowired
private RabbitMQProperties rabbitMQProperties;
@Resource @Autowired
private AmqpTemplate amqpTemplate; private AmqpTemplate amqpTemplate;
public void sendGenerateMessage(String mm) { public void sendGenerateMessage(String mm) {
log.info("send message:" + mm); log.info("send message: " + mm);
amqpTemplate.convertAndSend(MQConfig.GENERATE_QUEUE, mm); amqpTemplate.convertAndSend(rabbitMQProperties.getQueues().getGenerate(), mm);
} }
public void sendSRMessage(String mm) { public void sendSRMessage(String mm) {
log.info("send message:" + mm); log.info("send message: " + mm);
amqpTemplate.convertAndSend(MQConfig.SR_QUEUE, mm); amqpTemplate.convertAndSend(rabbitMQProperties.getQueues().getSr(), mm);
} }
} }

View File

@@ -0,0 +1,30 @@
package com.ai.da.common.RabbitMQ;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "rabbitmq")
@Data
public class RabbitMQProperties {
private Queues queues;
private Exchange exchange;
@Data
public static class Queues {
private String generate;
private String sr;
private String srResult;
private String generateResult;
private String toProductImageResult;
private String relightResult;
}
@Data
public static class Exchange {
private String generate;
}
}

View File

@@ -15,6 +15,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message; import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitHandler; import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@@ -27,6 +28,9 @@ import java.util.HashMap;
@Component @Component
public class SRConsumer { public class SRConsumer {
@Autowired
private RabbitMQProperties rabbitMQProperties;
@Resource @Resource
private RedisUtil redisUtil; private RedisUtil redisUtil;
@@ -218,14 +222,13 @@ public class SRConsumer {
taskListService.updateTaskStatusOrOutputRedis(uniqueId, "fail", null); taskListService.updateTaskStatusOrOutputRedis(uniqueId, "fail", null);
} }
@RabbitListener(queues = MQConfig.SR_QUEUE) @RabbitListener(queues = "#{rabbitMQProperties.queues.sr}")
@RabbitHandler @RabbitHandler
public void SRConsumer1(Message msg, Channel channel) { public void SRConsumer1(Message msg, Channel channel) {
superResolution(msg, channel, "consumer 1"); superResolution(msg, channel, "consumer 1");
} }
@RabbitListener(queues = "#{rabbitMQProperties.queues.srResult}")
@RabbitListener(queues = MQConfig.SR_RESULT_QUEUE)
@RabbitHandler @RabbitHandler
public void SRResultConsumer1(Message msg, Channel channel) { public void SRResultConsumer1(Message msg, Channel channel) {
getSRResult(msg, channel, "consumer 1"); getSRResult(msg, channel, "consumer 1");

View File

@@ -1,11 +1,15 @@
package com.ai.da.common.config; package com.ai.da.common.config;
import com.ai.da.common.utils.ExcelReader;
import com.ai.da.common.utils.MinioUtil;
import com.ai.da.common.utils.SendEmailUtil; import com.ai.da.common.utils.SendEmailUtil;
import com.ai.da.mapper.primary.AccountMapper; import com.ai.da.mapper.primary.*;
import com.ai.da.mapper.primary.TrialOrderMapper; import com.ai.da.mapper.primary.entity.*;
import com.ai.da.mapper.primary.entity.Account; import com.ai.da.mapper.secondary.AttributeRetrievalMapper;
import com.ai.da.mapper.primary.entity.TrialOrder; import com.ai.da.model.enums.StyleEnum;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.Workbook;
@@ -17,15 +21,28 @@ import javax.annotation.PostConstruct;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.nio.file.DirectoryStream;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@Slf4j
@Component @Component
public class MyTaskScheduler { public class MyTaskScheduler {
@PostConstruct
public void test() {
// clearMinio();
// addSystemFileStyle();
}
@Resource @Resource
private AccountMapper accountMapper; private AccountMapper accountMapper;
@@ -34,7 +51,7 @@ public class MyTaskScheduler {
// 定时任务,每十五天执行一次 // 定时任务,每十五天执行一次
// @Scheduled(cron = "0 0 0 ? * MON") // @Scheduled(cron = "0 0 0 ? * MON")
@Scheduled(cron = "0 0 0 */15 * ?") // @Scheduled(cron = "0 0 0 */15 * ?")
public void checkExpiry() { public void checkExpiry() {
// 检测正式用户是否快要过期 // 检测正式用户是否快要过期
QueryWrapper<Account> qw = new QueryWrapper<>(); QueryWrapper<Account> qw = new QueryWrapper<>();
@@ -68,7 +85,7 @@ public class MyTaskScheduler {
} }
} }
} }
@Scheduled(cron = "0 0 8 * * ?") // @Scheduled(cron = "0 0 9 * * ?")
public void sendTrialOrderExcelToManagements() { public void sendTrialOrderExcelToManagements() {
// 获取前一天日期 // 获取前一天日期
LocalDate yesterday = LocalDate.now().minusDays(1); LocalDate yesterday = LocalDate.now().minusDays(1);
@@ -127,6 +144,242 @@ public class MyTaskScheduler {
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
}else {
SendEmailUtil.sendNoExcelEmail("1023316923@qq.com", null);
SendEmailUtil.sendNoExcelEmail("calvinwong@aidlab.hk", null);
SendEmailUtil.sendNoExcelEmail("kaicpang.pang@connect.polyu.hk", null);
SendEmailUtil.sendNoExcelEmail("kimwong@code-create.com.hk", null);
} }
} }
@Resource
private UserLikeGroupMapper userLikeGroupMapper;
@Resource
private UserLikeMapper userLikeMapper;
@Resource
private TDesignPythonOutfitMapper designPythonOutfitMapper;
@Resource
private TDesignPythonOutfitDetailMapper designPythonOutfitDetailMapper;
@Resource
private DesignItemMapper designItemMapper;
@Resource
private DesignItemDetailMapper designItemDetailMapper;
@Resource
private MinioUtil minioUtil;
public void clearMinio() {
// 获取当前所有history
QueryWrapper<UserLikeGroup> userLikeGroupQueryWrapper = new QueryWrapper<>();
List<UserLikeGroup> userLikeGroupList = userLikeGroupMapper.selectList(userLikeGroupQueryWrapper);
List<Long> userLikeGroupIdList = userLikeGroupList.stream().map(UserLikeGroup::getId).collect(Collectors.toList());
QueryWrapper<UserLike> userLikeQueryWrapper = new QueryWrapper<>();
userLikeQueryWrapper.lambda().in(UserLike::getUserLikeGroupId, userLikeGroupIdList);
// 所有喜欢的图片
List<UserLike> userLikes = userLikeMapper.selectList(userLikeQueryWrapper);
List<Long> designOutfitIdList = userLikes.stream().map(UserLike::getDesignOutfitId).collect(Collectors.toList());
QueryWrapper<TDesignPythonOutfit> designPythonOutfitQueryWrapper = new QueryWrapper<>();
designPythonOutfitQueryWrapper.lambda().notIn(TDesignPythonOutfit::getId, designOutfitIdList);
List<TDesignPythonOutfit> tDesignPythonOutfits = designPythonOutfitMapper.selectList(designPythonOutfitQueryWrapper);
// int i = 0;
// for (TDesignPythonOutfit tDesignPythonOutfit : tDesignPythonOutfits) {
// String designUrl = tDesignPythonOutfit.getDesignUrl();
// if (StringUtils.isNotBlank(designUrl)) {
// minioUtil.deleteObject(designUrl);
// i ++;
// }
// QueryWrapper<TDesignPythonOutfitDetail> designPythonOutfitDetailQueryWrapper = new QueryWrapper<>();
// designPythonOutfitDetailQueryWrapper.lambda().eq(TDesignPythonOutfitDetail::getDesignPythonOutfitId, tDesignPythonOutfit.getId());
// List<TDesignPythonOutfitDetail> tDesignPythonOutfitDetails = designPythonOutfitDetailMapper.selectList(designPythonOutfitDetailQueryWrapper);
// for (TDesignPythonOutfitDetail tDesignPythonOutfitDetail : tDesignPythonOutfitDetails) {
// if (!tDesignPythonOutfitDetail.getImageCategory().equals("body")) {
// if (StringUtils.isNotBlank(tDesignPythonOutfitDetail.getImageUrl())) {
// minioUtil.deleteObject(tDesignPythonOutfitDetail.getImageUrl());
// i ++;
// }
// if (StringUtils.isNotBlank(tDesignPythonOutfitDetail.getMaskUrl())) {
// minioUtil.deleteObject(tDesignPythonOutfitDetail.getMaskUrl());
// i ++;
// }
// }
// }
// }
System.out.println("i");
// List<Long> designItemIdList = userLikes.stream().map(UserLike::getDesignItemId).collect(Collectors.toList());
// QueryWrapper<DesignItem> designItemQueryWrapper = new QueryWrapper<>();
// designItemQueryWrapper.lambda().in(DesignItem::getId,designItemIdList);
// List<DesignItem> designItems = designItemMapper.selectList(designItemQueryWrapper);
// for (DesignItem designItem : designItems) {
// QueryWrapper<DesignItemDetail> designItemDetailQueryWrapper = new QueryWrapper<>();
// designItemDetailQueryWrapper.lambda().eq(DesignItemDetail::getDesignItemId, designItem.getId());
// List<DesignItemDetail> designItemDetails = designItemDetailMapper.selectList(designItemDetailQueryWrapper);
// for (DesignItemDetail designItemDetail : designItemDetails) {
//
// }
// }
}
@Resource
private AttributeRetrievalMapper attributeRetrievalMapper;
public void addSystemFileStyle() {
// ExecutorService executorService = Executors.newFixedThreadPool(5);
// try {
// String[] filePaths = {
// "C:\\Users\\10233\\Downloads\\OneDrive_1_2024-10-3\\Mens bottom style output.xlsx",
// "C:\\Users\\10233\\Downloads\\OneDrive_1_2024-10-3\\Mens outer style output.xlsx",
// "C:\\Users\\10233\\Downloads\\OneDrive_1_2024-10-3\\Mens top style output.xlsx"
//// "/workspace/shb/Mens_bottom_style_output.xlsx",
//// "/workspace/shb/Mens_outer_style_output.xlsx",
//// "/workspace/shb/Mens_top_style_output.xlsx"
// };
//
// for (String filePath : filePaths) {
//// executorService.submit(() -> processExcelFile(filePath));
// processExcelFile(filePath);
// }
// }catch (Exception e) {
//
// }
// } finally {
// executorService.shutdown();
// try {
// if (!executorService.awaitTermination(60, TimeUnit.MINUTES)) {
// executorService.shutdownNow();
// }
// } catch (InterruptedException e) {
// executorService.shutdownNow();
// }
// }
String[] filePaths = {
"C:\\Users\\10233\\Downloads\\OneDrive_1_2024-10-3\\Mens bottom style output.xlsx",
"C:\\Users\\10233\\Downloads\\OneDrive_1_2024-10-3\\Mens outer style output.xlsx",
"C:\\Users\\10233\\Downloads\\OneDrive_1_2024-10-3\\Mens top style output.xlsx"
// "/workspace/shb/Mens_bottom_style_output.xlsx",
// "/workspace/shb/Mens_outer_style_output.xlsx",
// "/workspace/shb/Mens_top_style_output.xlsx"
};
for (String filePath : filePaths) {
// executorService.submit(() -> processExcelFile(filePath));
processExcelFile(filePath);
}
}
private void processExcelFile(String filePath) {
System.out.println("线程开始");
try {
List<List<String>> excelData = ExcelReader.readExcel(filePath);
String tableName = getTableNameFromFilePath(filePath);
String prefix = getPrefixFromFilePath(filePath);
for (List<String> columnData : excelData) {
String style = columnData.get(0);
for (int i = 1; i < columnData.size(); i++) {
String fileName = columnData.get(i);
if (StringUtils.isBlank(fileName)) {
continue;
}
if ("X".equals(style)) {
attributeRetrievalMapper.updateStyleByFileName("X", prefix + fileName, tableName);
System.out.println(fileName);
} else {
// if (style.equals("Y2K 风")) {
// StyleEnum.COUNTRY_STYLE
// }else if (style.equals("")) {
//
// }else if (style.equals("")) {
//
// }else if (style.equals("")) {
//
// }else if (style.equals("")) {
//
// }else if (style.equals("")) {
//
// }else if (style.equals("")) {
//
// }else if (style.equals("")) {
//
// }else if (style.equals("")) {
//
// }else if (style.equals("")) {
//
// }else if (style.equals("")) {
//
// }else if (style.equals("")) {
//
// }else if (style.equals("")) {
//
// }else if (style.equals("")) {
//
// }else if (style.equals("")) {
//
// }
attributeRetrievalMapper.updateStyleByFileName(style, prefix + fileName, tableName);
System.out.println(fileName);
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
private String getTableNameFromFilePath(String filePath) {
if (filePath.contains("Blouse")) {
return "female_top";
} else if (filePath.contains("Dress")) {
return "female_dress";
} else if (filePath.contains("Outerwear")) {
return "female_outwear";
} else if (filePath.contains("Skirt")) {
return "female_skirt";
} else if (filePath.contains("Trousers")) {
return "female_pants";
} else if (filePath.contains("bottom")) {
return "male_bottom";
} else if (filePath.contains("outer")) {
return "male_outwear";
} else if (filePath.contains("top")) {
return "male_top";
}
return "";
}
private String getPrefixFromFilePath(String filePath) {
if (filePath.contains("Blouse")) {
return "blouse/";
} else if (filePath.contains("Dress")) {
return "dress/";
} else if (filePath.contains("Outerwear")) {
return "outwear/";
} else if (filePath.contains("Skirt")) {
return "skirt/";
} else if (filePath.contains("Trousers")) {
return "trousers/";
} else if (filePath.contains("bottom")) {
return "bottom/";
} else if (filePath.contains("outer")) {
return "outer/";
} else if (filePath.contains("top")) {
return "top/";
}
return "";
}
// public static List<String> getFileNames(String directoryPath) {
// List<String> fileNames = new ArrayList<>();
// Path path = Paths.get(directoryPath);
//
// try (DirectoryStream<Path> stream = Files.newDirectoryStream(path)) {
// for (Path entry : stream) {
// if (Files.isRegularFile(entry)) {
// fileNames.add(entry.getFileName().toString());
// }
// }
// } catch (IOException e) {
// System.err.println("Error reading directory: " + e.getMessage());
// }
//
// return fileNames;
// }
} }

View File

@@ -3,17 +3,12 @@ package com.ai.da.common.config;
import com.paypal.core.PayPalEnvironment; import com.paypal.core.PayPalEnvironment;
import com.paypal.core.PayPalHttpClient; import com.paypal.core.PayPalHttpClient;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.json.JSONArray;
import org.json.JSONObject;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource; import org.springframework.context.annotation.PropertySource;
import java.util.Iterator;
@Configuration @Configuration
@Slf4j @Slf4j
@PropertySource("classpath:paypal-sandbox.properties") @PropertySource("classpath:payment.properties")
public class PayPalClient { public class PayPalClient {
public PayPalHttpClient client(String mode, String clientId, String clientSecret) { public PayPalHttpClient client(String mode, String clientId, String clientSecret) {

View File

@@ -0,0 +1,20 @@
package com.ai.da.common.constant;
public class AlipayHKConstant {
// 服务名
public static final String CREATE_ORDER = "create_order";
public static final String ORDER_DETAILS = "order_details";
public static final String TRANSACTION_DETAILS = "transaction_details";
public static final String GET_FILE = "get_file";
public static final String CREATE_AUTO_DEBIT = "create_auto_debit";
public static final String REFRESH_TRANSACTION_STATUS = "refresh_transaction_status";
public static final String REFUND_TRANSACTION = "refund_transaction";
// 订单状态
public static final String STATUS_NEW = "new";
public static final String STATUS_WAIT = "wait";
public static final String STATUS_PAID = "paid";
public static final String STATUS_EXPIRED = "expired";
public static final String STATUS_LIQUIDATED = "liquidated";
}

View File

@@ -1,5 +1,8 @@
package com.ai.da.common.constant; package com.ai.da.common.constant;
import java.util.Arrays;
import java.util.List;
public class CommonConstant { public class CommonConstant {
// 单位 秒 10分钟过期 // 单位 秒 10分钟过期
// public static final Long TASK_EXPIRE_TIME = 24 * 60 * 60L; // public static final Long TASK_EXPIRE_TIME = 24 * 60 * 60L;
@@ -11,4 +14,66 @@ public class CommonConstant {
// 单位 秒 一天过期 in redis // 单位 秒 一天过期 in redis
public static final Long GENERATE_RESULT_EXPIRE_TIME = 24 * 60 * 60L; public static final Long GENERATE_RESULT_EXPIRE_TIME = 24 * 60 * 60L;
public static class Numbers{
public static final Integer NUMBER_10 = 10;
public static final Integer NUMBER_1000 = 1000;
public static final Integer NUMBER_10080 = 10080;
}
public static final String GENERATE_PATH = "/api/generate_image";
public static final String GENERATE_SINGLE_LOGO = "/api/generate_single_logo";
public static final String GENERATE_SLOGAN = "/api/slogan";
public static final String GENERATE_CANCEL = "/api/generate_cancel/";
public static final String GENERATE_LOGO_SINGLE_CANCEL = "/api/generate_single_logo_cancel/";
public static final String PYTHON_PORT_9996 = "9996";
public static final String PYTHON_PORT_9997 = "9997";
public static final List<String> AGES_EN = Arrays.asList("Below 20", "20-30", "30-40", "40+");
public static final List<String> AGES_CN = Arrays.asList("20岁以下", "20-30岁", "30-40岁", "40+岁");
public static final List<String> IF_HELPFUL_EN = Arrays.asList("Easy to learn and use", "Easy to get trend information",
"Lots of creative design proposals","The AIGC functions for moodboard is helpful","The AIGC functions for design sketches is helpful",
"Easy to select the right color","The Chatbot function is helpful","The print position function is helpful",
"The drawing function is helpful","The export function is useful","Easy to edit the design","Others");
public static final List<String> IF_HELPFUL_CN = Arrays.asList("易于学习和使用", "容易获取趋势信息",
"提供大量创意设计方案","AIGC功能对灵感板有帮助","AIGC功能对设计草图有帮助",
"容易选择合适的颜色","聊天机器人功能有帮助","打印位置功能有帮助",
"绘图功能有帮助","导出功能有用","设计编辑简单","其他");
public static final List<String> IF_IMPROVE_EN = Arrays.asList("Proposed designs are boring, need more interesting designs",
"Difficult to make changes on design","Only 2D output, no 3D results","Difficult to apply keywords for AIGC generation",
"Clothing is not in the right proportion","Not compatible with pattern making solutions","Improved user interface for better navigation",
"Lack of responsive customer support","Insufficient tutorial or guidance for new users","Limited personalization options for designs","Others");
public static final List<String> IF_IMPROVE_CN = Arrays.asList("提供的设计很无聊,需要更多有趣的设计",
"设计修改困难","只有2D输出没有3D结果","难以选择合适的关键词应用于AIGC生成",
"服装比例不正确","与打版解决方案不兼容","改进用户界面以便更好导航",
"客户支持响应不及时","对新用户的教程或指导不足","设计个性化选项有限","其他");
public static final List<String> IS_SUBSCRIBE = Arrays.asList("yes", "no");
// public static final String DEFAULT_AVATAR = "aida-users/87/avatar/default.jpg";
public static final String DEFAULT_AVATAR = "aida-users/87/avatar/default.png";
/* 截止至2024/08/26在Code-Create DB中pmr_users表中最大的用户id */
public static final Long MAXIMUM_USER_ID = 704L;
// public static final Long MAXIMUM_USER_ID = 225L;
// 激活更改邮箱 链接有效期 毫秒 3天
public static final Long CHANGE_MAILBOX_LINK_VALIDITY = 259200000L;
public static final String RCA_WORKSHOP_TAG = "#RCAworkshop_2024";
public static final String PORTFOLIO_DELETED_EN = "Portfolio has been deleted";
public static final String PORTFOLIO_DELETED_CN = "作品已删除";
} }

View File

@@ -23,7 +23,11 @@ public enum AuthenticationOperationTypeEnum {
/** /**
* 忘记密码 * 忘记密码
*/ */
FORGET_PWD; FORGET_PWD,
/**
* 更改邮箱
*/
CHANGE_MAILBOX;
public static AuthenticationOperationTypeEnum of(String name) { public static AuthenticationOperationTypeEnum of(String name) {
return Stream.of(AuthenticationOperationTypeEnum.values()).filter(v -> v.name().equals(name)).findFirst().orElse(null); return Stream.of(AuthenticationOperationTypeEnum.values()).filter(v -> v.name().equals(name)).findFirst().orElse(null);

View File

@@ -1,5 +1,7 @@
package com.ai.da.common.enums; package com.ai.da.common.enums;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream; import java.util.stream.Stream;
/** /**
@@ -36,7 +38,18 @@ public enum CollectionLevel2TypeEnum {
* 男装下装 * 男装下装
*/ */
BOTTOMS("Bottoms"), BOTTOMS("Bottoms"),
; /**
* 印花-logo
*/
LOGO("Logo"),
/**
* 印花-slogan
*/
SLOGAN("Slogan"),
/**
* 印花-图案
*/
Pattern("Pattern");
private String realName; private String realName;
@@ -51,4 +64,8 @@ public enum CollectionLevel2TypeEnum {
public static CollectionLevel2TypeEnum of(String realName) { public static CollectionLevel2TypeEnum of(String realName) {
return Stream.of(CollectionLevel2TypeEnum.values()).filter(v -> v.getRealName().equals(realName)).findFirst().orElse(null); return Stream.of(CollectionLevel2TypeEnum.values()).filter(v -> v.getRealName().equals(realName)).findFirst().orElse(null);
} }
public static List<String> printType() {
return Arrays.asList(LOGO.getRealName(), SLOGAN.getRealName(), Pattern.getRealName());
}
} }

View File

@@ -8,19 +8,32 @@ import lombok.Getter;
public enum CreditsEventsEnum { public enum CreditsEventsEnum {
PRICE("price","6"), PRICE("price","6"),
// PRICE("price","0.1"),
BUY_CREDITS("Buy Credits","600"), BUY_CREDITS("Buy Credits","60"),
INIT("init", "500"), REFUND("Refund","60"),
// BUY_CREDITS("Buy Credits","10"),
DAILY_CHECKIN("Daily Check-In", "20"), // 每月更新
INIT_YEARLY("init_yearly", "6000"),
INIT_MONTHLY("init_monthly", "5000"),
INIT_TRIAL("init_trial", "100"),
INIT_WEEKLY("init_weekly","6000"),
SOCIAL_MEDIA_SHARING("Social Media Sharing","20"), // SUPER_RESOLUTION("Super Resolution","30"),
SUPER_RESOLUTION("Super Resolution","10"),
SLOGAN("Slogan","10"),
LOGO("Logo","5"),
PATTERN("Pattern","5"),
MOOD_BOARD("MoodBoard","5"),
SKETCH_BOARD("SketchBoard","5"),
TO_PRODUCT_IMAGE("ToProductImage","5"),
RELIGHT("Relight","5"),
QUESTIONNAIRE("Questionnaire","100"),
IMAGE_TO_SKETCH("ImageToSketch","5"),
// SUPER_RESOLUTION("Super Resolution","300"), OTHER("Other","5");
SUPER_RESOLUTION("Super Resolution","5"),
OTHER("Other","10");
private String name; private String name;

View File

@@ -27,7 +27,8 @@ public enum LibraryLevel1TypeEnum {
/** /**
* 模特 * 模特
*/ */
MODELS("Models"); MODELS("Models"),
DESIGN_ELEMENTS("DesignElements");
private String realName; private String realName;

View File

@@ -19,7 +19,17 @@ public enum PayTypeEnum {
/** /**
* PayPal * PayPal
*/ */
PAYPAL("PayPal"); PAYPAL("PayPal"),
/**
* 香港支付宝
*/
ALIPAY_HK("Alipay-HK"),
/**
* Stripe
*/
STRIPE("Stripe");
/** /**
* 类型 * 类型

View File

@@ -46,17 +46,19 @@ public class AuthenticationFilter extends OncePerRequestFilter {
"/webjars/", "/swagger-resources", "/v2/api-docs", "api/account/resetPwd", "/webjars/", "/swagger-resources", "/v2/api-docs", "api/account/resetPwd",
"/api/python/saveGeneratePicture", "/api/python/getLibraryByUserId", "/api/python/saveGeneratePicture", "/api/python/getLibraryByUserId",
"/api/third/party/addUser","/api/third/party/addTrialUser", "/api/third/party/editUser", "/api/element/initDefaultSysFile", "/api/third/party/addUser","/api/third/party/addTrialUser", "/api/third/party/editUser", "/api/element/initDefaultSysFile",
"/api/third/party/addNoLoginRequiredNew","/api/third/party/deleteNoLoginRequiredNew", "/api/third/party/addNoLoginRequiredNew","/api/third/party/deleteNoLoginRequiredNew","/api/third/party/updateNoLoginRequiredNew",
"/api/third/party/existNoLoginRequired","/api/third/party/getRedirectUrl", "/api/third/party/existNoLoginRequired","/api/third/party/getRedirectUrl",
// "/api/python/chatStream", "/api/python/flush","/api/account/healthy","/api/ali-pay/trade/notify","/api/paypal/ipn/back","/api/alipay-hk/trade/notify",
"/api/python/flush","/api/account/healthy","/api/ali-pay/trade/notify","/api/paypal/ipn/back" "/api/portfolio/page", "/api/portfolio/detail", "/api/portfolio/commentPage", "/api/portfolio/viewsIncrease",
"/api/account/designWorksRegister","/api/account/questionnaire","/api/stripe/trade/notify",
"/notification","/api/account/activateNewEmail","/api/third/party/auth/google_callback","/api/third/party/parseGoogleCredential","/api/third/party/receiveDesignResults","/api/third/party/parseWeChatCode"
); );
@Override @Override
protected void doFilterInternal(HttpServletRequest httpServletRequest, @NonNull HttpServletResponse httpServletResponse, @NonNull FilterChain filterChain) throws ServletException, IOException { protected void doFilterInternal(HttpServletRequest httpServletRequest, @NonNull HttpServletResponse httpServletResponse, @NonNull FilterChain filterChain) throws ServletException, IOException {
String requestURI = httpServletRequest.getRequestURI(); String requestURI = httpServletRequest.getRequestURI();
if (calculateUrl(requestURI)) { if (calculateUrl(requestURI) || hasAuthorizationToken(httpServletRequest)) {
StopWatch stopWatch = new StopWatch(); StopWatch stopWatch = new StopWatch();
HttpServletRequest wrappedRequest = httpServletRequest; HttpServletRequest wrappedRequest = httpServletRequest;
HttpServletResponse wrappedResponse = httpServletResponse; HttpServletResponse wrappedResponse = httpServletResponse;
@@ -87,9 +89,14 @@ public class AuthenticationFilter extends OncePerRequestFilter {
return null == filterUrl ? Boolean.TRUE : Boolean.FALSE; return null == filterUrl ? Boolean.TRUE : Boolean.FALSE;
} }
private boolean hasAuthorizationToken(HttpServletRequest request) {
String authorizationHeader = request.getHeader("Authorization");
return authorizationHeader != null && authorizationHeader.startsWith("Bearer");
}
private void extracted(HttpServletRequest request) throws AuthenticationException { private void extracted(HttpServletRequest request) throws AuthenticationException {
String jwtToken = request.getHeader(properties.getJwtTokenHeader()); String jwtToken = request.getHeader(properties.getJwtTokenHeader());
log.debug("后台检查令牌:{}", jwtToken); // log.debug("后台检查令牌:{}", jwtToken);
if (StrUtil.isBlank(jwtToken)) { if (StrUtil.isBlank(jwtToken)) {
String ipAddress = RequestInfoUtil.getIpAddress(request); String ipAddress = RequestInfoUtil.getIpAddress(request);

View File

@@ -2,6 +2,7 @@ package com.ai.da.common.security.jwt;
import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.ai.da.common.constant.CommonConstant;
import com.ai.da.common.security.config.SecurityProperties; import com.ai.da.common.security.config.SecurityProperties;
import com.ai.da.model.vo.AuthPrincipalVo; import com.ai.da.model.vo.AuthPrincipalVo;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
@@ -30,6 +31,7 @@ public class JWTTokenHelper {
private static final String ISSUER = "DWJ"; private static final String ISSUER = "DWJ";
private static final String AUTHORITIES = "authorities"; private static final String AUTHORITIES = "authorities";
private static final String CHANGE_MAILBOX = "changeMailbox";
public String createToken(AuthPrincipalVo principal) { public String createToken(AuthPrincipalVo principal) {
String token = Jwts.builder() String token = Jwts.builder()
@@ -65,4 +67,21 @@ public class JWTTokenHelper {
token = token.replaceAll(securityProperties.getJwtTokenPrefix(), ""); token = token.replaceAll(securityProperties.getJwtTokenPrefix(), "");
return Jwts.parser().setSigningKey(securityProperties.getJwtSecret()).parseClaimsJws(token).getBody(); return Jwts.parser().setSigningKey(securityProperties.getJwtSecret()).parseClaimsJws(token).getBody();
} }
public String createToken(Long userId, String userEmail){
String token = Jwts.builder()
.setId(String.valueOf(userId))
.setSubject(userEmail + "_" + userId)
.setIssuedAt(new Date())
.setIssuer(ISSUER)
.claim(CHANGE_MAILBOX, JSON.toJSONString(new ArrayList<>()))//自定义属性 权限
.setExpiration(new Date(System.currentTimeMillis() + CommonConstant.CHANGE_MAILBOX_LINK_VALIDITY))
.signWith(SignatureAlgorithm.HS256, securityProperties.getJwtSecret())
.compact();
return token;
}
public String parseToEmailAndId(String token) {
return parser(token).getSubject();
}
} }

View File

@@ -0,0 +1,70 @@
package com.ai.da.common.task;
import com.ai.da.mapper.primary.entity.Account;
import com.ai.da.service.AccountService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
@Component
@Slf4j
public class AccountTask {
@Resource
private AccountService accountService;
/**
* 每周日晚上刷新 年付用户、月付用户的积分
*/
@Scheduled(cron = "59 59 23 ? * SUN")
// @Scheduled(cron = "59 59 23 * * ?")
public void refreshCreditsMonthly() {
log.info("每周日晚115959刷新付费用户积分为 6000");
accountService.refreshCreditsWeekly();
}
// @Scheduled(cron = "0 */5 * * * *") // Run every 5 minutes
public void getPaidUser() {
// 获取code-create 表中 指定日期之后 订单状态为wc-processing的订单
accountService.extendValidityForCC();
}
// 每天凌晨0点执行一次
// @Scheduled(cron = "0 0 0 * * ?")
public void cancelActivityBenefits() {
// 1、查询当前所有参与了活动且过期的用户
List<Account> accountList = accountService.getExpiredUserBySystemUser(4);
// 2、将到期用户置为游客
for (Account account : accountList) {
log.info("参与活动的用户{} : {} 于 {} 账号有效期到期,置为游客", account.getId(), account.getUserEmail(), account.getValidEndTime());
accountService.toVisitor(account);
}
}
// 每天检测正式用户到期情况每天凌晨0点执行
// @Scheduled(cron = "0 0 0 * * ?")
public void paidUserToVisitor() {
// 1、查询当前已过期正式用户或试用用户
List<Account> accountList = accountService.getExpiredUserBySystemUser(1);
accountList.addAll(accountService.getExpiredUserBySystemUser(2));
accountList.addAll(accountService.getExpiredUserBySystemUser(3));
// 2、将到期用户置为游客
for (Account account : accountList) {
log.info("用户{} : {} 于 {}账号有效期到期,置为游客", account.getId(), account.getUserEmail(), account.getValidEndTime());
accountService.toVisitor(account);
}
}
/**
* 将Code-Create上注册的用户添加为AiDA的游客
*/
// @Scheduled(cron = "0 */5 * * * *") // Run every 5 minutes
public void registerUserToVisitor() {
accountService.registerUserToVisitor();
}
}

View File

@@ -27,7 +27,7 @@ public class AliPayTask {
// @Scheduled(cron = "0/30 * * * * ?") // @Scheduled(cron = "0/30 * * * * ?")
public void orderConfirm(){ public void orderConfirm(){
log.info("Alipay orderConfirm 被执行......"); // log.info("Alipay orderConfirm 被执行......");
List<OrderInfo> orderInfoList = orderInfoService.getNoPayOrderByDuration(5, PayTypeEnum.ALIPAY.getType()); List<OrderInfo> orderInfoList = orderInfoService.getNoPayOrderByDuration(5, PayTypeEnum.ALIPAY.getType());

View File

@@ -8,7 +8,7 @@ import org.springframework.stereotype.Component;
@Slf4j @Slf4j
public class GenerateTask { public class GenerateTask {
@Scheduled(cron = "0 0 */1 * * ?") // @Scheduled(cron = "0 0 */1 * * ?")
public void generateScheduled(){ public void generateScheduled(){
log.info("测试定时器generate"); log.info("测试定时器generate");

View File

@@ -0,0 +1,216 @@
//package com.ai.da.common.task;
//
//import com.ai.da.common.utils.CopyUtil;
//import com.ai.da.common.utils.ExcelReader;
//import com.ai.da.common.utils.MinioUtil;
//import com.ai.da.common.utils.SendEmailUtil;
//import com.ai.da.mapper.primary.*;
//import com.ai.da.mapper.primary.entity.*;
//import com.ai.da.mapper.secondary.AttributeRetrievalMapper;
//import com.ai.da.mapper.third.*;
//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
//import org.apache.commons.lang3.StringUtils;
//import org.apache.poi.ss.usermodel.Row;
//import org.apache.poi.ss.usermodel.Sheet;
//import org.apache.poi.ss.usermodel.Workbook;
//import org.apache.poi.xssf.usermodel.XSSFWorkbook;
//import org.springframework.stereotype.Component;
//import org.springframework.util.CollectionUtils;
//
//import javax.annotation.PostConstruct;
//import javax.annotation.Resource;
//import java.io.FileOutputStream;
//import java.io.IOException;
//import java.nio.file.Files;
//import java.nio.file.Paths;
//import java.time.LocalDate;
//import java.time.format.DateTimeFormatter;
//import java.util.List;
//import java.util.concurrent.ExecutorService;
//import java.util.concurrent.Executors;
//import java.util.concurrent.TimeUnit;
//import java.util.stream.Collectors;
//
//@Component
//public class MoveDataScheduler {
//
// @PostConstruct
// public void test() {
// moveData();
// }
//
// @Resource
// private UserLikeGroupMapper userLikeGroupMapper;
// @Resource
// private UserLikeGroupZSMapper userLikeGroupZSMapper;
// @Resource
// private UserLikeMapper userLikeMapper;
// @Resource
// private UserLikeZSMapper userLikeZSMapper;
// @Resource
// private CollectionElementMapper collectionElementMapper;
// @Resource
// private CollectionElementZSMapper collectionElementZSMapper;
//
// @Resource
// private CollectionMapper collectionMapper;
//
// @Resource
// private CollectionZSMapper collectionZSMapper;
//
// @Resource
// private DesignMapper designMapper;
//
// @Resource
// private DesignZSMapper designZSMapper;
//
// @Resource
// private DesignItemMapper designItemMapper;
//
// @Resource
// private DesignItemZSMapper designItemZSMapper;
//
// @Resource
// private TDesignPythonOutfitMapper designPythonOutfitMapper;
//
// @Resource
// private TDesignPythonOutfitZSMapper designPythonOutfitZSMapper;
//
// @Resource
// private TDesignPythonOutfitDetailMapper designPythonOutfitDetailMapper;
//
// @Resource
// private TDesignPythonOutfitDetailZSMapper designPythonOutfitDetailZSMapper;
//
// @Resource
// private DesignItemDetailMapper designItemDetailMapper;
// @Resource
// private DesignItemZSDetailMapper designItemDetailZSMapper;
//
// @Resource
// private DesignItemDetailPrintMapper designItemDetailPrintMapper;
//
// @Resource
// private DesignItemDetailPrintZSMapper designItemDetailPrintZSMapper;
//
//
// private void moveData() {
// // 查询用户所有history记录
// QueryWrapper<UserLikeGroup> userLikeGroupQueryWrapper = new QueryWrapper<>();
// userLikeGroupQueryWrapper.lambda().eq(UserLikeGroup::getAccountId, 11411);
// List<UserLikeGroup> userLikeGroupList = userLikeGroupMapper.selectList(userLikeGroupQueryWrapper);
//
// for (UserLikeGroup userLikeGroup : userLikeGroupList) {
//
// com.ai.da.mapper.third.entity.UserLikeGroup userLikeGroupZS = CopyUtil.copyObject(userLikeGroup, com.ai.da.mapper.third.entity.UserLikeGroup.class);
// userLikeGroupZS.setAccountId(11420L);
// userLikeGroupZS.setId(null);
// Collection collection = collectionMapper.selectById(userLikeGroup.getCollectionId());
// com.ai.da.mapper.third.entity.Collection collectionZS = CopyUtil.copyObject(collection, com.ai.da.mapper.third.entity.Collection.class);
// collectionZS.setAccountId(11420L);
// collectionZS.setId(null);
//
// if (collection.getMoodTemplateId() != null) {
// CollectionElement element = collectionElementMapper.selectById(collection.getMoodTemplateId());
// com.ai.da.mapper.third.entity.CollectionElement collectionElementZS = CopyUtil.copyObject(element, com.ai.da.mapper.third.entity.CollectionElement.class);
// collectionElementZS.setAccountId(11420L);
// collectionElementZS.setId(null);
// collectionElementZSMapper.insert(collectionElementZS);
// collectionZS.setMoodTemplateId(String.valueOf(collectionElementZS.getId()));
// }
// collectionZSMapper.insert(collectionZS);
// userLikeGroupZS.setCollectionId(collectionZS.getId());
// userLikeGroupZSMapper.insert(userLikeGroupZS);
//
// // 生成元素
// QueryWrapper<CollectionElement> collectionElementQueryWrapper = new QueryWrapper<>();
// collectionElementQueryWrapper.lambda().eq(CollectionElement::getCollectionId, userLikeGroup.getCollectionId());
// List<CollectionElement> collectionElements = collectionElementMapper.selectList(collectionElementQueryWrapper);
//
// for (CollectionElement collectionElement : collectionElements) {
// com.ai.da.mapper.third.entity.CollectionElement collectionElementZS = CopyUtil.copyObject(collectionElement, com.ai.da.mapper.third.entity.CollectionElement.class);
// collectionElementZS.setId(null);
// collectionElementZS.setAccountId(11420L);
// collectionElementZS.setCollectionId(collectionZS.getId());
// collectionElementZSMapper.insert(collectionElementZS);
// }
//
// // 查询记录关联
// QueryWrapper<UserLike> userLikeQueryWrapper = new QueryWrapper<>();
// userLikeQueryWrapper.lambda().eq(UserLike::getUserLikeGroupId, userLikeGroup.getId());
// List<UserLike> userLikes = userLikeMapper.selectList(userLikeQueryWrapper);
// for (UserLike userLike : userLikes) {
// Design design = designMapper.selectById(userLike.getDesignId());
// com.ai.da.mapper.third.entity.Design designZS = CopyUtil.copyObject(design, com.ai.da.mapper.third.entity.Design.class);
// designZS.setId(null);
// designZS.setAccountId(11420L);
// designZS.setCollectionId(collectionZS.getId());
// designZSMapper.insert(designZS);
//
// com.ai.da.mapper.third.entity.UserLike userLikeZS = CopyUtil.copyObject(userLike, com.ai.da.mapper.third.entity.UserLike.class);
//// Design design = designMapper.selectById(userLike.getDesignId());
// userLikeZS.setId(null);
// DesignItem designItem = designItemMapper.selectById(userLike.getDesignItemId());
// com.ai.da.mapper.third.entity.DesignItem designItemZS = CopyUtil.copyObject(designItem, com.ai.da.mapper.third.entity.DesignItem.class);
// designItemZS.setId(null);
// designItemZS.setAccountId(11420L);
// designItemZS.setDesignId(designZS.getId());
// designItemZSMapper.insert(designItemZS);
//
// QueryWrapper<DesignItemDetail> designItemDetailQueryWrapper = new QueryWrapper<>();
// designItemDetailQueryWrapper.lambda().eq(DesignItemDetail::getDesignItemId, designItem.getId());
// List<DesignItemDetail> designItemDetails = designItemDetailMapper.selectList(designItemDetailQueryWrapper);
// for (DesignItemDetail designItemDetail : designItemDetails) {
// com.ai.da.mapper.third.entity.DesignItemDetail designItemDetailZS = CopyUtil.copyObject(designItemDetail, com.ai.da.mapper.third.entity.DesignItemDetail.class);
// designItemDetailZS.setId(null);
// designItemDetailZS.setDesignItemId(designItemZS.getId());
// designItemDetailZS.setAccountId(11420L);
// designItemDetailZS.setDesignId(designZS.getId());
// designItemDetailZSMapper.insert(designItemDetailZS);
//
// QueryWrapper<DesignItemDetailPrint> designItemDetailPrintQueryWrapper = new QueryWrapper<>();
// designItemDetailPrintQueryWrapper.lambda().eq(DesignItemDetailPrint::getDesignItemDetailId, designItemDetail.getId());
// List<DesignItemDetailPrint> designItemDetailPrintList = designItemDetailPrintMapper.selectList(designItemDetailPrintQueryWrapper);
// if (!CollectionUtils.isEmpty(designItemDetailPrintList)) {
// for (DesignItemDetailPrint designItemDetailPrint : designItemDetailPrintList) {
// com.ai.da.mapper.third.entity.DesignItemDetailPrint designItemDetailPrintZS = CopyUtil.copyObject(designItemDetailPrint, com.ai.da.mapper.third.entity.DesignItemDetailPrint.class);
// designItemDetailPrintZS.setId(null);
// designItemDetailPrintZS.setDesignItemDetailId(designItemDetailZS.getId());
// designItemDetailPrintZSMapper.insert(designItemDetailPrintZS);
// }
// }
// }
//
// userLikeZS.setDesignItemId(designItemZS.getId());
// TDesignPythonOutfit tDesignPythonOutfit = designPythonOutfitMapper.selectById(userLike.getDesignOutfitId());
// com.ai.da.mapper.third.entity.TDesignPythonOutfit tDesignPythonOutfitZS = CopyUtil.copyObject(tDesignPythonOutfit, com.ai.da.mapper.third.entity.TDesignPythonOutfit.class);
// tDesignPythonOutfitZS.setId(null);
// tDesignPythonOutfitZS.setDesignItemId(designItemZS.getId());
// tDesignPythonOutfitZS.setCollectionId(collectionZS.getId());
// tDesignPythonOutfitZS.setUserId(11420L);
// tDesignPythonOutfitZS.setDesignId(designZS.getId());
// designPythonOutfitZSMapper.insert(tDesignPythonOutfitZS);
//
// userLikeZS.setUserLikeGroupId(userLikeGroupZS.getId());
// userLikeZS.setDesignId(designZS.getId());
// userLikeZS.setDesignOutfitId(tDesignPythonOutfitZS.getId());
// userLikeZSMapper.insert(userLikeZS);
//
// QueryWrapper<TDesignPythonOutfitDetail> designPythonOutfitDetailQueryWrapper = new QueryWrapper<>();
// designPythonOutfitDetailQueryWrapper.lambda().eq(TDesignPythonOutfitDetail::getDesignPythonOutfitId, tDesignPythonOutfit.getId());
// List<TDesignPythonOutfitDetail> tDesignPythonOutfitDetails = designPythonOutfitDetailMapper.selectList(designPythonOutfitDetailQueryWrapper);
// for (TDesignPythonOutfitDetail tDesignPythonOutfitDetail : tDesignPythonOutfitDetails) {
// com.ai.da.mapper.third.entity.TDesignPythonOutfitDetail tDesignPythonOutfitDetailZS = CopyUtil.copyObject(tDesignPythonOutfitDetail, com.ai.da.mapper.third.entity.TDesignPythonOutfitDetail.class);
// tDesignPythonOutfitDetailZS.setDesignPythonOutfitId(tDesignPythonOutfitZS.getId());
// tDesignPythonOutfitDetailZS.setId(null);
// tDesignPythonOutfitDetailZS.setDesignId(designZS.getId());
// designPythonOutfitDetailZSMapper.insert(tDesignPythonOutfitDetailZS);
// }
// }
// }
//
//
// }
//
//
//}

View File

@@ -23,12 +23,12 @@ public class PaypalTask {
@Resource @Resource
private PayPalCheckoutService payPalCheckoutService; private PayPalCheckoutService payPalCheckoutService;
@Scheduled(cron = "0/30 * * * * ?") // @Scheduled(cron = "0/30 * * * * ?")
public void orderConfirm() throws SerializeException { public void orderConfirm() throws SerializeException {
log.info("PayPal orderConfirm 被执行......"); // log.info("PayPal orderConfirm 被执行......");
List<OrderInfo> orderInfoList = orderInfoService.getNoPayOrderByDuration(5, PayTypeEnum.PAYPAL.getType()); List<OrderInfo> orderInfoList = orderInfoService.getNoPayOrderByDuration(30, PayTypeEnum.PAYPAL.getType());
for (OrderInfo orderInfo : orderInfoList) { for (OrderInfo orderInfo : orderInfoList) {
String orderNo = orderInfo.getOrderNo(); String orderNo = orderInfo.getOrderNo();

View File

@@ -0,0 +1,40 @@
package com.ai.da.common.task;
import com.ai.da.common.enums.PayTypeEnum;
import com.ai.da.mapper.primary.entity.OrderInfo;
import com.ai.da.service.OrderInfoService;
import com.ai.da.service.StripeService;
import com.paypal.http.exceptions.SerializeException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
@Slf4j
@Component
public class StripeTask {
@Resource
private OrderInfoService orderInfoService;
@Resource
private StripeService stripeService;
// @Scheduled(cron = "0/30 * * * * ?")
public void orderConfirm() throws SerializeException {
// 查看超过30分钟以上仍未支付的订单 置为超时订单
List<OrderInfo> orderInfoList = orderInfoService.getNoPayOrderByDuration(30, PayTypeEnum.STRIPE.getType());
for (OrderInfo orderInfo : orderInfoList) {
String orderNo = orderInfo.getOrderNo();
log.warn("超时订单 ===> {}", orderNo);
//核实订单状态:调用支付宝查单接口
stripeService.checkOrderStatus(orderNo);
}
}
}

View File

@@ -1,14 +1,23 @@
package com.ai.da.common.utils; package com.ai.da.common.utils;
import cn.hutool.core.io.resource.ClassPathResource;
import com.ai.da.model.dto.AlipayHKParametersDTO; import com.ai.da.model.dto.AlipayHKParametersDTO;
import com.ai.da.model.dto.AlipayHKRequestDTO; import com.ai.da.model.dto.AlipayHKRequestDTO;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.google.gson.GsonBuilder; import com.google.gson.GsonBuilder;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
import org.bouncycastle.crypto.digests.SHA256Digest;
import org.bouncycastle.crypto.params.AsymmetricKeyParameter;
import org.bouncycastle.crypto.signers.RSADigestSigner;
import org.bouncycastle.crypto.util.PublicKeyFactory;
import org.bouncycastle.openssl.PEMParser;
import org.bouncycastle.util.io.pem.PemObject; import org.bouncycastle.util.io.pem.PemObject;
import org.bouncycastle.util.io.pem.PemReader; import org.bouncycastle.util.io.pem.PemReader;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.crypto.*; import javax.crypto.*;
import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.IvParameterSpec;
@@ -25,22 +34,27 @@ import java.util.HashMap;
import java.util.UUID; import java.util.UUID;
@Slf4j @Slf4j
@Component
public class AlipayHKEncryptionUtil { public class AlipayHKEncryptionUtil {
@Value("${alipay.hk.merchant-id}") @Value("${alipayHK.merchantId}")
private static String merchantId; private String merchantId;
@Value("${alipay.hk.segment-id}") @Value("${alipayHK.segmentId}")
private static String segmentId; private String segmentId;
@Value("${alipay.hk.AESKey}") @Value("${alipayHK.AESKey}")
private static String aesKey; private String aesKey;
@Value("${alipay.hk.rsaPrivateKey}") @Value("${alipayHK.rsaPrivateKey}")
private static String privateKeyPath; private String privateKeyPath;
@Value("${alipayHK.rsaPublicKey}")
private String publicKeyPath;
@Value("${alipayHK.CODPublicKey}")
private String CODPublicKeyPath;
@Value("${alipay.hk.rsaPublicKey}")
private static String publicKeyPath;
/** /**
* 加密 * 加密
@@ -55,13 +69,14 @@ public class AlipayHKEncryptionUtil {
* @throws BadPaddingException * @throws BadPaddingException
* @throws IOException * @throws IOException
*/ */
public static AlipayHKRequestDTO AESCBCWithRSA(HashMap<String, Object> param, String serviceName) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidAlgorithmParameterException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, IOException { public AlipayHKRequestDTO AESCBCWithRSA(HashMap<String, Object> param, String serviceName) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidAlgorithmParameterException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, IOException {
// Pre-shared secret key, DO NOT hardcode this key // Pre-shared secret key, DO NOT hardcode this key
String key = aesKey; String key = aesKey;
// The path to the rsa private key file, DO NOT save this key to a publicly accessible location // The path to the rsa private key file, DO NOT save this key to a publicly accessible location
// 使用私钥创建数字签名 // 使用私钥创建数字签名
// Mode, aes-128-cbc for 128bit key // Mode, aes-128-cbc for 128bit key
String mode = "aes-128-cbc"; // String mode = "aes-128-cbc";
String mode = "aes-256-cbc";
// Padding mode // Padding mode
String padding = "pkcs7"; String padding = "pkcs7";
// signature alogrithm // signature alogrithm
@@ -75,18 +90,11 @@ public class AlipayHKEncryptionUtil {
requestMessage.setRequest_uuid(UUID.randomUUID().toString()); requestMessage.setRequest_uuid(UUID.randomUUID().toString());
// HashMap<String, Object> param = new HashMap<>(); // HashMap<String, Object> param = new HashMap<>();
requestMessage.setParameters(param); requestMessage.setParameters(param);
/*String orderRef = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
param.put("order_ref", orderRef);
param.put("amount", 208.12);
param.put("subject", "四月帳單 April Bill");
param.put("wallet", "ALIPAYHK");
param.put("segment_id", segmentId);
param.put("payment_solution", "WAP");*/
// Serialize message body // Serialize message body
Gson gson = new GsonBuilder().disableHtmlEscaping().create(); Gson gson = new GsonBuilder().disableHtmlEscaping().create();
String content = gson.toJson(requestMessage); String content = gson.toJson(requestMessage);
log.info("alipay-hk request 加密前:{}", content);
// Secure random iv 获取随机种子 // Secure random iv 获取随机种子
SecureRandom secureRandom = new SecureRandom(); SecureRandom secureRandom = new SecureRandom();
@@ -144,7 +152,7 @@ public class AlipayHKEncryptionUtil {
// Encode to json // Encode to json
String jsonEncoded = JSONObject.toJSONString(alipayHKRequestDTO); String jsonEncoded = JSONObject.toJSONString(alipayHKRequestDTO);
log.info(jsonEncoded); log.info("alipay-hk request 加密加签后:{}",jsonEncoded);
// String info = AlipayHKRequestUtil.createOrder(alipayHKRequestDTO); // String info = AlipayHKRequestUtil.createOrder(alipayHKRequestDTO);
// log.info(info); // log.info(info);
@@ -159,7 +167,23 @@ public class AlipayHKEncryptionUtil {
* @throws Exception * @throws Exception
*/ */
private static PrivateKey readPrivateKeyFromFile(String filePath) throws Exception { private static PrivateKey readPrivateKeyFromFile(String filePath) throws Exception {
BufferedReader reader = new BufferedReader(new FileReader(filePath)); ClassPathResource classPathResource = new ClassPathResource(filePath);
InputStream inputstream = classPathResource.getStream();
String privateKeyContent = getString(inputstream);
// 进行 Base64 解码
byte[] privateKeyBytes = Base64.getDecoder().decode(privateKeyContent);
// 根据 PKCS8 格式的私钥字节数组构造私钥对象
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
return keyFactory.generatePrivate(keySpec);
}
@NotNull
private static String getString(InputStream inputstream) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(inputstream));
// BufferedReader reader = new BufferedReader(new FileReader(filePath));
StringBuilder keyBuffer = new StringBuilder(); StringBuilder keyBuffer = new StringBuilder();
String line; String line;
@@ -174,20 +198,13 @@ public class AlipayHKEncryptionUtil {
.replace("-----BEGIN PRIVATE KEY-----", "") .replace("-----BEGIN PRIVATE KEY-----", "")
.replace("-----END PRIVATE KEY-----", "") .replace("-----END PRIVATE KEY-----", "")
.replaceAll("\\s+", ""); // 去除空格、换行等字符 .replaceAll("\\s+", ""); // 去除空格、换行等字符
return privateKeyContent;
// 进行 Base64 解码
byte[] privateKeyBytes = Base64.getDecoder().decode(privateKeyContent);
// 根据 PKCS8 格式的私钥字节数组构造私钥对象
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
return keyFactory.generatePrivate(keySpec);
} }
/** /**
* 使用 AES 密钥和随机向量进行解密 * 使用 AES 密钥和随机向量进行解密
*/ */
public static String decryptAES(String encryptedText, String iv) throws Exception { public String decryptAES(String encryptedText, String iv) throws Exception {
byte[] encryptedBytes = Base64.getDecoder().decode(encryptedText); byte[] encryptedBytes = Base64.getDecoder().decode(encryptedText);
byte[] ivBytes = Base64.getDecoder().decode(iv); byte[] ivBytes = Base64.getDecoder().decode(iv);
@@ -201,7 +218,7 @@ public class AlipayHKEncryptionUtil {
return new String(decryptedBytes, StandardCharsets.UTF_8); return new String(decryptedBytes, StandardCharsets.UTF_8);
} }
public static void test() throws Exception { public void test() throws Exception {
// 加密数据 // 加密数据
AlipayHKParametersDTO requestMessage = new AlipayHKParametersDTO(); AlipayHKParametersDTO requestMessage = new AlipayHKParametersDTO();
requestMessage.setService("create_order"); requestMessage.setService("create_order");
@@ -227,7 +244,7 @@ public class AlipayHKEncryptionUtil {
// 使用 RSA 公钥加密 AES 密钥 // 使用 RSA 公钥加密 AES 密钥
String rsaPublicKeyPath = publicKeyPath; String rsaPublicKeyPath = publicKeyPath;
PublicKey publicKey = readPublicKey(new File(rsaPublicKeyPath)); PublicKey publicKey = readPublicKey(rsaPublicKeyPath);
Cipher rsaCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); Cipher rsaCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
// Cipher rsaCipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); // Cipher rsaCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
@@ -307,11 +324,14 @@ public class AlipayHKEncryptionUtil {
System.out.println("数字签名验证结果:" + signatureValid); System.out.println("数字签名验证结果:" + signatureValid);
} }
public static PublicKey readPublicKey(File file) throws Exception { // public static PublicKey readPublicKey(File file) throws Exception {
public static PublicKey readPublicKey(String fileName) throws Exception {
KeyFactory factory = KeyFactory.getInstance("RSA"); KeyFactory factory = KeyFactory.getInstance("RSA");
try (FileReader keyReader = new FileReader(file); ClassPathResource classPathResource = new ClassPathResource(fileName);
PemReader pemReader = new PemReader(keyReader)) { InputStream inputStream = classPathResource.getStream();
BufferedReader fileReader = new BufferedReader(new InputStreamReader(inputStream));
try (PemReader pemReader = new PemReader(fileReader)) {
PemObject pemObject = pemReader.readPemObject(); PemObject pemObject = pemReader.readPemObject();
byte[] content = pemObject.getContent(); byte[] content = pemObject.getContent();
@@ -326,4 +346,38 @@ public class AlipayHKEncryptionUtil {
random.nextBytes(iv); random.nextBytes(iv);
return iv; return iv;
} }
public Boolean signatureVerification(String data, String signatureBase64){
Base64.Decoder decoder = Base64.getDecoder();
// Verify key
try {
ClassPathResource classPathResource = new ClassPathResource(CODPublicKeyPath);
InputStream inputstream = classPathResource.getStream();
// 从指定的路径读取公钥文件
InputStreamReader isrPub = new InputStreamReader(inputstream);
PEMParser pemParserPub = new PEMParser(isrPub);
// 使用 PEMParser 解析公钥文件
SubjectPublicKeyInfo pubInfo = (SubjectPublicKeyInfo) pemParserPub.readObject();
// 从 SubjectPublicKeyInfo 创建 AsymmetricKeyParameter 对象
AsymmetricKeyParameter pubKey = PublicKeyFactory.createKey(pubInfo);
// Verifying; 创建 RSADigestSigner 对象并使用 SHA-256 作为摘要算法
RSADigestSigner verifier = new RSADigestSigner(new SHA256Digest());
// 初始化 RSADigestSigner设置为验证模式并提供公钥参数
verifier.init(false, pubKey);
// 将要验证的数据转换为字节数组
byte[] signMessageForVerifying = data.getBytes();
// 将 Base64 编码的签名转换为字节数组
byte[] signatureBase64ForVerifying = decoder.decode(signatureBase64);
// 使用签名器更新要验证的数据
verifier.update(signMessageForVerifying, 0, signMessageForVerifying.length);
// 验证签名并返回结果
Boolean verifyResult = verifier.verifySignature(signatureBase64ForVerifying);
return verifyResult;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
} }

View File

@@ -11,11 +11,13 @@ import java.time.Instant;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import org.springframework.stereotype.Component;
@Slf4j @Slf4j
@Component
public class AlipayHKRequestUtil { public class AlipayHKRequestUtil {
public static String createOrder(AlipayHKRequestDTO alipayHKRequestDTO) throws IOException { public String requestAlipayHK(AlipayHKRequestDTO alipayHKRequestDTO) {
OkHttpClient client = new OkHttpClient().newBuilder() OkHttpClient client = new OkHttpClient().newBuilder()
.connectTimeout(30, TimeUnit.SECONDS) .connectTimeout(30, TimeUnit.SECONDS)
.pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒) .pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒)
@@ -27,27 +29,34 @@ public class AlipayHKRequestUtil {
log.info("Alipay-HK send request unix timestamp: {}", epochMilli); log.info("Alipay-HK send request unix timestamp: {}", epochMilli);
String jsonString = JSONObject.toJSONString(alipayHKRequestDTO, SerializerFeature.WriteMapNullValue); String jsonString = JSONObject.toJSONString(alipayHKRequestDTO, SerializerFeature.WriteMapNullValue);
log.info(jsonString); // log.info(jsonString);
RequestBody body = RequestBody.create(mediaType, jsonString); RequestBody body = RequestBody.create(mediaType, jsonString);
Request request = new Request.Builder() Request request = new Request.Builder()
// .url("https://aqs-api.sandbox-codpayment.com") // .url("https://aqs-api.sandbox-codpayment.com/v1/service")
.url("https://aqs-api.sandbox-codpayment.com/v1/service") .url("https://aqs-api.codpayment.com/v1/service")
.method("POST", body) .method("POST", body)
.addHeader("Content-Type", "application/json;charset=utf-8") .addHeader("Content-Type", "application/json;charset=utf-8")
.build(); .build();
Response response = null; Response response;
String bodyString; String bodyString;
try { try {
// log.info("generateSketchOrPrint请求入参content###{}", JSON.toJSONString(alipayHKRequestDTO, SerializerFeature.WriteMapNullValue));
response = client.newCall(request).execute(); response = client.newCall(request).execute();
assert response.body() != null;
bodyString = response.body().string();
} catch (Exception e) { } catch (Exception e) {
// log.error("PythonService##generateSketchOrPrint异常###{}", ExceptionUtil.getThrowableList(ioException));
// throw new BusinessException("generate.interface.error");
throw new BusinessException(e.getMessage()); throw new BusinessException(e.getMessage());
} }
return response.body().string(); JSONObject jsonObject = JSONObject.parseObject(bodyString);
boolean success = (boolean) jsonObject.get("success");
if (success){
return bodyString;
} else {
String message = jsonObject.get("error_code").toString() + ":" + jsonObject.get("error");
log.error("Alipay return message : {}", message);
throw new BusinessException("Alipay return message : " + message);
}
} }
} }

View File

@@ -0,0 +1,53 @@
package com.ai.da.common.utils;
import lombok.Data;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@Data
public class ExcelReader {
public static List<List<String>> readExcel(String filePath) throws IOException {
List<List<String>> data = new ArrayList<>();
try (FileInputStream fis = new FileInputStream(filePath);
Workbook workbook = new XSSFWorkbook(fis)) {
Sheet sheet = workbook.getSheetAt(0);
int numberOfColumns = sheet.getRow(0).getLastCellNum();
for (int i = 0; i < numberOfColumns; i++) {
List<String> columnData = new ArrayList<>();
for (Row row : sheet) {
Cell cell = row.getCell(i);
if (cell != null) {
switch (cell.getCellType()) {
case STRING:
columnData.add(cell.getStringCellValue());
break;
case NUMERIC:
columnData.add(String.valueOf(cell.getNumericCellValue()));
break;
case BOOLEAN:
columnData.add(String.valueOf(cell.getBooleanCellValue()));
break;
default:
// 跳过空单元格或其他类型(比如错误类型)
break;
}
}
}
// 只有当这一列有数据时,才添加到结果列表中
if (!columnData.isEmpty()) {
data.add(columnData);
}
}
}
return data;
}
}

View File

@@ -8,6 +8,8 @@ import io.minio.http.Method;
import io.minio.messages.DeleteError; import io.minio.messages.DeleteError;
import io.minio.messages.DeleteObject; import io.minio.messages.DeleteObject;
import io.minio.messages.Item; import io.minio.messages.Item;
import io.netty.util.internal.StringUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
@@ -16,6 +18,7 @@ import java.io.*;
import java.security.InvalidKeyException; import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Base64;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@@ -25,6 +28,7 @@ import java.util.stream.Collectors;
* @description minio工具类 * @description minio工具类
* @version3.0 * @version3.0
*/ */
@Slf4j
@Component @Component
public class MinioUtil { public class MinioUtil {
@Autowired @Autowired
@@ -126,6 +130,26 @@ public class MinioUtil {
return names; return names;
} }
public String uploadImageFromBase64(String bucketName, String base64Image, String imageType) {
byte[] imageBytes = Base64.getDecoder().decode(base64Image);
String fileName = UUID.randomUUID().toString() + "." + imageType; // or any other image format
try (InputStream in = new ByteArrayInputStream(imageBytes)) {
minioClient.putObject(PutObjectArgs.builder()
.bucket(bucketName)
.object(fileName)
.stream(in, in.available(), -1)
.contentType("image/png") // Set the content type according to your image format
.build()
);
return bucketName + "/" + fileName;
} catch (Exception e) {
e.printStackTrace();
return null; // or throw an exception
}
}
/** /**
* description: 上传文件 * description: 上传文件
* *
@@ -349,7 +373,7 @@ public class MinioUtil {
* @param expiry 过期时间(单位:分) * @param expiry 过期时间(单位:分)
* @return 文件的临时URL如果出现异常则返回null * @return 文件的临时URL如果出现异常则返回null
*/ */
public String getPresignedUrl(String bucketName, String fileName, int expiry) { public String getPreSignedUrl(String bucketName, String fileName, int expiry) {
try { try {
return minioClient.getPresignedObjectUrl( return minioClient.getPresignedObjectUrl(
GetPresignedObjectUrlArgs.builder() GetPresignedObjectUrlArgs.builder()
@@ -365,7 +389,7 @@ public class MinioUtil {
} }
} }
public String getPresignedUrl(String path, int expiry) { public String getPreSignedUrl(String path, int expiry) {
if (LocalCacheUtils.getPresignedUrlCache(path) != null) { if (LocalCacheUtils.getPresignedUrlCache(path) != null) {
return LocalCacheUtils.getPresignedUrlCache(path); return LocalCacheUtils.getPresignedUrlCache(path);
} else { } else {
@@ -375,12 +399,28 @@ public class MinioUtil {
int index = path.indexOf("/"); int index = path.indexOf("/");
String bucketName = path.substring(0, index); String bucketName = path.substring(0, index);
String fileName = path.substring(index + 1); String fileName = path.substring(index + 1);
String presignedUrl = getPresignedUrl(bucketName, fileName, expiry); String presignedUrl = getPreSignedUrl(bucketName, fileName, expiry);
LocalCacheUtils.setPresignedUrlCache(path, presignedUrl); LocalCacheUtils.setPresignedUrlCache(path, presignedUrl);
return presignedUrl; return presignedUrl;
} }
} }
public String getPreSignedUrl(String path, int expiry, boolean resetCache) {
if (resetCache || LocalCacheUtils.getPresignedUrlCache(path) == null) {
if (!path.contains("/")) {
throw new BusinessException("The path is error!");
}
int index = path.indexOf("/");
String bucketName = path.substring(0, index);
String fileName = path.substring(index + 1);
String presignedUrl = getPreSignedUrl(bucketName, fileName, expiry);
LocalCacheUtils.setPresignedUrlCache(path, presignedUrl);
return presignedUrl;
} else {
return LocalCacheUtils.getPresignedUrlCache(path);
}
}
/** /**
* 将桶名、文件名从url中分离出来 * 将桶名、文件名从url中分离出来
* *
@@ -398,7 +438,7 @@ public class MinioUtil {
fileName.append("/"); fileName.append("/");
} }
} }
return getPresignedUrl(bucketName, String.valueOf(fileName), expiry); return getPreSignedUrl(bucketName, String.valueOf(fileName), expiry);
} }
public boolean doesObjectExist(String bucketName, String objectName) { public boolean doesObjectExist(String bucketName, String objectName) {
@@ -415,6 +455,86 @@ public class MinioUtil {
return false; return false;
} }
} }
public String base64UploadToPath(String base64, String bucketName, String path){
String[] parts = base64.split(",");
String imageType = parts[0].split("/")[1].split(";")[0];
String base64Data = parts[1];
byte[] imageBytes = Base64.getDecoder().decode(base64Data);
String fileName;
if (!StringUtil.isNullOrEmpty(path)){
fileName = path + "." + imageType; // or any other image format
}else {
fileName = UUID.randomUUID() + "." + imageType;
}
try (InputStream in = new ByteArrayInputStream(imageBytes)) {
minioClient.putObject(PutObjectArgs.builder()
.bucket(bucketName)
.object(fileName)
.stream(in, in.available(), -1)
.contentType("image/" + imageType) // Set the content type according to your image format
.build()
);
return bucketName + "/" + fileName;
} catch (Exception e) {
log.error(e.getMessage());
return null; // or throw an exception
}
}
/**
* 从 MinIO 下载对象到本地路径
*
* @param bucketName 存储桶名称
* @param objectName MinIO 上对象的名称
* @param localFilePath 本地文件路径
*/
public void downloadMinioObjectToLocal(String bucketName, String objectName, String localFilePath) {
File localFile = new File(localFilePath);
File parentDir = localFile.getParentFile();
if (parentDir != null) {
parentDir.mkdirs(); // 创建文件夹,确保路径结构与 MinIO 一致
}
try (InputStream stream = minioClient.getObject(
GetObjectArgs.builder().bucket(bucketName).object(objectName).build());
FileOutputStream out = new FileOutputStream(localFile)) {
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = stream.read(buffer)) != -1) {
out.write(buffer, 0, bytesRead);
}
log.info("Downloaded object {} to {}", objectName, localFilePath);
} catch (Exception e) {
log.error("Error while downloading object {}: {}", objectName, e.getMessage());
}
}
/**
* 从路径中提取存储桶名称
*
* @param path MinIO 路径
* @return 存储桶名称
*/
public String getBucketNameFromPath(String path) {
int index = path.indexOf("/");
return path.substring(0, index); // 获取第一级路径作为 bucket 名称
}
/**
* 从路径中提取对象名称
*
* @param path MinIO 路径
* @return 对象名称
*/
public String getObjectNameFromPath(String path) {
int index = path.indexOf("/");
return path.substring(index + 1); // 获取路径的其余部分作为对象名称
}
} }

View File

@@ -1,16 +1,16 @@
package com.ai.da.common.utils; package com.ai.da.common.utils;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ZSetOperations; import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.List; import java.util.*;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@Slf4j @Slf4j
@Component @Component
@@ -152,6 +152,8 @@ public class RedisUtil {
return redisTemplate.keys(key); return redisTemplate.keys(key);
} }
public Long getSize(String key){return redisTemplate.opsForSet().size(key);}
public List<String> getMultiValue(Set<String> keys){ public List<String> getMultiValue(Set<String> keys){
return redisTemplate.opsForValue().multiGet(keys); return redisTemplate.opsForValue().multiGet(keys);
} }
@@ -164,4 +166,116 @@ public class RedisUtil {
redisTemplate.delete(key); redisTemplate.delete(key);
} }
public final static String PORTFOLIO_LIKE_KEY = "portfolio:like:";
public void likePost(Long portfolioId, Long userId) {
redisTemplate.opsForSet().add(PORTFOLIO_LIKE_KEY + portfolioId, String.valueOf(userId));
}
public Long getLikeCount(Long portfolioId) {
String key = PORTFOLIO_LIKE_KEY + portfolioId;
return redisTemplate.opsForSet().size(key);
}
public List<Long> getLikedPortfolios(Long userId) {
// 获取所有包含PORTFOLIO_LIKE_KEY的键
Set<String> likedPortfolios = redisTemplate.keys(PORTFOLIO_LIKE_KEY + "*");
// 如果没有喜欢的,返回空列表
if (likedPortfolios == null || likedPortfolios.isEmpty()) {
return new ArrayList<>();
}
// 过滤出包含指定用户ID的键并提取投资组合ID
return likedPortfolios.stream()
.filter(key -> redisTemplate.opsForSet().isMember(key, String.valueOf(userId)))
.map(key -> Long.valueOf(key.replace(PORTFOLIO_LIKE_KEY, "")))
.collect(Collectors.toList());
}
public void unLikePost(Long portfolioId, Long userId) {
redisTemplate.opsForSet().remove(PORTFOLIO_LIKE_KEY + portfolioId, userId.toString());
}
// 检查用户是否喜欢某个作品
public boolean isPostLikedByUser(Long portfolioId, Long userId) {
String key = PORTFOLIO_LIKE_KEY + portfolioId;
Boolean isMember = redisTemplate.opsForSet().isMember(key, userId.toString());
return isMember != null && isMember;
}
public final static String PORTFOLIO_VIEW_KEY = "portfolio:view:";
public void increaseViewCount(Long portfolioId) {
String key = PORTFOLIO_VIEW_KEY + portfolioId;
redisTemplate.opsForValue().increment(key);
}
public Long getViewCount(Long portfolioId) {
String key = PORTFOLIO_VIEW_KEY + portfolioId;
return redisTemplate.opsForValue().increment(key, 0);
}
public Long getViewCount(String key) {
Object value = redisTemplate.opsForValue().get(key);
if (value instanceof Integer) {
return Long.valueOf((Integer) value);
} else if (value instanceof Long) {
return (Long) value;
} else if (value instanceof String) {
return Long.valueOf((String) value);
} else {
throw new IllegalArgumentException("Unexpected value type");
}
}
public final static String PERSONAL_HOMEPAGE_VIEW_KEY = "PersonalHomepage:view:";
public void increasePersonalHomepageViewCount(Long accountId) {
String key = PERSONAL_HOMEPAGE_VIEW_KEY + accountId;
redisTemplate.opsForValue().increment(key);
}
public Long getPersonalHomepageViewCount(Long accountId) {
String key = PERSONAL_HOMEPAGE_VIEW_KEY + accountId;
return redisTemplate.opsForValue().increment(key, 0);
}
public final static String MOODBOARD_POSITION_KEY = "moodboard:position:";
public void saveMoodboardPosition(Long id, String moodboardPosition) {
addToString(MOODBOARD_POSITION_KEY + id, moodboardPosition);
}
public String getMoodboardPosition(Long id) {
return getFromString(MOODBOARD_POSITION_KEY + id);
}
public final static String NICKNAME_MODIFY_TIMES = "NicknameModifyTimes:";
public void increaseCount(String key) {
redisTemplate.opsForValue().increment(key);
}
public Long getIncrementCount(String key) {
return redisTemplate.opsForValue().increment(key, 0);
}
public void setKeyExpire(String key, Long expire) {
redisTemplate.expire(key, expire, TimeUnit.DAYS);
}
public final static String CHANGE_MAILBOX = "ChangeMailbox:";
// 每天允许通知3次
public final static String UPLOAD_TIMEOUT_REMINDER_COUNTER = "UploadTimeoutReminderCounter";
public void addProcessId(String processId, int progress) {
// Redis 中的键,可以通过 processId 来唯一标识
String redisKey = "process:progress:" + processId;
// 将当前进度存储到 Redis
redisTemplate.opsForValue().set(redisKey, String.valueOf(progress));
// 设置过期时间为 5 分钟300 秒)
redisTemplate.expire(redisKey, 5, TimeUnit.MINUTES);
}
} }

View File

@@ -0,0 +1,380 @@
package com.ai.da.common.utils;
import com.ai.da.common.config.exception.BusinessException;
import com.ai.da.common.constant.CommonConstant;
import io.netty.util.internal.StringUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
import software.amazon.awssdk.core.ResponseBytes;
import software.amazon.awssdk.core.sync.RequestBody;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.S3Configuration;
import software.amazon.awssdk.services.s3.model.*;
import software.amazon.awssdk.services.s3.presigner.S3Presigner;
import software.amazon.awssdk.services.s3.presigner.model.GetObjectPresignRequest;
import software.amazon.awssdk.services.s3.presigner.model.PresignedGetObjectRequest;
import javax.annotation.PostConstruct;
import java.io.*;
import java.time.Duration;
import java.util.*;
import java.util.stream.Collectors;
@Slf4j
@Component
public class S3Util {
@Value("${aws.s3.accessKeyId}")
private String accessKeyId;
@Value("${aws.s3.secretKey}")
private String secretKey;
@Value("${aws.s3.regionName}")
private String region;
public static String S3_ACCESS_KEY_ID = null;
public static String S3_SECRET_KEY = null;
public static String S3_REGION = null;
@PostConstruct
public void init() {
S3_ACCESS_KEY_ID = accessKeyId;
S3_SECRET_KEY = secretKey;
S3_REGION = region;
}
private static S3Client s3Client;
private static S3Presigner s3Presigner;
/**
* @return software.amazon.awssdk.services.s3.S3Client
* @description: 获取S3客户端对象
*/
public synchronized S3Client getS3Client() {
if (null == s3Client) {
s3Client = S3Client.builder()
.credentialsProvider(StaticCredentialsProvider.create(AwsBasicCredentials.create(S3_ACCESS_KEY_ID, S3_SECRET_KEY)))
// .endpointOverride(URI.create(S3_URI))
.serviceConfiguration(item -> item.pathStyleAccessEnabled(true).checksumValidationEnabled(false))
.region(Region.of(S3_REGION))
.build();
}
return s3Client;
}
/**
* @return software.amazon.awssdk.services.s3.presigner.S3Presigner
* @description: 获取预签名对象
*/
public synchronized S3Presigner getS3PreSigner() {
if (null == s3Presigner) {
s3Presigner = S3Presigner.builder()
.credentialsProvider(StaticCredentialsProvider.create(AwsBasicCredentials.create(S3_ACCESS_KEY_ID, S3_SECRET_KEY)))
// .endpointOverride(URI.create(S3_URI))
.serviceConfiguration(S3Configuration.builder()
.checksumValidationEnabled(false)
.pathStyleAccessEnabled(true)
.build())
.region(Region.of(S3_REGION))
.build();
}
return s3Presigner;
}
public String uploadImageFromBase64(String bucketName, String base64Image, String imageType) {
S3Client s3Client = getS3Client();
byte[] imageBytes = Base64.getDecoder().decode(base64Image);
String fileName = UUID.randomUUID() + "." + imageType; // or any other image format
try (InputStream in = new ByteArrayInputStream(imageBytes)) {
PutObjectRequest putObjectRequest = PutObjectRequest.builder()
.bucket(bucketName)
.contentType("image/png")
.contentLength((long) in.available())
.key(fileName)
.acl(ObjectCannedACL.PUBLIC_READ)
.build();
s3Client.putObject(putObjectRequest, RequestBody.fromInputStream(in, in.available()));
log.info("uploadImageFromBase64 上传的位置:桶 - {},路径 - {}", bucketName, fileName);
return bucketName + "/" + fileName;
} catch (Exception e) {
e.printStackTrace();
return null; // or throw an exception
}
}
public String upload(String bucketName, String path, MultipartFile file) {
S3Client s3Client = getS3Client();
try {
String fileName = file.getOriginalFilename();
assert fileName != null;
String[] split = fileName.split("\\.");
if (split.length > 1) {
fileName = path + "/" + UUID.randomUUID() + "." + split[split.length - 1];
} else {
fileName = path + "/" + UUID.randomUUID();
}
PutObjectRequest putObjectRequest = PutObjectRequest.builder()
.bucket(bucketName)
.contentType(file.getContentType())
.contentLength(file.getSize())
.key(fileName)
.acl(ObjectCannedACL.PUBLIC_READ)
.build();
s3Client.putObject(putObjectRequest, RequestBody.fromInputStream(file.getInputStream(), file.getSize()));
log.info("upload 上传的位置:桶 - {},路径 - {}", bucketName, fileName);
return bucketName + "/" + fileName;
} catch (Exception e) {
log.error("上传文件到S3失败 异常:{}", e.getMessage());
return null;
}
}
// todo
public String upload(String bucketName, String path, MultipartFile file, String copy) {
S3Client s3Client = getS3Client();
InputStream in = null;
try {
in = file.getInputStream();
PutObjectRequest putObjectRequest = PutObjectRequest.builder()
.bucket(bucketName)
.contentType(file.getContentType())
.contentLength(file.getSize())
.key(path)
.acl(ObjectCannedACL.PUBLIC_READ)
.build();
s3Client.putObject(putObjectRequest, RequestBody.fromInputStream(file.getInputStream(), file.getSize()));
log.info("upload-copy 上传的位置:桶 - {},路径 - {}", bucketName, path);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return bucketName + "/" + path;
}
public InputStream download(String path) {
if (!path.contains("/")) {
throw new BusinessException("the.path.is.error");
}
int index = path.indexOf("/");
String bucketName = path.substring(0, index);
String objectName = path.substring(index + 1);
return download(bucketName, objectName);
}
public InputStream download(String bucketName, String objectName) {
try {
S3Client s3Client = getS3Client();
GetObjectRequest objectRequest = GetObjectRequest
.builder()
.key(objectName)
.bucket(bucketName)
.build();
// ResponseBytes<GetObjectResponse> objectBytes = s3.getObjectAsBytes(objectRequest);
ResponseBytes<GetObjectResponse> objectAsBytes = s3Client.getObjectAsBytes(objectRequest);
byte[] data = objectAsBytes.asByteArray();
log.info("download 下载图片位置:桶 - {},路径 - {}", bucketName, objectName);
return new ByteArrayInputStream(data);
/*// Write the data to a local file.
File myFile = new File("files/images.png");
OutputStream os = new FileOutputStream(myFile);
os.write(data);
System.out.println("Successfully obtained bytes from an S3 object");
os.close();
return null;*/
// return minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(objectName).build());
} catch (Exception e) {
log.error("");
throw new BusinessException("");
}
}
public void deleteObject(String path) {
if (!path.contains("/")) {
throw new BusinessException("The path is error!");
}
int index = path.indexOf("/");
String bucketName = path.substring(0, index);
String objectName = path.substring(index + 1);
deleteObject(bucketName, objectName);
}
public void deleteObject(String bucketName, String objectName) {
try {
S3Client s3Client = getS3Client();
DeleteObjectRequest deleteObjectRequest = DeleteObjectRequest
.builder()
.key(objectName)
.bucket(bucketName)
.build();
s3Client.deleteObject(deleteObjectRequest);
log.info("Object " + objectName + " successfully removed from bucket " + bucketName);
} catch (Exception e) {
e.printStackTrace();
log.info("Error while removing object " + objectName + " from bucket " + bucketName + ": " + e.getMessage());
}
}
public String getPreSignedUrl(String path, int expiry) {
if (LocalCacheUtils.getPresignedUrlCache(path) != null) {
return LocalCacheUtils.getPresignedUrlCache(path);
} else {
if (!path.contains("/")) {
throw new BusinessException("The path is error!");
}
int index = path.indexOf("/");
String bucketName = path.substring(0, index);
String fileName = path.substring(index + 1);
String preSignedUrl = getPreSignatureUrl(bucketName, fileName, expiry);
LocalCacheUtils.setPresignedUrlCache(path, preSignedUrl);
return preSignedUrl;
}
}
public String getPreSignedUrl(String path, int expiry, boolean resetCache) {
if (resetCache || LocalCacheUtils.getPresignedUrlCache(path) == null) {
if (!path.contains("/")) {
throw new BusinessException("The path is error!");
}
int index = path.indexOf("/");
String bucketName = path.substring(0, index);
String fileName = path.substring(index + 1);
String presignedUrl = getPreSignatureUrl(bucketName, fileName, expiry);
LocalCacheUtils.setPresignedUrlCache(path, presignedUrl);
return presignedUrl;
} else {
return LocalCacheUtils.getPresignedUrlCache(path);
}
}
/**
* @param keyName key名称: test/2022/06/123.pdf
* @param signatureDurationTime 有效期 单位:秒
* @return java.lang.String
* @description: 生成预签名URL
*/
public String getPreSignatureUrl(String bucket, String keyName, Integer signatureDurationTime) {
String preSignatureUrl = "";
try {
S3Presigner s3PreSigner = getS3PreSigner();
S3Client s3Client = getS3Client();
setObjectAcl(s3Client, bucket, keyName, ObjectCannedACL.PUBLIC_READ);
GetObjectRequest getObjectRequest = GetObjectRequest.builder()
.bucket(bucket)
.key(keyName)
.build();
//设置预签名URL可访问时间
signatureDurationTime = Optional.ofNullable(signatureDurationTime)
.map(item -> {
if (item.intValue() > CommonConstant.Numbers.NUMBER_10080) {
item = CommonConstant.Numbers.NUMBER_10080;
}
return item;
})
.orElse(CommonConstant.Numbers.NUMBER_10);
GetObjectPresignRequest getObjectPresignRequest = GetObjectPresignRequest.builder()
.signatureDuration(Duration.ofMinutes(signatureDurationTime))
.getObjectRequest(getObjectRequest)
.build();
PresignedGetObjectRequest presignedGetObjectRequest =
s3PreSigner.presignGetObject(getObjectPresignRequest);
preSignatureUrl = String.valueOf(presignedGetObjectRequest.url());
} catch (Exception e) {
log.error("生成预签名URL失败异常{}", e.getMessage());
}
return preSignatureUrl;
}
public static void setObjectAcl(S3Client s3, String bucketName, String keyName, ObjectCannedACL acl) {
PutObjectAclRequest aclRequest = PutObjectAclRequest.builder()
.bucket(bucketName)
.key(keyName)
.acl(acl)
.build();
s3.putObjectAcl(aclRequest);
}
public boolean doesObjectExist(String bucketName, String objectName) {
try {
S3Client s3Client = getS3Client();
HeadObjectRequest headObjectRequest = HeadObjectRequest.builder()
.bucket(bucketName)
.key(objectName)
.build();
HeadObjectResponse headObjectResponse = s3Client.headObject(headObjectRequest);
return true;
} catch (Exception e) {
log.info("指定文件 {}/{} 不存在", bucketName, objectName);
// 如果发生异常,说明文件不存在或者出现了其他错误
return false;
}
}
public String base64UploadToPath(String base64, String bucketName, String path) {
S3Client s3Client = getS3Client();
String[] parts = base64.split(",");
String imageType = parts[0].split("/")[1].split(";")[0];
String base64Data = parts[1];
byte[] imageBytes = Base64.getDecoder().decode(base64Data);
String fileName;
if (!StringUtil.isNullOrEmpty(path)) {
fileName = path + "." + imageType; // or any other image format
} else {
fileName = UUID.randomUUID() + "." + imageType;
}
try (InputStream in = new ByteArrayInputStream(imageBytes)) {
PutObjectRequest putObjectRequest = PutObjectRequest.builder()
.bucket(bucketName)
.contentType("image/" + imageType)
.contentLength((long) in.available())
.key(fileName)
.acl(ObjectCannedACL.PUBLIC_READ)
.build();
s3Client.putObject(putObjectRequest, RequestBody.fromInputStream(in, in.available()));
log.info("base64UploadToPath 上传的位置:桶 - {},路径 - {}", bucketName, fileName);
return bucketName + "/" + fileName;
} catch (Exception e) {
e.printStackTrace();
return null; // or throw an exception
}
}
public List<String> listAllBucket() {
S3Client s3Client = getS3Client();
ListBucketsResponse listBucketsResponse = s3Client.listBuckets();
List<Bucket> buckets = listBucketsResponse.buckets();
return buckets.stream().map(Bucket::name).collect(Collectors.toList());
}
}

View File

@@ -53,10 +53,12 @@ public class SendEmailUtil {
* 绑定邮箱 * 绑定邮箱
*/ */
public static String BIND_MAILBOX_SUBJECT = "绑定邮箱"; public static String BIND_MAILBOX_SUBJECT = "绑定邮箱";
public static String CHANGE_MAILBOX_SUBJECT = "Change Mailbox";
/** /**
* 登入模板id * 登入模板id
*/ */
public static Long LOGIN_TEMPLATE_ID = 58020L; public static Long LOGIN_TEMPLATE_ID = 58020L;
public static Long PORTFOLIO_REGISTER_ID = 124847L;
/** /**
* 修改密码模板id * 修改密码模板id
*/ */
@@ -70,6 +72,8 @@ public class SendEmailUtil {
*/ */
public static Long BIND_MAILBOX_TEMPLATE_ID = 45619L; public static Long BIND_MAILBOX_TEMPLATE_ID = 45619L;
public static Long CHANGE_MAILBOX_TEMPLATE_ID = 128210L;
public static Boolean send(String receiverAddress, String ip, Long templateId, String verifyCode) { public static Boolean send(String receiverAddress, String ip, Long templateId, String verifyCode) {
try { try {
@@ -91,7 +95,8 @@ public class SendEmailUtil {
req.setDestination(new String[]{receiverAddress}); req.setDestination(new String[]{receiverAddress});
String subject = templateId == LOGIN_TEMPLATE_ID ? LOGIN_SUBJECT : String subject = templateId == LOGIN_TEMPLATE_ID ? LOGIN_SUBJECT :
templateId == UPDATE_PWD_TEMPLATE_ID ? FORGET_PWD_SUBJECT : templateId == UPDATE_PWD_TEMPLATE_ID ? FORGET_PWD_SUBJECT :
templateId == EXCEPTION_ID_TEMPLATE_ID ? EXCEPTION_ID_SUBJECT : BIND_MAILBOX_SUBJECT; templateId == EXCEPTION_ID_TEMPLATE_ID ? EXCEPTION_ID_SUBJECT :
templateId == CHANGE_MAILBOX_TEMPLATE_ID ? CHANGE_MAILBOX_SUBJECT : BIND_MAILBOX_SUBJECT;
req.setSubject(subject); req.setSubject(subject);
req.setTemplate(contractTemplate(templateId, verifyCode, ip)); req.setTemplate(contractTemplate(templateId, verifyCode, ip));
@@ -134,7 +139,9 @@ public class SendEmailUtil {
private final static Long NOTIFICATION_TEMPLATE_ID = 117216L; private final static Long NOTIFICATION_TEMPLATE_ID = 117216L;
private final static Long NOTIFICATION_CHINESE_TEMPLATE_ID = 122229L; private final static Long NOTIFICATION_CHINESE_TEMPLATE_ID = 122229L;
private final static Long TRIAL_ORDER_LIST_ID = 122273L; private final static Long TRIAL_ORDER_LIST_ID = 122273L;
public static void sendCustomEmail(String receiverAddress, String senderAddress, TrialOrder trialOrder, int emailType, String country) { private final static Long NO_TRIAL_ORDER_LIST_ID = 122591L;
public static void sendCustomEmail(String receiverAddress, String senderAddress, TrialOrder trialOrder, int emailType, String country, boolean link) {
try { try {
// 实例化一个认证对象 // 实例化一个认证对象
Credential cred = new Credential(SECRET_ID, SECRET_KEy); Credential cred = new Credential(SECRET_ID, SECRET_KEy);
@@ -171,7 +178,7 @@ public class SendEmailUtil {
}else { }else {
template.setTemplateID(NOTIFICATION_TEMPLATE_ID); template.setTemplateID(NOTIFICATION_TEMPLATE_ID);
} }
template.setTemplateData(buildNotificationData(trialOrder)); template.setTemplateData(buildNotificationData(trialOrder, link));
break; break;
default: default:
break; break;
@@ -227,6 +234,40 @@ public class SendEmailUtil {
throw new BusinessException("failed.to.send.mail"); throw new BusinessException("failed.to.send.mail");
} }
} }
public static void sendNoExcelEmail(String receiverAddress, String senderAddress) {
try {
// 实例化一个认证对象
Credential cred = new Credential(SECRET_ID, SECRET_KEy);
HttpProfile httpProfile = new HttpProfile();
httpProfile.setEndpoint("ses.tencentcloudapi.com");
ClientProfile clientProfile = new ClientProfile();
clientProfile.setHttpProfile(httpProfile);
SesClient client = new SesClient(cred, "ap-hongkong", clientProfile);
SendEmailRequest req = new SendEmailRequest();
if (StringUtils.isEmpty(senderAddress)) {
senderAddress = SEND_ADDRESS;
}
req.setFromEmailAddress(senderAddress);
req.setDestination(new String[]{receiverAddress});
// 根据邮件类型设置不同的主题和模板
String subject = "";
Template template = new Template();
subject = "昨日试用订单数据";
template.setTemplateID(NO_TRIAL_ORDER_LIST_ID);
req.setSubject(subject);
req.setTemplate(template);
// 发送邮件
SendEmailResponse resp = client.SendEmail(req);
log.info("短信发送结果res###{}", SendEmailResponse.toJsonString(resp));
} catch (TencentCloudSDKException e) {
log.info("邮件发送失败###{}", e.toString());
throw new BusinessException("failed.to.send.mail");
}
}
private final static Long WILLBEEXPIRED_TEMPLATE_ID = 118178L; private final static Long WILLBEEXPIRED_TEMPLATE_ID = 118178L;
public static void sendWillBeExpiredEmail(Account account, String senderAddress) { public static void sendWillBeExpiredEmail(Account account, String senderAddress) {
try { try {
@@ -309,7 +350,7 @@ public class SendEmailUtil {
} }
// 构建试用订单通过通知数据 // 构建试用订单通过通知数据
private static String buildNotificationData(TrialOrder trialOrder) { private static String buildNotificationData(TrialOrder trialOrder, boolean link) {
JSONObject jsonObject = new JSONObject(); JSONObject jsonObject = new JSONObject();
// 设置试用订单通过通知相关数据 // 设置试用订单通过通知相关数据
jsonObject.put("title", trialOrder.getTitle()); jsonObject.put("title", trialOrder.getTitle());
@@ -317,11 +358,19 @@ public class SendEmailUtil {
jsonObject.put("givenName", trialOrder.getGivenName()); jsonObject.put("givenName", trialOrder.getGivenName());
jsonObject.put("userName", trialOrder.getUserName()); jsonObject.put("userName", trialOrder.getUserName());
jsonObject.put("email", trialOrder.getEmail()); jsonObject.put("email", trialOrder.getEmail());
if (link) {
jsonObject.put("days", 14);
}else {
jsonObject.put("days", 5);
}
return jsonObject.toJSONString(); return jsonObject.toJSONString();
} }
private final static Long UPGRADE_NOTIFICATION_ID = 118855L; private final static Long UPGRADE_NOTIFICATION_ID = 118855L;
public static void sendUpgradeNotification(Account account, String senderAddress) { private final static Long UPGRADE_SUCCESS_NOTIFICATION_ID = 118856L;
private final static Long UPGRADE_NOTIFICATION_ID_CHINESE = 122898L;
private final static Long UPGRADE_SUCCESS_NOTIFICATION_ID_CHINESE = 122899L;
public static void sendUpgradeNotification(Account account, String senderAddress, Integer type) {
try { try {
// 实例化一个认证对象 // 实例化一个认证对象
Credential cred = new Credential(SECRET_ID, SECRET_KEy); Credential cred = new Credential(SECRET_ID, SECRET_KEy);
@@ -340,8 +389,20 @@ public class SendEmailUtil {
// 根据邮件类型设置不同的主题和模板 // 根据邮件类型设置不同的主题和模板
String subject = ""; String subject = "";
Template template = new Template(); Template template = new Template();
subject = "Upcoming AiDA 3.0 Launch and Scheduled Maintenance"; // if (type == 1) {
template.setTemplateID(UPGRADE_NOTIFICATION_ID); // subject = "Upcoming System Upgrade for AiDA 3.0";
// template.setTemplateID(UPGRADE_NOTIFICATION_ID);
// }else {
// subject = "即将到来的AiDA 3.0系统升级";
// template.setTemplateID(UPGRADE_NOTIFICATION_ID_CHINESE);
// }
if (type == 1) {
subject = "Successful System Upgrade and New Features in AiDA 3.1";
template.setTemplateID(UPGRADE_SUCCESS_NOTIFICATION_ID);
}else {
subject = "系统升级成功和AiDA 3.1新功能";
template.setTemplateID(UPGRADE_SUCCESS_NOTIFICATION_ID_CHINESE);
}
template.setTemplateData(buildAccountData(account)); template.setTemplateData(buildAccountData(account));
req.setSubject(subject); req.setSubject(subject);
@@ -394,7 +455,357 @@ public class SendEmailUtil {
} }
} }
private final static Long QUESTIONNAIRE_FEEDBACK_EN_ID = 124151L;
private final static Long QUESTIONNAIRE_FEEDBACK_CN_ID = 124156L;
public static void questionnaireRelatedNotify(String userName, String email, String language){
try {
// 实例化一个认证对象
Credential cred = new Credential(SECRET_ID, SECRET_KEy);
HttpProfile httpProfile = new HttpProfile();
httpProfile.setEndpoint("ses.tencentcloudapi.com");
ClientProfile clientProfile = new ClientProfile();
clientProfile.setHttpProfile(httpProfile);
SesClient client = new SesClient(cred, "ap-hongkong", clientProfile);
SendEmailRequest req = new SendEmailRequest();
req.setFromEmailAddress(CODE_CREATE_SEND_ADDRESS);
req.setDestination(new String[]{email});
// 根据邮件类型设置不同的主题和模板
Template template = new Template();
String subject = "Thank You for Completing the AiDA System Survey";
template.setTemplateID(QUESTIONNAIRE_FEEDBACK_EN_ID);
if (language.equals("CN")) {
subject = "感谢您完成AiDA系统问卷调查";
template.setTemplateID(QUESTIONNAIRE_FEEDBACK_CN_ID);
}
JSONObject parameter = new JSONObject();
parameter.put("userName", userName);
template.setTemplateData(parameter.toJSONString());
req.setSubject(subject);
req.setTemplate(template);
// 发送邮件
SendEmailResponse resp = client.SendEmail(req);
log.info("短信发送结果res###{}", SendEmailResponse.toJsonString(resp));
} catch (TencentCloudSDKException e) {
log.info("邮件发送失败###{}", e.toString());
throw new BusinessException("failed.to.send.mail");
}
}
private final static Long NEW_USER_PAYMENT_NOTIFICATION_EN = 124889L;
private final static Long NEW_USER_PAYMENT_NOTIFICATION_CN = 124888L;
private final static Long RENEWAL_NOTIFICATION_FOR_OLD_USER_EN = 124892L;
private final static Long RENEWAL_NOTIFICATION_FOR_OLD_USER_CN = 124891L;
public static void notificationForPaidUser(String receiverAddress, int emailType, String country, String userName, String date){
try {
// 实例化一个认证对象
Credential cred = new Credential(SECRET_ID, SECRET_KEy);
HttpProfile httpProfile = new HttpProfile();
httpProfile.setEndpoint("ses.tencentcloudapi.com");
ClientProfile clientProfile = new ClientProfile();
clientProfile.setHttpProfile(httpProfile);
SesClient client = new SesClient(cred, "ap-hongkong", clientProfile);
SendEmailRequest req = new SendEmailRequest();
req.setFromEmailAddress(SEND_ADDRESS);
req.setDestination(new String[]{receiverAddress});
// 根据邮件类型设置不同的主题和模板
String subject = "";
Template template = new Template();
JSONObject parameter = new JSONObject();
switch (emailType) {
// 新用户
case 1:
subject = "Welcome to AiDA!";
if (country.equals("China")) {
template.setTemplateID(NEW_USER_PAYMENT_NOTIFICATION_CN);
}else {
template.setTemplateID(NEW_USER_PAYMENT_NOTIFICATION_EN);
}
parameter.put("userName", userName);
parameter.put("email", receiverAddress);
break;
// 续费用户
case 2:
subject = "Account renewal notification";
if (country.equals("China")) {
template.setTemplateID(RENEWAL_NOTIFICATION_FOR_OLD_USER_CN);
}else {
template.setTemplateID(RENEWAL_NOTIFICATION_FOR_OLD_USER_EN);
}
break;
default:
break;
}
parameter.put("userName", userName);
parameter.put("date", date);
template.setTemplateData(parameter.toJSONString());
req.setSubject(subject);
req.setTemplate(template);
// 发送邮件
SendEmailResponse resp = client.SendEmail(req);
log.info("短信发送结果res###{}", SendEmailResponse.toJsonString(resp));
} catch (TencentCloudSDKException e) {
log.info("邮件发送失败###{}", e.toString());
throw new BusinessException("failed.to.send.mail");
}
}
public static Boolean designWorksRegister(String userEmail, String randomVerifyCode) {
try {
// 实例化一个认证对象入参需要传入腾讯云账户secretIdsecretKey,此处还需注意密钥对的保密
// 密钥可前往https://console.cloud.tencent.com/cam/capi网站进行获取
Credential cred = new Credential(SECRET_ID, SECRET_KEy);
// 实例化一个http选项可选的没有特殊需求可以跳过
HttpProfile httpProfile = new HttpProfile();
httpProfile.setEndpoint("ses.tencentcloudapi.com");
// 实例化一个client选项可选的没有特殊需求可以跳过
ClientProfile clientProfile = new ClientProfile();
clientProfile.setHttpProfile(httpProfile);
// 实例化要请求产品的client对象,clientProfile是可选的
SesClient client = new SesClient(cred, "ap-hongkong", clientProfile);
// 实例化一个请求对象,每个接口都会对应一个request对象
SendEmailRequest req = new SendEmailRequest();
req.setFromEmailAddress(SEND_ADDRESS);
req.setDestination(new String[]{userEmail});
String subject = "Tourist registration";
req.setSubject(subject);
req.setTemplate(contractTemplate(PORTFOLIO_REGISTER_ID, randomVerifyCode, null));
// 返回的resp是一个SendEmailResponse的实例与请求对象对应
SendEmailResponse resp = client.SendEmail(req);
// 输出json格式的字符串回包
log.info("短信发送结果res###{}", SendEmailResponse.toJsonString(resp));
return Boolean.TRUE;
} catch (TencentCloudSDKException e) {
log.info("邮件发送失败###{}", e.toString());
throw new BusinessException("failed.to.send.mail");
}
}
private final static Long NEW_USER_REGISTER_NOTIFICATION_EN = 126919L;
public static void notificationForRegisterUser(String receiverAddress){
try{
// 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey此处还需注意密钥对的保密
// 代码泄露可能会导致 SecretId 和 SecretKey 泄露并威胁账号下所有资源的安全性。以下代码示例仅供参考建议采用更安全的方式来使用密钥请参见https://cloud.tencent.com/document/product/1278/85305
// 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取
Credential cred = new Credential(SECRET_ID, SECRET_KEy);
// 实例化一个http选项可选的没有特殊需求可以跳过
HttpProfile httpProfile = new HttpProfile();
httpProfile.setEndpoint("ses.tencentcloudapi.com");
// 实例化一个client选项可选的没有特殊需求可以跳过
ClientProfile clientProfile = new ClientProfile();
clientProfile.setHttpProfile(httpProfile);
// 实例化要请求产品的client对象,clientProfile是可选的
SesClient client = new SesClient(cred, "ap-hongkong", clientProfile);
// 实例化一个请求对象,每个接口都会对应一个request对象
SendEmailRequest req = new SendEmailRequest();
req.setFromEmailAddress(SEND_ADDRESS);
req.setDestination(new String[]{receiverAddress});
req.setSubject("Welcome to AiDa");
Template template = new Template();
template.setTemplateID(NEW_USER_REGISTER_NOTIFICATION_EN);
template.setTemplateData("{\"email\":\" " + receiverAddress + "\"}");
req.setTemplate(template);
// 返回的resp是一个SendEmailResponse的实例与请求对象对应
SendEmailResponse resp = client.SendEmail(req);
log.info("短信发送结果res###{}", SendEmailResponse.toJsonString(resp));
} catch (TencentCloudSDKException e) {
log.info("邮件发送失败###{}", e.toString());
throw new BusinessException("failed.to.send.mail");
}
}
private final static Long CHANGE_MAILBOX_CONFIRM_CN = 128278L;
private final static Long CHANGE_MAILBOX_CONFIRM_EN = 128277L;
public static void changeMailboxConfirm(String receiverAddress, String language, String name, String link){
try{
// 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey此处还需注意密钥对的保密
// 代码泄露可能会导致 SecretId 和 SecretKey 泄露并威胁账号下所有资源的安全性。以下代码示例仅供参考建议采用更安全的方式来使用密钥请参见https://cloud.tencent.com/document/product/1278/85305
// 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取
Credential cred = new Credential(SECRET_ID, SECRET_KEy);
// 实例化一个http选项可选的没有特殊需求可以跳过
HttpProfile httpProfile = new HttpProfile();
httpProfile.setEndpoint("ses.tencentcloudapi.com");
// 实例化一个client选项可选的没有特殊需求可以跳过
ClientProfile clientProfile = new ClientProfile();
clientProfile.setHttpProfile(httpProfile);
// 实例化要请求产品的client对象,clientProfile是可选的
SesClient client = new SesClient(cred, "ap-hongkong", clientProfile);
// 实例化一个请求对象,每个接口都会对应一个request对象
SendEmailRequest req = new SendEmailRequest();
req.setFromEmailAddress(SEND_ADDRESS);
req.setDestination(new String[]{receiverAddress});
Template template = new Template();
if (language.equals("ENGLISH")){
req.setSubject("Change the email address bound to the AiDA account");
template.setTemplateID(CHANGE_MAILBOX_CONFIRM_EN);
}else {
req.setSubject("更换AiDA账号绑定的邮箱地址");
template.setTemplateID(CHANGE_MAILBOX_CONFIRM_CN);
}
JSONObject param = new JSONObject();
param.put("userName", name);
param.put("link", link);
template.setTemplateData(param.toJSONString());
req.setTemplate(template);
// 返回的resp是一个SendEmailResponse的实例与请求对象对应
SendEmailResponse resp = client.SendEmail(req);
log.info("短信发送结果res###{}", SendEmailResponse.toJsonString(resp));
} catch (TencentCloudSDKException e) {
log.info("邮件发送失败###{}", e.toString());
throw new BusinessException("failed.to.send.mail");
}
}
private final static Long UPLOAD_TIMEOUT_REMINDER = 128324L;
public static void uploadTimeoutReminder(String userName, String time){
String xp = "xupei3360@163.com";
String shb = "shahaibodd99@gmail.com";
String wxd = "X1627315083@163.com";
String pkc = "kaicpang.pang@connect.polyu.hk";
try{
// 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey此处还需注意密钥对的保密
// 代码泄露可能会导致 SecretId 和 SecretKey 泄露并威胁账号下所有资源的安全性。以下代码示例仅供参考建议采用更安全的方式来使用密钥请参见https://cloud.tencent.com/document/product/1278/85305
// 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取
Credential cred = new Credential(SECRET_ID, SECRET_KEy);
// 实例化一个http选项可选的没有特殊需求可以跳过
HttpProfile httpProfile = new HttpProfile();
httpProfile.setEndpoint("ses.tencentcloudapi.com");
// 实例化一个client选项可选的没有特殊需求可以跳过
ClientProfile clientProfile = new ClientProfile();
clientProfile.setHttpProfile(httpProfile);
// 实例化要请求产品的client对象,clientProfile是可选的
SesClient client = new SesClient(cred, "ap-hongkong", clientProfile);
// 实例化一个请求对象,每个接口都会对应一个request对象
SendEmailRequest req = new SendEmailRequest();
req.setFromEmailAddress(SEND_ADDRESS);
req.setDestination(new String[]{shb, xp, wxd, pkc});
Template template = new Template();
req.setSubject("上传图片超时提醒");
template.setTemplateID(UPLOAD_TIMEOUT_REMINDER);
JSONObject param = new JSONObject();
param.put("userName", userName);
param.put("time", time);
template.setTemplateData(param.toJSONString());
req.setTemplate(template);
// 返回的resp是一个SendEmailResponse的实例与请求对象对应
SendEmailResponse resp = client.SendEmail(req);
log.info("短信发送结果res###{}", SendEmailResponse.toJsonString(resp));
} catch (TencentCloudSDKException e) {
log.info("邮件发送失败###{}", e.toString());
throw new BusinessException("failed.to.send.mail");
}
}
private final static Long HALFPRICEPROMOTION_CN_ID = 128582L;
private final static Long HALFPRICEPROMOTION_EN_ID = 128583L;
public static void halfPricePromotion(Account account, String senderAddress, int type) {
try {
// 实例化一个认证对象
Credential cred = new Credential(SECRET_ID, SECRET_KEy);
HttpProfile httpProfile = new HttpProfile();
httpProfile.setEndpoint("ses.tencentcloudapi.com");
ClientProfile clientProfile = new ClientProfile();
clientProfile.setHttpProfile(httpProfile);
SesClient client = new SesClient(cred, "ap-hongkong", clientProfile);
SendEmailRequest req = new SendEmailRequest();
if (StringUtils.isEmpty(senderAddress)) {
senderAddress = CODE_CREATE_SEND_ADDRESS;
}
req.setFromEmailAddress(senderAddress);
req.setDestination(new String[]{account.getUserEmail()});
// 根据邮件类型设置不同的主题和模板
String subject = "";
Template template = new Template();
// if (type == 1) {
// subject = "Upcoming System Upgrade for AiDA 3.0";
// template.setTemplateID(UPGRADE_NOTIFICATION_ID);
// }else {
// subject = "即将到来的AiDA 3.0系统升级";
// template.setTemplateID(UPGRADE_NOTIFICATION_ID_CHINESE);
// }
if (type == 1) {
subject = "AiDA workshop - Win a trip to Hong Kong";
template.setTemplateID(HALFPRICEPROMOTION_EN_ID);
}else {
subject = "AiDA workshop - 赢取香港之旅";
template.setTemplateID(HALFPRICEPROMOTION_CN_ID);
}
template.setTemplateData(buildAccountData(account));
req.setSubject(subject);
req.setTemplate(template);
// 发送邮件
SendEmailResponse resp = client.SendEmail(req);
log.info("短信发送结果res###{}", SendEmailResponse.toJsonString(resp));
} catch (TencentCloudSDKException e) {
log.info("邮件发送失败###{}", e.toString());
throw new BusinessException("failed.to.send.mail");
}
}
private final static Long SYSTEM_UPGRADE_CN_ID = 131743L;
private final static Long SYSTEM_UPGRADE_EN_ID = 131744L;
public static void temporaryUpgrade(Account account, String senderAddress, int type) {
try {
// 实例化一个认证对象
Credential cred = new Credential(SECRET_ID, SECRET_KEy);
HttpProfile httpProfile = new HttpProfile();
httpProfile.setEndpoint("ses.tencentcloudapi.com");
ClientProfile clientProfile = new ClientProfile();
clientProfile.setHttpProfile(httpProfile);
SesClient client = new SesClient(cred, "ap-hongkong", clientProfile);
SendEmailRequest req = new SendEmailRequest();
if (StringUtils.isEmpty(senderAddress)) {
senderAddress = CODE_CREATE_SEND_ADDRESS;
}
req.setFromEmailAddress(senderAddress);
req.setDestination(new String[]{account.getUserEmail()});
// 根据邮件类型设置不同的主题和模板
String subject = "";
Template template = new Template();
if (type == 1) {
subject = "AiDA system upgrade completed";
template.setTemplateID(SYSTEM_UPGRADE_EN_ID);
}else {
subject = "AiDA系统升级完成";
template.setTemplateID(SYSTEM_UPGRADE_CN_ID);
}
template.setTemplateData(buildAccountData(account));
req.setSubject(subject);
req.setTemplate(template);
// 发送邮件
SendEmailResponse resp = client.SendEmail(req);
log.info("短信发送结果res###{}", SendEmailResponse.toJsonString(resp));
} catch (TencentCloudSDKException e) {
log.info("邮件发送失败###{}", e.toString());
throw new BusinessException("failed.to.send.mail");
}
}
} }

View File

@@ -0,0 +1,115 @@
package com.ai.da.common.websocket;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson2.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestParam;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@ServerEndpoint(value = "/notification/{id}")
@Component
@Slf4j
public class NotificationConnection {
//连接超时
public static final long MAX_TIME_OUT = 3 * 60 * 1000;
private Session session;
private Long userId;
// 这里用ConcurrentHashMap 因为他是一个线程安全的Map
private static ConcurrentHashMap<Long, NotificationConnection> websockets = new ConcurrentHashMap<>();
@OnOpen
public void onOpen(Session session, @PathParam("id") String id) { // 接收到前端传来的用户ID
this.session = session;
this.userId = Long.valueOf(id);
this.session.setMaxIdleTimeout(MAX_TIME_OUT);
websockets.put(Long.parseLong(id), this); //将ID作为key当前的对象作为Value
log.info("【建立连接】 用户为:{}", this.session);
log.info("【建立连接】 用户Id为{}", id);
log.info("【当前连接总数】 为:{}", websockets.size());
}
@OnClose
public void onClose(CloseReason reason) {
log.info("【连接断开】 用户为:{}, sessionId: {}, 原因为{}", this.userId, this.session.getId(), reason);
log.info("【当前连接总数】 为:{}", websockets.size());
websockets.remove(this.userId); // 将当前的对象从集合中删除
}
/**
* 错误时调用
* @param throwable 异常
*/
@OnError
public void onError(Throwable throwable) {
log.info("【连接异常】 用户为:{} , sessionId: {}", this.userId, this.session.getId(), throwable);
websockets.remove(this.userId); // 将当前的对象从集合中删除
log.info("【当前连接总数】 为:{}", websockets.size());
}
//收到了客户端消息执行的操作
@OnMessage
public void onMessage(@RequestParam String text){
Map<String, String> textMap = JSONObject.parseObject(text, Map.class);
log.info("收到了一条来自 {} 的消息:{} sessionId{}", this.userId, textMap.get("text"), this.session.getId());
// return "已收到你的消息";
if (textMap.get("text").equals("PING")){
sendMsg(JSON.toJSONString("PONG"), this.userId);
}
}
public void sendMsg(String message, Long userId) {
if (userId == null) { // 如果等于null则证明是群发
// 获取当前Map的一个迭代器遍历Map的方式有很多种看着来
// 这个就是遍历这个集合的过程....
for (Map.Entry<Long, NotificationConnection> entry : websockets.entrySet()) {
// 获取每一个Entry实例
// 获取每一个Value而这个Value就是WebSocket的实例
NotificationConnection webSocket = entry.getValue();
// 接下来就是遍历群发
log.info("广播消息 【给用户】 {}发送消息【{}】", webSocket, message);
try {
webSocket.session.getBasicRemote().sendText(message); // 发送!!!!!!!!!
} catch (IOException e) {
log.error("Failed to send message to session {}: {}", webSocket.session.getId(), e.getMessage());
}
}
} else { // 如果不是群发则判断ID其余步骤一致
// 获取当前Map的一个迭代器遍历Map的方式有很多种看着来
// 这个就是遍历这个集合的过程....
for (Map.Entry<Long, NotificationConnection> entry : websockets.entrySet()) {
// 获取每一个Entry实例
// 获取每一个Value而这个Value就是WebSocket的实例
NotificationConnection webSocket = entry.getValue();
// 获取每一个Key这个Key就是用户ID
Long key = entry.getKey();
// 判断用户ID与当前的Key相等
if (userId.equals(key)) {
log.info("私发消息 【给用户】 {}发送消息【{}】", key, message); // 打印
if (webSocket.session.isOpen()){
// 避免因为网络问题或其他原因导致连接突然关闭而报错
try {
webSocket.session.getBasicRemote().sendText(message); // 则发送给当前的用户即可
} catch (IOException e) {
log.error("Failed to send message to session {}: {}", webSocket.session.getId(), e.getMessage());
// 这里可以选择移除关闭的 session
websockets.remove(entry.getKey());
}
}else {
log.info("连接已关闭sessionId:{}, userId:{}", webSocket.session.getId(), key);
websockets.remove(entry.getKey());
}
}
}
}
}
}

View File

@@ -0,0 +1,16 @@
package com.ai.da.common.websocket.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
/**
* Configuration of WebSocket
*/
@Configuration
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}

View File

@@ -1,17 +1,22 @@
package com.ai.da.controller; package com.ai.da.controller;
import com.ai.da.common.config.exception.BusinessException;
import com.ai.da.common.response.PageBaseResponse; import com.ai.da.common.response.PageBaseResponse;
import com.ai.da.common.response.Response; import com.ai.da.common.response.Response;
import com.ai.da.mapper.primary.entity.Account;
import com.ai.da.mapper.primary.entity.TrialOrder; import com.ai.da.mapper.primary.entity.TrialOrder;
import com.ai.da.model.dto.*; import com.ai.da.model.dto.*;
import com.ai.da.model.vo.AccountLoginVO; import com.ai.da.model.vo.AccountLoginVO;
import com.ai.da.model.vo.AccountPreLoginVO; import com.ai.da.model.vo.AccountPreLoginVO;
import com.ai.da.model.vo.PersonalHomepageVO;
import com.ai.da.service.AccountService; import com.ai.da.service.AccountService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@@ -153,4 +158,156 @@ public class AccountController {
accountService.upgradeNotification(); accountService.upgradeNotification();
return Response.success(true); return Response.success(true);
} }
@CrossOrigin
@ApiOperation(value = "广场用户注册")
@PostMapping("/designWorksRegister")
public Response<Boolean> designWorksRegister(@Valid @RequestBody AccountDesignWorksRegisterDTO accountDesignWorksRegisterDTO) {
return Response.success(accountService.designWorksRegister(accountDesignWorksRegisterDTO));
}
@CrossOrigin
@ApiOperation(value = "广场用户注册")
@PostMapping("/designWorksRegisterCode")
public Response<AccountLoginVO> designWorksRegisterCode(@Valid @RequestBody AccountDesignWorksRegisterDTO accountDesignWorksRegisterDTO) {
return Response.success(accountService.designWorksRegisterCode(accountDesignWorksRegisterDTO));
}
/**
* 填写调查问卷
* @return
*/
@ApiOperation(value = "填写调查问卷")
@PostMapping("/questionnaire")
public Response<Boolean> questionnaire(@Valid @RequestBody String questionnaireInfo){
return Response.success(accountService.collectQuestionnaires(questionnaireInfo));
}
/**
* 参与活动 获取福利
* @return
*/
@ApiOperation(value = "参与活动 获取福利")
@GetMapping("/activity")
public Response<String> getActivityBenefits(){
return Response.success(accountService.getActivityBenefits());
}
@ApiOperation(value = "将用户账号过期时间设置为过期当天的235959")
@GetMapping("/setUserValidToDayEnd")
public Response<List<Long>> setUserValidToDayEnd(){
return Response.success(accountService.setUserValidToDayEnd());
}
// 用户上传头像
@ApiOperation(value = "上传头像")
@PostMapping(path = "/uploadAvatar")
public Response<String> uploadAvatar(@RequestParam("file") MultipartFile file) {
if (null == file || StringUtils.isEmpty(file.getOriginalFilename())) {
throw new BusinessException("file.cannot.be.empty");
}
return Response.success(accountService.uploadAvatar(file));
}
@ApiOperation(value = "个人主页浏览量增加")
@GetMapping("/viewsIncrease")
public Response<Boolean> viewsGet(@RequestParam("id") Long id) {
return Response.success(accountService.viewsIncrease(id));
}
@ApiOperation(value = "获取个人主页信息")
@GetMapping("/personalHomepage")
public Response<PersonalHomepageVO> getPersonalHomepage(@RequestParam("id") Long id){
return Response.success(accountService.getPersonalHomepage(id));
}
@ApiOperation(value = "getUsernameModifyTimes")
@GetMapping("/getNicknameModifyTimes")
public Response<Map<String, Long>> getNicknameModifyTimes(){
return Response.success(accountService.getNicknameModifyTimes());
}
@ApiOperation(value = "editUserName")
@GetMapping("/editUserName")
public Response<String> editUserName(@RequestParam("newUserName") String newUserName){
accountService.editUserName(newUserName);
return Response.success("success");
}
@ApiOperation(value = "verifyUserEmail")
@GetMapping("/verifyUserEmail")
public Response<String> verifyUserEmail(@RequestParam("verifyCode") String verifyCode){
accountService.verifyUserEmail(verifyCode);
return Response.success("success");
}
@ApiOperation(value = "changeUserEmail")
@GetMapping("/changeUserEmail")
public Response<String> changeUserEmail(@RequestParam("newMailbox") String newMailbox){
accountService.changeUserEmail(newMailbox);
return Response.success("success");
}
@ApiOperation(value = "activateNewEmail")
@GetMapping("/activateNewEmail")
public Response<String> activateNewEmail(@RequestParam("token") String token){
accountService.activateNewEmail(token);
return Response.success("success");
}
@PostMapping("halfPricePromotion")
@ApiOperation(value = "十月半价活动")
public Response<Boolean> halfPricePromotion() {
accountService.halfPricePromotion();
return Response.success(true);
}
@PostMapping("temporaryUpgrade")
@ApiOperation(value = "临时升级")
public Response<Boolean> temporaryUpgrade() {
accountService.temporaryUpgrade();
return Response.success(true);
}
@PostMapping("enterpriseLogin")
@ApiOperation(value = "企业登录")
public Response<AccountLoginVO> enterpriseLogin(@Valid @RequestBody AccountLoginDTO accountDTO) {
return Response.success(accountService.enterpriseLogin(accountDTO));
}
@PostMapping("schoolLogin")
@ApiOperation(value = "学校登录")
public Response<AccountLoginVO> schoolLogin(@Valid @RequestBody AccountLoginDTO accountDTO) {
return Response.success(accountService.schoolLogin(accountDTO));
}
@PostMapping("addOrUpdateSubAccount")
@ApiOperation(value = "子账号新增")
public Response<Boolean> addSubAccount(@Valid @RequestBody AddSubAccountDTO addSubAccountDTO) {
return Response.success(accountService.addSubAccount(addSubAccountDTO));
}
@PostMapping("deleteSubAccount")
@ApiOperation(value = "子账号删除")
public Response<Boolean> deleteSubAccount(@Valid @RequestBody AddSubAccountDTO addSubAccountDTO) {
return Response.success(accountService.deleteSubAccount(addSubAccountDTO));
}
@PostMapping("subAccountList")
@ApiOperation(value = "子账号查询")
public Response<PageBaseResponse<Account>> subAccountList(@Valid @RequestBody SubAccountPageDTO subAccountPageDTO) {
return Response.success(accountService.subAccountList(subAccountPageDTO));
}
@GetMapping("accountDetail")
@ApiOperation(value = "账号详情")
public Response<Account> accountDetail(@RequestParam("id") Long id) {
return Response.success(accountService.accountDetail(id));
}
@PostMapping("getAccountDetail")
@ApiOperation(value = "获取账户信息")
public Response<AccountLoginVO> getAccountDetail() {
return Response.success(accountService.getAccountDetail());
}
} }

View File

@@ -1,22 +1,45 @@
package com.ai.da.controller; package com.ai.da.controller;
import com.ai.da.common.response.Response; import com.ai.da.common.response.Response;
import com.ai.da.service.AlipayHKService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource;
@CrossOrigin @CrossOrigin
@RestController @RestController
@RequestMapping("/api/ali-pay-hk") @RequestMapping("/api/alipay-hk")
@Api(tags = "网站支付 香港支付宝") @Api(tags = "网站支付 香港支付宝")
@Slf4j @Slf4j
public class AlipayHKController { public class AlipayHKController {
public Response<String> createOrder(){ @Resource
return Response.success(); private AlipayHKService alipayHKService;
@ApiOperation(value = "创建订单")
@PostMapping(value = "/createOrder/{wallet}/{amount}")
public Response<String> createOrder(@PathVariable Integer amount, @PathVariable String wallet) {
String order = alipayHKService.createOrder(amount, wallet);
return Response.success(order);
}
@ApiOperation("支付通知")
@PostMapping("/trade/notify")
public String callback(@RequestBody String paramString){
log.info("alipay-hk callback parameter : {}", paramString);
return alipayHKService.callback(paramString);
}
@ApiOperation("订单查询")
@PostMapping("/trade/query/{orderRef}")
public Response<String> queryOrder(@PathVariable String orderRef){
String s = alipayHKService.queryDetail(orderRef);
return Response.success(s);
} }
} }

View File

@@ -4,60 +4,167 @@ package com.ai.da.controller;
import com.ai.da.common.context.UserContext; import com.ai.da.common.context.UserContext;
import com.ai.da.common.response.Response; import com.ai.da.common.response.Response;
import com.ai.da.mapper.primary.DesignMapper; import com.ai.da.mapper.primary.DesignMapper;
import com.ai.da.mapper.primary.TrialOrderMapper; import com.ai.da.mapper.primary.entity.Account;
import com.ai.da.mapper.primary.entity.TrialOrder; import com.ai.da.mapper.primary.entity.TrialOrder;
import com.ai.da.model.dto.AccountAddDTO;
import com.ai.da.model.dto.UserDesignStatisticDTO; import com.ai.da.model.dto.UserDesignStatisticDTO;
import com.ai.da.model.vo.QuestionnaireFeedbackVO;
import com.ai.da.model.vo.QuestionnaireVO;
import com.ai.da.model.vo.QueryUserConditionsVO;
import com.ai.da.service.ConvenientInquiryService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.netty.util.internal.StringUtil; import io.netty.util.internal.StringUtil;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.annotation.Nullable;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.validation.Valid;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Date; import java.util.*;
import java.util.List;
@Api(tags = "便利查询") @Api(tags = "便利查询")
@Slf4j @Slf4j
@RestController @RestController
@RequestMapping("/api/inquiry") @RequestMapping("/api/inquiry")
public class ConvenientInquiryController { public class ConvenientInquiryController {
@Resource
private TrialOrderMapper trialOrderMapper;
@Resource @Resource
private DesignMapper designMapper; private DesignMapper designMapper;
@Resource
private ConvenientInquiryService convenientInquiryService;
@ApiOperation("获取当前所有试用用户") @ApiOperation("获取当前所有试用用户")
@GetMapping("/getTrial") @PostMapping("/getTrial")
public Response<List<TrialOrder>> getTrial(){ public Response<IPage<TrialOrder>> getTrial(@Valid @RequestBody QueryUserConditionsVO queryUserConditionsVO) {
Long accountId = UserContext.getUserHolder().getId(); Long accountId = UserContext.getUserHolder().getId();
if (accountId.equals(31L) || accountId.equals(87L) || accountId.equals(83L) || accountId.equals(6L) || accountId.equals(4L) || accountId.equals(73L)){ if (accountId.equals(31L) || accountId.equals(87L) || accountId.equals(83L) || accountId.equals(6L) || accountId.equals(4L) || accountId.equals(73L)) {
List<TrialOrder> trialOrders = trialOrderMapper.selectList(null); return Response.success(convenientInquiryService.getTrial(queryUserConditionsVO));
return Response.success(trialOrders); } else {
}else {
return Response.fail("Sorry, you don't have permission"); return Response.fail("Sorry, you don't have permission");
} }
} }
@ApiOperation("获取指定时间区间内所有用户design的使用情况") @ApiOperation("获取指定时间区间内所有用户design的使用情况")
@GetMapping("/getDesignStatistic") @GetMapping("/getDesignStatistic")
public Response<List<UserDesignStatisticDTO>> getDesignStatistic(@RequestParam String startTime,@RequestParam String endTime){ public Response<List<UserDesignStatisticDTO>> getDesignStatistic(@RequestParam String startTime, @RequestParam String endTime,
@RequestParam(required = false) List<Long> ids, @RequestParam(required = false) String email) {
Long accountId = UserContext.getUserHolder().getId(); Long accountId = UserContext.getUserHolder().getId();
if (accountId.equals(31L) || accountId.equals(87L) || accountId.equals(83L) || accountId.equals(6L) || accountId.equals(4L) || accountId.equals(73L)){ if (accountId.equals(31L) || accountId.equals(87L) || accountId.equals(83L) || accountId.equals(6L) || accountId.equals(4L) || accountId.equals(73L)) {
if (StringUtil.isNullOrEmpty(startTime)) startTime = "2024-02-01 00:00:00"; if (StringUtil.isNullOrEmpty(startTime)) startTime = "2024-02-01 00:00:00";
if (StringUtil.isNullOrEmpty(endTime)){ if (StringUtil.isNullOrEmpty(endTime)) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date date = new Date(); Date date = new Date();
endTime = simpleDateFormat.format(date); endTime = simpleDateFormat.format(date);
} }
List<UserDesignStatisticDTO> designStatistic = designMapper.getDesignStatistic(startTime, endTime); if (!StringUtil.isNullOrEmpty(email)){
email = email.trim();
}
List<UserDesignStatisticDTO> designStatistic = designMapper.getDesignStatistic(startTime, endTime, ids, email);
return Response.success(designStatistic); return Response.success(designStatistic);
}else { } else {
return Response.fail("Sorry, you don't have permission"); return Response.fail("Sorry, you don't have permission");
} }
} }
//调查问卷
@ApiOperation("获取调查问卷统计详情")
@GetMapping("/getQuestionnaireStatistic")
public Response<QuestionnaireFeedbackVO> getQuestionnaire() {
return Response.success(convenientInquiryService.getQuestionnaireInfo());
}
@ApiOperation("获取所有调查问卷")
@GetMapping("/getAllQuestionnaire")
public Response<List<QuestionnaireVO>> getAllQuestionnaire() {
return Response.success(convenientInquiryService.getAllQuestionnaire());
}
@ApiOperation("获取近期新用户")
@PostMapping("/recentNewUser")
public Response<IPage<Account>> recentNewUser(@Valid @RequestBody QueryUserConditionsVO queryUserConditionsVO) {
return Response.success(convenientInquiryService.recentNewUser(queryUserConditionsVO));
}
@ApiOperation("获取近期新用户图表数据")
@GetMapping("/recentNewUserChart")
public Response<Map<String, Object>> recentNewUserChart(@ApiParam(value = "startTime") @RequestParam @Nullable String startTime,
@ApiParam(value = "endTime") @RequestParam @Nullable String endTime,
@ApiParam("userType") @RequestParam Integer userType) {
return Response.success(convenientInquiryService.recentNewUserChart(startTime, endTime, userType));
}
@ApiOperation("获取近期活跃用户")
@PostMapping("/recentActiveUser")
public Response<IPage<Account>> recentActiveUser(@Valid @RequestBody QueryUserConditionsVO queryUserConditionsVO) {
return Response.success(convenientInquiryService.recentActiveUser(queryUserConditionsVO));
}
@ApiOperation("获取近期活跃用户图表数据")
@GetMapping("/recentActiveUserChart")
public Response<Integer> recentActiveUserChart(@ApiParam(value = "startTime") @RequestParam @Nullable String startTime,
@ApiParam(value = "endTime") @RequestParam @Nullable String endTime) {
return Response.success(convenientInquiryService.recentActiveUserChart(startTime, endTime));
}
@ApiOperation("获取用户的各模块功能使用详情")
@GetMapping("/getActiveUserFunc")
public Response<Map<String, List<Object>>> getActiveUserFunc(@ApiParam(value = "startTime") @RequestParam @Nullable String startTime,
@ApiParam(value = "endTime") @RequestParam @Nullable String endTime,
@ApiParam("userIdList") @RequestParam @Nullable List<Long> userIdList) {
return Response.success(convenientInquiryService.getActiveUserFunc(startTime, endTime, userIdList));
}
@ApiOperation("试用用户到正式用户的转化率")
@GetMapping("/conversionRate")
public Response<Map<String, Object>> conversionRate(@ApiParam(value = "startTime") @RequestParam(required = false) @Nullable String startTime,
@ApiParam(value = "endTime") @RequestParam(required = false) @Nullable String endTime) {
return Response.success(convenientInquiryService.conversionRate(startTime, endTime));
}
@ApiOperation("试用用户国家/城市分布")
@GetMapping("/trialUserCountry")
public Response<Map<String, List<Object>>> trialUserCountry(@ApiParam(value = "startTime") @RequestParam(required = false) @Nullable String startTime,
@ApiParam(value = "endTime") @RequestParam(required = false) @Nullable String endTime) {
return Response.success(convenientInquiryService.trialUserCountry(startTime, endTime));
}
@ApiOperation("添加用户")
@PostMapping("/addUser")
public Response<Boolean> addUser(@Valid @RequestBody AccountAddDTO accountAddDTO) {
return Response.success(convenientInquiryService.addUser(accountAddDTO));
}
@ApiOperation("修改用户信息")
@PostMapping("/modifyUser")
public Response<Boolean> modifyUser(@ApiParam(value = "用户id") @RequestParam @Nullable Long accountId,
@ApiParam(value = "有效期截止时间的毫秒级unix格式") @RequestParam @Nullable Long validEndTime,
@ApiParam(value = "用户类型 1/2/3/0 -> yearly/monthly/trial/visitor") @RequestParam @Nullable Integer systemUser,
@ApiParam("积分") @RequestParam @Nullable Long credits) {
return Response.success(convenientInquiryService.modifyUser(accountId, validEndTime, systemUser, credits));
}
@ApiOperation("获取用户信息")
@PostMapping("/getUserInfo")
public Response<IPage<Account>> getUserInfo(@Valid @RequestBody QueryUserConditionsVO queryUserConditionsVO) {
Long accountId = UserContext.getUserHolder().getId();
if (accountId.equals(31L) || accountId.equals(87L) || accountId.equals(83L) || accountId.equals(6L) || accountId.equals(4L) || accountId.equals(73L)) {
return Response.success(convenientInquiryService.getUserInfo(queryUserConditionsVO));
} else {
return Response.fail("Sorry, you don't have permission");
}
}
@ApiOperation("获取所有用户id")
@GetMapping("/getAllUserId")
public Response<List<Map<String, Object>>> getAllUsrIdList() {
return Response.success(convenientInquiryService.getAllUserIdList());
}
} }

View File

@@ -31,7 +31,7 @@ public class DesignController {
@ApiOperation(value = "设计 Conllection") @ApiOperation(value = "设计 Conllection")
@PostMapping("/designCollection") @PostMapping("/designCollection")
@CrossOrigin @CrossOrigin
public Response<DesignCollectionVO> designCollection(@Valid @RequestBody DesignCollectionDTO designDTO) { public Response<String> designCollection(@Valid @RequestBody DesignCollectionDTO designDTO) {
return Response.success(designService.designCollection(designDTO)); return Response.success(designService.designCollection(designDTO));
} }
@@ -43,7 +43,7 @@ public class DesignController {
@ApiOperation(value = "重新设计 Collection") @ApiOperation(value = "重新设计 Collection")
@PostMapping("/reDesignCollection") @PostMapping("/reDesignCollection")
public Response<DesignCollectionVO> reDesignCollection(@Valid @RequestBody ReDesignCollectionDTO reDesignDTO) { public Response<String> reDesignCollection(@Valid @RequestBody ReDesignCollectionDTO reDesignDTO) {
return Response.success(designService.reDesignCollection(reDesignDTO)); return Response.success(designService.reDesignCollection(reDesignDTO));
} }
@@ -73,8 +73,8 @@ public class DesignController {
@ApiOperation(value = "sketchBoard upload generate design前裁剪") @ApiOperation(value = "sketchBoard upload generate design前裁剪")
@PostMapping("/sketchBoardsBoundingBox") @PostMapping("/sketchBoardsBoundingBox")
public Response<List<CollectionSketchVO>> sketchesBoundingBox(@Valid @RequestBody SketchesBoundingBoxDTO sketchesBoundingBoxDTO) { public Response<List<CollectionSketchVO>> sketchesBoundingBox(@Valid @RequestBody ReDesignCollectionDTO reDesignCollectionDTO) {
return Response.success(designService.sketchesBoundingBox(sketchesBoundingBoxDTO)); return Response.success(designService.sketchesBoundingBox(reDesignCollectionDTO));
} }
@ApiOperation(value = "通过designItemId获取模特图") @ApiOperation(value = "通过designItemId获取模特图")
@@ -83,4 +83,16 @@ public class DesignController {
return Response.success(designService.getModel(designItemIdList)); return Response.success(designService.getModel(designItemIdList));
} }
@ApiOperation(value = "获取design结果")
@GetMapping("/getDesignResult")
public Response<DesignCollectionVO> getDesignResult(@RequestParam("requestId") String requestId, @RequestParam("objectSignList") List<String> objectSignList){
return Response.success(designService.getDesignResult(requestId, objectSignList));
}
@ApiOperation(value = "云生成")
@PostMapping("/designCloud")
@CrossOrigin
public Response<String> designCloud(@Valid @RequestBody DesignCollectionDTO designDTO) {
return Response.success(designService.designCloud(designDTO));
}
} }

View File

@@ -5,6 +5,7 @@ import com.ai.da.model.dto.*;
import com.ai.da.model.vo.*; import com.ai.da.model.vo.*;
import com.ai.da.service.DesignItemService; import com.ai.da.service.DesignItemService;
import com.ai.da.service.DesignService; import com.ai.da.service.DesignService;
import com.ai.da.service.UserLikeService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam; import io.swagger.annotations.ApiParam;
@@ -14,6 +15,8 @@ import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.validation.Valid; import javax.validation.Valid;
import java.io.IOException; import java.io.IOException;
import java.util.List;
import java.util.Map;
@Api(tags = "design Detail模块") @Api(tags = "design Detail模块")
@@ -77,4 +80,18 @@ public class DesignDetailController {
public Response<ComposeLayersVO> editPositionAndScale(@Valid @RequestBody EditLayersPositionAndScaleVO positionAndScaleVO) throws IOException { public Response<ComposeLayersVO> editPositionAndScale(@Valid @RequestBody EditLayersPositionAndScaleVO positionAndScaleVO) throws IOException {
return Response.success(designItemService.editLayersPositionAndScale(positionAndScaleVO)); return Response.success(designItemService.editLayersPositionAndScale(positionAndScaleVO));
} }
@ApiOperation(value = "mask数据兼容")
@GetMapping("/convertWithoutGradient")
public Response<String> convertHistoryMaskWithoutGradient(){
designItemService.convertHistoryMaskWithoutGradient();
return Response.success("success");
}
@ApiOperation(value = "mask数据库路径更新")
@GetMapping("/updateMaskUrl")
public Response<String> updateMaskUrl(){
designItemService.updateMaskUrl();
return Response.success("success");
}
} }

View File

@@ -2,7 +2,9 @@ package com.ai.da.controller;
import com.ai.da.common.response.Response; import com.ai.da.common.response.Response;
import com.ai.da.model.dto.GenerateLikeDTO; import com.ai.da.model.dto.GenerateLikeDTO;
import com.ai.da.model.dto.GenerateModifyDTO;
import com.ai.da.model.dto.GenerateThroughImageTextDTO; import com.ai.da.model.dto.GenerateThroughImageTextDTO;
import com.ai.da.model.dto.ImageToSketchDTO;
import com.ai.da.model.vo.*; import com.ai.da.model.vo.*;
import com.ai.da.service.GenerateService; import com.ai.da.service.GenerateService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
@@ -27,11 +29,11 @@ public class GenerateController {
@Resource @Resource
private GenerateService generateService; private GenerateService generateService;
@ApiOperation("自动识别sketch的caption 暂时未上") /*@ApiOperation("自动识别sketch的caption 暂时未上")
@PostMapping("/caption") @PostMapping("/caption")
public Response<GenerateCaptionVO> generateCaption(@RequestParam Long sketchElementId) { public Response<GenerateCaptionVO> generateCaption(@RequestParam Long sketchElementId) {
return Response.success(generateService.generateCaption(sketchElementId)); return Response.success(generateService.generateCaption(sketchElementId));
} }*/
/*@ApiOperation("通过文字、图片生成图片") /*@ApiOperation("通过文字、图片生成图片")
@PostMapping("/sketchAndPrint") @PostMapping("/sketchAndPrint")
@@ -63,8 +65,9 @@ public class GenerateController {
@GetMapping("/stopWaiting") @GetMapping("/stopWaiting")
public Response<String> stopWaiting(@RequestParam("userId") Long userId, public Response<String> stopWaiting(@RequestParam("userId") Long userId,
@RequestParam("uniqueId") List<String> uniqueId, @RequestParam("uniqueId") List<String> uniqueId,
@RequestParam("timeZone") String timeZone) { @RequestParam("timeZone") String timeZone,
generateService.cancelGenerate(userId, uniqueId, timeZone); @RequestParam("type") String type) {
generateService.cancelGenerate(userId, uniqueId, timeZone, type);
return Response.success("stop waiting successfully"); return Response.success("stop waiting successfully");
} }
@@ -82,5 +85,17 @@ public class GenerateController {
return Response.success(generateResult); return Response.success(generateResult);
} }
@ApiOperation(value = "imageToSketch")
@PostMapping("/imageToSketch")
public Response<GenerateResultVO> imageToSketch(@Valid @RequestBody ImageToSketchDTO imageToSketchDTO) {
return Response.success(generateService.imageToSketch(imageToSketchDTO));
}
// modifySketch
@ApiOperation(value = "modifySketch")
@PostMapping("/modifySketch")
public Response<GenerateResultVO> modifySketch(@Valid @RequestBody GenerateModifyDTO generateModifyDTO) {
return Response.success(generateService.modifySketch(generateModifyDTO));
}
} }

View File

@@ -163,7 +163,7 @@ public class LibraryController {
Response<String> response = new Response(); Response<String> response = new Response();
log.info("Models打点预览入参####{}", JSON.toJSONString(modelsDotDTO)); log.info("Models打点预览入参####{}", JSON.toJSONString(modelsDotDTO));
String url = libraryModelPointService.modelsDot(modelsDotDTO); String url = libraryModelPointService.modelsDot(modelsDotDTO);
response.setData(minioUtil.getPresignedUrl(url, 24 * 60)); response.setData(minioUtil.getPreSignedUrl(url, 24 * 60));
return response; return response;
} }

View File

@@ -0,0 +1,63 @@
package com.ai.da.controller;
import com.ai.da.common.response.PageBaseResponse;
import com.ai.da.common.response.Response;
import com.ai.da.model.dto.GetNotificationDTO;
import com.ai.da.model.vo.NotificationVO;
import com.ai.da.model.dto.PublishSysNotificationDTO;
import com.ai.da.service.MessageCenterService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.List;
import java.util.Map;
@Api(tags = "消息中心模块")
@Slf4j
@RestController
@RequestMapping("/api/message")
public class MessageCenterController {
@Resource
private MessageCenterService messageCenterService;
// 获取未读消息总数
@ApiOperation(value = "获取未读消息数")
@GetMapping("/getUnreadCount")
public Response<Map<String, Long>> getUnreadMessage(){
return Response.success(messageCenterService.getAllTypeMessageUnreadCount());
}
// 获取历史消息
@ApiOperation(value = "获取历史消息")
@PostMapping("/getHistoryNotification")
public Response<PageBaseResponse<NotificationVO>> getHistoryNotification(@Valid @RequestBody GetNotificationDTO getNotificationDTO) {
return Response.success(messageCenterService.getHistoryNotification(getNotificationDTO));
}
// 已读消息
@ApiOperation(value = "设置消息状态为已读")
@PostMapping("/setReadStatus")
public Response<Boolean> setReadStatus(@RequestParam("notificationIdList") List<Long> notificationIdList, @RequestParam("type") String type) {
return Response.success(messageCenterService.setReadStatus(notificationIdList, type));
}
// 发布系统消息
@ApiOperation(value = "发布系统消息")
@PostMapping("/publishSysMessage")
public Response<String> publishSysMessage(@Valid @RequestBody PublishSysNotificationDTO message) {
messageCenterService.publishSystemNotification(message);
return Response.success("success");
}
@ApiOperation(value = "一键已读")
@PostMapping("/oneClickRead")
public Response<String> setReadAll(@RequestParam("type") String type) {
messageCenterService.setReadAll(type);
return Response.success("success");
}
}

View File

@@ -0,0 +1,157 @@
package com.ai.da.controller;
import com.ai.da.common.config.exception.BusinessException;
import com.ai.da.common.response.PageBaseResponse;
import com.ai.da.common.response.Response;
import com.ai.da.mapper.primary.entity.Account;
import com.ai.da.model.dto.*;
import com.ai.da.model.vo.*;
import com.ai.da.model.vo.CommentVO;
import com.ai.da.model.vo.PortfolioVO;
import com.ai.da.model.vo.UserLikeChooseVO;
import com.ai.da.service.PortfolioService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.List;
@Api(tags = "Portfolio模块")
@Slf4j
@RestController
@RequestMapping("/api/portfolio")
public class PortfolioController {
@Resource
private PortfolioService portfolioService;
@ApiOperation(value = "发布作品集")
@PostMapping("/publish")
public Response<Long> preLogin(@RequestParam("file") MultipartFile canvas, @RequestParam("data") String data) {
return Response.success(portfolioService.publish(canvas, data));
}
@ApiOperation(value = "删除作品集")
@GetMapping("/delete")
public Response<Boolean> delete(@RequestParam("id") Long id) {
return Response.success(portfolioService.delete(id));
}
@CrossOrigin
@ApiOperation(value = "作品集page")
@PostMapping("/page")
public Response<PageBaseResponse<PortfolioVO>> page(@Valid @RequestBody QueryPortfolioPageDTO query) {
return Response.success(portfolioService.page(query));
}
@CrossOrigin
@ApiOperation(value = "作品详情")
@PostMapping("/detail")
public Response<PortfolioVO> detail(@Valid @RequestBody PortfolioDTO portfolioDTO) {
return Response.success(portfolioService.detail(portfolioDTO));
}
@ApiOperation(value = "选择作品")
@PostMapping("/choose")
public Response<UserLikeChooseVO> choose(@Valid @RequestBody PortfolioDTO portfolioDTO) {
return Response.success(portfolioService.choose(portfolioDTO));
}
@ApiOperation(value = "更新作品")
@PostMapping("/update")
public Response<PortfolioVO> update(@Valid @RequestBody PortfolioDTO portfolioDTO) {
return Response.success(portfolioService.update(portfolioDTO));
}
@ApiOperation(value = "广场用户注册")
@PostMapping("/designWorksRegister")
public Response<Boolean> designWorksRegister(@Valid @RequestBody DesignWorksRegisterDTO designWorksRegisterDTO) {
return Response.success(portfolioService.designWorksRegister(designWorksRegisterDTO));
}
@ApiOperation(value = "喜欢")
@GetMapping("/like")
public Response<Boolean> like(@RequestParam("id") Long id) {
return Response.success(portfolioService.like(id));
}
@ApiOperation(value = "不喜欢")
@GetMapping("/unlike")
public Response<Boolean> unlike(@RequestParam("id") Long id) {
return Response.success(portfolioService.unlike(id));
}
@ApiOperation(value = "获取点赞数")
@GetMapping("/getLikeCount")
public Response<Long> getLikeCount(@RequestParam("id") Long id) {
return Response.success(portfolioService.getLikeCount(id));
}
@ApiOperation(value = "评论")
@PostMapping("/comment")
public Response<Boolean> comment(@Valid @RequestBody CommentDTO commentDTO) {
return Response.success(portfolioService.comment(commentDTO));
}
@ApiOperation(value = "评论列表")
@PostMapping("/commentPage")
public Response<PageBaseResponse<CommentVO>> commentPage(@Valid @RequestBody CommentPageDTO commentPageDTO) {
return Response.success(portfolioService.commentPage(commentPageDTO));
}
@ApiOperation(value = "增加浏览量")
@GetMapping("/viewsIncrease")
public Response<Boolean> viewsIncrease(@RequestParam("id") Long id) {
return Response.success(portfolioService.viewsIncrease(id));
}
@ApiOperation(value = "浏览量获取")
@GetMapping("/viewsGet")
public Response<Long> viewsGet(@RequestParam("id") Long id) {
return Response.success(portfolioService.viewsGet(id));
}
@ApiOperation(value = "删除评论")
@PostMapping("/commentDelete")
public Response<Boolean> commentDelete(@Valid @RequestBody CommentDTO commentDTO) {
return Response.success(portfolioService.commentDelete(commentDTO));
}
@ApiOperation(value = "关注")
@GetMapping("/follow")
public Response<String> follow(@RequestParam("followeeId") Long followeeId) {
portfolioService.follow(followeeId);
return Response.success(BusinessException.getMessageFromResource("subscription.success"));
}
@ApiOperation(value = "取消关注")
@GetMapping("/cancelFollow")
public Response<String> cancelFollow(@RequestParam("followeeId") Long followeeId) {
portfolioService.cancelFollow(followeeId);
return Response.success(BusinessException.getMessageFromResource("unsubscribe.success"));
}
@ApiOperation(value = "获取关注列表")
@PostMapping("/getFolloweeList")
public Response<List<AccountFollowVO>> getFolloweeList(@Valid @RequestBody GetFollowListDTO getFollowListDTO) {
return Response.success(portfolioService.getFolloweeList(getFollowListDTO));
}
@ApiOperation(value = "获取粉丝列表")
@PostMapping("/getFollowerList")
public Response<List<AccountFollowVO>> getFollowerList(@Valid @RequestBody GetFollowListDTO getFollowListDTO) {
return Response.success(portfolioService.getFollowerList(getFollowListDTO));
}
/* @ApiOperation(value = "按标签名查询作品")
@GetMapping("/queryPortfolioByTag")
public Response<List<PortfolioVO>> queryPortfolioByTag(@RequestParam(value = "tagName", required = false) String tagName,
@RequestParam(value = "tagId", required = false) Long tagId) {
return Response.success(portfolioService.queryPortfolioByTag(tagName, tagId));
}*/
}

View File

@@ -8,13 +8,11 @@ import com.ai.da.common.response.Response;
import com.ai.da.common.utils.CopyUtil; import com.ai.da.common.utils.CopyUtil;
import com.ai.da.common.utils.MinioUtil; import com.ai.da.common.utils.MinioUtil;
import com.ai.da.mapper.primary.TDesignPythonOutfitMapper; import com.ai.da.mapper.primary.TDesignPythonOutfitMapper;
import com.ai.da.mapper.primary.entity.Account; import com.ai.da.mapper.primary.entity.*;
import com.ai.da.mapper.primary.entity.Library;
import com.ai.da.mapper.primary.entity.TDesignPythonOutfit;
import com.ai.da.mapper.primary.entity.UserLikeGroup;
import com.ai.da.model.dto.*; import com.ai.da.model.dto.*;
import com.ai.da.model.vo.*; import com.ai.da.model.vo.*;
import com.ai.da.service.*; import com.ai.da.service.*;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -26,6 +24,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.validation.Valid; import javax.validation.Valid;
@@ -50,6 +49,8 @@ public class SavedCollectionController {
private MinioUtil minioUtil; private MinioUtil minioUtil;
@Resource @Resource
private ClassificationService classificationService; private ClassificationService classificationService;
@Resource
private PortfolioService portfolioService;
@ApiOperation(value = "History用户分页分组列表") @ApiOperation(value = "History用户分页分组列表")
@PostMapping("/queryUserGroup") @PostMapping("/queryUserGroup")
@@ -103,9 +104,9 @@ public class SavedCollectionController {
} }
List<Long> groupIds = page.getRecords().stream().map(UserLikeGroup::getId).collect(Collectors.toList()); List<Long> groupIds = page.getRecords().stream().map(UserLikeGroup::getId).collect(Collectors.toList());
List<UserLikeVO> groupDetails = userLikeService.getGroupDetails(groupIds); List<UserLikeVO> groupDetails = userLikeService.getGroupDetails(groupIds);
if (CollectionUtils.isEmpty(groupDetails)) { // if (CollectionUtils.isEmpty(groupDetails)) {
throw new BusinessException("groupDetails.not.found"); // throw new BusinessException("groupDetails.not.found");
} // }
Map<Long, List<UserLikeVO>> groupDetailMap = groupDetails.stream() Map<Long, List<UserLikeVO>> groupDetailMap = groupDetails.stream()
.collect(Collectors.groupingBy(UserLikeVO::getUserLikeGroupId)); .collect(Collectors.groupingBy(UserLikeVO::getUserLikeGroupId));
@@ -116,13 +117,25 @@ public class SavedCollectionController {
userLikeGroupVO.setUpdateDate(group.getUpdateDate().getTime()); userLikeGroupVO.setUpdateDate(group.getUpdateDate().getTime());
userLikeGroupVO.setAuthor(account.getUserName()); userLikeGroupVO.setAuthor(account.getUserName());
//count 和detail //count 和detail
List<UserLikeVO> details = groupDetailMap.get(group.getId()); if (groupDetailMap.keySet().contains(group.getId())) {
for (UserLikeVO detail : details) { List<UserLikeVO> details = groupDetailMap.get(group.getId());
TDesignPythonOutfit tDesignPythonOutfit = designPythonOutfitMapper.selectById(detail.getDesignOutfitId()); for (UserLikeVO detail : details) {
detail.setUrl(minioUtil.getPresignedUrl(tDesignPythonOutfit.getDesignUrl(), 24 * 60)); TDesignPythonOutfit tDesignPythonOutfit = designPythonOutfitMapper.selectById(detail.getDesignOutfitId());
detail.setUrl(minioUtil.getPreSignedUrl(tDesignPythonOutfit.getDesignUrl(), 24 * 60));
}
userLikeGroupVO.setGroupDetails(details);
userLikeGroupVO.setSketchCount(CollectionUtils.isEmpty(details) ? 0 : details.size());
}else {
userLikeGroupVO.setSketchCount(0);
}
if (userLikeGroupVO.getOriginal() == 0) {
userLikeGroupVO.setOriginalAccountName(accountService.getById(userLikeGroupVO.getOriginalAccountId()).getUserName());
Portfolio byId = portfolioService.getByIdAll(userLikeGroupVO.getOriginalPortfolioId());
if (Objects.nonNull(byId)) {
String portfolioName = byId.getPortfolioName();
userLikeGroupVO.setOriginalPortfolioName(portfolioName);
}
} }
userLikeGroupVO.setGroupDetails(details);
userLikeGroupVO.setSketchCount(CollectionUtils.isEmpty(details) ? 0 : details.size());
return userLikeGroupVO; return userLikeGroupVO;
} }
return null; return null;
@@ -159,4 +172,89 @@ public class SavedCollectionController {
return Response.success(userLikeGroupService.choose(userGroupId)); return Response.success(userLikeGroupService.choose(userGroupId));
} }
@ApiOperation(value = "exportSave")
@PostMapping("/exportSave")
public Response<Boolean> exportSave(@RequestParam("file") MultipartFile file, @RequestParam("userLikeGroupId") Long userLikeGroupId) {
return Response.success(userLikeGroupService.exportSave(file, userLikeGroupId));
}
@ApiOperation(value = "exportSearch")
@PostMapping("/exportSearch")
public Response<JSONObject> exportSearch(@Valid @RequestBody ExportSearchDTO exportSearchDTO) {
return Response.success(userLikeGroupService.exportSearch(exportSearchDTO.getUserLikeGroupId()));
}
@ApiOperation(value = "toProduct")
@PostMapping("/toProduct")
public Response<List<ToProductImageResult>> toProduct(@Valid @RequestBody ToProductImageDTO toProductImageDTO) {
return Response.success(userLikeGroupService.toProduct(toProductImageDTO));
}
@ApiOperation(value = "toProductImageElementUpload")
@PostMapping("/toProductImageElementUpload")
public Response<ToProductElementVO> toProductImageElementUpload(@RequestParam("file") MultipartFile file, @RequestParam(value = "userlikeGroupId") Long userLikeGroupId) {
return Response.success(userLikeGroupService.toProductImageElementUpload(file, userLikeGroupId));
}
@ApiOperation(value = "productImageLike")
@PostMapping("/productImageLike")
public Response<Boolean> productImageLike(@Valid @RequestBody ProductImageLikeDTO productImageLikeDTO) {
return Response.success(userLikeGroupService.productImageLike(productImageLikeDTO));
}
@ApiOperation(value = "productImageUnLike")
@PostMapping("/productImageUnLike")
public Response<Boolean> productImageUnLike(@Valid @RequestBody ProductImageLikeDTO productImageLikeDTO) {
return Response.success(userLikeGroupService.productImageUnLike(productImageLikeDTO));
}
@ApiOperation(value = "获取生成结果")
@PostMapping("/toProductImageResult")
public Response<List<MagicToolResultVO>> getToProductImageResult(@Valid @RequestBody List<String> taskIdList) {
List<MagicToolResultVO> magicToolResultVOList = userLikeGroupService.getToProductImageResultList(taskIdList);
return Response.success(magicToolResultVOList);
}
@ApiOperation(value = "画布用户上传元素")
@PostMapping("/canvasElementUpload")
public Response<CanvasElementUpload> canvasElementUpload(@RequestParam("file") MultipartFile file) {
return Response.success(userLikeGroupService.canvasElementUpload(file));
}
@ApiOperation("productImageLikeList")
@PostMapping("/productImageLikeList")
public Response<List<ToProductImageResultVO>> productImageLikeList(@Valid @RequestBody ToProductImageDTO toProductImageDTO) {
return Response.success(userLikeGroupService.productImageLikeList(toProductImageDTO));
}
@ApiOperation(value = "relight")
@PostMapping("/relight")
public Response<List<ToProductImageResult>> relight(@Valid @RequestBody ToProductImageDTO toProductImageDTO) {
return Response.success(userLikeGroupService.relight(toProductImageDTO));
}
@ApiOperation(value = "获取relight结果")
@PostMapping("/relightResult")
public Response<List<MagicToolResultVO>> getRelightResult(@Valid @RequestBody List<String> taskIdList) {
List<MagicToolResultVO> magicToolResultVOList = userLikeGroupService.getRelightResult(taskIdList);
return Response.success(magicToolResultVOList);
}
@ApiOperation(value = "likeHistoryRelSketch")
@PostMapping("/likeHistoryRelSketch")
public Response<String> likeHistoryRelSketch() {
return Response.success(userLikeGroupService.likeHistoryRelSketch());
}
@ApiOperation(value = "download")
@PostMapping("/download")
public Response<String> download() {
return Response.success(userLikeGroupService.download());
}
@ApiOperation(value = "productImageInitialize")
@PostMapping("/productImageInitialize")
public Response<Boolean> productImageUpload(@Valid @RequestBody ProductImageInitializeDTO productImageInitializeDTO) {
return Response.success(userLikeGroupService.productImageInitialize(productImageInitializeDTO));
}
} }

View File

@@ -0,0 +1,54 @@
package com.ai.da.controller;
import com.ai.da.common.response.Response;
import com.ai.da.service.StripeService;
import com.paypal.http.HttpResponse;
import com.paypal.payments.Refund;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
@Api(tags = "Stripe模块")
@Slf4j
@RestController
@RequestMapping("/api/stripe")
public class StripeController {
@Resource
private StripeService stripeService;
@ApiOperation("创建支付链接")
@PostMapping("/createOrder/{amount}")
public Response<String> pay(@PathVariable Integer amount, @RequestParam String returnUrl) {
return Response.success(stripeService.pay(amount, returnUrl));
}
@ApiOperation("支付通知")
@PostMapping("/trade/notify")
public Response<String> callback(HttpServletRequest request) throws ServletException, IOException {
Boolean result = stripeService.notify(request);
if (result){
return Response.success(200,"success");
}else {
return Response.fail(400,"failure");
}
}
@ApiOperation("申请退款")
@PostMapping("/trade/refund/{orderNo}/{reason}")
public Response<HttpResponse<Refund>> refund(@PathVariable String orderNo, @PathVariable String reason) throws IOException {
String response = stripeService.refund(null,orderNo,reason);
if (response.equals("退款成功")){
return Response.success();
}else {
return Response.fail("Request for refund failed.");
}
}
}

View File

@@ -0,0 +1,31 @@
package com.ai.da.controller;
import com.ai.da.common.response.Response;
import com.ai.da.mapper.primary.entity.Product;
import com.ai.da.mapper.primary.entity.Tags;
import com.ai.da.service.ProductService;
import com.ai.da.service.TagsService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
@CrossOrigin //开放前端的跨域访问
@Api(tags = "标签管理")
@RestController
@RequestMapping("/api/tags")
public class TagsController {
@Resource
private TagsService tagsService;
@ApiOperation("获取标签")
@GetMapping("/getTags")
public Response<List<Tags>> getTags(@RequestParam("userInput") String userInput) {
return Response.success(tagsService.getTags(userInput));
}
}

View File

@@ -1,9 +1,13 @@
package com.ai.da.controller; package com.ai.da.controller;
import com.ai.da.common.response.Response; import com.ai.da.common.response.Response;
import com.ai.da.mapper.primary.entity.GoogleUser;
import com.ai.da.model.dto.*; import com.ai.da.model.dto.*;
import com.ai.da.model.vo.AccountLoginVO; import com.ai.da.model.vo.AccountLoginVO;
import com.ai.da.model.vo.DesignCollectionVO;
import com.ai.da.service.AccountService; import com.ai.da.service.AccountService;
import com.ai.da.service.DesignService;
import com.alibaba.fastjson.JSONObject;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@@ -14,6 +18,7 @@ import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.validation.Valid; import javax.validation.Valid;
import java.security.cert.X509Certificate; import java.security.cert.X509Certificate;
@@ -27,11 +32,14 @@ public class ThirdPartyController {
@Resource @Resource
private AccountService accountService; private AccountService accountService;
@ApiOperation(value = "Add user information") @Resource
private DesignService designService;
/*@ApiOperation(value = "Add user information")
@PostMapping("/addUser") @PostMapping("/addUser")
public Response<Boolean> addUser(@Valid @RequestBody AccountAddDTO accountAddDTO) { public Response<Boolean> addUser(@Valid @RequestBody AccountAddDTO accountAddDTO) {
return Response.success(accountService.addUser(accountAddDTO)); return Response.success(accountService.addUser(accountAddDTO));
} }*/
@ApiOperation(value = "Edit user information") @ApiOperation(value = "Edit user information")
@PostMapping("/editUser") @PostMapping("/editUser")
@@ -107,4 +115,35 @@ public class ThirdPartyController {
public Response<String> getRedirectUrl() { public Response<String> getRedirectUrl() {
return Response.success(REDIRECT_URL); return Response.success(REDIRECT_URL);
} }
@CrossOrigin
@ApiOperation(value = "updateNoLoginRequiredNew")
@PostMapping("/updateNoLoginRequiredNew")
public Response<String> updateNoLoginRequiredNew(@RequestBody NoLoginRequiredDTO noLoginRequiredDTO, HttpServletRequest request) {
return Response.success(accountService.updateNoLoginRequiredNew(noLoginRequiredDTO, request));
}
@CrossOrigin
@GetMapping("/auth/google_callback")
public Response<String> googleCallback(@RequestParam("code") String code, HttpSession session) {
return Response.success(accountService.googleCallback(code, session));
}
@CrossOrigin
@GetMapping("/parseGoogleCredential")
public Response<AccountLoginVO> parseGoogleCredential(@RequestParam("credential") String credential) {
return Response.success(accountService.parseGoogleCredential(credential));
}
@CrossOrigin
@GetMapping("/parseWeChatCode")
public Response<AccountLoginVO> parseWeChatCode(@RequestParam("code") String code) {
return Response.success(accountService.parseWeChatCode(code));
}
@ApiOperation(value = "接收Design结果")
@PostMapping("/receiveDesignResults")
@CrossOrigin
public Response<Boolean> receiveDesignResults(@Valid @RequestBody JSONObject responseObject) {
return Response.success(designService.receiveDesignResults(responseObject));
}
} }

View File

@@ -1,10 +1,13 @@
package com.ai.da.controller; package com.ai.da.controller;
import com.ai.da.common.response.Response; import com.ai.da.common.response.Response;
import com.ai.da.mapper.primary.entity.Style;
import com.ai.da.mapper.primary.entity.Workspace; import com.ai.da.mapper.primary.entity.Workspace;
import com.ai.da.model.dto.WorkspaceDTO; import com.ai.da.model.dto.WorkspaceDTO;
import com.ai.da.model.dto.WorkspaceSaveDTO;
import com.ai.da.model.enums.BizJson; import com.ai.da.model.enums.BizJson;
import com.ai.da.model.vo.ModelsVO; import com.ai.da.model.vo.ModelsVO;
import com.ai.da.model.vo.StyleVO;
import com.ai.da.model.vo.WorkspaceVO; import com.ai.da.model.vo.WorkspaceVO;
import com.ai.da.service.WorkspaceService; import com.ai.da.service.WorkspaceService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
@@ -44,8 +47,8 @@ public class WorkspaceController {
@GetMapping("/detail") @GetMapping("/detail")
@ApiOperationSupport(order = 1) @ApiOperationSupport(order = 1)
@ApiOperation(value = "详情", notes = "传入workspace") @ApiOperation(value = "详情", notes = "传入workspace")
public Response<Workspace> detail(@ApiParam(value = "主键集合", required = true) @RequestParam Long id) { public Response<WorkspaceVO> detail(@ApiParam(value = "主键集合", required = true) @RequestParam Long id) {
Workspace detail = workspaceService.getByIdNew(id); WorkspaceVO detail = workspaceService.getByIdNew(id);
return Response.success(detail); return Response.success(detail);
} }
@@ -66,8 +69,8 @@ public class WorkspaceController {
@PostMapping("/saveOrUpdate") @PostMapping("/saveOrUpdate")
@ApiOperationSupport(order = 3) @ApiOperationSupport(order = 3)
@ApiOperation(value = "新增或编辑", notes = "传入workspace") @ApiOperation(value = "新增或编辑", notes = "传入workspace")
public Response saveOrUpdate(@Valid @RequestBody Workspace workspace) { public Response saveOrUpdate(@Valid @RequestBody WorkspaceSaveDTO workspaceDTO) {
return Response.success(workspaceService.saveOrUpdate(workspace)); return Response.success(workspaceService.saveOrUpdate(workspaceDTO));
} }
@@ -92,8 +95,8 @@ public class WorkspaceController {
@GetMapping("/getMannequins") @GetMapping("/getMannequins")
@ApiOperationSupport(order = 6) @ApiOperationSupport(order = 6)
@ApiOperation(value = "获取模特") @ApiOperation(value = "获取模特")
public Response<List<ModelsVO>> getMannequins(@RequestParam("sex") String sex) { public Response<List<ModelsVO>> getMannequins(@RequestParam("sex") String sex, @RequestParam("style") String style) {
List<ModelsVO> modelsVO = workspaceService.getMannequins(sex); List<ModelsVO> modelsVO = workspaceService.getMannequins(sex, style);
return Response.success(modelsVO); return Response.success(modelsVO);
} }
@@ -115,10 +118,17 @@ public class WorkspaceController {
} }
@PostMapping("maleDataInsert") @PostMapping("maleDataInsert")
@ApiOperationSupport(order = 7) @ApiOperationSupport(order = 8)
@ApiOperation(value = "男装数据入库入minio") @ApiOperation(value = "男装数据入库入minio")
public Response<Boolean> maleDataInsert() throws FileNotFoundException { public Response<Boolean> maleDataInsert() throws FileNotFoundException {
workspaceService.maleDataInsert(); workspaceService.maleDataInsert();
return Response.success(true); return Response.success(true);
} }
@PostMapping("styleList")
@ApiOperationSupport(order = 9)
@ApiOperation(value = "获取style列表")
public Response<List<StyleVO>> styleList() {
return Response.success(workspaceService.styleList());
}
} }

View File

@@ -0,0 +1,18 @@
package com.ai.da.mapper.primary;
import com.ai.da.common.config.mybatis.plus.CommonMapper;
import com.ai.da.mapper.primary.entity.AccountExtend;
import java.util.Date;
import java.util.List;
/**
* Mapper 接口
*
* @author easy-generator
* @since 2022-06-13
*/
public interface AccountExtendMapper extends CommonMapper<AccountExtend> {
}

View File

@@ -3,6 +3,7 @@ package com.ai.da.mapper.primary;
import com.ai.da.common.config.mybatis.plus.CommonMapper; import com.ai.da.common.config.mybatis.plus.CommonMapper;
import com.ai.da.mapper.primary.entity.Account; import com.ai.da.mapper.primary.entity.Account;
import java.util.Date;
import java.util.List; import java.util.List;
/** /**
@@ -27,6 +28,8 @@ public interface AccountMapper extends CommonMapper<Account> {
* @param id * @param id
* @return * @return
*/ */
Account findById(String id); // Account findById(String id);
void toVisitor(Long id, Date date);
} }

View File

@@ -0,0 +1,7 @@
package com.ai.da.mapper.primary;
import com.ai.da.common.config.mybatis.plus.CommonMapper;
import com.ai.da.mapper.primary.entity.Canvas;
public interface CanvasMapper extends CommonMapper<Canvas> {
}

View File

@@ -0,0 +1,7 @@
package com.ai.da.mapper.primary;
import com.ai.da.common.config.mybatis.plus.CommonMapper;
import com.ai.da.mapper.primary.entity.Comment;
public interface CommentMapper extends CommonMapper<Comment> {
}

View File

@@ -18,5 +18,5 @@ public interface DesignMapper extends CommonMapper<Design> {
//返回插入数据后生成的主键 //返回插入数据后生成的主键
Long insertDesign(Design design); Long insertDesign(Design design);
List<UserDesignStatisticDTO> getDesignStatistic(String startTime, String endTime); List<UserDesignStatisticDTO> getDesignStatistic(String startTime, String endTime, List<Long> ids, String email);
} }

View File

@@ -0,0 +1,7 @@
package com.ai.da.mapper.primary;
import com.ai.da.common.config.mybatis.plus.CommonMapper;
import com.ai.da.mapper.primary.entity.ExportFile;
public interface ExportFileMapper extends CommonMapper<ExportFile> {
}

View File

@@ -3,5 +3,10 @@ package com.ai.da.mapper.primary;
import com.ai.da.common.config.mybatis.plus.CommonMapper; import com.ai.da.common.config.mybatis.plus.CommonMapper;
import com.ai.da.mapper.primary.entity.Generate; import com.ai.da.mapper.primary.entity.Generate;
import java.util.List;
import java.util.Map;
public interface GenerateMapper extends CommonMapper<Generate> { public interface GenerateMapper extends CommonMapper<Generate> {
List<Map<String, Object>> getByTypeAndTime(String startTime, String endTime, List<Long> accountIdList);
} }

View File

@@ -0,0 +1,24 @@
package com.ai.da.mapper.primary;
import com.ai.da.common.config.mybatis.plus.CommonMapper;
import com.ai.da.mapper.primary.entity.Notification;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
public interface NotificationMapper extends CommonMapper<Notification> {
List<Map<String, Object>> getTypeCount(Long receiverId);
/** 解决mybatis-plus自动过滤 is_deleted为1的数据 问题 */
Notification getUniqueLikeAndFollow(String type, Long senderId, Long receiverId, Long portfolioId);
void updateUniqueLikeAndFollow(Long id, LocalDateTime time);
void deleteNotification(Long id, LocalDateTime time);
void setPersonalNotificationAllRead(String type, Long receiverId, LocalDateTime time);
List<Long> getUnreadSysNotification(Long accountId);
}

View File

@@ -0,0 +1,12 @@
package com.ai.da.mapper.primary;
import com.ai.da.common.config.mybatis.plus.CommonMapper;
import com.ai.da.mapper.primary.entity.Portfolio;
import java.util.List;
public interface PortfolioMapper extends CommonMapper<Portfolio> {
Portfolio getByIdAll(Long originalPortfolioId);
List<Portfolio> getByTag(Long accountId, String tagName);
}

View File

@@ -0,0 +1,15 @@
package com.ai.da.mapper.primary;
import com.ai.da.common.config.mybatis.plus.CommonMapper;
import com.ai.da.mapper.primary.entity.PortfolioTags;
import java.time.LocalDateTime;
public interface PortfolioTagsMapper extends CommonMapper<PortfolioTags> {
void deleteByPortfolioId(Long portfolioId);
// portfolioId与tagId建立唯一约束 如果组合 portfolio_id 和 tag_id 已经存在,插入操作会被忽略。
void insertIgnore(Long portfolioId, Long tagId, LocalDateTime time);
}

View File

@@ -0,0 +1,7 @@
package com.ai.da.mapper.primary;
import com.ai.da.common.config.mybatis.plus.CommonMapper;
import com.ai.da.mapper.primary.entity.ProductImageAttribute;
public interface ProductImageAttributeMapper extends CommonMapper<ProductImageAttribute> {
}

View File

@@ -0,0 +1,7 @@
package com.ai.da.mapper.primary;
import com.ai.da.common.config.mybatis.plus.CommonMapper;
import com.ai.da.mapper.primary.entity.Questionnaire;
public interface QuestionnaireMapper extends CommonMapper<Questionnaire> {
}

View File

@@ -0,0 +1,17 @@
package com.ai.da.mapper.primary;
import com.ai.da.common.config.mybatis.plus.CommonMapper;
import com.ai.da.mapper.primary.entity.Style;
import java.util.List;
/**
* Mapper 接口
*
* @author easy-generator
* @since 2022-06-13
*/
public interface StyleMapper extends CommonMapper<Style> {
}

View File

@@ -0,0 +1,7 @@
package com.ai.da.mapper.primary;
import com.ai.da.common.config.mybatis.plus.CommonMapper;
import com.ai.da.mapper.primary.entity.SysNotificationReadStatus;
public interface SysNotificationReadStatusMapper extends CommonMapper<SysNotificationReadStatus> {
}

View File

@@ -4,6 +4,8 @@ import com.ai.da.common.config.mybatis.plus.CommonMapper;
import com.ai.da.mapper.primary.entity.TDesignPythonOutfitDetail; import com.ai.da.mapper.primary.entity.TDesignPythonOutfitDetail;
import com.ai.da.model.vo.TDesignPythonOutfitDetailVO; import com.ai.da.model.vo.TDesignPythonOutfitDetailVO;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import io.lettuce.core.dynamic.annotation.Param;
import org.apache.ibatis.annotations.Delete;
import java.util.List; import java.util.List;
@@ -24,4 +26,7 @@ public interface TDesignPythonOutfitDetailMapper extends CommonMapper<TDesignPyt
*/ */
List<TDesignPythonOutfitDetailVO> selectTDesignPythonOutfitDetailPage(IPage page, TDesignPythonOutfitDetailVO tDesignPythonOutfitDetail); List<TDesignPythonOutfitDetailVO> selectTDesignPythonOutfitDetailPage(IPage page, TDesignPythonOutfitDetailVO tDesignPythonOutfitDetail);
@Delete("DELETE FROM t_design_python_outfit_detail WHERE design_python_outfit_id = #{designPythonOutfitId}")
void deleteByDesignPythonOutfitIdPhysical(@Param("designPythonOutfitId") Long designPythonOutfitId);
} }

View File

@@ -0,0 +1,17 @@
package com.ai.da.mapper.primary;
import com.ai.da.common.config.mybatis.plus.CommonMapper;
import com.ai.da.mapper.primary.entity.Tags;
import com.ai.da.model.dto.TagsDTO;
import java.util.List;
import java.util.Map;
public interface TagsMapper extends CommonMapper<Tags> {
List<Map<String, String>> getMatchingTags(String userInput);
List<TagsDTO> getTagByPortfolioId(Long portfolioId);
}

View File

@@ -0,0 +1,8 @@
package com.ai.da.mapper.primary;
import com.ai.da.common.config.mybatis.plus.CommonMapper;
import com.ai.da.mapper.primary.entity.ToProductElement;
public interface ToProductElementMapper extends CommonMapper<ToProductElement> {
}

View File

@@ -0,0 +1,7 @@
package com.ai.da.mapper.primary;
import com.ai.da.common.config.mybatis.plus.CommonMapper;
import com.ai.da.mapper.primary.entity.ToProductImageRecord;
public interface ToProductImageRecordMapper extends CommonMapper<ToProductImageRecord> {
}

View File

@@ -0,0 +1,12 @@
package com.ai.da.mapper.primary;
import com.ai.da.common.config.mybatis.plus.CommonMapper;
import com.ai.da.mapper.primary.entity.ToProductImageResult;
import java.util.List;
import java.util.Map;
public interface ToProductImageResultMapper extends CommonMapper<ToProductImageResult> {
List<Map<String, Object>> getByTypeAndTime(String startTime, String endTime, List<Long> accountIdList);
}

View File

@@ -3,6 +3,9 @@ package com.ai.da.mapper.primary;
import com.ai.da.common.config.mybatis.plus.CommonMapper; import com.ai.da.common.config.mybatis.plus.CommonMapper;
import com.ai.da.mapper.primary.entity.TrialOrder; import com.ai.da.mapper.primary.entity.TrialOrder;
import java.util.List;
import java.util.Map;
/** /**
* Mapper 接口 * Mapper 接口
* *
@@ -11,6 +14,6 @@ import com.ai.da.mapper.primary.entity.TrialOrder;
*/ */
public interface TrialOrderMapper extends CommonMapper<TrialOrder> { public interface TrialOrderMapper extends CommonMapper<TrialOrder> {
Map<String, Long> countOfficialUser();
} }

View File

@@ -0,0 +1,19 @@
package com.ai.da.mapper.primary;
import com.ai.da.common.config.mybatis.plus.CommonMapper;
import com.ai.da.mapper.primary.entity.UserFollow;
import com.ai.da.model.vo.AccountFollowVO;
import java.util.List;
public interface UserFollowMapper extends CommonMapper<UserFollow> {
List<AccountFollowVO> getFolloweeListByFollower(Long followerAccountId, Integer limit, Integer offset, String order);
List<AccountFollowVO> getFollowerListByFollowee(Long followeeAccountId, Integer limit, Integer offset, String order);
List<AccountFollowVO> getFolloweeListByName(String name, Long followerId);
List<AccountFollowVO> getFollowerListByName(String name, Long followeeId);
}

View File

@@ -3,6 +3,9 @@ package com.ai.da.mapper.primary;
import com.ai.da.common.config.mybatis.plus.CommonMapper; import com.ai.da.common.config.mybatis.plus.CommonMapper;
import com.ai.da.mapper.primary.entity.UserLike; import com.ai.da.mapper.primary.entity.UserLike;
import java.util.List;
import java.util.Map;
/** /**
* Mapper 接口 * Mapper 接口
* *

View File

@@ -0,0 +1,15 @@
package com.ai.da.mapper.primary;
import com.ai.da.common.config.mybatis.plus.CommonMapper;
import com.ai.da.mapper.primary.entity.WorkspaceRelStyle;
/**
* Mapper 接口
*
* @author easy-generator
* @since 2022-06-13
*/
public interface WorkspaceRelStyleMapper extends CommonMapper<WorkspaceRelStyle> {
}

View File

@@ -3,6 +3,7 @@ package com.ai.da.mapper.primary.entity;
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
@@ -69,11 +70,13 @@ public class Account implements Serializable {
/** /**
* 创建时间 * 创建时间
*/ */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
private Date createDate; private Date createDate;
/** /**
* 更新时间 * 更新时间
*/ */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
private Date updateDate; private Date updateDate;
private Integer isTrial; private Integer isTrial;
@@ -86,4 +89,35 @@ public class Account implements Serializable {
* 积分 * 积分
*/ */
private BigDecimal credits; private BigDecimal credits;
/**
* 用于区分游客与系统用户
* 0 游客
* 1 年付用户
* 2 月付用户
* 3 试用用户
* 4 参加活动获取30天有效期和6000个积分的用户
* 5 企业管理员账号
* 6 企业子账号
* 7 学校管理员
* 8 学校子账号
*/
private Integer systemUser;
/**
* 头像
*/
private String avatar;
private String organizationName;
private Long parentId;
private Integer isAdmin;
private BigDecimal shareCredits;
private Integer subAccountNum;
private String invitationCode;
} }

View File

@@ -0,0 +1,30 @@
package com.ai.da.mapper.primary.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("account_extend")
public class AccountExtend implements Serializable {
private static final long serialVersionUID = 1L;
/**
* ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
private Long accountId;
private String authType;
private String auth;
}

View File

@@ -2,6 +2,7 @@ package com.ai.da.mapper.primary.entity;
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@@ -24,11 +25,13 @@ public class BaseEntity implements Serializable {
/** /**
* 创建时间 * 创建时间
*/ */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
private LocalDateTime createTime; private LocalDateTime createTime;
/** /**
* 更新时间 * 更新时间
*/ */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
private LocalDateTime updateTime; private LocalDateTime updateTime;
/** /**

View File

@@ -0,0 +1,42 @@
package com.ai.da.mapper.primary.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Date;
/**
* Attendance
*
* @author easy-generator
* @since 2022-06-13
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("canvas")
public class Canvas implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("ID")
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@ApiModelProperty("url")
private String url;
@ApiModelProperty("accountId")
private Long accountId;
@ApiModelProperty("createTime")
private LocalDateTime createTime;
}

View File

@@ -0,0 +1,9 @@
package com.ai.da.mapper.primary.entity;
import lombok.Data;
@Data
public class CanvasElementUpload {
private String url;
private String minioUrl;
}

View File

@@ -40,6 +40,8 @@ public class Collection implements Serializable {
*/ */
private String moodTemplateId; private String moodTemplateId;
private String moodboardPosition;
/** /**
* 创建时间 * 创建时间
*/ */

View File

@@ -75,6 +75,8 @@ public class CollectionElement implements Serializable {
*/ */
private String md5; private String md5;
private String gradientString;
/** /**
* 创建时间 * 创建时间
*/ */

View File

@@ -0,0 +1,38 @@
package com.ai.da.mapper.primary.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("comment")
public class Comment implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
private Long portfolioId;
private Long accountId;
private String comment;
// 一级父节点ID
private Long parentLevel1Id;
// 二级父节点ID
private Long parentLevel2Id;
private LocalDateTime createTime;
private Integer isDeleted;
}

View File

@@ -12,6 +12,8 @@ import java.math.BigDecimal;
public class CreditsDetail extends BaseEntity { public class CreditsDetail extends BaseEntity {
/** 用户id */ /** 用户id */
private Long accountId; private Long accountId;
/** 任务id或uuid */
private String taskId;
/** 积分变更事件 */ /** 积分变更事件 */
private String changeEvent; private String changeEvent;
/** 变更积分 ( + 表示加,- 表示减) */ /** 变更积分 ( + 表示加,- 表示减) */

View File

@@ -64,6 +64,8 @@ public class DesignItemDetail implements Serializable {
*/ */
private String color; private String color;
private String gradientString;
/** /**
* 对应的print图片的绝对路径 * 对应的print图片的绝对路径
*/ */
@@ -88,6 +90,10 @@ public class DesignItemDetail implements Serializable {
* item的优先级 * item的优先级
*/ */
private Integer priority; private Integer priority;
/**
* 未分割的只上了颜色或只有overall印花的图层
*/
private String undividedLayer;
/** /**
* 创建时间 * 创建时间

View File

@@ -20,6 +20,16 @@ public class DesignItemDetailPrint {
* 关联t_design_item_detail表ID * 关联t_design_item_detail表ID
*/ */
private Long designItemDetailId; private Long designItemDetailId;
/**
* 印花的类型 print || trims
*/
private String printType;
/**
* 印花二级分类 Slogan || Logo || Pattern
*/
private String level2Type;
/** /**
* 印花路径 * 印花路径
*/ */

View File

@@ -0,0 +1,24 @@
package com.ai.da.mapper.primary.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("export_file")
public class ExportFile implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
private String url;
private Long userLikeGroupId;
}

View File

@@ -33,10 +33,15 @@ public class Generate {
private String uniqueId; private String uniqueId;
/** /**
* Sketchboard Printboard * Sketchboard Printboard Moodboard
*/ */
private String level1Type; private String level1Type;
/**
* Slogan Logo Pattern
*/
private String level2Type;
/** /**
* 图片来源 collection | library * 图片来源 collection | library
*/ */
@@ -62,6 +67,24 @@ public class Generate {
*/ */
private String modelName; private String modelName;
/**
* Logo 种子 相同种子 相同prompt 输出一定相同
*/
private String seed;
/**
* 1 -> 粗
* 2 -> 中
* 3 -> 细
* custom -> 自定义
*/
private String sketchStyle;
/**
* sketch 风格参考图的collection_element_id
*/
private Long styleImageElementId;
/** /**
* 创建时间 * 创建时间
*/ */

View File

@@ -0,0 +1,14 @@
package com.ai.da.mapper.primary.entity;
import lombok.Data;
@Data
public class GoogleUser {
private String sub; // 用户唯一标识
private String email;
private String name;
private String picture;
private boolean emailVerified;
private String givenName;
private String familyName;
}

View File

@@ -0,0 +1,15 @@
package com.ai.da.mapper.primary.entity;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
@Data
public class Gradient implements Serializable {
private List<GradientItem> gradientList;
private int angle;
private int selectIndex;
private boolean gradientShow;
private String colorImg;
}

View File

@@ -0,0 +1,11 @@
package com.ai.da.mapper.primary.entity;
import lombok.Data;
import java.io.Serializable;
@Data
public class GradientItem implements Serializable {
private RGBA rgba;
private String left;
}

View File

@@ -0,0 +1,73 @@
package com.ai.da.mapper.primary.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@TableName("t_notification")
@Data
public class Notification extends BaseEntity{
/**
* 操作类型 system/like/comment/follow
*/
private String type;
/**
* 发起操作者用户id
*/
private Long senderId;
/**
* 被操作对象用户id
*/
private Long receiverId;
/**
* 点赞评论时的作品id
*/
private Long portfolioId;
/**
* 消息内容
*/
private String content;
/**
* 评论id
*/
private Long commentId;
/**
* 个人消息已读状态
*/
private Integer isRead;
/**
* 系统消息发布状态
*/
private Integer publishFlag;
/**
* 是否被删除
*/
private Integer isDeleted;
public Notification() {
}
public Notification(String type, Long senderId, Long receiverId) {
this.type = type;
this.senderId = senderId;
this.receiverId = receiverId;
}
public Notification(String type, Long senderId, Long receiverId, Long portfolioId) {
this.type = type;
this.senderId = senderId;
this.receiverId = receiverId;
this.portfolioId = portfolioId;
}
public Notification(String type, Long senderId, Long receiverId, Long portfolioId, String content, Long commentId) {
this.type = type;
this.senderId = senderId;
this.receiverId = receiverId;
this.portfolioId = portfolioId;
this.content = content;
this.commentId = commentId;
}
}

View File

@@ -15,7 +15,7 @@ public class OrderInfo extends BaseEntity{
private Long productId;//支付产品id private Long productId;//支付产品id
private Integer totalFee;//订单金额(元) private Float totalFee;//订单金额(元)
private String codeUrl;//订单二维码连接 private String codeUrl;//订单二维码连接

View File

@@ -17,7 +17,7 @@ public class PaymentInfo extends BaseEntity{
private String tradeState;//交易状态 private String tradeState;//交易状态
private Integer payerTotal;//支付金额() private Float payerTotal;//支付金额()
private String content;//通知参数 private String content;//通知参数
} }

View File

@@ -0,0 +1,67 @@
package com.ai.da.mapper.primary.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
@ApiModel(value = "Portfolio对象", description = "作品集")
@TableName("portfolio")
public class Portfolio implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "ID")
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@ApiModelProperty(value = "collection ID")
private Long collectionId;
@ApiModelProperty(value = "userLikeGroup源")
private Long userLikeGroupSourceId;
@ApiModelProperty(value = "作品名称")
private String portfolioName;
@ApiModelProperty(value = "作品描述")
private String portfolioDes;
@ApiModelProperty(value = "作品类型")
private String portfolioType;
@ApiModelProperty(value = "画布ID")
private Long canvasId;
@ApiModelProperty(value = "封面ID")
private Long coverId;
@ApiModelProperty(value = "作品状态1公开0隐藏")
private Integer status;
@ApiModelProperty(value = "是否允许二次创作1允许0不允许")
private Integer openSource;
private Integer original;
private Long originalAccountId;
private Long originalPortfolioId;
@ApiModelProperty(value = "作品集作者ID")
private Long accountId;
@ApiModelProperty(value = "创建时间")
private LocalDateTime createDate;
@ApiModelProperty(value = "更新时间")
private LocalDateTime updateDate;
@ApiModelProperty(value = "是否删除")
private Integer isDeleted;
}

View File

@@ -0,0 +1,14 @@
package com.ai.da.mapper.primary.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@TableName("t_portfolio_tags")
@Data
public class PortfolioTags extends BaseEntity{
private Long portfolioId;
private Long tagId;
}

View File

@@ -9,7 +9,8 @@ public class Product extends BaseEntity{
private String title; //商品名称 private String title; //商品名称
private Integer price; //价格(分) // private Integer price; //价格(分)
private Float price; //价格(元)
private Integer credits; // 积分 private Integer credits; // 积分
} }

View File

@@ -0,0 +1,35 @@
package com.ai.da.mapper.primary.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("product_image_attribute")
public class ProductImageAttribute implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
private String imgName;
private String length;
private String sleeveLength;
private String sleeveShape;
private String sleeveShoulder;
private String neckline;
private String collar;
private String design;
private String silhouette;
private String type;
private String openingType;
private String subtype;
private String style;
}

View File

@@ -0,0 +1,18 @@
package com.ai.da.mapper.primary.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@Data
@TableName("t_questionnaire")
public class Questionnaire extends BaseEntity{
/**
* 用户所填调查问卷结果
*/
private String questionnaireInfo;
/**
* 调查问卷标题
*/
private String title;
}

View File

@@ -0,0 +1,13 @@
package com.ai.da.mapper.primary.entity;
import lombok.Data;
import java.io.Serializable;
@Data
public class RGBA implements Serializable {
private int r;
private int g;
private int b;
private double a;
}

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