1239 Commits

Author SHA1 Message Date
3c2b4ffc48 TASK: 画布数据 回参添加返回crossOrigin 2025-07-22 11:31:26 +08:00
b90df7468e TASK:管理员权限变更 2025-07-18 17:32:03 +08:00
370d9402f2 TASK: 试用邮件通知权限变更 2025-07-02 10:08:54 +08:00
4d518d05b9 TASK: 管理员页面访问权限变动 2025-07-02 09:18:22 +08:00
13514b277b BUGFIX:用户注册后重发验证码,验证不通过 2025-06-24 19:30:20 +08:00
d6c5d0e95d TASK:查询交易记录 添加显示总金额和付款者邮箱 2025-06-23 10:53:30 +08:00
301a62a563 TASK:添加管理员访问人员 2025-06-19 17:39:18 +08:00
22e5a97143 BUGFIX: 优惠券的佣金计算,统计时间边界问题优化 2025-06-13 11:18:55 +08:00
765d404845 TASK: 将generate,用户输入中的中文字符转换为英文字符 2025-06-11 15:34:00 +08:00
d5cf4e9d3f TASK: 添加“新增试用用户”通知对象chelseayu@code-create.com.hk 2025-06-08 09:19:36 +08:00
4b7fd649a3 TASK: 推广码 添加开始生效时间;优化数据计算类型,使用BigDecimal替换float;更新paidCommission后自动计算unpaidCommission 2025-06-06 19:37:38 +08:00
6249d53b7b BUGFIX: modifySketch 除library以外的地方修改,originalIdSource允许不传 2025-06-04 22:04:09 +08:00
b445f1f11e BUGFIX: modifySketch 在library中修改后需要保存到library 2025-06-04 15:49:55 +08:00
5c66ece467 1.关闭续订前七天邮件提醒
2.优化订阅邮件提醒,向redis存储已发送的邮件类型
2025-05-23 17:16:19 +08:00
3b6b0c7e2c TASK: prom code 开启佣金计费定时器和商家邮件通知 2025-05-22 16:37:41 +08:00
9a81fb7ee4 TASK:将PromotionCode合并到生产-test 2025-05-20 16:53:48 +08:00
31bb29f2fd Affiliate 允许为不同的用户设置不同的affiliate
Stripe 添加优惠券删除接口;限制优惠券只能在订阅时使用

(cherry picked from commit 200c0adfba)
2025-05-20 11:30:42 +08:00
c7b46229b5 删除优惠券
(cherry picked from commit 58af5c5570)
2025-05-19 17:29:06 +08:00
1482bb6ab2 Stripe推广码 部分功能完善
(cherry picked from commit 218d828e0d)
2025-05-19 17:28:52 +08:00
eae4087b3e Stripe支付--添加推广码功能及相应佣金计算
(cherry picked from commit 0ba28588da)
2025-05-19 17:13:28 +08:00
faf98607c4 优惠券查询DTO
(cherry picked from commit 1ce6c74f2c)
2025-05-19 17:04:51 +08:00
c19e9094d1 BUGFIX: generate mode字段传递不准确导致生成结果与图片没有关联 2025-05-09 17:03:42 +08:00
db55c5597f undividedLayers数据保存失败原因查找 2025-05-09 00:18:00 +08:00
0c79739867 BUGFIX: design之后,未分割图片的保存问题 2025-05-08 15:26:06 +08:00
e484f22788 BUGFIX : design 未分割图层保存问题 2025-05-08 14:54:12 +08:00
6a694cee18 Merge remote-tracking branch 'origin/release/3.0' into release/3.0 2025-05-08 14:19:41 +08:00
1a077edf0c designSingle 取消颜色限制 2025-05-08 14:19:26 +08:00
shahaibo
68926757dc Merge remote-tracking branch 'origin/release/3.0' into release/3.0 2025-05-07 22:04:21 +08:00
shahaibo
eea57435e5 TASK:minio地址修改; 2025-05-07 22:04:10 +08:00
1f0e8f9cf2 BUGFIX: designSingle时,添加相同类型的服装导致未分割图层获取混乱 2025-05-07 14:10:42 +08:00
shahaibo
63ee41e3b8 Merge remote-tracking branch 'origin/release/3.0' into release/3.0 2025-03-31 17:47:33 +08:00
shahaibo
08072001a7 BUGFIX:dislike合并逻辑去除; 2025-03-31 17:47:25 +08:00
6b4d82a67d AiDA 8折优惠活动恢复 2025-03-31 17:45:16 +08:00
5612b5b1d4 AiDA 8折优惠活动 2025-03-31 09:48:09 +08:00
1d46a3b6d4 修改本地缓存的过期时间 2025-03-27 15:38:25 +08:00
0500557dca BUGFIX: 获取pantone值为空时返回rgb和hsv 2025-03-18 18:47:05 +08:00
654a3829c6 BUGFIX: 获取RGB对应的PanTone数据失败,导致返回颜色为空 2025-03-18 17:39:39 +08:00
fccafba438 Merge remote-tracking branch 'origin/release/3.0' into release/3.0 2025-03-18 15:33:38 +08:00
8cd4cfb36d getDetail 添加日志,打印入参回参 2025-03-18 15:33:24 +08:00
shahaibo
7e55b1f85e BUGFIX: 隐藏加载不出minio的相关数据; 2025-03-13 17:53:35 +08:00
shahaibo
a043db2de5 BUGFIX: 隐藏加载不出minio的相关数据; 2025-03-12 22:48:18 +08:00
shahaibo
d3ee0e5f4f BUGFIX: 隐藏加载不出minio的相关数据; 2025-03-12 22:06:39 +08:00
shahaibo
484a8d1d93 BUGFIX: 隐藏加载不出minio的相关数据; 2025-03-12 22:00:07 +08:00
shahaibo
7839ac3322 BUGFIX: 隐藏加载不出minio的相关数据; 2025-03-12 21:54:23 +08:00
shahaibo
e16f494cf4 Merge remote-tracking branch 'origin/release/3.0' into release/3.0 2025-03-12 21:26:33 +08:00
shahaibo
6fc22784b8 BUGFIX: 隐藏加载不出minio的相关数据; 2025-03-12 21:26:24 +08:00
52bafa95e3 关闭默认从Code-Create创建游客账号的定时器 2025-03-03 21:17:14 +08:00
377c86e390 Stripe 回调判空并直接返回 2025-02-28 14:30:35 +08:00
d809362ea7 Merge branch 'dev/dev' into release/3.0 2025-02-25 11:42:51 +08:00
c08987a781 Merge branch 'dev/dev_xp' into dev/dev 2025-02-24 10:37:14 +08:00
e60c3d7aa3 Stripe webhook charge回调处理 2025-02-24 10:36:42 +08:00
614b8d0948 to prod 2025-02-21 17:56:50 +08:00
8834b906f4 Merge branch 'dev/dev_xp' into dev/dev 2025-02-21 17:39:35 +08:00
828a022768 漏传 2025-02-21 17:39:12 +08:00
26c8d08d04 Merge branch 'dev/dev_xp' into dev/dev 2025-02-21 17:35:35 +08:00
68a9b2281a 管理员系统部分优化、stripe异常通知优化 2025-02-21 17:16:44 +08:00
63df493d33 切换dev支付环境为测试环境,回调端点为dev端点 2025-02-21 13:02:30 +08:00
b7110c80b5 切换dev支付回调端点 2025-02-21 12:51:11 +08:00
c4dbd10a85 to dev 2025-02-20 11:10:00 +08:00
041a407978 Merge branch 'release/3.0' into dev/dev 2025-02-20 11:00:41 +08:00
f73c997c38 Merge branch 'dev/dev_xp' into dev/dev 2025-02-20 10:59:58 +08:00
db2a955dea 生成结果均低于输出标准时的提示语句更换 2025-02-20 10:57:43 +08:00
a91643d2ec to prod 2025-02-19 17:44:14 +08:00
269cf7ea03 关闭merchant邮箱,test支付环境不通知商家 2025-02-19 16:40:12 +08:00
e3aa964db8 切换支付环境为test 2025-02-19 16:32:28 +08:00
fa2fa66d4a 打开商家邮箱 用于接收邮件通知 2025-02-19 14:54:24 +08:00
6d2a189fef 更换支付方式 2025-02-19 14:43:42 +08:00
2033f61c7e 切换支付环境为live 2025-02-19 14:28:07 +08:00
4e2222966f 修改邮件模板ID 2025-02-19 14:23:43 +08:00
fbe9dc87e9 Stripe 回调添加异常处理和异常情况下邮件通知 2025-02-19 14:14:20 +08:00
d6f078ab60 添加判断,确认邮件是否发送成功 2025-02-18 17:07:16 +08:00
a940863799 stripe 一次订阅 bug修复 2025-02-18 15:00:57 +08:00
11ffa66851 stripe 一次订阅 添加日志打印 2025-02-18 14:09:27 +08:00
fc3fa22bee 更换stripe-webhook回调密钥 2025-02-18 11:31:49 +08:00
37ff60fcfb Stripe 添加一次订阅服务(默认关闭自动续订功能) 2025-02-17 17:14:30 +08:00
d2d5eebe12 to dev 2025-02-17 10:52:11 +08:00
9cfb5aa344 Merge remote-tracking branch 'origin/release/3.0' into release/3.0 2025-02-17 10:19:17 +08:00
5e7f898840 BUGFIX: 用户支付后获取账号到期时间为空,无法更新账号信息 2025-02-17 10:18:57 +08:00
shahaibo
6d3253aed3 BUGFIX: bindEmail; 2025-02-14 11:49:37 +08:00
shahaibo
52e5f246ce Merge branch 'dev/dev' into release/3.0 2025-02-13 12:57:37 +08:00
shahaibo
6222377bc5 BUGFIX: dev恢复toProductImage、relight消费; 2025-02-13 11:57:00 +08:00
shahaibo
2d10f57643 BUGFIX: dev关闭toProductImage、relight消费; 2025-02-13 11:42:45 +08:00
shahaibo
5f27a95498 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-02-13 11:07:02 +08:00
shahaibo
7fdf832f44 BUGFIX: toProductImage、relight; 2025-02-13 11:06:19 +08:00
43d2f83677 BUGFIX:For input string: "[0.3400879, 0.3400879]" 2025-02-12 13:20:12 +08:00
e882a15aa0 Merge branch 'dev/dev' into release/3.0 2025-02-12 13:07:25 +08:00
1a3f16119b Merge branch 'dev/dev_xp' into dev/dev 2025-02-12 12:13:52 +08:00
8e2e515af3 BUGFIX:印花 不等比缩放适配历史数据 2025-02-12 12:13:25 +08:00
f1a2495431 Merge branch 'dev/dev' into release/3.0 2025-02-12 10:34:02 +08:00
c66b794daa Merge branch 'dev/dev_xp' into dev/dev 2025-02-12 10:33:39 +08:00
b9f7ea2722 BUGFIX: 多个印花 不等比缩放适配历史数据 2025-02-12 10:33:11 +08:00
455e17d4b1 Merge branch 'dev/dev' into release/3.0 2025-02-12 10:19:45 +08:00
a1a6a78dac Merge branch 'dev/dev_xp' into dev/dev 2025-02-12 10:14:17 +08:00
07f91aef74 BUGFIX: 印花不等比缩放适配历史数据 2025-02-12 10:13:54 +08:00
shahaibo
079ab4d98f BUGFIX: name 信息绑定邮箱录入; 2025-02-12 09:56:55 +08:00
shahaibo
6e53bc3ca5 TASK: 定时任务; 2025-02-12 09:28:04 +08:00
shahaibo
5e8eb716b1 TASK: name信息; 2025-02-11 20:50:22 +08:00
shahaibo
34ee8fa11d TASK: name信息; 2025-02-11 13:08:00 +08:00
shahaibo
b7dc95af26 TASK:name信息; 2025-02-11 11:35:57 +08:00
shahaibo
297391d57e BUGFIX:试用订单邮件 订单更新时间判断; 2025-02-11 11:27:08 +08:00
shahaibo
aff870fba7 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-02-11 10:25:08 +08:00
7b1ac47228 Merge branch 'dev/dev_xp' into dev/dev 2025-02-10 16:15:20 +08:00
7eb9abbdb5 优化接收Stripe回调时数据重复存储问题(添加唯一索引) 2025-02-10 16:11:59 +08:00
521bd5071a Merge branch 'dev/dev_xp' into dev/dev
# Conflicts:
#	src/main/java/com/ai/da/mapper/primary/entity/DesignItemDetailPrint.java
#	src/main/java/com/ai/da/model/vo/DesignSinglePrint.java
#	src/main/java/com/ai/da/python/PythonService.java
#	src/main/java/com/ai/da/python/vo/DesignPythonItemElement.java
#	src/main/java/com/ai/da/python/vo/DesignPythonItemPrint.java
#	src/main/java/com/ai/da/service/impl/DesignServiceImpl.java
2025-02-10 11:21:52 +08:00
ab7e1705c4 修改print scale的数据结构 2025-02-10 11:18:04 +08:00
shahaibo
a2390a6ab2 BUGFIX:试用订单邮件 订单更新时间判断; 2025-02-10 10:34:01 +08:00
shahaibo
8dc5dcb1bd BUGFIX:试用订单邮件 订单更新时间判断; 2025-02-10 10:11:59 +08:00
shahaibo
5d010d2f77 BUGFIX:试用订单邮件 订单更新时间判断; 2025-02-10 10:08:48 +08:00
shahaibo
cec5544472 BUGFIX:试用订单邮件 订单更新时间判断; 2025-02-10 10:05:57 +08:00
shahaibo
5f79c3276a BUGFIX:试用订单邮件 订单更新时间判断; 2025-02-10 10:03:28 +08:00
aadb717c9f to dev 2025-02-07 15:03:24 +08:00
e2e9201fdd 修改印花scale数据类型为数组 2025-02-07 14:57:28 +08:00
shahaibo
9053bdf10c BUGFIX:试用注册; 2025-02-07 12:48:37 +08:00
shahaibo
b14297d1af Merge branch 'dev/dev' into release/3.0 2025-02-07 11:58:36 +08:00
shahaibo
e90979bbdc BUGFIX:试用注册; 2025-02-07 11:58:12 +08:00
shahaibo
e02c278e7a Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-02-07 10:25:20 +08:00
shahaibo
e60d9483a3 BUGFIX:试用订单邮件信息; 2025-02-07 10:25:11 +08:00
shahaibo
ba49312fd5 BUGFIX:试用订单邮件信息; 2025-02-07 10:23:41 +08:00
ba3c98771f BUGFIX: 新建订阅时更新订阅不更新账号信息 2025-02-06 18:39:06 +08:00
4c738cc61d BUGFIX: 返回最新的订阅号 2025-02-06 17:35:35 +08:00
d648a79ec4 BUGFIX: 订阅付款失败时仍有新建订阅 2025-02-06 16:36:07 +08:00
c325927418 to prod 2025-02-06 14:46:50 +08:00
dba5625446 正式支付环境下区分生产分支与测试分支 2025-02-06 14:42:45 +08:00
91189968e9 在dev测试生产环境的Stripe支付功能 2025-02-06 14:37:06 +08:00
433d8a460e to dev 2025-02-06 14:22:27 +08:00
ec9857fe73 Merge branch 'dev/dev_xp' into dev/dev 2025-02-06 14:09:53 +08:00
a9b01566e1 优化积分购买 2025-02-06 14:09:15 +08:00
shahaibo
a384aba4df TASK:定时任务开启; 2025-02-06 10:04:30 +08:00
e587ad3ca1 1、支付环境切换为prod
2、邮件通知对象添加Kim
3、打开定时任务
2025-02-06 09:53:03 +08:00
shahaibo
6a7c8b3d28 Merge branch 'dev/dev' into release/3.0 2025-02-05 14:26:33 +08:00
shahaibo
6f52c956ec TASK:新的试用订单生成; 2025-02-05 14:20:22 +08:00
shahaibo
9e5d2f47e2 BUGFIX:绑定谷歌; 2025-02-05 13:38:10 +08:00
shahaibo
627f264ef3 BUGFIX:绑定谷歌; 2025-02-05 13:02:26 +08:00
shahaibo
464de4ee5a Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-02-05 12:05:07 +08:00
shahaibo
cf76235123 TASK:谷歌微信快捷区分登录注册; 2025-02-05 12:04:53 +08:00
8d9f51f50f 不再清空游客的到期时间 2025-02-05 11:22:45 +08:00
d840185ec7 测试 code-create DB最大连接时长 2025-02-05 10:56:17 +08:00
9f4ab20b9d 测试 code-create DB最大连接时长 2025-02-05 10:49:10 +08:00
0877ff8f66 支付 测试 2025-02-05 10:05:23 +08:00
78046e8707 支付 测试 2025-02-04 15:29:22 +08:00
shahaibo
9fb8bc989d Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-02-04 14:29:32 +08:00
shahaibo
3c89670dae BUGFIX:design重复回退; 2025-02-04 14:29:22 +08:00
21b73d55f7 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-02-04 14:04:17 +08:00
9199cdf7e2 支付 to prod 2025-02-04 14:04:01 +08:00
shahaibo
8589216a77 TASK:绑定邮箱; 2025-02-04 13:53:50 +08:00
shahaibo
87768c6b53 TASK:绑定邮箱、绑定微信; 2025-02-04 11:39:42 +08:00
shahaibo
ca320f4334 TASK:测试dev分支; 2025-02-04 11:00:31 +08:00
shahaibo
7697ab59fa BUGFIX:重复停止组装; 2025-02-04 10:58:35 +08:00
e5e6f360dc Merge branch 'dev/dev_xp' into dev/dev 2025-01-27 16:39:54 +08:00
68a9462714 交易记录下载 返回文件流改为返回文件下载地址 2025-01-27 16:39:19 +08:00
b185a94fcc Merge branch 'dev/dev_xp' into dev/dev 2025-01-27 11:00:10 +08:00
708280ca14 交易记录下载post请求改get请求 2025-01-27 10:58:35 +08:00
0ab1e7eef7 Merge branch 'dev/dev_xp' into dev/dev 2025-01-24 15:50:15 +08:00
c7b1d46b18 maven 依赖冲突解决 2025-01-24 15:49:34 +08:00
9357a62f0c Merge branch 'dev/dev_xp' into dev/dev 2025-01-24 14:28:54 +08:00
c5b25e9a16 优化 删除多余代码 2025-01-24 14:28:21 +08:00
a35d057146 优化 导出交易记录文件 2025-01-24 14:25:32 +08:00
7fc495eec9 Merge branch 'dev/dev_xp' into dev/dev 2025-01-24 13:27:50 +08:00
46f37942d2 将交易记录导出为excel文件 2025-01-24 13:26:53 +08:00
e75196c904 Merge branch 'dev/dev_xp' into dev/dev 2025-01-23 14:15:38 +08:00
bdfa249c2e token过期 日志打印优化 2025-01-23 14:15:12 +08:00
d0e5f7da61 Merge branch 'dev/dev_xp' into dev/dev 2025-01-23 13:57:26 +08:00
d8320ba83d 新增自定义异常 2025-01-23 13:56:48 +08:00
23460800d6 优化请求未携带token时的日志打印 2025-01-23 13:55:48 +08:00
58c8b644bc 佣金计算 打印日志 2025-01-22 16:41:40 +08:00
c4c04aecb6 affiliateIncome 添加字段paymentInfoId 2025-01-22 16:37:40 +08:00
bb7c98c094 affiliate 佣金计算统计 2025-01-22 15:32:09 +08:00
dcdb0d06c4 Merge branch 'dev/dev_xp' into dev/dev 2025-01-15 10:49:08 +08:00
b6a66bed41 查询交易记录 添加付款人字段 2025-01-15 10:45:51 +08:00
shahaibo
5f277ed815 BUGFIX:toproductimage 打光积分不足提示修改; 2025-01-13 15:12:54 +08:00
shahaibo
845a553097 BUGFIX:微信名解析、toproductimage 打光积分不足code码修改; 2025-01-13 14:11:03 +08:00
74f89c8b2d 只填写国家和职业(不发送验证码) 2025-01-13 11:15:31 +08:00
cff8227228 Merge branch 'dev/dev_xp' into dev/dev 2025-01-13 11:13:31 +08:00
51e2c9af02 只填写国家和职业(不发送验证码) 2025-01-13 11:11:01 +08:00
cd89a77189 漏传 2025-01-13 10:56:06 +08:00
ab303cfeef 绑定邮箱时添加国家、职业信息 2025-01-13 10:55:08 +08:00
shahaibo
07004a7415 TASK:去日志; 2025-01-13 10:20:14 +08:00
shahaibo
d2069a3e7f TASK:去日志; 2025-01-13 10:12:04 +08:00
shahaibo
501cee0057 TASK:去日志; 2025-01-13 10:05:38 +08:00
ac2454fd0e 绑定邮箱时添加国家、职业信息 2025-01-10 17:16:08 +08:00
931a4cf807 to dev 2025-01-10 17:01:59 +08:00
cb7099264e 绑定邮箱时需要填写国家和职业 2025-01-10 16:54:44 +08:00
e7aa951e89 漏传 2025-01-10 16:19:53 +08:00
ef70598180 修改查询交易记录接口
1、添加按id排序
2、添加查询所有国家
3、添加接口,更新用户国家、职业信息
2025-01-10 16:13:45 +08:00
698fca8787 查询各平台交易记录 2025-01-10 13:27:27 +08:00
2f86090f21 Merge branch 'dev/dev' into dev/dev_xp 2025-01-10 13:05:26 +08:00
2988a3b34e 修改code-create数据库 sql语句修改 2025-01-09 13:50:08 +08:00
shahaibo
4fe5f65867 TASK:AiDA design like sort 2025-01-08 16:56:02 +08:00
shahaibo
4bb1953d4a Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-01-08 15:39:32 +08:00
shahaibo
57a8260f03 TASK:AiDA design like sort 2025-01-08 15:38:29 +08:00
e4936a23bc 编辑用户名,改为当前月允许修改5次 2025-01-08 14:20:12 +08:00
9f37cb3f8d Merge branch 'release/3.0' into dev/dev
# Conflicts:
#	src/main/java/com/ai/da/controller/ConvenientInquiryController.java
#	src/main/java/com/ai/da/model/dto/DesignCollectionDTO.java
#	src/main/java/com/ai/da/service/impl/DesignServiceImpl.java
2025-01-08 10:33:49 +08:00
b128b2436d 限制人员添加用户 2025-01-08 10:24:51 +08:00
66158e94dd 限制人员添加用户 2025-01-08 10:12:43 +08:00
f6b489d950 添加管理员页面访问者 2025-01-08 09:50:13 +08:00
30312caf82 添加管理员访问者 2025-01-07 17:27:29 +08:00
1d0dd65f5e Merge branch 'dev/dev_xp' into dev/dev 2025-01-07 17:21:54 +08:00
shahaibo
0b245f62af TASK:AiDA design like sort、moodboardPosition 2025-01-07 17:16:45 +08:00
50d90af3a5 添加管理员访问者 2025-01-07 17:15:22 +08:00
shahaibo
49b8585522 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-01-07 15:30:33 +08:00
shahaibo
b49f098a5e TASK:AiDA design like sort、moodboardPosition 2025-01-07 15:29:46 +08:00
e9a15b950e Merge branch 'dev/dev_xp' into dev/dev 2025-01-07 14:37:28 +08:00
ee676614f8 统一多种支付方式创建订单的入参 2025-01-07 14:31:43 +08:00
710abf2323 修改积分价格,for test 2025-01-07 11:47:33 +08:00
1a9f06d259 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-01-07 11:26:16 +08:00
shahaibo
eaaa99a946 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-01-07 11:16:14 +08:00
shahaibo
c8e4d624b7 TASK:AiDA design like sort 2025-01-07 11:15:25 +08:00
f08e36d100 Merge branch 'dev/dev_xp' into dev/dev 2025-01-07 11:12:30 +08:00
de73536d1c 解析所有发起购买的客户端ip地址 2025-01-07 11:09:22 +08:00
6a861305d6 解析所有发起购买的客户端ip地址 2025-01-07 11:07:49 +08:00
shahaibo
367fa130c0 BUGFIX:moodboard edit; 2025-01-07 10:58:57 +08:00
shahaibo
d04987a3e2 BUGFIX:moodboard edit; 2025-01-07 09:58:36 +08:00
b0fa185d36 更改积分刷新task 2025-01-06 14:58:46 +08:00
094718e67f Merge branch 'dev/dev_xp' into dev/dev 2025-01-06 14:47:40 +08:00
e4a8bf80e9 1、用户详细信息添加国家、职业、用户名修改剩余次数
2、积分不够 返回异常提示类型更改
3、添加根据ip解析地理位置测试接口
4、更新积分刷新机制(每月1号0点刷新年费用户积分)
2025-01-06 14:42:08 +08:00
shahaibo
c04b102a81 TASK:AiDA design like sort 2025-01-06 11:49:47 +08:00
shahaibo
da9b3a04b4 TASK:AiDA design like sort 2025-01-06 11:35:54 +08:00
shahaibo
234a030801 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-01-06 10:49:39 +08:00
shahaibo
5ea8e851d7 TASK:AiDA design like sort 2025-01-06 10:46:51 +08:00
shahaibo
afeeef4af7 TASK:试用订单接收名单添加; 2025-01-04 21:35:21 +08:00
ee1e2f8556 获取所有标签 2025-01-02 17:32:49 +08:00
1157b41730 积分购买 添加邮件通知 2024-12-31 11:38:12 +08:00
ca4d75c63f BUGFIX:用户订阅后更新用户身份和积分 2024-12-27 14:29:07 +08:00
f45bd7acc4 develop 环境webhook_secret变更 2024-12-27 10:46:52 +08:00
7bdd62d4a9 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-12-27 10:32:09 +08:00
b01ee9129b develop 环境webhook_secret变更 2024-12-27 10:31:27 +08:00
shahaibo
214c93923c Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-12-24 14:01:34 +08:00
shahaibo
bfa1d67b5c BUGFIX:Collection not found 2024-12-24 14:00:44 +08:00
a0a1a1a06a Merge branch 'dev/dev_xp' into dev/dev 2024-12-23 17:31:53 +08:00
468ad385d7 用户登录时,不校验游客账号有效期 2024-12-23 17:29:48 +08:00
fa94667c0f 游客到期时间不置空 2024-12-23 16:07:05 +08:00
c997fbf1cb Merge branch 'dev/dev_xp' into dev/dev 2024-12-23 14:35:29 +08:00
7283ace072 getAffiliateList 添加返回用户名 2024-12-23 14:31:48 +08:00
shahaibo
69743d4ef0 BUGFIX:谷歌快捷登录 2024-12-23 10:27:01 +08:00
shahaibo
e033671ffb TASK:AiDA 2024-12-20 16:11:52 +08:00
shahaibo
15cde37af7 TASK:AiDA 2024-12-20 11:44:21 +08:00
shahaibo
7fb74bc7d8 TASK:AiDA 2024-12-19 17:52:14 +08:00
43968995ea generate去除额外prompt 2024-12-19 17:37:28 +08:00
0574180e4b generate去除额外prompt 2024-12-19 17:26:16 +08:00
5b653272ee 覆盖代码恢复-获取个人信息 2024-12-19 17:15:55 +08:00
d28a6051f1 Merge branch 'release/3.0' into dev/dev 2024-12-19 16:02:59 +08:00
f9063ad26e generate print翻译输入修改 2024-12-19 16:01:35 +08:00
2f4d060ca3 generate print翻译输入修改 2024-12-19 15:59:18 +08:00
fcd0cf4836 Merge branch 'release/3.0' into dev/dev 2024-12-19 15:32:10 +08:00
26f50c2acb generate print翻译输入修改 2024-12-19 15:26:27 +08:00
c3eb1fc78c Merge branch 'dev/dev_xp' into dev/dev 2024-12-19 14:04:28 +08:00
b15cc542e1 按id查询订单 2024-12-19 13:56:17 +08:00
shahaibo
ec094d7471 TASK:AiDA 2024-12-19 13:31:01 +08:00
shahaibo
3dc432131c TASK:AiDA 2024-12-19 11:13:30 +08:00
shahaibo
1a19604163 TASK:AiDA 2024-12-19 10:51:38 +08:00
fdebb2b215 Merge branch 'dev/dev_xp' into dev/dev
# Conflicts:
#	src/main/java/com/ai/da/model/vo/AccountLoginVO.java
#	src/main/java/com/ai/da/service/impl/AccountServiceImpl.java
2024-12-18 14:02:06 +08:00
7d8f047087 Affiliate功能-数据库表设计更新 2024-12-18 11:53:41 +08:00
bf8af41f3f 添加Affiliate功能 2024-12-16 10:26:02 +08:00
shahaibo
cdf29d2b0d TASK:AiDA 2024-12-13 16:07:21 +08:00
shahaibo
7194049127 TASK:prompt修改; 2024-12-13 11:32:42 +08:00
shahaibo
e34cec812f Merge remote-tracking branch 'origin/release/3.0' into release/3.0 2024-12-13 10:35:17 +08:00
shahaibo
11a5b53d2a BUGFIX:prompt重复拼接; 2024-12-13 10:34:14 +08:00
efe22de0a0 Merge branch 'refs/heads/dev/dev' into dev/dev_xp
# Conflicts:
#	src/main/java/com/ai/da/common/utils/SendEmailUtil.java
#	src/main/java/com/ai/da/mapper/primary/entity/Account.java
2024-12-11 16:52:16 +08:00
shahaibo
82f7571612 TASK:AiDA 2024-12-11 16:21:18 +08:00
shahaibo
2ac54a50ec TASK:AiDA 2024-12-11 14:21:29 +08:00
5dd1e10b61 to dev 2024-12-10 10:09:21 +08:00
e9e8e87719 Merge branch 'release/3.0' into dev/dev 2024-12-10 10:04:27 +08:00
3c0fa205d1 BUGFIX:code-create注册的新用户自动添加为aida的游客,去重bug修改 2024-12-09 18:17:09 +08:00
47ca7bde41 Affiliate-新增、查询、佣金计算等 2024-12-09 16:53:29 +08:00
shahaibo
9e28d579d1 Merge branch 'dev/dev' into dev/dev_shb
# Conflicts:
#	src/main/java/com/ai/da/controller/AccountController.java
#	src/main/java/com/ai/da/controller/SavedCollectionController.java
#	src/main/java/com/ai/da/service/AccountService.java
#	src/main/java/com/ai/da/service/UserLikeGroupService.java
#	src/main/java/com/ai/da/service/impl/AccountServiceImpl.java
2024-12-09 13:44:07 +08:00
shahaibo
1c96522447 TASK:AiDA 2024-12-09 13:31:30 +08:00
shahaibo
1a568621ca BUGFIX:重复申请试用; 2024-12-03 11:51:01 +08:00
eecefee674 Merge branch 'dev/dev' into release/3.0 2024-12-02 14:54:00 +08:00
ea0332851d Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-12-02 14:35:20 +08:00
a25a7dc023 high || fast 生成次数修改 2024-12-02 14:34:10 +08:00
shahaibo
b4fe1ca199 TASK:toproductimage prompt; 2024-12-02 13:51:46 +08:00
shahaibo
b315ae5644 TASK:toproductimage prompt; 2024-12-02 12:02:19 +08:00
徐佩
f7113601f3 Merge branch 'dev/dev' into release/3.0 2024-12-01 20:27:58 +08:00
徐佩
8d6e3e9644 sketchboard-prompt 修改 2024-12-01 19:48:12 +08:00
徐佩
23b864d378 to prod 2024-12-01 17:37:52 +08:00
徐佩
be1119be6f bugfix : fast || high 2024-12-01 16:51:38 +08:00
徐佩
b836e7fd67 bugfix : fast || high 2024-12-01 16:32:51 +08:00
a237b4041d 模型选择 添加high || fast 2024-11-29 15:09:34 +08:00
ea4cd29723 to dev 2024-11-28 17:26:53 +08:00
13397fa1f7 to dev 2024-11-28 17:22:57 +08:00
2fab472150 to dev 2024-11-28 17:21:58 +08:00
8c71b4845a Merge branch 'release/3.0' into dev/dev
# Conflicts:
#	src/main/java/com/ai/da/service/impl/AccountServiceImpl.java
2024-11-28 17:19:40 +08:00
b70f909a32 优化-自动将Code-Create注册的新用户添加到AiDA 2024-11-28 17:14:11 +08:00
1b15aed6a2 支付优化-续订失败邮件通知 2024-11-28 10:43:06 +08:00
5019fbd3fc 支付优化 2024-11-25 10:53:09 +08:00
2ea19dcf03 Merge branch 'refs/heads/dev/dev' into dev/dev_xp 2024-11-19 17:09:36 +08:00
4d756d5624 支付优化 2024-11-19 17:08:16 +08:00
f6f759110f 支付优化--修改积分购买相应功能 2024-11-19 16:00:30 +08:00
8d27b5b51e 新增功能 -- 产品订阅 年度/月度 2024-11-18 16:20:25 +08:00
shahaibo
9f064609e7 TASK:谷歌登录 2024-11-13 15:45:40 +08:00
shahaibo
fd10d4dbc4 TASK:谷歌登录 2024-11-13 15:44:48 +08:00
shahaibo
fadb5faf0d TASK:谷歌登录 2024-11-12 15:34:43 +08:00
e5e514b522 ws优化 2024-11-11 17:31:55 +08:00
74e6d5a1da ws 联调修改 2024-11-11 17:24:49 +08:00
3cf0570912 ws 引入心跳 2024-11-11 16:34:55 +08:00
shahaibo
8da51a0a82 TASK:谷歌登录 2024-11-11 16:08:49 +08:00
shahaibo
37ff7fbb91 Merge remote-tracking branch 'origin/dev/dev' into dev/dev
# Conflicts:
#	src/main/java/com/ai/da/service/AccountService.java
2024-11-11 16:06:21 +08:00
shahaibo
8c20b51e13 TASK:谷歌登录 2024-11-11 16:04:26 +08:00
391a28d659 ws 2024-11-11 15:21:35 +08:00
4535fb7dfb ws 2024-11-11 15:07:02 +08:00
546d1b4c44 ws 设置session2分钟超时,以及心跳回复 2024-11-11 15:03:21 +08:00
5fe605c130 长连接 关闭日志打印 2024-11-11 10:45:57 +08:00
4408c0ecc6 to dev 2024-11-11 10:29:06 +08:00
49f08d1191 管理员系统优化-1 2024-11-06 17:51:51 +08:00
903bafb245 管理员系统优化 2024-11-06 17:27:16 +08:00
59b02b3f28 to prod 2024-11-04 10:49:29 +08:00
4a23e33080 BUGFIX:作品删除后,获取点赞详细报错 2024-11-04 10:42:35 +08:00
1e1b06fc48 chat-robot返回sketch图片地址变更 2024-10-29 16:53:17 +08:00
7c56d2bf4e to dev 2024-10-29 10:33:48 +08:00
4add0a806c 游客转试用用户,添加积分 2024-10-29 10:25:36 +08:00
c9bb7fe502 to prod 2024-10-29 10:03:21 +08:00
a8a7a129c9 Merge branch 'dev/dev' into release/3.0 2024-10-29 09:59:39 +08:00
c3c5532cb5 Merge branch 'dev/dev_xp' into dev/dev 2024-10-29 09:58:43 +08:00
78bfc16287 BUGFIX:imageToSketch 积分扣除校验 2024-10-29 09:57:34 +08:00
shahaibo
6c6162df74 BUGFIX:定时任务开启; 2024-10-23 08:54:00 +08:00
shahaibo
a837aff0fb BUGFIX:定时任务开启; 2024-10-22 10:06:12 +08:00
shahaibo
f673afc7fc TASK:配置 2024-10-21 10:59:50 +08:00
shahaibo
0ea96c728c BUGFIX:模特预览默认颜色添加; 2024-10-20 13:39:01 +08:00
shahaibo
77e71e3296 TASK:aida作品集查询; 2024-10-20 13:27:45 +08:00
shahaibo
ce870b9acf TASK:aida; 2024-10-20 11:50:52 +08:00
shahaibo
7f889b54e0 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-10-20 10:52:24 +08:00
shahaibo
ebd596d0d2 TASK:aida; 2024-10-20 10:52:14 +08:00
04ce95caa4 添加preview_submit字段to python 2024-10-15 10:44:26 +08:00
29bf172187 取消用户自定义mask的功能 2024-10-15 10:30:02 +08:00
shahaibo
41619febb9 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-10-14 11:18:30 +08:00
shahaibo
0f4b769d49 BUGFIX:moodboard合成图 裁剪; 2024-10-14 11:18:18 +08:00
66cd8217b9 更新undividedLayer临时访问地址缓存 2024-10-14 11:16:57 +08:00
e684c4e547 Merge branch 'release/3.0' into dev/dev
# Conflicts:
#	src/main/java/com/ai/da/common/constant/CommonConstant.java
#	src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java
#	src/main/java/com/ai/da/controller/PortfolioController.java
#	src/main/java/com/ai/da/model/dto/QueryPortfolioPageDTO.java
#	src/main/java/com/ai/da/service/PortfolioService.java
#	src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java
#	src/main/resources/messages_en.properties
#	src/main/resources/messages_zh.properties
2024-10-10 23:26:20 +08:00
c439f41d69 bugfix:参与活动作品为0时查询出错 2024-10-09 16:42:45 +08:00
823e96b014 发布准备 2024-10-09 15:47:29 +08:00
0cca24ee30 修改环境及打开监听 2024-10-09 15:44:47 +08:00
66cccd0867 添加校验,二创作品不能参与活动 2024-10-09 15:40:29 +08:00
463ddf3cb2 1、为发布的作品添加标签
2、修改标签
3、不允许用户重复参与活动
4、查询所有参与活动的作品
2024-10-09 13:51:16 +08:00
shahaibo
f0e0987f31 BUGFIX:发布作品返回作品ID; 2024-10-09 13:10:48 +08:00
shahaibo
16bea58ab5 BUGFIX:更新作品集作品名重复判断; 2024-10-09 11:43:05 +08:00
shahaibo
f2bbbaaeb6 BUGFIX:history retrieval返回新增portfolio信息; 2024-10-09 11:34:04 +08:00
shahaibo
5098f6f4a1 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-10-08 17:07:43 +08:00
shahaibo
bc1815ae1b TASK:pantone提示词; 2024-10-08 17:07:30 +08:00
6256c90958 bugfix:修改提取的sketch,图片后缀问题 2024-10-08 16:36:48 +08:00
f0bfe249e0 bugfix:修改提取的sketch,图片后缀问题 2024-10-08 16:17:45 +08:00
7bbfd7c506 Merge branch 'dev/dev_xp' into dev/dev 2024-10-08 15:49:39 +08:00
3c7cbe28a1 design single preview_submit 2024-10-08 15:48:53 +08:00
c834aacf3a Merge branch 'dev/dev_xp' into dev/dev 2024-10-08 15:44:36 +08:00
90b0ef41e3 bugfix:修改提取出的sketch 2024-10-08 15:44:01 +08:00
shahaibo
2aeeec4468 TASK:裁剪; 2024-10-08 14:05:13 +08:00
a7c5723e10 保存修改 2024-10-08 13:34:10 +08:00
shahaibo
ba595b9d2c Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-10-08 13:18:12 +08:00
shahaibo
d9118aaf93 TASK:AiDA workshop活动; 2024-10-08 13:17:55 +08:00
1bdc71998b 按标签查询作品 2024-10-08 13:13:13 +08:00
a597f7a67a 为作品添加标签 2024-10-07 21:27:37 +08:00
195964ef5a 重新获取修改后的sketch的临时访问地址 2024-10-07 11:28:48 +08:00
shahaibo
c27ca77717 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-10-06 14:33:44 +08:00
shahaibo
7d0d460e5c bugfix:redesign bug; 2024-10-06 14:33:31 +08:00
5ac9df3056 Merge branch 'dev/dev_xp' into dev/dev 2024-10-06 14:28:18 +08:00
b8d64f1f28 获取指定用户的个人主页作品 2024-10-06 14:27:55 +08:00
c8dd9664be Merge branch 'dev/dev_xp' into dev/dev 2024-10-04 16:10:05 +08:00
8899a3a6bb SketchStyle 去除自定义风格 2024-10-04 11:45:00 +08:00
shahaibo
67f56f9b84 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-10-04 10:41:23 +08:00
shahaibo
fd12b9e571 TASK:male sketch style逻辑添加; 2024-10-04 10:40:32 +08:00
fb329c94aa Merge branch 'dev/dev_xp' into dev/dev 2024-10-03 16:49:03 +08:00
16d06582ee 重置designSingle返回的sketch在minio的临时访问凭证 2024-10-03 16:41:48 +08:00
shahaibo
6f98f111dd TASK:十月优惠邮件发送接口; 2024-10-03 12:15:55 +08:00
shahaibo
51a1c1d8e1 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-10-03 12:14:43 +08:00
shahaibo
8445c23984 TASK:十月优惠邮件发送接口; 2024-10-03 12:14:30 +08:00
961f8f874e 获取消息 按时间逆序 2024-10-01 16:08:40 +08:00
283b6244b1 消息推送连接关闭时避免报错 2024-10-01 10:29:06 +08:00
f19a15dbe8 Merge branch 'dev/dev_xp' into dev/dev 2024-09-30 17:16:11 +08:00
791d44df02 消息推送 bug修改 2024-09-30 17:15:11 +08:00
shahaibo
28e67db78d TASK:aida redesign不修改位置信息√接口修改; 2024-09-30 15:41:29 +08:00
shahaibo
63a120c652 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-09-30 14:49:05 +08:00
shahaibo
f60cabbbc0 TASK:aida design统计; 2024-09-30 14:48:44 +08:00
06db759749 my work bug修复 2024-09-30 11:28:53 +08:00
shahaibo
373608d989 TASK:aida design统计; 2024-09-29 18:32:06 +08:00
shahaibo
45e3dde03f Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-09-29 17:59:00 +08:00
shahaibo
3625180a6e Merge branch 'release/3.0' into dev/dev
# Conflicts:
#	src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java
#	src/main/java/com/ai/da/controller/ThirdPartyController.java
#	src/main/java/com/ai/da/service/AccountService.java
#	src/main/java/com/ai/da/service/impl/AccountServiceImpl.java
2024-09-29 17:56:49 +08:00
aae1442a6f websocket获取关注数与粉丝数 2024-09-29 15:55:12 +08:00
08dcd03468 修改默认头像 2024-09-28 20:14:19 +08:00
shahaibo
deda511e32 TASK:aida; 2024-09-27 16:43:02 +08:00
shahaibo
9bcf615b4b TASK:aida; 2024-09-27 16:30:58 +08:00
shahaibo
70912c4c43 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-09-27 16:24:56 +08:00
shahaibo
fa013c1974 TASK:aida; 2024-09-27 16:24:45 +08:00
11fbeb1ed0 Merge branch 'dev/dev_xp' into dev/dev
# Conflicts:
#	src/main/java/com/ai/da/common/utils/RedisUtil.java
#	src/main/java/com/ai/da/service/AccountService.java
2024-09-27 15:43:48 +08:00
f432b8cce6 修改提取的sketch 2024-09-27 15:40:30 +08:00
shahaibo
05ddd33bcd TASK:aida; 2024-09-27 15:33:20 +08:00
shahaibo
9f5c901502 TASK:aida; 2024-09-27 14:42:30 +08:00
33d5d3a2ea 上传图片超时,邮件提醒开发相关人员 2024-09-26 11:46:23 +08:00
2668dd3c47 redis 添加key 2024-09-25 16:17:55 +08:00
2bc5fef175 1、修改用户名
2、更改账号绑定邮箱地址
2024-09-25 16:15:18 +08:00
ea92e1f20d to dev 2024-09-25 11:38:11 +08:00
9f1cf1d90e Merge branch 'dev/dev_xp' into dev/dev 2024-09-25 11:31:40 +08:00
b43f9baead 修改 imageToSketch 2024-09-25 11:30:51 +08:00
shahaibo
41ffe335fc TASK:mq配置 2024-09-24 15:43:37 +08:00
shahaibo
56d0dcd25f TASK:数据迁移 2024-09-24 15:20:24 +08:00
shahaibo
4304acbe6f BUGFIX:作品广场 2024-09-24 14:37:22 +08:00
2f1b22d423 Merge branch 'refs/heads/release/3.0' into dev/dev_xp
# Conflicts:
#	src/main/java/com/ai/da/common/utils/RedisUtil.java
#	src/main/java/com/ai/da/service/impl/AccountServiceImpl.java
#	src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java
2024-09-24 10:27:18 +08:00
3eb8626831 修改 imageToSketch 2024-09-24 10:20:08 +08:00
5a86f2e649 修改 imageToSketch 2024-09-23 11:13:44 +08:00
93e9c61943 1、新增 imageToSketch
2、删除无用代码
2024-09-20 11:32:09 +08:00
shahaibo
c5e9941adb BUGFIX:design colorboard元素混入sketchboard; 2024-09-20 11:31:48 +08:00
56679808e9 mask更新 从sketch分割 2024-09-19 09:50:56 +08:00
shahaibo
40f5705e7a TASK:凭证更新; 2024-09-13 11:24:14 +08:00
shahaibo
32975d9900 TASK:链接注册试用; 2024-09-13 11:16:17 +08:00
shahaibo
72db49e7f5 Merge remote-tracking branch 'origin/release/3.0' into release/3.0 2024-09-13 11:13:42 +08:00
shahaibo
472f5e65b4 TASK:凭证更新; 2024-09-13 11:13:23 +08:00
e2f8fb082c 广场用户注册修改 添加账户开始时间并设置积分为0 2024-09-13 10:43:28 +08:00
a47e53b19e mask 数据替换,代码暂存 2024-09-13 10:09:33 +08:00
c01acec9e6 Merge branch 'dev/dev_xp' into dev/dev 2024-09-09 10:50:14 +08:00
969d7586fc mask替换相关接口--未完善版,暂存 2024-09-06 12:34:36 +08:00
31a40ff7ca 关闭dev定时任务 2024-09-06 10:01:28 +08:00
afb9c99228 Merge branch 'dev/dev_xp' into dev/dev 2024-09-06 09:32:40 +08:00
8ee6a529a0 作品广场优化,将点赞前三和浏览量前三的作品放在第一页的最前面 2024-09-02 12:02:54 +08:00
cebc05d132 BUGFIX:管理员系统 添加新用户邮箱校验,相同的邮箱只能创建一个账号 2024-08-27 11:32:47 +08:00
d23ac82b1b TASK:code-create 注册用户添加为AiDA的游客
BUGFIX:0关注状态下获取动态
2024-08-27 11:27:05 +08:00
e86b576050 TASK:动态 2024-08-23 17:34:38 +08:00
8a774aa328 管理员系统 优化 按用户名或用户邮箱 查询用户design频率 2024-08-21 15:07:14 +08:00
c5da68dc47 1、获取关注、粉丝列表、消息详细 返回参数统一
2、管理员系统 按用户名或用户邮箱 查询用户design频率
2024-08-21 14:31:10 +08:00
28df672a7d 优化 获取关注、粉丝列表 2024-08-21 10:23:55 +08:00
203c88dd70 添加头像 2024-08-19 15:10:41 +08:00
fa86a2af45 添加关注、取消关注、获取关注列表、粉丝列表相关接口 2024-08-19 11:52:53 +08:00
ac28ba233c 消息通知系统-一键已读;反复点赞、关注及取消 数据存储处理, 2024-08-16 10:32:15 +08:00
shahaibo
47dc2bfc6e BUGFIX:二创变原创 2024-08-15 16:37:24 +08:00
085dac0630 消息通知系统 2024-08-15 16:25:44 +08:00
7b27b1362d Merge branch 'dev/dev_xp' into release/3.0
# Conflicts:
#	src/main/java/com/ai/da/service/impl/AccountServiceImpl.java
2024-08-12 09:54:28 +08:00
704e3c25bf BUG修复:用户更改套餐,积分/用户角色不变更问题 2024-08-12 09:51:39 +08:00
7e5b10aab3 通过邮箱查询账户,忽略邮箱大小写 2024-08-08 10:54:22 +08:00
3ccbd8f905 账号置为游客日志添加 2024-08-08 10:13:47 +08:00
89a234e77d to prod 2024-08-06 11:43:20 +08:00
388dd54bfa to prod 2024-08-06 11:41:48 +08:00
035c4412f1 Merge branch 'dev/dev' into release/3.0 2024-08-06 11:35:55 +08:00
d4eb7c846b to dev 2024-08-06 11:35:11 +08:00
fef50d7a37 Merge branch 'dev/dev_xp' into dev/dev 2024-08-06 11:30:02 +08:00
e5a95972a5 modify : 管理员系统 2024-08-06 11:29:33 +08:00
shahaibo
36a796b38b BUGFIX:多个印花 2024-08-05 17:44:53 +08:00
94927ae0a4 modify 2024-08-05 15:48:50 +08:00
4d7153661c Merge branch 'release/3.0' into dev/dev 2024-08-05 15:39:01 +08:00
76062136d6 Merge branch 'dev/dev_xp' into dev/dev 2024-08-05 15:38:05 +08:00
ea4ba74989 管理员系统功能添加 2024-08-05 15:19:02 +08:00
shahaibo
5a09d7a195 BUGFIX:过滤已废弃 2024-08-02 12:28:58 +08:00
shahaibo
e0332b9ddf BUGFIX:过滤已废弃 2024-08-02 12:21:30 +08:00
shahaibo
685ba09f7d BUGFIX:过滤已废弃 2024-08-02 12:13:32 +08:00
shahaibo
7aa1fc0342 BUGFIX:过滤已废弃 2024-08-02 11:56:17 +08:00
shahaibo
653264151a BUGFIX:过滤已废弃 2024-08-02 11:53:50 +08:00
shahaibo
fada00c738 BUGFIX:过滤已废弃 2024-08-02 11:36:58 +08:00
a10d30337a 支付切换为live 2024-08-01 10:30:44 +08:00
85ffed114b 语言适配 2024-08-01 10:07:24 +08:00
1093ac68b6 查询指定用户各功能使用情况 2024-08-01 10:00:26 +08:00
71e6abd816 to prod 2024-07-29 17:52:06 +08:00
00c948116e to prod 2024-07-29 17:50:40 +08:00
b6efd598bd to prod 2024-07-29 17:50:09 +08:00
bfe7ad4aa6 to prod 2024-07-29 17:49:16 +08:00
018ccef46a to prod 2024-07-29 17:47:09 +08:00
feb836f849 调查问卷 2024-07-29 17:36:32 +08:00
0106f21b86 Merge branch 'dev/dev_xp' into dev/dev 2024-07-29 17:31:21 +08:00
1b5f64785d 调查问卷查看 2024-07-29 17:24:14 +08:00
77a4aee88e 取消英文字母的正则匹配 2024-07-24 09:44:32 +08:00
shahaibo
ce1e2f3eab TASK:取消定时任务 2024-07-22 11:18:43 +08:00
shahaibo
75fbd2844b TASK:mq配置 2024-07-22 11:15:25 +08:00
shahaibo
832f331603 TASK:配置文件dev分支改为dev 2024-07-22 11:14:19 +08:00
9a2d58d922 正则匹配输入的英文文本 2024-07-22 09:46:11 +08:00
徐佩
34c4cd47ef Merge remote-tracking branch 'origin/release/3.0' into dev/dev
# Conflicts:
#	src/main/java/com/ai/da/common/task/AccountTask.java
2024-07-21 09:54:42 +08:00
c46f65600f 添加 开展活动接口 2024-07-19 15:40:54 +08:00
56ebcfbce2 stripe 设置支付链接语言 2024-07-17 17:17:04 +08:00
aa1eb7411e stripe 设置支付链接语言 2024-07-17 17:12:25 +08:00
4626ea3c55 prod stripe->live 2024-07-17 16:21:05 +08:00
5858f7dcf1 添加stripe接口路由到过滤器 2024-07-17 16:05:33 +08:00
440dfdcceb push to prod 开启定时任务 2024-07-17 15:32:58 +08:00
36e41ecd89 push to prod 配置修改 2024-07-17 15:28:55 +08:00
e1b08a9979 modify:Stripe 2024-07-17 15:26:11 +08:00
b9041d9c09 添加新的支付方式:Stripe 2024-07-16 16:59:58 +08:00
037a0d12ff Merge branch 'release/3.0' into dev/dev_xp 2024-07-15 13:57:20 +08:00
956b72729f Merge remote-tracking branch 'origin/release/3.0' into release/3.0 2024-07-15 13:48:00 +08:00
9b185e6919 游客到试用用户身份转换 2024-07-15 13:47:43 +08:00
shahaibo
f77de3a1f4 BUGFIX:token filter 2024-07-15 13:43:44 +08:00
f03d32030d 1、stripe
2、游客到试用用户身份转换
2024-07-15 13:42:18 +08:00
shahaibo
6a098ffa13 BUGFIX:发送每日申请试用用户邮件 2024-07-13 12:40:13 +08:00
shahaibo
12c10167f1 Merge remote-tracking branch 'origin/release/3.0' into release/3.0 2024-07-11 15:54:49 +08:00
shahaibo
679b213b6f BUGFIX:aida 2024-07-11 15:54:08 +08:00
shahaibo
6fa6c38398 BUGFIX:试用用户 2024-07-11 10:50:24 +08:00
925da9fa03 prod->local 合代码配置修改 2024-07-10 14:28:50 +08:00
8f0d45adf9 design 将未分割的图层添加到design_item_detail表中 2024-07-10 13:53:52 +08:00
505288fdb7 代码合并修改 2024-07-10 11:01:25 +08:00
44e045ece3 开启account-task 2024-07-10 11:00:17 +08:00
429fdad2b7 Merge branch 'test/stable' into release/3.0 2024-07-10 10:56:07 +08:00
46fbbd747e alipay-hk 配置文件位置修改 2024-07-10 10:47:36 +08:00
803bdfd291 alipay-hk 配置文件路径修改 2024-07-10 10:08:20 +08:00
shahaibo
6cbc4882fa BUGFIX:问卷调查 2024-07-10 09:49:41 +08:00
shahaibo
54f8d4b5e0 TASK:消费开启 2024-07-10 09:30:40 +08:00
shahaibo
314ad7a4f8 TASK:定时任务开启 2024-07-09 23:46:54 +08:00
shahaibo
a56510c35a TASK:变回develop环境 2024-07-09 23:44:40 +08:00
shahaibo
c2e2140ce6 Merge branch 'test/stable' into release/3.0
# Conflicts:
#	src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java
#	src/main/java/com/ai/da/service/impl/AccountServiceImpl.java
2024-07-09 23:40:58 +08:00
83915d332f Merge branch 'dev/dev' into test/stable 2024-07-09 17:30:54 +08:00
751aeb785d Merge branch 'dev/dev_xp' into dev/dev 2024-07-09 17:29:42 +08:00
7cadab9345 付费用户邮件通知 2024-07-09 17:28:38 +08:00
shahaibo
8a7b64dd65 Merge remote-tracking branch 'origin/test/stable' into test/stable 2024-07-09 17:11:05 +08:00
shahaibo
4c598200e5 TASK:邮件通知 2024-07-09 17:10:50 +08:00
shahaibo
d052918725 BUGFIX:t_design_item_detail_print level2type; 2024-07-09 17:10:50 +08:00
shahaibo
8fd6a3462e BUGFIX:颜色没返回; 2024-07-09 17:10:50 +08:00
shahaibo
11eb6595dd BUGFIX:游客注册主题; 2024-07-09 17:10:50 +08:00
shahaibo
0adfcb745d BUGFIX:喜欢的作品; 2024-07-09 17:10:50 +08:00
shahaibo
779e1e8be3 BUGFIX:like; 2024-07-09 17:10:49 +08:00
shahaibo
5297880c3b BUGFIX:aida; 2024-07-09 17:10:49 +08:00
shahaibo
6028ef8cdd TASK:邮件通知 2024-07-09 17:07:22 +08:00
shahaibo
c7de1779bd BUGFIX:t_design_item_detail_print level2type; 2024-07-09 15:25:20 +08:00
shahaibo
95bfb00a9d BUGFIX:颜色没返回; 2024-07-09 14:55:21 +08:00
shahaibo
5fc50f2d96 BUGFIX:游客注册主题; 2024-07-09 14:04:12 +08:00
shahaibo
22d7395e11 BUGFIX:喜欢的作品; 2024-07-09 13:53:57 +08:00
shahaibo
3d4ea89516 BUGFIX:like; 2024-07-09 13:14:46 +08:00
shahaibo
2ed63cafd0 TASK:生产消费暂时关闭; 2024-07-09 11:44:18 +08:00
shahaibo
701652c6b2 BUGFIX:aida; 2024-07-09 11:07:01 +08:00
shahaibo
df66b51e5c Merge branch 'dev/dev' into test/stable
# Conflicts:
#	src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java
2024-07-09 11:04:37 +08:00
shahaibo
0c6187a759 BUGFIX:aida; 2024-07-09 10:13:32 +08:00
shahaibo
2d6867b729 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-07-09 09:46:54 +08:00
shahaibo
0b8d0a1843 BUGFIX:aida; 2024-07-09 09:46:41 +08:00
64c7b8c1fd 机器人 total_cast 上限调整 2024-07-08 19:05:38 +08:00
shahaibo
42f1d47f82 BUGFIX:aida; 2024-07-08 16:17:13 +08:00
shahaibo
9ca0cd7c43 BUGFIX:aida; 2024-07-08 15:24:50 +08:00
shahaibo
4c187d1fbd BUGFIX:aida; 2024-07-08 14:42:59 +08:00
shahaibo
733de89883 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-07-08 09:32:54 +08:00
shahaibo
0e1a5a70df BUGFIX:aida; 2024-07-08 09:31:42 +08:00
5ecebd5117 修改印花 允许同时single和overall 2024-07-05 18:47:12 +08:00
c6626b230a Merge branch 'dev/dev' into dev/dev_xp 2024-07-05 18:42:03 +08:00
shahaibo
1cab7332f9 BUGFIX:aida; 2024-07-05 16:52:56 +08:00
shahaibo
c1d88943a9 BUGFIX:aida; 2024-07-05 11:26:46 +08:00
bc85e561d2 Merge branch 'dev/dev' into dev/dev_xp 2024-07-05 10:34:05 +08:00
shahaibo
be8968605b BUGFIX:aida; 2024-07-04 16:52:06 +08:00
569c2e719f Merge branch 'dev/dev' into dev/dev_xp
# Conflicts:
#	src/main/java/com/ai/da/service/impl/DesignServiceImpl.java
#	src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java
2024-07-04 14:42:51 +08:00
shahaibo
5fa7e36dc2 BUGFIX:aida; 2024-07-04 13:02:47 +08:00
shahaibo
4a533b3cf0 BUGFIX:aida; 2024-07-04 11:34:51 +08:00
d2129459fe S3Util 工具类修改 2024-07-03 16:43:22 +08:00
shahaibo
9784d07680 BUGFIX:aida; 2024-07-03 15:22:01 +08:00
shahaibo
a71fa4df51 BUGFIX:aida; 2024-07-02 15:23:27 +08:00
shahaibo
ce384dbba9 BUGFIX:aida; 2024-07-02 13:48:53 +08:00
shahaibo
dd8f5696a2 BUGFIX:aida; 2024-06-28 16:52:16 +08:00
shahaibo
4211bce256 BUGFIX:aida; 2024-06-28 15:45:39 +08:00
shahaibo
bc240cd2ee TASK:aida; 2024-06-27 17:36:47 +08:00
shahaibo
f869f8eb10 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-06-27 15:33:38 +08:00
shahaibo
9b438c78a3 TASK:aida; 2024-06-27 15:33:26 +08:00
a5b435b80f S3 Util 新增工具类 2024-06-26 18:00:47 +08:00
a64d4e30de Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-06-26 14:02:45 +08:00
0759452381 积分相关修改
1、BUGFIX: 用户表中的积分与积分详细中不统一;
2、To_Product_Image 添加扣除积分
3、每周刷新付费用户积分
2024-06-26 13:55:20 +08:00
shahaibo
58a78a5366 TASK:aida; 2024-06-26 13:24:27 +08:00
shahaibo
9bd695a24d TASK:aida; 2024-06-26 10:47:56 +08:00
e614e3a07a Merge branch 'dev/dev' into dev/dev_xp
# Conflicts:
#	src/main/java/com/ai/da/service/GenerateService.java
2024-06-25 16:59:41 +08:00
shahaibo
8c65592394 TASK:aida; 2024-06-25 16:43:54 +08:00
shahaibo
e093d694fd Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-06-25 16:43:44 +08:00
shahaibo
a5bfc4e41d TASK:aida; 2024-06-25 16:43:29 +08:00
be001477ce Merge branch 'dev/dev' into dev/dev_xp
# Conflicts:
#	src/main/java/com/ai/da/service/impl/ChatRobotServiceImpl.java
2024-06-25 15:42:22 +08:00
3e150b2067 获取服装category bug修改 2024-06-25 15:29:19 +08:00
8ea06c05e9 1、generate 积分扣除并添加相关积分详细
2、获取服装category bug修改
2024-06-25 12:18:18 +08:00
shahaibo
9b589eece6 TASK:aida; 2024-06-25 10:59:58 +08:00
shahaibo
ba4388b87d Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-06-25 10:57:22 +08:00
shahaibo
5b3a668ce7 TASK:aida; 2024-06-25 10:56:54 +08:00
aacbe92cdc generate cancel 2024-06-24 17:02:25 +08:00
57ab6c64ef flask 迁移到fast-api 9992 -> 9994 2024-06-24 14:33:34 +08:00
ffaef2ff6c Merge branch 'dev/dev' into dev/dev_xp 2024-06-24 10:43:50 +08:00
5113cb0606 to product image 9996 -> 9994 2024-06-22 17:27:50 +08:00
30d5466805 添加查询Code-Create数据库,监控新增付费记录并对付费用户进行账号新增或延长账号有效期的操作 2024-06-21 15:11:31 +08:00
8457a61ded generate 添加积分扣除 2024-06-20 15:26:22 +08:00
e7f9b77fe5 Merge branch 'dev/dev' into dev/dev_xp
# Conflicts:
#	src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java
2024-06-20 10:39:36 +08:00
shahaibo
6c0f65b801 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-06-20 10:31:13 +08:00
shahaibo
ad1fa0e4c2 TASK:aida; 2024-06-20 10:27:28 +08:00
227c742f0d 新增接口:调查问卷 2024-06-20 10:27:04 +08:00
c317942447 BUGFIX: getDetail印花不显示 2024-06-19 11:41:39 +08:00
shahaibo
a6f02bf22f BUGFIX:试用用户积分为0; 2024-06-18 14:57:52 +08:00
4f12aa92b6 slogan 参数校验 2024-06-18 13:13:20 +08:00
e6a2ce2b69 dev 配置文件修改 2024-06-18 10:19:56 +08:00
shahaibo
1f0439c7f9 BUGFIX:aida; 2024-06-17 19:33:54 +08:00
shahaibo
676ef74bdc TASK:aida; 2024-06-17 19:25:37 +08:00
shahaibo
b2bc47da99 Merge remote-tracking branch 'origin/dev/dev' into dev/dev
# Conflicts:
#	src/main/resources/application-dev.properties
2024-06-17 17:38:04 +08:00
shahaibo
02787db0a1 TASK:aida; 2024-06-17 17:37:15 +08:00
19524520f4 BUGFIX:sr 2024-06-17 17:34:27 +08:00
2a2c4b1d39 slogan访问地址变更 2024-06-17 13:31:44 +08:00
257c99698e fastapi -> flask 2024-06-17 13:21:58 +08:00
8ff8a7480f slogan 恢复 2024-06-17 11:21:54 +08:00
5e1ff16052 slogan 暂停监听 2024-06-17 10:51:35 +08:00
dbd89798d5 slogan 暂停监听 2024-06-17 10:42:45 +08:00
b5b6f737aa slogan 暂停监听 2024-06-17 10:41:36 +08:00
1d60a6a129 Merge branch 'dev/dev_xp' into dev/dev
# Conflicts:
#	src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java
2024-06-17 10:25:20 +08:00
0017568cc7 slogan 2024-06-17 10:21:49 +08:00
shahaibo
375f717721 TASK:aida; 2024-06-17 09:43:59 +08:00
shahaibo
18914bea7e TASK:aida; 2024-06-17 09:34:48 +08:00
fc48d8931f 2024-06-12 11:27:21 +08:00
619d33b412 Merge branch 'dev/dev' into dev/dev_xp
# Conflicts:
#	src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java
#	src/main/java/com/ai/da/service/impl/AccountServiceImpl.java
#	src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java
#	src/main/resources/application-dev.properties
#	src/main/resources/messages_en.properties
#	src/main/resources/messages_zh.properties
2024-06-12 10:50:05 +08:00
1a48527c70 1、design single 添加 design elements
2、design single -- print添加level2Type
3、替换部分flask接口 为 fastAPI接口
2024-06-12 10:41:59 +08:00
shahaibo
ee68a5d782 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-06-12 09:48:11 +08:00
shahaibo
3a29d25060 TASK:aida; 2024-06-12 09:47:55 +08:00
77f514a03b Merge branch 'release/3.0' into dev/dev_xp
# Conflicts:
#	src/main/java/com/ai/da/python/PythonService.java
#	src/main/java/com/ai/da/service/impl/DesignItemServiceImpl.java
2024-06-11 15:23:24 +08:00
954f6207ec design Single 允许画笔修改sketch后进行design 2024-06-05 11:43:35 +08:00
891f6fb15f Printboard level2Type 语言适配 2024-06-04 15:19:30 +08:00
49b086ad10 generate 添加Logo与Slogan 2024-06-03 17:13:48 +08:00
86e7119cfb AlipayHK 回调及相关数据处理 2024-05-31 16:28:23 +08:00
shahaibo
775ae3266c BUGFIX:定时任务开启; 2024-05-31 09:59:08 +08:00
1aea8e93f2 AlipayHK 新增指定订单查询接口 2024-05-30 09:54:49 +08:00
804dc9b1b4 添加aws S3访问工具类 2024-05-29 16:30:27 +08:00
bd543e56d5 开启消息队列的监听 2024-05-28 14:25:03 +08:00
shahaibo
3dc7866fba BUGFIX:渐变色回退; 2024-05-28 11:52:33 +08:00
shahaibo
ffd371e5b4 BUGFIX:渐变色回退; 2024-05-28 11:48:35 +08:00
shahaibo
40aad9d1a3 BUGFIX:渐变色回退; 2024-05-28 11:32:49 +08:00
709393a9a6 paypal 切换为live环境 2024-05-28 11:20:58 +08:00
fb8de15eca 不等比缩放 2024-05-28 11:17:46 +08:00
f4e9a3474a Merge branch 'test/stable' into release/3.0
# Conflicts:
#	src/main/java/com/ai/da/service/impl/AccountServiceImpl.java
2024-05-28 10:59:34 +08:00
shahaibo
890389843f BUGFIX:试用时间link14天; 2024-05-28 10:43:50 +08:00
db04267591 Merge branch 'dev/dev' into test/stable
# Conflicts:
#	src/main/resources/paypal-sandbox.properties
2024-05-27 18:26:36 +08:00
5ff2bf11d7 alipay 密钥文件 2024-05-27 18:10:20 +08:00
76618de386 不等比缩放 2024-05-27 18:07:33 +08:00
eda92b3f0b Merge branch 'dev/dev' into dev/dev_xp
# Conflicts:
#	src/main/java/com/ai/da/service/impl/WorkspaceServiceImpl.java
2024-05-27 15:13:20 +08:00
shahaibo
b1b4b4147c TASK:配置文件; 2024-05-27 15:06:24 +08:00
shahaibo
4ba5f63a62 TASK:workspace; 2024-05-27 15:05:46 +08:00
shahaibo
8b274b2822 Merge remote-tracking branch 'origin/release/3.0' into dev/dev
# Conflicts:
#	pom.xml
#	src/main/java/com/ai/da/common/utils/SendEmailUtil.java
#	src/main/java/com/ai/da/service/impl/WorkspaceServiceImpl.java
2024-05-27 15:03:02 +08:00
54cbaf4b80 Merge branch 'dev/dev' into dev/dev_xp
# Conflicts:
#	src/main/java/com/ai/da/service/impl/WorkspaceServiceImpl.java
#	src/main/resources/application-dev.properties
2024-05-27 13:24:51 +08:00
c688af01f2 Merge branch 'release/3.0' into dev/dev_xp
# Conflicts:
#	pom.xml
#	src/main/java/com/ai/da/common/utils/SendEmailUtil.java
2024-05-27 13:20:31 +08:00
shahaibo
37de7d9276 BUGFIX:design; 2024-05-24 15:18:01 +08:00
shahaibo
02b3a407a9 BUGFIX:色块重复 2024-05-23 16:38:40 +08:00
5ebf0669f5 alipay-hk 切换到live环境 2024-05-23 15:48:55 +08:00
shahaibo
031d71bf99 BUGFIX:design; 2024-05-22 15:12:37 +08:00
shahaibo
205f0d54c5 BUGFIX:workspace; 2024-05-22 14:09:16 +08:00
shahaibo
50e46fed02 Merge remote-tracking branch 'origin/dev/dev' into dev/dev
# Conflicts:
#	src/main/resources/application-dev.properties
2024-05-22 14:05:01 +08:00
shahaibo
1303b1805a TASK:style; 2024-05-22 11:40:01 +08:00
shahaibo
2845c2c8b9 BUGFIX:male_top; 2024-05-22 10:26:29 +08:00
shahaibo
cd817dbf57 TASK:style; 2024-05-22 09:50:34 +08:00
f9ce559915 paypal 切换回sandbox环境 2024-05-21 14:40:46 +08:00
e40401f61f paypal webhook切换到prod 2024-05-21 14:27:17 +08:00
shahaibo
6e64eb741a TASK:邮箱; 2024-05-20 22:32:45 +08:00
shahaibo
c4a37f5d73 TASK:邮件; 2024-05-20 09:34:20 +08:00
shahaibo
8f5a86db0b TASK:监听; 2024-05-18 08:19:55 +08:00
shahaibo
14c99f6c6b TASK:监听; 2024-05-18 01:31:26 +08:00
shahaibo
bf072e35f5 TASK:监听; 2024-05-18 01:16:15 +08:00
shahaibo
b8048704ba TASK:监听; 2024-05-18 01:00:42 +08:00
shahaibo
b6704c3caf TASK:取消监听; 2024-05-18 00:34:18 +08:00
shahaibo
6b07c84c80 TASK:检查令牌日志注释; 2024-05-17 21:14:39 +08:00
shahaibo
980e1547cd TASK:检查令牌日志注释; 2024-05-17 21:07:20 +08:00
shahaibo
ae2191f369 TASK:检查令牌日志注释; 2024-05-17 21:03:56 +08:00
shahaibo
4b1a58c036 TASK:检查令牌日志注释; 2024-05-17 20:58:54 +08:00
shahaibo
4dbd5a1fad TASK:检查令牌日志注释; 2024-05-17 20:27:58 +08:00
shahaibo
b063cad764 TASK:配置文件; 2024-05-17 19:40:52 +08:00
shahaibo
f1eb48ae74 TASK:配置文件; 2024-05-17 19:25:50 +08:00
shahaibo
7233540ab4 Merge branch 'test/stable' into release/3.0
# Conflicts:
#	src/main/resources/application-dev.properties
#	src/main/resources/application-prod.properties
#	src/main/resources/application-test.properties
2024-05-17 18:14:12 +08:00
shahaibo
e634481113 TASK:配置文件; 2024-05-17 17:59:04 +08:00
shahaibo
b3591f879d TASK:试用时间; 2024-05-17 15:23:26 +08:00
shahaibo
12c447d6b0 TASK:配置文件; 2024-05-17 12:14:20 +08:00
shahaibo
c73876e8b0 TASK:配置文件; 2024-05-17 12:13:35 +08:00
shahaibo
a726ceca59 TASK:配置文件; 2024-05-17 11:40:38 +08:00
shahaibo
51db8b4ec2 TASK:无新增用户邮件; 2024-05-17 11:36:53 +08:00
shahaibo
9f4dbda152 TASK:无新增用户邮件; 2024-05-17 10:39:00 +08:00
shahaibo
8e1766eed0 Merge remote-tracking branch 'origin/temp0516' into test/stable
# Conflicts:
#	pom.xml
#	src/main/java/com/ai/da/common/config/MyTaskScheduler.java
#	src/main/java/com/ai/da/service/impl/AccountServiceImpl.java
2024-05-17 10:31:29 +08:00
shahaibo
f1d67f2f7d Merge branch 'release/3.0' into test/stable 2024-05-17 10:22:42 +08:00
shahaibo
ebb6577e98 TASK:portfolio; 2024-05-17 10:19:34 +08:00
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
840 changed files with 45275 additions and 5931 deletions

48
.gitignore vendored
View File

@@ -1,2 +1,50 @@
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
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"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
<module version="4">
<component name="FacetManager">
<facet type="Spring" name="Spring">
<configuration />
</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>
</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-----

206
pom.xml
View File

@@ -28,7 +28,19 @@
<jaxb-core>4.0.0</jaxb-core>
<activation>1.1.1</activation>
<easy-captcha>1.6.2</easy-captcha>
<aws.java.sdk.version>2.20.43</aws.java.sdk.version>
</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>
<dependency>
<groupId>org.springframework.boot</groupId>
@@ -76,6 +88,12 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
@@ -133,11 +151,171 @@
<version>3.0.3</version>
</dependency>
<!-- /**发送邮件**/-->
<!-- <dependency>-->
<!-- <groupId>com.tencentcloudapi</groupId>-->
<!-- <artifactId>tencentcloud-sdk-java-ses</artifactId>-->
<!-- <version>3.1.572</version>-->
<!-- </dependency>-->
<dependency>
<groupId>com.tencentcloudapi</groupId>
<artifactId>tencentcloud-sdk-java-ses</artifactId>
<artifactId>tencentcloud-sdk-java</artifactId>
<version>3.1.572</version>
</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>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
<groupId>com.google.auth</groupId>
<artifactId>google-auth-library-oauth2-http</artifactId>
<version>1.8.0</version>
</dependency>
<dependency>
<groupId>com.google.api-client</groupId>
<artifactId>google-api-client</artifactId>
<version>1.32.1</version>
</dependency>
<dependency>
<groupId>com.google.oauth-client</groupId>
<artifactId>google-oauth-client</artifactId>
<version>1.32.1</version>
</dependency>
<dependency>
<groupId>com.google.http-client</groupId>
<artifactId>google-http-client-jackson2</artifactId>
<version>1.41.5</version>
</dependency>
</dependencies>
<build>
@@ -157,4 +335,30 @@
</plugins>
</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>

0
run.shell Normal file
View File

View File

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

View File

@@ -0,0 +1,332 @@
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.ai.da.service.UserLikeGroupService;
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.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
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 UserLikeGroupService userLikeGroupService;
@Autowired
private RabbitMQProperties rabbitMQProperties;
@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 if (generateResult.get("status").equals("NO_FACE")) {
String taskId = generateResult.get("tasks_id");
userLikeGroupService.toProduct(taskId);
} 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 if (generateResult.get("status").equals("NO_FACE")) {
String taskId = generateResult.get("tasks_id");
userLikeGroupService.relight(taskId);
} else {
// 修改redis中的数据状态为exception
String key = relightResultKey + ":" + generateResult.get("tasks_id");
redisUtil.addToString(key, new Gson().toJson(new GenerateResultVO(generateResult.get("tasks_id"), null, null, "Fail")), CommonConstant.GENERATE_RESULT_EXPIRE_TIME);
// 将异常信息存到exception中
HashMap<String, String> exceptionInfo = new HashMap<>();
exceptionInfo.put(generateResult.get("tasks_id"), generateResult.get("data"));
// 存redis
redisUtil.addToMap(exceptionMapKey, exceptionInfo);
}
} catch (Exception e) {
log.error(e.getMessage());
try {
channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false);
// 将消息从redis排队队列中删除,需保证被消费的消息存储到db之后再从redis删除
redisUtil.removeFromZSet(consumptionOrderKey, generateResult.get("tasks_id"));
} catch (IOException exception) {
log.error("手动确认,取消返回队列,不再重新消费");
}
// 将入参和错误信息存入数据库
String exceptionMessage = JSONObject.toJSONString(generateResult) +
" Exception message " + e.getMessage();
HashMap<String, String> exceptionInfo = new HashMap<>();
exceptionInfo.put(String.valueOf(generateResult.get("tasks_id")), exceptionMessage);
// 存redis
redisUtil.addToMap(exceptionMapKey, exceptionInfo);
}
long end = System.currentTimeMillis();
log.info("tasks_id : {}, end , message : {}, 执行时长: {} 毫秒", generateResult.get("tasks_id"), generateResult.get("message"), (end - start));
log.info("============ProcessRelightResult End listening==========");
}
@RabbitListener(queues = "#{rabbitMQProperties.queues.generate}")
@RabbitHandler
public void generateConsumer1(Message msg, Channel channel) {
generate(msg, channel, "consumer 1");
}
@RabbitListener(queues = "#{rabbitMQProperties.queues.generate}")
@RabbitHandler
public void generateConsumer2(Message msg, Channel channel) {
generate(msg, channel, "consumer 2");
}
@RabbitListener(queues = "#{rabbitMQProperties.queues.generate}")
@RabbitHandler
public void generateConsumer3(Message msg, Channel channel) {
generate(msg, channel, "consumer 3");
}
@RabbitListener(queues = "#{rabbitMQProperties.queues.generate}")
@RabbitHandler
public void generateConsumer4(Message msg, Channel channel) {
generate(msg, channel, "consumer 4");
}
@RabbitListener(queues = "#{rabbitMQProperties.queues.generate}")
@RabbitHandler
public void generateConsumer5(Message msg, Channel channel) {
generate(msg, channel, "consumer 5");
}
@RabbitListener(queues = "#{rabbitMQProperties.queues.generate}")
@RabbitHandler
public void generateConsumer6(Message msg, Channel channel) {
generate(msg, channel, "consumer 6");
}
@RabbitListener(queues = "#{rabbitMQProperties.queues.generate}")
@RabbitHandler
public void generateConsumer7(Message msg, Channel channel) {
generate(msg, channel, "consumer 7");
}
@RabbitListener(queues = "#{rabbitMQProperties.queues.generate}")
@RabbitHandler
public void generateConsumer8(Message msg, Channel channel) {
generate(msg, channel, "consumer 8");
}
@RabbitListener(queues = "#{rabbitMQProperties.queues.generate}")
@RabbitHandler
public void generateConsumer9(Message msg, Channel channel) {
generate(msg, channel, "consumer 9");
}
@RabbitListener(queues = "#{rabbitMQProperties.queues.generateResult}")
@RabbitHandler
public void getGenerateResult(Message msg, Channel channel) {
processGenerateResult(msg, channel);
}
@RabbitListener(queues = "#{rabbitMQProperties.queues.toProductImageResult}")
@RabbitHandler
public void getToProductImageResult(Message msg, Channel channel) {
processToProductImageResult(msg, channel);
}
@RabbitListener(queues = "#{rabbitMQProperties.queues.relightResult}")
@RabbitHandler
public void getRelightResult(Message msg, Channel channel) {
processRelightResult(msg, channel);
}
}

View File

@@ -0,0 +1,43 @@
package com.ai.da.common.RabbitMQ;
import org.springframework.amqp.core.Queue;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MQConfig {
@Autowired
private RabbitMQProperties rabbitMQProperties;
@Bean
public Queue generateQueue() {
return new Queue(rabbitMQProperties.getQueues().getGenerate());
}
@Bean
public Queue SRQueue() {
return new Queue(rabbitMQProperties.getQueues().getSr());
}
@Bean
public Queue SRResultQueue() {
return new Queue(rabbitMQProperties.getQueues().getSrResult());
}
@Bean
public Queue generateResultQueue() {
return new Queue(rabbitMQProperties.getQueues().getGenerateResult());
}
@Bean
public Queue toProductImageResultQueue() {
return new Queue(rabbitMQProperties.getQueues().getToProductImageResult());
}
@Bean
public Queue relightResultQueue() {
return new Queue(rabbitMQProperties.getQueues().getRelightResult());
}
}

View File

@@ -0,0 +1,29 @@
package com.ai.da.common.RabbitMQ;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@Slf4j
@Component
public class MQPublisher {
@Autowired
private RabbitMQProperties rabbitMQProperties;
@Autowired
private AmqpTemplate amqpTemplate;
public void sendGenerateMessage(String mm) {
log.info("send message: " + mm);
amqpTemplate.convertAndSend(rabbitMQProperties.getQueues().getGenerate(), mm);
}
public void sendSRMessage(String mm) {
log.info("send message: " + mm);
amqpTemplate.convertAndSend(rabbitMQProperties.getQueues().getSr(), mm);
}
}

View File

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

View File

@@ -0,0 +1,237 @@
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.Autowired;
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 {
@Autowired
private RabbitMQProperties rabbitMQProperties;
@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 = "#{rabbitMQProperties.queues.sr}")
@RabbitHandler
public void SRConsumer1(Message msg, Channel channel) {
superResolution(msg, channel, "consumer 1");
}
@RabbitListener(queues = "#{rabbitMQProperties.queues.srResult}")
@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;
public ElPath getSys(){
public ElPath getSys() {
String os = System.getProperty("os.name");
if(os.toLowerCase().startsWith("win")) {
if (os.toLowerCase().startsWith("win")) {
return windows;
} else if(os.toLowerCase().startsWith("mac")){
} else if (os.toLowerCase().startsWith("mac")) {
return mac;
}
return linux;
}
public String getLinuxDomain(){
public String getLinuxDomain() {
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 null;
}
@Data
public static class ElPath{
public static class ElPath {
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,398 @@
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.ai.da.model.enums.StyleEnum;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
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;
@Slf4j
@Component
public class MyTaskScheduler {
@PostConstruct
public void test() {
// clearMinio();
// addSystemFileStyle();
// sendTrialOrderExcelToManagements();
}
@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 9 * * ?")
public void sendTrialOrderExcelToManagements() {
// 获取前一天日期
LocalDate yesterday = LocalDate.now().minusDays(1);
// LocalDate before = LocalDate.now().minusDays(4);
// 查询前一天的试用订单
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));
if (!ObjectUtils.isEmpty(trialOrder.getUpdateTime())) {
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);
// SendEmailUtil.sendExcelEmail("ningning@code-create.com.hk", null, Files.readAllBytes(Paths.get(fileName)), fileName);
SendEmailUtil.sendExcelEmail("johnnyho@code-create.com.hk", null, Files.readAllBytes(Paths.get(fileName)), fileName);
SendEmailUtil.sendExcelEmail("ringolau@code-create.com.hk", null, Files.readAllBytes(Paths.get(fileName)), fileName);
SendEmailUtil.sendExcelEmail("chelseayu@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);
// SendEmailUtil.sendNoExcelEmail("ningning@code-create.com.hk", null);
SendEmailUtil.sendNoExcelEmail("johnnyho@code-create.com.hk", null);
SendEmailUtil.sendNoExcelEmail("ringolau@code-create.com.hk", null);
SendEmailUtil.sendNoExcelEmail("chelseayu@code-create.com.hk", null);
}
}
@Resource
private UserLikeGroupMapper userLikeGroupMapper;
@Resource
private UserLikeMapper userLikeMapper;
@Resource
private TDesignPythonOutfitMapper designPythonOutfitMapper;
@Resource
private TDesignPythonOutfitDetailMapper designPythonOutfitDetailMapper;
@Resource
private DesignItemMapper designItemMapper;
@Resource
private DesignItemDetailMapper designItemDetailMapper;
@Resource
private MinioUtil minioUtil;
public void clearMinio() {
// 获取当前所有history
QueryWrapper<UserLikeGroup> userLikeGroupQueryWrapper = new QueryWrapper<>();
List<UserLikeGroup> userLikeGroupList = userLikeGroupMapper.selectList(userLikeGroupQueryWrapper);
List<Long> userLikeGroupIdList = userLikeGroupList.stream().map(UserLikeGroup::getId).collect(Collectors.toList());
QueryWrapper<UserLike> userLikeQueryWrapper = new QueryWrapper<>();
userLikeQueryWrapper.lambda().in(UserLike::getUserLikeGroupId, userLikeGroupIdList);
// 所有喜欢的图片
List<UserLike> userLikes = userLikeMapper.selectList(userLikeQueryWrapper);
List<Long> designOutfitIdList = userLikes.stream().map(UserLike::getDesignOutfitId).collect(Collectors.toList());
QueryWrapper<TDesignPythonOutfit> designPythonOutfitQueryWrapper = new QueryWrapper<>();
designPythonOutfitQueryWrapper.lambda().notIn(TDesignPythonOutfit::getId, designOutfitIdList);
List<TDesignPythonOutfit> tDesignPythonOutfits = designPythonOutfitMapper.selectList(designPythonOutfitQueryWrapper);
// int i = 0;
// for (TDesignPythonOutfit tDesignPythonOutfit : tDesignPythonOutfits) {
// String designUrl = tDesignPythonOutfit.getDesignUrl();
// if (StringUtils.isNotBlank(designUrl)) {
// minioUtil.deleteObject(designUrl);
// i ++;
// }
// QueryWrapper<TDesignPythonOutfitDetail> designPythonOutfitDetailQueryWrapper = new QueryWrapper<>();
// designPythonOutfitDetailQueryWrapper.lambda().eq(TDesignPythonOutfitDetail::getDesignPythonOutfitId, tDesignPythonOutfit.getId());
// List<TDesignPythonOutfitDetail> tDesignPythonOutfitDetails = designPythonOutfitDetailMapper.selectList(designPythonOutfitDetailQueryWrapper);
// for (TDesignPythonOutfitDetail tDesignPythonOutfitDetail : tDesignPythonOutfitDetails) {
// if (!tDesignPythonOutfitDetail.getImageCategory().equals("body")) {
// if (StringUtils.isNotBlank(tDesignPythonOutfitDetail.getImageUrl())) {
// minioUtil.deleteObject(tDesignPythonOutfitDetail.getImageUrl());
// i ++;
// }
// if (StringUtils.isNotBlank(tDesignPythonOutfitDetail.getMaskUrl())) {
// minioUtil.deleteObject(tDesignPythonOutfitDetail.getMaskUrl());
// i ++;
// }
// }
// }
// }
System.out.println("i");
// List<Long> designItemIdList = userLikes.stream().map(UserLike::getDesignItemId).collect(Collectors.toList());
// QueryWrapper<DesignItem> designItemQueryWrapper = new QueryWrapper<>();
// designItemQueryWrapper.lambda().in(DesignItem::getId,designItemIdList);
// List<DesignItem> designItems = designItemMapper.selectList(designItemQueryWrapper);
// for (DesignItem designItem : designItems) {
// QueryWrapper<DesignItemDetail> designItemDetailQueryWrapper = new QueryWrapper<>();
// designItemDetailQueryWrapper.lambda().eq(DesignItemDetail::getDesignItemId, designItem.getId());
// List<DesignItemDetail> designItemDetails = designItemDetailMapper.selectList(designItemDetailQueryWrapper);
// for (DesignItemDetail designItemDetail : designItemDetails) {
//
// }
// }
}
@Resource
private AttributeRetrievalMapper attributeRetrievalMapper;
public void addSystemFileStyle() {
// ExecutorService executorService = Executors.newFixedThreadPool(5);
// try {
// String[] filePaths = {
// "C:\\Users\\10233\\Downloads\\OneDrive_1_2024-10-3\\Mens bottom style output.xlsx",
// "C:\\Users\\10233\\Downloads\\OneDrive_1_2024-10-3\\Mens outer style output.xlsx",
// "C:\\Users\\10233\\Downloads\\OneDrive_1_2024-10-3\\Mens top style output.xlsx"
//// "/workspace/shb/Mens_bottom_style_output.xlsx",
//// "/workspace/shb/Mens_outer_style_output.xlsx",
//// "/workspace/shb/Mens_top_style_output.xlsx"
// };
//
// for (String filePath : filePaths) {
//// executorService.submit(() -> processExcelFile(filePath));
// processExcelFile(filePath);
// }
// }catch (Exception e) {
//
// }
// } finally {
// executorService.shutdown();
// try {
// if (!executorService.awaitTermination(60, TimeUnit.MINUTES)) {
// executorService.shutdownNow();
// }
// } catch (InterruptedException e) {
// executorService.shutdownNow();
// }
// }
String[] filePaths = {
"C:\\Users\\10233\\Downloads\\OneDrive_1_2024-10-3\\Mens bottom style output.xlsx",
"C:\\Users\\10233\\Downloads\\OneDrive_1_2024-10-3\\Mens outer style output.xlsx",
"C:\\Users\\10233\\Downloads\\OneDrive_1_2024-10-3\\Mens top style output.xlsx"
// "/workspace/shb/Mens_bottom_style_output.xlsx",
// "/workspace/shb/Mens_outer_style_output.xlsx",
// "/workspace/shb/Mens_top_style_output.xlsx"
};
for (String filePath : filePaths) {
// executorService.submit(() -> processExcelFile(filePath));
processExcelFile(filePath);
}
}
private void processExcelFile(String filePath) {
System.out.println("线程开始");
try {
List<List<String>> excelData = ExcelReader.readExcel(filePath);
String tableName = getTableNameFromFilePath(filePath);
String prefix = getPrefixFromFilePath(filePath);
for (List<String> columnData : excelData) {
String style = columnData.get(0);
for (int i = 1; i < columnData.size(); i++) {
String fileName = columnData.get(i);
if (StringUtils.isBlank(fileName)) {
continue;
}
if ("X".equals(style)) {
attributeRetrievalMapper.updateStyleByFileName("X", prefix + fileName, tableName);
System.out.println(fileName);
} else {
// if (style.equals("Y2K 风")) {
// StyleEnum.COUNTRY_STYLE
// }else if (style.equals("")) {
//
// }else if (style.equals("")) {
//
// }else if (style.equals("")) {
//
// }else if (style.equals("")) {
//
// }else if (style.equals("")) {
//
// }else if (style.equals("")) {
//
// }else if (style.equals("")) {
//
// }else if (style.equals("")) {
//
// }else if (style.equals("")) {
//
// }else if (style.equals("")) {
//
// }else if (style.equals("")) {
//
// }else if (style.equals("")) {
//
// }else if (style.equals("")) {
//
// }else if (style.equals("")) {
//
// }
attributeRetrievalMapper.updateStyleByFileName(style, prefix + fileName, tableName);
System.out.println(fileName);
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
private String getTableNameFromFilePath(String filePath) {
if (filePath.contains("Blouse")) {
return "female_top";
} else if (filePath.contains("Dress")) {
return "female_dress";
} else if (filePath.contains("Outerwear")) {
return "female_outwear";
} else if (filePath.contains("Skirt")) {
return "female_skirt";
} else if (filePath.contains("Trousers")) {
return "female_pants";
} else if (filePath.contains("bottom")) {
return "male_bottom";
} else if (filePath.contains("outer")) {
return "male_outwear";
} else if (filePath.contains("top")) {
return "male_top";
}
return "";
}
private String getPrefixFromFilePath(String filePath) {
if (filePath.contains("Blouse")) {
return "blouse/";
} else if (filePath.contains("Dress")) {
return "dress/";
} else if (filePath.contains("Outerwear")) {
return "outwear/";
} else if (filePath.contains("Skirt")) {
return "skirt/";
} else if (filePath.contains("Trousers")) {
return "trousers/";
} else if (filePath.contains("bottom")) {
return "bottom/";
} else if (filePath.contains("outer")) {
return "outer/";
} else if (filePath.contains("top")) {
return "top/";
}
return "";
}
// public static List<String> getFileNames(String directoryPath) {
// List<String> fileNames = new ArrayList<>();
// Path path = Paths.get(directoryPath);
//
// try (DirectoryStream<Path> stream = Files.newDirectoryStream(path)) {
// for (Path entry : stream) {
// if (Files.isRegularFile(entry)) {
// fileNames.add(entry.getFileName().toString());
// }
// }
// } catch (IOException e) {
// System.err.println("Error reading directory: " + e.getMessage());
// }
//
// return fileNames;
// }
}

View File

@@ -1,20 +1,26 @@
package com.ai.da.common.config.mybatis.plus;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@MapperScan("com.ai.da.mapper")
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
package com.ai.da.common.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MybatisPlusConfig {
@Bean(name = "primaryMybatisPlusInterceptor")
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();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
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

@@ -39,4 +39,4 @@ public class WebConfig extends WebMvcConfigurerAdapter {
methodValidationPostProcessor.setValidator(validator());
return methodValidationPostProcessor;
}
}
}

View File

@@ -1,8 +1,19 @@
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.model.enums.Language;
import com.ai.da.model.vo.AuthPrincipalVo;
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
* @description: 业务异常
@@ -14,15 +25,49 @@ public class BusinessException extends RuntimeException {
private Integer code;
private String msg;
public BusinessException(ResultEnum resultEnum){
super(resultEnum.getMsg());
public BusinessException(ResultEnum resultEnum) {
this.code = resultEnum.getCode();
this.msg = resultEnum.getMsg();
this.msg = getMessageFromResource(resultEnum.getMsg(), getUserLocale());
}
public BusinessException(String msg) {
super(msg);
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.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
* @return ResponseData
*/
@@ -63,19 +64,22 @@ public class ExceptionCatch {
@ExceptionHandler(BindException.class)
public Response<String> bindExceptionHandler(BindException e) {
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
* @return ResponseData
*/
@ResponseBody
@ExceptionHandler(MethodArgumentNotValidException.class)
public Response<String> methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {
public Response<String> handleValidationException(MethodArgumentNotValidException e) {
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

@@ -0,0 +1,12 @@
package com.ai.da.common.config.exception;
public class TokenMissingOrExpiredException extends RuntimeException {
public TokenMissingOrExpiredException(String message) {
super(message);
}
@Override
public Throwable fillInStackTrace() {
return this;
}
}

View File

@@ -1,12 +1,12 @@
package com.ai.da.common.config.mybatis.plus;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import org.apache.ibatis.annotations.Param;
public interface CommonMapper<T> extends BaseMapper<T> {
IPage<T> voPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
}
package com.ai.da.common.config.mybatis.plus;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import org.apache.ibatis.annotations.Param;
public interface CommonMapper<T> extends BaseMapper<T> {
IPage<T> voPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
}

View File

@@ -1,48 +1,48 @@
package com.ai.da.common.config.mybatis.plus;
import cn.hutool.core.collection.CollUtil;
import com.ai.da.common.response.PageResponse;
import com.ai.da.common.response.Response;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Collectors;
public class CommonServiceImpl<M extends CommonMapper<T>, T, E> extends ServiceImpl<M, T> {
public PageResponse<E> voPage(QueryCriteria<T, E> criteria) {
IPage<T> tPage = baseMapper.voPage(new Page<>(criteria.getPage(), criteria.getLimit()), criteria.buildWrapper());
if (criteria.getMapper() != null && tPage != null && CollUtil.isNotEmpty(tPage.getRecords())) {
List<E> convert = convert(tPage, criteria.getMapper(), criteria);
Response<List<E>> response = Response.success(convert);
PageResponse<E> pageResponse = new PageResponse<>(response, tPage.getCurrent(), tPage.getSize(), tPage.getTotal(), tPage.getPages());
if (criteria.getPeekAllAfter() != null) {
Consumer<List<E>> peekAllAfter = criteria.getPeekAllAfter();
peekAllAfter.accept(pageResponse.getData());
}
return pageResponse;
}
PageResponse<E> pageResponse = new PageResponse<>(null, criteria.getPage(), criteria.getLimit(), 0, 0);
if (criteria.getPeekAllAfter() != null) {
Consumer<List<E>> peekAllAfter = criteria.getPeekAllAfter();
peekAllAfter.accept(pageResponse.getData());
}
return pageResponse;
}
List<E> convert(IPage<T> page, Function<? super T, E> mapper, QueryCriteria<T, E> criteria) {
if (criteria.getPeekBefore() != null && criteria.getPeekAfter() != null) {
return page.getRecords().stream().peek(criteria.getPeekBefore()).map(mapper).peek(criteria.getPeekAfter()).collect(Collectors.toList());
} else if (criteria.getPeekBefore() != null && criteria.getPeekAfter() == null) {
return page.getRecords().stream().peek(criteria.getPeekBefore()).map(mapper).collect(Collectors.toList());
} else if (criteria.getPeekBefore() == null && criteria.getPeekAfter() != null) {
return page.getRecords().stream().map(mapper).peek(criteria.getPeekAfter()).collect(Collectors.toList());
}
return page.getRecords().stream().map(mapper).collect(Collectors.toList());
}
}
package com.ai.da.common.config.mybatis.plus;
import cn.hutool.core.collection.CollUtil;
import com.ai.da.common.response.PageResponse;
import com.ai.da.common.response.Response;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Collectors;
public class CommonServiceImpl<M extends CommonMapper<T>, T, E> extends ServiceImpl<M, T> {
public PageResponse<E> voPage(QueryCriteria<T, E> criteria) {
IPage<T> tPage = baseMapper.voPage(new Page<>(criteria.getPage(), criteria.getLimit()), criteria.buildWrapper());
if (criteria.getMapper() != null && tPage != null && CollUtil.isNotEmpty(tPage.getRecords())) {
List<E> convert = convert(tPage, criteria.getMapper(), criteria);
Response<List<E>> response = Response.success(convert);
PageResponse<E> pageResponse = new PageResponse<>(response, tPage.getCurrent(), tPage.getSize(), tPage.getTotal(), tPage.getPages());
if (criteria.getPeekAllAfter() != null) {
Consumer<List<E>> peekAllAfter = criteria.getPeekAllAfter();
peekAllAfter.accept(pageResponse.getData());
}
return pageResponse;
}
PageResponse<E> pageResponse = new PageResponse<>(null, criteria.getPage(), criteria.getLimit(), 0, 0);
if (criteria.getPeekAllAfter() != null) {
Consumer<List<E>> peekAllAfter = criteria.getPeekAllAfter();
peekAllAfter.accept(pageResponse.getData());
}
return pageResponse;
}
List<E> convert(IPage<T> page, Function<? super T, E> mapper, QueryCriteria<T, E> criteria) {
if (criteria.getPeekBefore() != null && criteria.getPeekAfter() != null) {
return page.getRecords().stream().peek(criteria.getPeekBefore()).map(mapper).peek(criteria.getPeekAfter()).collect(Collectors.toList());
} else if (criteria.getPeekBefore() != null && criteria.getPeekAfter() == null) {
return page.getRecords().stream().peek(criteria.getPeekBefore()).map(mapper).collect(Collectors.toList());
} else if (criteria.getPeekBefore() == null && criteria.getPeekAfter() != null) {
return page.getRecords().stream().map(mapper).peek(criteria.getPeekAfter()).collect(Collectors.toList());
}
return page.getRecords().stream().map(mapper).collect(Collectors.toList());
}
}

View File

@@ -1,19 +1,19 @@
package com.ai.da.common.config.mybatis.plus;
import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;
import com.baomidou.mybatisplus.core.metadata.TableInfo;
import org.springframework.context.annotation.Configuration;
import java.util.List;
@Configuration
public class CustomerSqlInjector extends DefaultSqlInjector {
@Override
public List<AbstractMethod> getMethodList(Class<?> mapperClass, TableInfo tableInfo) {
List<AbstractMethod> methodList = super.getMethodList(mapperClass, tableInfo);
methodList.add(new SelectVoPage());
return methodList;
}
}
package com.ai.da.common.config.mybatis.plus;
import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;
import com.baomidou.mybatisplus.core.metadata.TableInfo;
import org.springframework.context.annotation.Configuration;
import java.util.List;
@Configuration
public class CustomerSqlInjector extends DefaultSqlInjector {
@Override
public List<AbstractMethod> getMethodList(Class<?> mapperClass, TableInfo tableInfo) {
List<AbstractMethod> methodList = super.getMethodList(mapperClass, tableInfo);
methodList.add(new SelectVoPage());
return methodList;
}
}

View File

@@ -1,85 +1,85 @@
package com.ai.da.common.config.mybatis.plus;
import cn.hutool.core.util.StrUtil;
import com.ai.da.common.annotation.Condition;
import com.ai.da.common.annotation.Order;
import com.ai.da.common.enums.ConditionType;
import com.ai.da.common.utils.ConvertUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.lang.reflect.Field;
import java.util.Collection;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
/**
* @author: dangweijian
* @description:
* @create: 2020-09-14 15:47
**/
@Data
@Slf4j
public abstract class QueryCriteria<T,E> {
private long page = 1;
private long limit = 10;
private Function<T, E> mapper;
private Consumer<QueryWrapper<T>> appendWrapper;
private Consumer<T> peekBefore;
private Consumer<E> peekAfter;
private Consumer<List<E>> peekAllAfter;
public QueryCriteria(Function<T, E> mapper) {
this.mapper = mapper;
}
public QueryWrapper<T> buildWrapper(){
QueryWrapper<T> wrapper = new QueryWrapper<>();
Field[] fields = this.getClass().getDeclaredFields();
for (Field field : fields) {
Condition condition = field.getAnnotation(Condition.class);
if(condition != null){
field.setAccessible(true);
Object value = null;
try {
value = field.get(this);
} catch (IllegalAccessException e) {
log.warn("reflection anomaly!");
}
if(!StrUtil.isEmptyIfStr(value)){
switch (condition.type()){
case EQ:
wrapper.eq(ConvertUtil.humpToLine2(field.getName()), value);
break;
case LIKE:
wrapper.like(ConvertUtil.humpToLine2(field.getName()), value);
case BETWEEN:
if(value instanceof Collection && ((List) value).size() >= 2){
wrapper.between(ConvertUtil.humpToLine2(field.getName()), ((List)value).get(0), ((List)value).get(1));
}
default:
}
}else if(condition.isNull()){
wrapper.isNull(ConvertUtil.humpToLine2(field.getName()));
}
}
Order order = field.getAnnotation(Order.class);
if(order != null){
if(!StrUtil.isEmptyIfStr(order.order())){
switch (order.order()){
case DESC:
wrapper.orderByDesc(ConvertUtil.humpToLine2(field.getName()));
break;
case ASC:
wrapper.orderByAsc(ConvertUtil.humpToLine2(field.getName()));
}
}
}
}
wrapper.func(this.getAppendWrapper() != null, this.getAppendWrapper());
return wrapper;
}
}
package com.ai.da.common.config.mybatis.plus;
import cn.hutool.core.util.StrUtil;
import com.ai.da.common.annotation.Condition;
import com.ai.da.common.annotation.Order;
import com.ai.da.common.enums.ConditionType;
import com.ai.da.common.utils.ConvertUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.lang.reflect.Field;
import java.util.Collection;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
/**
* @author: dangweijian
* @description:
* @create: 2020-09-14 15:47
**/
@Data
@Slf4j
public abstract class QueryCriteria<T, E> {
private long page = 1;
private long limit = 10;
private Function<T, E> mapper;
private Consumer<QueryWrapper<T>> appendWrapper;
private Consumer<T> peekBefore;
private Consumer<E> peekAfter;
private Consumer<List<E>> peekAllAfter;
public QueryCriteria(Function<T, E> mapper) {
this.mapper = mapper;
}
public QueryWrapper<T> buildWrapper() {
QueryWrapper<T> wrapper = new QueryWrapper<>();
Field[] fields = this.getClass().getDeclaredFields();
for (Field field : fields) {
Condition condition = field.getAnnotation(Condition.class);
if (condition != null) {
field.setAccessible(true);
Object value = null;
try {
value = field.get(this);
} catch (IllegalAccessException e) {
log.warn("reflection anomaly!");
}
if (!StrUtil.isEmptyIfStr(value)) {
switch (condition.type()) {
case EQ:
wrapper.eq(ConvertUtil.humpToLine2(field.getName()), value);
break;
case LIKE:
wrapper.like(ConvertUtil.humpToLine2(field.getName()), value);
case BETWEEN:
if (value instanceof Collection && ((List) value).size() >= 2) {
wrapper.between(ConvertUtil.humpToLine2(field.getName()), ((List) value).get(0), ((List) value).get(1));
}
default:
}
} else if (condition.isNull()) {
wrapper.isNull(ConvertUtil.humpToLine2(field.getName()));
}
}
Order order = field.getAnnotation(Order.class);
if (order != null) {
if (!StrUtil.isEmptyIfStr(order.order())) {
switch (order.order()) {
case DESC:
wrapper.orderByDesc(ConvertUtil.humpToLine2(field.getName()));
break;
case ASC:
wrapper.orderByAsc(ConvertUtil.humpToLine2(field.getName()));
}
}
}
}
wrapper.func(this.getAppendWrapper() != null, this.getAppendWrapper());
return wrapper;
}
}

View File

@@ -1,22 +1,22 @@
package com.ai.da.common.config.mybatis.plus;
import com.baomidou.mybatisplus.core.enums.SqlMethod;
import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.baomidou.mybatisplus.core.metadata.TableInfo;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlSource;
public class SelectVoPage extends AbstractMethod {
private static final String MAPPER_METHOD = "voPage";
public SelectVoPage() {
super(MAPPER_METHOD);
}
public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
String sql = String.format(SqlMethod.SELECT_PAGE.getSql(), this.sqlFirst(), this.sqlSelectColumns(tableInfo, true), tableInfo.getTableName(), this.sqlWhereEntityWrapper(true, tableInfo), this.sqlOrderBy(tableInfo), this.sqlComment());
SqlSource sqlSource = this.languageDriver.createSqlSource(this.configuration, sql, modelClass);
return this.addSelectMappedStatementForTable(mapperClass, MAPPER_METHOD, sqlSource, tableInfo);
}
}
package com.ai.da.common.config.mybatis.plus;
import com.baomidou.mybatisplus.core.enums.SqlMethod;
import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.baomidou.mybatisplus.core.metadata.TableInfo;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlSource;
public class SelectVoPage extends AbstractMethod {
private static final String MAPPER_METHOD = "voPage";
public SelectVoPage() {
super(MAPPER_METHOD);
}
public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
String sql = String.format(SqlMethod.SELECT_PAGE.getSql(), this.sqlFirst(), this.sqlSelectColumns(tableInfo, true), tableInfo.getTableName(), this.sqlWhereEntityWrapper(true, tableInfo), this.sqlOrderBy(tableInfo), this.sqlComment());
SqlSource sqlSource = this.languageDriver.createSqlSource(this.configuration, sql, modelClass);
return this.addSelectMappedStatementForTable(mapperClass, MAPPER_METHOD, sqlSource, tableInfo);
}
}

View File

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

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;
public class UserContext {
private static ThreadLocal<AuthPrincipalVo> userHolder= new ThreadLocal<AuthPrincipalVo>();
private static ThreadLocal<AuthPrincipalVo> userHolder = new ThreadLocal<AuthPrincipalVo>();
public static AuthPrincipalVo getUserHolder() {
return userHolder.get();
}
public static void delete() {
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

@@ -0,0 +1,41 @@
package com.ai.da.common.enums;
import java.util.stream.Stream;
/**
* @author: yanglei
* @description: 操作类型 登入 忘记密码
* @create: 2022-8-10 17:33
**/
public enum AuthenticationOperationTypeEnum {
/**
* 登入
*/
LOGIN,
/**
* 异常ip
*/
EXCEPTION_IP,
/**
* 绑定邮箱
*/
BIND_MAILBOX,
/**
* 忘记密码
*/
FORGET_PWD,
/**
* 更改邮箱
*/
CHANGE_MAILBOX,
/**
* 填写用户国家和职业
*/
UPDATE_USERINFO,
REGISTER;
public static AuthenticationOperationTypeEnum of(String name) {
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;
}
public static CollectionLevel1TypeEnum uploadOf(String realName){
public static CollectionLevel1TypeEnum uploadOf(String realName) {
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;
import java.util.Arrays;
import java.util.List;
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;
@@ -42,4 +64,8 @@ public enum CollectionLevel2TypeEnum {
public static CollectionLevel2TypeEnum of(String realName) {
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
**/
public enum ConditionType {
EQ,LIKE,BETWEEN;
EQ, LIKE, BETWEEN;
}

View File

@@ -0,0 +1,47 @@
package com.ai.da.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@AllArgsConstructor
@Getter
public enum CreditsEventsEnum {
PRICE("price","6"),
// PRICE("price","1"),// for test
// PRICE("price","0.1"),
BUY_CREDITS("Buy Credits","60"),
// BUY_CREDITS("Buy Credits","10"),// for test
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"),
RESET_YEAR_CREDITS("reset_year_credits","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"),
IMAGE_TO_SKETCH("ImageToSketch","5"),
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(1,"PIN"),
PIN(1, "PIN"),
/**
* USER_LIBRARY
*/
USER_LIBRARY(2,"userLibrary"),
// USER_LIBRARY(2, "userLibrary"),
/**
* SYS_FILE
*/
SYS_FILE(3,"sysFile"),
SYS_FILE(2, "sysFile"),
/**
* noPIN
*/
NO_PIN(4,"noPIN");
NO_PIN(3, "noPIN");
private Integer code;
private String desc;
@@ -38,10 +38,11 @@ public enum CurrentDesignPictureTypeEnum {
this.desc = desc;
}
public static CurrentDesignPictureTypeEnum of(String name){
return Stream.of(CurrentDesignPictureTypeEnum.values()).filter(v ->v.name().equals(name)).findFirst().orElse(null);
public static CurrentDesignPictureTypeEnum of(String name) {
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(2,"PIN"),
PIN(2, "PIN"),
/**
* noPIN
*/
NO_PIN(3,"noPIN");
NO_PIN(3, "noPIN");
private Integer code;
private String desc;
@@ -33,7 +33,8 @@ public enum CurrentDesignPrintPictureTypeEnum {
this.code = code;
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"),
GENERATE("Generate");
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;
@@ -39,8 +40,8 @@ public enum LibraryLevel1TypeEnum {
return realName;
}
public static LibraryLevel1TypeEnum uploadOf(String realName){
public static LibraryLevel1TypeEnum uploadOf(String realName) {
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() {
return realName;
}
public static LibraryTopTypeEnum uploadOf(String realName){
public static LibraryTopTypeEnum uploadOf(String realName) {
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;
public static LoginTypeEnum of(String name){
return Stream.of(LoginTypeEnum.values()).filter(v ->v.name().equals(name)).findFirst().orElse(null);
public static LoginTypeEnum of(String name) {
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

@@ -1,31 +0,0 @@
package com.ai.da.common.enums;
import java.util.stream.Stream;
/**
* @author: yanglei
* @description: 操作类型 登入 忘记密码
* @create: 2022-8-10 17:33
**/
public enum OperationTypeEnum {
/**
*登入
*/
LOGIN,
/**
* 异常ip
*/
EXCEPTION_IP,
/**
* 绑定邮箱
*/
BIND_MAILBOX,
/**
* 忘记密码
*/
FORGET_PWD;
public static OperationTypeEnum of(String name){
return Stream.of(OperationTypeEnum.values()).filter(v ->v.name().equals(name)).findFirst().orElse(null);
}
}

View File

@@ -0,0 +1,50 @@
package com.ai.da.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@AllArgsConstructor
@Getter
public enum OrderStatusEnum {
/**
* 未支付
*/
NOT_PAY("未支付"),
/**
* 支付成功
*/
SUCCESS("支付成功"),
/**
* 支付失败
*/
FAILURE("支付失败"),
/**
* 已关闭
*/
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
**/
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

@@ -0,0 +1,25 @@
package com.ai.da.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum ProductEnum {
// 积分购买
CreditsProduct("AiDA credits purchase", 6L),
// 年度订阅
AnnualSubscription("AiDA Annual Subscription", 5000L),
// 月度订阅
MonthlySubscription("AiDA Monthly Subscription", 500L),
// 测试
DailySubscription("AiDA Daily Subscription", 10L),
;
/**
* 类型
*/
private final String name;
private final Long price;
}

View File

@@ -4,7 +4,7 @@ import java.util.stream.Stream;
/**
* @author yanglei
* @description python调用java 操作数类型 generatePrint ->生成印花 designCollection ->设计collection
* @description python调用java 操作数类型 generatePrint ->生成印花 designCollection ->设计collection generateSketch->设计草图
* @create 2022-10-3 17:33
**/
public enum PythonToJavaApiOperationTypeEnum {
@@ -19,7 +19,12 @@ public enum PythonToJavaApiOperationTypeEnum {
/**
* 设计collection
*/
DESIGN_COLLECTION("designCollection");
DESIGN_COLLECTION("designCollection"),
/**
* 生成草图
*/
GENERATE_SKETCH("generateSketch");
private String realName;
@@ -31,7 +36,7 @@ public enum PythonToJavaApiOperationTypeEnum {
return realName;
}
public static PythonToJavaApiOperationTypeEnum uploadOf(String realName){
return Stream.of(PythonToJavaApiOperationTypeEnum.values()).filter(v ->v.getRealName().equals(realName)).findFirst().orElse(null);
public static PythonToJavaApiOperationTypeEnum uploadOf(String realName) {
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;
}
public static SingleOverallEnum of(String realName){
return Stream.of(SingleOverallEnum.values()).filter(v ->v.getRealName().equals(realName)).findFirst().orElse(null);
public static SingleOverallEnum of(String realName) {
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"),
TOPS("Tops"),
BOTTOMS("Bottoms"),
;
private String realName;
@@ -40,7 +42,7 @@ public enum SwitchCategoryEnum {
return realName;
}
public static SwitchCategoryEnum of(String realName){
return Stream.of(SwitchCategoryEnum.values()).filter(v ->v.getRealName().equals(realName)).findFirst().orElse(null);
public static SwitchCategoryEnum of(String realName) {
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 {
IMAGES("Images","images"),
IMAGES("Images", "images"),
ICON_C("Iconc","iconc"),
ICON_C("Iconc", "iconc"),
ACCESSORIES("Accessories","accessories");
ACCESSORIES("Accessories", "accessories");
private String realName;
/**
@@ -34,7 +34,7 @@ public enum SysFileLevel1TypeEnum {
return uploadPathName;
}
public static SysFileLevel1TypeEnum uploadOf(String uploadPathName){
return Stream.of(SysFileLevel1TypeEnum.values()).filter(v ->v.getUploadPathName().equals(uploadPathName)).findFirst().orElse(null);
public static SysFileLevel1TypeEnum uploadOf(String uploadPathName) {
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;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -13,27 +14,27 @@ public enum SysFileLevel2TypeEnum {
/**
* 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;
/**
@@ -54,20 +55,40 @@ public enum SysFileLevel2TypeEnum {
return uploadPathName;
}
public static SysFileLevel2TypeEnum uploadOf(String uploadPathName){
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 uploadOf(String uploadPathName) {
return Stream.of(SysFileLevel2TypeEnum.values()).filter(v -> v.getUploadPathName().equals(uploadPathName)).findFirst().orElse(null);
}
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 SysFileLevel2TypeEnum realNameOf(String realName) {
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";
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);
HttpResponse httpResponse = HttpUtil.createPost(url).execute();
log.info("获取用户token接口响应" + httpResponse);
if(httpResponse.isOk() && StrUtil.isNotEmpty(httpResponse.body())){
if (httpResponse.isOk() && StrUtil.isNotEmpty(httpResponse.body())) {
return JSONObject.parseObject(httpResponse.body());
}
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())
.body(JSONObject.toJSONString(param!=null?param:new HashMap<>()))
.header("Authorization", "Bearer "+token)
.body(JSONObject.toJSONString(param != null ? param : new HashMap<>()))
.header("Authorization", "Bearer " + token)
.header("X-Promiss", "9672233956")
.execute();
log.info("生成用户信息接口响应:" + httpResponse);
if(httpResponse.isOk() && StrUtil.isNotEmpty(httpResponse.body())){
if (httpResponse.isOk() && StrUtil.isNotEmpty(httpResponse.body())) {
return JSONObject.parseObject(httpResponse.body());
}
return null;

View File

@@ -17,7 +17,7 @@ import java.util.List;
@Data
@NoArgsConstructor
@ApiModel("分页响应结果")
public class PageBaseResponse<T>{
public class PageBaseResponse<T> {
@ApiModelProperty("页码")
private long page;
@ApiModelProperty("每页数量")
@@ -30,7 +30,6 @@ public class PageBaseResponse<T>{
private List<T> content;
public PageBaseResponse(List<T> list, long page, long size, long total, long pages) {
this.page = page;
this.size = size;
@@ -39,7 +38,7 @@ public class PageBaseResponse<T>{
this.content = list;
}
public static <T> PageBaseResponse<T> success(IPage<T> page){
return new PageBaseResponse<>(page.getRecords() , page.getCurrent(), page.getSize(), page.getTotal(), page.getPages());
public static <T> PageBaseResponse<T> success(IPage<T> page) {
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;
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.setErrCode(response.getErrCode());
this.setErrMsg(response.getErrMsg());
@@ -45,8 +44,8 @@ public class PageResponse<T> extends Response<List<T>> {
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());
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("数据结果")
private T data;
public static <T> Response<T> success(){
public static <T> Response<T> success() {
return success(ResultEnum.SUCCESS.getCode(), ResultEnum.SUCCESS.getMsg(), null);
}
public static <T> Response<T> success(String msg){
return success(ResultEnum.SUCCESS.getCode(), msg, null);
}
// public static <T> Response<T> success(String msg) {
// 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);
}
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);
}
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);
}
public static <T> Response<T> fail(String msg) {
return fail(ResultEnum.FAIL.getCode(), msg);
}
@@ -85,7 +84,7 @@ public class Response<T> implements Serializable {
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);
}

View File

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

View File

@@ -0,0 +1,15 @@
package com.ai.da.common.response;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
@Data
@NoArgsConstructor
@ApiModel("交易记录分页响应结果")
public class TransactionPageResponse<T> extends PageBaseResponse<T> {
private BigDecimal totalAmount;
}

View File

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

View File

@@ -1,124 +1,139 @@
package com.ai.da.common.security.filter;
import cn.hutool.core.util.StrUtil;
import com.ai.da.common.context.UserContext;
import com.ai.da.common.security.config.SecurityProperties;
import com.ai.da.common.security.jwt.JWTTokenHelper;
import com.ai.da.common.utils.LocalCacheUtils;
import com.ai.da.common.utils.MultiReadHttpServletRequest;
import com.ai.da.common.utils.MultiReadHttpServletResponse;
import com.ai.da.model.vo.AuthPrincipalVo;
import lombok.AllArgsConstructor;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Required;
import org.springframework.context.annotation.Configuration;
import org.springframework.lang.NonNull;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.util.StopWatch;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.annotation.Resource;
import javax.security.sasl.AuthenticationException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.Statement;
import java.util.Arrays;
import java.util.List;
/**
* @author: dangweijian
* @description: 认证拦截器
* @create: 2020-07-10 16:50
**/
@Slf4j
@Configuration
public class AuthenticationFilter extends OncePerRequestFilter {
@Resource
private JWTTokenHelper jwtTokenHelper;
@Resource
private SecurityProperties properties;
private static final List<String> FILTER_URL =
Arrays.asList("/favicon.ico","/doc.html","api/account/login","api/account/preLogin","api/account/sendEmail",
"/webjars/","/swagger-resources","/v2/api-docs","api/account/resetPwd",
"/api/python/saveGeneratePicture", "/api/python/getLibraryByUserId",
"/api/third/party/addUser","/api/third/party/editUser","/api/element/initDefaultSysFile"
,"/api/history/queryUserGroup","/api/history/choose"
);
@Override
protected void doFilterInternal(HttpServletRequest httpServletRequest, @NonNull HttpServletResponse httpServletResponse, @NonNull FilterChain filterChain) throws ServletException, IOException {
String requestURI = httpServletRequest.getRequestURI();
if(calculateUrl(requestURI)){
StopWatch stopWatch = new StopWatch();
HttpServletRequest wrappedRequest = httpServletRequest;
HttpServletResponse wrappedResponse = httpServletResponse;
try{
stopWatch.start();
if ((httpServletRequest.getContentType() == null && httpServletRequest.getContentLength() > 0) || (httpServletRequest.getContentType() != null && !httpServletRequest.getContentType().contains("application/json"))) {
extracted(wrappedRequest);
filterChain.doFilter(wrappedRequest, wrappedResponse);
}else {
wrappedRequest = new MultiReadHttpServletRequest(httpServletRequest);
wrappedResponse = new MultiReadHttpServletResponse(httpServletResponse);
extracted(wrappedRequest);
filterChain.doFilter(wrappedRequest, wrappedResponse);
}
} catch (Exception e) {
SecurityContextHolder.clearContext();
throw e;
} finally {
stopWatch.stop();
}
}else {
filterChain.doFilter(httpServletRequest, httpServletResponse);
}
}
private Boolean calculateUrl(String requestURI ){
String filterUrl = FILTER_URL.stream().filter(url ->requestURI.contains(url)).findFirst().orElse(null);
return null == filterUrl ? Boolean.TRUE :Boolean.FALSE;
}
private void extracted(HttpServletRequest request) throws AuthenticationException {
String jwtToken = request.getHeader(properties.getJwtTokenHeader());
log.debug("后台检查令牌:{}", jwtToken);
if (StrUtil.isBlank(jwtToken)) {
throw new RuntimeException("请传入token");
}
// 检查token
boolean validate = jwtTokenHelper.validateToken(jwtToken);
if(validate){
AuthPrincipalVo principal = jwtTokenHelper.parserToUser(jwtToken);
if (principal == null) {
throw new RuntimeException("TOKEN已过期请重新登录");
}
//先清空当前线程变量,防止上一个线程遗留
UserContext.delete();
//存取用户信息到缓存
UserContext.setUserHolder(principal);
//校验token
String cacheToken = LocalCacheUtils.getTokenCache(String.valueOf(principal.getId()));
if(jwtToken.equals("Bearer-eyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiIyIiwic3ViIjoie1wiaWRcIjoyLFwidXNlcm5hbWVcIjpcImxpcnNcIn0iLCJpYXQiOjE2NjU3NDEwODcsImlzcyI6IkRXSiIsImF1dGhvcml0aWVzIjoiW10iLCJleHAiOjE2NzQzODEwODd9.ShM9R_NNFD7oo1OvxrEgg7PFeWinOuAKkuInUCMQupp66s64Hhv8tN0Wwr83nIN4rHPqtn95wmd4msWcvaFYJA")){
//写死 暂时放行
return;
}
if(StringUtils.isEmpty(cacheToken)){
throw new RuntimeException("TOKEN已过期请重新登录");
}
if(!cacheToken.equals(jwtToken) ){
throw new RuntimeException("TOKEN已过期请重新登录");
}
// UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(null, null);
// SecurityContextHolder.getContext().setAuthentication(authentication);
}
}
}
package com.ai.da.common.security.filter;
import cn.hutool.core.util.StrUtil;
import com.ai.da.common.config.exception.TokenMissingOrExpiredException;
import com.ai.da.common.context.UserContext;
import com.ai.da.common.security.config.SecurityProperties;
import com.ai.da.common.security.jwt.JWTTokenHelper;
import com.ai.da.common.utils.LocalCacheUtils;
import com.ai.da.common.utils.MultiReadHttpServletRequest;
import com.ai.da.common.utils.MultiReadHttpServletResponse;
import com.ai.da.common.utils.RequestInfoUtil;
import com.ai.da.model.vo.AuthPrincipalVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.lang.NonNull;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.util.StopWatch;
import org.springframework.util.StringUtils;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.annotation.Resource;
import javax.security.sasl.AuthenticationException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
/**
* @author: dangweijian
* @description: 认证拦截器
* @create: 2020-07-10 16:50
**/
@Slf4j
@Configuration
public class AuthenticationFilter extends OncePerRequestFilter {
@Resource
private JWTTokenHelper jwtTokenHelper;
@Resource
private SecurityProperties properties;
private static final List<String> FILTER_URL =
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",
"/api/python/saveGeneratePicture", "/api/python/getLibraryByUserId",
"/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/updateNoLoginRequiredNew",
"/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",
"/notification","/api/account/activateNewEmail","/api/third/party/auth/google_callback","/api/third/party/parseGoogleCredential","/api/third/party/receiveDesignResults","/api/third/party/parseWeChatCode"
);
@Override
protected void doFilterInternal(HttpServletRequest httpServletRequest, @NonNull HttpServletResponse httpServletResponse, @NonNull FilterChain filterChain) throws ServletException, IOException {
String requestURI = httpServletRequest.getRequestURI();
if (calculateUrl(requestURI) || hasAuthorizationToken(httpServletRequest)) {
StopWatch stopWatch = new StopWatch();
HttpServletRequest wrappedRequest = httpServletRequest;
HttpServletResponse wrappedResponse = httpServletResponse;
try {
stopWatch.start();
if ((httpServletRequest.getContentType() == null && httpServletRequest.getContentLength() > 0) || (httpServletRequest.getContentType() != null && !httpServletRequest.getContentType().contains("application/json"))) {
extracted(wrappedRequest);
filterChain.doFilter(wrappedRequest, wrappedResponse);
} else {
wrappedRequest = new MultiReadHttpServletRequest(httpServletRequest);
wrappedResponse = new MultiReadHttpServletResponse(httpServletResponse);
extracted(wrappedRequest);
filterChain.doFilter(wrappedRequest, wrappedResponse);
}
} catch (Exception e) {
SecurityContextHolder.clearContext();
throw e;
} finally {
stopWatch.stop();
}
} else {
filterChain.doFilter(httpServletRequest, httpServletResponse);
}
}
private Boolean calculateUrl(String requestURI) {
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 {
String jwtToken = request.getHeader(properties.getJwtTokenHeader());
// log.debug("后台检查令牌:{}", jwtToken);
if (StrUtil.isBlank(jwtToken)) {
String ipAddress = RequestInfoUtil.getIpAddress(request);
log.info("本次请求的ip为 " + ipAddress);
// throw new RuntimeException("请传入token");
throw new TokenMissingOrExpiredException("请传入token");
}
if(jwtToken.equals("Bearer-eyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiIyIiwic3ViIjoie1wiaWRcIjoyLFwidXNlcm5hbWVcIjpcImxpcnNcIn0iLCJpYXQiOjE2NjU3NDEwODcsImlzcyI6IkRXSiIsImF1dGhvcml0aWVzIjoiW10iLCJleHAiOjE2NzQzODEwODd9.ShM9R_NNFD7oo1OvxrEgg7PFeWinOuAKkuInUCMQupp66s64Hhv8tN0Wwr83nIN4rHPqtn95wmd4msWcvaFYJA")){
//写死 暂时放行
return;
}
// 检查token
boolean validate = jwtTokenHelper.validateToken(jwtToken);
if (validate) {
AuthPrincipalVo principal = jwtTokenHelper.parserToUser(jwtToken);
if (principal == null) {
// throw new RuntimeException("TOKEN已过期请重新登录");
throw new TokenMissingOrExpiredException("TOKEN已过期请重新登录(token without userInfo)");
}
//先清空当前线程变量,防止上一个线程遗留
UserContext.delete();
//存取用户信息到缓存
UserContext.setUserHolder(principal);
//校验token
String cacheToken = LocalCacheUtils.getTokenCache(String.valueOf(principal.getId()));
if(StringUtils.isEmpty(cacheToken)){
// throw new RuntimeException("TOKEN已过期请重新登录");
throw new TokenMissingOrExpiredException("TOKEN已过期请重新登录(local cache empty)");
}
if(!cacheToken.equals(jwtToken) ){
// throw new RuntimeException("TOKEN已过期请重新登录");
throw new TokenMissingOrExpiredException("TOKEN已过期请重新登录(token not match local cache)");
}
// UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(null, null);
// SecurityContextHolder.getContext().setAuthentication(authentication);
}
}
}

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,123 @@
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.*;
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.time.LocalDate;
import java.util.List;
@Slf4j
@Component
public class PaymentTask {
@Resource
private OrderInfoService orderInfoService;
@Resource
private StripeService stripeService;
@Resource
private AffiliateService affiliateService;
// 考虑删除该定时任务(原因:之后的订单列允许用户查看发票,发票未过期时仍可以支付,所以不需要手动使订单过期)
// @Scheduled(cron = "0/30 * * * * ?")
public void orderConfirmForStripe() 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);
}
}
@Resource
private PayPalCheckoutService payPalCheckoutService;
@Scheduled(cron = "0/30 * * * * ?")
public void orderConfirmForPaypal() 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);
}
}
@Resource
private AliPayService aliPayService;
/**
* 从第0秒开始每隔30秒执行1次查询创建超过5分钟并且未支付的订单
*/
// @Scheduled(cron = "0/30 * * * * ?")
public void orderConfirmForAlipay(){
/*
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);
}*/
}
// !!关闭此定时器,改为提前三天站内信提醒!!
// 提前7天向用户发送提醒邮件,每天早上8点执行
// @Scheduled(cron = "0 0 8 * * ?")
public void subscriptionReminder(){
stripeService.subscriptionReminder();
}
// 如果有订阅已创建,但是没有发邮件通知的,需要主动获取回调信息并向用户发送邮件
public void checkSubscriptionPayment(){
//
}
@Scheduled(cron = "0 */5 * * * *") // Run every 5 minutes
public void updateAffiliateInfoWithPayment(){
// log.info("佣金计算定时器");
affiliateService.updateAffiliateInfoWithPayment();
}
@Scheduled(cron = "0 0 8 28-31 * ?")
public void commissionSummaryReminder(){
// 每个月末的最后一天的早上八点执行
LocalDate today = LocalDate.now();
// 判断是否为月底
if (today.plusDays(1).getDayOfMonth() == 1) {
log.info("今天是月底,执行佣金结算提醒任务!");
affiliateService.commissionCalculation(null, null);
}
}
@Scheduled(cron = "0 */5 * * * *") // Run every 5 minutes
public void calcCouponsCommission(){
// log.info("优惠券佣金计算定时器");
affiliateService.calcCouponsCommission();
}
}

View File

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

@@ -0,0 +1,88 @@
package com.ai.da.common.utils;
import java.util.HashMap;
import java.util.Map;
public class ComprehensivePunctuationConverter {
private static final Map<Character, Character> FULL_TO_HALF_MAP = new HashMap<>();
static {
// 中文标点到英文标点的映射(扩展版)
FULL_TO_HALF_MAP.put('', ',');
FULL_TO_HALF_MAP.put('。', '.');
FULL_TO_HALF_MAP.put('', ';');
FULL_TO_HALF_MAP.put('', ':');
FULL_TO_HALF_MAP.put('', '?');
FULL_TO_HALF_MAP.put('', '!');
FULL_TO_HALF_MAP.put('', '(');
FULL_TO_HALF_MAP.put('', ')');
FULL_TO_HALF_MAP.put('【', '[');
FULL_TO_HALF_MAP.put('】', ']');
FULL_TO_HALF_MAP.put('「', '\'');
FULL_TO_HALF_MAP.put('」', '\'');
FULL_TO_HALF_MAP.put('『', '"');
FULL_TO_HALF_MAP.put('』', '"');
FULL_TO_HALF_MAP.put('、', '\\');
FULL_TO_HALF_MAP.put('', '~');
FULL_TO_HALF_MAP.put('—', '-');
FULL_TO_HALF_MAP.put('', '.');
FULL_TO_HALF_MAP.put('〈', '<');
FULL_TO_HALF_MAP.put('〉', '>');
FULL_TO_HALF_MAP.put('《', '«');
FULL_TO_HALF_MAP.put('》', '»');
FULL_TO_HALF_MAP.put('〝', '"');
FULL_TO_HALF_MAP.put('〞', '"');
FULL_TO_HALF_MAP.put('﹁', '"');
FULL_TO_HALF_MAP.put('﹂', '"');
FULL_TO_HALF_MAP.put('…', '.');
FULL_TO_HALF_MAP.put('', '_');
// 全角字母和数字
for (char c = ''; c <= ''; c++) {
FULL_TO_HALF_MAP.put(c, (char)(c - '' + 'A'));
}
for (char c = ''; c <= ''; c++) {
FULL_TO_HALF_MAP.put(c, (char)(c - '' + 'a'));
}
for (char c = ''; c <= ''; c++) {
FULL_TO_HALF_MAP.put(c, (char)(c - '' + '0'));
}
}
/**
* 将字符串中的全角字符(包括标点、字母、数字)转换为半角字符
*/
public static String convertToHalfWidth(String input) {
if (input == null || input.isEmpty()) {
return input;
}
StringBuilder result = new StringBuilder();
for (int i = 0; i < input.length(); i++) {
char c = input.charAt(i);
// 检查映射表
if (FULL_TO_HALF_MAP.containsKey(c)) {
result.append(FULL_TO_HALF_MAP.get(c));
}
// 处理全角空格Unicode 12288
else if (c == ' ') {
result.append(' ');
}
// 其他字符保持不变
else {
result.append(c);
}
}
return result.toString();
}
public static void main(String[] args) {
// String text = "这是一个全角示例,包含:中文标点、全角字母(ABC)、全角数字(123) 还有全角空格!";
String text = "birdsyellow";
String converted = convertToHalfWidth(text);
System.out.println("原始文本: " + text);
System.out.println("转换后: " + converted);
}
}

View File

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

View File

@@ -1,5 +1,6 @@
package com.ai.da.common.utils;
import com.ai.da.common.constant.CommonConstant;
import lombok.extern.slf4j.Slf4j;
import java.text.ParseException;
@@ -9,14 +10,18 @@ import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
@Slf4j
public class DateUtil {
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 YYYY_MM_DD = "yyyyMMdd";
public static final String YYYY_MM_DD_HH = "yyyyMMddHH";
public static final String YYYY_MM_DD_hh_mm_ss = "yyyyMMddHHMMss";
/**
* LocalDate -> Date
*/
@@ -25,13 +30,15 @@ public class DateUtil {
}
/**
* LocalDateTime -> Date
* LocalDateTime -> Date
*/
public static Date asDate(LocalDateTime localDateTime) {
return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
}
/**
* date 装 String
*
* @param date
* @param formatter
* @return
@@ -43,23 +50,55 @@ public class DateUtil {
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zoneId);
return dateTimeFormatter.format(localDateTime);
}
/**
* 根据时区获取时间
*
* @param timeZone "Asia/Tokyo"
* @return
*/
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);
// 设置时区
sdf.setTimeZone(TimeZone.getTimeZone(timeZone));
Date date = null;
try{
Date date = null;
try {
date = sdf.parse(dateStr);
}catch (ParseException parseException){
log.error("时间转换异常!",parseException);
} catch (ParseException parseException) {
log.error("时间转换异常!", parseException);
}
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);
}
public static String changeTimeStampFormat(Long timeStamp, String type, String format){
// 将秒级时间戳转换为毫秒级
if (type.equals("seconds")){
timeStamp = timeStamp * 1000;
}
// 输出格式
SimpleDateFormat outputFormat = new SimpleDateFormat(format, Locale.ENGLISH);
// 创建Date对象
Date date = new Date(timeStamp);
// 格式化输出
return outputFormat.format(date);
}
public static String changeTimeStampFormat(LocalDateTime localDate){
return localDate.format(DateTimeFormatter.ofPattern(CommonConstant.TIME_FORMAT_MMM_dd_yyyy_EEEE, Locale.US));
}
}

View File

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

View File

@@ -5,27 +5,19 @@ import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.ai.da.common.config.exception.BusinessException;
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.LoggerFactory;
import org.springframework.util.FileSystemUtils;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.URL;
import java.security.MessageDigest;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
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 {
private static final Logger log = LoggerFactory.getLogger(com.ai.da.common.utils.FileUtil.class);
@@ -137,53 +129,56 @@ 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 height = 0;
try{
try {
// 图片对象
BufferedImage bufferedImage = ImageIO.read(file.getInputStream());
// 宽度
width = bufferedImage.getWidth();
width = bufferedImage.getWidth();
// 高度
height = bufferedImage.getHeight();
}catch (IOException ioException){
height = bufferedImage.getHeight();
} catch (IOException 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 height = 0;
try{
try {
// 图片对象
BufferedImage bufferedImage = ImageIO.read(inputStream);
// 宽度
width = bufferedImage.getWidth();
// 高度
height = bufferedImage.getHeight();
}catch (IOException ioException){
} catch (IOException 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);
return url.openStream();
}catch (IOException ioException){
log.error("获取文件尺寸异常###{}###path##{}", ExceptionUtil.stacktraceToString(ioException),path);
throw new BusinessException("get file is failed!");
} catch (IOException ioException) {
log.error("获取文件尺寸异常###{}###path##{}", ExceptionUtil.stacktraceToString(ioException), path);
throw new BusinessException("get.file.failed");
}
}
/**
* 将文件名解析成文件的上传路径
*/
@@ -191,7 +186,7 @@ public class FileUtil extends cn.hutool.core.io.FileUtil {
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddhhmmssS");
String suffix = getExtensionName(file.getOriginalFilename());
String nowStr = format.format(date)+"-" ;
String nowStr = format.format(date) + "-";
try {
String fileName = file.getOriginalFilename();
String fileSuffix = fileName.substring(fileName.lastIndexOf("."));
@@ -212,6 +207,7 @@ public class FileUtil extends cn.hutool.core.io.FileUtil {
}
return null;
}
/**
* 将文件名解析成文件的上传路径
*/
@@ -219,7 +215,7 @@ public class FileUtil extends cn.hutool.core.io.FileUtil {
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddhhmmssS");
String suffix = getExtensionName(file.getOriginalFilename());
String nowStr = format.format(date)+"-" ;
String nowStr = format.format(date) + "-";
try {
String fileName = file.getOriginalFilename();
String path = filePath + fileName;
@@ -250,6 +246,7 @@ public class FileUtil extends cn.hutool.core.io.FileUtil {
}
return false;
}
/**
* 获取指定文件夹下所有文件,不含文件夹里的文件
*
@@ -257,7 +254,7 @@ public class FileUtil extends cn.hutool.core.io.FileUtil {
* @return
*/
public static List<File> getAllFile(String dirFilePath) {
if (StrUtil.isBlank(dirFilePath)){
if (StrUtil.isBlank(dirFilePath)) {
return null;
}
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) {
// 如果文件夹不存在或着不是文件夹,则返回 null
if (Objects.isNull(dirFile) || !dirFile.exists() || dirFile.isFile()){
if (Objects.isNull(dirFile) || !dirFile.exists() || dirFile.isFile()) {
return null;
}
File[] childrenFiles = dirFile.listFiles();
if (Objects.isNull(childrenFiles) || childrenFiles.length == 0){
if (Objects.isNull(childrenFiles) || childrenFiles.length == 0) {
return null;
}
List<File> files = new ArrayList<>();
@@ -288,7 +285,7 @@ public class FileUtil extends cn.hutool.core.io.FileUtil {
else {
// 如果是文件夹,则将其内部文件添加进结果集合
List<File> cFiles = getAllFile(childFile);
if (Objects.isNull(cFiles) || cFiles.isEmpty()){
if (Objects.isNull(cFiles) || cFiles.isEmpty()) {
continue;
}
files.addAll(cFiles);
@@ -297,5 +294,20 @@ public class FileUtil extends cn.hutool.core.io.FileUtil {
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
public class ImageUtil {
static BufferedImage bufferedImage;
static int r,g,b; // 分别用来存放获取的RGB值
static int heigth,width;
static int r, g, b; // 分别用来存放获取的RGB值
static int heigth, width;
static int id = 0;
public static void find(){
public static void find() {
// 读取要操作的图片,这里的图片路径请改成自己要处理的图片
try {
bufferedImage = ImageIO.read(new File("D:\\programManager\\private\\curtain\\curtain\\WechatIMG170.png"));
@@ -27,16 +28,16 @@ public class ImageUtil {
// 获取图片的宽和高;
heigth = 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 x = 0; x < width; x++) {
id++;
Color color = new Color(bufferedImage.getRGB(x,y));
Color color = new Color(bufferedImage.getRGB(x, y));
r = color.getRed();
g = color.getGreen();
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;
import com.ai.da.mapper.entity.Collection;
import com.ai.da.mapper.entity.SysFile;
import com.ai.da.model.vo.SysFileVO;
import com.google.common.cache.*;
import com.google.common.collect.Lists;
import io.swagger.models.auth.In;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
@@ -25,25 +21,26 @@ public final class LocalCacheUtils {
* token
*/
private static LoadingCache<String, String> tokenCache = loadTokenCache();
/**
*
*缓存接口这里是LoadingCacheLoadingCache在缓存项不存在时可以自动加载缓存
* 缓存接口这里是LoadingCacheLoadingCache在缓存项不存在时可以自动加载缓存
*/
private static LoadingCache<String, String> loadTokenCache(){
LoadingCache<String, String> tokenCache = CacheBuilder.newBuilder()
private static LoadingCache<String, String> loadTokenCache() {
LoadingCache<String, String> tokenCache = CacheBuilder.newBuilder()
.concurrencyLevel(10)
.expireAfterWrite(24*100, TimeUnit.HOURS)
.expireAfterWrite(24 * (7 - 1), TimeUnit.HOURS)
.initialCapacity(100)
.maximumSize(10000)
.recordStats()
.build(new CacheLoader<String, String>() {
@Override
public String load(String key) throws Exception {
return "null";
}
@Override
public String load(String key) throws Exception {
return "null";
}
});
return tokenCache;
}
/**
* 邮箱,短信验证码
*/
@@ -51,7 +48,7 @@ public final class LocalCacheUtils {
//设置并发级别为5并发级别是指可以同时写缓存的线程数
.concurrencyLevel(10)
//设置写缓存后10分钟过期,防止跨洲发送慢失效问题
.expireAfterWrite(60*30, TimeUnit.SECONDS)
.expireAfterWrite(60 * 30, TimeUnit.SECONDS)
//刷新机制 每隔一定时间刷新缓存loader 只有调用get具体的操作才生效(懒加载) 不设置则不刷新
// .refreshAfterWrite(60, TimeUnit.SECONDS)
//设置缓存容器的初始容量为100
@@ -75,7 +72,7 @@ public final class LocalCacheUtils {
//设置并发级别为5并发级别是指可以同时写缓存的线程数
.concurrencyLevel(10)
//设置写缓存后一天过期
.expireAfterWrite(60*60*24, TimeUnit.SECONDS)
.expireAfterWrite(60 * 60 * 24, TimeUnit.SECONDS)
//设置缓存容器的初始容量为100
.initialCapacity(100)
//设置缓存最大容量50000超过50000之后就会按照LRU最近虽少使用算法来移除缓存项
@@ -96,7 +93,7 @@ public final class LocalCacheUtils {
//设置并发级别为5并发级别是指可以同时写缓存的线程数
.concurrencyLevel(10)
//设置写缓存后一天过期
.expireAfterWrite(60*60*24, TimeUnit.SECONDS)
.expireAfterWrite(60 * 60 * 24, TimeUnit.SECONDS)
//设置缓存容器的初始容量为100
.initialCapacity(100)
//设置缓存最大容量50000超过50000之后就会按照LRU最近虽少使用算法来移除缓存项
@@ -118,7 +115,7 @@ public final class LocalCacheUtils {
//设置并发级别为5并发级别是指可以同时写缓存的线程数
.concurrencyLevel(10)
//设置写缓存后一天过期
.expireAfterWrite(60*60*24, TimeUnit.SECONDS)
.expireAfterWrite(60 * 60 * 24, TimeUnit.SECONDS)
//设置缓存容器的初始容量为15000
.initialCapacity(15000)
//设置缓存最大容量50000超过50000之后就会按照LRU最近虽少使用算法来移除缓存项
@@ -133,27 +130,27 @@ public final class LocalCacheUtils {
}
});
/**
/**
* design文件进度统计
*/
private static LoadingCache<Long, List<String>> designProcessCache = CacheBuilder.newBuilder()
//设置并发级别为10并发级别是指可以同时写缓存的线程数
.concurrencyLevel(10)
//设置写缓存后5分钟过期
.expireAfterWrite(60*5, TimeUnit.SECONDS)
//设置缓存容器的初始容量为100
.initialCapacity(5)
//设置缓存最大容量50000超过50000之后就会按照LRU最近虽少使用算法来移除缓存项
.maximumSize(100)
//设置要统计缓存的命中率
.recordStats()
//build方法中可以指定CacheLoader在缓存不存在时通过CacheLoader的实现自动加载缓存
.build(new CacheLoader<Long, List<String>>() {
@Override
public List<String> load(Long key) throws Exception {
return Collections.EMPTY_LIST;
}
});
//设置并发级别为10并发级别是指可以同时写缓存的线程数
.concurrencyLevel(10)
//设置写缓存后5分钟过期
.expireAfterWrite(60 * 5, TimeUnit.SECONDS)
//设置缓存容器的初始容量为100
.initialCapacity(5)
//设置缓存最大容量50000超过50000之后就会按照LRU最近虽少使用算法来移除缓存项
.maximumSize(100)
//设置要统计缓存的命中率
.recordStats()
//build方法中可以指定CacheLoader在缓存不存在时通过CacheLoader的实现自动加载缓存
.build(new CacheLoader<Long, List<String>>() {
@Override
public List<String> load(Long key) throws Exception {
return Collections.EMPTY_LIST;
}
});
/**
* aida 接口限流(先粗暴做)
@@ -162,7 +159,7 @@ public final class LocalCacheUtils {
//设置并发级别为5并发级别是指可以同时写缓存的线程数
.concurrencyLevel(20)
//设置写缓存后30天过期
.expireAfterWrite(60*60*24*30, TimeUnit.SECONDS)
.expireAfterWrite(60 * 60 * 24 * 30, TimeUnit.SECONDS)
//设置缓存容器的初始容量为100
.initialCapacity(5)
//设置缓存最大容量50000超过50000之后就会按照LRU最近虽少使用算法来移除缓存项
@@ -176,8 +173,10 @@ public final class LocalCacheUtils {
return 0;
}
});
/**
* 添加token本地缓存
*
* @param key
* @param value
*/
@@ -187,6 +186,7 @@ public final class LocalCacheUtils {
/**
* 获取token本地缓存
*
* @param key
* @return
*/
@@ -202,8 +202,10 @@ public final class LocalCacheUtils {
}
return null;
}
/**
* 删除token本地缓存(登出)
*
* @param key
* @return
*/
@@ -214,8 +216,10 @@ public final class LocalCacheUtils {
log.error("delTokenCache方法错误", e);
}
}
/**
* 添加验证码本地缓存
*
* @param key
* @param value
*/
@@ -225,6 +229,7 @@ public final class LocalCacheUtils {
/**
* 获取验证码本地缓存
*
* @param key
* @return
*/
@@ -240,8 +245,10 @@ public final class LocalCacheUtils {
}
return null;
}
/**
* 添加系统文本地缓存
*
* @param key
* @param sysFile
*/
@@ -251,6 +258,7 @@ public final class LocalCacheUtils {
/**
* 获取系统文件本地缓存
*
* @param key
* @return
*/
@@ -263,8 +271,10 @@ public final class LocalCacheUtils {
}
return null;
}
/**
* 清除所有系统文件本地缓存
*
* @return
*/
public static void clearAllSysFileCache() {
@@ -274,8 +284,10 @@ public final class LocalCacheUtils {
log.error("clearAllSysFileCache方法错误", e);
}
}
/**
* 添加系统文本地缓存,通过类型
*
* @param level1Type
* @param sysFileList
*/
@@ -285,6 +297,7 @@ public final class LocalCacheUtils {
/**
* 获取系统文件本地缓存
*
* @param level2Type
* @return
*/
@@ -296,8 +309,10 @@ public final class LocalCacheUtils {
}
return null;
}
/**
* 清除所有系统文件本地缓存
*
* @return
*/
public static void clearAllSysFileCacheByLevel2Type() {
@@ -307,8 +322,10 @@ public final class LocalCacheUtils {
log.error("clearAllSysFileCacheByLevel2Type方法错误", e);
}
}
/**
* 添加系统文件范围最大最小值本地缓存
*
* @param key
* @param value
*/
@@ -318,6 +335,7 @@ public final class LocalCacheUtils {
/**
* 获取系统文件范围最大最小值本地缓存
*
* @param key
* @return
*/
@@ -333,8 +351,10 @@ public final class LocalCacheUtils {
}
return null;
}
/**
* 清除所有系统文件范围最大最小值本地缓存
*
* @return
*/
public static void clearAllMaxMinValueCache() {
@@ -344,8 +364,10 @@ public final class LocalCacheUtils {
log.error("clearAllMaxMinValueCache方法错误", e);
}
}
/**
* 添加系design文件进度统计
*
* @param key
* @param value
*/
@@ -355,6 +377,7 @@ public final class LocalCacheUtils {
/**
* 获取design文件进度统计
*
* @param key
* @return
*/
@@ -367,8 +390,10 @@ public final class LocalCacheUtils {
}
return null;
}
/**
* 进度统计完后 删除进度
*
* @param key
* @return
*/
@@ -382,6 +407,7 @@ public final class LocalCacheUtils {
/**
* 设置本次接口流量数
*
* @param key
* @param value
*/
@@ -391,6 +417,7 @@ public final class LocalCacheUtils {
/**
* 获取本次接口流量数
*
* @param key
* @return
*/
@@ -403,4 +430,49 @@ public final class LocalCacheUtils {
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;
}
/**
* MD5加密文件
*
@@ -74,6 +75,16 @@ public class MD5Utils {
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 {
File file1 = new File("/Users/yanglei/Documents/阳磊日报2019-04-23.numbers");
File file2 = new File("/Users/yanglei/Documents/7777.numbers");

View File

@@ -0,0 +1,575 @@
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 javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.*;
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 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 doesObjectExist(bucketName, objectName);
}
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
}
}
/**
* 从 MinIO 下载对象到本地路径
*
* @param bucketName 存储桶名称
* @param objectName MinIO 上对象的名称
* @param localFilePath 本地文件路径
*/
public void downloadMinioObjectToLocal(String bucketName, String objectName, String localFilePath) {
File localFile = new File(localFilePath);
File parentDir = localFile.getParentFile();
if (parentDir != null) {
parentDir.mkdirs(); // 创建文件夹,确保路径结构与 MinIO 一致
}
try (InputStream stream = minioClient.getObject(
GetObjectArgs.builder().bucket(bucketName).object(objectName).build());
FileOutputStream out = new FileOutputStream(localFile)) {
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = stream.read(buffer)) != -1) {
out.write(buffer, 0, bytesRead);
}
log.info("Downloaded object {} to {}", objectName, localFilePath);
} catch (Exception e) {
log.error("Error while downloading object {}: {}", objectName, e.getMessage());
}
}
/**
* 从路径中提取存储桶名称
*
* @param path MinIO 路径
* @return 存储桶名称
*/
public String getBucketNameFromPath(String path) {
int index = path.indexOf("/");
return path.substring(0, index); // 获取第一级路径作为 bucket 名称
}
/**
* 从路径中提取对象名称
*
* @param path MinIO 路径
* @return 对象名称
*/
public String getObjectNameFromPath(String path) {
int index = path.indexOf("/");
return path.substring(index + 1); // 获取路径的其余部分作为对象名称
}
public List<Integer> getImagesWidthAndHeight(String path){
int index = path.indexOf("/");
String bucketName = path.substring(0, index);
String objectName = path.substring(index + 1);
try {
// 从 MinIO 下载图片
GetObjectResponse response = minioClient.getObject(
GetObjectArgs.builder()
.bucket(bucketName)
.object(objectName)
.build()
);
BufferedImage image = ImageIO.read(response);
int width = image.getWidth();
int height = image.getHeight();
log.info("Image path {}, Width: {}, Height: {}", path, width, height);
response.close();
return Arrays.asList(width, height);
} catch (MinioException | IOException | NoSuchAlgorithmException | InvalidKeyException e) {
log.error("图片:{}, 获取宽高异常", path);
throw new BusinessException(e.getMessage());
}
}
}

View File

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

View File

@@ -1,4 +1,5 @@
package com.ai.da.common.utils;
import java.util.*;
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,97 @@
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)};
}
public static int[] hsvToRgb(int h, int s, int v) {
// 确保 h 在 [0, 360) 范围内
h = h % 360;
if (h < 0) {
h += 360;
}
// 确保 s 和 v 在 [0, 100] 范围内
s = Math.max(0, Math.min(100, s));
v = Math.max(0, Math.min(100, v));
// 将 s 和 v 映射到 [0, 1] 范围
float sNorm = s / 100.0f;
float vNorm = v / 100.0f;
// 计算色相所在的区间
int hi = (h / 60) % 6;
float f = (h / 60.0f) - hi;
float p = vNorm * (1 - sNorm);
float q = vNorm * (1 - f * sNorm);
float t = vNorm * (1 - (1 - f) * sNorm);
float r, g, b;
switch (hi) {
case 0:
r = vNorm;
g = t;
b = p;
break;
case 1:
r = q;
g = vNorm;
b = p;
break;
case 2:
r = p;
g = vNorm;
b = t;
break;
case 3:
r = p;
g = q;
b = vNorm;
break;
case 4:
r = t;
g = p;
b = vNorm;
break;
case 5:
r = vNorm;
g = p;
b = q;
break;
default:
throw new RuntimeException("Invalid HSV values");
}
// 将 RGB 值从 [0, 1] 转换为 [0, 255]
int red = Math.round(r * 255);
int green = Math.round(g * 255);
int blue = Math.round(b * 255);
return new int[]{red, green, blue};
}
}

View File

@@ -35,16 +35,21 @@ public class RandomsUtil {
* @param randomEnd
*/
public static String generateVerifyCode(Long randomStart, Long randomEnd) {
return String.valueOf(RandomUtil.randomLong(randomStart,randomEnd));
return String.valueOf(RandomUtil.randomLong(randomStart, randomEnd));
}
/**
* 生成随机系统图片
*
* @param randomStart 可以等于
* @param randomEnd 小于最大值
* @param 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 {
private static RedisTemplate<String, Object> getRedisTemplate(){
private static RedisTemplate<String, Object> getRedisTemplate() {
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");
}
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");
}
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);
}
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);
}
public static void set(String key, Object value){
public static void set(String key, Object 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);
}
public static boolean delete(String key){
if(StrUtil.isNotEmpty(key)){
public static boolean delete(String key) {
if (StrUtil.isNotEmpty(key)) {
return Boolean.TRUE.equals(getRedisTemplate().delete(key));
}
return false;

View File

@@ -0,0 +1,308 @@
package com.ai.da.common.utils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.util.*;
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, Long expiresIn) {
redisTemplate.opsForSet().add(key, value);
// 设置过期时间
redisTemplate.expire(key, expiresIn, TimeUnit.SECONDS);
}
/**
* 弹出变量中的元素
*/
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 Long getSize(String key){return redisTemplate.opsForSet().size(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);
}
public Long getViewCount(String key) {
Object value = redisTemplate.opsForValue().get(key);
if (value instanceof Integer) {
return Long.valueOf((Integer) value);
} else if (value instanceof Long) {
return (Long) value;
} else if (value instanceof String) {
return Long.valueOf((String) value);
} else {
throw new IllegalArgumentException("Unexpected value type");
}
}
public final static String PERSONAL_HOMEPAGE_VIEW_KEY = "PersonalHomepage:view:";
public void increasePersonalHomepageViewCount(Long accountId) {
String key = PERSONAL_HOMEPAGE_VIEW_KEY + accountId;
redisTemplate.opsForValue().increment(key);
}
public Long getPersonalHomepageViewCount(Long accountId) {
String key = PERSONAL_HOMEPAGE_VIEW_KEY + accountId;
return redisTemplate.opsForValue().increment(key, 0);
}
public final static String MOODBOARD_POSITION_KEY = "moodboard:position:";
public void saveMoodboardPosition(Long id, String moodboardPosition) {
addToString(MOODBOARD_POSITION_KEY + id, moodboardPosition);
}
public String getMoodboardPosition(Long id) {
return getFromString(MOODBOARD_POSITION_KEY + id);
}
public final static String NICKNAME_MODIFY_TIMES = "NicknameModifyTimes:";
public void increaseCount(String key) {
redisTemplate.opsForValue().increment(key);
}
public Long getIncrementCount(String key) {
return redisTemplate.opsForValue().increment(key, 0);
}
public void setKeyExpire(String key, Long expire) {
redisTemplate.expire(key, expire, TimeUnit.DAYS);
}
public final static String CHANGE_MAILBOX = "ChangeMailbox:";
// 每天允许通知3次
public final static String UPLOAD_TIMEOUT_REMINDER_COUNTER = "UploadTimeoutReminderCounter";
public void addProcessId(String processId, int progress) {
// Redis 中的键,可以通过 processId 来唯一标识
String redisKey = "process:progress:" + processId;
// 将当前进度存储到 Redis
redisTemplate.opsForValue().set(redisKey, String.valueOf(progress));
// 设置过期时间为 5 分钟300 秒)
redisTemplate.expire(redisKey, 5, TimeUnit.MINUTES);
}
public final static String PAYMENT_INFO_LAST_SCAN_TIME = "PaymentInfoLastScanTime";
public final static String AFFILIATE_LINK_VIEW_KEY = "AffiliateLink:view:";
public void increaseAffiliateLinkViewCount(Long accountId) {
String key = AFFILIATE_LINK_VIEW_KEY + accountId;
redisTemplate.opsForValue().increment(key);
}
public Long getAffiliateLinkViewCount(Long accountId) {
String key = AFFILIATE_LINK_VIEW_KEY + accountId;
return redisTemplate.opsForValue().increment(key, 0);
}
public void batchDeleteKeysWithSamePrefix(String prefix){
Set<String> keys = redisTemplate.keys(prefix + "*");
assert keys != null;
if (!keys.isEmpty()){
redisTemplate.delete(keys);
}
}
public final static String STRIPE_EXCEPTION_LOG = "StripeException:";
public final static String SUBSCRIPTION_SENT_EMAIL_TYPE = "SubscriptionEmailSentType:";
}

View File

@@ -1,7 +1,16 @@
package com.ai.da.common.utils;
import javax.servlet.http.HttpServletRequest;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map;
@Slf4j
public class RequestInfoUtil {
/**
@@ -10,17 +19,16 @@ public class RequestInfoUtil {
* @param request
* @return java.lang.String
* @version 1.0
*
*
* <p>
* <p>
* 使用了ng等代理服务器要在ng加以下配置
* location / {
* proxy_pass http://127.0.0.1:10678;
* proxy_set_header Host $host;
* proxy_set_header X-Real-IP $remote_addr;
* proxy_set_header REMOTE-HOST $remote_addr;
* proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
* }
* proxy_pass http://127.0.0.1:10678;
* proxy_set_header Host $host;
* proxy_set_header X-Real-IP $remote_addr;
* proxy_set_header REMOTE-HOST $remote_addr;
* proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
* }
*/
public static String getIpAddress(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
@@ -46,4 +54,58 @@ public class RequestInfoUtil {
return ip;
}
/**
* 免费 API 服务可能有请求频率限制,如果你需要处理大量 IP 地址,可能需要考虑使用付费服务或购买 IP 地理位置数据库。此外,始终要遵守 API 提供商的使用条款和隐私政策
* @param ip https://ip-api.com/docs/api:json 使用的接口api
* @return
* {
* "query": "24.48.0.1",
* "status": "success",
* "country": "Canada",
* "countryCode": "CA",
* "region": "QC",
* "regionName": "Quebec",
* "city": "Montreal",
* "zip": "H1L",
* "lat": 45.6026,
* "lon": -73.5167,
* "timezone": "America/Toronto",
* "isp": "Le Groupe Videotron Ltee",
* "org": "Videotron Ltee",
* "as": "AS5769 Videotron Ltee"
* }
*/
public static Map getIPLocation(String ip) {
// String ip = "117.143.125.1"; // 替换为你想查询的 IP 地址
// String ip = "194.5.48.180"; // 替换为你想查询的 IP 地址
String apiURL = "http://ip-api.com/json/" + ip;
try {
URL url = new URL(apiURL);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Accept", "application/json");
if (conn.getResponseCode() != 200) {
throw new RuntimeException("Failed : HTTP error code : " + conn.getResponseCode());
}
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String output;
StringBuilder outputBuilder = new StringBuilder();
// System.out.println("Output from Server .... \n");
while ((output = br.readLine()) != null) {
outputBuilder.append(output);
System.out.println(output);
}
conn.disconnect();
Map map = JSONObject.parseObject(outputBuilder.toString(), Map.class);
log.info("map: {}", map);
return map;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}

View File

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

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