777 Commits

Author SHA1 Message Date
56ebcfbce2 stripe 设置支付链接语言 2024-07-17 17:17:04 +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
bc85e33074 paypal 收款账号切换到live 2024-05-16 18:19:01 +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
6fa0ab30db Merge branch 'dev/dev' into dev/dev_xp 2024-05-10 17:12:52 +08:00
d41bc284d4 Alipay-HK 接入 暂存 2024-05-10 17:11:49 +08:00
e2697aa407 Merge branch 'dev/dev_xp' into dev/dev 2024-05-08 09:46:15 +08:00
ae937dbf65 将generate输入的文本进行翻译或微处理 2024-05-07 18:27:32 +08:00
shahaibo
8da24f4933 BUGFIX:aida; 2024-05-06 16:02:02 +08:00
shahaibo
b1486c3901 Merge branch 'dev/dev' into dev/dev_shb 2024-05-06 09:57:56 +08:00
ffeaac8c46 generate 代码优化 2024-05-02 10:33:11 +08:00
shahaibo
a54f7e7c30 BUGFIX:邮件; 2024-05-01 11:54:19 +08:00
d1e45de91e Merge branch 'dev/dev_xp' into dev/dev 2024-04-30 11:40:25 +08:00
988fe89576 generate 将还未处理的请求置为Waiting状态 2024-04-30 11:39:04 +08:00
18f9e9130c Merge branch 'dev/dev_xp' into dev/dev 2024-04-30 11:00:57 +08:00
5f0546c6cf design single 在用户submit时将上传的图片保存到library 2024-04-30 10:59:41 +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
783754e0c7 Merge branch 'dev/dev_xp' into dev/dev 2024-04-25 17:23:02 +08:00
856c6e1be9 generate--sketch 修改提示词 2024-04-25 17:20:56 +08:00
1accfc087a Merge branch 'dev/dev_xp' into dev/dev 2024-04-25 14:25:33 +08:00
9627239f9a generate--print 增加风格提示词 2024-04-25 14:23:37 +08:00
518a6c0748 Merge branch 'dev/dev_xp' into dev/dev 2024-04-25 12:42:20 +08:00
6d9efc1509 generate 接口参数变更 2024-04-25 12:41:07 +08:00
3afd67e680 Merge branch 'dev/dev_xp' into dev/dev 2024-04-23 18:34:13 +08:00
c44fc14796 BUGFIX: generate 获取结果加判空 2024-04-23 18:32:29 +08:00
93b3cd9660 Merge branch 'dev/dev_xp' into dev/dev 2024-04-23 17:23:52 +08:00
ff628dc680 BUGFIX: generate 获取结果加判空 2024-04-23 17:22:40 +08:00
1e09508efb Merge branch 'dev/dev_xp' into dev/dev 2024-04-23 16:46:55 +08:00
2882b06128 sr MQ异常捕捉 手动ack
generate 全部失败 抛异常
2024-04-23 16:44:55 +08:00
shahaibo
e7d4e98ad0 BUGFIX:sketchNum bugfix; 2024-04-23 16:18:25 +08:00
shahaibo
c8f4d82bf5 BUGFIX:sketchNum bugfix; 2024-04-23 16:14:03 +08:00
shahaibo
0d84a9214e Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-04-23 15:55:36 +08:00
shahaibo
c661f4a871 BUGFIX:sketchNum bugfix; 2024-04-23 15:55:20 +08:00
c31a4bcd8f generate mode修改 2024-04-23 14:21:18 +08:00
ff842c5443 BUGFIX:SR异常 手动ACK 2024-04-23 12:18:15 +08:00
d000eaa6b8 BUGFIX:generate prompt modify 2024-04-23 11:40:02 +08:00
3114d3cb36 便利查询 权限添加 2024-04-23 11:02:53 +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
19d170c1bf 输入prompt修饰 2024-04-22 15:32:59 +08:00
825439255b Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-04-22 13:18:57 +08:00
a749c5dd2e BUGFIX:便利查询 2024-04-22 13:09:44 +08:00
shahaibo
e62f54a975 BUGFIX:create_date插入; 2024-04-19 15:39:50 +08:00
540d2a4e28 generate bug修复 2024-04-18 18:34:44 +08:00
e832d5e4d4 generate 2024-04-18 18:04:02 +08:00
3be1bf3c14 Merge branch 'dev/dev_xp' into dev/dev 2024-04-18 16:49:26 +08:00
d2076a81d5 generate 联调修改 2024-04-18 16:48:19 +08:00
874f73e933 Merge branch 'dev/dev_xp' into dev/dev 2024-04-18 14:11:42 +08:00
8856f7fc7a 漏传 2024-04-18 14:10:52 +08:00
9f23df04db Merge branch 'dev/dev_xp' into dev/dev
# Conflicts:
#	src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java
2024-04-18 14:09:16 +08:00
896120fea4 generate模型更换后的接口更改及异步获取结果 2024-04-18 14:07:20 +08:00
074e4154ac 配置修改 2024-04-11 15:20:49 +08:00
8d330e8ad9 积分充值与扣除数量变更 2024-04-11 13:48:14 +08:00
c73414a1f4 Merge branch 'test/stable' into dev/dev_xp 2024-04-11 13:30:44 +08:00
050b93d47a 积分充值与扣除数量变更 2024-04-11 11:51:52 +08:00
75a63c7a6f Merge branch 'dev/dev_xp' into dev/dev
# Conflicts:
#	src/main/resources/paypal-sandbox.properties
2024-04-11 11:45:03 +08:00
1d443b140b 为PayPal添加定时任务 2024-04-10 16:07:52 +08:00
754de78b57 single design添加渐变颜色 2024-04-10 11:21:48 +08:00
shahaibo
109176b8bd BUGFIX:排序; 2024-04-09 14:09:19 +08:00
shahaibo
6f687b5ce0 BUGFIX:排序; 2024-04-09 14:09:05 +08:00
shahaibo
66047c541d Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-04-09 13:58:37 +08:00
shahaibo
160c403005 BUGFIX:排序; 2024-04-09 13:58:27 +08:00
shahaibo
92ab7edc10 BUGFIX:排序; 2024-04-09 13:55:47 +08:00
shahaibo
95aee1daae BUGFIX:试用订单; 2024-04-09 11:55:15 +08:00
e7fbaf8924 generate 允许用户从library中选择图片 2024-04-02 12:11:04 +08:00
shahaibo
a744a3cb3d Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-04-02 10:15:49 +08:00
shahaibo
782a4f9976 BUGFIX; 2024-04-02 10:15:35 +08:00
5cd3121546 local -> dev 队列名修改 2024-03-28 16:49:33 +08:00
8d77cd0be6 修改dev环境下paypal webhook_id 2024-03-28 15:53:04 +08:00
165f0301f0 删除callbackService 2024-03-28 15:07:33 +08:00
784f599e38 paypal live-> sandbox 2024-03-28 15:04:31 +08:00
7d967ed41e 1、完善积分充值
2、升级积分扣除机制
3、优化部分代码
2024-03-28 14:43:36 +08:00
shahaibo
737ec594fd BUGFIX; 2024-03-28 11:55:52 +08:00
shahaibo
b2d615f31a BUGFIX; 2024-03-28 10:33:13 +08:00
shahaibo
bdbf5b4648 BUGFIX; 2024-03-27 13:51:33 +08:00
shahaibo
3be72dbe49 BUGFIX; 2024-03-27 13:34:36 +08:00
shahaibo
1d71d276bb Merge remote-tracking branch 'origin/dev/dev' into dev/dev_shb 2024-03-27 13:31:08 +08:00
shahaibo
54fe254ab0 BUGFIX; 2024-03-27 13:28:48 +08:00
d79fe65bf1 Merge branch 'dev/dev_xp' into dev/dev 2024-03-26 17:24:36 +08:00
4bf4dc2588 向TaskList插入数据时开启事务 2024-03-26 17:23:40 +08:00
edaa4344be 删除SR mapper 2024-03-26 15:35:49 +08:00
54df4a0ae2 paypal 环境转换sandbox->live 2024-03-26 15:31:57 +08:00
3662ed3f96 Merge branch 'dev/dev_xp' into dev/dev 2024-03-26 15:02:12 +08:00
d411b428f8 1、完善超分功能
2、完善积分系统
3、新增任务列表
2024-03-26 14:58:43 +08:00
305324fe1a 1、接入超分功能
2、添加积分系统
3、新增订单查询,积分详细查询
2024-03-15 15:38:56 +08:00
bf05f88c00 Merge branch 'release/3.0' into dev/dev_xp
# Conflicts:
#	src/main/java/com/ai/da/mapper/primary/DesignMapper.java
#	src/main/resources/mapper/primary/DesignMapper.xml
2024-03-06 21:00:07 +08:00
e84d800ba0 加入积分系统,将充值与积分关联 2024-03-06 20:56:22 +08:00
a016f16052 便利查询--指定用户有权限直接获取当前数据库部分数据 2024-03-04 16:33:23 +08:00
ee96759832 1、接入paypal
2、修改支付宝支付
2024-03-01 17:31:26 +08:00
shahaibo
db68ce7d1b BUGFIX:design new male_outwear; 2024-02-23 15:40:04 +08:00
shahaibo
87d8a92cdd BUGFIX:design new male_outwear; 2024-02-23 11:38:09 +08:00
shahaibo
471cdd866b BUGFIX:design new single; 2024-02-23 11:09:25 +08:00
shahaibo
6e191413b9 TASK:数据库地址修改:; 2024-02-22 13:38:07 +08:00
e28502a00c Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-02-22 10:25:25 +08:00
7f8c84bd35 支付宝 回调地址免验证 2024-02-22 10:25:07 +08:00
f8996999d4 支付宝 回调地址修改 2024-02-22 10:23:46 +08:00
shahaibo
10b3637c80 Merge branch 'dev/dev_shb' into dev/dev
# Conflicts:
#	src/main/java/com/ai/da/python/PythonService.java
2024-02-21 15:27:57 +08:00
shahaibo
22330b674a BUGFIX:代码优化; 2024-02-21 15:16:51 +08:00
shahaibo
6bb99194bd Merge branch 'dev/dev_shb' into dev/dev 2024-02-21 13:54:54 +08:00
shahaibo
43ec55dfb6 BUGFIX:Single design; 2024-02-21 13:53:46 +08:00
shahaibo
8fe468fda2 BUGFIX:Single design; 2024-02-20 11:20:30 +08:00
shahaibo
4e4ed0f66c Merge branch 'dev/dev_shb' into dev/dev 2024-02-20 11:19:37 +08:00
shahaibo
002a47c169 TASK:dev分支端口; 2024-02-20 11:05:01 +08:00
shahaibo
258ddbab31 TASK:个人分支端口; 2024-02-20 11:04:27 +08:00
shahaibo
703201dae6 TASK:dev端口; 2024-02-20 11:02:41 +08:00
shahaibo
66e10a5a80 TASK:代码合并; 2024-02-20 10:40:36 +08:00
shahaibo
f8d468d55b TASK:代码合并; 2024-02-20 10:35:50 +08:00
shahaibo
ca70371585 Merge remote-tracking branch 'origin/dev/dev' into dev/dev
# Conflicts:
#	src/main/java/com/ai/da/mapper/primary/entity/BaseEntity.java
#	src/main/java/com/ai/da/mapper/primary/entity/OrderInfo.java
#	src/main/java/com/ai/da/mapper/primary/entity/PaymentInfo.java
#	src/main/java/com/ai/da/mapper/primary/entity/Product.java
#	src/main/java/com/ai/da/mapper/primary/entity/RefundInfo.java
#	src/main/java/com/ai/da/service/impl/ChatRobotServiceImpl.java
2024-02-20 10:26:13 +08:00
shahaibo
68f6ae2a8d TASK:design new; 2024-02-20 10:12:44 +08:00
shahaibo
7803decb29 TASK:增加邮件通知人; 2024-02-20 09:31:31 +08:00
35fbd4d865 修改内网穿透地址 2024-02-19 15:26:42 +08:00
2a73986e64 修改内网穿透地址 2024-02-19 14:38:18 +08:00
shahaibo
4e2e1affa8 Merge branch 'dev/dev' into dev/dev_shb
# Conflicts:
#	src/main/java/com/ai/da/controller/AccountController.java
#	src/main/java/com/ai/da/mapper/primary/entity/GenerateCancel.java
#	src/main/java/com/ai/da/mapper/primary/entity/LibraryCopy.java
#	src/main/java/com/ai/da/mapper/primary/entity/LibraryModelPointCopy.java
#	src/main/java/com/ai/da/service/AccountService.java
#	src/main/java/com/ai/da/service/LibraryService.java
#	src/main/java/com/ai/da/service/impl/AccountServiceImpl.java
#	src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java
#	src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java
#	src/main/resources/application-prod.properties
#	src/main/resources/application-test.properties
2024-02-19 13:02:58 +08:00
shahaibo
9bae02406c TASK:dev分支调用python端端口修改; 2024-02-19 11:03:28 +08:00
shahaibo
a4f36a2fd5 TASK:试用时间增加; 2024-02-15 15:23:32 +08:00
shahaibo
fda2a3120b TASK:试用时间增加; 2024-02-15 15:19:09 +08:00
87580cfece 接入支付宝 联调修改 2024-02-15 14:03:44 +08:00
318d0a1441 充值功能--接入支付宝 2024-02-14 12:37:57 +08:00
874a59ea04 Merge remote-tracking branch 'origin/dev/dev_xp' into dev/dev 2024-02-14 12:22:16 +08:00
a7c60a932a 合并stable 2024-02-14 12:21:01 +08:00
7f33597c02 充值功能--接入支付宝 2024-02-14 12:10:15 +08:00
92dafd74c9 在过滤器中添加未携带token的请求ip日志打印 2024-02-01 13:28:48 +08:00
9b55083768 generate 日志打印 2024-01-31 19:35:17 +08:00
c646a8adb0 Merge branch 'release/3.0' into dev/dev
# Conflicts:
#	docker-compose.yml
#	src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java
2024-01-31 16:30:52 +08:00
69fe927576 新增generate-queue-dev消息队列 2024-01-31 16:01:06 +08:00
f4a80a4486 Merge remote-tracking branch 'origin/test/stable' into dev/dev
# Conflicts:
#	docker-compose.yml
2024-01-31 15:51:35 +08:00
83058acfea Merge remote-tracking branch 'origin/test/stable' into release/3.0
# Conflicts:
#	src/main/java/com/ai/da/service/impl/ChatRobotServiceImpl.java
#	src/main/resources/application.properties
2024-01-31 15:13:02 +08:00
8f832ec441 机器人试用到期提示 2024-01-31 14:59:19 +08:00
shahaibo
5e1573ae09 TASK:试用用户机器人余额; 2024-01-30 15:07:34 +08:00
shahaibo
f1176dfefb TASK:试用用户机器人余额; 2024-01-30 15:03:38 +08:00
zchengrong
12cd9e8f1f Delete docker-compose.yml 2024-01-30 14:52:40 +08:00
shahaibo
81c5d7ee65 TASK:试用用户机器人余额; 2024-01-30 14:20:57 +08:00
shahaibo
878b5a129c TASK:试用用户机器人余额; 2024-01-30 14:20:01 +08:00
821a3420ae 配置环境修改 2024-01-30 13:39:59 +08:00
bee78cc9a2 generate 添加试用用户判断 2024-01-30 13:34:30 +08:00
5975519c39 docker-compose.yml 2024-01-30 12:43:36 +08:00
ec9b60e1d6 docker-compose.yml 2024-01-30 12:38:56 +08:00
9e653595a9 generate 添加试用用户判断 2024-01-30 11:48:26 +08:00
02d65b4fb2 Merge remote-tracking branch 'origin/release/3.0' into test/stable
# Conflicts:
#	src/main/resources/application-prod.properties
2024-01-30 10:50:18 +08:00
533b54a768 MQ 消息队列名修改 2024-01-29 17:03:10 +08:00
shahaibo
5c2c9f22ce TASK:配置文件; 2024-01-29 11:33:28 +08:00
shahaibo
98d98b1131 TASK:配置文件; 2024-01-29 11:32:41 +08:00
shahaibo
7386f4427d TASK:配置文件; 2024-01-29 11:30:39 +08:00
shahaibo
9a5ee2b264 TASK:配置文件; 2024-01-29 11:20:26 +08:00
shahaibo
a5cbca8d74 TASK:配置文件; 2024-01-29 11:18:32 +08:00
shahaibo
2b2fb4319a TASK:配置文件; 2024-01-29 11:10:00 +08:00
shahaibo
0afcf92582 BUGFIX:试用用户; 2024-01-29 10:35:19 +08:00
shahaibo
33a096e382 Merge remote-tracking branch 'origin/release/3.0' into release/3.0 2024-01-29 10:06:58 +08:00
shahaibo
ee2a8ac3ce BUGFIX:试用用户; 2024-01-29 10:06:48 +08:00
zchengrong
17e7ebc8fe Update docker-compose.yml 2024-01-29 10:02:45 +08:00
shahaibo
41919c44c9 BUGFIX:试用用户; 2024-01-29 09:50:48 +08:00
zchengrong
12190f88c8 Update docker-compose.yml 2024-01-28 12:26:47 +08:00
zchengrong
c74c7376cc Update docker-compose.yml 2024-01-28 12:25:02 +08:00
zchengrong
4f68fbcff1 Update docker-compose.yml 2024-01-28 12:19:36 +08:00
zchengrong
e539a931f9 Update docker-compose.yml 2024-01-28 12:18:47 +08:00
zchengrong
abcad626f6 Update docker-compose.yml 2024-01-28 11:19:03 +08:00
zchengrong
ae6692523b Update docker-compose.yml 2024-01-28 11:16:59 +08:00
shahaibo
3a2253f1ce TASK:数据库连接 2024-01-28 11:08:53 +08:00
shahaibo
4380f0bc5b BUGFIX:异常级别设置 2024-01-28 10:40:29 +08:00
shahaibo
18d0d55d4f BUGFIX:设置上传文件大小,正式用户转试用用户 2024-01-27 16:32:18 +08:00
shahaibo
f047ca0324 Merge remote-tracking branch 'origin/develop' into develop 2024-01-26 15:33:43 +08:00
shahaibo
f02988a0a7 TASK:分页去除限制; 2024-01-26 15:33:33 +08:00
fc4dcd41ae generate 修改字段名str->content 2024-01-26 14:18:28 +08:00
shahaibo
d4a7fa441c Merge remote-tracking branch 'origin/develop' into develop 2024-01-26 13:18:37 +08:00
shahaibo
5af86c28f1 TASK:数据迁移; 2024-01-26 13:18:16 +08:00
shahaibo
62e6f8b77d TASK:数据迁移; 2024-01-26 13:17:59 +08:00
4c0dd27332 generate 记录取消操作 2024-01-26 13:12:04 +08:00
aa270b5f7d 修改排队位置 2024-01-25 14:11:12 +08:00
e90c4f7239 恢复配置 2024-01-25 13:44:28 +08:00
c35a188abb TASK:generate 修复逻辑Bug 2024-01-25 13:37:17 +08:00
65bed9dada TASK:generate 取消generate 2024-01-24 16:57:53 +08:00
1d2cb17d54 TASK:generate 添加队列消费者,增加并发量 2024-01-24 14:44:31 +08:00
d4568ad740 redis 配置修改 2024-01-24 11:47:19 +08:00
96858c2cc3 TASK:异步调用generate及取消generate 2024-01-24 11:43:56 +08:00
shahaibo
6b8e96ec74 TASK:design new; 2024-01-24 10:23:58 +08:00
a9ce35200c BUGFIX:测试环境配置修改 2024-01-22 16:27:46 +08:00
164454b5b2 BUGFIX:数据传输过程中long精度发生丢失 2024-01-22 16:21:32 +08:00
404172e5f2 修改获取结果的请求方式 2024-01-22 14:00:05 +08:00
ec39bf9a97 修改redis配置 2024-01-22 12:03:36 +08:00
16f590dea5 修改redis配置 2024-01-22 11:17:53 +08:00
577dc94850 1、generate 异步生成及获取排队情况
2、generate 取消生成
2024-01-21 14:14:55 +08:00
shahaibo
471426e931 TASK:多数据源; 2024-01-19 16:36:34 +08:00
shahaibo
ed3dcf9ee8 Merge branch 'develop' into dev_shb 2024-01-18 13:34:20 +08:00
shahaibo
c31ecfb1e9 TASK:docker回退; 2024-01-18 13:17:16 +08:00
shahaibo
449c568907 TASK:免登录; 2024-01-18 12:05:06 +08:00
shahaibo
b828c8fcde TASK:免登录; 2024-01-18 11:58:37 +08:00
shahaibo
557041335a TASK:免登录; 2024-01-18 11:23:25 +08:00
shahaibo
bccb6d7bd2 TASK:免登录; 2024-01-18 10:03:48 +08:00
shahaibo
365c04375a TASK:免登录; 2024-01-18 09:56:50 +08:00
shahaibo
d8c09f9597 TASK:docker配置文件; 2024-01-17 17:50:58 +08:00
shahaibo
90634f73c7 TASK:免密登录; 2024-01-17 17:49:40 +08:00
shahaibo
c5d540686e TASK:回退; 2024-01-17 10:59:43 +08:00
shahaibo
3452e4c335 TASK:回退; 2024-01-17 10:57:41 +08:00
shahaibo
5d3657bba2 TASK:证书接收测试; 2024-01-17 10:52:27 +08:00
shahaibo
393c9ec941 TASK:证书接收测试; 2024-01-17 10:33:37 +08:00
shahaibo
5678cccde1 Merge branch 'develop' into dev_shb 2024-01-16 10:51:19 +08:00
shahaibo
067cd9a1af TASK:docker回退; 2024-01-16 09:36:05 +08:00
shahaibo
1c3692d034 TASK:免登录; 2024-01-15 17:45:11 +08:00
shahaibo
2d73f0c414 TASK:免登录; 2024-01-15 17:27:34 +08:00
shahaibo
27974e5e7c TASK:docker配置文件回退; 2024-01-15 16:56:49 +08:00
shahaibo
9b4e9c3ee1 Merge branch 'dev/dev' into develop 2024-01-15 16:55:56 +08:00
shahaibo
11e231992a TASK:免密登录并发优化; 2024-01-15 16:54:20 +08:00
shahaibo
8737350002 TASK:免密登录; 2024-01-15 16:33:23 +08:00
shahaibo
ca2ed7a69c TASK:免密登录; 2024-01-15 15:59:12 +08:00
shahaibo
a75cdffe59 TASK:design NEW; 2024-01-15 15:57:40 +08:00
shahaibo
324966b1c6 TASK:免密登录; 2024-01-15 15:50:48 +08:00
shahaibo
660ee9d437 TASK:免密登录; 2024-01-15 15:41:48 +08:00
shahaibo
94d6c10522 TASK:免密登录; 2024-01-15 15:41:07 +08:00
shahaibo
ae49f3f3a7 TASK:docker配置文件; 2024-01-15 15:25:30 +08:00
shahaibo
20d8224853 Merge branch 'develop' into dev/dev 2024-01-15 15:25:08 +08:00
shahaibo
fc55a775f8 TASK:机房免登录测试; 2024-01-15 15:08:39 +08:00
shahaibo
62f9bb3795 TASK:机房免登录测试; 2024-01-15 15:06:48 +08:00
1b836175b1 修改测试稳定版 python服务端口配置 2024-01-12 11:14:43 +08:00
fe0a736feb designSingle 添加入参日志打印 2024-01-10 15:14:54 +08:00
shahaibo
547272dfcf BUGFIX:design pin逻辑; 2024-01-10 14:02:17 +08:00
shahaibo
10e80bfc27 TASK:python IP端口; 2024-01-10 11:47:40 +08:00
shahaibo
748550b670 Merge remote-tracking branch 'origin/develop' into develop 2024-01-10 10:49:50 +08:00
shahaibo
39367f5fb7 TASK:机器人接口; 2024-01-10 10:48:48 +08:00
74ef15b88e mybatis-plus DEBUG级别的日志不打印 2024-01-09 18:05:49 +08:00
shahaibo
ef6c8e85cb TASK:python服务端口; 2024-01-09 17:44:17 +08:00
shahaibo
4e334dca7d TASK:python服务端口; 2024-01-09 17:31:14 +08:00
474a532f01 Merge remote-tracking branch 'origin/develop' into develop 2024-01-09 13:54:55 +08:00
6fbcab9351 添加自定义日志管理,输出到日志文件 2024-01-09 13:54:32 +08:00
shahaibo
36e488e0aa TASK:docker配置文件回退; 2024-01-09 13:52:03 +08:00
shahaibo
a3ae8401fb TASK:定时任务执行周期; 2024-01-09 13:44:15 +08:00
shahaibo
7a0b6307b0 TASK:docker配置文件回退; 2024-01-08 13:33:26 +08:00
shahaibo
580ebc91ff Merge remote-tracking branch 'origin/develop' into dev/dev
# Conflicts:
#	.gitignore
2024-01-08 13:32:56 +08:00
shahaibo
dc325e6ab4 TASK:忽略docker配置文件; 2024-01-08 13:31:05 +08:00
shahaibo
80976f45a7 TASK:忽略docker配置文件; 2024-01-08 13:30:34 +08:00
shahaibo
5bed3c180b TASK:续订通知; 2024-01-08 13:02:50 +08:00
zchengrong
67c137392f Update application.properties 2024-01-06 20:11:06 +08:00
zchengrong
6e979d58a2 Update application-prod.properties 2024-01-06 20:08:19 +08:00
zchengrong
7a95bce2b1 Update docker-compose.yml 2024-01-06 19:25:51 +08:00
shahaibo
84dd2d7cd9 TASK:端口; 2024-01-05 11:31:23 +08:00
shahaibo
4a8867dbb5 TASK:批量修改类别; 2024-01-05 11:11:29 +08:00
shahaibo
8930e64bf7 Merge remote-tracking branch 'origin/develop' into dev/dev 2024-01-05 10:25:50 +08:00
9405b0d630 判断机器人返回图片地址是否实际存在 2024-01-04 17:34:49 +08:00
71f1a2671e Merge branch 'develop' into dev/dev 2024-01-04 17:15:03 +08:00
shahaibo
71a0a3c06b TASK:到期时间查询; 2024-01-04 15:22:38 +08:00
shahaibo
f2a8a82821 TASK:公共标签; 2024-01-04 14:45:20 +08:00
shahaibo
3b37e8644c TASK:公共标签; 2024-01-04 14:25:54 +08:00
shahaibo
2832105ac2 Merge remote-tracking branch 'origin/develop' into develop 2024-01-04 13:57:32 +08:00
shahaibo
eafa6daf5b TASK:公共标签; 2024-01-04 13:57:17 +08:00
7a309bcb17 机器人返回图片数量修改 2024-01-04 11:47:09 +08:00
shahaibo
fc4a59d41a Merge remote-tracking branch 'origin/develop' into develop 2024-01-04 11:04:45 +08:00
shahaibo
11f94ebcb4 BUGFIX:element上传; 2024-01-04 11:04:15 +08:00
7c94bc4826 机器人返回图片路径修改 2024-01-04 10:15:48 +08:00
zchengrong
00cf7b3140 Update DesignServiceImpl.java 2024-01-02 17:13:13 +08:00
zchengrong
914910903e Update application-test.properties 2024-01-02 17:05:37 +08:00
28d92c468c Merge remote-tracking branch 'origin/develop' into dev/dev
# Conflicts:
#	src/main/resources/application-prod.properties
2024-01-02 13:05:06 +08:00
dd5997fea6 统一管理python端服务ip和端口 2024-01-02 11:53:09 +08:00
d19aa7083b 添加状态检测 2023-12-29 13:48:42 +08:00
zhouchengrong
858a195e13 新增aws 状态检测接口 2023-12-29 13:35:39 +08:00
4b1974aceb 添加状态检测 2023-12-29 13:19:48 +08:00
eb45f6e7d0 history designSingle之后日期未更新-bug修复 2023-12-28 17:58:51 +08:00
1c8f230a64 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2023-12-28 16:35:31 +08:00
shahaibo
85b4d674ea Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2023-12-28 13:56:18 +08:00
shahaibo
8c3b658df0 Merge remote-tracking branch 'origin/develop' into dev/dev 2023-12-28 13:52:28 +08:00
46511fed71 Merge remote-tracking branch 'origin/develop' into dev/dev 2023-12-28 11:05:07 +08:00
f346727469 Merge remote-tracking branch 'origin/develop' into develop 2023-12-28 09:46:03 +08:00
e9844e38a4 generate 为version 1添加str前缀及判空 2023-12-28 09:45:44 +08:00
shahaibo
91012a00b6 BUGFIX:element上传; 2023-12-27 11:08:09 +08:00
shahaibo
bd116ff011 BUGFIX:忘记密码; 2023-12-22 14:12:20 +08:00
shahaibo
ce7c6c657b BUGFIX:忘记密码; 2023-12-22 14:05:31 +08:00
131f46b59e 配置文件修改 2023-12-22 12:09:00 +08:00
shahaibo
0f8f6679ab Merge remote-tracking branch 'origin/develop' into develop 2023-12-22 11:17:51 +08:00
shahaibo
a5d08e700a BUGFIX:retrieve; 2023-12-22 11:17:35 +08:00
f98f54f3c1 Merge remote-tracking branch 'origin/develop' into dev/dev
# Conflicts:
#	docker-compose.yml
2023-12-22 10:55:34 +08:00
zchengrong
23e2c507df Update docker-compose.yml 2023-12-22 10:45:24 +08:00
zchengrong
6331b5d164 Update docker-compose.yml 2023-12-22 10:44:58 +08:00
zchengrong
2dd1ad8a08 Update docker-compose.yml 2023-12-22 10:35:58 +08:00
e45e63103f BUGFIX:修复获取图片命名 2023-12-21 14:23:33 +08:00
shahaibo
640c9527be Merge remote-tracking branch 'origin/develop' into develop 2023-12-21 10:55:34 +08:00
shahaibo
8fa682e9e8 TASK:minio地址更新; 2023-12-21 10:55:14 +08:00
480eb72be0 BUGFIX:修复single模式下衣服图层不返回 2023-12-20 11:18:38 +08:00
shahaibo
8dd658f1e9 BUGFIX: 使用订单通过后的邮件标题,多语言内容更新; 2023-12-18 17:18:19 +08:00
a9c5a5fd2b BUGFIX:修复衣服删除为0件时导致的数据库查询报错 2023-12-15 10:49:57 +08:00
shahaibo
5aa2e2a357 TASK:试用订单; 2023-12-14 17:16:23 +08:00
shahaibo
ba6588058a TASK:自动审批; 2023-12-14 16:33:57 +08:00
shahaibo
8b3058513f Merge remote-tracking branch 'origin/develop' into develop 2023-12-14 16:21:42 +08:00
shahaibo
f9b24492c9 BUGFIX:choose; 2023-12-14 16:21:21 +08:00
2de3a73fef BUGFIX:衣服图层添加优先级后对之前数据不兼容的修复-漏提交 2023-12-14 15:49:29 +08:00
86ab0806fd BUGFIX:衣服图层添加优先级后对之前数据不兼容的修复 2023-12-14 15:47:03 +08:00
fef71ead79 TASK:category识别python端端口变更 2023-12-14 14:05:02 +08:00
26a61a44a2 TASK:根据designItemId获取模特图 2023-12-14 11:26:12 +08:00
shahaibo
4d87164b8e BUGFIX:choose; 2023-12-14 10:57:47 +08:00
shahaibo
81d178b3a4 BUGFIX:library男模特打点预览; 2023-12-14 10:46:03 +08:00
zchengrong
51f3b5b30b Update docker-compose.yml 2023-12-14 10:35:16 +08:00
zchengrong
b4b935c378 Update docker-compose.yml 2023-12-14 10:33:30 +08:00
shahaibo
b0dc1f4763 BUGFIX:library男模特打点预览; 2023-12-14 10:21:30 +08:00
shahaibo
79cff13edb Merge remote-tracking branch 'origin/dev/dev' into develop
# Conflicts:
#	docker-compose.yml
2023-12-13 17:26:48 +08:00
shahaibo
b71a1c834d Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2023-12-13 17:23:29 +08:00
shahaibo
24312a8f2b BUGFIX; 2023-12-13 17:23:06 +08:00
a14188ee35 TASK:design模块添加记录priority到数据库 2023-12-13 17:17:39 +08:00
zchengrong
59008e7a7e Update docker-compose.yml 2023-12-13 14:59:36 +08:00
zchengrong
3d44ab4a52 Update docker-compose.yml 2023-12-13 14:57:51 +08:00
zchengrong
8c82cef169 Update docker-compose.yml 2023-12-13 14:32:09 +08:00
4512fb3268 TASK:getDetail添加返回字段priority 2023-12-13 14:20:13 +08:00
483eea66b9 BUGFIX:layer_order默认false 2023-12-13 11:56:13 +08:00
43b9ba74ab 注释添加 2023-12-13 11:25:52 +08:00
c3dfdd6fb8 Merge remote-tracking branch 'origin/develop' into develop 2023-12-13 10:52:26 +08:00
51548b52ba TASK:designSingle 添加多件衣服并允许添加相同类型的服装 2023-12-13 10:45:52 +08:00
zchengrong
78ce0120c4 Update docker-compose.yml 2023-12-12 16:14:17 +08:00
shahaibo
4e3746cfba Merge remote-tracking branch 'origin/develop' into develop 2023-12-11 16:59:21 +08:00
shahaibo
1f77698bc4 TASK: 试用用户添加测试; 2023-12-11 16:59:05 +08:00
78d41aa2f5 Merge remote-tracking branch 'origin/develop' into develop 2023-12-11 15:35:33 +08:00
be5d60d6c1 BUGFIX:添加入参判断 2023-12-11 15:35:11 +08:00
ae91cac28a BUGFIX:添加入参判断 2023-12-11 15:32:53 +08:00
shahaibo
f80e5ce455 TASK: 试用用户添加测试; 2023-12-11 15:11:40 +08:00
shahaibo
db1aed53eb Merge remote-tracking branch 'origin/develop' into develop 2023-12-11 14:35:21 +08:00
shahaibo
7fdacaeb7c TASK: 试用用户添加测试; 2023-12-11 14:35:05 +08:00
cd41229f9e TASK:自动识别上传服装的类别 2023-12-11 14:24:28 +08:00
shahaibo
2b8f970acc TASK: 试用用户添加测试; 2023-12-11 10:52:42 +08:00
shahaibo
91993feee8 TASK: 试用用户添加测试; 2023-12-11 10:02:05 +08:00
shahaibo
5300cec43d TASK: 试用用户添加测试; 2023-12-06 17:02:43 +08:00
shahaibo
9d7cf848e1 TASK: 试用用户添加测试; 2023-12-06 17:02:25 +08:00
shahaibo
23b69c1e7b TASK: 试用用户添加测试; 2023-12-06 16:31:20 +08:00
shahaibo
7bbca01f86 TASK: 试用用户添加测试; 2023-12-06 16:15:20 +08:00
shahaibo
30ff40e84a TASK: 试用用户添加测试; 2023-12-06 15:58:57 +08:00
shahaibo
be6795b42a BUGFIX: 回显; 2023-12-04 14:04:36 +08:00
shahaibo
a7893d07bb BUGFIX: Library过滤; 2023-11-30 13:38:23 +08:00
shahaibo
7072c8ad2a TASK: 裁剪; 2023-11-29 15:01:27 +08:00
shahaibo
6d99a5fa16 TASK: 是否完成引导字段添加; 2023-11-29 14:37:32 +08:00
shahaibo
98ca270156 TASK: 裁剪白底字段添加; 2023-11-29 14:19:04 +08:00
shahaibo
4b1bf8585d TASK: 裁剪白底字段添加; 2023-11-28 15:57:32 +08:00
shahaibo
1747eb3a59 TASK: sketches裁剪; 2023-11-23 15:41:25 +08:00
shahaibo
3e3aaa54c4 TASK: sketches裁剪; 2023-11-23 15:27:01 +08:00
shahaibo
e18a4f78c4 Merge remote-tracking branch 'origin/develop' into develop 2023-11-23 14:05:20 +08:00
shahaibo
f0aa041c1e TASK: 枚举类多语言; 2023-11-23 14:05:04 +08:00
xupei
9e5a6cae11 Merge remote-tracking branch 'origin/develop' into develop 2023-11-23 12:04:04 +08:00
xupei
94eab51d6c BUGFIX:根据性别对图片路径进行不同处理 2023-11-23 12:02:41 +08:00
shahaibo
ecec69a45e TASK: 枚举类多语言; 2023-11-23 10:32:33 +08:00
shahaibo
5213b03598 TASK: sketchBoard裁剪; 2023-11-22 16:44:28 +08:00
shahaibo
edce5f3227 TASK: sketchBoard裁剪; 2023-11-22 16:38:18 +08:00
shahaibo
7b98aa90d9 TASK: sketchBoard上传; 2023-11-22 15:48:08 +08:00
shahaibo
00166b9246 Merge remote-tracking branch 'origin/develop' into develop 2023-11-22 15:19:12 +08:00
shahaibo
9e3c29bd47 TASK: sketchBoard上传;工作空间列表; 2023-11-22 15:18:58 +08:00
xupei
d9a5b0f326 从library删除generate的图片时需要取消该图片的like标签 2023-11-22 11:18:51 +08:00
xupei
b9d502db42 聊天机器人异常提醒语句修改 2023-11-21 16:57:20 +08:00
xupei
b77a85d134 Merge remote-tracking branch 'origin/develop' into develop 2023-11-21 16:48:10 +08:00
xupei
8a3e6833ee TASK:机器人添加查询男装 2023-11-21 16:47:43 +08:00
shahaibo
8ff91be0f0 TASK: 印花逻辑; 2023-11-21 15:35:58 +08:00
shahaibo
ff34193e02 TASK: 印花逻辑; 2023-11-21 14:09:47 +08:00
shahaibo
955ebd0904 TASK: 印花逻辑; 2023-11-20 16:41:35 +08:00
shahaibo
20b68d1f92 TASK: 用户试用; 2023-11-20 16:03:34 +08:00
shahaibo
091c11c951 Merge remote-tracking branch 'origin/develop' into develop 2023-11-20 15:06:29 +08:00
shahaibo
4971f2b96a TASK: 用户试用添加,印花逻辑调整; 2023-11-20 15:06:15 +08:00
xupei
13208fed14 Merge remote-tracking branch 'origin/develop' into develop 2023-11-16 10:33:28 +08:00
xupei
ee7820ff8b TASK:moodboard与printboard 图片合成 2023-11-16 10:33:08 +08:00
shahaibo
c15ff3f344 Merge remote-tracking branch 'origin/develop' into develop 2023-11-15 13:32:33 +08:00
shahaibo
1056b9b0b0 TASK: library关联分类; 2023-11-15 13:32:19 +08:00
xupei
9e58ed47ea Merge remote-tracking branch 'origin/develop' into develop 2023-11-15 13:22:36 +08:00
xupei
35e6bb8cd9 BUGFIX:取消like后不能再like同一张图片
其他:generate--sketchboard 添加gender
修改generate like的图片命名--当下的十位时间戳
2023-11-15 13:22:15 +08:00
shahaibo
c6561a4fe8 TASK: library关联分类; 2023-11-15 11:35:27 +08:00
shahaibo
93577cab8e TASK: library关联分类; 2023-11-15 10:22:55 +08:00
shahaibo
211f589d84 TASK: library关联分类; 2023-11-14 15:59:11 +08:00
shahaibo
6d673d6f32 TASK: library关联分类; 2023-11-14 15:26:54 +08:00
shahaibo
09ebb4ca06 TASK: library关联分类; 2023-11-14 14:50:03 +08:00
shahaibo
5dbf76c4e2 TASK: library关联分类; 2023-11-14 14:33:56 +08:00
shahaibo
bcfcb5da12 TASK: library关联分类; 2023-11-13 14:21:28 +08:00
shahaibo
6da1286e56 BUGFIX: library关联分类; 2023-11-13 11:50:45 +08:00
shahaibo
8afec1e962 TASK: 多语言; 2023-11-09 17:13:33 +08:00
shahaibo
f3fcaa3ed6 BUGFIX: 男装 outwear single design; 2023-11-09 13:19:18 +08:00
shahaibo
ebbe39468e Merge remote-tracking branch 'origin/develop' into develop 2023-11-08 15:25:54 +08:00
shahaibo
94809e149d TASK: library分类; 2023-11-08 15:22:46 +08:00
xupei
6a869cf4b5 BUGFIX:designSingle 系统默认模特宽高修改 2023-11-08 11:42:33 +08:00
shahaibo
269b6fa5fb TASK: library分类; 2023-11-07 15:12:55 +08:00
shahaibo
c8fe8c27f8 Merge remote-tracking branch 'origin/develop' into develop
# Conflicts:
#	src/main/resources/messages_en.properties
2023-11-07 11:42:37 +08:00
shahaibo
008d0d626e BUGFIX: 模特删除校验;
TASK: 多语言;
2023-11-07 11:32:03 +08:00
shahaibo
bb1c56182e BUGFIX: sketchBoard upload checkMd5校验;
TASK: 分类;
2023-11-03 14:59:19 +08:00
xupei
331490c447 BUGFIX:generateType 2023-11-03 13:59:16 +08:00
xupei
ffcbabf62e Generate
1、将生成图片的md5存储到数据库
2、记录sketchboard下,生成图片时的性别(添加到generateType之后)
2023-11-03 11:29:54 +08:00
xupei
0313149ea5 修改异常处理+代码清理 2023-11-02 15:35:07 +08:00
shahaibo
85a815dddc BUGFIX: design generate处理; 2023-11-02 14:00:02 +08:00
shahaibo
77be2c7472 Merge remote-tracking branch 'origin/develop' into develop 2023-11-02 11:28:20 +08:00
shahaibo
8840dfc59d BUGFIX: design generate处理; 2023-11-02 11:14:18 +08:00
xupei
2524077768 generate
1、sketchboard的生成条件添加gender
2、添加存储生成图片MD5值到数据库
2023-11-02 10:55:25 +08:00
shahaibo
dbc8c7dcf5 BUGFIX: 系统模特高宽; 2023-11-01 17:30:52 +08:00
shahaibo
78678efd5d BUGFIX: 上传校验; 2023-11-01 09:56:02 +08:00
shahaibo
998ad81835 TASK: 多语言补充; 2023-10-31 16:23:39 +08:00
shahaibo
d71674393f TASK: 语言; 2023-10-31 15:28:37 +08:00
shahaibo
8a04e7a507 TASK: 语言; 2023-10-31 15:05:27 +08:00
shahaibo
44a30bf9b5 TASK: 全局异常优化; 2023-10-31 14:07:43 +08:00
shahaibo
68d28995b8 TASK: 全局异常优化; 2023-10-27 17:02:04 +08:00
shahaibo
31eb3773f6 TASK: 系统模特高宽调整;全局异常优化; 2023-10-27 14:04:27 +08:00
shahaibo
70055f2f4a TASK: 全局异常处理,代码优化,测试数据库连接信息变更; 2023-10-27 10:14:23 +08:00
shahaibo
bedc640e13 TASK: 全局异常处理,代码优化,测试数据库连接信息变更; 2023-10-27 10:09:19 +08:00
shahaibo
9fa605f83e BUGFIX: format; 2023-10-20 14:47:18 +08:00
shahaibo
f18c27fe02 BUGFIX: 代码优化; 2023-10-19 16:12:42 +08:00
shahaibo
201b188579 BUGFIX: like detail; 2023-10-18 16:51:08 +08:00
shahaibo
4b28732d32 BUGFIX: library upload md5重复校验优化; 2023-10-18 15:57:28 +08:00
shahaibo
81d20625f5 BUGFIX: library upload md5重复校验优化; 2023-10-18 15:54:23 +08:00
shahaibo
4c11f2e280 Merge remote-tracking branch 'origin/develop' into develop 2023-10-18 14:58:27 +08:00
shahaibo
2b2fd1a72c BUGFIX: library upload md5重复校验优化; 2023-10-18 14:58:12 +08:00
xupei
fe2ffcd6a6 BUGFIX:修改pantone返回的rgb值 2023-10-18 11:46:50 +08:00
shahaibo
89d3349b49 BUGFIX: retrive回参参数名统一; 2023-10-17 13:42:41 +08:00
shahaibo
8720fc5992 BUGFIX: workspace校验添加; 2023-10-17 10:29:08 +08:00
shahaibo
c3e979e096 BUGFIX: 模特preview; 2023-10-16 11:42:20 +08:00
shahaibo
f76298c42f BUGFIX: 模特preview; 2023-10-16 11:14:48 +08:00
shahaibo
8ad330f690 BUGFIX: 模特preview; 2023-10-16 11:10:23 +08:00
shahaibo
5e70f7ca73 BUGFIX: 模特preview; 2023-10-16 10:53:37 +08:00
shahaibo
0dd765123f TASK: attribute_retrieval; 2023-10-13 10:52:12 +08:00
shahaibo
770e9d1d23 BUGFIX: 机器人余额优化; 2023-10-12 15:50:20 +08:00
shahaibo
381d40c346 BUGFIX: design存sketchboard到library; 2023-10-12 15:35:55 +08:00
shahaibo
e3b7304bbf BUGFIX: library分页; 2023-10-12 14:52:40 +08:00
shahaibo
6f01397d18 Merge remote-tracking branch 'origin/develop' into develop 2023-10-12 10:28:22 +08:00
shahaibo
95174707d8 BUGFIX: 机器人; 2023-10-12 10:27:52 +08:00
shahaibo
1ff64e01e5 BUGFIX: workspace删除校验; 2023-10-12 10:16:50 +08:00
xupei
6bbc8e3f1c Merge remote-tracking branch 'origin/develop' into develop 2023-10-12 10:11:43 +08:00
xupei
39abb48d6f BUGFIX:overall模式下 印花参数返回有null值问题 2023-10-12 10:11:27 +08:00
shahaibo
bad3f86d6d BUGFIX: 机器人喜欢图片喜欢; 2023-10-12 10:07:23 +08:00
shahaibo
47df80138b BUGFIX: workspace新增; 2023-10-12 09:57:48 +08:00
shahaibo
6549e2baeb BUGFIX:机器人聊天; 2023-10-11 17:10:45 +08:00
shahaibo
3ebb3842c2 BUGFIX:机器人返回minio url 性别; 2023-10-11 16:58:40 +08:00
shahaibo
990a270a7b BUGFIX:机器人返回minio url 性别; 2023-10-11 16:56:08 +08:00
shahaibo
ef4624e1bd Merge remote-tracking branch 'origin/develop' into develop 2023-10-11 16:25:40 +08:00
shahaibo
65c84ae5b5 BUGFIX:数据库连接池配置调试; 2023-10-11 16:24:26 +08:00
shahaibo
839c6baa8a BUGFIX:数据库连接池配置调试; 2023-10-11 16:19:35 +08:00
xupei
d8f55a4cc4 接口修改:获取minIO预览地址优先从本地缓存中获取 2023-10-11 15:49:55 +08:00
shahaibo
85a0595f2a BUGFIX:redesign processId传递; 2023-10-11 15:43:25 +08:00
shahaibo
e3309e9841 BUGFIX:synthesis_url返回为空异常处理; 2023-10-11 15:30:44 +08:00
shahaibo
278ef4e9c8 BUGFIX:like 修改detail返回图片; 2023-10-11 15:07:39 +08:00
shahaibo
879703e870 Merge remote-tracking branch 'origin/develop' into develop 2023-10-11 14:54:09 +08:00
shahaibo
e5beab268c TASK:预签名缓存; 2023-10-11 14:53:38 +08:00
xupei
0232df535e Merge remote-tracking branch 'origin/develop' into develop 2023-10-11 13:39:48 +08:00
xupei
bd5ca604f4 Merge remote-tracking branch 'origin/develop' into develop 2023-10-11 13:39:36 +08:00
shahaibo
9e2f4f75c1 TASK:导出喜欢 图片名称添加; 2023-10-11 13:39:24 +08:00
xupei
ffb6a2c9c7 接口修改:getDetail 添加男装服装类型 2023-10-11 13:39:17 +08:00
shahaibo
d1cdef3be5 Merge remote-tracking branch 'origin/develop' into develop 2023-10-11 11:19:10 +08:00
shahaibo
b38754cf74 BUGFIX:redesign 性别传递; 2023-10-11 11:18:56 +08:00
shahaibo
9c162f7ab8 TASK:retrive返回添加图片名称; 2023-10-11 11:03:31 +08:00
xupei
5302e791b9 Merge remote-tracking branch 'origin/develop' into develop 2023-10-11 10:50:58 +08:00
xupei
8229ec7dc0 BUGFIX:offset 2023-10-11 10:50:42 +08:00
shahaibo
b1cd767f9c Merge remote-tracking branch 'origin/develop' into develop 2023-10-11 10:47:56 +08:00
xupei
2d8672e0a8 接口修改:存储offset并返回给前端 2023-10-11 10:37:11 +08:00
shahaibo
ad30fdcc5d BUGFIX:library分页查询; 2023-10-11 10:06:52 +08:00
shahaibo
2cd94fd026 TASK:男装逻辑; 2023-10-10 17:33:39 +08:00
shahaibo
b1d7df2d48 Merge remote-tracking branch 'origin/develop' into develop 2023-10-10 15:02:20 +08:00
shahaibo
e6a72b6a32 TASK:男装; 2023-10-10 15:02:06 +08:00
xupei
7bc0ddd068 接口修改:designSingle 删除参数icon 2023-10-10 14:21:23 +08:00
shahaibo
84c45cb550 Merge remote-tracking branch 'origin/develop' into develop 2023-10-10 14:19:29 +08:00
shahaibo
4a803d90f2 TASK:代码提交; 2023-10-10 14:19:10 +08:00
xupei
555c3cf0dd 接口修改:design 保存印花的位置、角度、优先级 2023-10-09 17:09:57 +08:00
xupei
0f4a51af18 test配置文件修改:端口修改为5567 2023-10-09 16:53:29 +08:00
xupei
7d8c3ca8f3 接口修改: designSingle添加返回参数 offset,currentFullBodyView 2023-10-09 16:40:39 +08:00
shahaibo
1f463aeaaa Merge remote-tracking branch 'origin/develop' into develop 2023-10-09 10:26:24 +08:00
shahaibo
26f4566fac BUGFIX:系统模特高宽默认1050 500; 2023-10-09 10:26:10 +08:00
xupei
37be900b22 接口修改: designSingle添加入参 processId 2023-10-09 10:03:04 +08:00
shahaibo
e7ea5c2a2a BUGFIX:系统模特高宽默认1050 500; 2023-10-09 09:51:31 +08:00
shahaibo
b18e8eb09f BUGFIX:library upload; 2023-10-07 18:47:53 +08:00
shahaibo
935dedcf09 BUGFIX:library upload; 2023-10-07 18:28:47 +08:00
shahaibo
8893ef0039 BUGFIX:design接口 python入参添加两个字段; 2023-10-07 17:55:58 +08:00
xupei
75c1d4dee1 Merge remote-tracking branch 'origin/develop' into develop 2023-10-06 15:56:51 +08:00
xupei
6eb4f997c3 接口修改: 将designSingle与editLayer接口合并 2023-10-06 15:56:32 +08:00
shahaibo
3abb07cb3b Merge remote-tracking branch 'origin/develop' into develop 2023-10-06 10:28:17 +08:00
shahaibo
b6e33668ec BUGFIX:模特; 2023-10-06 10:28:01 +08:00
xupei
e8cbe6f244 BUGFIX: designSingle submit 2023-10-06 09:45:07 +08:00
shahaibo
e8760df88f BUGFIX:模特; 2023-10-05 16:17:01 +08:00
shahaibo
fa44552437 Merge remote-tracking branch 'origin/develop' into develop 2023-10-05 15:16:03 +08:00
shahaibo
61e9888ab9 BUGFIX:模特; 2023-10-05 15:14:50 +08:00
xupei
d8d167baa8 designSingle 新增返回图层minio地址 2023-10-05 15:09:49 +08:00
xupei
30ba1d1d71 BUGFIX:修改图层大小和位置 传参image_url mask_url 2023-10-05 14:54:42 +08:00
xupei
dac556a4ba Merge remote-tracking branch 'origin/develop' into develop 2023-10-05 14:25:41 +08:00
xupei
9877a5240f BUGFIX:印花 overall 2023-10-05 14:25:25 +08:00
shahaibo
907184d2eb BUGFIX:模特; 2023-10-05 13:37:42 +08:00
shahaibo
9d1d555032 Merge remote-tracking branch 'origin/develop' into develop 2023-10-05 12:11:25 +08:00
shahaibo
54bbf0b9b3 BUGFIX:模特; 2023-10-05 12:05:16 +08:00
xupei
7a1652ac60 BUGFIX:编辑图层位置大小 2023-10-05 11:30:06 +08:00
xupei
a9f24e8fe5 BUGFIX:添加progress_id 2023-10-05 09:43:03 +08:00
xupei
abecb54b1d BUGFIX:获取模特信息 2023-10-04 19:14:42 +08:00
shahaibo
a5a70884b8 BUGFIX:系统模特上传; 2023-10-04 17:34:52 +08:00
shahaibo
f661271f48 BUGFIX:系统模特上传; 2023-10-04 17:28:24 +08:00
shahaibo
c1c1687e8e BUGFIX:系统模特上传; 2023-10-04 17:22:42 +08:00
shahaibo
1ef079a1f9 BUGFIX:系统模特上传; 2023-10-04 17:02:54 +08:00
shahaibo
9bf7bba29c BUGFIX:系统模特上传; 2023-10-04 16:27:15 +08:00
shahaibo
7daa3dc004 BUGFIX:系统模特上传; 2023-10-04 16:22:46 +08:00
shahaibo
4068a64c54 BUGFIX:系统模特上传; 2023-10-04 16:20:36 +08:00
shahaibo
b560deb1f3 BUGFIX:系统模特上传; 2023-10-04 16:14:52 +08:00
shahaibo
edc4947280 BUGFIX:系统模特上传; 2023-10-04 16:11:27 +08:00
shahaibo
b46a1815e5 BUGFIX:系统模特上传; 2023-10-04 16:09:11 +08:00
shahaibo
9c3ab437fb BUGFIX:系统模特上传; 2023-10-04 15:56:31 +08:00
shahaibo
3620a0a895 BUGFIX:系统模特上传; 2023-10-04 15:37:20 +08:00
shahaibo
0893af46dd BUGFIX:系统模特上传; 2023-10-04 15:29:54 +08:00
shahaibo
2ad61ff618 Merge remote-tracking branch 'origin/develop' into develop 2023-10-04 15:06:34 +08:00
shahaibo
00fcdf9cbf BUGFIX:系统模特上传; 2023-10-04 14:58:06 +08:00
xupei
6dc61dd452 模特相关修改
及图层修改 添加优先级
2023-10-04 14:51:00 +08:00
shahaibo
9e7ed913ce TASK:印花; 2023-10-04 13:16:02 +08:00
shahaibo
db502aaef5 Merge remote-tracking branch 'origin/develop' into develop 2023-10-04 09:26:48 +08:00
shahaibo
114b78bdfa TASK:印花; 2023-10-04 09:26:26 +08:00
xupei
0103b0c814 修改图层大小和位置 2023-10-04 08:59:27 +08:00
shahaibo
fd5e47ecdc TASK:印花; 2023-10-04 08:20:59 +08:00
shahaibo
ee32111599 TASK:模特相关接口; 2023-10-04 06:47:48 +08:00
shahaibo
612fb61ac1 TASK:参数名修改; 2023-10-03 18:40:55 +08:00
shahaibo
b9abb2dd8f TASK:参数名修改; 2023-10-03 18:40:23 +08:00
shahaibo
0931923d0b Merge remote-tracking branch 'origin/develop' into dev_shb
# Conflicts:
#	src/main/java/com/ai/da/mapper/entity/SysFile.java
2023-09-30 13:23:08 +08:00
shahaibo
1959e3b7ff TASK:roll back; 2023-09-29 21:45:22 +08:00
shahaibo
0a3487a3db TASK:机器人、首页、history模块代码; 2023-09-29 21:44:43 +08:00
xupei
b0095e26a7 design detail 新增接口--编辑图层的位置、大小 2023-09-29 13:59:38 +08:00
xupei
f026a9b929 Merge remote-tracking branch 'origin/dev_shb' into develop
# Conflicts:
#	src/main/java/com/ai/da/service/impl/DesignServiceImpl.java
2023-09-28 10:29:54 +08:00
xupei
7356a0a3c4 designSingle 、getDetail 接口联调修改 2023-09-26 16:28:36 +08:00
xupei
8a3c42ac0e designSingle 、getDetail 添加返回印花详细 2023-09-26 15:47:01 +08:00
xupei
255529c8bc getDetail 修改bug-相同的colorIndex导致颜色返回为空 2023-09-22 17:04:08 +08:00
shahaibo
02d658dd0d TASK:workspace、design模块代码; 2023-09-22 16:28:33 +08:00
xupei
55e32d2fe7 getDetail 不返回颜色问题修改 2023-09-22 16:07:11 +08:00
xupei
b2e3347a92 design single submit bug修改 2023-09-22 13:41:55 +08:00
xupei
11fdeebe76 bug修改 2023-09-21 14:34:50 +08:00
xupei
dcd4ce584c 印花坐标修改 2023-09-21 13:44:39 +08:00
xupei
e1b3c20131 Merge remote-tracking branch 'origin/dev_shb' into develop 2023-09-21 11:36:43 +08:00
shahaibo
1870996244 TASK:workspace、design模块代码; 2023-09-21 11:35:58 +08:00
xupei
ba96d52611 模特路径修改 2023-09-21 09:59:36 +08:00
xupei
e0d8d14235 模特路径修改 2023-09-21 09:55:21 +08:00
xupei
d6e74883b9 配置文件修改 2023-09-20 16:52:46 +08:00
xupei
20f5a3eda2 design single接口疏通 2023-09-20 16:16:02 +08:00
xupei
7e6047ddf7 Merge remote-tracking branch 'origin/dev_shb' into develop
# Conflicts:
#	src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java
2023-09-20 16:04:12 +08:00
shahaibo
49b62d3733 TASK:workspace、design模块代码; 2023-09-20 16:02:57 +08:00
shahaibo
d3530f0af9 Merge remote-tracking branch 'origin/dev-xp' into dev_shb
# Conflicts:
#	src/main/java/com/ai/da/service/impl/DesignServiceImpl.java
#	src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java
2023-09-20 13:35:35 +08:00
xupei
3f90715e00 Merge remote-tracking branch 'origin/dev_shb' into develop 2023-09-20 13:12:00 +08:00
shahaibo
0115759563 TASK:workspace、design模块代码; 2023-09-20 13:03:07 +08:00
xupei
8478de460a Merge remote-tracking branch 'origin/dev_shb' into develop
# Conflicts:
#	src/main/java/com/ai/da/service/impl/DesignServiceImpl.java
#	src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java
2023-09-20 13:02:02 +08:00
shahaibo
cbb5145123 TASK:workspace、design模块代码; 2023-09-20 12:05:08 +08:00
xupei
7269c19aab generate 接口疏通 2023-09-19 16:37:23 +08:00
xupei
3afe1c715d generate 接口疏通 2023-09-19 15:52:33 +08:00
xupei
aef2bb7457 generate 修改dislike接口 2023-09-19 15:39:21 +08:00
xupei
eb2ef0f39d generate 添加dislike功能
获取library地址修改(兼容minio地址)
2023-09-19 15:21:53 +08:00
xupei
00803692b2 minio 返回路径修改 2023-09-19 13:25:55 +08:00
xupei
a543dde9a7 generate bug修改 2023-09-19 10:56:17 +08:00
xupei
d418df3c60 generate 接口疏通 2023-09-19 10:25:03 +08:00
xupei
88b526f1c4 getDetail designSingle bug修改 2023-09-18 17:22:15 +08:00
xupei
206f365ff3 design Single接口第二版 2023-09-18 14:44:30 +08:00
xupei
778bb9534d design Single接口第一版 2023-09-18 11:33:13 +08:00
xupei
305b932cbd design Single接口第一版 2023-09-18 11:31:26 +08:00
xupei
146101eec4 Merge remote-tracking branch 'origin/dev_shb' into dev-xp 2023-09-18 10:09:53 +08:00
shahaibo
9ba7049438 TASK:workspace、design模块代码; 2023-09-18 09:51:53 +08:00
xupei
01cdbf99f9 Merge remote-tracking branch 'origin/dev_shb' into dev-xp
# Conflicts:
#	src/main/java/com/ai/da/model/vo/DesignPythonOutfitVO.java
#	src/main/java/com/ai/da/python/PythonService.java
#	src/main/java/com/ai/da/service/impl/TDesignPythonOutfitDetailServiceImpl.java
2023-09-14 14:19:34 +08:00
shahaibo
e007d2353e TASK:workspace、design模块代码; 2023-09-14 13:19:54 +08:00
xupei
cf771a5b77 修改 design single功能 2023-09-14 12:58:49 +08:00
shahaibo
dc9957accf TASK:workspace、design模块代码; 2023-09-13 10:35:56 +08:00
shahaibo
a08300f095 Merge remote-tracking branch 'origin/develop' into dev_shb
# Conflicts:
#	src/main/java/com/ai/da/service/impl/DesignServiceImpl.java
2023-09-13 10:34:09 +08:00
shahaibo
7a6d70c2cf TASK:workspace、design模块代码; 2023-09-13 10:19:23 +08:00
shahaibo
03f8f9a6cf TASK:workspace、design模块代码; 2023-09-12 09:51:12 +08:00
xupei
41111bc0e4 修改 获取design detail接口的返回数据格式 2023-09-08 15:54:30 +08:00
xupei
15bbe55182 upload文件 ip地址变更 2023-09-08 13:07:40 +08:00
xupei
2ed7435120 design detail -- bug修改 2023-09-07 17:14:41 +08:00
xupei
3c6ea5523c 测试代码删除 2023-09-07 15:46:01 +08:00
xupei
5d482365cd 测试代码删除 2023-09-07 15:43:50 +08:00
xupei
165449084b 获取design detail 2023-09-07 15:31:52 +08:00
xupei
1201f57291 Merge remote-tracking branch 'origin/dev_shb' into dev-xp
# Conflicts:
#	src/main/java/com/ai/da/python/PythonService.java
#	src/main/java/com/ai/da/service/impl/DesignServiceImpl.java
2023-09-06 15:45:23 +08:00
shahaibo
de0d8bc459 TASK:workspace、design模块代码; 2023-09-06 14:28:20 +08:00
徐佩
90edb573d9 design detail代码转移,临时存储 2023-09-06 13:53:15 +08:00
徐佩
2d924ca1e6 generate功能相关代码优化 2023-08-31 12:59:23 +08:00
徐佩
89b237215a 新增generate like功能,及新增一次上传多张图片功能 2023-08-29 10:33:32 +08:00
徐佩
9f8acf375c 配置文件 python服务ip地址修改 2023-08-21 17:27:45 +08:00
徐佩
349306a1be Merge remote-tracking branch 'origin/develop' into develop 2023-08-18 10:42:37 +08:00
徐佩
b13feb8f1f Sketchboard与Printboard的generate功能 修改 2023-08-18 10:42:08 +08:00
zhouchengrong
457f196c79 新增文件映射 2023-08-17 17:07:39 +08:00
徐佩
c5e5b51852 generateSketch 功能--空指针异常 修改 2023-08-17 16:11:26 +08:00
徐佩
5b41b51859 generateSketch 功能 2023-08-17 11:59:19 +08:00
徐佩
11e9ff4e2c 修改图片储存服务器ip 2023-08-17 10:49:23 +08:00
徐佩
15c787bea1 添加python端调用upload接口的operateType
--添加类型“generateSketch”
2023-08-15 16:24:14 +08:00
zhouchengrong
7dbd9453f8 全局跨域 2023-07-26 17:23:50 +08:00
zhouchengrong
f2cca64353 新增chat robot 模块跨域 2023-07-26 17:04:24 +08:00
zhouchengrong
b6ad019dec chat robot 2023-07-26 14:58:05 +08:00
zhouchengrong
efdaa75be0 chat robot 调试修改 消息响应修改为一秒一条 2023-07-26 10:44:20 +08:00
zhouchengrong
677bd53842 修改docker 配置 解决容器内时区问题 2023-07-26 09:48:59 +08:00
zhouchengrong
751715100f 新增chat Robot 接口服务 2023-07-26 09:44:54 +08:00
zhouchengrong
b0649b4c09 新增chat Robot 接口服务 2023-07-25 19:50:27 +08:00
zhouchengrong
68146d62f4 新增chat Robot 接口服务 2023-07-25 19:17:11 +08:00
zhouchengrong
31c2bb06fc 新增chat Robot 接口服务 2023-07-25 17:57:37 +08:00
zhouchengrong
c6ba7b13c1 更新docker-compose文件 2023-07-21 16:37:56 +08:00
zhouchengrong
01743f4218 更新docker-compose文件 2023-07-21 11:02:59 +08:00
zhouchengrong
4e4623cdda 更新docker-compose文件 2023-07-21 10:27:18 +08:00
zhouchengrong
dcf2f6623b 更新docker-compose文件 2023-07-20 21:21:45 +08:00
zhouchengrong
04f53231c1 更新docker-compose文件 2023-07-20 21:10:55 +08:00
zhouchengrong
68d4bde1b8 更新docker-compose文件 2023-07-20 17:54:45 +08:00
zhouchengrong
9a5eae70ce 新增docker-compose文件 2023-07-20 17:38:02 +08:00
zhouchengrong
3343066daf 修改gitignore文件 2023-07-20 15:56:19 +08:00
zhouchengrong
4f268a2acc 修改gitignore文件 2023-07-20 14:47:35 +08:00
zhouchengrong
c2242ff7fa 新增dockerfile文件 2023-07-20 14:41:21 +08:00
zhouchengrong
60ae1e3849 整合预先登录接口与邮件发送 2023-07-20 14:18:50 +08:00
zhouchengrong
7e9fdca250 commit 2023-07-20 12:01:56 +08:00
547 changed files with 30783 additions and 4671 deletions

View File

@@ -1,111 +0,0 @@
name: 手动 AiDA back-java 开发分支构建部署
on:
workflow_dispatch:
jobs:
build_and_deploy:
runs-on: java21
outputs:
build_status: ${{ job.status }}
build_url: ${{ gitea.server_url }}/${{ gitea.repository.owner.name }}/${{ gitea.repository.name }}/actions/runs/${{ gitea.run_id }}
permissions:
contents: read
packages: write
env:
REMOTE_DEPLOY_PATH: /workspace/workspace_aida/DevelopVersion/develop-MS-version-aida-back
steps:
- name: 0.记录开始时间
id: build_start_time
run: echo "current_time=$(TZ='Asia/Hong_Kong' date '+%Y-%m-%d %H:%M:%S %Z')" >> $GITHUB_OUTPUT
- name: 1.检出代码
uses: actions/checkout@v4
with:
ref: dev/3.1_release_merge_MS
- name: 3.缓存 Maven 依赖
uses: actions/cache@v5
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
restore-keys: |
${{ runner.os }}-maven-
- name: 4.构建项目
run: |
java -version
mvn -v
mvn clean package -DskipTests
- name: 5.生成Dockerfile
run: |
echo "===== 生成Dockerfile ====="
cat > Dockerfile << 'EOF'
FROM openjdk:21-ea-21-jdk-slim
VOLUME /tmp
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' > /etc/timezone
ADD ./target/aida-0.0.1-SNAPSHOT.jar /app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
EOF
echo "Dockerfile内容:"
cat Dockerfile
- name: 6.生成docker-compose.yml
run: |
echo "===== 生成docker-compose.yml ====="
cat > docker-compose.yml << 'EOF'
version: '3'
services:
aida_back:
container_name: develop-aida-ms
build: .
volumes:
# 数据挂载
- ./log:/log
- ./temp:/temp
- ./uploads:/temp/uploads
ports:
- '10092:5567'
restart: always
EOF
# 验证docker-compose.yml生成
echo "docker-compose.yml内容:"
cat docker-compose.yml
- name: 7.上传jar到远程服务器
uses: appleboy/scp-action@master
with:
host: ${{ secrets.SERVER_HOST }}
port: 22
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_KEY }}
source: "target/*.jar,Dockerfile,docker-compose.yml"
target: ${{ env.REMOTE_DEPLOY_PATH }}
preserve_host_directory_structure: false
- name: 8. 重启 Docker 服务
uses: appleboy/ssh-action@master # 👈 专门执行命令的 action
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_KEY }}
key_base64: true
script: |
echo "========= 进入部署目录 ========="
cd ${{ env.REMOTE_DEPLOY_PATH }}
ls -l
echo "========= 停止旧服务 ========="
docker compose down
echo "========= 启动新服务 ========="
docker compose up -d --build
echo "========= 查看运行状态 ========="
docker compose ps

View File

@@ -1,174 +0,0 @@
name: 手动 AiDA back-java 开发分支构建部署
on:
workflow_dispatch:
jobs:
build_and_deploy:
runs-on: ubuntu-latest
outputs:
build_status: ${{ job.status }}
build_url: ${{ gitea.server_url }}/${{ gitea.repository.owner.name }}/${{ gitea.repository.name }}/actions/runs/${{ gitea.run_id }}
permissions:
contents: read
packages: write
env:
REMOTE_DEPLOY_PATH: /mnt/process/A6000_Server/AiDA_Workspace/Java_Server_workspace/Dev/
steps:
- name: 0.记录开始时间
id: build_start_time
run: echo "current_time=$(TZ='Asia/Hong_Kong' date '+%Y-%m-%d %H:%M:%S %Z')" >> $GITHUB_OUTPUT
- name: 1.检出代码
uses: actions/checkout@v4
with:
ref: dev/3.1_release_merge
- name: 2.Set up JDK 21
uses: actions/setup-java@v5
with:
java-version: '21'
distribution: 'temurin'
- name: 3.设置JAVA Maven 环境
run: |
# 适配root/普通用户
SUDO=""
[ "$(id -u)" != "0" ] && SUDO="sudo"
# 安装依赖
$SUDO apt update && $SUDO apt install -y wget tar --no-install-recommends
# 下载Maven
MAVEN_VERSION="3.9.11"
MAVEN_TAR="apache-maven-${MAVEN_VERSION}-bin.tar.gz"
MAVEN_URL="https://archive.apache.org/dist/maven/maven-3/${MAVEN_VERSION}/binaries/${MAVEN_TAR}"
wget --no-verbose -O /tmp/${MAVEN_TAR} ${MAVEN_URL}
# 解压+软链接
$SUDO tar -xzf /tmp/${MAVEN_TAR} -C /usr/local/
$SUDO ln -sf /usr/local/apache-maven-${MAVEN_VERSION} /usr/local/maven
# 配置PATH
echo "/usr/local/maven/bin" >> $GITHUB_PATH
export PATH="/usr/local/maven/bin:$PATH"
# 验证
mvn -v
- name: 4.构建jar包
run: |
echo "===== 开始构建JAR包 ====="
# 新增:打印当前构建分支(两种方式双重确认)
echo "当前工作目录分支:$(git branch --show-current)"
echo "Gitea检出分支:${{ github.ref_name }}"
echo "预期构建分支:dev/3.1_release_merge"
echo "========================"
mvn -B clean install -DskipTests -Pdev 2>&1
# 检查构建是否成功
if [ $? -ne 0 ]; then
echo "JAR包构建失败!"
exit 1
fi
- name: 5.生成Dockerfile
run: |
echo "===== 生成Dockerfile ====="
cat > Dockerfile << 'EOF'
FROM openjdk:21-ea-21-jdk-slim
VOLUME /tmp
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' > /etc/timezone
ADD ./aida-0.0.1-SNAPSHOT.jar /app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
EOF
echo "Dockerfile内容:"
cat Dockerfile
- name: 6.生成docker-compose.yml
run: |
echo "===== 生成docker-compose.yml ====="
cat > docker-compose.yml << 'EOF'
version: '3'
services:
aida_back:
container_name: develop-version-aida-back
build: .
volumes:
# 数据挂载
- ./log:/log
ports:
- '10090:5567'
restart: always
EOF
# 验证docker-compose.yml生成
echo "docker-compose.yml内容:"
cat docker-compose.yml
- name: 7.安装SSH工具
run: |
$SUDO apt install -y sshpass openssh-client --no-install-recommends
# 配置SSH免密
mkdir -p ~/.ssh
echo "${{ secrets.SSH_KEY }}" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan -H ${{ secrets.SERVER_HOST }} >> ~/.ssh/known_hosts
- name: 8.同步文件到远程服务器
run: |
echo "===== 同步文件到远程服务器 ====="
# 使用scp同步文件
scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
./target/*.jar ./Dockerfile ./docker-compose.yml \
${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }}:${{ env.REMOTE_DEPLOY_PATH }} 2>&1
- name: 9.部署和运行服务
run: |
echo "===== 开始部署服务 ====="
# SSH执行部署命令
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }} << 'EOF_SSH'
cd ${{ env.REMOTE_DEPLOY_PATH }}
echo "停止旧容器..."
docker compose down || true
echo "清理Docker资源..."
docker system prune -f
echo "构建镜像..."
docker compose build --no-cache
echo "启动服务..."
docker compose up -d
echo "验证容器状态..."
docker compose ps
echo "部署完成!"
EOF_SSH
- name: 10.发送构建结果邮件
if: always() # 无论上一步是否失败,都执行此步骤
uses: dawidd6/action-send-mail@v3
with:
from: ${{ secrets.MAIL_USERNAME }}
# --- 邮件配置 ---
server_address: smtp.gmail.com # 替换为你的SMTP服务器地址
server_port: 465 # 替换为你的SMTP端口 (通常是465或587)
username: ${{ secrets.MAIL_USERNAME }} # 存储在Secrets中的邮箱用户名
password: ${{ secrets.MAIL_PASSWORD }} # 存储在Secrets中的邮箱密码
subject: 'Gitea Actions 构建通知: ${{ job.status }} - AiDA back-java Develop'
# 收件人列表,可以根据需要更改
to: 'cgzhou@aidlab.hk,zchengrong@yeah.net' # 替换为实际收件人邮箱
# --- 邮件正文内容 ---
body: |
项目: AiDA back-java Develop
分支: dev/3.1_release_merge
🎉 构建结果: ${{ job.status }}
📅 构建时间: ${{ steps.build_start_time.outputs.current_time }}
🔗 构建链接: ${{ gitea.server_url }}/${{ gitea.repository.owner.name }}/${{ gitea.repository.name }}/actions/runs/${{ gitea.run_id }}
# 确保邮件内容为纯文本,或者你可以设置为 html: true 并调整 body
content_type: text/plain

View File

@@ -1,174 +0,0 @@
name: 手动 AiDA back-java 生产分支构建部署
on:
workflow_dispatch:
jobs:
build_and_deploy:
runs-on: ubuntu-latest
outputs:
build_status: ${{ job.status }}
build_url: ${{ gitea.server_url }}/${{ gitea.repository.owner.name }}/${{ gitea.repository.name }}/actions/runs/${{ gitea.run_id }}
permissions:
contents: read
packages: write
env:
REMOTE_DEPLOY_PATH: /workspace/workspace_aida/ProdVersion/prod-version-aida-back
steps:
- name: 0.记录开始时间
id: build_start_time
run: echo "current_time=$(TZ='Asia/Hong_Kong' date '+%Y-%m-%d %H:%M:%S %Z')" >> $GITHUB_OUTPUT
- name: 1.检出代码
uses: actions/checkout@v4
with:
ref: release/3.1
- name: 2.Set up JDK 21
uses: actions/setup-java@v5
with:
java-version: '21'
distribution: 'temurin'
- name: 3.设置JAVA Maven 环境
run: |
# 适配root/普通用户
SUDO=""
[ "$(id -u)" != "0" ] && SUDO="sudo"
# 安装依赖
$SUDO apt update && $SUDO apt install -y wget tar --no-install-recommends
# 下载Maven
MAVEN_VERSION="3.9.11"
MAVEN_TAR="apache-maven-${MAVEN_VERSION}-bin.tar.gz"
MAVEN_URL="https://archive.apache.org/dist/maven/maven-3/${MAVEN_VERSION}/binaries/${MAVEN_TAR}"
wget --no-verbose -O /tmp/${MAVEN_TAR} ${MAVEN_URL}
# 解压+软链接
$SUDO tar -xzf /tmp/${MAVEN_TAR} -C /usr/local/
$SUDO ln -sf /usr/local/apache-maven-${MAVEN_VERSION} /usr/local/maven
# 配置PATH
echo "/usr/local/maven/bin" >> $GITHUB_PATH
export PATH="/usr/local/maven/bin:$PATH"
# 验证
mvn -v
- name: 4.构建jar包
run: |
echo "===== 开始构建JAR包 ====="
# 新增:打印当前构建分支(两种方式双重确认)
echo "当前工作目录分支:$(git branch --show-current)"
echo "Gitea检出分支:${{ github.ref_name }}"
echo "预期构建分支:dev/3.1_release_merge"
echo "========================"
mvn -B clean install -DskipTests -Pdev 2>&1
# 检查构建是否成功
if [ $? -ne 0 ]; then
echo "JAR包构建失败!"
exit 1
fi
- name: 5.生成Dockerfile
run: |
echo "===== 生成Dockerfile ====="
cat > Dockerfile << 'EOF'
FROM openjdk:21-ea-21-jdk-slim
VOLUME /tmp
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' > /etc/timezone
ADD ./aida-0.0.1-SNAPSHOT.jar /app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
EOF
echo "Dockerfile内容:"
cat Dockerfile
- name: 6.生成docker-compose.yml
run: |
echo "===== 生成docker-compose.yml ====="
cat > docker-compose.yml << 'EOF'
version: '3'
services:
aida_back:
container_name: prod-version-aida-back
build: .
volumes:
# 数据挂载
- ./log:/log
- ./temp:/temp
- ./uploads:/temp/uploads
ports:
- '10010:5567'
restart: always
EOF
# 验证docker-compose.yml生成
echo "docker-compose.yml内容:"
cat docker-compose.yml
- name: 7.安装SSH工具
run: |
$SUDO apt install -y sshpass openssh-client --no-install-recommends
# 配置SSH免密
mkdir -p ~/.ssh
echo "${{ secrets.SSH_KEY }}" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan -H ${{ secrets.SERVER_HOST }} >> ~/.ssh/known_hosts
- name: 8.同步文件到远程服务器
run: |
echo "===== 同步文件到远程服务器 ====="
# 使用scp同步文件
scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
./target/*.jar ./Dockerfile ./docker-compose.yml \
${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }}:${{ env.REMOTE_DEPLOY_PATH }} 2>&1
- name: 9.部署和运行服务
run: |
echo "===== 开始部署服务 ====="
# SSH执行部署命令
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }} << 'EOF_SSH'
cd ${{ env.REMOTE_DEPLOY_PATH }}
echo "停止旧容器..."
docker compose down || true
echo "构建镜像..."
docker compose build --no-cache
echo "启动服务..."
docker compose up -d
echo "验证容器状态..."
docker compose ps
echo "部署完成!"
EOF_SSH
- name: 10.发送构建结果邮件
if: always() # 无论上一步是否失败,都执行此步骤
uses: dawidd6/action-send-mail@v3
with:
from: ${{ secrets.MAIL_USERNAME }}
# --- 邮件配置 ---
server_address: smtp.gmail.com # 替换为你的SMTP服务器地址
server_port: 465 # 替换为你的SMTP端口 (通常是465或587)
username: ${{ secrets.MAIL_USERNAME }} # 存储在Secrets中的邮箱用户名
password: ${{ secrets.MAIL_PASSWORD }} # 存储在Secrets中的邮箱密码
subject: 'Gitea Actions 构建通知: ${{ job.status }} - AiDA back-java Develop'
# 收件人列表,可以根据需要更改
to: 'xupei3360@163.com,txli@aidlab.hk,cgzhou@aidlab.hk,zchengrong@yeah.net' # 替换为实际收件人邮箱
# --- 邮件正文内容 ---
body: |
项目: AiDA back-java Prod
分支: release/3.1
🎉 构建结果: ${{ job.status }}
📅 构建时间: ${{ steps.build_start_time.outputs.current_time }}
🔗 构建链接: ${{ gitea.server_url }}/${{ gitea.repository.owner.name }}/${{ gitea.repository.name }}/actions/runs/${{ gitea.run_id }}
# 确保邮件内容为纯文本,或者你可以设置为 html: true 并调整 body
content_type: text/plain

View File

@@ -1,177 +0,0 @@
name: 定时 AiDA back-java 生产分支构建部署
on:
schedule:
# cron为UTC时区构建时间=部署时间-8小时 {*分 (-8)时 *日 *月 *周} ---
# 示例: 1月1日22点22分触发构建 cron写作 - '22 14 1 1 *'
- cron: '00 14 13 3 *'
jobs:
build_and_deploy:
runs-on: ubuntu-latest
outputs:
build_status: ${{ job.status }}
build_url: ${{ gitea.server_url }}/${{ gitea.repository.owner.name }}/${{ gitea.repository.name }}/actions/runs/${{ gitea.run_id }}
permissions:
contents: read
packages: write
env:
REMOTE_DEPLOY_PATH: /workspace/workspace_aida/ProdVersion/prod-version-aida-back
steps:
- name: 0.记录开始时间
id: build_start_time
run: echo "current_time=$(TZ='Asia/Hong_Kong' date '+%Y-%m-%d %H:%M:%S %Z')" >> $GITHUB_OUTPUT
- name: 1.检出代码
uses: actions/checkout@v4
with:
ref: release/3.1
- name: 2.Set up JDK 21
uses: actions/setup-java@v5
with:
java-version: '21'
distribution: 'temurin'
- name: 3.设置JAVA Maven 环境
run: |
# 适配root/普通用户
SUDO=""
[ "$(id -u)" != "0" ] && SUDO="sudo"
# 安装依赖
$SUDO apt update && $SUDO apt install -y wget tar --no-install-recommends
# 下载Maven
MAVEN_VERSION="3.9.11"
MAVEN_TAR="apache-maven-${MAVEN_VERSION}-bin.tar.gz"
MAVEN_URL="https://archive.apache.org/dist/maven/maven-3/${MAVEN_VERSION}/binaries/${MAVEN_TAR}"
wget --no-verbose -O /tmp/${MAVEN_TAR} ${MAVEN_URL}
# 解压+软链接
$SUDO tar -xzf /tmp/${MAVEN_TAR} -C /usr/local/
$SUDO ln -sf /usr/local/apache-maven-${MAVEN_VERSION} /usr/local/maven
# 配置PATH
echo "/usr/local/maven/bin" >> $GITHUB_PATH
export PATH="/usr/local/maven/bin:$PATH"
# 验证
mvn -v
- name: 4.构建jar包
run: |
echo "===== 开始构建JAR包 ====="
# 新增:打印当前构建分支(两种方式双重确认)
echo "当前工作目录分支:$(git branch --show-current)"
echo "Gitea检出分支:${{ github.ref_name }}"
echo "预期构建分支:dev/3.1_release_merge"
echo "========================"
mvn -B clean install -DskipTests -Pdev 2>&1
# 检查构建是否成功
if [ $? -ne 0 ]; then
echo "JAR包构建失败!"
exit 1
fi
- name: 5.生成Dockerfile
run: |
echo "===== 生成Dockerfile ====="
cat > Dockerfile << 'EOF'
FROM openjdk:21-ea-21-jdk-slim
VOLUME /tmp
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' > /etc/timezone
ADD ./aida-0.0.1-SNAPSHOT.jar /app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
EOF
echo "Dockerfile内容:"
cat Dockerfile
- name: 6.生成docker-compose.yml
run: |
echo "===== 生成docker-compose.yml ====="
cat > docker-compose.yml << 'EOF'
version: '3'
services:
aida_back:
container_name: prod-version-aida-back
build: .
volumes:
# 数据挂载
- ./log:/log
ports:
- '10010:5567'
restart: always
EOF
# 验证docker-compose.yml生成
echo "docker-compose.yml内容:"
cat docker-compose.yml
- name: 7.安装SSH工具
run: |
$SUDO apt install -y sshpass openssh-client --no-install-recommends
# 配置SSH免密
mkdir -p ~/.ssh
echo "${{ secrets.SSH_KEY }}" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan -H ${{ secrets.SERVER_HOST }} >> ~/.ssh/known_hosts
- name: 8.同步文件到远程服务器
run: |
echo "===== 同步文件到远程服务器 ====="
# 使用scp同步文件
scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
./target/*.jar ./Dockerfile ./docker-compose.yml \
${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }}:${{ env.REMOTE_DEPLOY_PATH }} 2>&1
- name: 9.部署和运行服务
run: |
echo "===== 开始部署服务 ====="
# SSH执行部署命令
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }} << 'EOF_SSH'
cd ${{ env.REMOTE_DEPLOY_PATH }}
echo "停止旧容器..."
docker compose down || true
echo "清理Docker资源..."
docker system prune -f
echo "构建镜像..."
docker compose build --no-cache
echo "启动服务..."
docker compose up -d
echo "验证容器状态..."
docker compose ps
echo "部署完成!"
EOF_SSH
- name: 10.发送构建结果邮件
if: always() # 无论上一步是否失败,都执行此步骤
uses: dawidd6/action-send-mail@v3
with:
from: ${{ secrets.MAIL_USERNAME }}
# --- 邮件配置 ---
server_address: smtp.gmail.com # 替换为你的SMTP服务器地址
server_port: 465 # 替换为你的SMTP端口 (通常是465或587)
username: ${{ secrets.MAIL_USERNAME }} # 存储在Secrets中的邮箱用户名
password: ${{ secrets.MAIL_PASSWORD }} # 存储在Secrets中的邮箱密码
subject: 'Gitea Actions 构建通知: ${{ job.status }} - AiDA back-java Develop'
# 收件人列表,可以根据需要更改
to: 'xupei3360@163.com,txli@aidlab.hk,cgzhou@aidlab.hk,zchengrong@yeah.net' # 替换为实际收件人邮箱
# --- 邮件正文内容 ---
body: |
项目: AiDA back-java Prod
分支: release/3.1
🎉 构建结果: ${{ job.status }}
📅 构建时间: ${{ steps.build_start_time.outputs.current_time }}
🔗 构建链接: ${{ gitea.server_url }}/${{ gitea.repository.owner.name }}/${{ gitea.repository.name }}/actions/runs/${{ gitea.run_id }}
# 确保邮件内容为纯文本,或者你可以设置为 html: true 并调整 body
content_type: text/plain

View File

@@ -1,176 +0,0 @@
name: 手动 AiDA back-java 开发分支构建部署
on:
workflow_dispatch:
jobs:
build_and_deploy:
runs-on: ubuntu-latest
outputs:
build_status: ${{ job.status }}
build_url: ${{ gitea.server_url }}/${{ gitea.repository.owner.name }}/${{ gitea.repository.name }}/actions/runs/${{ gitea.run_id }}
permissions:
contents: read
packages: write
env:
REMOTE_DEPLOY_PATH: /mnt/process/A6000_Server/AiDA_Workspace/Java_Server_workspace/Dev/
steps:
- name: 0.记录开始时间
id: build_start_time
run: echo "current_time=$(TZ='Asia/Hong_Kong' date '+%Y-%m-%d %H:%M:%S %Z')" >> $GITHUB_OUTPUT
- name: 1.检出代码
uses: actions/checkout@v4
with:
ref: dev/3.1_release_merge
- name: 2.Set up JDK 21
uses: actions/setup-java@v5
with:
java-version: '21'
distribution: 'temurin'
- name: 3.设置JAVA Maven 环境
run: |
# 适配root/普通用户
SUDO=""
[ "$(id -u)" != "0" ] && SUDO="sudo"
# 安装依赖
$SUDO apt update && $SUDO apt install -y wget tar --no-install-recommends
# 下载Maven
MAVEN_VERSION="3.9.11"
MAVEN_TAR="apache-maven-${MAVEN_VERSION}-bin.tar.gz"
MAVEN_URL="https://archive.apache.org/dist/maven/maven-3/${MAVEN_VERSION}/binaries/${MAVEN_TAR}"
wget --no-verbose -O /tmp/${MAVEN_TAR} ${MAVEN_URL}
# 解压+软链接
$SUDO tar -xzf /tmp/${MAVEN_TAR} -C /usr/local/
$SUDO ln -sf /usr/local/apache-maven-${MAVEN_VERSION} /usr/local/maven
# 配置PATH
echo "/usr/local/maven/bin" >> $GITHUB_PATH
export PATH="/usr/local/maven/bin:$PATH"
# 验证
mvn -v
- name: 4.构建jar包
run: |
echo "===== 开始构建JAR包 ====="
# 新增:打印当前构建分支(两种方式双重确认)
echo "当前工作目录分支:$(git branch --show-current)"
echo "Gitea检出分支:${{ github.ref_name }}"
echo "预期构建分支:dev/3.1_release_merge"
echo "========================"
mvn -B clean install -DskipTests -Pdev 2>&1
# 检查构建是否成功
if [ $? -ne 0 ]; then
echo "JAR包构建失败!"
exit 1
fi
- name: 5.生成Dockerfile
run: |
echo "===== 生成Dockerfile ====="
cat > Dockerfile << 'EOF'
FROM openjdk:21-ea-21-jdk-slim
VOLUME /tmp
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' > /etc/timezone
ADD ./aida-0.0.1-SNAPSHOT.jar /app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
EOF
echo "Dockerfile内容:"
cat Dockerfile
- name: 6.生成docker-compose.yml
run: |
echo "===== 生成docker-compose.yml ====="
cat > docker-compose.yml << 'EOF'
version: '3'
services:
aida_back:
container_name: develop-version-aida-back
build: .
volumes:
# 数据挂载
- ./log:/log
ports:
- '1608:5567'
restart: always
EOF
# 验证docker-compose.yml生成
echo "docker-compose.yml内容:"
cat docker-compose.yml
- name: 7.安装SSH工具
run: |
$SUDO apt install -y sshpass openssh-client --no-install-recommends
# 配置SSH免密
mkdir -p ~/.ssh
echo "${{ secrets.SEARCH_SSH_KEY }}" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan -H ${{ secrets.SEARCH_SERVER_HOST }} >> ~/.ssh/known_hosts
- name: 8.同步文件到远程服务器
run: |
echo "===== 同步文件到远程服务器 ====="
# 使用scp同步文件
scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
./target/*.jar ./Dockerfile ./docker-compose.yml \
${{ secrets.SEARCH_SERVER_USER }}@${{ secrets.SEARCH_SERVER_HOST }}:${{ env.REMOTE_DEPLOY_PATH }} 2>&1
- name: 9.部署和运行服务
run: |
echo "===== 开始部署服务 ====="
# SSH执行部署命令
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
${{ secrets.SEARCH_SERVER_USER }}@${{ secrets.SEARCH_SERVER_HOST }} << 'EOF_SSH'
cd ${{ env.REMOTE_DEPLOY_PATH }}
echo "停止旧容器..."
docker compose down || true
echo "清理Docker资源..."
docker system prune -f
echo "构建镜像..."
docker compose build --no-cache
echo "启动服务..."
docker compose up -d
echo "验证容器状态..."
docker compose ps
echo "部署完成!"
EOF_SSH
- name: 10.发送构建结果邮件
if: always() # 无论上一步是否失败,都执行此步骤
uses: dawidd6/action-send-mail@v3
with:
from: ${{ secrets.MAIL_USERNAME }}
# --- 邮件配置 ---
server_address: smtp.gmail.com # 替换为你的SMTP服务器地址
server_port: 465 # 替换为你的SMTP端口 (通常是465或587)
username: ${{ secrets.MAIL_USERNAME }} # 存储在Secrets中的邮箱用户名
password: ${{ secrets.MAIL_PASSWORD }} # 存储在Secrets中的邮箱密码
subject: 'Gitea Actions 构建通知: ${{ job.status }} - AiDA back-java Develop'
# 收件人列表,可以根据需要更改
to: 'cgzhou@aidlab.hk,zchengrong@yeah.net' # 替换为实际收件人邮箱
# --- 邮件正文内容 ---
body: |
项目: AiDA back-java Develop
分支: dev/3.1_release_merge
🎉 构建结果: ${{ job.status }}
📅 构建时间: ${{ steps.build_start_time.outputs.current_time }}
🔗 构建链接: ${{ gitea.server_url }}/${{ gitea.repository.owner.name }}/${{ gitea.repository.name }}/actions/runs/${{ gitea.run_id }}
# 确保邮件内容为纯文本,或者你可以设置为 html: true 并调整 body
content_type: text/plain

48
.gitignore vendored
View File

@@ -1,2 +1,50 @@
sql/*.sql sql/*.sql
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**
!**/src/test/**
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
.log
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
.mvn
mvnw*
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
### VS Code ###
.vscode/
### generated files ###
bin/
gen/
### MAC ###
.DS_Store
### Other ###
logs/
log
temp/
docker-compose.yml

7
Dockerfile Normal file
View File

@@ -0,0 +1,7 @@
FROM openjdk:8
VOLUME /tmp
#时区设置
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' > /etc/timezone
ADD ./target/aida-0.0.1-SNAPSHOT.jar /app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

View File

@@ -1,2 +1,3 @@
# Aida 1.2 # Aida 1.2
Version of aida 1.2 Version of aida 1.3
修改预先登录接口、逻辑

186
aida.iml
View File

@@ -1,192 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4"> <module version="4">
<component name="FacetManager"> <component name="FacetManager">
<facet type="Spring" name="Spring"> <facet type="Spring" name="Spring">
<configuration /> <configuration />
</facet> </facet>
<facet type="web" name="Web">
<configuration>
<webroots />
</configuration>
</facet>
</component>
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" />
<orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" />
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.12.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.12.1" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.29" level="project" />
<orderEntry type="library" name="Maven: jakarta.annotation:jakarta.annotation-api:1.3.5" level="project" />
<orderEntry type="library" name="Maven: org.yaml:snakeyaml:1.25" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.10.1" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.10.1" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.10.1" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:2.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:9.0.29" level="project" />
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:9.0.29" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-web:5.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-beans:5.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-context:5.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-expression:5.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.projectlombok:lombok:1.18.10" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-starter-test:2.2.2.RELEASE" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test:2.2.2.RELEASE" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test-autoconfigure:2.2.2.RELEASE" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: com.jayway.jsonpath:json-path:2.4.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: net.minidev:json-smart:2.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: net.minidev:accessors-smart:1.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.ow2.asm:asm:5.0.4" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.29" level="project" />
<orderEntry type="library" name="Maven: jakarta.xml.bind:jakarta.xml.bind-api:2.3.2" level="project" />
<orderEntry type="library" name="Maven: jakarta.activation:jakarta.activation-api:1.2.1" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter:5.5.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-api:5.5.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.opentest4j:opentest4j:1.2.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.junit.platform:junit-platform-commons:1.5.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-params:5.5.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-engine:5.5.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.junit.vintage:junit-vintage-engine:5.5.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.apiguardian:apiguardian-api:1.1.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.junit.platform:junit-platform-engine:1.5.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.12" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-junit-jupiter:3.1.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.assertj:assertj-core:3.13.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest:2.1" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-core:3.1.0" level="project" />
<orderEntry type="library" name="Maven: net.bytebuddy:byte-buddy:1.10.4" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy-agent:1.10.4" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.objenesis:objenesis:2.6" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.skyscreamer:jsonassert:1.5.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: com.vaadin.external.google:android-json:0.0.20131108.vaadin1" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-core:5.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.2.2.RELEASE" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.springframework:spring-test:5.2.2.RELEASE" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.xmlunit:xmlunit-core:2.6.3" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-data-redis:2.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-redis:2.2.3.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-keyvalue:2.2.3.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-commons:2.2.3.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-tx:5.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-oxm:5.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-context-support:5.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: io.lettuce:lettuce-core:5.2.1.RELEASE" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-common:4.1.43.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-handler:4.1.43.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-buffer:4.1.43.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-codec:4.1.43.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-transport:4.1.43.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-resolver:4.1.43.Final" level="project" />
<orderEntry type="library" name="Maven: io.projectreactor:reactor-core:3.3.1.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.reactivestreams:reactive-streams:1.0.3" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-configuration-processor:2.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-security:2.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-aop:5.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.security:spring-security-config:5.2.1.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.security:spring-security-core:5.2.1.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.security:spring-security-web:5.2.1.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.security:spring-security-jwt:1.1.1.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.bouncycastle:bcpkix-jdk15on:1.64" level="project" />
<orderEntry type="library" name="Maven: org.bouncycastle:bcprov-jdk15on:1.64" level="project" />
<orderEntry type="library" name="Maven: mysql:mysql-connector-java:8.0.18" level="project" />
<orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-boot-starter:3.5.2" level="project" />
<orderEntry type="library" name="Maven: com.baomidou:mybatis-plus:3.5.2" level="project" />
<orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-extension:3.5.2" level="project" />
<orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-core:3.5.2" level="project" />
<orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-annotation:3.5.2" level="project" />
<orderEntry type="library" name="Maven: com.github.jsqlparser:jsqlparser:4.4" level="project" />
<orderEntry type="library" name="Maven: org.mybatis:mybatis:3.5.10" level="project" />
<orderEntry type="library" name="Maven: org.mybatis:mybatis-spring:2.0.7" level="project" />
<orderEntry type="library" name="Maven: org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.61" level="project" />
<orderEntry type="library" name="Maven: org.jetbrains.kotlin:kotlin-stdlib:1.3.61" level="project" />
<orderEntry type="library" name="Maven: org.jetbrains.kotlin:kotlin-stdlib-common:1.3.61" level="project" />
<orderEntry type="library" name="Maven: org.jetbrains:annotations:13.0" level="project" />
<orderEntry type="library" name="Maven: org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.61" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jdbc:2.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: com.zaxxer:HikariCP:3.4.1" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-jdbc:5.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-validation:2.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: jakarta.validation:jakarta.validation-api:2.0.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-el:9.0.29" level="project" />
<orderEntry type="library" name="Maven: org.hibernate.validator:hibernate-validator:6.0.18.Final" level="project" />
<orderEntry type="library" name="Maven: org.jboss.logging:jboss-logging:3.4.1.Final" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml:classmate:1.5.1" level="project" />
<orderEntry type="library" name="Maven: cn.hutool:hutool-all:5.8.2" level="project" />
<orderEntry type="library" name="Maven: com.alibaba:fastjson:2.0.6.graal" level="project" />
<orderEntry type="library" name="Maven: com.alibaba.fastjson2:fastjson2-extension:2.0.6.graal" level="project" />
<orderEntry type="library" name="Maven: com.alibaba.fastjson2:fastjson2:2.0.6.graal" level="project" />
<orderEntry type="library" name="Maven: io.jsonwebtoken:jjwt:0.9.1" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.10.1" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.10.1" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.10.1" level="project" />
<orderEntry type="library" name="Maven: com.squareup.okhttp3:okhttp:3.14.2" level="project" />
<orderEntry type="library" name="Maven: com.squareup.okio:okio:1.17.2" level="project" />
<orderEntry type="library" name="Maven: javax.xml.bind:jaxb-api:2.4.0-b180830.0359" level="project" />
<orderEntry type="library" name="Maven: javax.activation:javax.activation-api:1.2.0" level="project" />
<orderEntry type="library" name="Maven: com.sun.xml.bind:jaxb-impl:4.0.0" level="project" />
<orderEntry type="library" name="Maven: com.sun.xml.bind:jaxb-core:4.0.0" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: org.eclipse.angus:angus-activation:1.0.0" level="project" />
<orderEntry type="library" name="Maven: javax.activation:activation:1.1.1" level="project" />
<orderEntry type="library" name="Maven: com.github.whvcse:easy-captcha:1.6.2" level="project" />
<orderEntry type="library" name="Maven: com.google.guava:guava:31.1-jre" level="project" />
<orderEntry type="library" name="Maven: com.google.guava:failureaccess:1.0.1" level="project" />
<orderEntry type="library" name="Maven: com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava" level="project" />
<orderEntry type="library" name="Maven: com.google.code.findbugs:jsr305:3.0.2" level="project" />
<orderEntry type="library" name="Maven: org.checkerframework:checker-qual:3.12.0" level="project" />
<orderEntry type="library" name="Maven: com.google.errorprone:error_prone_annotations:2.11.0" level="project" />
<orderEntry type="library" name="Maven: com.google.j2objc:j2objc-annotations:1.3" level="project" />
<orderEntry type="library" name="Maven: com.github.xiaoymin:knife4j-spring-boot-starter:3.0.3" level="project" />
<orderEntry type="library" name="Maven: com.github.xiaoymin:knife4j-spring-boot-autoconfigure:3.0.3" level="project" />
<orderEntry type="library" name="Maven: com.github.xiaoymin:knife4j-spring:3.0.3" level="project" />
<orderEntry type="library" name="Maven: com.github.xiaoymin:knife4j-annotations:3.0.3" level="project" />
<orderEntry type="library" name="Maven: io.swagger:swagger-annotations:1.5.22" level="project" />
<orderEntry type="library" name="Maven: io.swagger.core.v3:swagger-annotations:2.1.2" level="project" />
<orderEntry type="library" name="Maven: com.github.xiaoymin:knife4j-core:3.0.3" level="project" />
<orderEntry type="library" name="Maven: org.javassist:javassist:3.25.0-GA" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-swagger2:3.0.0" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-spi:3.0.0" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-schema:3.0.0" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-swagger-common:3.0.0" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-spring-web:3.0.0" level="project" />
<orderEntry type="library" name="Maven: io.github.classgraph:classgraph:4.8.83" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-spring-webflux:3.0.0" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: org.mapstruct:mapstruct:1.3.1.Final" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-spring-webmvc:3.0.0" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-core:3.0.0" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-oas:3.0.0" level="project" />
<orderEntry type="library" name="Maven: io.swagger.core.v3:swagger-models:2.1.2" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-bean-validators:3.0.0" level="project" />
<orderEntry type="library" name="Maven: io.swagger:swagger-models:1.5.22" level="project" />
<orderEntry type="library" name="Maven: io.swagger:swagger-core:1.5.22" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.9" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.10.1" level="project" />
<orderEntry type="library" name="Maven: javax.validation:validation-api:2.0.1.Final" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-boot-starter:3.0.0" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-data-rest:3.0.0" level="project" />
<orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-core:2.0.0.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-metadata:2.0.0.RELEASE" level="project" />
<orderEntry type="library" name="Maven: com.github.xiaoymin:knife4j-spring-ui:3.0.3" level="project" />
<orderEntry type="library" name="Maven: com.tencentcloudapi:tencentcloud-sdk-java-ses:3.1.572" level="project" />
<orderEntry type="library" name="Maven: com.tencentcloudapi:tencentcloud-sdk-java-common:3.1.572" level="project" />
<orderEntry type="library" name="Maven: commons-logging:commons-logging:1.2" level="project" />
<orderEntry type="library" name="Maven: com.squareup.okhttp:okhttp:2.7.5" level="project" />
<orderEntry type="library" name="Maven: com.google.code.gson:gson:2.8.6" level="project" />
<orderEntry type="library" name="Maven: com.squareup.okhttp:logging-interceptor:2.7.5" level="project" />
<orderEntry type="library" name="Maven: org.ini4j:ini4j:0.5.4" level="project" />
</component> </component>
</module> </module>

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

@@ -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-----

164
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>
@@ -76,6 +88,12 @@
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId> <artifactId>spring-boot-starter-validation</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
<dependency> <dependency>
<groupId>cn.hutool</groupId> <groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId> <artifactId>hutool-all</artifactId>
@@ -138,6 +156,126 @@
<artifactId>tencentcloud-sdk-java-ses</artifactId> <artifactId>tencentcloud-sdk-java-ses</artifactId>
<version>3.1.572</version> <version>3.1.572</version>
</dependency> </dependency>
<!--minio-->
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.0.3</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>9.2.1.jre8</version>
</dependency>
<!-- RabbitMQ -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<!-- redis 连接池 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<!--支付宝 SDK-->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.22.57.ALL</version>
</dependency>
<!--PayPal SDK-->
<dependency>
<groupId>com.paypal.sdk</groupId>
<artifactId>checkout-sdk</artifactId>
<version>1.0.5</version>
</dependency>
<dependency>
<groupId>com.paypal.sdk</groupId>
<artifactId>rest-api-sdk</artifactId>
<version>LATEST</version>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20230618</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.17.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.17.1</version>
</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>
</dependencies> </dependencies>
<build> <build>
@@ -157,4 +295,30 @@
</plugins> </plugins>
</build> </build>
<profiles>
<profile>
<!-- 本地开发环境 -->
<id>dev</id>
<properties>
<profiles.active>dev</profiles.active>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<!-- 测试环境 -->
<id>test</id>
<properties>
<profiles.active>test</profiles.active>
</properties>
</profile>
<profile>
<!-- 生产环境 -->
<id>prod</id>
<properties>
<profiles.active>prod</profiles.active>
</properties>
</profile>
</profiles>
</project> </project>

0
run.shell Normal file
View File

View File

@@ -3,9 +3,11 @@ package com.ai.da;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@Slf4j @Slf4j
@SpringBootApplication @SpringBootApplication
@EnableScheduling
public class AiDaApplication { public class AiDaApplication {
public static void main(String[] args) { public static void main(String[] args) {

View File

@@ -0,0 +1,317 @@
package com.ai.da.common.RabbitMQ;
import com.ai.da.common.config.exception.BusinessException;
import com.ai.da.common.constant.CommonConstant;
import com.ai.da.common.utils.RedisUtil;
import com.ai.da.model.dto.GenerateThroughImageTextDTO;
import com.ai.da.model.vo.GenerateResultVO;
import com.ai.da.service.GenerateService;
import com.alibaba.fastjson.JSONObject;
import com.google.gson.Gson;
import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.apache.tomcat.jni.Time;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
@Slf4j
@Component
public class GenerateConsumer {
@Resource
private GenerateService generateService;
@Resource
private RedisUtil redisUtil;
@Value("${redis.key.orderForGenerate}")
private String consumptionOrderKey;
@Value("${redis.key.generateCancelSet}")
private String cancelSetKey;
@Value("${redis.key.generateExceptionMap}")
private String exceptionMapKey;
@Value("${redis.key.generateResult}")
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) {
log.info("============start listening==========");
long start = System.currentTimeMillis();
GenerateThroughImageTextDTO generateThroughImageTextDTO = JSONObject.parseObject(msg.getBody(), GenerateThroughImageTextDTO.class);
String uniqueId = generateThroughImageTextDTO.getUniqueId();
log.info("From " + consumerName + " : " + uniqueId);
try {
// 2、判断当前消息是否在取消列表中
Boolean isMember = redisUtil.isElementExistsInSet(cancelSetKey, uniqueId);
if (isMember) {
try {
// 2.1 手动确认该消息
channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false);
} catch (IOException ex) {
log.error("手动确认,不返回队列重新消费");
}
} else {
generateService.generateThroughImageText(generateThroughImageTextDTO);
// 将消息从redis排队队列中删除,需保证被消费的消息存储到db之后再从redis删除
redisUtil.removeFromZSet(consumptionOrderKey, uniqueId);
}
} catch (Exception e) {
log.error(e.getMessage());
// channel.basicNack() 为不确认deliveryTag对应的消息第二个参数是否应用于多消息第三个参数是否requeue
try {
// 第二个参数是否批量确认消息当传false时只确认当前 deliveryTag对应的消息;当传true时会确认当前及之前所有未确认的消息。
channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false);
// 将消息从redis排队队列中删除,需保证被消费的消息存储到db之后再从redis删除
redisUtil.removeFromZSet(consumptionOrderKey, uniqueId);
String key = generateResultKey + ":" + uniqueId;
GenerateResultVO generateResultVO = new GenerateResultVO(generateThroughImageTextDTO.getUniqueId(), null, null, "Fail");
redisUtil.addToString(key, new Gson().toJson(generateResultVO), CommonConstant.GENERATE_RESULT_EXPIRE_TIME);
} catch (IOException exception) {
log.error("手动确认,取消返回队列,不再重新消费");
}
// 将入参和错误信息存入数据库
String exceptionMessage = JSONObject.toJSONString(generateThroughImageTextDTO) +
" Exception message " + e.getMessage();
HashMap<String, String> exceptionInfo = new HashMap<>();
exceptionInfo.put(String.valueOf(uniqueId), exceptionMessage);
// 存redis
redisUtil.addToMap(exceptionMapKey, exceptionInfo);
}
long end = System.currentTimeMillis();
log.info(" task_id " + uniqueId + "----------" + consumerName + " 执行时长:" + (end - start) + "毫秒");
log.info("=============end listening===========");
}
public void processGenerateResult(Message msg, Channel channel) {
log.info("============ProcessGenerateResult listening==========");
long start = System.currentTimeMillis();
Map<String, String> generateResult = JSONObject.parseObject(msg.getBody(), Map.class);
log.info("generate 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.processGenerateResult(taskId, url, category);
} else {
// 修改redis中的数据状态为exception
String key = generateResultKey + ":" + 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("============ProcessGenerateResult End listening==========");
}
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 = MQConfig.GENERATE_QUEUE)
@RabbitHandler
public void generateConsumer1(Message msg, Channel channel) {
generate(msg, channel, "consumer 1");
}
@RabbitListener(queues = MQConfig.GENERATE_QUEUE)
@RabbitHandler
public void generateConsumer2(Message msg, Channel channel) {
generate(msg, channel, "consumer 2");
}
@RabbitListener(queues = MQConfig.GENERATE_QUEUE)
@RabbitHandler
public void generateConsumer3(Message msg, Channel channel) {
generate(msg, channel, "consumer 3");
}
@RabbitListener(queues = MQConfig.GENERATE_QUEUE)
@RabbitHandler
public void generateConsumer4(Message msg, Channel channel) {
generate(msg, channel, "consumer 4");
}
@RabbitListener(queues = MQConfig.GENERATE_QUEUE)
@RabbitHandler
public void generateConsumer5(Message msg, Channel channel) {
generate(msg, channel, "consumer 5");
}
@RabbitListener(queues = MQConfig.GENERATE_QUEUE)
@RabbitHandler
public void generateConsumer6(Message msg, Channel channel) {
generate(msg, channel, "consumer 6");
}
@RabbitListener(queues = MQConfig.GENERATE_QUEUE)
@RabbitHandler
public void generateConsumer7(Message msg, Channel channel) {
generate(msg, channel, "consumer 7");
}
@RabbitListener(queues = MQConfig.GENERATE_QUEUE)
@RabbitHandler
public void generateConsumer8(Message msg, Channel channel) {
generate(msg, channel, "consumer 8");
}
@RabbitListener(queues = MQConfig.GENERATE_QUEUE)
@RabbitHandler
public void generateConsumer9(Message msg, Channel channel) {
generate(msg, channel, "consumer 9");
}
@RabbitListener(queues = MQConfig.GENERATE_RESULT_QUEUE)
@RabbitHandler
public void getGenerateResult(Message msg, Channel channel) {
processGenerateResult(msg, channel);
}
@RabbitListener(queues = MQConfig.TO_PRODUCT_IMAGE_RESULT_QUEUE)
@RabbitHandler
public void getToProductImageResult(Message msg, Channel channel) {
processToProductImageResult(msg, channel);
}
@RabbitListener(queues = MQConfig.RELIGHT_RESULT_QUEUE)
@RabbitHandler
public void getRelightResult(Message msg, Channel channel) {
processRelightResult(msg, channel);
}
}

View File

@@ -0,0 +1,66 @@
package com.ai.da.common.RabbitMQ;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MQConfig {
public static final String GENERATE_EXCHANGE_FANOUT = "generate-exchange";
// public static final String GENERATE_QUEUE = "generate-queue-prod";
// 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 GENERATE_QUEUE = "generate-queue-prod";
//
// public static final String SR_QUEUE = "SR-queue-local";
// public static final String SR_QUEUE = "SR-queue-dev";
public static final String SR_QUEUE = "SR-queue-prod";
//
// public static final String SR_RESULT_QUEUE = "SuperResolution-local";
// public static final String SR_RESULT_QUEUE = "SuperResolution-dev";
public static final String SR_RESULT_QUEUE = "SuperResolution-prod";
//
// public static final String GENERATE_RESULT_QUEUE = "GenerateImage-local";
public static final String GENERATE_RESULT_QUEUE = "GenerateImage-prod";
public static final String TO_PRODUCT_IMAGE_RESULT_QUEUE = "ToProductImage-prod";
public static final String RELIGHT_RESULT_QUEUE = "Relight-prod";
public MQConfig() {
}
// @Bean
// FanoutExchange fanoutRasaExchange() {
// return new FanoutExchange(GENERATE_EXCHANGE_FANOUT);
// }
/**
* 创建队列,使用工作模式,不用定义交换机
*/
@Bean
public Queue generateQueue() {
return new Queue(GENERATE_QUEUE);
}
@Bean
public Queue SRQueue() {
return new Queue(SR_QUEUE);
}
@Bean
public Queue SRResultQueue() {
return new Queue(SR_RESULT_QUEUE);
}
/**
* 将队列绑定到交换机上【队列订阅交换机】
*/
// @Bean
// Binding bindingExchangeRasa() {
// return BindingBuilder.bind(queueRasa()).to(fanoutRasaExchange());
// }
}

View File

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

View File

@@ -0,0 +1,234 @@
package com.ai.da.common.RabbitMQ;
import com.ai.da.common.config.exception.BusinessException;
import com.ai.da.common.utils.RedisUtil;
import com.ai.da.model.dto.SuperResolutionDTO;
import com.ai.da.model.dto.TaskDTO;
import com.ai.da.service.SuperResolutionService;
import com.ai.da.service.TaskListService;
import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.io.IOException;
import java.lang.reflect.Type;
import java.util.HashMap;
@Slf4j
@Component
public class SRConsumer {
@Resource
private RedisUtil redisUtil;
@Resource
private TaskListService taskListService;
@Value("${redis.key.orderForSR}")
private String consumptionOrderKey;
@Value("${redis.key.SRCancelSet}")
private String cancelSetKey;
@Value("${redis.key.SRExceptionMap}")
private String exceptionMapKey;
@Value("${redis.key.taskList}")
private String taskListKey;
@Resource
private SuperResolutionService superResolutionService;
/**
* 请求超分处理
*/
public void superResolution(Message msg, Channel channel, String consumerName) {
log.info("============SR start listening==========");
long start = System.currentTimeMillis();
SuperResolutionDTO superResolutionDTO;
String uniqueId = null;
try {
superResolutionDTO = JSONObject.parseObject(msg.getBody(), SuperResolutionDTO.class);
uniqueId = superResolutionDTO.getUniqueId();
log.info("From " + consumerName + " : " + uniqueId);
superResolutionService.updateSROutput(uniqueId, "Executing", null);
taskListService.updateTaskStatusOrOutputRedis(uniqueId, "Executing", null);
/*try {
Thread.sleep(2 * 60 * 1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}*/
// 2、判断当前消息是否在取消列表中
Boolean isMember = redisUtil.isElementExistsInSet(cancelSetKey, uniqueId);
if (isMember) {
try {
// 2.1 手动确认该消息
channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false);
} catch (IOException ex) {
log.error("手动确认,不返回队列重新消费");
}
} else {
// 请求python端进行超分
superResolutionService.SR(superResolutionDTO);
}
} catch (BusinessException e) {
log.error(e.getMsg());
superResolutionDTO = JSONObject.parseObject(msg.getBody(), SuperResolutionDTO.class);
// channel.basicNack() 为不确认deliveryTag对应的消息第二个参数是否应用于多消息第三个参数是否requeue
setErrorMessage(msg, channel, e.getMsg(), superResolutionDTO);
try {
// 2.1 手动确认该消息
channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false);
} catch (IOException ex) {
log.error("手动确认,不返回队列重新消费, error message : " + e.getMessage());
}
} catch (JSONException e) {
log.error(e.getMessage());
setErrorMessage(msg, channel, e.getMessage(), null);
try {
// 2.1 手动确认该消息
channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false);
} catch (IOException ex) {
log.error("手动确认,不返回队列重新消费, error message : " + e.getMessage());
}
} catch (Exception e) {
log.error(e.getMessage());
superResolutionDTO = JSONObject.parseObject(msg.getBody(), SuperResolutionDTO.class);
setErrorMessage(msg, channel, e.getMessage(), superResolutionDTO);
try {
// 2.1 手动确认该消息
channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false);
} catch (IOException ex) {
log.error("手动确认,不返回队列重新消费, error message : " + e.getMessage());
}
}
long end = System.currentTimeMillis();
log.info(" task_id " + uniqueId + "----------" + consumerName + " 执行时长:" + (end - start) + "毫秒");
log.info("=============SR end listening===========");
}
/**
* 获取超分结果
*/
public void getSRResult(Message msg, Channel channel, String consumerName) {
log.info("============SRResult start listening==========");
long start = System.currentTimeMillis();
JSONObject result = null;
String taskId = null;
try {
result = JSONObject.parseObject(msg.getBody(), JSONObject.class);
log.info("SR response : {}", result);
taskId = result.get("tasks_id").toString();
} catch (JSONException e) {
log.error("SRResult 返回数据格式不合规范");
log.error(e.getMessage());
setErrorMessage(msg, channel, e.getMessage(), null);
try {
// 第二个参数是否批量确认消息当传false时只确认当前 deliveryTag对应的消息;当传true时会确认当前及之前所有未确认的消息。
channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false);
} catch (IOException exception) {
log.error("手动确认,取消返回队列,不再重新消费");
}
} catch (Exception e){
log.error(e.getMessage());
setErrorMessage(msg, channel, e.getMessage(), null);
try {
// 第二个参数是否批量确认消息当传false时只确认当前 deliveryTag对应的消息;当传true时会确认当前及之前所有未确认的消息。
channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false);
} catch (IOException exception) {
log.error("手动确认,取消返回队列,不再重新消费");
}
}
try {
// 2、判断状态是否成功
if ("SUCCESS".equals(result.get("status").toString())) {
String output = result.get("data").toString();
superResolutionService.setSRResult(taskId, output, "success");
taskListService.updateTaskStatusOrOutputRedis(taskId, "success", output);
} else {
superResolutionService.setSRResult(taskId, null, "fail");
taskListService.updateTaskStatusOrOutputRedis(taskId, "fail", null);
HashMap<String, String> exceptionInfo = new HashMap<>();
// 获取输入信息
String task = redisUtil.getFromString(taskListKey + taskId + taskId.substring(taskId.lastIndexOf("-") + 1));
Gson gson = new Gson();
Type type = new TypeToken<TaskDTO<SuperResolutionDTO>>() {
}.getType();
TaskDTO<SuperResolutionDTO> taskDTO = gson.fromJson(task, type);
// 将输入信息和报错信息均存入redis todo 加判空
exceptionInfo.put(taskId, "Input ==> " + taskDTO.getInputParam() + "Fail Message ==> " + result.get("message").toString());
// 将报错信息存入redis
redisUtil.addToMap(exceptionMapKey, exceptionInfo);
}
} catch (Exception e) {
log.error(e.getMessage());
// channel.basicNack() 为不确认deliveryTag对应的消息第二个参数是否应用于多消息第三个参数是否requeue
try {
// 第二个参数是否批量确认消息当传false时只确认当前 deliveryTag对应的消息;当传true时会确认当前及之前所有未确认的消息。
channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false);
} catch (IOException exception) {
log.error("手动确认,取消返回队列,不再重新消费");
}
}
long end = System.currentTimeMillis();
log.info(" task_id " + taskId + "----------" + consumerName + " 执行时长:" + (end - start) + "毫秒");
log.info("=============SRResult end listening===========");
}
private void setErrorMessage(Message msg, Channel channel, String message, SuperResolutionDTO superResolutionDTO) {
String uniqueId;
try {
// 第二个参数是否批量确认消息当传false时只确认当前 deliveryTag对应的消息;当传true时会确认当前及之前所有未确认的消息。
channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false);
uniqueId = superResolutionDTO.getUniqueId();
// 将消息从redis排队队列中删除,需保证被消费的消息存储到db之后再从redis删除
redisUtil.removeFromZSet(consumptionOrderKey, uniqueId);
} catch (Exception exception) {
log.error("手动确认,取消返回队列,不再重新消费");
throw new BusinessException("发生错误,手动确认消息");
}
// 将入参和错误信息存入redis
String exceptionMessage = JSONObject.toJSONString(superResolutionDTO) +
" Exception message " + message;
// " Exception message " + e.getMessage();
HashMap<String, String> exceptionInfo = new HashMap<>();
uniqueId = superResolutionDTO.getUniqueId();
exceptionInfo.put(String.valueOf(uniqueId), exceptionMessage);
// 存redis
redisUtil.addToMap(exceptionMapKey, exceptionInfo);
taskListService.updateTaskStatusOrOutputRedis(uniqueId, "fail", null);
}
@RabbitListener(queues = MQConfig.SR_QUEUE)
@RabbitHandler
public void SRConsumer1(Message msg, Channel channel) {
superResolution(msg, channel, "consumer 1");
}
@RabbitListener(queues = MQConfig.SR_RESULT_QUEUE)
@RabbitHandler
public void SRResultConsumer1(Message msg, Channel channel) {
getSRResult(msg, channel, "consumer 1");
}
}

View File

@@ -0,0 +1,43 @@
package com.ai.da.common.config;
import com.alipay.api.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import javax.annotation.Resource;
@Configuration
//加载配置文件
@PropertySource("classpath:alipay-sandbox.properties")
public class AlipayClientConfig {
@Resource
private Environment config;
@Bean
public AlipayClient alipayClient() throws AlipayApiException {
AlipayConfig alipayConfig = new AlipayConfig();
//设置网关地址
alipayConfig.setServerUrl(config.getProperty("alipay.gateway-url"));
//设置应用Id
alipayConfig.setAppId(config.getProperty("alipay.app-id"));
//设置应用私钥
alipayConfig.setPrivateKey(config.getProperty("alipay.merchant-private-key"));
//设置请求格式固定值json
alipayConfig.setFormat(AlipayConstants.FORMAT_JSON);
//设置字符集
alipayConfig.setCharset(AlipayConstants.CHARSET_UTF8);
//设置支付宝公钥
alipayConfig.setAlipayPublicKey(config.getProperty("alipay.alipay-public-key"));
//设置签名类型
alipayConfig.setSignType(AlipayConstants.SIGN_TYPE_RSA2);
//构造client
AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig);
return alipayClient;
}
}

View File

@@ -0,0 +1,393 @@
package com.ai.da.common.config;
import com.ai.da.mapper.primary.entity.CustomerData;
import com.ai.da.mapper.primary.entity.TransactionData;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class CRMReportInterface {
// JDBC 驱动器名称以及数据库 URL
static final String JDBC_DRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
static final String DB_URL = "jdbc:sqlserver://118.142.0.178:1550;databaseName=Hayman_prod";
// 数据库凭据
static final String USER = "user01";
static final String PASS = "haySIS-2302";
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
try {
// 注册 JDBC 驱动器
Class.forName(JDBC_DRIVER);
// 打开一个连接
System.out.println("连接数据库...");
conn = DriverManager.getConnection(DB_URL, USER, PASS);
// 执行查询步骤1: 生成 RW0095 报告以获取客户完整数据
System.out.println("执行步骤1生成 RW0095 报告...");
// 执行相应的查询并获取数据
// List<CustomerData> customerData = retrieveCustomerData();
// 执行查询步骤2: 使用 MZG013 报告检查客户的销售历史
System.out.println("执行步骤2使用 MZG013 报告检查客户的销售历史...");
// 执行相应的查询并获取数据
List<TransactionData> transactionData = retrieveTransactionData();
List<String> collect = transactionData.stream().map(TransactionData::getUserMember).collect(Collectors.toList());
List<CustomerData> customerData = retrieveCustomerData(collect);
for (TransactionData transactionDatum : transactionData) {
for (CustomerData customerDatum : customerData) {
if (customerDatum.getMbrCode().equals(transactionDatum.getUserMember())) {
customerDatum.setLastMonth(transactionDatum.getSumAmt());
break;
}
}
}
// 执行步骤3: 合并vlookupRW0095中的客户购买金额
System.out.println("执行步骤3合并客户购买金额...");
// 执行相应的操作如vlookup
// 执行步骤4: 按“发行店”筛选以分离不同文件并逐个发送给店铺
System.out.println("执行步骤4按发行店筛选并发送文件给店铺...");
// 执行相应的操作,如过滤和导出
String filePath = "C:\\Users\\10233\\Desktop\\CRM.csv";
exportToCSV(customerData, filePath);
// 关闭连接
conn.close();
} catch (SQLException se) {
// 处理 JDBC 错误
se.printStackTrace();
} catch (Exception e) {
// 处理 Class.forName 错误
e.printStackTrace();
} finally {
// 关闭资源
try {
if (stmt != null) stmt.close();
} catch (SQLException se2) {
} // 什么都不做
try {
if (conn != null) conn.close();
} catch (SQLException se) {
se.printStackTrace();
}
}
System.out.println("接口执行完成!");
}
private static void exportToCSV(List<CustomerData> customerDataList, String filePath) throws IOException {
FileWriter writer = new FileWriter(filePath);
// // 写入 CSV 文件的第一行,即字段名
// writer.append("User Member,Mbr Name,Sh Code,Sum Amt\n");
//
// // 遍历数据列表,并将每一行数据写入 CSV 文件
// for (TransactionData transaction : transactionDataList) {
// writer.append(transaction.getUserMember()).append(",");
// writer.append(transaction.getMbrName()).append(",");
// writer.append(transaction.getShCode()).append(",");
// writer.append(String.valueOf(transaction.getSumAmt())).append("\n");
// }
writer.append("mbrCode,mbrName,mbrMobile,mbrGroup,mbrStatus,joinDate,mbrIssue,birthMonth,mbrSex,offBonus,effBonus,sumBonus,lastMonth\n");
// 遍历 customerDataList并将数据写入 CSV 文件
for (CustomerData customer : customerDataList) {
writer.append(customer.getMbrCode()).append(",");
writer.append(customer.getMbrName()).append(",");
writer.append(customer.getMbrMobile()).append(",");
writer.append(customer.getMbrGroup()).append(",");
writer.append(customer.getMbrStatus()).append(",");
writer.append(customer.getJoinDate().toString()).append(","); // 日期需要根据实际情况格式化
writer.append(customer.getMbrIssue()).append(",");
writer.append(Integer.toString(customer.getBirthMonth())).append(",");
writer.append(customer.getMbrSex()).append(",");
writer.append(Double.toString(customer.getOffBonus())).append(",");
writer.append(Double.toString(customer.getEffBonus())).append(",");
writer.append(Double.toString(customer.getSumBonus())).append(",");
writer.append(Double.toString(customer.getLastMonth())).append("\n");
}
writer.close();
}
public static List<CustomerData> retrieveCustomerData(List<String> collect) {
List<CustomerData> customerDataList = new ArrayList<>();
Connection conn = null;
Statement stmt = null;
try {
// 注册 JDBC 驱动器
Class.forName(JDBC_DRIVER);
// 打开一个连接
System.out.println("连接数据库...");
conn = DriverManager.getConnection(DB_URL, USER, PASS);
// 执行查询
System.out.println("创建声明...");
stmt = conn.createStatement();
String sql;
// 构建 IN 子句的字符串,用于添加到 SQL 查询中
StringBuilder inClause = new StringBuilder("(");
for (String code : collect) {
inClause.append("'").append(code).append("',");
}
inClause.deleteCharAt(inClause.length() - 1); // 删除最后一个逗号
inClause.append(")");
// 构建完整的 SQL 查询语句
sql = "SELECT * FROM V_RW0095B WHERE mbr_code IN " + inClause.toString();
ResultSet rs = stmt.executeQuery(sql);
// 处理结果集
while (rs.next()) {
// 将每行数据转换为 CustomerData 对象并添加到列表中
CustomerData customer = new CustomerData();
customer.setMbrCode(rs.getString("mbr_code"));
customer.setMbrName(rs.getString("mbr_name"));
customer.setMbrMobile(rs.getString("mbr_mobile"));
customer.setMbrGroup(rs.getString("mbr_group"));
customer.setMbrStatus(rs.getString("mbr_status"));
customer.setJoinDate(rs.getDate("join_date"));
customer.setMbrIssue(rs.getString("mbr_issue"));
customer.setBirthMonth(rs.getInt("birth_m"));
customer.setMbrSex(rs.getString("mbr_sex"));
customer.setOffBonus(rs.getDouble("off_bonus"));
customer.setEffBonus(rs.getDouble("eff_bonus"));
customer.setSumBonus(rs.getDouble("sum_bonus"));
customerDataList.add(customer);
}
// 清理环境
rs.close();
stmt.close();
conn.close();
} catch (SQLException se) {
// 处理 JDBC 错误
se.printStackTrace();
} catch (Exception e) {
// 处理 Class.forName 错误
e.printStackTrace();
} finally {
// 关闭资源
try {
if (stmt != null) stmt.close();
} catch (SQLException se2) {
} // 什么都不做
try {
if (conn != null) conn.close();
} catch (SQLException se) {
se.printStackTrace();
}
}
System.out.println("查询执行完成!");
return customerDataList;
}
public static List<TransactionData> retrieveTransactionData() {
List<TransactionData> transactionDataList = new ArrayList<>();
Connection conn = null;
Statement stmt = null;
try {
// 注册 JDBC 驱动器
Class.forName(JDBC_DRIVER);
// 打开一个连接
System.out.println("连接数据库...");
conn = DriverManager.getConnection(DB_URL, USER, PASS);
// 执行查询
System.out.println("创建声明...");
stmt = conn.createStatement();
String sql;
sql = "SELECT user_member,mbr_name,sum(trx_bas_amt) sumAmtByMebBySh FROM V_MZG013\n" +
"WHERE trx_date >= DATEADD(day, -7, GETDATE())\n" +
"and user_member is not NULL\n" +
"GROUP BY user_member,mbr_name";
ResultSet rs = stmt.executeQuery(sql);
// 处理结果集
while (rs.next()) {
// 将每行数据转换为 TransactionData 对象并添加到列表中
TransactionData transaction = new TransactionData();
transaction.setUserMember(rs.getString("user_member"));
transaction.setMbrName(rs.getString("mbr_name"));
// transaction.setShCode(rs.getString("sh_code"));
transaction.setSumAmt(rs.getDouble("sumAmtByMebBySh"));
// transaction.setTrxNo(rs.getString("trx_no"));
// transaction.setTrxDate(rs.getTimestamp("trx_date"));
// transaction.setTrxType(rs.getString("trx_type"));
// transaction.setTrxStatus(rs.getString("trx_status"));
// transaction.setTrxTotQty(rs.getDouble("trx_tot_qty"));
// transaction.setCurrCode(rs.getString("curr_code"));
// transaction.setExchRate(rs.getDouble("exch_rate"));
// transaction.setDiscountPerc(rs.getDouble("discount_perc"));
// transaction.setTrxAccAmt(rs.getDouble("trx_acc_amt"));
// transaction.setTrxBasAmt(rs.getDouble("trx_bas_amt"));
// transaction.setOutstandAmt(rs.getDouble("outstand_amt"));
// transaction.setReceiveAmt(rs.getDouble("receive_amt"));
// transaction.setChangeAmt(rs.getDouble("change_amt"));
// transaction.setTrxTotBonus(rs.getDouble("trx_tot_bonus"));
// transaction.setDepositNo(rs.getString("deposit_no"));
// transaction.setDepositAmt(rs.getDouble("deposit_amt"));
// transaction.setDepositStatus(rs.getString("deposit_status"));
// transaction.setTrxAmtDesc(rs.getString("trx_amt_desc"));
// transaction.setRemark(rs.getString("remark"));
// transaction.setShCode(rs.getString("sh_code"));
// transaction.setWhCodeFrom(rs.getString("wh_code_from"));
// transaction.setWhCodeTo(rs.getString("wh_code_to"));
// transaction.setIssuedBy(rs.getString("issued_by"));
// transaction.setClientCode(rs.getString("client_code"));
// transaction.setClientName(rs.getString("client_name"));
// transaction.setSalesmanCode(rs.getString("salesman_code"));
// transaction.setCtypeCode(rs.getString("ctype_code"));
// transaction.setUpdatedOn(rs.getTimestamp("updated_on"));
// transaction.setDocType(rs.getString("doc_type"));
// transaction.setRefNo(rs.getString("ref_no"));
// transaction.setAdjType(rs.getString("adj_type"));
// transaction.setRefType(rs.getString("ref_type"));
// transaction.setOrderNo(rs.getString("order_no"));
// transaction.setRecoverF(rs.getString("recover_f"));
// transaction.setRecoverT(rs.getString("recover_t"));
// transaction.setRequestBy(rs.getString("request_by"));
// transaction.setError(rs.getString("error"));
// transaction.setAuthorizedDate(rs.getTimestamp("authorized_date"));
// transaction.setAuthorizedBy(rs.getString("authorized_by"));
// transaction.setChangeCurrCode(rs.getString("change_curr_code"));
// transaction.setChgRate(rs.getDouble("chg_rate"));
// transaction.setCashier(rs.getString("cashier"));
// transaction.setCashiNo(rs.getString("cashi_no"));
// transaction.setSalesmanCode2(rs.getString("salesman_code2"));
// transaction.setClassId(rs.getString("class_id"));
// transaction.setDisAmt(rs.getDouble("dis_amt"));
// transaction.setAcStatus(rs.getString("ac_status"));
// transaction.setReprint(rs.getString("reprint"));
// transaction.setAlt1(rs.getString("alt_1"));
// transaction.setAlt2(rs.getString("alt_2"));
// transaction.setAlt3(rs.getString("alt_3"));
// transaction.setAlt4(rs.getString("alt_4"));
// transaction.setAlt5(rs.getString("alt_5"));
// transaction.setAltD1(rs.getDate("alt_d1"));
// transaction.setAltD2(rs.getDate("alt_d2"));
// transaction.setAltD3(rs.getDate("alt_d3"));
// transaction.setAltD4(rs.getDate("alt_d4"));
// transaction.setAltD5(rs.getDate("alt_d5"));
// transaction.setSalesmanCode3(rs.getString("salesman_code3"));
// transaction.setContractNo(rs.getString("contract_no"));
// transaction.setExpireDate(rs.getTimestamp("expire_date"));
// transaction.setDepositNetAmt(rs.getDouble("deposit_netamt"));
// transaction.setClientRestriction(rs.getString("client_restriction"));
// transaction.setRefStatus(rs.getString("ref_status"));
// transaction.setMbrDis(rs.getDouble("mbr_dis"));
// transaction.setPmtDiscount(rs.getDouble("pmt_discount"));
// transaction.setPmtAmount(rs.getDouble("pmt_amount"));
// transaction.setPmtNo(rs.getString("pmt_no"));
// transaction.setRefCode(rs.getString("ref_code"));
// transaction.setDocApproved(rs.getString("doc_approved"));
// transaction.setRefractionNo(rs.getString("refraction_no"));
// transaction.setCcpTot(rs.getDouble("ccp_tot"));
// transaction.setCcpRed(rs.getDouble("ccp_red"));
// transaction.setCcpExpired(rs.getDouble("ccp_expired"));
// transaction.setPrintedTimes(rs.getInt("printed_times"));
// transaction.setPickupShop(rs.getString("pickup_shop"));
// transaction.setDeliveryDate(rs.getDate("delivery_date"));
// transaction.setDeliveryTime(rs.getString("delivery_time"));
// transaction.setWsCode(rs.getString("ws_code"));
// transaction.setClCode(rs.getString("cl_code"));
// transaction.setClDesc(rs.getString("cl_desc"));
// transaction.setRatio(rs.getString("ratio"));
// transaction.setUserMember(rs.getString("user_member"));
// transaction.setHflag(rs.getString("hflag"));
// transaction.setIssueShop(rs.getString("issue_shop"));
// transaction.setHoUpdBy(rs.getString("ho_upd_by"));
// transaction.setHoUpdOn(rs.getTimestamp("ho_upd_on"));
// transaction.setBonusExpired(rs.getDouble("bonus_expired"));
// transaction.setBonusRed(rs.getDouble("bonus_red"));
// transaction.setConfirmedOn(rs.getTimestamp("confirmed_on"));
// transaction.setConfirmedBy(rs.getString("confirmed_by"));
// transaction.setDocConfirmed(rs.getString("doc_confirmed"));
// transaction.setBrNo(rs.getString("br_no"));
// transaction.setChangeAmt2(rs.getDouble("change_amt2"));
// transaction.setSalesDate(rs.getDate("sales_date"));
// transaction.setMbrName(rs.getString("mbr_name"));
// transaction.setCanEntryDis(rs.getString("can_entry_dis"));
// transaction.setReactiveClient(rs.getString("reactive_client"));
// transaction.setReactiveMbr(rs.getString("reactive_mbr"));
// transaction.setShUpdBy(rs.getString("sh_upd_by"));
// transaction.setShUpdOn(rs.getTimestamp("sh_upd_on"));
// transaction.setTax1(rs.getDouble("tax1"));
// transaction.setTax2(rs.getDouble("tax2"));
// transaction.setTax3(rs.getDouble("tax3"));
// transaction.setTax4(rs.getDouble("tax4"));
// transaction.setTax5(rs.getDouble("tax5"));
// transaction.setAltChar1(rs.getString("alt_char1"));
// transaction.setAltChar2(rs.getString("alt_char2"));
// transaction.setAltChar3(rs.getString("alt_char3"));
// transaction.setAltChar4(rs.getString("alt_char4"));
// transaction.setAltChar5(rs.getString("alt_char5"));
// transaction.setAltNum1(rs.getDouble("alt_num1"));
// transaction.setAltNum2(rs.getDouble("alt_num2"));
// transaction.setAltNum3(rs.getDouble("alt_num3"));
// transaction.setAltNum4(rs.getDouble("alt_num4"));
// transaction.setAltNum5(rs.getDouble("alt_num5"));
// transaction.setNewClient(rs.getString("new_client"));
// transaction.setNewMbr(rs.getString("new_mbr"));
// transaction.setPmtExtraDiscount(rs.getDouble("pmt_extra_discount"));
// transaction.setPmtExtraAmount(rs.getDouble("pmt_extra_amount"));
// transaction.setManualDiscount(rs.getDouble("manual_discount"));
// transaction.setManualAmount(rs.getDouble("manual_amount"));
// transaction.setUsermbrDiscount(rs.getDouble("usermbr_discount"));
// transaction.setClientDiscount(rs.getDouble("client_discount"));
// transaction.setHoldVoid(rs.getString("hold_void"));
// transaction.setPayBasAmt(rs.getDouble("pay_bas_amt"));
// transaction.setPayDesc(rs.getString("pay_desc"));
// transaction.setPayCode(rs.getString("pay_code"));
// transaction.setCardNo(rs.getString("card_no"));
// transaction.setPayCurr(rs.getString("pay_curr"));
// transaction.setPayCurrAmt(rs.getDouble("pay_curr_amt"));
// transaction.setOnbehalfPaid(rs.getString("onbehalf_paid"));
// transaction.setOnbehalfLoc(rs.getString("onbehalf_loc"));
// transaction.setOldCardNo(rs.getString("old_card_no"));
// transaction.setTrxYear(rs.getInt("TRX_YEAR"));
// transaction.setTrxMonth(rs.getInt("TRX_MONTH"));
transactionDataList.add(transaction);
}
// 清理环境
rs.close();
stmt.close();
conn.close();
} catch (SQLException | ClassNotFoundException e) {
// 处理异常
e.printStackTrace();
}
System.out.println("查询执行完成!");
return transactionDataList;
}
// 示例导出数据到CSV文件
private static void exportToCSV(ResultSet resultSet, String filePath) throws SQLException, IOException {
FileWriter writer = new FileWriter(filePath);
while (resultSet.next()) {
// 将结果写入CSV文件
// 这里需要根据实际情况将数据写入CSV文件
}
writer.close();
}
}

View File

@@ -20,25 +20,26 @@ public class FileProperties {
private String linuxDomain; private String linuxDomain;
public ElPath getSys(){ public ElPath getSys() {
String os = System.getProperty("os.name"); String os = System.getProperty("os.name");
if(os.toLowerCase().startsWith("win")) { if (os.toLowerCase().startsWith("win")) {
return windows; return windows;
} else if(os.toLowerCase().startsWith("mac")){ } else if (os.toLowerCase().startsWith("mac")) {
return mac; return mac;
} }
return linux; return linux;
} }
public String getLinuxDomain(){
public String getLinuxDomain() {
String os = System.getProperty("os.name"); String os = System.getProperty("os.name");
if((!os.toLowerCase().startsWith("win") )&& (!os.toLowerCase().startsWith("mac"))) { if ((!os.toLowerCase().startsWith("win")) && (!os.toLowerCase().startsWith("mac"))) {
return linuxDomain; return linuxDomain;
} }
return null; return null;
} }
@Data @Data
public static class ElPath{ public static class ElPath {
private String path; private String path;
} }
} }

View File

@@ -0,0 +1,34 @@
package com.ai.da.common.config;
import io.minio.MinioClient;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
@Data
@Component
public class MinIoClientConfig {
@Value("${minio.endpoint}")
private String endpoint;
@Value("${minio.accessKey}")
private String accessKey;
@Value("${minio.secretKey}")
private String secretKey;
/**
* 注入minio 客户端
*
* @return
*/
@Bean
public MinioClient minioClient() {
return MinioClient.builder()
.endpoint(endpoint)
.credentials(accessKey, secretKey)
.build();
}
}

View File

@@ -0,0 +1,322 @@
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.mapper.primary.*;
import com.ai.da.mapper.primary.entity.*;
import com.ai.da.mapper.secondary.AttributeRetrievalMapper;
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.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
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 MyTaskScheduler {
@PostConstruct
public void test() {
// clearMinio();
// addSystemFileStyle();
}
@Resource
private AccountMapper accountMapper;
@Resource
private TrialOrderMapper trialOrderMapper;
// 定时任务,每十五天执行一次
// @Scheduled(cron = "0 0 0 ? * MON")
@Scheduled(cron = "0 0 0 */15 * ?")
public void checkExpiry() {
// 检测正式用户是否快要过期
QueryWrapper<Account> qw = new QueryWrapper<>();
qw.lambda().eq(Account::getIsTrial, 0);
// qw.lambda().eq(Account::getId, 88);
List<Account> accountList = accountMapper.selectList(qw);
for (Account account : accountList) {
// 用户到期时间戳
Long timestamp = account.getValidEndTime(); // 替换为你的时间戳
if (null == timestamp) {
continue;
}
// 获取当前时间戳
Long currentTimestamp = System.currentTimeMillis();
// 计算时间差(毫秒)
long timeDifference = currentTimestamp - timestamp;
if (timeDifference < 0) {
continue;
}
// 判断是否在30天以内30天的毫秒数
long thirtyDaysInMillis = 30L * 24 * 60 * 60 * 1000;
boolean within30Days = timeDifference <= thirtyDaysInMillis;
if (within30Days) {
// 发邮件
SendEmailUtil.sendWillBeExpiredEmail(account, null);
}
}
}
@Scheduled(cron = "0 0 8 * * ?")
public void sendTrialOrderExcelToManagements() {
// 获取前一天日期
LocalDate yesterday = LocalDate.now().minusDays(1);
// 查询前一天的试用订单
QueryWrapper<TrialOrder> qw = new QueryWrapper<>();
qw.lambda().between(TrialOrder::getCreateTime, yesterday.atStartOfDay(), yesterday.atTime(23, 59, 59));
List<TrialOrder> trialOrders = trialOrderMapper.selectList(qw);
if (!trialOrders.isEmpty()) {
// 创建Excel工作簿
try (Workbook workbook = new XSSFWorkbook()) {
// 创建工作表
Sheet sheet = workbook.createSheet("Trial Orders");
// 创建标题行
Row headerRow = sheet.createRow(0);
headerRow.createCell(0).setCellValue("ID");
headerRow.createCell(1).setCellValue("Title");
headerRow.createCell(2).setCellValue("Surname");
headerRow.createCell(3).setCellValue("Given Name");
headerRow.createCell(4).setCellValue("Username");
headerRow.createCell(5).setCellValue("Email");
headerRow.createCell(6).setCellValue("Country");
headerRow.createCell(7).setCellValue("Occupation");
headerRow.createCell(8).setCellValue("Create Time");
headerRow.createCell(9).setCellValue("Update Time");
headerRow.createCell(10).setCellValue("Status");
// 填充数据
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
int rowNum = 1;
for (TrialOrder trialOrder : trialOrders) {
Row row = sheet.createRow(rowNum++);
row.createCell(0).setCellValue(trialOrder.getId());
row.createCell(1).setCellValue(trialOrder.getTitle());
row.createCell(2).setCellValue(trialOrder.getSurname());
row.createCell(3).setCellValue(trialOrder.getGivenName());
row.createCell(4).setCellValue(trialOrder.getUserName());
row.createCell(5).setCellValue(trialOrder.getEmail());
row.createCell(6).setCellValue(trialOrder.getCountry());
row.createCell(7).setCellValue(trialOrder.getOccupation());
row.createCell(8).setCellValue(trialOrder.getCreateTime().format(formatter));
row.createCell(9).setCellValue(trialOrder.getUpdateTime().format(formatter));
row.createCell(10).setCellValue(trialOrder.getStatus());
}
// 保存Excel文件
String fileName = "trialOrder-" + yesterday.format(DateTimeFormatter.ofPattern("yyyyMMdd")) + ".xlsx";
try (FileOutputStream fileOut = new FileOutputStream(fileName)) {
workbook.write(fileOut);
SendEmailUtil.sendExcelEmail("1023316923@qq.com", null, Files.readAllBytes(Paths.get(fileName)), fileName);
SendEmailUtil.sendExcelEmail("calvinwong@aidlab.hk", null, Files.readAllBytes(Paths.get(fileName)), fileName);
SendEmailUtil.sendExcelEmail("kaicpang.pang@connect.polyu.hk", null, Files.readAllBytes(Paths.get(fileName)), fileName);
SendEmailUtil.sendExcelEmail("kimwong@code-create.com.hk", null, Files.readAllBytes(Paths.get(fileName)), fileName);
}
} catch (IOException e) {
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\\Documents\\WeChat Files\\wxid_h7l9im0r8ql922\\FileStorage\\File\\2024-06\\style\\Blouse style output updated25.6.2024.xlsx",
"C:\\Users\\10233\\Documents\\WeChat Files\\wxid_h7l9im0r8ql922\\FileStorage\\File\\2024-06\\style\\Dress style output updated25.6.2024.xlsx",
"C:\\Users\\10233\\Documents\\WeChat Files\\wxid_h7l9im0r8ql922\\FileStorage\\File\\2024-06\\style\\Outerwear style output.xlsx",
"C:\\Users\\10233\\Documents\\WeChat Files\\wxid_h7l9im0r8ql922\\FileStorage\\File\\2024-06\\style\\Skirt style output .xlsx",
"C:\\Users\\10233\\Documents\\WeChat Files\\wxid_h7l9im0r8ql922\\FileStorage\\File\\2024-06\\style\\Trousers style output.xlsx"
};
for (String filePath : filePaths) {
executorService.submit(() -> processExcelFile(filePath));
}
} finally {
executorService.shutdown();
try {
if (!executorService.awaitTermination(60, TimeUnit.MINUTES)) {
executorService.shutdownNow();
}
} catch (InterruptedException e) {
executorService.shutdownNow();
}
}
}
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 {
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";
}
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/";
}
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

@@ -1,4 +1,4 @@
package com.ai.da.common.config.mybatis.plus; package com.ai.da.common.config;
import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
@@ -8,11 +8,17 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
@Configuration @Configuration
@MapperScan("com.ai.da.mapper")
public class MybatisPlusConfig { public class MybatisPlusConfig {
@Bean @Bean(name = "primaryMybatisPlusInterceptor")
public MybatisPlusInterceptor mybatisPlusInterceptor() { public MybatisPlusInterceptor primaryMybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
@Bean(name = "secondaryMybatisPlusInterceptor")
public MybatisPlusInterceptor secondaryMybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor; return interceptor;

View File

@@ -0,0 +1,46 @@
package com.ai.da.common.config;
import com.paypal.core.PayPalEnvironment;
import com.paypal.core.PayPalHttpClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
@Configuration
@Slf4j
@PropertySource("classpath:payment.properties")
public class PayPalClient {
public PayPalHttpClient client(String mode, String clientId, String clientSecret) {
log.info("mode={}, clientId={}, clientSecret={}", mode, clientId, clientSecret);
PayPalEnvironment environment = mode.equals("live") ? new PayPalEnvironment.Live(clientId, clientSecret) : new PayPalEnvironment.Sandbox(clientId, clientSecret);
return new PayPalHttpClient(environment);
}
/**
* @param jo
* @param pre
* @return
*/
/*public String prettyPrint(JSONObject jo, String pre) {
Iterator<?> keys = jo.keys();
StringBuilder pretty = new StringBuilder();
while (keys.hasNext()) {
String key = (String) keys.next();
pretty.append(String.format("%s%s: ", pre, StringUtils.capitalize(key)));
if (jo.get(key) instanceof JSONObject) {
pretty.append(prettyPrint(jo.getJSONObject(key), pre + "\t"));
} else if (jo.get(key) instanceof JSONArray) {
int sno = 1;
for (Object jsonObject : jo.getJSONArray(key)) {
pretty.append(String.format("\n%s\t%d:\n", pre, sno++));
pretty.append(prettyPrint((JSONObject) jsonObject, pre + "\t\t"));
}
} else {
pretty.append(String.format("%s\n", jo.getString(key)));
}
}
return pretty.toString();
}*/
}

View File

@@ -0,0 +1,63 @@
package com.ai.da.common.config;
import com.baomidou.mybatisplus.autoconfigure.MybatisPlusProperties;
import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import javax.sql.DataSource;
@Configuration
@MapperScan(basePackages = "com.ai.da.mapper.primary", sqlSessionFactoryRef = "primarySqlSessionFactory")
public class PrimaryDataSourceConfig {
@Autowired
private MybatisPlusProperties mybatisPlusProperties;
@Primary
@Bean(name = "primaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.primary")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Primary
@Bean(name = "primarySqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(
@Qualifier("primaryDataSource") DataSource dataSource,
ApplicationContext applicationContext,
@Qualifier("primaryMybatisPlusInterceptor") MybatisPlusInterceptor mybatisPlusInterceptor) throws Exception {
MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(applicationContext.getResources("classpath:mapper/primary/*.xml"));
// 设置 MyBatis Plus 全局配置
GlobalConfig globalConfig = this.mybatisPlusProperties.getGlobalConfig();
if (globalConfig != null) {
bean.setGlobalConfig(globalConfig);
}
bean.setPlugins(mybatisPlusInterceptor);
return bean.getObject();
}
@Primary
@Bean(name = "primarySqlSessionTemplate")
public SqlSessionTemplate sqlSessionTemplate(
@Qualifier("primarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}

View File

@@ -0,0 +1,42 @@
package com.ai.da.common.config;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfig {
@Bean(name = "redisTemplate")
public RedisTemplate<String, Object> getRedisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(factory);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(stringRedisSerializer); // key的序列化类型
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
// 方法过期,改为下面代码
// objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,
ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); // value的序列化类型
redisTemplate.setHashKeySerializer(stringRedisSerializer);
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}

View File

@@ -0,0 +1,49 @@
package com.ai.da.common.config;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
@Configuration
@MapperScan(basePackages = "com.ai.da.mapper.secondary", sqlSessionFactoryRef = "secondarySqlSessionFactory")
public class SecondaryDataSourceConfig {
@Bean(name = "secondaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.secondary")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "secondarySqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(
@Qualifier("secondaryDataSource") DataSource dataSource,
ApplicationContext applicationContext,
@Qualifier("secondaryMybatisPlusInterceptor") MybatisPlusInterceptor mybatisPlusInterceptor) throws Exception {
MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
// SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(applicationContext.getResources("classpath:mapper/secondary/*.xml"));
bean.setPlugins(mybatisPlusInterceptor);
return bean.getObject();
}
@Bean(name = "secondarySqlSessionTemplate")
public SqlSessionTemplate sqlSessionTemplate(
@Qualifier("secondarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}

View File

@@ -5,13 +5,22 @@ import org.hibernate.validator.HibernateValidator;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.validation.beanvalidation.MethodValidationPostProcessor; import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import javax.validation.Validation; import javax.validation.Validation;
import javax.validation.Validator; import javax.validation.Validator;
import javax.validation.ValidatorFactory; import javax.validation.ValidatorFactory;
@Configuration @Configuration
public class WebConfig { public class WebConfig extends WebMvcConfigurerAdapter {
static final String ORIGINS[] = new String[]{"GET", "POST", "PUT", "DELETE"};
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowedOrigins("*").allowCredentials(true).allowedMethods(ORIGINS).maxAge(3600);
}
@Bean @Bean
public Validator validator() { public Validator validator() {

View File

@@ -1,8 +1,19 @@
package com.ai.da.common.config.exception; package com.ai.da.common.config.exception;
import com.ai.da.common.context.UserContext;
import com.ai.da.common.response.ResultEnum; import com.ai.da.common.response.ResultEnum;
import com.ai.da.model.enums.Language;
import com.ai.da.model.vo.AuthPrincipalVo;
import lombok.Data; import lombok.Data;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.Locale;
import java.util.Objects;
import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;
/** /**
* @author: dangweijian * @author: dangweijian
* @description: 业务异常 * @description: 业务异常
@@ -14,15 +25,49 @@ public class BusinessException extends RuntimeException {
private Integer code; private Integer code;
private String msg; private String msg;
public BusinessException(ResultEnum resultEnum){ public BusinessException(ResultEnum resultEnum) {
super(resultEnum.getMsg());
this.code = resultEnum.getCode(); this.code = resultEnum.getCode();
this.msg = resultEnum.getMsg(); this.msg = getMessageFromResource(resultEnum.getMsg(), getUserLocale());
} }
public BusinessException(String msg) { public BusinessException(String msg) {
super(msg);
this.code = ResultEnum.FAIL.getCode(); this.code = ResultEnum.FAIL.getCode();
this.msg = msg; this.msg = getMessageFromResource(msg, getUserLocale());
}
public BusinessException(String msg, Integer code) {
this.code = code;
this.msg = getMessageFromResource(msg, getUserLocale());
}
public BusinessException(Throwable cause) {
this.code = ResultEnum.FAIL.getCode();
this.msg = getMessageFromResource(cause.getMessage(), getUserLocale());
}
private static Locale getUserLocale() {
AuthPrincipalVo userInfo = UserContext.getUserHolder();
if (Objects.isNull(userInfo)) {
return new Locale("en");
}
return new Locale(Language.valueOf(userInfo.getLanguage()).getValue());
}
public static String getMessageFromResource(String msg) {
return getMessageFromResource(msg, getUserLocale());
}
public static String getMessageFromResource(String msg, Locale userLocale) {
try (InputStream inputStream = BusinessException.class.getClassLoader().getResourceAsStream("messages_" + userLocale.getLanguage() + ".properties")) {
if (inputStream != null) {
ResourceBundle bundle = new PropertyResourceBundle(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
if (bundle.containsKey(msg)) {
return bundle.getString(msg);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return msg; // 如果找不到对应的资源文件,返回原始的消息
} }
} }

View File

@@ -51,11 +51,12 @@ public class ExceptionCatch {
return Response.error(resultEnum.getCode(), resultEnum.getMsg()); return Response.error(resultEnum.getCode(), resultEnum.getMsg());
} }
} }
return Response.error(ResultEnum.ERROR.getCode(), e.getMessage()==null?ResultEnum.ERROR.getMsg():e.getMessage()); return Response.error(ResultEnum.ERROR.getCode(), e.getMessage() == null ? ResultEnum.ERROR.getMsg() : e.getMessage());
} }
/** /**
* 处理参数校验异常 * 处理参数校验异常
*
* @param e * @param e
* @return ResponseData * @return ResponseData
*/ */
@@ -63,19 +64,22 @@ public class ExceptionCatch {
@ExceptionHandler(BindException.class) @ExceptionHandler(BindException.class)
public Response<String> bindExceptionHandler(BindException e) { public Response<String> bindExceptionHandler(BindException e) {
log.error("参数错误bind{}", e.getBindingResult().getAllErrors().get(0).getDefaultMessage()); log.error("参数错误bind{}", e.getBindingResult().getAllErrors().get(0).getDefaultMessage());
return Response.fail(ResultEnum.FAIL.getCode(), e.getBindingResult().getAllErrors().get(0).getDefaultMessage()); BusinessException businessException = new BusinessException(e.getBindingResult().getAllErrors().get(0).getDefaultMessage());
return Response.error(businessException.getCode(), businessException.getMsg());
} }
/** /**
* 处理参数校验异常 * 处理参数校验异常
*
* @param e * @param e
* @return ResponseData * @return ResponseData
*/ */
@ResponseBody @ResponseBody
@ExceptionHandler(MethodArgumentNotValidException.class) @ExceptionHandler(MethodArgumentNotValidException.class)
public Response<String> methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) { public Response<String> handleValidationException(MethodArgumentNotValidException e) {
log.error("参数错误bind{}", e.getBindingResult().getAllErrors().get(0).getDefaultMessage()); log.error("参数错误bind{}", e.getBindingResult().getAllErrors().get(0).getDefaultMessage());
return Response.fail(ResultEnum.FAIL.getCode(), e.getBindingResult().getAllErrors().get(0).getDefaultMessage()); BusinessException businessException = new BusinessException(e.getBindingResult().getAllErrors().get(0).getDefaultMessage());
return Response.error(businessException.getCode(), businessException.getMsg());
} }
//初始化,不可预知异常自定义错误编码 //初始化,不可预知异常自定义错误编码

View File

@@ -22,7 +22,7 @@ import java.util.function.Function;
**/ **/
@Data @Data
@Slf4j @Slf4j
public abstract class QueryCriteria<T,E> { public abstract class QueryCriteria<T, E> {
private long page = 1; private long page = 1;
private long limit = 10; private long limit = 10;
@@ -36,12 +36,12 @@ public abstract class QueryCriteria<T,E> {
this.mapper = mapper; this.mapper = mapper;
} }
public QueryWrapper<T> buildWrapper(){ public QueryWrapper<T> buildWrapper() {
QueryWrapper<T> wrapper = new QueryWrapper<>(); QueryWrapper<T> wrapper = new QueryWrapper<>();
Field[] fields = this.getClass().getDeclaredFields(); Field[] fields = this.getClass().getDeclaredFields();
for (Field field : fields) { for (Field field : fields) {
Condition condition = field.getAnnotation(Condition.class); Condition condition = field.getAnnotation(Condition.class);
if(condition != null){ if (condition != null) {
field.setAccessible(true); field.setAccessible(true);
Object value = null; Object value = null;
try { try {
@@ -49,27 +49,27 @@ public abstract class QueryCriteria<T,E> {
} catch (IllegalAccessException e) { } catch (IllegalAccessException e) {
log.warn("reflection anomaly!"); log.warn("reflection anomaly!");
} }
if(!StrUtil.isEmptyIfStr(value)){ if (!StrUtil.isEmptyIfStr(value)) {
switch (condition.type()){ switch (condition.type()) {
case EQ: case EQ:
wrapper.eq(ConvertUtil.humpToLine2(field.getName()), value); wrapper.eq(ConvertUtil.humpToLine2(field.getName()), value);
break; break;
case LIKE: case LIKE:
wrapper.like(ConvertUtil.humpToLine2(field.getName()), value); wrapper.like(ConvertUtil.humpToLine2(field.getName()), value);
case BETWEEN: case BETWEEN:
if(value instanceof Collection && ((List) value).size() >= 2){ if (value instanceof Collection && ((List) value).size() >= 2) {
wrapper.between(ConvertUtil.humpToLine2(field.getName()), ((List)value).get(0), ((List)value).get(1)); wrapper.between(ConvertUtil.humpToLine2(field.getName()), ((List) value).get(0), ((List) value).get(1));
} }
default: default:
} }
}else if(condition.isNull()){ } else if (condition.isNull()) {
wrapper.isNull(ConvertUtil.humpToLine2(field.getName())); wrapper.isNull(ConvertUtil.humpToLine2(field.getName()));
} }
} }
Order order = field.getAnnotation(Order.class); Order order = field.getAnnotation(Order.class);
if(order != null){ if (order != null) {
if(!StrUtil.isEmptyIfStr(order.order())){ if (!StrUtil.isEmptyIfStr(order.order())) {
switch (order.order()){ switch (order.order()) {
case DESC: case DESC:
wrapper.orderByDesc(ConvertUtil.humpToLine2(field.getName())); wrapper.orderByDesc(ConvertUtil.humpToLine2(field.getName()));
break; break;

View File

@@ -16,9 +16,9 @@ public class AidaConfiguration {
@Bean(value = "IntelligentCurtainApis") @Bean(value = "IntelligentCurtainApis")
public Docket gxyd5aThemeApis() { public Docket gxyd5aThemeApis() {
Contact contact = new Contact("Mr.Y","","136"); Contact contact = new Contact("Mr.Y", "", "136");
Docket docket=new Docket(DocumentationType.SWAGGER_2) Docket docket = new Docket(DocumentationType.SWAGGER_2)
.apiInfo(new ApiInfoBuilder() .apiInfo(new ApiInfoBuilder()
.description("aida接口文档") .description("aida接口文档")
.contact(contact) .contact(contact)

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

@@ -0,0 +1,36 @@
package com.ai.da.common.constant;
public class CommonConstant {
// 单位 秒 10分钟过期
// public static final Long TASK_EXPIRE_TIME = 24 * 60 * 60L;
public static final Long TASK_EXPIRE_TIME = 10 * 60L;
// 单位 秒 两天过期
public static final Long CREDITS_EXPIRE_TIME = 2 * 24 * 60 * 60L;
// 单位 分钟
public static final Integer MINIO_IMAGE_EXPIRE_TIME = 24 * 60;
// 单位 秒 一天过期 in redis
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";
}

View File

@@ -0,0 +1,173 @@
package com.ai.da.common.constant;
public class PayPalCheckoutConstant {
public static final String CAPTURE = "CAPTURE";
/**
* 该标签将覆盖PayPal网站上PayPal帐户中的公司名称
*/
public static final String BRANDNAME = "AIDA";
/**
* LOGIN。当客户单击PayPal Checkout时客户将被重定向到页面以登录PayPal并批准付款。
* BILLING。当客户单击PayPal Checkout时客户将被重定向到一个页面以输入信用卡或借记卡以及完成购买所需的其他相关账单信息
* NO_PREFERENCE。当客户单击“ PayPal Checkout”时将根据其先前的交互方式将其重定向到页面以登录PayPal并批准付款或重定向至页面以输入信用卡或借记卡以及完成购买所需的其他相关账单信息使用PayPal。
* 默认值NO_PREFERENCE
*/
public static final String LANDINGPAGE = "NO_PREFERENCE";
/**
* CONTINUE。将客户重定向到PayPal付款页面后将出现“ 继续”按钮。当结帐流程启动时最终金额未知时,请使用此选项,并且您想将客户重定向到商家页面而不处理付款。
* PAY_NOW。将客户重定向到PayPal付款页面后出现“ 立即付款”按钮。当启动结帐时知道最终金额并且您要在客户单击“ 立即付款”时立即处理付款时,请使用此选项。
*/
public static final String USERACTION = "PAY_NOW";
/**
* GET_FROM_FILE。使用贝宝网站上客户提供的送货地址。
* NO_SHIPPING。从PayPal网站编辑送货地址。推荐用于数字商品
* SET_PROVIDED_ADDRESS。使用商家提供的地址。客户无法在PayPal网站上更改此地址
*/
// public static final String SHIPPINGPREFERENCE = "SET_PROVIDED_ADDRESS";
public static final String SHIPPINGPREFERENCE = "NO_SHIPPING";
/**
* 交易异常
*/
public static final String FAILURE = "failure";
/**
* 交易成功
*/
public static final String SUCCESS = "success";
/**
* ipn回调。支付成功
*/
public static final String PAYMENT_STATUS_COMPLETED = "Completed";
/**
* ipn回调。退款成功
*/
public static final String PAYMENT_STATUS_REFUNDED = "Refunded";
/**
* ipn回调。待定
*/
public static final String PAYMENT_STATUS_PENDING = "Pending";
/**
* ipn回调付款因退款或其他类型的冲销而被冲销。资金已从您的帐户余额中删除并退还给买方
*/
public static final String PAYMENT_STATUS_REVERSED = "Reversed";
/**
* ipn回调, 撤销已被取消。例如,您赢得了与客户的纠纷,并且撤回的交易资金已退还给您
*/
public static final String PAYMENT_STATUS_CANCELED_REVERSAL = "Canceled_Reversal";
/**
* ipn回调付款被拒绝
*/
public static final String PAYMENT_STATUS_DENIED = "Denied";
/**
* ipn回调 此授权已过期,无法捕获
*/
public static final String PAYMENT_STATUS_EXPIRED = "Expired";
/**
* ipn回调 德国的ELV付款是通过Express Checkout进行的
*/
public static final String PAYMENT_STATUS_CREATED = "Created";
/**
* ipn回调 付款失败。仅当付款是通过您客户的银行帐户进行的。
*/
public static final String PAYMENT_STATUS_FAILED = "Failed";
/**
* ipn回调付款已被接受
*/
public static final String PAYMENT_STATUS_PROCESSED = "Processed";
/**
* ipn回调此授权已失效
*/
public static final String PAYMENT_STATUS_VOIDED = "Voided";
//订单状态
/**
* 1、支付完成;捕获的付款的资金已记入收款人的PayPal帐户
* 2、退款完成;该交易的资金已记入客户的帐户
*/
public static final String STATE_COMPLETED = "COMPLETED";
/**
* 部分退款;少于所捕获付款金额的金额已部分退还给付款人。
*/
public static final String STATE_PARTIALLY_REFUNDED = "PARTIALLY_REFUNDED";
/**
* 1、支付待定;捕获的付款资金尚未记入收款人的PayPal帐户。有关更多信息请参见status.details。
* 2、退款待定;有关更多信息请参见status_details.reason。
*/
/**
* 支付待定:
* capture_status_details
* reason 枚举
* 捕获的付款状态为PENDING或DENIED的原因。可能的值为
* BUYER_COMPLAINT。付款人与贝宝PayPal对此捕获的付款提出了争议。
* CHARGEBACK。响应于付款人与用于支付此已捕获付款的金融工具的发行人对此已捕获的付款提出异议已收回的资金被撤回。
* ECHECK。由尚未结清的电子支票支付的付款人。
* INTERNATIONAL_WITHDRAWAL。访问您的在线帐户。在您的“帐户概览”中接受并拒绝此笔付款。
* OTHER。无法提供其他特定原因。有关此笔付款的更多信息请在线访问您的帐户或联系PayPal。
* PENDING_REVIEW。捕获的付款正在等待人工审核。
*手动收取RECEIVING_PREFERENCE_MANDATES_MANUAL_ACTION。收款人尚未为其帐户设置适当的接收首选项。有关如何接受或拒绝此付款的更多信息请在线访问您的帐户。通常在某些情况下提供此原因例如当所捕获付款的货币与收款人的主要持有货币不同时。
* REFUNDED。收回的资金已退还。
* TRANSACTION_APPROVED_AWAITING_FUNDING。付款人必须将这笔付款的资金汇出。通常此代码适用于手动EFT。
* UNILATERAL。收款人没有PayPal帐户。
* VERIFICATION_REQUIRED。收款人的PayPal帐户未通过验证。
*/
/**
* 退款待定
* 退款具有“PENDING”或“FAILED”状态的原因。 可能的值为:
* ECHECK。客户的帐户通过尚未结清的eCheck进行注资。
*/
public static final String STATE_PENDING = "PENDING";
/**
* 退款;大于或等于此捕获的付款金额的金额已退还给付款人
*/
public static final String STATE_REFUNDED = "REFUNDED";
/**
* 支付拒绝
*/
public static final String STATE_DENIED = "DENIED";
/**
* 退款失败
*/
public static final String STATE_FAILED = "FAILED";
/**
* 争议状态
*/
public static final String BUYER_COMPLAINT = "BUYER_COMPLAINT";
/**
* 沙箱环境请求网关地址
*/
public static final String SANDBOX = "https://api.sandbox.paypal.com";
/**
* 生产环境请求网关地址
*/
public static final String LIVE = "https://api.paypal.com";
/**
* 添加物流信息请求路径
*/
public static final String ADD_TRACK_URL = "/v1/shipping/trackers-batch";
/**
* 修改物流信息请求路径
*/
public static final String UPDATE_TRACK_URL = "/v1/shipping/trackers/";
public final static String CMD_NOTIFY_VALIDATE = "_notify-validate";
public final static String PAYPAL_TOKEN_KEY = "PayPalAccessToken";
}

View File

@@ -3,11 +3,12 @@ package com.ai.da.common.context;
import com.ai.da.model.vo.AuthPrincipalVo; import com.ai.da.model.vo.AuthPrincipalVo;
public class UserContext { public class UserContext {
private static ThreadLocal<AuthPrincipalVo> userHolder= new ThreadLocal<AuthPrincipalVo>(); private static ThreadLocal<AuthPrincipalVo> userHolder = new ThreadLocal<AuthPrincipalVo>();
public static AuthPrincipalVo getUserHolder() { public static AuthPrincipalVo getUserHolder() {
return userHolder.get(); return userHolder.get();
} }
public static void delete() { public static void delete() {
userHolder.remove(); userHolder.remove();
} }

View File

@@ -0,0 +1,39 @@
package com.ai.da.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@AllArgsConstructor
@Getter
public enum AliPayTradeStateEnum {
/**
* 支付成功
*/
SUCCESS("TRADE_SUCCESS"),
/**
* 未支付
*/
NOTPAY("WAIT_BUYER_PAY"),
/**
* 已关闭
*/
CLOSED("TRADE_CLOSED"),
/**
* 退款成功
*/
REFUND_SUCCESS("REFUND_SUCCESS"),
/**
* 退款失败
*/
REFUND_ERROR("REFUND_ERROR");
/**
* 类型
*/
private final String type;
}

View File

@@ -7,9 +7,9 @@ import java.util.stream.Stream;
* @description: 操作类型 登入 忘记密码 * @description: 操作类型 登入 忘记密码
* @create: 2022-8-10 17:33 * @create: 2022-8-10 17:33
**/ **/
public enum OperationTypeEnum { public enum AuthenticationOperationTypeEnum {
/** /**
*登入 * 登入
*/ */
LOGIN, LOGIN,
/** /**
@@ -25,7 +25,7 @@ public enum OperationTypeEnum {
*/ */
FORGET_PWD; FORGET_PWD;
public static OperationTypeEnum of(String name){ public static AuthenticationOperationTypeEnum of(String name) {
return Stream.of(OperationTypeEnum.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

@@ -39,8 +39,8 @@ public enum CollectionLevel1TypeEnum {
return realName; return realName;
} }
public static CollectionLevel1TypeEnum uploadOf(String realName){ public static CollectionLevel1TypeEnum uploadOf(String realName) {
return Stream.of(CollectionLevel1TypeEnum.values()) return Stream.of(CollectionLevel1TypeEnum.values())
.filter(v ->v.getRealName().equals(realName)).findFirst().orElse(null); .filter(v -> v.getRealName().equals(realName)).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;
/** /**
@@ -27,7 +29,27 @@ public enum CollectionLevel2TypeEnum {
/** /**
* 裤子 * 裤子
*/ */
TROUSERS("Trousers"); TROUSERS("Trousers"),
/**
* 男装上装
*/
TOPS("Tops"),
/**
* 男装下装
*/
BOTTOMS("Bottoms"),
/**
* 印花-logo
*/
LOGO("Logo"),
/**
* 印花-slogan
*/
SLOGAN("Slogan"),
/**
* 印花-图案
*/
Pattern("Pattern");
private String realName; private String realName;
@@ -42,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

@@ -6,5 +6,5 @@ package com.ai.da.common.enums;
* @create: 2020-01-14 17:33 * @create: 2020-01-14 17:33
**/ **/
public enum ConditionType { public enum ConditionType {
EQ,LIKE,BETWEEN; EQ, LIKE, BETWEEN;
} }

View File

@@ -0,0 +1,43 @@
package com.ai.da.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@AllArgsConstructor
@Getter
public enum CreditsEventsEnum {
PRICE("price","6"),
// PRICE("price","0.1"),
BUY_CREDITS("Buy Credits","60"),
REFUND("Refund","60"),
// BUY_CREDITS("Buy Credits","10"),
// 每月更新
INIT_YEARLY("init_yearly", "6000"),
INIT_MONTHLY("init_monthly", "5000"),
INIT_TRIAL("init_trial", "100"),
INIT_WEEKLY("init_weekly","6000"),
// 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"),
OTHER("Other","5");
private String name;
/**
* 对应事件需要消耗or获得的积分
*/
private String value;
}

View File

@@ -0,0 +1,40 @@
package com.ai.da.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
public enum CurrencyCodesEnum {
AUSTRALIAN_DOLLAR("AUD"),
BRAZILIAN_REAL("BRL"),
CANADIAN_DOLLAR("CAD"),
CHINESE_RENMENBI("CNY"),
CZECH_KORUNA("CZK"),
DANISH_KRONE("DKK"),
EURO("EUR"),
HONG_KONG_DOLLAR("HKD"),
HUNGARIAN_FORINT("HUF"),
ISRAELI_NEW_SHEKEL("ILS"),
JAPANESE_YEN("JPY"),
MALAYSIAN_RINGGIT("MYR"),
MEXICAN_PESO("MXN"),
NEW_TAIWAN_DOLLAR("TWD"),
NEW_ZEALAND_DOLLAR("NZD"),
NORWEGIAN_KRONE("NOK"),
PHILIPPINE_PESO("PHP"),
POLISH_ZLOTY("PLN"),
POUND_STERLING("GBP"),
RUSSIAN_RUBLE("RUB"),
SINGAPORE_DOLLAR("SGD"),
SWEDISH_KRONA("SEK"),
SWISS_FRANC("CHF"),
THAI_BAHT("THB"),
UNITED_STATES_DOLLAR("USD");
private String code;
CurrencyCodesEnum(String code) {
this.code = code;
}
}

View File

@@ -16,19 +16,19 @@ public enum CurrentDesignPictureTypeEnum {
/** /**
* PIN * PIN
*/ */
PIN(1,"PIN"), PIN(1, "PIN"),
/** /**
* USER_LIBRARY * USER_LIBRARY
*/ */
USER_LIBRARY(2,"userLibrary"), // USER_LIBRARY(2, "userLibrary"),
/** /**
* SYS_FILE * SYS_FILE
*/ */
SYS_FILE(3,"sysFile"), SYS_FILE(2, "sysFile"),
/** /**
* noPIN * noPIN
*/ */
NO_PIN(4,"noPIN"); NO_PIN(3, "noPIN");
private Integer code; private Integer code;
private String desc; private String desc;
@@ -38,10 +38,11 @@ public enum CurrentDesignPictureTypeEnum {
this.desc = desc; this.desc = desc;
} }
public static CurrentDesignPictureTypeEnum of(String name){ public static CurrentDesignPictureTypeEnum of(String name) {
return Stream.of(CurrentDesignPictureTypeEnum.values()).filter(v ->v.name().equals(name)).findFirst().orElse(null); return Stream.of(CurrentDesignPictureTypeEnum.values()).filter(v -> v.name().equals(name)).findFirst().orElse(null);
} }
public static List<CurrentDesignPictureTypeEnum> ofList(List<Integer> codes){
return Stream.of(CurrentDesignPictureTypeEnum.values()).filter(v ->codes.contains(v.code)).collect(Collectors.toList()); public static List<CurrentDesignPictureTypeEnum> ofList(List<Integer> codes) {
return Stream.of(CurrentDesignPictureTypeEnum.values()).filter(v -> codes.contains(v.code)).collect(Collectors.toList());
} }
} }

View File

@@ -16,15 +16,15 @@ public enum CurrentDesignPrintPictureTypeEnum {
/** /**
* 空白 * 空白
*/ */
NO(1,"空白"), NO(1, "空白"),
/** /**
* PIN * PIN
*/ */
PIN(2,"PIN"), PIN(2, "PIN"),
/** /**
* noPIN * noPIN
*/ */
NO_PIN(3,"noPIN"); NO_PIN(3, "noPIN");
private Integer code; private Integer code;
private String desc; private String desc;
@@ -33,7 +33,8 @@ public enum CurrentDesignPrintPictureTypeEnum {
this.code = code; this.code = code;
this.desc = desc; this.desc = desc;
} }
public static List<CurrentDesignPrintPictureTypeEnum> ofList(List<Integer> codes){
return Stream.of(CurrentDesignPrintPictureTypeEnum.values()).filter(v ->codes.contains(v.code)).collect(Collectors.toList()); public static List<CurrentDesignPrintPictureTypeEnum> ofList(List<Integer> codes) {
return Stream.of(CurrentDesignPrintPictureTypeEnum.values()).filter(v -> codes.contains(v.code)).collect(Collectors.toList());
} }
} }

View File

@@ -15,7 +15,8 @@ public enum DesignTypeEnum {
/** /**
* Library * Library
*/ */
LIBRARY("Library"); LIBRARY("Library"),
GENERATE("Generate");
private String realName; private String realName;

View File

@@ -0,0 +1,45 @@
package com.ai.da.common.enums;
import lombok.Getter;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@Getter
public enum GenerateModeEnum {
/**
* 通过文本生成
*/
TEXT(1, "text","txt2img"),
/**
* 通过图片生成
*/
IMAGE(2, "image", "img2img"),
/**
* 通过文本和图片生成
*/
TEXT_IMAGE(2, "text-image","img2img");
private Integer code;
private String value;
private String type;
GenerateModeEnum(int code, String value) {
this.code = code;
this.value = value;
}
GenerateModeEnum(Integer code, String value, String type) {
this.code = code;
this.value = value;
this.type = type;
}
public static List<String> getGenerateModeList(){
return Stream.of(TEXT,IMAGE,TEXT_IMAGE).map(GenerateModeEnum::getValue).collect(Collectors.toList());
}
}

View File

@@ -0,0 +1,56 @@
package com.ai.da.common.enums;
import lombok.Getter;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
public enum LayersPriorityEnum {
EARRING_FRONT("earring_front","Earring",99),
BAG_FRONT("bag_front","Bag",98),
HAIRSTYLE_FRONT("hairstyle_front","Hairstyle",97),
OUTWEAR_FRONT("outwear_front","Outwear",20),
TOPS_FRONT("tops_front","Tops",19),
DRESS_FRONT("dress_front","Dress",18),
BLOUSE_FRONT("blouse_front","Blouse",17),
SKIRT_FRONT("skirt_front","Skirt",16),
TROUSERS_FRONT("trousers_front","Trousers",15),
BOTTOMS_FRONT("bottoms_front","Bottoms",14),
SHOES_RIGHT("shoes_right","Shoes",1),
SHOES_LEFT("shoes_left","Shoes",1),
BODY("body","Body",0),
BOTTOMS_BACK("bottoms_back","Bottoms",-14),
TROUSERS_BACK("trousers_back","Trousers",-15),
SKIRT_BACK("skirt_back","Skirt",-16),
BLOUSE_BACK("blouse_back","Blouse",-17),
DRESS_BACK("dress_back","Dress",-18),
TOPS_BACK("tops_back","Tops",-19),
OUTWEAR_BACK("outwear_back","Outwear",-20),
HAIRSTYLE_BACK("hairstyle_back","Hairstyle",-97),
BAG_BACK("bag_back","Bag",-98),
EARRING_BACK("earring_back","Earring",-99);
@Getter
private String realName;
@Getter
private String type;
@Getter
private Integer value;
LayersPriorityEnum(String realName, String type,Integer value) {
this.realName = realName;
this.type = type;
this.value = value;
}
public static LayersPriorityEnum getValueByType(String type){
return Stream.of(LayersPriorityEnum.values()).filter(l -> l.getType().equals(type)).findFirst().orElse(null);
}
public static LayersPriorityEnum getValueByLayerCategory(String layerCategory){
return Stream.of(LayersPriorityEnum.values()).filter(l -> l.getRealName().equals(layerCategory)).findFirst().orElse(null);
}
}

View File

@@ -27,7 +27,8 @@ public enum LibraryLevel1TypeEnum {
/** /**
* 模特 * 模特
*/ */
MODELS("Models"); MODELS("Models"),
DESIGN_ELEMENTS("DesignElements");
private String realName; private String realName;
@@ -39,8 +40,8 @@ public enum LibraryLevel1TypeEnum {
return realName; return realName;
} }
public static LibraryLevel1TypeEnum uploadOf(String realName){ public static LibraryLevel1TypeEnum uploadOf(String realName) {
return Stream.of(LibraryLevel1TypeEnum.values()) return Stream.of(LibraryLevel1TypeEnum.values())
.filter(v ->v.getRealName().equals(realName)).findFirst().orElse(null); .filter(v -> v.getRealName().equals(realName)).findFirst().orElse(null);
} }
} }

View File

@@ -30,9 +30,10 @@ public enum LibraryTopTypeEnum {
public String getRealName() { public String getRealName() {
return realName; return realName;
} }
public static LibraryTopTypeEnum uploadOf(String realName){
public static LibraryTopTypeEnum uploadOf(String realName) {
return Stream.of(LibraryTopTypeEnum.values()) return Stream.of(LibraryTopTypeEnum.values())
.filter(v ->v.getRealName().equals(realName)).findFirst().orElse(null); .filter(v -> v.getRealName().equals(realName)).findFirst().orElse(null);
} }
} }

View File

@@ -17,7 +17,7 @@ public enum LoginTypeEnum {
*/ */
PASSWORD; PASSWORD;
public static LoginTypeEnum of(String name){ public static LoginTypeEnum of(String name) {
return Stream.of(LoginTypeEnum.values()).filter(v ->v.name().equals(name)).findFirst().orElse(null); return Stream.of(LoginTypeEnum.values()).filter(v -> v.name().equals(name)).findFirst().orElse(null);
} }
} }

View File

@@ -0,0 +1,22 @@
package com.ai.da.common.enums;
import lombok.Getter;
@Getter
public enum ModelNameEnum {
/**
* 使用模型0
*/
MODEL_0("0", "model_0");
private String code;
private String modelName;
ModelNameEnum(String code, String modelName) {
this.code = code;
this.modelName = modelName;
}
}

View File

@@ -0,0 +1,54 @@
package com.ai.da.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@AllArgsConstructor
@Getter
public enum OrderStatusEnum {
/**
* 未支付
*/
NOT_PAY("未支付"),
/**
* 支付成功
*/
SUCCESS("支付成功"),
/**
* 已关闭
*/
TIMEOUT_CLOSED("超时已关闭"),
/**
* 已取消
*/
CANCEL("用户已取消"),
/**
* 退款中
*/
REFUND_PROCESSING("退款中"),
/**
* 已退款
*/
REFUND_SUCCESS("已退款"),
/**
* 退款异常
*/
REFUND_ABNORMAL("退款异常"),
/**
* paypal订单状态为 APPROVED
*/
ORDER_PROCESSING("订单处理中");
/**
* 类型
*/
private final String type;
}

View File

@@ -6,5 +6,5 @@ package com.ai.da.common.enums;
* @create: 2020-01-14 17:33 * @create: 2020-01-14 17:33
**/ **/
public enum OrderType { public enum OrderType {
DESC,ASC; DESC, ASC;
} }

View File

@@ -0,0 +1,30 @@
package com.ai.da.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum PayPalOrderStatusEnum {
// The order was created with the specified context.
// 订单已创建并具有指定的上下文。
CREATED("CREATED"),
// The order was saved and persisted. The order status continues to be in progress until a capture is made with final_capture = true for all purchase units within the order.
// 订单已保存并持久化。订单状态仍处于进行中,直到对订单中的所有购买单元进行了 final_capture = true 的捕获为止
SAVED("SAVED"),
// The customer approved the payment through the PayPal wallet or another form of guest or unbranded payment. For example, a card, bank account, or so on.
// 客户通过PayPal钱包或其他形式的游客或非品牌支付批准了付款。例如信用卡、银行账户等。
APPROVED("APPROVED"),
// All purchase units in the order are voided.
// 订单中的所有购买单元都已作废。
VOIDED("VOIDED"),
// The payment was authorized or the authorized payment was captured for the order.
// 订单的支付已被授权或已捕获授权的支付。
COMPLETED("COMPLETED"),
// The order requires an action from the payer (e.g. 3DS authentication). Redirect the payer to the "rel":"payer-action" HATEOAS link returned as part of the response prior to authorizing or capturing the order.
// 订单需要支付者执行某项操作例如3DS身份验证。在授权或捕获订单之前请将支付者重定向到响应中返回的"rel":"payer-action" HATEOAS链接。
PAYER_ACTION_REQUIRED("PAYER_ACTION_REQUIRED");
private final String status;
}

View File

@@ -0,0 +1,38 @@
package com.ai.da.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@AllArgsConstructor
@Getter
public enum PayTypeEnum {
/**
* 微信
*/
WXPAY("微信"),
/**
* 支付宝
*/
ALIPAY("支付宝"),
/**
* PayPal
*/
PAYPAL("PayPal"),
/**
* 香港支付宝
*/
ALIPAY_HK("Alipay-HK"),
/**
* Stripe
*/
STRIPE("Stripe");
/**
* 类型
*/
private final String type;
}

View File

@@ -4,7 +4,7 @@ import java.util.stream.Stream;
/** /**
* @author yanglei * @author yanglei
* @description python调用java 操作数类型 generatePrint ->生成印花 designCollection ->设计collection * @description python调用java 操作数类型 generatePrint ->生成印花 designCollection ->设计collection generateSketch->设计草图
* @create 2022-10-3 17:33 * @create 2022-10-3 17:33
**/ **/
public enum PythonToJavaApiOperationTypeEnum { public enum PythonToJavaApiOperationTypeEnum {
@@ -19,7 +19,12 @@ public enum PythonToJavaApiOperationTypeEnum {
/** /**
* 设计collection * 设计collection
*/ */
DESIGN_COLLECTION("designCollection"); DESIGN_COLLECTION("designCollection"),
/**
* 生成草图
*/
GENERATE_SKETCH("generateSketch");
private String realName; private String realName;
@@ -31,7 +36,7 @@ public enum PythonToJavaApiOperationTypeEnum {
return realName; return realName;
} }
public static PythonToJavaApiOperationTypeEnum uploadOf(String realName){ public static PythonToJavaApiOperationTypeEnum uploadOf(String realName) {
return Stream.of(PythonToJavaApiOperationTypeEnum.values()).filter(v ->v.getRealName().equals(realName)).findFirst().orElse(null); return Stream.of(PythonToJavaApiOperationTypeEnum.values()).filter(v -> v.getRealName().equals(realName)).findFirst().orElse(null);
} }
} }

View File

@@ -27,7 +27,7 @@ public enum SingleOverallEnum {
return realName; return realName;
} }
public static SingleOverallEnum of(String realName){ public static SingleOverallEnum of(String realName) {
return Stream.of(SingleOverallEnum.values()).filter(v ->v.getRealName().equals(realName)).findFirst().orElse(null); return Stream.of(SingleOverallEnum.values()).filter(v -> v.getRealName().equals(realName)).findFirst().orElse(null);
} }
} }

View File

@@ -28,6 +28,8 @@ public enum SwitchCategoryEnum {
* 裤子 * 裤子
*/ */
TROUSERS("Trousers"), TROUSERS("Trousers"),
TOPS("Tops"),
BOTTOMS("Bottoms"),
; ;
private String realName; private String realName;
@@ -40,7 +42,7 @@ public enum SwitchCategoryEnum {
return realName; return realName;
} }
public static SwitchCategoryEnum of(String realName){ public static SwitchCategoryEnum of(String realName) {
return Stream.of(SwitchCategoryEnum.values()).filter(v ->v.getRealName().equals(realName)).findFirst().orElse(null); return Stream.of(SwitchCategoryEnum.values()).filter(v -> v.getRealName().equals(realName)).findFirst().orElse(null);
} }
} }

View File

@@ -9,11 +9,11 @@ import java.util.stream.Stream;
**/ **/
public enum SysFileLevel1TypeEnum { public enum SysFileLevel1TypeEnum {
IMAGES("Images","images"), IMAGES("Images", "images"),
ICON_C("Iconc","iconc"), ICON_C("Iconc", "iconc"),
ACCESSORIES("Accessories","accessories"); ACCESSORIES("Accessories", "accessories");
private String realName; private String realName;
/** /**
@@ -34,7 +34,7 @@ public enum SysFileLevel1TypeEnum {
return uploadPathName; return uploadPathName;
} }
public static SysFileLevel1TypeEnum uploadOf(String uploadPathName){ public static SysFileLevel1TypeEnum uploadOf(String uploadPathName) {
return Stream.of(SysFileLevel1TypeEnum.values()).filter(v ->v.getUploadPathName().equals(uploadPathName)).findFirst().orElse(null); return Stream.of(SysFileLevel1TypeEnum.values()).filter(v -> v.getUploadPathName().equals(uploadPathName)).findFirst().orElse(null);
} }
} }

View File

@@ -1,5 +1,6 @@
package com.ai.da.common.enums; package com.ai.da.common.enums;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
@@ -13,27 +14,27 @@ public enum SysFileLevel2TypeEnum {
/** /**
* ICON * ICON
*/ */
ICON("Icon","icon"), ICON("Icon", "icon"),
BAG("Bag","bag"), BAG("Bag", "bag"),
EARRINGS("Earring","earring"), EARRINGS("Earring", "earring"),
HAIRSTYLE("Hairstyle","hairstyle"), HAIRSTYLE("Hairstyle", "hairstyle"),
SHOES("Shoes","shoes"), SHOES("Shoes", "shoes"),
BODY("Body","body"), BODY("Body", "body"),
BLOUSE("Blouse","blouse"), BLOUSE("Blouse", "blouse"),
DRESS("Dress","dress"), DRESS("Dress", "dress"),
OUTWEAR("Outwear","outwear"), OUTWEAR("Outwear", "outwear"),
SKIRT("Skirt","skirt"), SKIRT("Skirt", "skirt"),
TROUSERS("Trousers","trousers"); TROUSERS("Trousers", "trousers");
private String realName; private String realName;
/** /**
@@ -54,20 +55,40 @@ public enum SysFileLevel2TypeEnum {
return uploadPathName; return uploadPathName;
} }
public static SysFileLevel2TypeEnum uploadOf(String uploadPathName){ public static SysFileLevel2TypeEnum uploadOf(String uploadPathName) {
return Stream.of(SysFileLevel2TypeEnum.values()).filter(v ->v.getUploadPathName().equals(uploadPathName)).findFirst().orElse(null); return Stream.of(SysFileLevel2TypeEnum.values()).filter(v -> v.getUploadPathName().equals(uploadPathName)).findFirst().orElse(null);
}
public static SysFileLevel2TypeEnum realNameOf(String realName){
return Stream.of(SysFileLevel2TypeEnum.values()).filter(v ->v.getRealName().equals(realName)).findFirst().orElse(null);
} }
public static SysFileLevel2TypeEnum realNameOfPython(String realName){ public static SysFileLevel2TypeEnum realNameOf(String realName) {
return Stream.of(BLOUSE,DRESS,OUTWEAR,SKIRT,TROUSERS).filter(v ->v.getRealName().equals(realName)).findFirst().orElse(null); return Stream.of(SysFileLevel2TypeEnum.values()).filter(v -> v.getRealName().equals(realName)).findFirst().orElse(null);
} }
public static List<String> ofPython(){
return Stream.of(BLOUSE,DRESS,OUTWEAR,SKIRT,TROUSERS).map(SysFileLevel2TypeEnum::getRealName).collect(Collectors.toList()); public static SysFileLevel2TypeEnum realNameOfPython(String realName) {
return Stream.of(BLOUSE, DRESS, OUTWEAR, SKIRT, TROUSERS).filter(v -> v.getRealName().equals(realName)).findFirst().orElse(null);
} }
public static List<String> ofPythonPath(){
return Stream.of(BLOUSE,DRESS,OUTWEAR,SKIRT,TROUSERS).map(SysFileLevel2TypeEnum::getUploadPathName).collect(Collectors.toList()); public static List<String> ofPython() {
return Stream.of(BLOUSE, DRESS, OUTWEAR, SKIRT, TROUSERS).map(SysFileLevel2TypeEnum::getRealName).collect(Collectors.toList());
} }
public static List<String> ofPythonPath() {
return Stream.of(BLOUSE, DRESS, OUTWEAR, SKIRT, TROUSERS).map(SysFileLevel2TypeEnum::getUploadPathName).collect(Collectors.toList());
}
public static final List<String> ACCESSORIES_LIST = Arrays.asList(
SysFileLevel2TypeEnum.BAG.getRealName(),
SysFileLevel2TypeEnum.EARRINGS.getRealName(),
SysFileLevel2TypeEnum.HAIRSTYLE.getRealName(),
SysFileLevel2TypeEnum.SHOES.getRealName(),
SysFileLevel2TypeEnum.BODY.getRealName()
);
public static final List<String> IMAGES_LIST = Arrays.asList(
SysFileLevel2TypeEnum.BLOUSE.getRealName(),
SysFileLevel2TypeEnum.DRESS.getRealName(),
SysFileLevel2TypeEnum.OUTWEAR.getRealName(),
SysFileLevel2TypeEnum.SKIRT.getRealName(),
SysFileLevel2TypeEnum.TROUSERS.getRealName()
);
} }

View File

@@ -16,23 +16,24 @@ public class TokenQuery {
private static final String GENERATE_USER_DOMAIN = "https://www.szsige.com"; private static final String GENERATE_USER_DOMAIN = "https://www.szsige.com";
public static JSONObject getToken(String session) { public static JSONObject getToken(String session) {
String url = GET_TOKEN_DOMAIN + TokenApis.GET_TOKEN.getUrl()+ session; String url = GET_TOKEN_DOMAIN + TokenApis.GET_TOKEN.getUrl() + session;
log.info("获取用户token接口请求url:" + url); log.info("获取用户token接口请求url:" + url);
HttpResponse httpResponse = HttpUtil.createPost(url).execute(); HttpResponse httpResponse = HttpUtil.createPost(url).execute();
log.info("获取用户token接口响应" + httpResponse); log.info("获取用户token接口响应" + httpResponse);
if(httpResponse.isOk() && StrUtil.isNotEmpty(httpResponse.body())){ if (httpResponse.isOk() && StrUtil.isNotEmpty(httpResponse.body())) {
return JSONObject.parseObject(httpResponse.body()); return JSONObject.parseObject(httpResponse.body());
} }
return null; return null;
} }
public static JSONObject generateUser(Map<String, Object> param,String token) {
public static JSONObject generateUser(Map<String, Object> param, String token) {
HttpResponse httpResponse = HttpUtil.createPost(GENERATE_USER_DOMAIN + TokenApis.GENERATE_USER.getUrl()) HttpResponse httpResponse = HttpUtil.createPost(GENERATE_USER_DOMAIN + TokenApis.GENERATE_USER.getUrl())
.body(JSONObject.toJSONString(param!=null?param:new HashMap<>())) .body(JSONObject.toJSONString(param != null ? param : new HashMap<>()))
.header("Authorization", "Bearer "+token) .header("Authorization", "Bearer " + token)
.header("X-Promiss", "9672233956") .header("X-Promiss", "9672233956")
.execute(); .execute();
log.info("生成用户信息接口响应:" + httpResponse); log.info("生成用户信息接口响应:" + httpResponse);
if(httpResponse.isOk() && StrUtil.isNotEmpty(httpResponse.body())){ if (httpResponse.isOk() && StrUtil.isNotEmpty(httpResponse.body())) {
return JSONObject.parseObject(httpResponse.body()); return JSONObject.parseObject(httpResponse.body());
} }
return null; return null;

View File

@@ -17,7 +17,7 @@ import java.util.List;
@Data @Data
@NoArgsConstructor @NoArgsConstructor
@ApiModel("分页响应结果") @ApiModel("分页响应结果")
public class PageBaseResponse<T>{ public class PageBaseResponse<T> {
@ApiModelProperty("页码") @ApiModelProperty("页码")
private long page; private long page;
@ApiModelProperty("每页数量") @ApiModelProperty("每页数量")
@@ -30,7 +30,6 @@ public class PageBaseResponse<T>{
private List<T> content; private List<T> content;
public PageBaseResponse(List<T> list, long page, long size, long total, long pages) { public PageBaseResponse(List<T> list, long page, long size, long total, long pages) {
this.page = page; this.page = page;
this.size = size; this.size = size;
@@ -39,7 +38,7 @@ public class PageBaseResponse<T>{
this.content = list; this.content = list;
} }
public static <T> PageBaseResponse<T> success(IPage<T> page){ public static <T> PageBaseResponse<T> success(IPage<T> page) {
return new PageBaseResponse<>(page.getRecords() , page.getCurrent(), page.getSize(), page.getTotal(), page.getPages()); return new PageBaseResponse<>(page.getRecords(), page.getCurrent(), page.getSize(), page.getTotal(), page.getPages());
} }
} }

View File

@@ -31,9 +31,8 @@ public class PageResponse<T> extends Response<List<T>> {
private List<T> content; private List<T> content;
public PageResponse(Response<List<T>> response, long page, long size, long total, long pages) { public PageResponse(Response<List<T>> response, long page, long size, long total, long pages) {
if(response != null) { if (response != null) {
this.setData(response.getData()); this.setData(response.getData());
this.setErrCode(response.getErrCode()); this.setErrCode(response.getErrCode());
this.setErrMsg(response.getErrMsg()); this.setErrMsg(response.getErrMsg());
@@ -45,8 +44,8 @@ public class PageResponse<T> extends Response<List<T>> {
this.content = response.getData(); this.content = response.getData();
} }
public static <T> PageResponse<T> success(IPage<T> page){ public static <T> PageResponse<T> success(IPage<T> page) {
Response<List<T>> response = success(page.getRecords()); Response<List<T>> response = success(page.getRecords());
return new PageResponse<>(response , page.getCurrent(), page.getSize(), page.getTotal(), page.getPages()); return new PageResponse<>(response, page.getCurrent(), page.getSize(), page.getTotal(), page.getPages());
} }
} }

View File

@@ -27,28 +27,27 @@ public class Response<T> implements Serializable {
@ApiModelProperty("数据结果") @ApiModelProperty("数据结果")
private T data; private T data;
public static <T> Response<T> success(){ public static <T> Response<T> success() {
return success(ResultEnum.SUCCESS.getCode(), ResultEnum.SUCCESS.getMsg(), null); return success(ResultEnum.SUCCESS.getCode(), ResultEnum.SUCCESS.getMsg(), null);
} }
public static <T> Response<T> success(String msg){ // public static <T> Response<T> success(String msg) {
return success(ResultEnum.SUCCESS.getCode(), msg, null); // return success(ResultEnum.SUCCESS.getCode(), msg, null);
} // }
public static <T> Response<T> success(T data){ public static <T> Response<T> success(T data) {
return success(ResultEnum.SUCCESS.getCode(), ResultEnum.SUCCESS.getMsg(), data); return success(ResultEnum.SUCCESS.getCode(), ResultEnum.SUCCESS.getMsg(), data);
} }
public static <T> Response<T> success(int code, T data){ public static <T> Response<T> success(int code, T data) {
return success(code, ResultEnum.SUCCESS.getMsg(), data); return success(code, ResultEnum.SUCCESS.getMsg(), data);
} }
public static <T> Response<T> success(int code, String msg, T data){ public static <T> Response<T> success(int code, String msg, T data) {
return getResponse(code, msg, data); return getResponse(code, msg, data);
} }
public static <T> Response<T> fail(String msg) { public static <T> Response<T> fail(String msg) {
return fail(ResultEnum.FAIL.getCode(), msg); return fail(ResultEnum.FAIL.getCode(), msg);
} }
@@ -85,7 +84,7 @@ public class Response<T> implements Serializable {
return getResponse(code, msg, data); return getResponse(code, msg, data);
} }
private static <T> Response<T> getResponse(int code, String msg, T data){ private static <T> Response<T> getResponse(int code, String msg, T data) {
return new Response<>(code, msg, data); return new Response<>(code, msg, data);
} }

View File

@@ -13,17 +13,20 @@ public enum ResultEnum {
ERROR(false, -1, "system error!"), ERROR(false, -1, "system error!"),
PARAMETER_ERROR(false, -2, "parameter error!"), PARAMETER_ERROR(false, -2, "parameter error!"),
NO_LOGIN(false,-100,"User not logged in"), NO_LOGIN(false, -100, "User not logged in"),
NO_PERMISSION(false,-200,"No access"), NO_PERMISSION(false, -200, "No access"),
ACCOUNT_LOCK(false,-300,"Account frozen"); ACCOUNT_LOCK(false, -300, "Account frozen"),
PROMPT(false, 1, "Prompt"),
WARNING(false, 2, "Warning"),
;
private int code; private int code;
private String msg; private String msg;
private boolean isOK; private boolean isOK;
ResultEnum(boolean isOK, int code, String msg) {
ResultEnum(boolean isOK, int code, String msg){
this.isOK = isOK; this.isOK = isOK;
this.code = code; this.code = code;
this.msg = msg; this.msg = msg;

View File

@@ -43,6 +43,6 @@ public class UserLoginFailureHandler implements AuthenticationFailureHandler {
log.error("登录失败:", e); log.error("登录失败:", e);
response = Response.fail("登录失败!"); response = Response.fail("登录失败!");
} }
JSONResponseUtils.build(httpServletResponse,response); JSONResponseUtils.build(httpServletResponse, response);
} }
} }

View File

@@ -7,18 +7,14 @@ import com.ai.da.common.security.jwt.JWTTokenHelper;
import com.ai.da.common.utils.LocalCacheUtils; import com.ai.da.common.utils.LocalCacheUtils;
import com.ai.da.common.utils.MultiReadHttpServletRequest; import com.ai.da.common.utils.MultiReadHttpServletRequest;
import com.ai.da.common.utils.MultiReadHttpServletResponse; import com.ai.da.common.utils.MultiReadHttpServletResponse;
import com.ai.da.common.utils.RequestInfoUtil;
import com.ai.da.model.vo.AuthPrincipalVo; import com.ai.da.model.vo.AuthPrincipalVo;
import lombok.AllArgsConstructor;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Required;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.lang.NonNull; import org.springframework.lang.NonNull;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.util.StopWatch; import org.springframework.util.StopWatch;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.filter.OncePerRequestFilter; import org.springframework.web.filter.OncePerRequestFilter;
import javax.annotation.Resource; import javax.annotation.Resource;
@@ -28,7 +24,6 @@ import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.sql.Statement;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
@@ -47,25 +42,31 @@ public class AuthenticationFilter extends OncePerRequestFilter {
private SecurityProperties properties; private SecurityProperties properties;
private static final List<String> FILTER_URL = private static final List<String> FILTER_URL =
Arrays.asList("/favicon.ico","/doc.html","api/account/login","api/account/preLogin","api/account/sendEmail", Arrays.asList("/favicon.ico", "/doc.html", "api/account/login", "api/account/preLogin", "api/account/sendEmail","api/account/noLoginRequired",
"/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/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/existNoLoginRequired","/api/third/party/getRedirectUrl",
"/api/python/flush","/api/account/healthy","/api/ali-pay/trade/notify","/api/paypal/ipn/back","/api/alipay-hk/trade/notify",
"/api/portfolio/page", "/api/portfolio/detail", "/api/portfolio/commentPage", "/api/portfolio/viewsIncrease",
"/api/account/designWorksRegister","/api/account/questionnaire","/api/stripe/trade/notify"
);
@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;
try{ try {
stopWatch.start(); stopWatch.start();
if ((httpServletRequest.getContentType() == null && httpServletRequest.getContentLength() > 0) || (httpServletRequest.getContentType() != null && !httpServletRequest.getContentType().contains("application/json"))) { if ((httpServletRequest.getContentType() == null && httpServletRequest.getContentLength() > 0) || (httpServletRequest.getContentType() != null && !httpServletRequest.getContentType().contains("application/json"))) {
extracted(wrappedRequest); extracted(wrappedRequest);
filterChain.doFilter(wrappedRequest, wrappedResponse); filterChain.doFilter(wrappedRequest, wrappedResponse);
}else { } else {
wrappedRequest = new MultiReadHttpServletRequest(httpServletRequest); wrappedRequest = new MultiReadHttpServletRequest(httpServletRequest);
wrappedResponse = new MultiReadHttpServletResponse(httpServletResponse); wrappedResponse = new MultiReadHttpServletResponse(httpServletResponse);
extracted(wrappedRequest); extracted(wrappedRequest);
@@ -77,24 +78,37 @@ public class AuthenticationFilter extends OncePerRequestFilter {
} finally { } finally {
stopWatch.stop(); stopWatch.stop();
} }
}else { } else {
filterChain.doFilter(httpServletRequest, httpServletResponse); filterChain.doFilter(httpServletRequest, httpServletResponse);
} }
} }
private Boolean calculateUrl(String requestURI ){
String filterUrl = FILTER_URL.stream().filter(url ->requestURI.contains(url)).findFirst().orElse(null); private Boolean calculateUrl(String requestURI) {
return null == filterUrl ? Boolean.TRUE :Boolean.FALSE; String filterUrl = FILTER_URL.stream().filter(url -> requestURI.contains(url)).findFirst().orElse(null);
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);
log.info("本次请求的ip为 " + ipAddress);
throw new RuntimeException("请传入token"); throw new RuntimeException("请传入token");
} }
if(jwtToken.equals("Bearer-eyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiIyIiwic3ViIjoie1wiaWRcIjoyLFwidXNlcm5hbWVcIjpcImxpcnNcIn0iLCJpYXQiOjE2NjU3NDEwODcsImlzcyI6IkRXSiIsImF1dGhvcml0aWVzIjoiW10iLCJleHAiOjE2NzQzODEwODd9.ShM9R_NNFD7oo1OvxrEgg7PFeWinOuAKkuInUCMQupp66s64Hhv8tN0Wwr83nIN4rHPqtn95wmd4msWcvaFYJA")){
//写死 暂时放行
return;
}
// 检查token // 检查token
boolean validate = jwtTokenHelper.validateToken(jwtToken); boolean validate = jwtTokenHelper.validateToken(jwtToken);
if(validate){ if (validate) {
AuthPrincipalVo principal = jwtTokenHelper.parserToUser(jwtToken); AuthPrincipalVo principal = jwtTokenHelper.parserToUser(jwtToken);
if (principal == null) { if (principal == null) {
throw new RuntimeException("TOKEN已过期请重新登录"); throw new RuntimeException("TOKEN已过期请重新登录");
@@ -105,10 +119,7 @@ public class AuthenticationFilter extends OncePerRequestFilter {
UserContext.setUserHolder(principal); UserContext.setUserHolder(principal);
//校验token //校验token
String cacheToken = LocalCacheUtils.getTokenCache(String.valueOf(principal.getId())); String cacheToken = LocalCacheUtils.getTokenCache(String.valueOf(principal.getId()));
if(jwtToken.equals("Bearer-eyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiIyIiwic3ViIjoie1wiaWRcIjoyLFwidXNlcm5hbWVcIjpcImxpcnNcIn0iLCJpYXQiOjE2NjU3NDEwODcsImlzcyI6IkRXSiIsImF1dGhvcml0aWVzIjoiW10iLCJleHAiOjE2NzQzODEwODd9.ShM9R_NNFD7oo1OvxrEgg7PFeWinOuAKkuInUCMQupp66s64Hhv8tN0Wwr83nIN4rHPqtn95wmd4msWcvaFYJA")){
//写死 暂时放行
return;
}
if(StringUtils.isEmpty(cacheToken)){ if(StringUtils.isEmpty(cacheToken)){
throw new RuntimeException("TOKEN已过期请重新登录"); throw new RuntimeException("TOKEN已过期请重新登录");
} }

View File

@@ -31,7 +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";
public String createToken(AuthPrincipalVo principal){ public String createToken(AuthPrincipalVo principal) {
String token = Jwts.builder() String token = Jwts.builder()
.setId(String.valueOf(principal.getId())) .setId(String.valueOf(principal.getId()))
.setSubject(JSONObject.toJSONString(principal)) .setSubject(JSONObject.toJSONString(principal))
@@ -45,24 +45,24 @@ public class JWTTokenHelper {
return token; return token;
} }
public boolean validateToken(String token){ public boolean validateToken(String token) {
Claims claims = parser(token); Claims claims = parser(token);
if (MapUtil.isEmpty(claims)){ if (MapUtil.isEmpty(claims)) {
return false; return false;
} }
return true; return true;
} }
public AuthPrincipalVo parserToUser(String token){ public AuthPrincipalVo parserToUser(String token) {
String subject = parser(token).getSubject(); String subject = parser(token).getSubject();
if(StrUtil.isNotEmpty(subject)){ if (StrUtil.isNotEmpty(subject)) {
return JSONObject.parseObject(subject, AuthPrincipalVo.class); return JSONObject.parseObject(subject, AuthPrincipalVo.class);
} }
return null; return null;
} }
public Claims parser(String token) { public Claims parser(String token) {
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();
} }
} }

View File

@@ -0,0 +1,31 @@
package com.ai.da.common.task;
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;
@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();
}
// todo 多久执行一次?
@Scheduled(cron = "0 */5 * * * *") // Run every 5 minutes
public void getPaidUser(){
// 获取code-create 表中 指定日期之后 订单状态为wc-processing的订单
accountService.extendValidityForCC();
}
}

View File

@@ -0,0 +1,42 @@
package com.ai.da.common.task;
import com.ai.da.mapper.primary.entity.OrderInfo;
import com.ai.da.common.enums.PayTypeEnum;
import com.ai.da.service.AliPayService;
import com.ai.da.service.OrderInfoService;
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 AliPayTask {
@Resource
private OrderInfoService orderInfoService;
@Resource
private AliPayService aliPayService;
/**
* 从第0秒开始每隔30秒执行1次查询创建超过5分钟并且未支付的订单
*/
// @Scheduled(cron = "0/30 * * * * ?")
public void orderConfirm(){
// log.info("Alipay orderConfirm 被执行......");
List<OrderInfo> orderInfoList = orderInfoService.getNoPayOrderByDuration(5, PayTypeEnum.ALIPAY.getType());
for (OrderInfo orderInfo : orderInfoList) {
String orderNo = orderInfo.getOrderNo();
log.warn("超时订单 ===> {}", orderNo);
//核实订单状态:调用支付宝查单接口
aliPayService.checkOrderStatus(orderNo);
}
}
}

View File

@@ -0,0 +1,21 @@
package com.ai.da.common.task;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class GenerateTask {
// @Scheduled(cron = "0 0 */1 * * ?")
public void generateScheduled(){
log.info("测试定时器generate");
try{
}catch(Exception e){
}
}
}

View File

@@ -0,0 +1,42 @@
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.PayPalCheckoutService;
import com.paypal.http.exceptions.SerializeException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Slf4j
@Component
public class PaypalTask {
@Resource
private OrderInfoService orderInfoService;
@Resource
private PayPalCheckoutService payPalCheckoutService;
@Scheduled(cron = "0/30 * * * * ?")
public void orderConfirm() throws SerializeException {
// log.info("PayPal orderConfirm 被执行......");
List<OrderInfo> orderInfoList = orderInfoService.getNoPayOrderByDuration(30, PayTypeEnum.PAYPAL.getType());
for (OrderInfo orderInfo : orderInfoList) {
String orderNo = orderInfo.getOrderNo();
log.warn("超时订单 ===> {}", orderNo);
//核实订单状态:调用支付宝查单接口
payPalCheckoutService.checkOrderStatus(orderNo);
}
}
}

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

@@ -23,16 +23,17 @@ public class AccessLimitUtils {
* @param interfaceName * @param interfaceName
* @return * @return
*/ */
public static void validate(String interfaceName,Integer count) { public static void validate(String interfaceName, Integer count) {
Integer useCount= LocalCacheUtils.getAidaInterfaceCurrentLimitingCache(interfaceName); Integer useCount = LocalCacheUtils.getAidaInterfaceCurrentLimitingCache(interfaceName);
if(useCount >count){ if (useCount > count) {
//系统繁忙 //系统繁忙
throw new BusinessException("system busy !"); throw new BusinessException("system.busy");
}else{ } else {
useCount ++; useCount++;
LocalCacheUtils.setAidaInterfaceCurrentLimitingCache(interfaceName,useCount); LocalCacheUtils.setAidaInterfaceCurrentLimitingCache(interfaceName, useCount);
} }
} }
/** /**
* 校验过后 接口完毕 去掉限流 * 校验过后 接口完毕 去掉限流
* *
@@ -40,9 +41,9 @@ public class AccessLimitUtils {
* @return * @return
*/ */
public static void validateOut(String interfaceName) { public static void validateOut(String interfaceName) {
Integer useCount= LocalCacheUtils.getAidaInterfaceCurrentLimitingCache(interfaceName); Integer useCount = LocalCacheUtils.getAidaInterfaceCurrentLimitingCache(interfaceName);
useCount --; useCount--;
LocalCacheUtils.setAidaInterfaceCurrentLimitingCache(interfaceName,useCount); LocalCacheUtils.setAidaInterfaceCurrentLimitingCache(interfaceName, useCount);
} }
} }

View File

@@ -0,0 +1,383 @@
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.AlipayHKRequestDTO;
import com.alibaba.fastjson.JSONObject;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
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.PemReader;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.crypto.*;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Base64;
import java.util.HashMap;
import java.util.UUID;
@Slf4j
@Component
public class AlipayHKEncryptionUtil {
@Value("${alipayHK.merchantId}")
private String merchantId;
@Value("${alipayHK.segmentId}")
private String segmentId;
@Value("${alipayHK.AESKey}")
private String aesKey;
@Value("${alipayHK.rsaPrivateKey}")
private String privateKeyPath;
@Value("${alipayHK.rsaPublicKey}")
private String publicKeyPath;
@Value("${alipayHK.CODPublicKey}")
private String CODPublicKeyPath;
/**
* 加密
* @param param
* @param serviceName
* @return
* @throws NoSuchPaddingException
* @throws NoSuchAlgorithmException
* @throws InvalidAlgorithmParameterException
* @throws InvalidKeyException
* @throws IllegalBlockSizeException
* @throws BadPaddingException
* @throws 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
String key = aesKey;
// 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
// String mode = "aes-128-cbc";
String mode = "aes-256-cbc";
// Padding mode
String padding = "pkcs7";
// signature alogrithm
String signatureAlgorithm = "rsa-sha256";
// String signatureAlgorithm = "SHA256withRSA";
// Message body
AlipayHKParametersDTO requestMessage = new AlipayHKParametersDTO();
requestMessage.setService(serviceName);
requestMessage.setMerchant_id(merchantId);
requestMessage.setRequest_time(Long.toString(System.currentTimeMillis() / 1000L));
requestMessage.setRequest_uuid(UUID.randomUUID().toString());
// HashMap<String, Object> param = new HashMap<>();
requestMessage.setParameters(param);
// Serialize message body
Gson gson = new GsonBuilder().disableHtmlEscaping().create();
String content = gson.toJson(requestMessage);
log.info("alipay-hk request 加密前:{}", content);
// Secure random iv 获取随机种子
SecureRandom secureRandom = new SecureRandom();
byte[] iv = new byte[16]; //NEVER REUSE THIS IV WITH THE SAME KEY
secureRandom.nextBytes(iv);
// Algorithms
String alogrithm = "AES/CBC/PKCS5Padding";
// 创建 AES 密钥对象
SecretKey secretKey = new SecretKeySpec(key.getBytes(), "AES");
// 为加密算法提供一个随机的初始化向量,以增强加密安全性
IvParameterSpec parameterSpec = new IvParameterSpec(iv);
// 创建 Cipher 对象
Cipher cipher = Cipher.getInstance(alogrithm);
// 初始化为加密模式 Cipher.ENCRYPT_MODE
cipher.init(Cipher.ENCRYPT_MODE, secretKey, parameterSpec);
// Cipher text 对请求内容加密
byte[] cipherText = cipher.doFinal(content.getBytes());
// Concat iv and cipher text for signing
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
outputStream.write(iv);
outputStream.write(cipherText);
byte signMessage[] = outputStream.toByteArray();
// Sign key 读取rsa私钥文件解析并得到私钥对象 privateKey
String rsaPrivateKeyPath = privateKeyPath;
PrivateKey privateKey = null;
byte[] signature;
try {
privateKey = readPrivateKeyFromFile(rsaPrivateKeyPath);
Signature signer = Signature.getInstance("SHA256withRSA");
signer.initSign(privateKey);
// 将加密内容和随机向量均加签
signer.update(signMessage);
signature = signer.sign();
} catch (SignatureException e) {
throw new RuntimeException(e);
} catch (Exception e) {
log.error(e.getMessage());
throw new RuntimeException(e);
}
Base64.Encoder encoder = Base64.getEncoder();
// Combine result
AlipayHKRequestDTO alipayHKRequestDTO = new AlipayHKRequestDTO();
alipayHKRequestDTO.setMerchant_id(merchantId);
alipayHKRequestDTO.setNonce(encoder.encodeToString(iv));
alipayHKRequestDTO.setMessage(encoder.encodeToString(cipherText));
alipayHKRequestDTO.setTag(encoder.encodeToString(signature));
String cipherSuite = mode + "-" + padding + "-with-" + signatureAlgorithm;
alipayHKRequestDTO.setCipher_suite(cipherSuite);
// Encode to json
String jsonEncoded = JSONObject.toJSONString(alipayHKRequestDTO);
log.info("alipay-hk request 加密加签后:{}",jsonEncoded);
// String info = AlipayHKRequestUtil.createOrder(alipayHKRequestDTO);
// log.info(info);
return alipayHKRequestDTO;
}
/**
* 从文件中读取RSA私钥
* @param filePath
* @return
* @throws Exception
*/
private static PrivateKey readPrivateKeyFromFile(String filePath) throws Exception {
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();
String line;
// 读取文本文件中的内容
while ((line = reader.readLine()) != null) {
keyBuffer.append(line);
}
reader.close();
// 去除私钥内容中的头部和尾部信息
String privateKeyContent = keyBuffer.toString()
.replace("-----BEGIN PRIVATE KEY-----", "")
.replace("-----END PRIVATE KEY-----", "")
.replaceAll("\\s+", ""); // 去除空格、换行等字符
return privateKeyContent;
}
/**
* 使用 AES 密钥和随机向量进行解密
*/
public String decryptAES(String encryptedText, String iv) throws Exception {
byte[] encryptedBytes = Base64.getDecoder().decode(encryptedText);
byte[] ivBytes = Base64.getDecoder().decode(iv);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec secretKeySpec = new SecretKeySpec(aesKey.getBytes(), "AES");
IvParameterSpec ivParameterSpec = new IvParameterSpec(ivBytes);
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
return new String(decryptedBytes, StandardCharsets.UTF_8);
}
public void test() throws Exception {
// 加密数据
AlipayHKParametersDTO requestMessage = new AlipayHKParametersDTO();
requestMessage.setService("create_order");
requestMessage.setMerchant_id(merchantId);
requestMessage.setRequest_time(Long.toString(System.currentTimeMillis() / 1000L));
requestMessage.setRequest_uuid(UUID.randomUUID().toString());
HashMap<String, Object> param = new HashMap<>();
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");
Gson gson = new Gson();
String plaintext = gson.toJson(requestMessage);
System.out.println(plaintext);
// 生成 AES 密钥
String key = aesKey;
SecretKey aesKey = new SecretKeySpec(key.getBytes(), "AES");
// 使用 RSA 公钥加密 AES 密钥
String rsaPublicKeyPath = publicKeyPath;
PublicKey publicKey = readPublicKey(rsaPublicKeyPath);
Cipher rsaCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
// Cipher rsaCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
rsaCipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] encryptedAesKey = rsaCipher.doFinal(aesKey.getEncoded());
// 使用 AES-128-CBC 加密数据
Cipher aesCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
byte[] ivBytes = generateRandomIV(aesCipher.getBlockSize());
IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
aesCipher.init(Cipher.ENCRYPT_MODE, aesKey, ivSpec);
byte[] encryptedData = aesCipher.doFinal(plaintext.getBytes());
// 数字签名(使用 RSA 私钥)
String rsaPrivateKeyPath = privateKeyPath;
PrivateKey privateKey = readPrivateKeyFromFile(rsaPrivateKeyPath);
Signature signer = Signature.getInstance("SHA256withRSA");
signer.initSign(privateKey);
signer.update(encryptedData);
byte[] signatureBytes = signer.sign();
Base64.Encoder encoder = Base64.getEncoder();
// 将加密后的数据和签名进行Base64编码
String base64EncryptedData = Base64.getEncoder().encodeToString(encryptedData);
String base64Signature = Base64.getEncoder().encodeToString(signatureBytes);
// 输出加密后的数据和签名
System.out.println("加密后的数据:" + base64EncryptedData);
System.out.println("数字签名:" + base64Signature);
HashMap<String, String> result = new HashMap<String, String>();
result.put("merchant_id",merchantId);
result.put("nonce", encoder.encodeToString(ivBytes));
result.put("message", encoder.encodeToString(encryptedData));
result.put("tag", encoder.encodeToString(signatureBytes));
String mode = "aes-128-cbc";
// Padding mode
String padding = "pkcs7";
// signature alogrithm
String signatureAlgorithm = "rsa-sha256";
String cipherSuite = mode + "-" + padding + "-with-" + signatureAlgorithm;
result.put("cipher_suite", cipherSuite);
System.out.println("map 格式:" + result);
// Encode to json
String jsonEncoded = JSONObject.toJSONString(result);
System.out.println("json 格式:" + jsonEncoded);
AlipayHKRequestDTO alipayHKRequestDTO = new AlipayHKRequestDTO();
alipayHKRequestDTO.setMerchant_id(merchantId);
alipayHKRequestDTO.setNonce(encoder.encodeToString(ivBytes));
alipayHKRequestDTO.setMessage(encoder.encodeToString(encryptedData));
alipayHKRequestDTO.setTag(encoder.encodeToString(signatureBytes));
alipayHKRequestDTO.setCipher_suite(cipherSuite);
// String info = AlipayHKRequestUtil.createOrder(result);
// log.info(info);
// 解密和验证
// byte[] decryptedAesKey = rsaCipher.doFinal(encryptedAesKey);
byte[] decryptedAesKey = rsaCipher.doFinal(aesKey.getEncoded());
SecretKey decryptedAesSecretKey = new SecretKeySpec(decryptedAesKey, "AES");
aesCipher.init(Cipher.DECRYPT_MODE, decryptedAesSecretKey, ivSpec);
byte[] decryptedData = aesCipher.doFinal(Base64.getDecoder().decode(base64EncryptedData));
// 验证数字签名
Signature verifier = Signature.getInstance("SHA256withRSA");
verifier.initVerify(publicKey);
verifier.update(decryptedData);
boolean signatureValid = verifier.verify(Base64.getDecoder().decode(base64Signature));
System.out.println("解密后的数据:" + new String(decryptedData));
System.out.println("数字签名验证结果:" + signatureValid);
}
// public static PublicKey readPublicKey(File file) throws Exception {
public static PublicKey readPublicKey(String fileName) throws Exception {
KeyFactory factory = KeyFactory.getInstance("RSA");
ClassPathResource classPathResource = new ClassPathResource(fileName);
InputStream inputStream = classPathResource.getStream();
BufferedReader fileReader = new BufferedReader(new InputStreamReader(inputStream));
try (PemReader pemReader = new PemReader(fileReader)) {
PemObject pemObject = pemReader.readPemObject();
byte[] content = pemObject.getContent();
X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(content);
return factory.generatePublic(pubKeySpec);
}
}
private static byte[] generateRandomIV(int blockSize) {
SecureRandom random = new SecureRandom();
byte[] iv = new byte[blockSize];
random.nextBytes(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

@@ -0,0 +1,62 @@
package com.ai.da.common.utils;
import com.ai.da.common.config.exception.BusinessException;
import com.ai.da.model.dto.AlipayHKRequestDTO;
import com.alibaba.fastjson.serializer.SerializerFeature;
import lombok.extern.slf4j.Slf4j;
import okhttp3.*;
import java.io.IOException;
import java.time.Instant;
import java.util.concurrent.TimeUnit;
import com.alibaba.fastjson.JSONObject;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class AlipayHKRequestUtil {
public String requestAlipayHK(AlipayHKRequestDTO alipayHKRequestDTO) {
OkHttpClient client = new OkHttpClient().newBuilder()
.connectTimeout(30, TimeUnit.SECONDS)
.pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒)
.readTimeout(60, TimeUnit.SECONDS)//读取超时(单位:秒)
.writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒)
.build();
MediaType mediaType = MediaType.parse("application/json;charset=utf-8");
long epochMilli = Instant.now().toEpochMilli();
log.info("Alipay-HK send request unix timestamp: {}", epochMilli);
String jsonString = JSONObject.toJSONString(alipayHKRequestDTO, SerializerFeature.WriteMapNullValue);
// log.info(jsonString);
RequestBody body = RequestBody.create(mediaType, jsonString);
Request request = new Request.Builder()
// .url("https://aqs-api.sandbox-codpayment.com/v1/service")
.url("https://aqs-api.codpayment.com/v1/service")
.method("POST", body)
.addHeader("Content-Type", "application/json;charset=utf-8")
.build();
Response response;
String bodyString;
try {
response = client.newCall(request).execute();
assert response.body() != null;
bodyString = response.body().string();
} catch (Exception e) {
throw new BusinessException(e.getMessage());
}
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,75 @@
package com.ai.da.common.utils;
import com.ai.da.common.config.exception.BusinessException;
import com.ai.da.model.dto.GenerateToPythonDTO;
import com.ai.da.python.PythonService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.*;
import java.util.concurrent.*;
@Slf4j
@Component
public class AsyncCallerUtil {
// 存放状态 表示当前任务是否需要继续等待,默认持续等待
public static Map<String, Boolean> waitingStatus = new HashMap<>();
private static PythonService pythonService;
@Autowired
public void setPythonService(PythonService pythonService) {
AsyncCallerUtil.pythonService = pythonService;
}
public CompletableFuture<List<String>> callGenerateAsync(GenerateToPythonDTO generateToPython) {
// return CompletableFuture.supplyAsync(() -> pythonService.generateSketchOrPrint(generateToPython));
return null;
}
public List<String> generate(GenerateToPythonDTO generateToPython) {
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5);
String taskId = generateToPython.getTasks_id();
ScheduledFuture<?> timeoutTask = null;
if (!waitingStatus.containsKey(taskId)) waitingStatus.put(taskId, true);
try {
CompletableFuture<List<String>> generateResult = callGenerateAsync(generateToPython);
// 5秒后第一次确认之后每隔10秒确认一次用户选择结果
timeoutTask = scheduledExecutorService.scheduleAtFixedRate(() -> {
// 调用另一个接口获取用户的选择
if (!waitingStatus.get(taskId)) {
// 如果用户选择取消则取消对generate的调用
generateResult.cancel(true);
waitingStatus.remove(taskId);
} else log.info("===============持续等待===============");
}, 5, 10, TimeUnit.SECONDS);
log.info("阻塞等待结果...");
// 阻塞,等待结果
List<String> result = generateResult.get();
// 取消定时任务
timeoutTask.cancel(true);
waitingStatus.remove(taskId);
return result;
} catch (CancellationException e) {
// generateResult.cancel(true);通过抛出异常取消该任务
log.info("==========成功取消generate任务==========");
return null;
} catch (InterruptedException | ExecutionException | BusinessException e) {
// 处理异常
log.error("发生错误 " + e, e);
// 取消定时任务
assert timeoutTask != null;
timeoutTask.cancel(true);
throw new BusinessException(e.getMessage());
} finally {
// 关闭线程池
// executorService.shutdown();
// scheduledExecutorService.shutdown();
}
}
}

View File

@@ -54,11 +54,11 @@ public class ConvertUtil {
return sb.toString(); return sb.toString();
} }
public static String lowerCaseFirstLetter(String str){ public static String lowerCaseFirstLetter(String str) {
if(StrUtil.isNotBlank(str)){ if (StrUtil.isNotBlank(str)) {
str = str.trim(); str = str.trim();
String result = str.substring(0, 1).toLowerCase(); String result = str.substring(0, 1).toLowerCase();
if(str.length() > 1){ if (str.length() > 1) {
result += str.substring(1); result += str.substring(1);
} }
return result; return result;

View File

@@ -12,11 +12,13 @@ import java.time.format.DateTimeFormatter;
import java.util.Calendar; import java.util.Calendar;
import java.util.Date; import java.util.Date;
import java.util.TimeZone; import java.util.TimeZone;
@Slf4j @Slf4j
public class DateUtil { public class DateUtil {
public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss"; public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
public static final String YYYYMM = "yyyyMM"; public static final String YYYYMM = "yyyyMM";
public static final String YYYY_MM_DD = "yyyyMMdd"; public static final String YYYY_MM_DD = "yyyyMMdd";
/** /**
* LocalDate -> Date * LocalDate -> Date
*/ */
@@ -30,8 +32,10 @@ public class DateUtil {
public static Date asDate(LocalDateTime localDateTime) { public static Date asDate(LocalDateTime localDateTime) {
return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()); return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
} }
/** /**
* date 装 String * date 装 String
*
* @param date * @param date
* @param formatter * @param formatter
* @return * @return
@@ -43,23 +47,38 @@ public class DateUtil {
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zoneId); LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zoneId);
return dateTimeFormatter.format(localDateTime); return dateTimeFormatter.format(localDateTime);
} }
/** /**
* 根据时区获取时间 * 根据时区获取时间
*
* @param timeZone "Asia/Tokyo" * @param timeZone "Asia/Tokyo"
* @return * @return
*/ */
public static Date getByTimeZone(String timeZone) { public static Date getByTimeZone(String timeZone) {
String dateStr = dateToStr(new Date(),YYYY_MM_DD_HH_MM_SS); String dateStr = dateToStr(new Date(), YYYY_MM_DD_HH_MM_SS);
SimpleDateFormat sdf = new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS); SimpleDateFormat sdf = new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS);
// 设置时区 // 设置时区
sdf.setTimeZone(TimeZone.getTimeZone(timeZone)); sdf.setTimeZone(TimeZone.getTimeZone(timeZone));
Date date = null; Date date = null;
try{ try {
date = sdf.parse(dateStr); date = sdf.parse(dateStr);
}catch (ParseException parseException){ } catch (ParseException parseException) {
log.error("时间转换异常!",parseException); log.error("时间转换异常!", parseException);
} }
return date; return date;
} }
/**
* 获取指定时区的时间戳的前十位
* @param timeZone 时区
* @return 当前时间戳的前十位
*/
public static String getTimeStamp(String timeZone){
ZoneId zoneId = ZoneId.of(timeZone);
long epochSecond = Instant.now().atZone(zoneId).toEpochSecond();
return String.valueOf(epochSecond).substring(0, 10);
}
} }

View File

@@ -0,0 +1,33 @@
package com.ai.da.common.utils;
import lombok.Data;
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) {
columnData.add(row.getCell(i).getStringCellValue());
}
data.add(columnData);
}
}
return data;
}
}

View File

@@ -5,27 +5,19 @@ import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.ai.da.common.config.exception.BusinessException; import com.ai.da.common.config.exception.BusinessException;
import com.ai.da.model.vo.FileVO; import com.ai.da.model.vo.FileVO;
import org.apache.tomcat.util.http.fileupload.FileUtils;
import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.util.FileSystemUtils;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.io.*; import java.io.*;
import java.net.URL; import java.net.URL;
import java.security.MessageDigest;
import java.text.DecimalFormat; import java.text.DecimalFormat;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
//import org.apache.poi.util.IOUtils;
//import org.apache.poi.xssf.streaming.SXSSFSheet;
public class FileUtil extends cn.hutool.core.io.FileUtil { public class FileUtil extends cn.hutool.core.io.FileUtil {
private static final Logger log = LoggerFactory.getLogger(com.ai.da.common.utils.FileUtil.class); private static final Logger log = LoggerFactory.getLogger(com.ai.da.common.utils.FileUtil.class);
@@ -140,50 +132,53 @@ public class FileUtil extends cn.hutool.core.io.FileUtil {
public static FileVO getFileSize(MultipartFile file) { public static FileVO getFileSize(MultipartFile file) {
int width = 0; int width = 0;
int height = 0; int height = 0;
try{ try {
// 图片对象 // 图片对象
BufferedImage bufferedImage = ImageIO.read(file.getInputStream()); BufferedImage bufferedImage = ImageIO.read(file.getInputStream());
// 宽度 // 宽度
width = bufferedImage.getWidth(); width = bufferedImage.getWidth();
// 高度 // 高度
height = bufferedImage.getHeight(); height = bufferedImage.getHeight();
}catch (IOException ioException){ } catch (IOException ioException) {
log.error("获取文件尺寸异常###{}", ExceptionUtil.stacktraceToString(ioException)); log.error("获取文件尺寸异常###{}", ExceptionUtil.stacktraceToString(ioException));
} }
return new FileVO(height,width); return new FileVO(height, width);
} }
/** /**
* 获取文件尺寸 * 获取文件尺寸
*/ */
public static FileVO getFileSize(InputStream inputStream) { public static FileVO getFileSize(InputStream inputStream) {
int width = 0; int width = 0;
int height = 0; int height = 0;
try{ try {
// 图片对象 // 图片对象
BufferedImage bufferedImage = ImageIO.read(inputStream); BufferedImage bufferedImage = ImageIO.read(inputStream);
// 宽度 // 宽度
width = bufferedImage.getWidth(); width = bufferedImage.getWidth();
// 高度 // 高度
height = bufferedImage.getHeight(); height = bufferedImage.getHeight();
}catch (IOException ioException){ } catch (IOException ioException) {
log.error("获取文件尺寸异常###{}", ExceptionUtil.stacktraceToString(ioException)); log.error("获取文件尺寸异常###{}", ExceptionUtil.stacktraceToString(ioException));
} }
return new FileVO(height,width); return new FileVO(height, width);
} }
/** /**
* 获取远程文件流 * 获取远程文件流
*/ */
public static InputStream getOriginFile(String path) { public static InputStream getOriginFile(String path) {
try{ try {
//远程 //远程
URL url = new URL(path); URL url = new URL(path);
return url.openStream(); return url.openStream();
}catch (IOException ioException){ } catch (IOException ioException) {
log.error("获取文件尺寸异常###{}###path##{}", ExceptionUtil.stacktraceToString(ioException),path); log.error("获取文件尺寸异常###{}###path##{}", ExceptionUtil.stacktraceToString(ioException), path);
throw new BusinessException("get file is failed!"); throw new BusinessException("get.file.failed");
} }
} }
/** /**
* 将文件名解析成文件的上传路径 * 将文件名解析成文件的上传路径
*/ */
@@ -191,7 +186,7 @@ public class FileUtil extends cn.hutool.core.io.FileUtil {
Date date = new Date(); Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddhhmmssS"); SimpleDateFormat format = new SimpleDateFormat("yyyyMMddhhmmssS");
String suffix = getExtensionName(file.getOriginalFilename()); String suffix = getExtensionName(file.getOriginalFilename());
String nowStr = format.format(date)+"-" ; String nowStr = format.format(date) + "-";
try { try {
String fileName = file.getOriginalFilename(); String fileName = file.getOriginalFilename();
String fileSuffix = fileName.substring(fileName.lastIndexOf(".")); String fileSuffix = fileName.substring(fileName.lastIndexOf("."));
@@ -212,6 +207,7 @@ public class FileUtil extends cn.hutool.core.io.FileUtil {
} }
return null; return null;
} }
/** /**
* 将文件名解析成文件的上传路径 * 将文件名解析成文件的上传路径
*/ */
@@ -219,7 +215,7 @@ public class FileUtil extends cn.hutool.core.io.FileUtil {
Date date = new Date(); Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddhhmmssS"); SimpleDateFormat format = new SimpleDateFormat("yyyyMMddhhmmssS");
String suffix = getExtensionName(file.getOriginalFilename()); String suffix = getExtensionName(file.getOriginalFilename());
String nowStr = format.format(date)+"-" ; String nowStr = format.format(date) + "-";
try { try {
String fileName = file.getOriginalFilename(); String fileName = file.getOriginalFilename();
String path = filePath + fileName; String path = filePath + fileName;
@@ -250,6 +246,7 @@ public class FileUtil extends cn.hutool.core.io.FileUtil {
} }
return false; return false;
} }
/** /**
* 获取指定文件夹下所有文件,不含文件夹里的文件 * 获取指定文件夹下所有文件,不含文件夹里的文件
* *
@@ -257,7 +254,7 @@ public class FileUtil extends cn.hutool.core.io.FileUtil {
* @return * @return
*/ */
public static List<File> getAllFile(String dirFilePath) { public static List<File> getAllFile(String dirFilePath) {
if (StrUtil.isBlank(dirFilePath)){ if (StrUtil.isBlank(dirFilePath)) {
return null; return null;
} }
return getAllFile(new File(dirFilePath)); return getAllFile(new File(dirFilePath));
@@ -271,11 +268,11 @@ public class FileUtil extends cn.hutool.core.io.FileUtil {
*/ */
public static List<File> getAllFile(File dirFile) { public static List<File> getAllFile(File dirFile) {
// 如果文件夹不存在或着不是文件夹,则返回 null // 如果文件夹不存在或着不是文件夹,则返回 null
if (Objects.isNull(dirFile) || !dirFile.exists() || dirFile.isFile()){ if (Objects.isNull(dirFile) || !dirFile.exists() || dirFile.isFile()) {
return null; return null;
} }
File[] childrenFiles = dirFile.listFiles(); File[] childrenFiles = dirFile.listFiles();
if (Objects.isNull(childrenFiles) || childrenFiles.length == 0){ if (Objects.isNull(childrenFiles) || childrenFiles.length == 0) {
return null; return null;
} }
List<File> files = new ArrayList<>(); List<File> files = new ArrayList<>();
@@ -288,7 +285,7 @@ public class FileUtil extends cn.hutool.core.io.FileUtil {
else { else {
// 如果是文件夹,则将其内部文件添加进结果集合 // 如果是文件夹,则将其内部文件添加进结果集合
List<File> cFiles = getAllFile(childFile); List<File> cFiles = getAllFile(childFile);
if (Objects.isNull(cFiles) || cFiles.isEmpty()){ if (Objects.isNull(cFiles) || cFiles.isEmpty()) {
continue; continue;
} }
files.addAll(cFiles); files.addAll(cFiles);
@@ -297,5 +294,20 @@ public class FileUtil extends cn.hutool.core.io.FileUtil {
return files; return files;
} }
// 判断文件是否存在
public static boolean isFileExists(String filePath) {
File file = new File(filePath);
return file.exists() && file.isFile();
}
// 根据路径获取文件
public static File getFile(String filePath) {
File file = new File(filePath);
if (file.exists() && file.isFile()) {
return file;
} else {
return null;
}
}
} }

View File

@@ -14,10 +14,11 @@ import java.io.IOException;
@Slf4j @Slf4j
public class ImageUtil { public class ImageUtil {
static BufferedImage bufferedImage; static BufferedImage bufferedImage;
static int r,g,b; // 分别用来存放获取的RGB值 static int r, g, b; // 分别用来存放获取的RGB值
static int heigth,width; static int heigth, width;
static int id = 0; static int id = 0;
public static void find(){
public static void find() {
// 读取要操作的图片,这里的图片路径请改成自己要处理的图片 // 读取要操作的图片,这里的图片路径请改成自己要处理的图片
try { try {
bufferedImage = ImageIO.read(new File("D:\\programManager\\private\\curtain\\curtain\\WechatIMG170.png")); bufferedImage = ImageIO.read(new File("D:\\programManager\\private\\curtain\\curtain\\WechatIMG170.png"));
@@ -27,16 +28,16 @@ public class ImageUtil {
// 获取图片的宽和高; // 获取图片的宽和高;
heigth = bufferedImage.getHeight(); heigth = bufferedImage.getHeight();
width = bufferedImage.getHeight(); width = bufferedImage.getHeight();
System.out.println("heigth = "+heigth +", width ="+width); System.out.println("heigth = " + heigth + ", width =" + width);
// 采用行优先遍历,先遍历宽 // 采用行优先遍历,先遍历宽
for (int y = 0; y < heigth; y++) { for (int y = 0; y < heigth; y++) {
for (int x = 0; x < width; x++) { for (int x = 0; x < width; x++) {
id++; id++;
Color color = new Color(bufferedImage.getRGB(x,y)); Color color = new Color(bufferedImage.getRGB(x, y));
r = color.getRed(); r = color.getRed();
g = color.getGreen(); g = color.getGreen();
b = color.getBlue(); b = color.getBlue();
System.out.println("此时的id为 "+ id+ " R = "+ r + ", G = "+g+", B ="+b); System.out.println("此时的id为 " + id + " R = " + r + ", G = " + g + ", B =" + b);
} }
} }
} }

View File

@@ -1,11 +1,7 @@
package com.ai.da.common.utils; package com.ai.da.common.utils;
import com.ai.da.mapper.entity.Collection;
import com.ai.da.mapper.entity.SysFile;
import com.ai.da.model.vo.SysFileVO; import com.ai.da.model.vo.SysFileVO;
import com.google.common.cache.*; import com.google.common.cache.*;
import com.google.common.collect.Lists;
import io.swagger.models.auth.In;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList; import java.util.ArrayList;
@@ -25,14 +21,14 @@ public final class LocalCacheUtils {
* token * token
*/ */
private static LoadingCache<String, String> tokenCache = loadTokenCache(); private static LoadingCache<String, String> tokenCache = loadTokenCache();
/** /**
* * 缓存接口这里是LoadingCacheLoadingCache在缓存项不存在时可以自动加载缓存
*缓存接口这里是LoadingCacheLoadingCache在缓存项不存在时可以自动加载缓存
*/ */
private static LoadingCache<String, String> loadTokenCache(){ private static LoadingCache<String, String> loadTokenCache() {
LoadingCache<String, String> tokenCache = CacheBuilder.newBuilder() LoadingCache<String, String> tokenCache = CacheBuilder.newBuilder()
.concurrencyLevel(10) .concurrencyLevel(10)
.expireAfterWrite(24*100, TimeUnit.HOURS) .expireAfterWrite(24 * 100, TimeUnit.HOURS)
.initialCapacity(100) .initialCapacity(100)
.maximumSize(10000) .maximumSize(10000)
.recordStats() .recordStats()
@@ -44,6 +40,7 @@ public final class LocalCacheUtils {
}); });
return tokenCache; return tokenCache;
} }
/** /**
* 邮箱,短信验证码 * 邮箱,短信验证码
*/ */
@@ -51,7 +48,7 @@ public final class LocalCacheUtils {
//设置并发级别为5并发级别是指可以同时写缓存的线程数 //设置并发级别为5并发级别是指可以同时写缓存的线程数
.concurrencyLevel(10) .concurrencyLevel(10)
//设置写缓存后10分钟过期,防止跨洲发送慢失效问题 //设置写缓存后10分钟过期,防止跨洲发送慢失效问题
.expireAfterWrite(60*30, TimeUnit.SECONDS) .expireAfterWrite(60 * 30, TimeUnit.SECONDS)
//刷新机制 每隔一定时间刷新缓存loader 只有调用get具体的操作才生效(懒加载) 不设置则不刷新 //刷新机制 每隔一定时间刷新缓存loader 只有调用get具体的操作才生效(懒加载) 不设置则不刷新
// .refreshAfterWrite(60, TimeUnit.SECONDS) // .refreshAfterWrite(60, TimeUnit.SECONDS)
//设置缓存容器的初始容量为100 //设置缓存容器的初始容量为100
@@ -75,7 +72,7 @@ public final class LocalCacheUtils {
//设置并发级别为5并发级别是指可以同时写缓存的线程数 //设置并发级别为5并发级别是指可以同时写缓存的线程数
.concurrencyLevel(10) .concurrencyLevel(10)
//设置写缓存后一天过期 //设置写缓存后一天过期
.expireAfterWrite(60*60*24, TimeUnit.SECONDS) .expireAfterWrite(60 * 60 * 24, TimeUnit.SECONDS)
//设置缓存容器的初始容量为100 //设置缓存容器的初始容量为100
.initialCapacity(100) .initialCapacity(100)
//设置缓存最大容量50000超过50000之后就会按照LRU最近虽少使用算法来移除缓存项 //设置缓存最大容量50000超过50000之后就会按照LRU最近虽少使用算法来移除缓存项
@@ -96,7 +93,7 @@ public final class LocalCacheUtils {
//设置并发级别为5并发级别是指可以同时写缓存的线程数 //设置并发级别为5并发级别是指可以同时写缓存的线程数
.concurrencyLevel(10) .concurrencyLevel(10)
//设置写缓存后一天过期 //设置写缓存后一天过期
.expireAfterWrite(60*60*24, TimeUnit.SECONDS) .expireAfterWrite(60 * 60 * 24, TimeUnit.SECONDS)
//设置缓存容器的初始容量为100 //设置缓存容器的初始容量为100
.initialCapacity(100) .initialCapacity(100)
//设置缓存最大容量50000超过50000之后就会按照LRU最近虽少使用算法来移除缓存项 //设置缓存最大容量50000超过50000之后就会按照LRU最近虽少使用算法来移除缓存项
@@ -118,7 +115,7 @@ public final class LocalCacheUtils {
//设置并发级别为5并发级别是指可以同时写缓存的线程数 //设置并发级别为5并发级别是指可以同时写缓存的线程数
.concurrencyLevel(10) .concurrencyLevel(10)
//设置写缓存后一天过期 //设置写缓存后一天过期
.expireAfterWrite(60*60*24, TimeUnit.SECONDS) .expireAfterWrite(60 * 60 * 24, TimeUnit.SECONDS)
//设置缓存容器的初始容量为15000 //设置缓存容器的初始容量为15000
.initialCapacity(15000) .initialCapacity(15000)
//设置缓存最大容量50000超过50000之后就会按照LRU最近虽少使用算法来移除缓存项 //设置缓存最大容量50000超过50000之后就会按照LRU最近虽少使用算法来移除缓存项
@@ -140,7 +137,7 @@ public final class LocalCacheUtils {
//设置并发级别为10并发级别是指可以同时写缓存的线程数 //设置并发级别为10并发级别是指可以同时写缓存的线程数
.concurrencyLevel(10) .concurrencyLevel(10)
//设置写缓存后5分钟过期 //设置写缓存后5分钟过期
.expireAfterWrite(60*5, TimeUnit.SECONDS) .expireAfterWrite(60 * 5, TimeUnit.SECONDS)
//设置缓存容器的初始容量为100 //设置缓存容器的初始容量为100
.initialCapacity(5) .initialCapacity(5)
//设置缓存最大容量50000超过50000之后就会按照LRU最近虽少使用算法来移除缓存项 //设置缓存最大容量50000超过50000之后就会按照LRU最近虽少使用算法来移除缓存项
@@ -162,7 +159,7 @@ public final class LocalCacheUtils {
//设置并发级别为5并发级别是指可以同时写缓存的线程数 //设置并发级别为5并发级别是指可以同时写缓存的线程数
.concurrencyLevel(20) .concurrencyLevel(20)
//设置写缓存后30天过期 //设置写缓存后30天过期
.expireAfterWrite(60*60*24*30, TimeUnit.SECONDS) .expireAfterWrite(60 * 60 * 24 * 30, TimeUnit.SECONDS)
//设置缓存容器的初始容量为100 //设置缓存容器的初始容量为100
.initialCapacity(5) .initialCapacity(5)
//设置缓存最大容量50000超过50000之后就会按照LRU最近虽少使用算法来移除缓存项 //设置缓存最大容量50000超过50000之后就会按照LRU最近虽少使用算法来移除缓存项
@@ -176,8 +173,10 @@ public final class LocalCacheUtils {
return 0; return 0;
} }
}); });
/** /**
* 添加token本地缓存 * 添加token本地缓存
*
* @param key * @param key
* @param value * @param value
*/ */
@@ -187,6 +186,7 @@ public final class LocalCacheUtils {
/** /**
* 获取token本地缓存 * 获取token本地缓存
*
* @param key * @param key
* @return * @return
*/ */
@@ -202,8 +202,10 @@ public final class LocalCacheUtils {
} }
return null; return null;
} }
/** /**
* 删除token本地缓存(登出) * 删除token本地缓存(登出)
*
* @param key * @param key
* @return * @return
*/ */
@@ -214,8 +216,10 @@ public final class LocalCacheUtils {
log.error("delTokenCache方法错误", e); log.error("delTokenCache方法错误", e);
} }
} }
/** /**
* 添加验证码本地缓存 * 添加验证码本地缓存
*
* @param key * @param key
* @param value * @param value
*/ */
@@ -225,6 +229,7 @@ public final class LocalCacheUtils {
/** /**
* 获取验证码本地缓存 * 获取验证码本地缓存
*
* @param key * @param key
* @return * @return
*/ */
@@ -240,8 +245,10 @@ public final class LocalCacheUtils {
} }
return null; return null;
} }
/** /**
* 添加系统文本地缓存 * 添加系统文本地缓存
*
* @param key * @param key
* @param sysFile * @param sysFile
*/ */
@@ -251,6 +258,7 @@ public final class LocalCacheUtils {
/** /**
* 获取系统文件本地缓存 * 获取系统文件本地缓存
*
* @param key * @param key
* @return * @return
*/ */
@@ -263,8 +271,10 @@ public final class LocalCacheUtils {
} }
return null; return null;
} }
/** /**
* 清除所有系统文件本地缓存 * 清除所有系统文件本地缓存
*
* @return * @return
*/ */
public static void clearAllSysFileCache() { public static void clearAllSysFileCache() {
@@ -274,8 +284,10 @@ public final class LocalCacheUtils {
log.error("clearAllSysFileCache方法错误", e); log.error("clearAllSysFileCache方法错误", e);
} }
} }
/** /**
* 添加系统文本地缓存,通过类型 * 添加系统文本地缓存,通过类型
*
* @param level1Type * @param level1Type
* @param sysFileList * @param sysFileList
*/ */
@@ -285,6 +297,7 @@ public final class LocalCacheUtils {
/** /**
* 获取系统文件本地缓存 * 获取系统文件本地缓存
*
* @param level2Type * @param level2Type
* @return * @return
*/ */
@@ -296,8 +309,10 @@ public final class LocalCacheUtils {
} }
return null; return null;
} }
/** /**
* 清除所有系统文件本地缓存 * 清除所有系统文件本地缓存
*
* @return * @return
*/ */
public static void clearAllSysFileCacheByLevel2Type() { public static void clearAllSysFileCacheByLevel2Type() {
@@ -307,8 +322,10 @@ public final class LocalCacheUtils {
log.error("clearAllSysFileCacheByLevel2Type方法错误", e); log.error("clearAllSysFileCacheByLevel2Type方法错误", e);
} }
} }
/** /**
* 添加系统文件范围最大最小值本地缓存 * 添加系统文件范围最大最小值本地缓存
*
* @param key * @param key
* @param value * @param value
*/ */
@@ -318,6 +335,7 @@ public final class LocalCacheUtils {
/** /**
* 获取系统文件范围最大最小值本地缓存 * 获取系统文件范围最大最小值本地缓存
*
* @param key * @param key
* @return * @return
*/ */
@@ -333,8 +351,10 @@ public final class LocalCacheUtils {
} }
return null; return null;
} }
/** /**
* 清除所有系统文件范围最大最小值本地缓存 * 清除所有系统文件范围最大最小值本地缓存
*
* @return * @return
*/ */
public static void clearAllMaxMinValueCache() { public static void clearAllMaxMinValueCache() {
@@ -344,8 +364,10 @@ public final class LocalCacheUtils {
log.error("clearAllMaxMinValueCache方法错误", e); log.error("clearAllMaxMinValueCache方法错误", e);
} }
} }
/** /**
* 添加系design文件进度统计 * 添加系design文件进度统计
*
* @param key * @param key
* @param value * @param value
*/ */
@@ -355,6 +377,7 @@ public final class LocalCacheUtils {
/** /**
* 获取design文件进度统计 * 获取design文件进度统计
*
* @param key * @param key
* @return * @return
*/ */
@@ -367,8 +390,10 @@ public final class LocalCacheUtils {
} }
return null; return null;
} }
/** /**
* 进度统计完后 删除进度 * 进度统计完后 删除进度
*
* @param key * @param key
* @return * @return
*/ */
@@ -382,6 +407,7 @@ public final class LocalCacheUtils {
/** /**
* 设置本次接口流量数 * 设置本次接口流量数
*
* @param key * @param key
* @param value * @param value
*/ */
@@ -391,6 +417,7 @@ public final class LocalCacheUtils {
/** /**
* 获取本次接口流量数 * 获取本次接口流量数
*
* @param key * @param key
* @return * @return
*/ */
@@ -403,4 +430,49 @@ public final class LocalCacheUtils {
return null; return null;
} }
/**
* 预签名URL缓存
*/
private static LoadingCache<String, String> presignedUrlCache = CacheBuilder.newBuilder()
.concurrencyLevel(10)
.expireAfterWrite((24 * 60 - 1), TimeUnit.MINUTES)
.initialCapacity(100)
.maximumSize(10000)
.recordStats()
.build(new CacheLoader<String, String>() {
@Override
public String load(String key) throws Exception {
return "null";
}
});
/**
* 添加预签名URL到缓存
*
* @param key URL的唯一标识
* @param value 预签名URL
*/
public static void setPresignedUrlCache(String key, String value) {
presignedUrlCache.put(key, value);
}
/**
* 获取预签名URL
*
* @param key URL的唯一标识
* @return 预签名URL如果不存在则返回null
*/
public static String getPresignedUrlCache(String key) {
try {
String value = presignedUrlCache.get(key);
if ("null".equals(value)) {
return null;
}
return value;
} catch (ExecutionException e) {
log.error("getPresignedUrlCache方法错误", e);
}
return null;
}
} }

View File

@@ -58,6 +58,7 @@ public class MD5Utils {
} }
return md5; return md5;
} }
/** /**
* MD5加密文件 * MD5加密文件
* *
@@ -74,6 +75,16 @@ public class MD5Utils {
return md5; return md5;
} }
public static String encryptFile(InputStream inputStream) {
String md5 = null;
try {
md5 = DigestUtils.md5DigestAsHex(inputStream);
} catch (IOException ioException) {
log.error("文件InputStream md5加密异常ioException##{}", ExceptionUtil.getThrowableList(ioException));
}
return md5;
}
public static void main(String[] args) throws FileNotFoundException, IOException { public static void main(String[] args) throws FileNotFoundException, IOException {
File file1 = new File("/Users/yanglei/Documents/阳磊日报2019-04-23.numbers"); File file1 = new File("/Users/yanglei/Documents/阳磊日报2019-04-23.numbers");
File file2 = new File("/Users/yanglei/Documents/7777.numbers"); File file2 = new File("/Users/yanglei/Documents/7777.numbers");

View File

@@ -0,0 +1,489 @@
package com.ai.da.common.utils;
import com.ai.da.common.config.exception.BusinessException;
import com.ai.da.mapper.primary.entity.ObjectItem;
import io.minio.*;
import io.minio.errors.MinioException;
import io.minio.http.Method;
import io.minio.messages.DeleteError;
import io.minio.messages.DeleteObject;
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.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Base64;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
* @description minio工具类
* @version3.0
*/
@Slf4j
@Component
public class MinioUtil {
@Autowired
private MinioClient minioClient;
/**
* description: 判断bucket是否存在不存在则创建
*
* @return: void
*/
public void existBucket(String name) {
try {
boolean exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(name).build());
if (!exists) {
minioClient.makeBucket(MakeBucketArgs.builder().bucket(name).build());
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 创建存储bucket
*
* @param bucketName 存储bucket名称
* @return Boolean
*/
public Boolean makeBucket(String bucketName) {
try {
minioClient.makeBucket(MakeBucketArgs.builder()
.bucket(bucketName)
.build());
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
/**
* 删除存储bucket
*
* @param bucketName 存储bucket名称
* @return Boolean
*/
public Boolean removeBucket(String bucketName) {
try {
minioClient.removeBucket(RemoveBucketArgs.builder()
.bucket(bucketName)
.build());
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
/**
* description: 上传文件
*
* @param bucketName
* @param path
* @param multipartFile
* @return: java.lang.String
*/
public List<String> uploadBatch(String bucketName, String path, MultipartFile[] multipartFile) {
List<String> names = new ArrayList<>(multipartFile.length);
for (MultipartFile file : multipartFile) {
String fileName = file.getOriginalFilename();
String[] split = fileName.split("\\.");
if (split.length > 1) {
fileName = path + "/" + UUID.randomUUID() + "." + split[1];
} else {
fileName = path + "/" + UUID.randomUUID();
}
InputStream in = null;
try {
in = file.getInputStream();
minioClient.putObject(PutObjectArgs.builder()
.bucket(bucketName)
.object(fileName)
.stream(in, in.available(), -1)
.contentType(file.getContentType())
.build()
);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
names.add(fileName);
}
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: 上传文件
*
* @param bucketName
* @param path
* @param file
* @return: java.lang.String
*/
public String upload(String bucketName, String path, MultipartFile file) {
String fileName = file.getOriginalFilename();
String[] split = fileName.split("\\.");
if (split.length > 1) {
fileName = path + "/" + UUID.randomUUID() + "." + split[split.length - 1];
} else {
fileName = path + "/" + UUID.randomUUID();
}
InputStream in = null;
try {
in = file.getInputStream();
minioClient.putObject(PutObjectArgs.builder()
.bucket(bucketName)
.object(fileName)
.stream(in, in.available(), -1)
.contentType(file.getContentType())
.build()
);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return bucketName + "/" + fileName;
}
public String upload(String bucketName, String path, MultipartFile file, String copy) {
InputStream in = null;
try {
in = file.getInputStream();
minioClient.putObject(PutObjectArgs.builder()
.bucket(bucketName)
.object(path)
.stream(in, in.available(), -1)
.contentType(file.getContentType())
.build()
);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return bucketName + "/" + path;
}
// public String upload(String bucketName, String path, File file) {
// InputStream in = null;
// try {
// in = new FileInputStream(file);
// minioClient.putObject(PutObjectArgs.builder()
// .bucket(bucketName)
// .object(path)
// .stream(in, in.available(), -1)
// .contentType(file.getContentType())
// .build()
// );
// } catch (Exception e) {
// e.printStackTrace();
// } finally {
// if (in != null) {
// try {
// in.close();
// } catch (IOException e) {
// e.printStackTrace();
// }
// }
// }
// return fileName;
// }
public InputStream download(String bucketName, String objectName) throws MinioException, IOException {
try {
return minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(objectName).build());
} catch (InvalidKeyException e) {
throw new RuntimeException(e);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}
public InputStream download(String path) throws MinioException, IOException {
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);
}
/**
* description: 下载文件
*
* @param path
* @param bucketName
* @return: org.springframework.http.ResponseEntity<byte [ ]>
*/
// public ResponseEntity<byte[]> download(String path, String bucketName) {
// ResponseEntity<byte[]> responseEntity = null;
// InputStream in = null;
// ByteArrayOutputStream out = null;
// try {
// in = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(path).build());
// out = new ByteArrayOutputStream();
// IOUtils.copy(in, out);
// //封装返回值
// byte[] bytes = out.toByteArray();
// HttpHeaders headers = new HttpHeaders();
// try {
// headers.add("Content-Disposition", "attachment;filename=" + URLEncoder.encode(path, "UTF-8"));
// } catch (UnsupportedEncodingException e) {
// e.printStackTrace();
// }
// headers.setContentLength(bytes.length);
// headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
// headers.setAccessControlExposeHeaders(Arrays.asList("*"));
// responseEntity = new ResponseEntity<byte[]>(bytes, headers, HttpStatus.OK);
// } catch (Exception e) {
// e.printStackTrace();
// } finally {
// try {
// if (in != null) {
// try {
// in.close();
// } catch (IOException e) {
// e.printStackTrace();
// }
// }
// if (out != null) {
// out.close();
// }
// } catch (IOException e) {
// e.printStackTrace();
// }
// }
// return responseEntity;
// }
/**
* 查看文件对象
*
* @param bucketName 存储bucket名称
* @return 存储bucket内文件对象信息
*/
public List<ObjectItem> listObjects(String bucketName) {
Iterable<Result<Item>> results = minioClient.listObjects(
ListObjectsArgs.builder().bucket(bucketName).build());
List<ObjectItem> objectItems = new ArrayList<>();
try {
for (Result<Item> result : results) {
Item item = result.get();
ObjectItem objectItem = new ObjectItem();
objectItem.setObjectName(item.objectName());
objectItem.setSize(item.size());
objectItems.add(objectItem);
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
return objectItems;
}
/**
* 批量删除文件对象
*
* @param bucketName 存储bucket名称
* @param objects 对象名称集合
*/
public Iterable<Result<DeleteError>> removeObjects(String bucketName, List<String> objects) {
List<DeleteObject> dos = objects.stream().map(e -> new DeleteObject(e)).collect(Collectors.toList());
Iterable<Result<DeleteError>> results = minioClient.removeObjects(RemoveObjectsArgs.builder().bucket(bucketName).objects(dos).build());
return results;
}
public void deleteObject(String bucketName, String objectName) {
try {
minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(objectName).build());
System.out.println("Object " + objectName + " successfully removed from bucket " + bucketName);
} catch (Exception e) {
e.printStackTrace();
System.err.println("Error while removing object " + objectName + " from bucket " + bucketName + ": " + e.getMessage());
}
}
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);
}
/**
* 获取文件的临时URL
*
* @param bucketName 存储桶名称
* @param fileName 文件名
* @param expiry 过期时间(单位:分)
* @return 文件的临时URL如果出现异常则返回null
*/
public String getPreSignedUrl(String bucketName, String fileName, int expiry) {
try {
return minioClient.getPresignedObjectUrl(
GetPresignedObjectUrlArgs.builder()
.bucket(bucketName)
.object(fileName)
.expiry(expiry, TimeUnit.MINUTES)
.method(Method.GET)
.build()
);
} catch (MinioException | InvalidKeyException | IOException | NoSuchAlgorithmException e) {
e.printStackTrace();
throw new BusinessException(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 = getPreSignedUrl(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 = getPreSignedUrl(bucketName, fileName, expiry);
LocalCacheUtils.setPresignedUrlCache(path, presignedUrl);
return presignedUrl;
} else {
return LocalCacheUtils.getPresignedUrlCache(path);
}
}
/**
* 将桶名、文件名从url中分离出来
*
* @param url 带桶名、文件名的url
* @param expiry 图片过期时间
* @return 可以直接访问的minio图片地址
*/
public String splitThenGetPreviewUrl(String url, int expiry) {
String[] parts = url.split("/");
String bucketName = parts[0];
StringBuilder fileName = new StringBuilder();
for (int i = 1; i < parts.length; i++) {
fileName.append(parts[i]);
if (i != parts.length - 1) {
fileName.append("/");
}
}
return getPreSignedUrl(bucketName, String.valueOf(fileName), expiry);
}
public boolean doesObjectExist(String bucketName, String objectName) {
try {
minioClient.statObject(
StatObjectArgs.builder()
.bucket(bucketName)
.object(objectName)
.build()
);
return true;
} catch (Exception e) {
// 如果发生异常,说明文件不存在或者出现了其他错误
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
}
}
}

View File

@@ -45,24 +45,20 @@ public class MultiReadHttpServletRequest extends HttpServletRequestWrapper {
while ((line = reader.readLine()) != null) { while ((line = reader.readLine()) != null) {
sb.append(line); sb.append(line);
} }
} } catch (IOException e) {
catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} } finally {
finally {
if (inputStream != null) { if (inputStream != null) {
try { try {
inputStream.close(); inputStream.close();
} } catch (IOException e) {
catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
if (reader != null) { if (reader != null) {
try { try {
reader.close(); reader.close();
} } catch (IOException e) {
catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
@@ -72,6 +68,7 @@ public class MultiReadHttpServletRequest extends HttpServletRequestWrapper {
/** /**
* 复制输入流 * 复制输入流
*
* @param inputStream 请求输入流 * @param inputStream 请求输入流
* @return 复制出来的输入流 * @return 复制出来的输入流
*/ */
@@ -84,8 +81,7 @@ public class MultiReadHttpServletRequest extends HttpServletRequestWrapper {
byteArrayOutputStream.write(buffer, 0, len); byteArrayOutputStream.write(buffer, 0, len);
} }
byteArrayOutputStream.flush(); byteArrayOutputStream.flush();
} } catch (IOException e) {
catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
return new ByteArrayInputStream(byteArrayOutputStream.toByteArray()); return new ByteArrayInputStream(byteArrayOutputStream.toByteArray());

View File

@@ -1,4 +1,5 @@
package com.ai.da.common.utils; package com.ai.da.common.utils;
import java.util.*; import java.util.*;
import java.lang.reflect.Field; import java.lang.reflect.Field;

View File

@@ -0,0 +1,46 @@
package com.ai.da.common.utils;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
/**
* 订单号工具类
*
* @author qy
* @since 1.0
*/
public class OrderNoUtils {
/**
* 获取订单编号
* @return
*/
public static String getOrderNo() {
return "ORDER_" + getNo();
}
/**
* 获取退款单编号
* @return
*/
public static String getRefundNo() {
return "REFUND_" + getNo();
}
/**
* 获取编号
* @return
*/
public static String getNo() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
String newDate = sdf.format(new Date());
String result = "";
Random random = new Random();
for (int i = 0; i < 3; i++) {
result += random.nextInt(10);
}
return newDate + result;
}
}

View File

@@ -0,0 +1,31 @@
package com.ai.da.common.utils;
public class PantoneUtils {
public static int[] rgbToHsv(int[] rgb) {
//切割rgb数组
int red = rgb[0];
int green = rgb[1];
int blue = rgb[2];
float r = (float) red / 255;
float g = (float) green / 255;
float b = (float) blue / 255;
float min = Math.min(Math.min(r, g), b);
float[] hsv = {60, 0, Math.max(Math.max(r, g), b)};
hsv[1] = (hsv[2] == 0) ? 0 : 1 - min / hsv[2];
hsv[0] = 60 * (
(hsv[2] == min) ? Float.NaN :
(hsv[2] == r) ? (g - b) / (hsv[2] - min) + ((g < b) ? 6 : 0) :
(hsv[2] == g) ? (b - r) / (hsv[2] - min) + 2 :
(r - g) / (hsv[2] - min) + 4
);
return new int[]{Math.round(hsv[0]), Math.round(hsv[1] * 100), Math.round(hsv[2] * 100)};
}
}

View File

@@ -35,8 +35,9 @@ public class RandomsUtil {
* @param randomEnd * @param randomEnd
*/ */
public static String generateVerifyCode(Long randomStart, Long randomEnd) { public static String generateVerifyCode(Long randomStart, Long randomEnd) {
return String.valueOf(RandomUtil.randomLong(randomStart,randomEnd)); return String.valueOf(RandomUtil.randomLong(randomStart, randomEnd));
} }
/** /**
* 生成随机系统图片 * 生成随机系统图片
* *
@@ -44,7 +45,11 @@ public class RandomsUtil {
* @param randomEnd 小于最大值 * @param randomEnd 小于最大值
*/ */
public static Long randomSysFile(Long randomStart, Long randomEnd) { public static Long randomSysFile(Long randomStart, Long randomEnd) {
return RandomUtil.randomLong(randomStart,randomEnd); return RandomUtil.randomLong(randomStart, randomEnd);
}
public static Integer randomSysFile(Integer randomEnd) {
return RandomUtil.randomInt(randomEnd);
} }

View File

@@ -13,36 +13,36 @@ import java.util.concurrent.TimeUnit;
**/ **/
public final class RedisCacheUtils { public final class RedisCacheUtils {
private static RedisTemplate<String, Object> getRedisTemplate(){ private static RedisTemplate<String, Object> getRedisTemplate() {
return SpringUtils.getBean("redisTemplate"); return SpringUtils.getBean("redisTemplate");
} }
private static <T> RedisTemplate<String, T> getRedisTemplate(Class<T> clazz){ private static <T> RedisTemplate<String, T> getRedisTemplate(Class<T> clazz) {
return SpringUtils.getBean("redisTemplate"); return SpringUtils.getBean("redisTemplate");
} }
private static <T> RedisTemplate<String, List<T>> getListRedisTemplate(Class<T> clazz){ private static <T> RedisTemplate<String, List<T>> getListRedisTemplate(Class<T> clazz) {
return SpringUtils.getBean("redisTemplate"); return SpringUtils.getBean("redisTemplate");
} }
public static <T> T get(String key, Class<T> clazz){ public static <T> T get(String key, Class<T> clazz) {
return getRedisTemplate(clazz).opsForValue().get(key); return getRedisTemplate(clazz).opsForValue().get(key);
} }
public static <T> List<T> getList(String key, Class<T> clazz){ public static <T> List<T> getList(String key, Class<T> clazz) {
return getListRedisTemplate(clazz).opsForValue().get(key); return getListRedisTemplate(clazz).opsForValue().get(key);
} }
public static void set(String key, Object value){ public static void set(String key, Object value) {
getRedisTemplate().opsForValue().set(key, value); getRedisTemplate().opsForValue().set(key, value);
} }
public static void set(String key, Object value, long time, TimeUnit unit){ public static void set(String key, Object value, long time, TimeUnit unit) {
getRedisTemplate().opsForValue().set(key, value, time, unit); getRedisTemplate().opsForValue().set(key, value, time, unit);
} }
public static boolean delete(String key){ public static boolean delete(String key) {
if(StrUtil.isNotEmpty(key)){ if (StrUtil.isNotEmpty(key)) {
return Boolean.TRUE.equals(getRedisTemplate().delete(key)); return Boolean.TRUE.equals(getRedisTemplate().delete(key));
} }
return false; return false;

View File

@@ -0,0 +1,219 @@
package com.ai.da.common.utils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@Slf4j
@Component
public class RedisUtil {
@Resource
private RedisTemplate<String, String> redisTemplate;
public Boolean hasKey(String key){
return redisTemplate.hasKey(key);
}
//- - - - - - - - - - - - - - - - - - - - - ZSet类型 - - - - - - - - - - - - - - - - - - - -
/**
* 向ZSet中添加元素
*/
public void addToZSet(String key, String value, Double score) {
redisTemplate.opsForZSet().add(key, value, score);
}
/**
* 从ZSet中删除元素
*/
public void removeFromZSet(String key, String value) {
redisTemplate.opsForZSet().remove(key, value);
}
/**
* 获取指定元素的当前排列顺序
*/
public Long getRank(String key, String value) {
return redisTemplate.opsForZSet().rank(key, value);
}
/**
* 获取当前ZSet中的最大score
*/
public Double getMaxScore(String key) {
Set<ZSetOperations.TypedTuple<String>> set = redisTemplate.opsForZSet().reverseRangeWithScores(key, 0, 0);
if (!CollectionUtils.isEmpty(set)) {
Double score = set.iterator().next().getScore();
return score + 1.0;
} else {
return 1.0;
}
}
/**
* 判断元素是否存在
*/
public Boolean isElementExistsInZSet(String key, String value) {
return redisTemplate.opsForZSet().score(key, value) != null;
}
/**
* 获取当前ZSet中数据量的总和
*/
public Long getZSetTotalCount(String key) {
return redisTemplate.opsForZSet().zCard(key);
}
public Set<String> getZSetTotalData(String key){
return redisTemplate.opsForZSet().range(key, 0, -1);
}
//- - - - - - - - - - - - - - - - - - - - - set类型 - - - - - - - - - - - - - - - - - - - -
/**
* 将数据放入set缓存
*/
public void addToSet(String key, String value) {
redisTemplate.opsForSet().add(key, value);
}
/**
* 弹出变量中的元素
*/
public void removeFromSet(String key, String value) {
redisTemplate.opsForSet().remove(key, value);
}
/**
* 检查给定的元素是否在变量中。
*/
public Boolean isElementExistsInSet(String key, String obj) {
return redisTemplate.opsForSet().isMember(key, obj);
}
//- - - - - - - - - - - - - - - - - - - - - hash类型 - - - - - - - - - - - - - - - - - - - -
/**
* 加入缓存
*/
public void addToMap(String key, Map<String, String> map) {
redisTemplate.opsForHash().putAll(key, map);
}
/**
* 验证指定 key 下 有没有指定的 hashkey
*/
public Boolean isElementExistsInMap(String key, String hashKey) {
return redisTemplate.opsForHash().hasKey(key, hashKey);
}
/**
* 获取指定key的值string
*/
public String getMapValue(String key1, String key2) {
return String.valueOf(redisTemplate.opsForHash().get(key1, key2));
}
/**
* 删除指定 hash 的 HashKey
*
* @return 删除成功的 数量
*/
public Long removeFromMap(String key, String hashKeys) {
return redisTemplate.opsForHash().delete(key, hashKeys);
}
//- - - - - - - - - - - - - - - - - - - - - String类型 - - - - - - - - - - - - - - - - - - - -
public void addToString(String key, String value){
redisTemplate.opsForValue().set(key,value);
}
public void addToString(String key, String value, Long expiresIn){
redisTemplate.opsForValue().set(key,value,expiresIn, TimeUnit.SECONDS);
}
public String getFromString(String key){
return redisTemplate.opsForValue().get(key);
}
public Set<String> getKeysFromString(String key){
return redisTemplate.keys(key);
}
public List<String> getMultiValue(Set<String> keys){
return redisTemplate.opsForValue().multiGet(keys);
}
public Long getExpire(String key){
return redisTemplate.getExpire(key);
}
public void removeFromString(String 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);
}
}

View File

@@ -10,8 +10,8 @@ public class RequestInfoUtil {
* @param request * @param request
* @return java.lang.String * @return java.lang.String
* @version 1.0 * @version 1.0
* * <p>
* * <p>
* 使用了ng等代理服务器要在ng加以下配置 * 使用了ng等代理服务器要在ng加以下配置
* location / { * location / {
* proxy_pass http://127.0.0.1:10678; * proxy_pass http://127.0.0.1:10678;
@@ -20,7 +20,6 @@ public class RequestInfoUtil {
* proxy_set_header REMOTE-HOST $remote_addr; * proxy_set_header REMOTE-HOST $remote_addr;
* proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; * proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
* } * }
*/ */
public static String getIpAddress(HttpServletRequest request) { public static String getIpAddress(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for"); String ip = request.getHeader("x-forwarded-for");

View File

@@ -59,6 +59,7 @@ public class RsaDecryptUtils {
/** /**
* 解密 * 解密
*
* @param args * @param args
* @throws NoSuchAlgorithmException * @throws NoSuchAlgorithmException
*/ */

View File

@@ -0,0 +1,364 @@
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;
}
}
/**
* @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

@@ -8,7 +8,7 @@ public class SecurityContextUtils {
public static AuthPrincipalVo getCurrentUser() { public static AuthPrincipalVo getCurrentUser() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if(authentication != null && authentication.getPrincipal() != null){ if (authentication != null && authentication.getPrincipal() != null) {
return (AuthPrincipalVo) authentication.getPrincipal(); return (AuthPrincipalVo) authentication.getPrincipal();
} }
return null; return null;
@@ -16,7 +16,7 @@ public class SecurityContextUtils {
public static Long getCurrentUserId() { public static Long getCurrentUserId() {
AuthPrincipalVo currentUser = getCurrentUser(); AuthPrincipalVo currentUser = getCurrentUser();
if(currentUser != null){ if (currentUser != null) {
return currentUser.getId(); return currentUser.getId();
} }
return null; return null;
@@ -24,7 +24,7 @@ public class SecurityContextUtils {
public static String getCurrentUsername() { public static String getCurrentUsername() {
AuthPrincipalVo currentUser = getCurrentUser(); AuthPrincipalVo currentUser = getCurrentUser();
if(currentUser != null){ if (currentUser != null) {
return currentUser.getUsername(); return currentUser.getUsername();
} }
return null; return null;

View File

@@ -1,5 +1,7 @@
package com.ai.da.common.utils; package com.ai.da.common.utils;
import com.ai.da.mapper.primary.entity.Account;
import com.ai.da.mapper.primary.entity.TrialOrder;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.ai.da.common.config.exception.BusinessException; import com.ai.da.common.config.exception.BusinessException;
import com.tencentcloudapi.common.Credential; import com.tencentcloudapi.common.Credential;
@@ -7,11 +9,14 @@ import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.common.profile.ClientProfile; import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile; import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.ses.v20201002.SesClient; import com.tencentcloudapi.ses.v20201002.SesClient;
import com.tencentcloudapi.ses.v20201002.models.Attachment;
import com.tencentcloudapi.ses.v20201002.models.SendEmailRequest; import com.tencentcloudapi.ses.v20201002.models.SendEmailRequest;
import com.tencentcloudapi.ses.v20201002.models.SendEmailResponse; import com.tencentcloudapi.ses.v20201002.models.SendEmailResponse;
import com.tencentcloudapi.ses.v20201002.models.Template; import com.tencentcloudapi.ses.v20201002.models.Template;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import java.util.Base64;
import java.util.Date; import java.util.Date;
/** /**
@@ -31,6 +36,7 @@ public class SendEmailUtil {
* 发信地址 * 发信地址
*/ */
private static String SEND_ADDRESS = "info@aida.com.hk"; private static String SEND_ADDRESS = "info@aida.com.hk";
private final static String CODE_CREATE_SEND_ADDRESS = "info@code-create.com.hk";
/** /**
* 登入主题 * 登入主题
*/ */
@@ -51,6 +57,7 @@ public class SendEmailUtil {
* 登入模板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
*/ */
@@ -65,8 +72,8 @@ public class SendEmailUtil {
public static Long BIND_MAILBOX_TEMPLATE_ID = 45619L; public static Long BIND_MAILBOX_TEMPLATE_ID = 45619L;
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 {
// 实例化一个认证对象入参需要传入腾讯云账户secretIdsecretKey,此处还需注意密钥对的保密 // 实例化一个认证对象入参需要传入腾讯云账户secretIdsecretKey,此处还需注意密钥对的保密
// 密钥可前往https://console.cloud.tencent.com/cam/capi网站进行获取 // 密钥可前往https://console.cloud.tencent.com/cam/capi网站进行获取
Credential cred = new Credential(SECRET_ID, SECRET_KEy); Credential cred = new Credential(SECRET_ID, SECRET_KEy);
@@ -85,32 +92,502 @@ 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 : BIND_MAILBOX_SUBJECT;
req.setSubject(subject); req.setSubject(subject);
req.setTemplate(contractTemplate(templateId, verifyCode,ip)); req.setTemplate(contractTemplate(templateId, verifyCode, ip));
// 返回的resp是一个SendEmailResponse的实例与请求对象对应 // 返回的resp是一个SendEmailResponse的实例与请求对象对应
SendEmailResponse resp = client.SendEmail(req); SendEmailResponse resp = client.SendEmail(req);
// 输出json格式的字符串回包 // 输出json格式的字符串回包
log.info("短信发送结果res###{}",SendEmailResponse.toJsonString(resp)); log.info("短信发送结果res###{}", SendEmailResponse.toJsonString(resp));
return Boolean.TRUE; return Boolean.TRUE;
} catch (TencentCloudSDKException e) { } catch (TencentCloudSDKException e) {
log.info("邮件发送失败###{}",e.toString()); log.info("邮件发送失败###{}", e.toString());
throw new BusinessException(e.getMessage()); throw new BusinessException("failed.to.send.mail");
} }
} }
private static Template contractTemplate(Long templateId,String verifyCode,String ip){
private static Template contractTemplate(Long templateId, String verifyCode, String ip) {
Template template = new Template(); Template template = new Template();
template.setTemplateID(templateId); template.setTemplateID(templateId);
JSONObject jsonObject = new JSONObject(); JSONObject jsonObject = new JSONObject();
if(templateId == EXCEPTION_ID_TEMPLATE_ID ){ if (templateId == EXCEPTION_ID_TEMPLATE_ID) {
jsonObject.put("exceptionIp",ip); jsonObject.put("exceptionIp", ip);
jsonObject.put("loginTime",DateUtil.dateToStr(new Date(),DateUtil.YYYY_MM_DD_HH_MM_SS)); jsonObject.put("loginTime", DateUtil.dateToStr(new Date(), DateUtil.YYYY_MM_DD_HH_MM_SS));
}else{ } else {
jsonObject.put("code",verifyCode); jsonObject.put("code", verifyCode);
} }
template.setTemplateData(jsonObject.toJSONString()); template.setTemplateData(jsonObject.toJSONString());
return template; return template;
} }
/**
* 发送不同类型的邮件
*
* @param receiverAddress 收件人邮箱地址
* @param senderAddress 发件人邮箱地址
* @param emailType 邮件类型1 - 提交试用请求2 - 审批通过3 - 试用请求通过通知
* @return 发送结果
*/
private final static Long YOUR_TRIAL_TEMPLATE_ID = 117214L;
private final static Long APPROVAL_TEMPLATE_ID = 117215L;
private final static Long NOTIFICATION_TEMPLATE_ID = 117216L;
private final static Long NOTIFICATION_CHINESE_TEMPLATE_ID = 122229L;
private final static Long TRIAL_ORDER_LIST_ID = 122273L;
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 {
// 实例化一个认证对象
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();
switch (emailType) {
case 1:
subject = "试用订单请求";
template.setTemplateID(YOUR_TRIAL_TEMPLATE_ID);
template.setTemplateData(buildTrialOrderData(trialOrder));
break;
case 2:
subject = "试用订单审批通过";
template.setTemplateID(APPROVAL_TEMPLATE_ID);
template.setTemplateData(buildApprovalData(trialOrder));
break;
case 3:
subject = "Approval Confirmation for AiDA System Trial Access";
if (country.equals("China")) {
template.setTemplateID(NOTIFICATION_CHINESE_TEMPLATE_ID);
}else {
template.setTemplateID(NOTIFICATION_TEMPLATE_ID);
}
template.setTemplateData(buildNotificationData(trialOrder, link));
break;
default:
break;
}
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 void sendExcelEmail(String receiverAddress, String senderAddress, byte[] fileContent, String fileName) {
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(TRIAL_ORDER_LIST_ID);
req.setSubject(subject);
req.setTemplate(template);
Attachment attachment = new Attachment();
attachment.setFileName(fileName); // 设置附件文件名
// 设置附件内容
attachment.setContent(Base64.getEncoder().encodeToString(fileContent));
req.setAttachments(new Attachment[] {attachment});
// 发送邮件
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 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;
public static void sendWillBeExpiredEmail(Account account, 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[]{account.getUserEmail()});
// 根据邮件类型设置不同的主题和模板
String subject = "";
Template template = new Template();
subject = "Renewal notice";
template.setTemplateID(WILLBEEXPIRED_TEMPLATE_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 static String buildAccountData(Account account) {
JSONObject jsonObject = new JSONObject();
// 设置试用订单相关数据
jsonObject.put("userName", account.getUserName());
// 用户到期时间戳
Long timestamp = account.getValidEndTime(); // 替换为你的时间戳
if (null != timestamp) {
// 获取当前时间戳
Long currentTimestamp = System.currentTimeMillis();
// 计算时间差(毫秒)
long timeDifference = currentTimestamp - timestamp;
// 向上取整计算天数
long days = (timeDifference + 24 * 60 * 60 * 1000 - 1) / (24 * 60 * 60 * 1000);
jsonObject.put("days", days);
}
return jsonObject.toJSONString();
}
// 构建试用订单数据
private static String buildTrialOrderData(TrialOrder trialOrder) {
JSONObject jsonObject = new JSONObject();
// 设置试用订单相关数据
jsonObject.put("surname", trialOrder.getSurname());
jsonObject.put("givenName", trialOrder.getGivenName());
jsonObject.put("userName", trialOrder.getUserName());
jsonObject.put("email", trialOrder.getEmail());
jsonObject.put("country", trialOrder.getCountry());
return jsonObject.toJSONString();
}
// 构建审批通过数据
private static String buildApprovalData(TrialOrder trialOrder) {
JSONObject jsonObject = new JSONObject();
// 设置审批通过相关数据
jsonObject.put("surname", trialOrder.getSurname());
jsonObject.put("givenName", trialOrder.getGivenName());
jsonObject.put("userName", trialOrder.getUserName());
jsonObject.put("email", trialOrder.getEmail());
jsonObject.put("country", trialOrder.getCountry());
return jsonObject.toJSONString();
}
// 构建试用订单通过通知数据
private static String buildNotificationData(TrialOrder trialOrder, boolean link) {
JSONObject jsonObject = new JSONObject();
// 设置试用订单通过通知相关数据
jsonObject.put("title", trialOrder.getTitle());
jsonObject.put("surname", trialOrder.getSurname());
jsonObject.put("givenName", trialOrder.getGivenName());
jsonObject.put("userName", trialOrder.getUserName());
jsonObject.put("email", trialOrder.getEmail());
if (link) {
jsonObject.put("days", 14);
}else {
jsonObject.put("days", 5);
}
return jsonObject.toJSONString();
}
private final static Long UPGRADE_NOTIFICATION_ID = 118855L;
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 {
// 实例化一个认证对象
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 = "Successful System Upgrade and New Features in AiDA 3.0";
template.setTemplateID(UPGRADE_SUCCESS_NOTIFICATION_ID);
}else {
subject = "系统升级成功和AiDA 3.0新功能";
template.setTemplateID(UPGRADE_SUCCESS_NOTIFICATION_ID_CHINESE);
}
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 GENERATE_EXCEPTION_WARNING_ID = 122589L;
public static void sendGenerateExceptionWarning(String message){
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[]{"xupei3360@163.com"});
// 根据邮件类型设置不同的主题和模板
String subject = "";
Template template = new Template();
subject = "Warning: AiDA 3.0 Generate Exception Warning";
template.setTemplateID(GENERATE_EXCEPTION_WARNING_ID);
JSONObject parameter = new JSONObject();
parameter.put("errorMessage", message);
parameter.put("time", DateUtil.dateToStr(new Date(), DateUtil.YYYY_MM_DD_HH_MM_SS));
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 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");
}
}
} }

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