Compare commits

...

435 Commits

Author SHA1 Message Date
huk
7995e5c2cd fix(content):优化vlog上传消息消费逻辑
- 移除无用的MinIO工具类导入
- 移除无用的全局常量和服务异常导入
- 修改日志级别从debug到error并添加具体数据标识-保留核心业务逻辑和必要工具类引用
2025-10-13 16:44:46 +08:00
wangqx
7db0e97a45 [fix]修改视频的消费者,增加错误消息的判断 2025-10-13 10:22:55 +08:00
wangqx
8cff58e360 [fix]优化评论逻辑 2025-10-11 11:23:05 +08:00
wangqx
093758afe9 [fix]修改回复评论的通知 2025-10-11 10:50:30 +08:00
huk
e1d24e1ae7 feat(order): 增加订单商品销量更新功能
- 修改订单支付成功逻辑,增加商品销量更新调用- 在 OrderItemService 中新增 addSaleNum 方法用于批量更新商品销量
- 在 ProductMapper 中新增 updateSales 方法实现销量累加
- 调整常量 ORDER_CANCEL_TIME从15分钟延长至30分钟
- 移除冗余的类导入和无用注解
- 更新 AppMemberController 关注相关接口的日志标题与描述
2025-10-10 16:40:49 +08:00
wangqx
841074baeb [fix]修改我是否关注的bug,修改缓存逻辑 2025-10-10 16:20:36 +08:00
huk
85dbab8f22 refactor(goods):优化商品查询逻辑并调整权限注解
- 移除了 AppProductController 中不必要的具体实现类引用
- 修改了商品查询方法名,统一为 getProduct
- 在 AppSearchController 中更新了商品查询调用
-为 AppVlogController 的 indexList 方法添加了 @SaIgnore 注解
-优化了 ProductMapper.xml 中的查询条件,增加租户状态过滤
- 格式化了 Java 代码中的空格和括号问题
- 移除了冗余的注释和无用的方法定义
2025-10-10 14:47:45 +08:00
huk
312598220c Merge remote-tracking branch 'origin/wzj-main' into wzj-main 2025-10-10 13:01:16 +08:00
huk
0be20584cf feat(transaction):优化提现退款任务的租户忽略逻辑
- 调整日志配置,细化MyBatis和Redisson相关包的日志级别控制
- 在WithdrawRefundTask中引入TenantHelper以忽略租户上下文- 修改过期提现查询逻辑,使用租户忽略方式获取数据
- 移除不再使用的RedPacketService依赖
- 统一HikariPool和MyBatis日志级别配置格式
2025-10-10 13:01:03 +08:00
cfc27f9f1e feat(config): 增加文件上传大小限制将单个文件大小和总上传文件大小限制从100MB调整为300MB,以支持更大的文件上传需求。 2025-10-09 14:45:02 +08:00
huk
5d0862f5dd feat(system): 引入以初始化OSS配置时忽略多租户功能 2025-10-09 12:39:40 +08:00
huk
12a03f595d refactor(member): 移除注册时默认头像URL配置,app端已处理 2025-10-09 12:37:17 +08:00
huk
c48e9dd1f2 chore(logging): 调整日志配置和轮转策略
- 统一设置日志级别变量引用
- 将日志文件压缩格式从.log改为.log.zip
- 增加控制台日志保留天数至7天
- 在应用启动时清理历史日志文件
- 设置总日志文件大小上限为1GB(控制台)和5GB(信息/错误)
-保持各类型日志的最大单文件大小为10MB
2025-10-09 11:35:31 +08:00
1cb41a326c [fix]订单增加非租户过滤 2025-10-03 15:05:15 +08:00
d0f77f301f [fix]视频过滤掉已删除的视频 2025-10-01 17:42:32 +08:00
3f77f37000 [fix]视频过滤掉已删除的视频 2025-10-01 17:36:55 +08:00
62c330fcec [fix]视频过滤掉已删除的视频 2025-10-01 17:35:26 +08:00
25c5f3466b [fix]自己的视频默认是关注的,自己的喜欢显示数量 2025-10-01 16:52:38 +08:00
485834b2cd [fix]修改点赞逻辑和视频上传 2025-10-01 15:05:05 +08:00
d60ed900bc [fix]修改点赞逻辑 2025-10-01 08:28:42 +08:00
400196b480 [fix]撤销核销码逻辑,增加会员信息的空值判断 2025-09-30 23:41:30 +08:00
f9cf42b9a8 [fix]核销码核销后检查是否都已核销 都核销后将订单状态改为已关闭 2025-09-30 23:28:28 +08:00
50767ad7b3 [fix]修改个人视频的显示顺序 2025-09-30 22:48:29 +08:00
e18f4ced63 [fix]修改视频拉取 2025-09-30 22:38:13 +08:00
b7043ebe17 [fix]修改验证码 2025-09-30 21:00:43 +08:00
0eadf32334 [fix]修改关注和粉丝的消息 2025-09-30 15:37:30 +08:00
71db25b6fe [fix]修改关注和粉丝 2025-09-30 14:31:12 +08:00
huk
8e3dd9899e Merge remote-tracking branch 'origin/wzj-main' into wzj-main 2025-09-30 11:37:49 +08:00
6ed0f56462 [fix]修改关注和粉丝 2025-09-30 11:34:33 +08:00
huk
ddcb00102c feat(content): 取用户手机号码字段修正
fix(system):修复租户字典数据同步空列表异常
- 在SysTenantServiceImpl中增加空列表检查
- 避免当dataList为空时出现空指针异常
2025-09-30 10:04:04 +08:00
4ee40f0bdb [fix]修改视频已读 2025-09-29 23:15:12 +08:00
49e52a9a55 [fix]增加视频已读 2025-09-29 20:39:05 +08:00
ec715206ef [fix]修改视频点赞逻辑 2025-09-29 19:04:13 +08:00
1cee8788f2 [fix]修改红包的状态枚举,解决无法领红包的问题 2025-09-29 16:45:47 +08:00
e9a8be0e1b [fix]修改支付订单的金额乘以100变成分 2025-09-29 16:45:47 +08:00
huk
7856c2b6e8 feat(vlog): 视频私密与公开状态切换接口移动至app目录下 2025-09-29 16:28:17 +08:00
huk
4c1e123214 feat(content): 新增视频审核功能并优化状态管理
- 新增 AuditVlogBO 类用于视频审核请求参数
- 在 VlogController 中增加视频审核状态变更接口
- 修改 VlogService 接口与实现类,支持通过 BO 对象更新审核状态-为 Vlog 实体类添加 Lombok 注解以简化构建
- 调整视频列表查询逻辑,支持按是否私密和状态筛选
- 更新 VlogMapperCustom.xml 查询条件动态 SQL 结构- 设置默认视频状态为“待审核”
- 移除冗余的用户 ID 参数校验,改用 BO 校验方式
- 引入枚举 VlogStatusEnum 的 Getter 方法便于获取状态值
2025-09-29 16:10:49 +08:00
huk
eeab201625 feat(goods): 添加商品分类接口参数校验- 在添加和修改商品分类接口中引入 @Valid 注解 2025-09-29 11:38:49 +08:00
huk
887ab084e9 feat(order): 添加订单支付未核销自动退款功能
- 新增延迟队列常量 DELAY_ORDER_TO_BE_USED 用于处理已支付未核销订单
- 调整订单取消时间单位从秒改为分钟,值设为15分钟
- 新增订单支付未核销自动退款时间常量,设置为14天
- 实现订单支付后加入延迟队列逻辑,超时未核销自动退款
- 订阅延迟队列处理已支付未核销订单状态更新为已退款
- 异步处理订单退款逻辑,避免阻塞主流程
2025-09-29 11:20:48 +08:00
huk
ee76a4cfda feat(goods): 添加商品分类校验与层级管理功能- 在 ProductCategory 实体类中增加名称和图标的非空校验注解
-为控制器启用参数校验支持,确保请求数据合法性
- 实现分类保存和更新方法,自动设置分类层级并检查重复性
- 引入断言工具防止重复分类插入或更新
- 增加对父级分类不存在情况的默认值处理逻辑
2025-09-29 11:20:40 +08:00
huk
5b7c78e024 feat(order): 实现订单未支付自动取消功能
- 新增延迟队列处理订单未支付自动取消逻辑
- 在订单创建时将订单ID加入延迟队列
- 配置订单未支付超时时间为15分钟(900秒)
- 使用Redis实现订单取消的延时队列监听与处理
- 更新缓存名称常量以支持订单延时取消队列标识
2025-09-28 18:06:42 +08:00
wangqx
8634a3e357 [fix]修改视频删除 2025-09-28 16:50:31 +08:00
huk
266ad175b7 refactor(order):优化订单相关代码结构与注释
- 移除 AppOrderController 中不必要的空行
- 为 Sku 类添加全参和无参构造函数
- 移除 OrderBusinessImpl 中设置核销码的逻辑
- 简化 OrderItemVO 和 OrderVO 中字段的注释描述
- 更新订单状态和核销码状态的 Schema 描述及实现类引用
- 移除 OrderVO 中冗余的 verificationCodes 字段
2025-09-28 16:29:06 +08:00
huk
16b9f183f3 Merge remote-tracking branch 'origin/wzj-main' into wzj-main 2025-09-28 16:28:58 +08:00
wangqx
ee92264adf [fix]修改信息回调 2025-09-28 16:08:58 +08:00
huk
a6a7af49c8 feat(order): app用户查询订单详情信息扩展核销码信息 2025-09-28 16:03:58 +08:00
huk
606ffbefdf refactor(order):优化订单详情查询逻辑
- 移除不必要的 QueryWrapper 导入
- 将 OrderItem 实体替换为 OrderItemVO 视图对象
- 新增 selectItemInfoByOrderIds 方法用于批量查询订单详情- 简化订单详情分组与绑定逻辑
- 在 OrderItemVO 中增加核销相关字段及状态枚举支持
2025-09-28 15:44:20 +08:00
wangqx
1305061781 [fix]修改充值 2025-09-28 15:23:34 +08:00
huk
4a912fe4e7 feat(order): 添加租户名称到订单项- 移除了未使用的LocalDateTimeUtil导入
- 引入了SysTenantService和SysTenantVo依赖- 在OrderServiceImpl中注入了ISysTenantService- 为每个订单项查询并设置租户名称
- 优化了订单项构建逻辑,提高代码可读性
2025-09-28 11:22:46 +08:00
wangqx
913aebcb3d [fix]订单支付改为使用id 2025-09-28 10:52:24 +08:00
huk
d4079a5f28 refactor(order):优化订单相关逻辑与数据映射
- 修改订单项租户ID获取逻辑,使用item.getTenantId()替代vo.getTenantId()- 调整热销商品统计SQL,将状态筛选从status=3改为status in (2,9)
- 移除OrderMapper中冗余的selectByEntity方法及XML配置- 删除OrderVO中冗余的租户信息、收货地址等字段- 注释掉OrderVO中的采购价字段
- 清理OrderVO中与前端展示无关的商品相关信息字段
- 移除订单统计SQL中不必要的delete_status条件限制
- 修改商品分类控制器依赖注入方式,使用接口类型替换实现类- 移除订单详情接口中设置租户信息的重复逻辑
- 清理OrderVO中冗余的tenant对象属性
- 删除订单列表查询XML中冗余的orderPage和selectOrderDetail方法配置
2025-09-28 09:49:39 +08:00
huk
8ba2a94e97 feat(order): 新增商家订单详情查询接口 2025-09-27 16:51:18 +08:00
wangqx
22d6ca9897 [fix]搜索去掉本人 2025-09-27 16:27:06 +08:00
wangqx
10e0a359e8 [fix]修改超时退回 2025-09-27 16:06:09 +08:00
huk
e1d7e4011a feat(goods): 添加商品分类查询条件并优化排序
- 在app查询商品分类列表和树形结构时,默认设置 showStatus为 1
-为商品分类查询添加按 sort 字段升序排列的默认排序规则
2025-09-27 15:52:33 +08:00
huk
8d148bd76c feat(transaction):优化分账规则管理功能
- 调整分账规则状态枚举值,启用状态为0,禁用状态为1
- 修改适用商品类型字段类型从Integer为Long
- 增加分账规则保存和更新时的商品类型唯一性校验- 优化分账规则更新逻辑,支持明细的增删改操作
- 调整商品分类查询逻辑,支持父子级分类结构展示
- 移除区域ID和手续费承担方式字段注释
- 完善分账规则BO和VO类的字段描述和注解
- 添加分账规则明细Mapper查询方法- 优化分账规则转换逻辑,提升代码可读性
- 增强分账规则服务层的业务校验逻辑
2025-09-27 15:42:02 +08:00
huk
86b14817fd fix(sms):修复短信验证码发送逻辑 2025-09-27 15:19:36 +08:00
huk
9190b6e6b2 fix(system):更正租户VO中的店铺名称字段 2025-09-27 13:58:10 +08:00
huk
723521a7bb fix(system):更正租户VO中的店铺名称字段 2025-09-27 13:57:59 +08:00
huk
ea7b64c9f6 feat(auth):优化租户列表展示逻辑 2025-09-27 13:54:25 +08:00
huk
bc2f5d4fce Merge remote-tracking branch 'origin/wzj-main' into wzj-main 2025-09-27 13:22:08 +08:00
huk
4ee568bf5c feat(auth): 根据租户类型动态设置显示名称 2025-09-27 13:21:49 +08:00
wangqx
0d08db4d7d [fix]服务器配置 2025-09-27 12:00:37 +08:00
huk
b2a9624aac refactor(dict):优化字典缓存清理逻辑- 移除 SYS_DICT_TYPE_WITH_DEFAULT_TENANTID 缓存常量- 使用 GlobalConstants.GLOBAL_DICT_KEY 替代旧缓存键- 更新 insertDictType与 updateDictType 方法的缓存注解
- 在删除和重置缓存时同步清理全局字典缓存- 统一缓存更新操作,同时更新 SYS_DICT 和全局缓存
2025-09-27 11:41:30 +08:00
huk
462ccbb250 feat(system): 添加全局字典缓存支持
- 在 GlobalConstants 中新增全局字典 Redis 键
- 更新 SysDictTypeServiceImpl 使用全局字典缓存键
- 在 SysDictDataMapper 中忽略租户上下文以支持默认租户查询
2025-09-27 11:26:16 +08:00
huk
4d6065d4da chore(config): 调整 MyBatis 日志配置并添加租户拦截器日志设置 2025-09-26 17:47:03 +08:00
huk
71b3bd9762 Merge remote-tracking branch 'origin/wzj-main' into wzj-main 2025-09-26 16:54:23 +08:00
huk
d3f7145610 refactor(order):优化订单模块代码结构与查询功能
- 新增订单项BO中的订单状态字段并关联枚举类型
- 在OrderItemMapper.xml中添加根据订单状态查询的条件判断
- 调整了部分包导入顺序以符合编码规范
2025-09-26 16:54:16 +08:00
wangqx
bdcf098da8 [fix]修改回调 2025-09-26 16:42:07 +08:00
wangqx
81d6b0727f [fix]修改回调 2025-09-26 16:36:17 +08:00
huk
40d8105e55 feat(member): 支持用户注销状态管理- 新增用户注销状态REVOKED,值为2- 短信认证策略中处理已注销用户重新登录的情况 2025-09-26 16:23:02 +08:00
wangqx
e0ac519d55 [fix]修改回调 2025-09-26 16:11:33 +08:00
wangqx
36f3208daa 统计 2025-09-26 16:06:57 +08:00
huk
ab30f6c9cc feat(app): 新增app会员与商户模块配置- 在application.yml中添加app会员模块和商户模块的包扫描配置
- 优化订单服务分页查询逻辑,支持商户维度数据筛选
- 配置knife4j文档分组,支持app模块接口文档展示
- 优化订单创建逻辑,补充商品分享人ID等字段
- 移除分账规则中的手续费相关字段与校验逻辑- 新增核销码VO,支持订单核销状态管理
2025-09-26 16:02:36 +08:00
huk
8b9a963bc6 Merge remote-tracking branch 'origin/wzj-main' into wzj-main 2025-09-26 15:59:28 +08:00
wangqx
773a93b5ff [fix]修改微信支付 2025-09-26 15:47:56 +08:00
wangqx
c7d71811b6 [fix]修改微信支付 2025-09-26 15:25:57 +08:00
huk
9a864d155d Merge remote-tracking branch 'origin/wzj-main' into wzj-main 2025-09-26 14:16:11 +08:00
wangqx
ea555fbe34 [fix]修改提现逻辑 2025-09-26 13:01:53 +08:00
wangqx
dfc5ae4a06 [fix]修改提现逻辑 2025-09-26 12:58:41 +08:00
huk
22bee9888b Merge remote-tracking branch 'origin/wzj-main' into wzj-main 2025-09-26 11:24:51 +08:00
wangqx
a379e4b52f [fix]修改提现逻辑 2025-09-26 11:24:23 +08:00
wangqx
d880c3fe6d [fix]修改提现逻辑 2025-09-26 11:23:57 +08:00
huk
956e4e4001 Merge remote-tracking branch 'origin/wzj-main' into wzj-main 2025-09-26 11:22:24 +08:00
wangqx
a288e3ec5c [fix]修改提现逻辑 2025-09-26 10:55:45 +08:00
wangqx
0966105bc5 [fix]修改提现逻辑 2025-09-26 10:26:26 +08:00
wangqx
a8fe4bb1a6 [fix]修改提现逻辑 2025-09-26 10:24:52 +08:00
wangqx
94e891a510 [fix]修改提现逻辑 2025-09-26 09:54:02 +08:00
wangqx
28ea7a5c3b [fix]修改提现逻辑 2025-09-25 20:55:44 +08:00
wangqx
6129490adf [fix]修改提现逻辑 2025-09-25 20:37:52 +08:00
wangqx
99c1b97e42 [fix]修改提现逻辑 2025-09-25 20:21:30 +08:00
wangqx
ec58264e48 [fix]修改提现逻辑 2025-09-25 20:11:45 +08:00
wangqx
2ec245bc2f [fix]修改提现逻辑 2025-09-25 19:53:44 +08:00
wangqx
e954b29559 [fix]修改提现逻辑 2025-09-25 19:45:47 +08:00
wangqx
8477024657 [fix]修改提现逻辑 2025-09-25 19:36:36 +08:00
wangqx
028ea76870 [fix]修改提现逻辑 2025-09-25 19:29:28 +08:00
wangqx
cdc99c7651 [fix]修改提现逻辑 2025-09-25 19:15:31 +08:00
huk
3a973e9fe3 feat(transaction): 新增查询未创建分账规则的商品分类接口 2025-09-25 18:15:28 +08:00
huk
296c852bdd feat(system): 新增租户分账承担手续费标志字段 2025-09-25 16:14:55 +08:00
huk
780cabad0a refactor(member): 优化分页参数传递方式 2025-09-25 15:46:41 +08:00
huk
0400f2d8d7 refactor(docs): 升级 Swagger 注解为 OpenAPI 3.0 并集成 Knife4j
- 将项目中使用的 Swagger 2.x 注解(如 @Api、@ApiOperation 等)全面替换为  OpenAPI3.0 对应注解(如 @Tag、@Operation 等)
 - 解决Knife4j依赖的springdoc-openapi版本和springboot3.4.4版本不兼容问题
2025-09-25 15:19:18 +08:00
wangqx
efb510e448 [fix]增加提现日志 2025-09-25 12:11:18 +08:00
huk
f33323af44 Merge remote-tracking branch 'origin/wzj-main' into wzj-main 2025-09-25 10:51:12 +08:00
huk
0513fbff94 feat(system): 更新租户模块字段类型与权限控制逻辑
- 将 SysTenant 和 SysTenantVo 中的 bearFeeFlag 字段类型由 Integer 改为 Boolean
- 移除 SysTenant 中不再使用的 BigDecimal 导入
- 在 SysTenantController 的删除接口中调整 SaCheckRole 权限注解模式为 OR- 在 SysTenantExtendBo 中新增 bearFeeFlag 字段并更新 splitRatio 描述
2025-09-25 10:50:59 +08:00
wangqx
01bdbbb102 [fix]修改充值 2025-09-24 18:45:29 +08:00
wangqx
362d57869b [fix]修改通知的逻辑 2025-09-24 18:21:46 +08:00
wangqx
eafb814e13 [fix]修改订单逻辑 2025-09-24 14:33:49 +08:00
wangqx
17cec18869 [fix]修改发红包的逻辑 2025-09-24 12:45:08 +08:00
wangqx
15d36d3ec4 [fix]修改缓存配置 2025-09-24 12:18:00 +08:00
wangqx
9ad1de7d1c [fix]修改消息 2025-09-24 12:05:00 +08:00
wangqx
1238837d62 [fix]修改消息 2025-09-24 10:35:32 +08:00
wangqx
2692cd66b8 [fix]修改红包和提现 2025-09-23 16:59:33 +08:00
wangqx
3c770192fa [fix]修改红包和提现 2025-09-23 16:55:09 +08:00
huk
eeb50d18b1 feat(order): 重构核销码逻辑并优化订单查询接口
- 核销码生成与验证逻辑重构,支持按订单项生成多个核销码- 新增核销码状态枚举,完善状态管理(待核销、已核销、已过期、已取消)
- 优化商户端订单列表查询逻辑,区分基于订单和订单项的租户查询
- 更新微信小程序配置appId与secret
- 订单商品查询改为使用sku快照,确保数据一致性
2025-09-23 16:02:08 +08:00
wangqx
a74ed5dde0 [fix]修改红包和提现 2025-09-22 18:32:01 +08:00
huk
2e5cc3afbb fix(order): 订单项构建时补充产品与SKU快照ID字段 2025-09-22 16:46:51 +08:00
huk
08af9c4f8f feat(goods): 商品模块快照机制引入
- 新增商品默认待审核,下架状态
- 仅审核通过的商品可上架
- 每次上架商品均产生商品及sku的快照记录
2025-09-22 16:10:34 +08:00
huk
d99ac96aac Merge remote-tracking branch 'origin/wzj-main' into wzj-main 2025-09-22 15:52:01 +08:00
huk
2214b17a32 feat(tenant): 调整多租户插件配置顺序,去除重复注册MybatisPlus多租户插件 2025-09-22 15:51:42 +08:00
wangqx
43b4714db5 [fix]修改回调 2025-09-22 10:11:34 +08:00
wangqx
321584d5b1 [fix]修改回调 2025-09-20 18:31:59 +08:00
wangqx
251fb9b0dc [fix]微信充值和提现 2025-09-20 18:24:43 +08:00
wangqx
4b518e023c [fix]微信充值和提现 2025-09-20 18:20:23 +08:00
huk
568cf4a9be feat(member): 增加移动端给当前登录用户手机短信验证码发送与用户注销功能 2025-09-20 18:01:58 +08:00
huk
fa81755e25 feat(tenant): 更新租户类型枚举注释及名称
将 TenantType 枚举中的“达人”修改为“团长”,并同步更新注释描述。

refactor(exception): 统一系统异常返回信息全局异常处理器中,针对 ServletException、RuntimeException 和 Exception
的处理方法返回统一的错误提示:“系统异常,请联系管理员”。

refactor(tenant):优化租户用户名存在性校验逻辑
2025-09-20 15:00:44 +08:00
huk
e8685c3eba fix(goods): 调整SKU查询逻辑以支持租户忽略查询 2025-09-20 14:15:35 +08:00
huk
b5b588eb2c ```
feat(goods): 优化 SKU 查询逻辑,增加删除标记过滤条件在 SkuMapper.xml 的 getList 查询中,新增对 sku 和 product 表的 del_flag = '0' 过滤条件,确保查询结果仅包含未删除的数据。同时调整 SQL 格式以提升可读性。```
2025-09-20 14:09:25 +08:00
huk
4a369920df feat(ruoyi-member): 添加会员注册时间字段
新增 MemberVO 类中的 createTime 字段,用于记录会员的注册时间,并添加相应的 JSON 格式化注解和 Swagger 文档注解。
2025-09-20 13:44:42 +08:00
huk
ab403a98e1 feat(product): 添加商品发布状态过滤条件
在商品查询逻辑中,默认添加已上架商品的筛选条件,确保查询结果仅包含已上架的商品信息。
2025-09-20 11:44:14 +08:00
huk
8fd339c525 feat(product): 添加商品发布状态过滤条件
在商品查询逻辑中,默认添加已上架商品的筛选条件,确保查询结果仅包含已上架的商品信息。
2025-09-20 11:37:28 +08:00
huk
d344925286 refactor(ruoyi): 更新 API 文档注解
-替换 @Tag 为 @Operation 注解
- 更新 API 接口的 summary 描述
-移除冗余代码和不必要的注释
- 统一使用 io.swagger.v3 包
2025-09-19 17:59:59 +08:00
huk
8d76107c27 refactor(ruoyi): 更新 API 文档注解
-替换 @Tag 为 @Operation 注解
- 更新 API 接口的 summary 描述
-移除冗余代码和不必要的注释
- 统一使用 io.swagger.v3 包
2025-09-19 17:32:27 +08:00
huk
bb082bc1d1 feat(goods): 商品属性组装及展示
- 修改 ProductServiceImpl 中的商品详情查询逻辑,增加商品属性处理
- 更新 ProductVO 和 SkuVO 类,增加商品属性相关字段
2025-09-19 16:17:53 +08:00
huk
22efde0bb0 refactor(member): 移除会员信息列表查询接口的权限控制 2025-09-19 15:23:06 +08:00
huk
1ee5c31022 refactor(goods): 优化商品 SKU 处理逻辑
- 新增 SkuBo 主键字段,用于更新操作
- 优化商品保存逻辑,支持新增和更新 SKU
- 新增 SKU 获取接口,按商品 ID 查询
-调整商品查询结果,使用别名区分 SKU 字段
2025-09-19 14:53:58 +08:00
huk
1a859a9337 feat(transaction): 微信商户新增APPID功能
- 添加微信商户新增APPID请求和响应对象- 实现微信商户新增APPID接口调用
- 更新商品信息相关代码,增加删除标志字段- 优化品牌、商品分类、SKU等实体类结构
-调整商品信息查询逻辑,增加租户信息判断
2025-09-19 11:56:17 +08:00
huk
765efb0cd5 refactor(MemberServiceImpl):
- 在查询代理租户前,增加对`referenceTenant.getAgencyTenantId()`非空性的断言,确保只有当租户已绑定会员时才继续执行后续逻辑。这有助于避免因数据不完整导致的潜在异常。
2025-09-18 18:02:39 +08:00
huk
dbe4a36ba7 refactor(multiple files): 优化会员和订单相关功能
- 在SmsAuthStrategy.java中移除了未使用的导入,并添加了获取会员绑定团长租户ID的逻辑。
- 在LoginUser.java中新增了`referenceTenantId`字段,用于存储所属团长的租户ID。
- 在MemberController.java中更新了Swagger注解,并调整了部分方法的注释。
- 在MemberMapper.java中新增了`getReferenceTenantIdBySpreadUid`方法,用于查询会员绑定团长的租户ID。- 在OrderBo.java中将`tenantId`字段设置为隐藏。- 在OrderController.java中更新了Swagger注解,并调整了部分方法的注释。
- 在OrderMapper.java和OrderMapper.xml中移除了不必要的租户ID过滤条件。
- 在OrderService.java和OrderServiceImpl.java中新增了分页查询当前商铺和团长绑定会员的订单列表的方法。
- 在ISysTenantService.java、SysReferenceBo.java、SysReferenceController.java、SysTenantMapper.java和SysTenantServiceImpl.java中更新了接口和实现,以支持新的查询参数。
2025-09-18 17:16:00 +08:00
wangqx
895421fa8b [fix]修改生产环境配置,修改消费者配置 2025-09-18 16:57:57 +08:00
wangqx
fd5f3fc527 [fix]绑定推 2025-09-18 16:17:40 +08:00
wangqx
1c2e84eaf1 [fix]绑定推广人增加互关逻辑 2025-09-18 16:15:23 +08:00
huk
8795b1fb37 refactor(member): 更新通过团长ID获取会员信息的方法将getByReference方法的参数从MemberBO更改为ReferenceMemberQuery,并更新了返回类型为Page<ReferenceMemberVO>。同时,在MemberServiceImpl中实现了新的查询逻辑,支持按昵称、手机号和推广时间进行过滤,并在结果中添加了代理商名称和团长姓名。 2025-09-18 14:57:49 +08:00
huk
b974273aa1 refactor(SysReferenceController): 修改list方法参数传递方式 2025-09-18 11:30:22 +08:00
huk
f7000dc1fd feat(tenant):团长租户增加修改查询接口 2025-09-18 11:18:21 +08:00
huk
5c0907bfb9 Merge remote-tracking branch 'origin/wzj-main' into wzj-main 2025-09-18 11:16:43 +08:00
huk
7570141837 正式环境易生分配证书及商户号 2025-09-18 11:13:54 +08:00
wangqx
1c3c5089f6 [fix]修改pom和报错 2025-09-18 10:57:17 +08:00
wangqx
5d02397509 [fix]修改pom 2025-09-18 09:53:20 +08:00
wangqx
0ed7eca256 [fix]修改pom 2025-09-18 09:32:41 +08:00
wangqx
ad135c2421 [fix]修改pom 2025-09-18 09:27:41 +08:00
wangqx
418e1b52af [fix]修改评论 2025-09-18 09:23:40 +08:00
huk
1bb2c72e8b refactor(配置): 更新易支付相关配置并删除测试环境配置、添加私钥文件,用于易支付签名 2025-09-17 17:00:22 +08:00
wangqx
638851a00d [fix]暂时去掉统计 2025-09-17 11:08:22 +08:00
wangqx
09d3576111 [fix]修改用户注册逻辑,使用phone——hidden字段,修改用户表,增加点赞数字段 2025-09-17 10:57:08 +08:00
wangqx
845cd85dc6 [fix]修改用户注册逻辑,使用phone——hidden字段,修改用户表,增加点赞数字段 2025-09-17 10:54:11 +08:00
wangqx
78050724a6 [fix]修改token验证,修改用户接口 2025-09-17 10:01:42 +08:00
huk
d751de05c2 feat(goods): 查询商品分类及子分类 2025-09-15 18:01:57 +08:00
huk
9c6f5f3add Merge remote-tracking branch 'origin/wzj-main' into wzj-main 2025-09-15 18:00:53 +08:00
wangqx
910da9cdff [fix]修改配置文件 2025-09-15 17:29:57 +08:00
huk
52494134ee feat(system): 完善租户查询功能并优化相关逻辑
- 添加获取子级租户列表的方法
- 优化租户列表查询逻辑,支持根据父级ID筛选
- 让店铺和商品的业务功能适配动态切换租户
2025-09-15 15:34:58 +08:00
wangqx
b1a2811885 Merge branch 'refs/heads/wzj-wqngqx' into wzj-main 2025-09-15 15:33:25 +08:00
wangqx
4ec050cbba [fix]增加统计 2025-09-15 11:14:40 +08:00
huk
841c35106d fix(transaction): 易生分账返回状态枚举修正 2025-09-15 10:17:55 +08:00
6586373a89 [fix]统计数据 2025-09-14 22:09:09 +08:00
wangqx
794751beef [fix]增加统计 2025-09-13 17:29:14 +08:00
wangqx
3fad44f28b [fix]增加统计 2025-09-13 17:27:49 +08:00
huk
9a6f0e14d7 feat(goods): 添加商品信息列表查询功能并优化相关逻辑
- 在 ProductBo 中添加 id 字段用于查询
- 实现 ProductBusinessImpl 中的 page 方法用于分页查询
- 更新 ProductService 接口,将 IPage 改为 Page 类型
- 修改 ProductServiceImpl 中的 getList 方法,适应新的 Page 类型
- 优化 SysTenantMapper.xml 中的 SQL 查询条件
2025-09-13 17:27:12 +08:00
wangqx
4479995b17 [fix]增加绑定推广人 2025-09-13 16:58:31 +08:00
wangqx
4c580e3ec5 [fix]修改订单核销码 2025-09-13 15:32:33 +08:00
wangqx
7a9765d1be [fix]修改订单核销码 2025-09-13 15:32:33 +08:00
huk
e74226d2d4 feat(system): 增加租户创建权限并优化租户相关功能
- 修改代理商租户类型创建权限,允许创建代理商、商户和达人类型
- 在 SysTenant 模型中添加 parentIds 字段,用于存储所有父级 ID
- 在 SysTenantPackageServiceImpl 中添加对租户类型筛选的支持- 优化 SysTenantServiceImpl 中的租户创建逻辑,设置正确的 parentIds
- 在 SysTenantVo 和 TenantDTO 中添加 parentIds 字段的定义
2025-09-13 12:37:23 +08:00
huk
e54ff633d8 Merge remote-tracking branch 'origin/wzj-main' into wzj-main 2025-09-13 11:18:15 +08:00
huk
f700b77fb5 fix(system): 将 SysTenantPackageBo 中的 tenantType 字段注解从 @NotBlank 改为 @NotNull 2025-09-13 11:18:05 +08:00
wangqx
59576b6129 [fix]修改订单核销码 2025-09-13 10:15:17 +08:00
huk
4b738e47ea feat(transaction): 实现分账查询功能并优化退款流程
- 新增分账查询接口和相关 BO、VO 类
- 优化退款流程,增加退款流水号字段- 更新数据库表结构和 Mapper 文件
- 重构部分代码以支持新功能
2025-09-12 17:46:27 +08:00
wangqx
ccf2c6b02e [fix]修改订单核销码 2025-09-12 16:24:06 +08:00
wangqx
ab75ebf27c [fix]修改订单增加business层代码 2025-09-12 16:02:12 +08:00
wangqx
9fbe5561cc [fix]修改订单列表 2025-09-12 14:40:36 +08:00
huk
c9ff830a56 fix(goods): 忽略产品查询中的租户限制
- 在 ProductService 的 selectById 方法中添加 TenantHelper.ignore(),以忽略租户限制
- 这样可以确保在查询产品时不受当前租户的约束,提高查询的灵活性和适用性
2025-09-12 14:37:02 +08:00
huk
cb05c45909 refactor(order): 重构订单模块并添加退款功能
- 重构了订单相关实体类和VO类,优化了字段设计
- 新增了AftersaleStatus枚举类,用于表示售后状态- 在OrderService中实现了退款功能
- 优化了订单查询相关SQL和Mapper方法
-调整了分账相关逻辑,增加了回退状态
2025-09-12 13:22:26 +08:00
wangqx
76342416ad [fix]修改商品 增加business层 2025-09-12 11:47:49 +08:00
wangqx
0a50a160eb [fix]修改商品 增加business层 2025-09-12 11:43:34 +08:00
wangqx
ebc18ac990 [fix]修改商品 增加business层 2025-09-12 11:42:23 +08:00
wangqx
83084e2f78 [fix]修改商户订单 2025-09-11 16:37:12 +08:00
wangqx
cfa44d714e [fix]修改用户订单的枚举 2025-09-11 15:57:26 +08:00
wangqx
bfd6bc390d [fix]修改用户订单 2025-09-11 15:25:01 +08:00
wangqx
f73503c240 [fix]修改商户账单和订单核销 2025-09-11 11:06:44 +08:00
huk
7db59f91a9 feat(system): 更新租户类型并优化相关功能
- 修改租户类型描述,增加新的租户类型
- 优化租户创建流程,支持不同类型的租户
- 调整日志级别配置,增加 Redis 和 HikariCP 的日志
- 修复分
2025-09-11 11:00:40 +08:00
huk
83ffa453f6 refactor(交易模块):调整易生支付退款权限校验
- 移除了 EasypayServiceImpl 中的个人用户退款权限校验
- 在 TransEasypayController 中添加了基于角色和权限的退款操作控制- 引入了 satoken 注解进行权限和角色校验
2025-09-11 09:55:30 +08:00
huk
cc5a87ab76 feat(transaction): 重构分账逻辑
- 移除商户、代理、达人分账中的冗余参数
- 优化分账明细的创建和插入逻辑
- 更新雪片算法生成唯一标识
-调整易生支付请求参数生成方式
- 移除未使用的字段和方法
2025-09-11 09:46:26 +08:00
wangqx
65f99d7a44 [fix]修改商户账单和订单核销 2025-09-10 19:53:21 +08:00
huk
91655571fe refactor(transaction): 重构分账规则功能
- 移除 DivideRuleFeeType 枚举类- 更新分账规则相关实体类和 BO 类
- 重构分账规则保存、更新和删除逻辑
- 优化分账规则校验方法
- 调整分账比例表示方式,使用整数百分比替代小数
2025-09-10 15:34:57 +08:00
wangqx
b382c09dda [fix]修改租户类型 2025-09-10 10:44:41 +08:00
wangqx
342fbc4de8 [fix]修改用户角色 2025-09-09 19:04:06 +08:00
wangqx
8e3403e708 [fix]修改用户角色 2025-09-09 18:57:29 +08:00
huk
df6e2fe083 refactor(sms): 回滚短信登录逻辑 2025-09-09 14:04:30 +08:00
huk
16ab858284 feat(goods): 获取可管理的商铺租户列表
- 添加 ruoyi-system 依赖
- 实现获取当前登录用户可管理的商铺租户列表功能
-优化产品列表查询逻辑,支持多租户管理
2025-09-08 18:30:24 +08:00
huk
1aef69bb78 refactor(system): 优化用户租户关联逻辑 2025-09-08 18:18:25 +08:00
huk
2e468d0ebc feat(system): 分页查询用户关联业务租户 2025-09-08 17:12:28 +08:00
huk
e3dfb9b98f refactor(system): 优化用户关联业务租户查询逻辑 2025-09-08 15:57:42 +08:00
huk
cba7f368a7 feat(system): 新增用户关联业务租户功能
- 新增 SysUserTenant 模型类用于用户绑定业务租户
- 实现用户关联业务租户的保存和查询功能
- 添加相关 mapper、service 接口及其实现类
- 在用户控制器中集成用户关联业务租户的相关接口
2025-09-08 15:07:09 +08:00
huk
8af8137fec feat(goods): 更新产品列表查询功能
- 移除单个租户 ID 参数,改为接收租户 ID 列表
- 在 SQL 中添加对多个租户 ID 的 IN 查询
- 优化服务实现,使用 TenantHelper 忽略租户权限
- 调整日志标题,提高可读性
2025-09-06 18:41:16 +08:00
huk
46a6f340fd fix(tenant): 修复多租户登录问题 2025-09-06 15:55:52 +08:00
huk
e57128401e feat(admin): 调整文件上传大小限制
- 将单个文件最大大小从 10MB 增加到 100MB
- 将总上传文件大小从 20MB 增加到 100MB
2025-09-06 11:14:56 +08:00
huk
4749f2b413 feat(content): 增加 vlog 列表筛选功能并修复保存逻辑
- 在 VlogBO 中添加 startTime 和 endTime 字段的格式说明
- 在 VlogMapperCustom.xml 中添加 startTime、endTime 和 mobile 的筛选条件
- 修复 VlogServiceImpl 中 vlog 保存逻辑的错误:
  - 将自动生成的 vid 设置为 vlog 的 id
  - 将 vlogBO 的 url 设置为 vlog 的 url
  - 移除重复设置 id 的错误代码
2025-09-06 11:06:27 +08:00
huk
3354e5e410 feat(content): 为 IndexVlogVO 添加用户手机号和创建时间字段 2025-09-06 10:11:25 +08:00
huk
800ee8e8d5 refactor(ruoyi):调整权限控制注解- 移除了 IMMessageTemplateController 中的 @SaCheckPermission 注解
- 注释掉了 SysMenuController 中的 @SaCheckRole 注解
- 保留了必要的 @SaCheckPermission 注解
2025-09-05 18:35:57 +08:00
huk
2dd6ac0631 feat(system): 完善租户创建权限控制
- 在 TenantType 枚举中添加 SUPERADMIN 类型
- 实现 allowCreateByType 方法控制租户创建权限- 调整 SysTenantController 中的权限注解
-优化 SysTenantServiceImpl 中的租户创建逻辑
2025-09-05 18:24:05 +08:00
wangqx
bf728cee9b [fix]修改视频上传 2025-09-05 17:58:30 +08:00
wangqx
2616b5fff8 [fix]修改视频上传 2025-09-05 17:18:30 +08:00
huk
bb9e2a9c7a feat(auth): 优化多租户登录逻辑
- 移除前端租户选择,后端根据用户信息自动判断租户
-针对不同登录方式(邮箱、用户名、手机号)查询用户租户信息
- 添加租户类型枚举,修改相关字段描述- 优化社会化登录逻辑,支持多租户环境
-调整权限注解,支持多角色登录
2025-09-05 15:56:04 +08:00
huk
a210e4b0aa refactor(transaction): 重构分账模型领域对象
- 更新 Divide、DivideDetail、DivideRule 和 DivideRuleDetail 类
- 添加 delFlag 字段并配置为逻辑删除
- 修改 DivideMapper.xml 中的查询条件,增加逻辑删除判断- 继承 BaseAudit 以支持审计字段
2025-09-05 13:59:06 +08:00
huk
17648ceb5c Merge remote-tracking branch 'origin/wzj-main' into wzj-main 2025-09-05 12:51:37 +08:00
huk
07df3682ea feat(common): 修复自动注入异常并优化代码
- 修复了 InjectionMetaObjectHandler 中的自动注入异常
- 优化了 Order 和 PayOrder 实体类的代码结构
2025-09-05 12:51:29 +08:00
wangqx
a3fc224f0e [fix]修改视频的bug 2025-09-05 11:22:11 +08:00
huk
4a44c85177 refactor(order): 优化订单状态相关代码
- 移除 Order 类中冗余的订单状态字段注释
- 更新 OrderStatusEnum 枚举类注释
- 修正 EasypayServiceImpl 中的交易状态代码
- 统一 TransState 枚举中的状态码命名
2025-09-05 10:29:07 +08:00
huk
2fe6800ac3 feat(transaction): 为实体类添加逻辑删除注解并优化订单查询逻辑
- 在 Divide、DivideRule 和 PayOrder 类中,为 delFlag 字段添加 @TableLogic 注解
- 优化 EasypayServiceImpl 中的 paymentQuery 方法,增加对 payOrder 为空的处理
2025-09-04 17:41:49 +08:00
huk
15690ac810 feat(transaction): 完善分账功能并更新订单状态
- 在订单表中添加分账状态- 新增分账规则校验逻辑
- 更新分账和订单状态处理流程
- 优化分账失败和异常处理
2025-09-04 14:57:31 +08:00
wangqx
793c34a96a [fix]修改查询结果 2025-09-03 13:41:32 +08:00
huk
8e6911c155 Merge remote-tracking branch 'origin/wzj-main' into wzj-main 2025-09-03 13:35:45 +08:00
huk
b03006bbc2 refactor(system): 新增店铺,其租户默认签名状态为待签约 2025-09-03 13:35:37 +08:00
wangqx
82c06e75a8 [fix]修改取消点赞,修改消费消息 2025-09-03 13:16:05 +08:00
huk
5e6f6c9c3d refactor(goods): 优化商品相关代码结构
- 移除 ProductMapper 中不必要的订单相关联接查询
- 优化 ProductServiceImpl 中的 getList 方法
- 注释 ProductVO 中的 distribution 字段
- 在 SkuMapper 中添加 productId 的精确查询条件
2025-09-03 13:09:35 +08:00
huk
886a9cb4de feat(app): 添加视频上传接口并优化视频上传参数
- 在 VlogBO 中添加 vlogerId 字段,用于指定作者 ID
- 优化 VlogBO 类的注释,明确其作为视频上传业务参数的用途
2025-09-03 12:35:49 +08:00
huk
80b80b9578 refactor(Admin): 更新微信小程序密钥并优化代码
- 更新微信小程序 secret 为实际值- 移除 BaseEntity 中未使用的 Date 导入
- 优化 OrderServiceImpl 中的 productMapper 注入方式
2025-09-03 10:57:50 +08:00
wangqx
4ff73cb5ec [fix]修改用户创建 2025-09-03 10:40:11 +08:00
huk
e1937355dc refactor(order): 更新订单状态逻辑和支付流程
- 修改订单状态枚举,增加"支付中"和"已退款"状态
- 更新支付成功后的订单状态处理逻辑
- 增加支付失败时的状态回滚
- 修复退款相关的问题,更新退款成功后的订单状态
- 优化支付和退款流程中的日志记录
2025-09-03 09:48:38 +08:00
huk
55e1fcb553 refactor(交易模块): 优化订单和分账相关功能
- 移除分账结果异步回调通知地址配置
- 新增订单取消功能
- 修改订单状态枚举
- 优化分账流水号生成逻辑
-调整订单支付流程和状态更新
- 移除未使用的代码和接口
2025-09-02 18:36:53 +08:00
huk
83b4744fbd refactor(transaction): 重构分账逻辑
- 移除了不必要的账户信息获取方法
- 优化了分账规则的获取和校验逻辑
- 重构了分账计算逻辑,支持按不同手续费承担方式进行分账
- 新增了分账结果异步回调通知地址配置
2025-09-02 16:27:18 +08:00
huk
dd588457e0 feat(payment): 更新易支付回调URL地址为远程服务器地址 2025-09-02 14:31:40 +08:00
huk
ee1e05a5d0 build: 修改local和dev环境日志级别为 debug 2025-09-02 12:28:40 +08:00
wangqx
0a011ecf6c [fix]去掉.run目录的git 2025-09-02 10:44:46 +08:00
wangqx
8fd4393ec1 [fix]修改list路径为page 2025-09-02 10:43:22 +08:00
huk
0a954f060d Merge remote-tracking branch 'origin/wzj-main' into wzj-main 2025-09-01 10:53:56 +08:00
huk
4ded3b177b feat(transaction): 实现易生支付实时退款功能并优化微信支付流程
- 新增易生支付实时退款功能,实现订单退款操作- 优化微信支付流程,使用微信登录授权码替代原有的openid- 调整订单标题和描述的处理逻辑,提高支付请求的灵活性
- 移除不必要的接口,简化系统架构
2025-09-01 10:53:40 +08:00
wangqx
b5cffc9370 [fix]app不进行权限校验 2025-09-01 10:52:07 +08:00
wangqx
4e543a22d2 [fix]修改创建用户时自动创建member 2025-09-01 09:15:27 +08:00
huk
81b8b959aa refactor(order): 重构订单模块
- 新增 SaveOrderBO 和 SaveOrderSkuItemBO 类用于生成订单
- 修改订单接口和实现类,支持新的订单生成逻辑
- 优化订单详情和订单项的数据结构
- 更新相关包名和类名以适应新的模块结构
2025-08-30 18:10:08 +08:00
haolj
b9b7d66549 Merge remote-tracking branch 'origin/wzj-main' into wzj-main 2025-08-30 16:36:25 +08:00
haolj
dd8796ba79 [feat]搜索功用修改 2025-08-30 16:35:13 +08:00
wangqx
76f1afc0fe [fix]修改评论列表的路径 2025-08-30 10:23:53 +08:00
haolj
4d02d61b64 [feat]搜索功用修改 2025-08-30 10:06:57 +08:00
haolj
be04c3785c [feat]解决合并冲突问题 2025-08-29 20:15:10 +08:00
haolj
72febf46dd [feat]解决合并冲突问题 2025-08-29 19:48:50 +08:00
haolj
1aebe07488 Merge remote-tracking branch 'origin/wzj-main' into wzj-main
# Conflicts:
#	ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/VlogService.java
#	ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/VlogServiceImpl.java
#	ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/IMemberService.java
2025-08-29 19:38:49 +08:00
haolj
214d1cf82e [feat]增加首页视频、商品和用户搜索接口v1.0 2025-08-29 19:28:36 +08:00
haolj
f27e96ffed [feat]增加首页视频、商品和用户搜索接口v1.0 2025-08-29 19:27:44 +08:00
huk
b82f640919 refactor(yml): 调整 EasyPay 配置格式- 将 easypay 配置项从多行缩进格式改为单行格式
- 保留了原有的配置内容,仅调整了配置项的格式
2025-08-29 18:12:33 +08:00
a543a8805f Merge remote-tracking branch 'origin/wzj-main' into wzj-main 2025-08-29 12:10:39 +08:00
510cf76e4a feat(transaction): 集成易生支付功能
- 新增易生支付相关配置和常量- 实现易生支付回调处理和测试支付接口
- 添加易生支付请求和响应对象
2025-08-29 12:10:31 +08:00
wangqx
5586e8cee3 [fix]修改vlog不登陆获取热点数据 2025-08-29 11:08:45 +08:00
wangqx
832689d040 [fix]修改点赞与取消点赞接口字段 2025-08-29 10:19:31 +08:00
wangqx
e48622f44d [fix]修改点赞与取消点赞接口字段 2025-08-29 10:00:36 +08:00
wangqx
f26a2a46b0 [fix]修改点赞与取消点赞接口字段 2025-08-29 09:59:36 +08:00
wangqx
50c6f60b25 [fix]修改视频推送逻辑 2025-08-28 17:29:26 +08:00
wangqx
6c4ffb26e9 [fix]修改视频推送逻辑 2025-08-28 15:44:43 +08:00
wangqx
53c12bcf1b [fix]修改视频推送逻辑 2025-08-28 15:43:31 +08:00
wangqx
e7c0d39162 [fix]修改feedback对象字段 2025-08-28 15:43:31 +08:00
haolj
a47bc23853 [fix]修改bug:举报投诉接口保存失败 2025-08-27 18:05:43 +08:00
haolj
e23afb299b [fix]修改App中根据字典类型查询字典数据列表(只包含默认租户的数据) 2025-08-27 17:10:17 +08:00
wangqx
03a9967da4 [fix]修改消息的逻辑,将消息通过mq放出来,然后再由消费者发送给腾讯 2025-08-27 10:49:09 +08:00
8859977761 [fix]:
- 移除了提交签约、审核提交的签约和确认审核通过的签约接口中的 @SaCheckRole 注解
- 修复了审核未通过时未填写失败原因的逻辑判断
- 在提交签约时清空失败原因字段
2025-08-26 13:44:52 +08:00
wangqx
7bb559d294 [fix]修改mq为rockectmq 2025-08-26 09:08:01 +08:00
329d25d4da feat(system): 添加租户签约功能
- 新增租户签约状态枚举
- 在租户服务接口中添加提交签约、审核提交和确认签约的方法
2025-08-25 17:39:57 +08:00
wangqx
1869dbb3a4 [fix]修改mq为rockectmq 2025-08-25 17:02:31 +08:00
wangqx
983375f2c7 [fix]修改bug 2025-08-25 14:36:05 +08:00
wangqx
c21d61f4f0 [fix]修改bug 2025-08-25 14:35:44 +08:00
wangqx
b450526775 [fix]修改视频相关 2025-08-21 17:12:02 +08:00
wangqx
b8702f827c [fix]修改视频相关 2025-08-21 15:47:28 +08:00
曹佳豪
99b07e32fb 测试 2025-08-20 10:16:38 +08:00
曹佳豪
93e7bd66d9 修改bug 2025-08-20 10:10:50 +08:00
曹佳豪
c6fb827116 修改bug 2025-08-20 10:04:15 +08:00
曹佳豪
621ec391ed 修改bug 2025-08-18 15:12:44 +08:00
曹佳豪
5957a113c4 修改bug 2025-08-18 15:06:33 +08:00
曹佳豪
106d64be05 Merge remote-tracking branch 'origin/wzj-main' into wzj-main 2025-08-18 14:20:08 +08:00
曹佳豪
ea92f61773 修改bug 2025-08-18 14:19:45 +08:00
wangqx
fd06e105bb [fix]使用本地的redis 2025-08-16 15:29:22 +08:00
曹佳豪
311727a874 Merge remote-tracking branch 'origin/wzj-main' into wzj-main 2025-08-16 11:29:23 +08:00
曹佳豪
44e84bce11 修改bug 2025-08-16 11:28:51 +08:00
wangqx
65da753e66 [fix]删除member参数,改为从token中获取 2025-08-16 11:17:18 +08:00
曹佳豪
adb23bb268 修改bug 2025-08-16 11:15:40 +08:00
wangqx
90be00a277 [fix]删除member参数,改为从token中获取 2025-08-16 10:05:59 +08:00
fxh
ccadf33e19 修改商品列表 2025-08-15 19:47:41 +08:00
曹佳豪
e0f6ccace8 Merge remote-tracking branch 'origin/wzj-main' into wzj-main 2025-08-15 19:06:17 +08:00
曹佳豪
af2e269e71 修改bug 2025-08-15 19:05:25 +08:00
wangqx
593fac4044 [fix]删除多余的代码 2025-08-15 17:47:45 +08:00
fxh
1369cf324b 修改红包记录 2025-08-15 17:36:56 +08:00
wangqx
e2ce1e1211 [feat]增加app轮播接口,增加app会员接口 2025-08-15 17:05:59 +08:00
fxh
2c4ea0c22c Merge remote-tracking branch 'origin/wzj-main' into wzj-main 2025-08-15 16:55:32 +08:00
fxh
f6357bb922 app接口 2025-08-15 16:54:59 +08:00
曹佳豪
b6c6855842 修改bug+迁移app接口 2025-08-15 16:51:03 +08:00
wangqx
580739f2f7 [feat]增加app轮播接口,增加app会员接口 2025-08-15 14:36:39 +08:00
wangqx
777992a096 [feat]修改文章列表。增加app接口 2025-08-15 14:23:34 +08:00
wangqx
584958eb9c [feat]开发文章分类和文章 2025-08-15 10:13:18 +08:00
wangqx
f2dfb8412a [feat]开发文章分类和文章 2025-08-14 17:06:45 +08:00
wangqx
7429692522 [feat]开发文章分类和文章 2025-08-14 15:54:49 +08:00
曹佳豪
cc68b15b40 Merge remote-tracking branch 'origin/wzj-main' into wzj-main
# Conflicts:
#	ruoyi-admin/src/main/resources/application.yml
2025-08-14 15:48:51 +08:00
曹佳豪
9d5b1e109d 修改bug 2025-08-14 15:47:09 +08:00
fxh
9d4e42de60 修改bug 2025-08-14 14:52:55 +08:00
fxh
02eb7ceeeb Merge remote-tracking branch 'origin/wzj-main' into wzj-main 2025-08-13 17:36:27 +08:00
fxh
d71994cdaa 修改bug 2025-08-13 17:35:50 +08:00
曹佳豪
3fb0972dd0 Merge remote-tracking branch 'origin/wzj-main' into wzj-main 2025-08-13 17:29:53 +08:00
曹佳豪
7d9505bf21 修改视频 2025-08-13 17:29:13 +08:00
wangqx
48f9d66f1d [fix]修改用户接口 2025-08-12 15:47:42 +08:00
曹佳豪
2b0acc4d01 Merge remote-tracking branch 'origin/wzj-main' into wzj-main 2025-08-12 15:46:14 +08:00
曹佳豪
68dd5db747 账户明细 2025-08-12 15:44:46 +08:00
fxh
a3e8881ba5 修改bug 2025-08-12 15:40:38 +08:00
fxh
ad580e3f99 Merge remote-tracking branch 'origin/main' into wzj-main
# Conflicts:
#	ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantAccountBo.java
#	ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantAccountVo.java
2025-08-12 14:57:38 +08:00
曹佳豪
f727f28b46 修改视频bug 2025-08-12 14:52:47 +08:00
fxh
4c0efb69bf 修改bug 2025-08-12 09:03:37 +08:00
曹佳豪
675272f04c 修改视频bug 2025-08-12 09:03:26 +08:00
曹佳豪
32229ab3ef 修改视频bug 2025-08-12 09:02:46 +08:00
fxh
f640fed356 红包功能 2025-08-06 10:04:41 +08:00
曹佳豪
f76af44a0a 租户账户修改 2025-08-06 09:55:15 +08:00
曹佳豪
668787f053 添加视频缓存和商品缓存和获取 2025-08-04 14:42:21 +08:00
曹佳豪
fccce9f4c2 Merge remote-tracking branch 'origin/wzj-main' into wzj-main 2025-08-01 16:19:25 +08:00
曹佳豪
701efaadea 添加视频缓存和商品缓存和获取 2025-08-01 16:18:50 +08:00
wangqx
28977e5313 [fix]给app提供商品接口 2025-07-28 15:58:14 +08:00
fxh
71139a21c3 改造租户 2025-07-24 15:51:30 +08:00
fxh
dfbd80dad7 改造租户 2025-07-24 10:25:01 +08:00
fxh
824c68e08b 改造租户 2025-07-24 10:22:15 +08:00
fxh
65198b9cbb 修改启动问题 2025-07-23 18:30:15 +08:00
wangqx
5c603c6151 [fix]登录用户返回userSig 2025-07-23 16:25:33 +08:00
fxh
f058de3736 改造租户 2025-07-23 16:21:10 +08:00
fxh
79cb33cf13 改造租户 2025-07-23 16:07:25 +08:00
fxh
525ad3d6db 改造租户 2025-07-23 15:48:41 +08:00
曹佳豪
9d0e0eb33e 修改回调整合分发模式 2025-07-23 15:45:42 +08:00
曹佳豪
83ed8e4150 修改回调整合分发模式 2025-07-17 14:30:20 +08:00
曹佳豪
5e239c99a4 修改首页列表 2025-07-15 15:39:59 +08:00
wangqx
2e4047005f [fix]登录用户返回userSig 2025-07-15 15:23:29 +08:00
wangqx
dd68c8fe29 [fix]优化分账逻辑 2025-07-14 18:22:08 +08:00
曹佳豪
bb812c2bbe 修改回调代码 2025-07-10 09:27:53 +08:00
wangqx
b09b6f7ece [fix]优化pom和登录 2025-07-07 10:46:35 +08:00
fxh
19581d153a 版本管理、优化订单模块 2025-07-04 14:53:25 +08:00
wangqx
96b611f014 [fix]优化pom和登录 2025-07-04 11:12:33 +08:00
曹佳豪
5eec4e9255 发送消息迁移到im 2025-07-03 15:01:48 +08:00
wangqx
d2d8c6ee40 [fix]优化分账逻辑 2025-07-01 16:52:37 +08:00
wangqx
9b33dbde98 [fix]开发分账接口 2025-06-30 15:59:26 +08:00
曹佳豪
7e027b493d 消息推送加自动触发 2025-06-30 11:11:53 +08:00
fxh
029c4c1f2a 修改首页、商品 2025-06-30 10:12:40 +08:00
fxh
0c53738935 Merge remote-tracking branch 'origin/wzj-main' into wzj-main
# Conflicts:
#	ruoyi-admin/src/main/java/org/dromara/web/service/impl/IndexServiceImpl.java
2025-06-30 10:11:30 +08:00
fxh
74bdae2928 修改首页、商品 2025-06-30 10:10:18 +08:00
wangqx
06e1f6d7ed [fix]修改合并后冲突 2025-06-30 10:05:13 +08:00
wangqx
9a39b48734 Merge branch 'wzj-wqx' into wzj-main 2025-06-30 10:02:26 +08:00
wangqx
b14a8ecfae Merge remote-tracking branch 'origin/wzj-main' into wzj-main
# Conflicts:
#	ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/OrderServiceImpl.java
2025-06-30 10:02:07 +08:00
wangqx
a46369f8c8 [fix]修改分账,增加主子表查询与保存 2025-06-30 10:00:31 +08:00
wangqx
8f1ccba127 [fix]修改分账,增加主子表查询与保存 2025-06-27 15:44:27 +08:00
wangqx
1d578cbf8e [fix]修改分账,增加主子表查询与保存 2025-06-27 15:43:48 +08:00
0210b25c70 修改bo对象 2025-06-27 14:17:58 +08:00
05fa2956e5 首页、商品修改 2025-06-26 17:48:00 +08:00
wangqx
ee14312dcd [fix]分账规则与分账明细 2025-06-26 17:09:01 +08:00
wangqx
5c14799691 [fix]分账规则与分账明细 2025-06-26 17:06:06 +08:00
53fcafde65 修改商品 2025-06-26 10:28:35 +08:00
曹佳豪
9e2fa2ed16 Merge remote-tracking branch 'origin/wzj-main' into wzj-main 2025-06-24 16:29:33 +08:00
曹佳豪
297b0332da 修改消息通过腾讯im发送bug加模糊查询 2025-06-24 16:28:56 +08:00
e01d3c4f74 修改核销、订单售后 2025-06-24 09:52:05 +08:00
09e66734ce Merge remote-tracking branch 'origin/wzj-main' into wzj-main
# Conflicts:
#	ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/po/Withdraw.java
#	ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/mapper/WithdrawMapper.java
#	ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/IWithdrawService.java
#	ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/WithdrawServiceImpl.java
#	ruoyi-modules/ruoyi-system/pom.xml
#	ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysTenantMapper.java
2025-06-24 09:41:52 +08:00
93c6b3567b 修改核销、订单售后 2025-06-24 09:41:03 +08:00
曹佳豪
3a66394bbe 修改消息通过腾讯im发送 2025-06-23 15:12:35 +08:00
e2ef255d8f [fix]充值与提现 2025-06-23 10:42:02 +08:00
ca99f31ebd [fix]充值与提现 2025-06-21 15:01:11 +08:00
5d5702e202 [fix]充值与提现 2025-06-21 14:40:48 +08:00
曹佳豪
24544a18a8 修改消息通过WebSocket发送 2025-06-20 20:13:57 +08:00
曹佳豪
52b3be7310 Merge remote-tracking branch 'origin/wzj-main' into wzj-main 2025-06-20 20:13:34 +08:00
曹佳豪
bcc01a2522 修改消息通过WebSocket发送 2025-06-20 20:13:15 +08:00
ce4bd54049 [fix]去掉租户检查 2025-06-20 15:41:30 +08:00
f7a7610a7c [fix]增加店铺封禁、会员封禁、会员银行卡 2025-06-20 15:05:24 +08:00
e3ae60b5f8 Merge remote-tracking branch 'origin/wzj-main' into wzj-main 2025-06-20 10:14:53 +08:00
04b5460cb4 修改订单、商品模块 2025-06-20 10:14:30 +08:00
曹佳豪
c014f65f13 修改消息bug 2025-06-20 09:31:12 +08:00
360caa64f6 [fix]修改购物车和会员状态调整 2025-06-19 16:58:48 +08:00
d8d68c59dd [fix]增加会员收获地址的接口 2025-06-19 16:20:13 +08:00
bfcb239df2 [fix]增加会员填充切面,自动根据member对象填充用户数据 2025-06-19 15:37:02 +08:00
曹佳豪
409a8446c0 消息接口 2025-06-19 09:32:10 +08:00
曹佳豪
be202b164b Merge remote-tracking branch 'origin/wzj-main' into wzj-main 2025-06-19 09:30:54 +08:00
曹佳豪
e815bc6e05 消息接口 2025-06-19 09:30:09 +08:00
049e4874a6 [fix]粉丝与关注等使用不同的接口 2025-06-17 11:02:20 +08:00
9683642563 修改订单、商品模块 2025-06-17 09:27:04 +08:00
12e888152d [fix]修改粉丝与关注 2025-06-16 17:36:53 +08:00
3757b5562a [fix]修改粉丝与关注 2025-06-16 17:05:24 +08:00
64cabd4de5 修改商品字段备注 2025-06-16 10:06:47 +08:00
00052cc93e Merge remote-tracking branch 'origin/wzj-main' into wzj-main 2025-06-16 10:06:24 +08:00
2f54aee220 修改订单字段备注 2025-06-16 10:00:17 +08:00
曹佳豪
3b9712b361 Merge remote-tracking branch 'origin/wzj-main' into wzj-main 2025-06-16 09:44:24 +08:00
曹佳豪
f9d822bb11 修改删除状态 2025-06-16 09:44:09 +08:00
f5fd633f8b [fix]修改会员的controller 2025-06-16 09:43:50 +08:00
c0484c2c71 修改订单字段备注 2025-06-14 17:21:20 +08:00
05d3c17acd 修改订单和商品 2025-06-14 16:58:01 +08:00
曹佳豪
eacad6e370 修改启动报错 2025-06-14 15:01:14 +08:00
曹佳豪
e78c6d2b0d Merge remote-tracking branch 'origin/wzj-main' into wzj-main
# Conflicts:
#	ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/controller/admin/VlogUploadController.java
#	ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/IFansService.java
#	ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/FansServiceImpl.java
2025-06-14 14:19:37 +08:00
曹佳豪
3c3f3d03ea 视频评论 2025-06-14 14:17:34 +08:00
b075011ce8 [fix]修改粉丝和关注 2025-06-14 11:44:05 +08:00
7212f67023 [fix]修改登录日志和账户 2025-06-14 10:04:41 +08:00
曹佳豪
983617947a 评论功能 2025-06-13 10:59:37 +08:00
曹佳豪
ff26d17d11 评论功能 2025-06-13 10:57:07 +08:00
3ec075544d [fix]增加swaggerui,用于展示接口 2025-06-12 15:24:57 +08:00
曹佳豪
847f8b0372 视频列表 2025-06-11 10:21:42 +08:00
12de7c2abf [fix]修改content的pom依赖 2025-06-10 16:03:12 +08:00
fxh
8a5397e5f6 Merge remote-tracking branch 'origin/wzj-main' into wzj-main 2025-06-10 15:40:06 +08:00
fxh
86750e61ea 修改order代码 2025-06-10 15:35:14 +08:00
8a9dfeb883 [fix]修改内容模块 2025-06-09 17:58:43 +08:00
729ac67fea [fix]测试会员接口 2025-06-09 11:47:44 +08:00
fxh
dfb6459df0 Merge remote-tracking branch 'origin/wzj-main' into wzj-main 2025-06-09 11:42:49 +08:00
fxh
bc3b62dd96 修改goods和order模块 2025-06-09 11:41:28 +08:00
曹佳豪
95d5aa165e 视频 2025-06-09 11:40:59 +08:00
cjh
114840f26d Merge remote-tracking branch 'origin/wzj-main' into wzj-main 2025-06-07 09:22:45 +08:00
cjh
d8c32b0d55 修改vlog视频的点赞评论和粉丝后台管理 2025-06-07 09:22:31 +08:00
f98db5fe4b [fix]测试会员的接口并优化登录 2025-06-06 16:56:46 +08:00
cjh
4d0b6cb113 修改vlog视频后台管理 2025-06-06 09:35:15 +08:00
cjh
f7a100b025 修改vlog视频后台管理 2025-06-05 09:57:45 +08:00
cjh
62ce570195 修改vlog视频后台管理 2025-06-05 09:57:19 +08:00
2d0e662109 [fix]修改各个用户登录 2025-06-04 16:26:20 +08:00
fxh
061081fc46 修改goods模块 2025-06-03 21:21:37 +08:00
13453dfd3b [fix]修改各个模块的结构,启动项目 2025-06-03 18:38:14 +08:00
fe3e8cbb9f [fix]修改各个模块的结构,启动项目 2025-06-03 17:11:55 +08:00
fxh
2676081cd3 去掉front端 2025-06-03 16:40:30 +08:00
672856ddfc [fix]增加测试环境的配置 2025-06-03 10:37:11 +08:00
fxh
581aaaf32b 去掉front端 2025-06-03 10:16:21 +08:00
c4ceacb53b [fix]修改member的报错 2025-06-03 10:13:08 +08:00
d54c855e8a [fix]去掉front端,先放到自己的modules里 2025-06-03 10:09:46 +08:00
b50544ac90 [fix]去掉front端,先放到自己的modules里 2025-06-03 10:09:44 +08:00
fxh
62971bb035 修改商城内容 2025-06-03 09:12:37 +08:00
6aaa98f243 [fix]调试启动不成功的问题 2025-06-02 16:13:38 +08:00
169ab1ca0f [fix]调试启动不成功的问题 2025-06-02 16:07:04 +08:00
fxh
57f2ec0a0f 修改商城内容 2025-05-30 16:02:48 +08:00
0e4d4a31c6 [fix]修改整体框架 2025-05-30 15:38:20 +08:00
cjh
378aa9df54 修改vlog 2025-05-30 15:25:48 +08:00
00104f0580 [fix]修改整体框架 2025-05-30 15:08:32 +08:00
cjh
daf3886672 修改vlog 2025-05-30 15:06:29 +08:00
cjh
3bc7d53106 修改vlog 2025-05-30 10:53:21 +08:00
fxh
81e5b80f64 修改商城内容 2025-05-30 09:48:35 +08:00
cc03351620 [fix]修改会员 2025-05-28 16:34:58 +08:00
ae61377c73 [fix]修改vlog内容 2025-05-28 15:21:38 +08:00
4957cd8023 [feat]合并商城、管理和vlog 2025-05-28 11:07:39 +08:00
90b3286aeb [feat]系统初始化 2025-05-23 10:51:33 +08:00
1140 changed files with 135447 additions and 916 deletions

2
.feisuan/.ymlignore Normal file
View File

@ -0,0 +1,2 @@
spring.datasource.username
spring.datasource.password

1
.gitignore vendored
View File

@ -46,3 +46,4 @@ nbdist/
!*/build/*.xml !*/build/*.xml
.flattened-pom.xml .flattened-pom.xml
/.run/

View File

@ -3,7 +3,7 @@
<deployment type="dockerfile"> <deployment type="dockerfile">
<settings> <settings>
<option name="imageTag" value="ruoyi/ruoyi-server:5.3.1" /> <option name="imageTag" value="ruoyi/ruoyi-server:5.3.1" />
<option name="buildOnly" value="true" /> <option name="containerName" value="" />
<option name="sourceFilePath" value="ruoyi-admin/Dockerfile" /> <option name="sourceFilePath" value="ruoyi-admin/Dockerfile" />
</settings> </settings>
</deployment> </deployment>

View File

@ -3,7 +3,15 @@
<deployment type="dockerfile"> <deployment type="dockerfile">
<settings> <settings>
<option name="imageTag" value="ruoyi/ruoyi-snailjob-server:5.3.1" /> <option name="imageTag" value="ruoyi/ruoyi-snailjob-server:5.3.1" />
<option name="buildOnly" value="true" /> <option name="containerName" value="snail-job" />
<option name="portBindings">
<list>
<DockerPortBindingImpl>
<option name="containerPort" value="8800" />
<option name="hostPort" value="8800" />
</DockerPortBindingImpl>
</list>
</option>
<option name="sourceFilePath" value="ruoyi-extend/ruoyi-snailjob-server/Dockerfile" /> <option name="sourceFilePath" value="ruoyi-extend/ruoyi-snailjob-server/Dockerfile" />
</settings> </settings>
</deployment> </deployment>

145
pom.xml
View File

@ -19,7 +19,6 @@
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>17</java.version> <java.version>17</java.version>
<mybatis.version>3.5.16</mybatis.version> <mybatis.version>3.5.16</mybatis.version>
<springdoc.version>2.8.5</springdoc.version>
<therapi-javadoc.version>0.15.0</therapi-javadoc.version> <therapi-javadoc.version>0.15.0</therapi-javadoc.version>
<easyexcel.version>4.0.3</easyexcel.version> <easyexcel.version>4.0.3</easyexcel.version>
<velocity.version>2.3</velocity.version> <velocity.version>2.3</velocity.version>
@ -31,7 +30,7 @@
<redisson.version>3.45.1</redisson.version> <redisson.version>3.45.1</redisson.version>
<lock4j.version>2.2.7</lock4j.version> <lock4j.version>2.2.7</lock4j.version>
<dynamic-ds.version>4.3.1</dynamic-ds.version> <dynamic-ds.version>4.3.1</dynamic-ds.version>
<snailjob.version>1.4.0</snailjob.version> <snailjob.version>1.5.0</snailjob.version>
<mapstruct-plus.version>1.4.6</mapstruct-plus.version> <mapstruct-plus.version>1.4.6</mapstruct-plus.version>
<mapstruct-plus.lombok.version>0.2.0</mapstruct-plus.lombok.version> <mapstruct-plus.lombok.version>0.2.0</mapstruct-plus.lombok.version>
<lombok.version>1.18.36</lombok.version> <lombok.version>1.18.36</lombok.version>
@ -59,15 +58,17 @@
<flatten-maven-plugin.version>1.3.0</flatten-maven-plugin.version> <flatten-maven-plugin.version>1.3.0</flatten-maven-plugin.version>
<!-- 打包默认跳过测试 --> <!-- 打包默认跳过测试 -->
<skipTests>true</skipTests> <skipTests>true</skipTests>
<knife4j-plus.version>4.6.0</knife4j-plus.version>
<okhttp.version>4.12.0</okhttp.version>
</properties> </properties>
<profiles> <profiles>
<profile> <profile>
<id>local</id> <id>test</id>
<properties> <properties>
<!-- 环境标识,需要与配置文件的名称相对应 --> <!-- 环境标识,需要与配置文件的名称相对应 -->
<profiles.active>local</profiles.active> <profiles.active>test</profiles.active>
<logging.level>info</logging.level> <logging.level>debug</logging.level>
<monitor.username>ruoyi</monitor.username> <monitor.username>ruoyi</monitor.username>
<monitor.password>123456</monitor.password> <monitor.password>123456</monitor.password>
</properties> </properties>
@ -77,7 +78,7 @@
<properties> <properties>
<!-- 环境标识,需要与配置文件的名称相对应 --> <!-- 环境标识,需要与配置文件的名称相对应 -->
<profiles.active>dev</profiles.active> <profiles.active>dev</profiles.active>
<logging.level>info</logging.level> <logging.level>debug</logging.level>
<monitor.username>ruoyi</monitor.username> <monitor.username>ruoyi</monitor.username>
<monitor.password>123456</monitor.password> <monitor.password>123456</monitor.password>
</properties> </properties>
@ -95,12 +96,27 @@
<monitor.password>123456</monitor.password> <monitor.password>123456</monitor.password>
</properties> </properties>
</profile> </profile>
<profile>
<id>local</id>
<properties>
<profiles.active>local</profiles.active>
<logging.level>debug</logging.level>
<monitor.username>ruoyi</monitor.username>
<monitor.password>123456</monitor.password>
</properties>
</profile>
</profiles> </profiles>
<!-- 依赖声明 --> <!-- 依赖声明 -->
<dependencyManagement> <dependencyManagement>
<dependencies> <dependencies>
<dependency>
<groupId>com.github.xingfudeshi</groupId>
<artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
<version>${knife4j-plus.version}</version>
</dependency>
<!-- SpringBoot的依赖配置--> <!-- SpringBoot的依赖配置-->
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
@ -147,12 +163,6 @@
<scope>import</scope> <scope>import</scope>
</dependency> </dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-api</artifactId>
<version>${springdoc.version}</version>
</dependency>
<dependency> <dependency>
<groupId>com.github.therapi</groupId> <groupId>com.github.therapi</groupId>
<artifactId>therapi-runtime-javadoc</artifactId> <artifactId>therapi-runtime-javadoc</artifactId>
@ -293,12 +303,12 @@
<dependency> <dependency>
<groupId>com.aizuda</groupId> <groupId>com.aizuda</groupId>
<artifactId>snail-job-client-starter</artifactId> <artifactId>snail-job-client-starter</artifactId>
<version>${snailjob.version}</version> <version>1.5.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.aizuda</groupId> <groupId>com.aizuda</groupId>
<artifactId>snail-job-client-job-core</artifactId> <artifactId>snail-job-client-job-core</artifactId>
<version>${snailjob.version}</version> <version>1.5.0</version>
</dependency> </dependency>
<!-- 加密包引入 --> <!-- 加密包引入 -->
@ -357,12 +367,67 @@
<version>${revision}</version> <version>${revision}</version>
</dependency> </dependency>
<!-- 交易模块 -->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-transaction</artifactId>
<version>${revision}</version>
</dependency>
<!-- 工作流模块 --> <!-- 工作流模块 -->
<dependency> <dependency>
<groupId>org.dromara</groupId> <groupId>org.dromara</groupId>
<artifactId>ruoyi-workflow</artifactId> <artifactId>ruoyi-workflow</artifactId>
<version>${revision}</version> <version>${revision}</version>
</dependency> </dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-content</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-order</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-member</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-im</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-goods</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-mq</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-auth</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>${okhttp.version}</version>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-mongo</artifactId>
<version>${revision}</version>
</dependency>
</dependencies> </dependencies>
</dependencyManagement> </dependencyManagement>
@ -377,6 +442,56 @@
<build> <build>
<plugins> <plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>3.1.0</version>
<!-- 依赖 JSch 库(用于 SSH/SCP 操作) -->
<dependencies>
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.55</version> <!-- 最新版本可更新 -->
</dependency>
</dependencies>
<executions>
<execution>
<!-- 绑定到 package 阶段之后执行 -->
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<!-- <target>-->
<!-- &lt;!&ndash; 1. 配置 SSH 连接信息 &ndash;&gt;-->
<!-- <property name="ssh.host" value="192.168.1.65" /> &lt;!&ndash; 例如192.168.1.100 &ndash;&gt;-->
<!-- <property name="ssh.port" value="22" /> &lt;!&ndash; SSH 默认端口 &ndash;&gt;-->
<!-- <property name="ssh.username" value="wzj" /> &lt;!&ndash; 例如root &ndash;&gt;-->
<!-- <property name="ssh.password" value="123456" /> &lt;!&ndash; 或使用密钥认证 &ndash;&gt;-->
<!-- <property name="local.jar.path" value="${project.build.directory}/${project.build.finalName}.jar" /> &lt;!&ndash; 本地 JAR 路径 &ndash;&gt;-->
<!-- <property name="remote.jar.path" value="/var/local/docker/java/data" /> &lt;!&ndash; 服务器存放 JAR 的目录,例如:/opt/app/ &ndash;&gt;-->
<!-- &lt;!&ndash; 2. 通过 SCP 上传 JAR 包到目标服务器 &ndash;&gt;-->
<!-- <scp-->
<!-- file="${local.jar.path}"-->
<!-- todir="${ssh.username}:${ssh.password}@${ssh.host}:${remote.jar.path}"-->
<!-- port="${ssh.port}"-->
<!-- trust="true" /> &lt;!&ndash; 信任未知主机密钥 &ndash;&gt;-->
<!-- &lt;!&ndash; 3. 通过 SSH 执行远程命令:重启 docker java 容器 &ndash;&gt;-->
<!-- <sshexec-->
<!-- host="${ssh.host}"-->
<!-- port="${ssh.port}"-->
<!-- username="${ssh.username}"-->
<!-- password="${ssh.password}"-->
<!-- command="docker restart java"-->
<!-- trust="true"-->
<!-- failonerror="true" /> &lt;!&ndash; 命令执行失败时Maven 构建终止 &ndash;&gt;-->
<!-- </target>-->
</configuration>
</execution>
</executions>
</plugin>
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId> <artifactId>maven-compiler-plugin</artifactId>
@ -425,7 +540,7 @@
<configuration> <configuration>
<argLine>-Dfile.encoding=UTF-8</argLine> <argLine>-Dfile.encoding=UTF-8</argLine>
<!-- 根据打包环境执行对应的@Tag测试方法 --> <!-- 根据打包环境执行对应的@Tag测试方法 -->
<groups>${profiles.active}</groups> <groups>dev</groups>
<!-- 排除标签 --> <!-- 排除标签 -->
<excludedGroups>exclude</excludedGroups> <excludedGroups>exclude</excludedGroups>
</configuration> </configuration>

View File

@ -22,28 +22,21 @@
<groupId>com.mysql</groupId> <groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId> <artifactId>mysql-connector-j</artifactId>
</dependency> </dependency>
<!-- Oracle -->
<!-- &lt;!&ndash; mp支持的数据库均支持 只需要增加对应的jdbc依赖即可 &ndash;&gt;--> <dependency>
<!-- &lt;!&ndash; Oracle &ndash;&gt;--> <groupId>com.oracle.database.jdbc</groupId>
<!-- <dependency>--> <artifactId>ojdbc8</artifactId>
<!-- <groupId>com.oracle.database.jdbc</groupId>--> </dependency>
<!-- <artifactId>ojdbc8</artifactId>--> <!-- PostgreSql -->
<!-- </dependency>--> <dependency>
<!-- &lt;!&ndash; 兼容oracle低版本 &ndash;&gt;--> <groupId>org.postgresql</groupId>
<!-- <dependency>--> <artifactId>postgresql</artifactId>
<!-- <groupId>com.oracle.database.nls</groupId>--> </dependency>
<!-- <artifactId>orai18n</artifactId>--> <!-- SqlServer -->
<!-- </dependency>--> <dependency>
<!-- &lt;!&ndash; PostgreSql &ndash;&gt;--> <groupId>com.microsoft.sqlserver</groupId>
<!-- <dependency>--> <artifactId>mssql-jdbc</artifactId>
<!-- <groupId>org.postgresql</groupId>--> </dependency>
<!-- <artifactId>postgresql</artifactId>-->
<!-- </dependency>-->
<!-- &lt;!&ndash; SqlServer &ndash;&gt;-->
<!-- <dependency>-->
<!-- <groupId>com.microsoft.sqlserver</groupId>-->
<!-- <artifactId>mssql-jdbc</artifactId>-->
<!-- </dependency>-->
<dependency> <dependency>
<groupId>org.dromara</groupId> <groupId>org.dromara</groupId>
@ -70,6 +63,27 @@
<artifactId>ruoyi-system</artifactId> <artifactId>ruoyi-system</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-im</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-goods</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-content</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-member</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-order</artifactId>
</dependency>
<dependency> <dependency>
<groupId>org.dromara</groupId> <groupId>org.dromara</groupId>
<artifactId>ruoyi-job</artifactId> <artifactId>ruoyi-job</artifactId>
@ -93,6 +107,13 @@
<artifactId>ruoyi-workflow</artifactId> <artifactId>ruoyi-workflow</artifactId>
</dependency> </dependency>
<!-- 交易模块 -->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-transaction</artifactId>
</dependency>
<dependency> <dependency>
<groupId>de.codecentric</groupId> <groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId> <artifactId>spring-boot-admin-starter-client</artifactId>
@ -105,16 +126,16 @@
</dependency> </dependency>
<!-- skywalking 整合 logback --> <!-- skywalking 整合 logback -->
<!-- <dependency>--> <!-- <dependency>-->
<!-- <groupId>org.apache.skywalking</groupId>--> <!-- <groupId>org.apache.skywalking</groupId>-->
<!-- <artifactId>apm-toolkit-logback-1.x</artifactId>--> <!-- <artifactId>apm-toolkit-logback-1.x</artifactId>-->
<!-- <version>${与你的agent探针版本保持一致}</version>--> <!-- <version>${与你的agent探针版本保持一致}</version>-->
<!-- </dependency>--> <!-- </dependency>-->
<!-- <dependency>--> <!-- <dependency>-->
<!-- <groupId>org.apache.skywalking</groupId>--> <!-- <groupId>org.apache.skywalking</groupId>-->
<!-- <artifactId>apm-toolkit-trace</artifactId>--> <!-- <artifactId>apm-toolkit-trace</artifactId>-->
<!-- <version>${与你的agent探针版本保持一致}</version>--> <!-- <version>${与你的agent探针版本保持一致}</version>-->
<!-- </dependency>--> <!-- </dependency>-->
</dependencies> </dependencies>

View File

@ -3,6 +3,8 @@ package org.dromara;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup; import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.scheduling.annotation.EnableScheduling;
/** /**
* 启动程序 * 启动程序
@ -11,6 +13,8 @@ import org.springframework.boot.context.metrics.buffering.BufferingApplicationSt
*/ */
@SpringBootApplication @SpringBootApplication
@EnableScheduling
@ComponentScan(basePackages = {"org.dromara", "com.wzj.soopin"})
public class DromaraApplication { public class DromaraApplication {
public static void main(String[] args) { public static void main(String[] args) {

View File

@ -0,0 +1,32 @@
package org.dromara.app;
import com.wzj.soopin.content.domain.bo.ArticleBO;
import com.wzj.soopin.content.domain.vo.ArticleVO;
import com.wzj.soopin.content.service.IArticleService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/app/article")
@Tag(name = "内容管理")
@RequiredArgsConstructor
public class AppArticleController {
private final IArticleService service;
@Operation(summary = "轮播列表")
@PostMapping("/carousel")
public R<List<ArticleVO>> carousel(@RequestBody ArticleBO bo) {
bo.setType(1);//轮播图
bo.setCategoryId(1l);
List<ArticleVO> articleList = service.selectVoList( bo.toWrapper());
return R.ok(articleList);
}
}

View File

@ -0,0 +1,88 @@
package org.dromara.app;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wzj.soopin.content.domain.bo.CommentBO;
import com.wzj.soopin.content.domain.po.Comment;
import com.wzj.soopin.content.domain.vo.CommentVO;
import com.wzj.soopin.content.service.CommentService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.domain.R;
import org.dromara.common.satoken.utils.LoginHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Slf4j
@Tag(name = "管理端-评论管理接口")
@RequestMapping("/app/comment")
@RestController
public class AppCommentController {
@Autowired
private CommentService commentService;
@Operation(summary = "查询视频评论列表")
@PostMapping("/page")
public R<Page<CommentVO>> queryVlogComments(
@RequestBody CommentBO bo,
@RequestBody Page<Comment> page) {
try {
Page<CommentVO> commentPage = commentService.pageComment(page, bo);
return R.ok(commentPage);
} catch (Exception e) {
log.error("查询视频评论列表失败", e);
return R.fail("查询视频评论列表失败: " + e.getMessage());
}
}
@Operation(summary = "发布评论")
@PostMapping("/publish")
public R<Void> publishComment(@RequestBody CommentBO bo) {
try {
commentService.publishComment(bo);
return R.ok();
} catch (Exception e) {
log.error("发布评论失败", e);
return R.fail("发布评论失败: " + e.getMessage());
}
}
@Operation(summary = "删除评论")
@PostMapping("/delete")
public R<Void> deleteComment(@RequestParam String commentId) {
try {
String username = LoginHelper.getUsername();
commentService.deleteComment(commentId, username);
return R.ok();
} catch (Exception e) {
log.error("删除评论失败", e);
return R.fail("删除评论失败: " + e.getMessage());
}
}
@Operation(summary = "获取评论详情")
@GetMapping("/detail")
public R<Map<String, Object>> getCommentDetail(@RequestParam String commentId) {
try {
Comment comment = commentService.getCommentDetail(commentId);
if (comment == null) {
return R.fail("评论不存在");
}
// 获取子评论
List<Comment> childComments = commentService.getChildComments(commentId);
Map<String, Object> result = new HashMap<>();
result.put("comment", comment);
result.put("childComments", childComments);
return R.ok(result);
} catch (Exception e) {
log.error("获取评论详情失败", e);
return R.fail("获取评论详情失败: " + e.getMessage());
}
}
}

View File

@ -0,0 +1,44 @@
package org.dromara.app;
import cn.hutool.core.util.ObjectUtil;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.domain.R;
import org.dromara.system.domain.vo.SysDictDataVo;
import org.dromara.system.service.ISysDictDataService;
import org.dromara.system.service.ISysDictTypeService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
@Slf4j
@Tag(name = "字典数据接口")
@RequestMapping("/app/sys/dict")
@RestController
@AllArgsConstructor
public class AppDictController {
private final ISysDictDataService dictDataService;
private final ISysDictTypeService dictTypeService;
/**
* 根据字典类型查询字典数据信息
*
* @param dictType 字典类型
*/
@Operation(summary = "根据字典类型查询字典数据信息")
@GetMapping(value = "/type/{dictType}")
public R<List<SysDictDataVo>> dictType(@PathVariable String dictType) {
List<SysDictDataVo> data = dictTypeService.selectDictDataByTypeWithDefaultTenantID(dictType);
if (ObjectUtil.isNull(data)) {
data = new ArrayList<>();
}
return R.ok(data);
}
}

View File

@ -0,0 +1,34 @@
package org.dromara.app;
import com.wzj.soopin.member.convert.FeedbackConvert;
import com.wzj.soopin.member.domain.bo.FeedbackBO;
import com.wzj.soopin.member.service.IFeedbackService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.domain.R;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.log.enums.BusinessType;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@Tag(name = "意见反馈")
@RequestMapping("/app/feedback")
@RestController
@AllArgsConstructor
public class AppFeedbackController {
private final IFeedbackService service;
private final FeedbackConvert convert;
@Operation(summary = "修改意见反馈备注信息")
@Log(title = "新增意见反馈", businessType = BusinessType.UPDATE)
@PostMapping("/add")
public R add(@RequestBody FeedbackBO feedback) {
return R.ok(service.save(convert.toPo(feedback)));
}
}

View File

@ -0,0 +1,266 @@
package org.dromara.app;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wzj.soopin.member.business.IMemberBusiness;
import com.wzj.soopin.member.convert.AccountBillConvert;
import com.wzj.soopin.member.convert.MemberAccountConvert;
import com.wzj.soopin.member.convert.MemberBankConvert;
import com.wzj.soopin.member.convert.MemberConvert;
import com.wzj.soopin.member.domain.bo.AccountBillBO;
import com.wzj.soopin.member.domain.bo.MemberBO;
import com.wzj.soopin.member.domain.bo.MemberBankBO;
import com.wzj.soopin.member.domain.po.AccountBill;
import com.wzj.soopin.member.domain.po.Member;
import com.wzj.soopin.member.domain.po.MemberAccount;
import com.wzj.soopin.member.domain.po.MemberBank;
import com.wzj.soopin.member.domain.vo.AccountBillVO;
import com.wzj.soopin.member.domain.vo.MemberAccountVO;
import com.wzj.soopin.member.domain.vo.MemberBankVO;
import com.wzj.soopin.member.domain.vo.MemberVO;
import com.wzj.soopin.member.service.IFansService;
import com.wzj.soopin.member.service.IMemberAccountService;
import com.wzj.soopin.member.service.IMemberBankService;
import com.wzj.soopin.member.service.IMemberService;
import com.wzj.soopin.transaction.convert.ChargeConvert;
import com.wzj.soopin.transaction.convert.WithdrawConvert;
import com.wzj.soopin.transaction.domain.bo.ChargeBO;
import com.wzj.soopin.transaction.domain.bo.WithdrawBO;
import com.wzj.soopin.transaction.domain.entity.InitiateBatchTransferResponseNew;
import com.wzj.soopin.transaction.domain.po.Withdraw;
import com.wzj.soopin.transaction.enums.WithdrawType;
import com.wzj.soopin.transaction.service.IAccountBillService;
import com.wzj.soopin.transaction.service.IChargeService;
import com.wzj.soopin.transaction.service.IWithdrawService;
import com.wzj.soopin.transaction.service.impl.WxAuthService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import me.zhyd.oauth.model.AuthResponse;
import me.zhyd.oauth.model.AuthToken;
import me.zhyd.oauth.model.AuthUser;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.domain.model.SocialLoginBody;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.ValidatorUtils;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.ratelimiter.annotation.RateLimiter;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.social.config.properties.SocialProperties;
import org.dromara.common.social.utils.SocialUtils;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/app/member")
@Tag(name = "会员管理")
@RequiredArgsConstructor
public class AppMemberController {
private final IMemberBusiness memberBusiness;
private final IMemberService service;
private final MemberConvert convert;
private final MemberAccountConvert accountConvert;
private final IMemberAccountService accountService;
private final IAccountBillService accountBillService;
private final AccountBillConvert accountBillConvert;
private final SocialProperties socialProperties;
private final IMemberBankService memberBankService;
private final MemberBankConvert memberBankConvert;
private final IChargeService chargeService;
private final ChargeConvert chargeConvert;
private final IWithdrawService withdrawService;
private final WithdrawConvert withdrawConvert;
private final WxAuthService wxAuthService;
private final IFansService fansService;
@Operation(summary = "获取会员账户信息详细信息")
@GetMapping(value = "/info")
public R<MemberVO> getInfo(Long memberId) {
//获取用户信息
if(memberId==null){
LoginUser loginUser = LoginHelper.getLoginUser();
if (loginUser == null) {
throw new ServiceException("用户未登录");
}
memberId = loginUser.getUserId();
}
return R.ok(memberBusiness.info(memberId));
}
@Operation(summary = "获取会员账户表详细信息")
@GetMapping(value = "/account")
public R<MemberAccountVO> accountInfo() {
//获取用户信息
LoginUser loginUser = LoginHelper.getLoginUser();
if (loginUser == null) {
throw new ServiceException("用户未登录");
}
return R.ok(accountConvert.toVO(accountService.getMemberAccount(loginUser.getUserId())));
}
@Operation(summary = "查询账单")
@PostMapping("/bank")
public R<Page<MemberBankVO>> list(@RequestBody MemberBankBO bo,
@RequestBody Page<MemberBank> page) {
//获取用户信息
LoginUser loginUser = LoginHelper.getLoginUser();
if (loginUser == null) {
throw new ServiceException("用户未登录");
}
Long memberId = loginUser.getUserId();
bo.setMemberId(memberId);
Page<MemberBank> memberPage = memberBankService.page(page, bo.toWrapper());
return R.ok(memberBankConvert.toVO(memberPage));
}
@Operation(summary = "查询账单")
@PostMapping("/bills")
public R<Page<AccountBillVO>> list(@RequestBody AccountBillBO bo,
@RequestBody Page<AccountBill> page) {
//获取用户信息
LoginUser loginUser = LoginHelper.getLoginUser();
if (loginUser == null) {
throw new ServiceException("用户未登录");
}
Long memberId = loginUser.getUserId();
//根据会员获取账户信息
MemberAccount memberAccount = accountService.getMemberAccount(memberId);
if (memberAccount == null) {
throw new ServiceException("用户未绑定账户");
}
LambdaQueryWrapper<AccountBill> queryWrapper = bo.toWrapper();
queryWrapper.eq(AccountBill::getAccountId, memberAccount.getId());
queryWrapper.orderByDesc(AccountBill::getCreateTime);
Page<AccountBill> memberPage = accountBillService.page(page, queryWrapper);
return R.ok(accountBillConvert.toVO(memberPage));
}
@Operation(summary = "绑定推广人")
@PostMapping("/bind/spread")
public R<AuthToken> bindSpread(@RequestBody MemberBO bo) {
memberBusiness.bindSpread(bo);
return R.ok();
}
@Operation(summary = "绑定微信")
@PostMapping("/bind/wechat")
public R<AuthToken> bindWechat(@RequestBody SocialLoginBody loginBody) {
//获取用户信息
LoginUser loginUser = LoginHelper.getLoginUser();
if (loginUser == null) {
throw new ServiceException("用户未登录");
}
Long memberId = loginUser.getUserId();
//
ValidatorUtils.validate(loginBody);
AuthResponse<AuthUser> response = SocialUtils.loginAuth(
loginBody.getSource(), loginBody.getSocialCode(),
loginBody.getSocialState(), socialProperties);
if (!response.ok()) {
throw new ServiceException(response.getMsg());
}
AuthUser authUserData = response.getData();
// WxAuthResponse response1 = wxAuthService.getAccessTokenByCode(loginBody.getSocialCode());
// String OpenId=response1.getOpenid();
Member member = Member.builder().id(memberId).openId(authUserData.getUuid()).build();
service.updateById(member);
// 更新用户的微信信息
// 返回给前端
return R.ok(authUserData.getToken());
}
@Operation(summary = "充值")
@Log(title = "新增 ", businessType = BusinessType.INSERT)
@PostMapping("/charge")
public R charge(@RequestBody ChargeBO bo) {
//获取用户信息
LoginUser loginUser = LoginHelper.getLoginUser();
if (loginUser == null) {
throw new ServiceException("用户未登录");
}
Long memberId = loginUser.getUserId();
bo.setMemberId(memberId);
return R.ok(chargeService.charge(chargeConvert.toPo(bo)));
}
@Operation(summary = "提现")
@Log(title = "提现 ", businessType = BusinessType.INSERT)
@PostMapping("/withdraw")
public R withdraw(@RequestBody WithdrawBO bo) {
//获取用户信息
LoginUser loginUser = LoginHelper.getLoginUser();
if (loginUser == null) {
return R.notLogin();
}
Long memberId = loginUser.getUserId();
bo.setMemberId(memberId);
bo.setType(WithdrawType.WALLET.getCode());
Withdraw withdraw=withdrawConvert.toPo(bo);
InitiateBatchTransferResponseNew responseNew= withdrawService.withdraw(withdraw);
return R.ok(responseNew);
}
@RateLimiter(key = "#phonenumber", time = 60, count = 1)
@GetMapping("/sms/code")
@Operation(summary = "给当前登录会员的手机号发送短信验证码")
public R smsCode(@RequestParam String templateId) {
service.smsCode(templateId);
return R.ok();
}
@Operation(summary = "用户注销")
@Log(title = "用户注销 ", businessType = BusinessType.UPDATE)
@PostMapping("/revoked")
public R revoked(@RequestParam String smsCode) {
service.revoked(smsCode);
return R.ok();
}
@Operation(summary = "关注用户")
@Log(title = "关注用户 ", businessType = BusinessType.UPDATE)
@PostMapping("/follow")
public R follow(@RequestParam Long vloggerId) {
LoginUser loginUser= LoginHelper.getLoginUser();
if (loginUser == null) {
throw new ServiceException("用户未登录");
}
fansService.doFollow(loginUser.getUserId(), vloggerId);
return R.ok();
}
@Operation(summary = "取消关注")
@Log(title = "取消关注 ", businessType = BusinessType.UPDATE)
@PostMapping("/cancel")
public R cancelFollow(@RequestParam Long vloggerId) {
LoginUser loginUser= LoginHelper.getLoginUser();
if (loginUser == null) {
throw new ServiceException("用户未登录");
}
fansService.doCancel(loginUser.getUserId(), vloggerId);
return R.ok();
}
}

View File

@ -0,0 +1,122 @@
package org.dromara.app;
import com.wzj.soopin.transaction.business.IChargeBusiness;
import com.wzj.soopin.transaction.domain.bo.ChargeBO;
import com.wzj.soopin.transaction.enums.PaymentClientEnum;
import com.wzj.soopin.transaction.enums.PaymentMethodEnum;
import com.wzj.soopin.transaction.kit.CashierSupport;
import com.wzj.soopin.transaction.kit.dto.PayParam;
import com.wzj.soopin.transaction.kit.params.dto.CashierParam;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.constant.ResultCode;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.satoken.utils.LoginHelper;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
/**
* 买家端,收银台接口
*
* @author Chopper
* @since 2020-12-18 16:59
*/
@Slf4j
@RestController
@Tag(name = "收银台接口")
@RequestMapping("/app/payment")
@RequiredArgsConstructor
public class AppPayController {
private final IChargeBusiness chargeBusiness;
private final CashierSupport cashierSupport;
// @ApiImplicitParams({
// @ApiImplicitParam(name = "client", value = "客户端类型", paramType = "path", allowableValues = "PC,H5,WECHAT_MP,APP")
// })
@PostMapping(value = "/tradeDetail")
@Operation(summary = "获取支付详情")
public R paymentParams(@RequestBody @Validated PayParam payParam) {
CashierParam cashierParam = cashierSupport.cashierParam(payParam);
return R.ok( cashierParam);
}
@Parameters({
@Parameter(name = "paymentMethod", description = "支付方式", allowReserved = true, schema = @Schema(allowableValues = {"WECHAT", "ALIPAY"})),
@Parameter(name = "paymentClient", description = "调起方式", allowReserved = true, schema = @Schema(allowableValues = {"APP", "NATIVE", "JSAPI", "H5", "MP"}))
})
@PostMapping(value = "/pay")
@Operation(summary = "支付")
public R payment(
HttpServletRequest request,
HttpServletResponse response,
@RequestBody @Validated PayParam payParam, @RequestBody ChargeBO chargeBO) {
PaymentMethodEnum paymentMethodEnum = PaymentMethodEnum.valueOf(payParam.getPaymentMethod());
PaymentClientEnum paymentClientEnum = PaymentClientEnum.valueOf(payParam.getPaymentClient());
try {
LoginUser user = LoginHelper.getLoginUser();
if (user == null) {
return R.notLogin();
}
if(payParam.getOrderType().equals("RECHARGE")){
//先生成充值订单
chargeBO.setMemberId(user.getUserId());
chargeBO.setMethod(paymentMethodEnum.getCode());
chargeBusiness.charge(chargeBO);
payParam.setSn(chargeBO.getCode());
}
return cashierSupport.payment(paymentMethodEnum, paymentClientEnum, request, response, payParam);
} catch (ServiceException se) {
log.info("支付异常", se);
throw se;
} catch (Exception e) {
log.error("收银台支付错误", e);
}
return null;
}
@Operation(summary = "支付回调")
@RequestMapping(value = "/callback/{paymentMethod}", method = {RequestMethod.GET, RequestMethod.POST})
public R<Object> callback(HttpServletRequest request, @PathVariable String paymentMethod) {
PaymentMethodEnum paymentMethodEnum = PaymentMethodEnum.valueOf(paymentMethod);
cashierSupport.callback(paymentMethodEnum, request);
return R.ok(ResultCode.PAY_SUCCESS);
}
@Operation(summary = "支付异步通知")
@RequestMapping(value = "/notify/{paymentMethod}", method = {RequestMethod.GET, RequestMethod.POST})
public void notify(HttpServletRequest request, @PathVariable String paymentMethod) {
PaymentMethodEnum paymentMethodEnum = PaymentMethodEnum.valueOf(paymentMethod);
cashierSupport.notify(paymentMethodEnum, request);
}
@Operation(summary = "查询支付结果")
@PostMapping(value = "/result")
public R<Boolean> paymentResult(@RequestBody PayParam payParam) {
return R.ok(cashierSupport.paymentResult(payParam));
}
}

View File

@ -0,0 +1,45 @@
package org.dromara.app;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wzj.soopin.goods.convert.ProductCategoryConvert;
import com.wzj.soopin.goods.domain.bo.ProductCategoryBo;
import com.wzj.soopin.goods.domain.entity.ProductCategory;
import com.wzj.soopin.goods.domain.vo.ProductCategoryVO;
import com.wzj.soopin.goods.service.impl.ProductCategoryServiceImpl;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@Tag(name ="商品分类")
@RestController
@RequestMapping("/app/product/category")
@RequiredArgsConstructor
public class AppProductCategoryController {
private final ProductCategoryServiceImpl service;
private final ProductCategoryConvert convert;
@Operation(summary = "查询商品分类列表")
@PostMapping("page")
public R<Page<ProductCategoryVO>> page(@RequestBody ProductCategoryBo query, Page<ProductCategory> page) {
query.setShowStatus(1);
Page<ProductCategory> productCategoryPage = service.page(page,query.toWrapper());
return R.ok(convert.toVO(productCategoryPage));
}
@Operation(summary = "查询列表")
@PostMapping("/tree")
public R<List<ProductCategoryVO>> tree(@RequestBody ProductCategoryBo bo ) {
bo.setShowStatus(1);
List<ProductCategoryVO> articleList = service.tree( bo.toWrapper());
return R.ok( articleList);
}
}

View File

@ -0,0 +1,37 @@
package org.dromara.app;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.wzj.soopin.goods.convert.ProductConvert;
import com.wzj.soopin.goods.domain.bo.ProductBo;
import com.wzj.soopin.goods.domain.vo.ProductVO;
import com.wzj.soopin.goods.service.ProductService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R;
import org.springframework.web.bind.annotation.*;
@Tag(name ="商品")
@RestController
@RequestMapping("/app/product")
@RequiredArgsConstructor
public class AppProductController {
private final ProductService service;
private final ProductConvert convert;
private final ProductService productService;
@Operation(summary = "查询商品信息列表")
@PostMapping("page")
public R<IPage<ProductVO>> page(@RequestBody ProductBo query) {
IPage<ProductVO> resultPage = service.getProduct(query.getPage(), query);
return R.ok(resultPage);
}
@Operation(summary = "获取商品信息详细信息")
@GetMapping(value = "/{id}")
public R<ProductVO> getInfo(@PathVariable("id") Long id) {
return R.ok(service.selectById(id));
}
}

View File

@ -0,0 +1,72 @@
package org.dromara.app;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wzj.soopin.content.domain.bo.SearchBO;
import com.wzj.soopin.content.enums.SearchTypeEnum;
import com.wzj.soopin.content.service.VlogService;
import com.wzj.soopin.goods.domain.bo.ProductBo;
import com.wzj.soopin.goods.service.ProductService;
import com.wzj.soopin.member.domain.bo.MemberBO;
import com.wzj.soopin.member.service.IMemberService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.satoken.utils.LoginHelper;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Objects;
@Slf4j
@RestController
@RequestMapping("/app/common/search")
@Tag(name = "公共检索")
@RequiredArgsConstructor
public class AppSearchController {
private final ProductService productService;
private final IMemberService memberService;
private final VlogService vlogService;
@Operation(summary = "视频、商品和用户检索")
@PostMapping("")
public R<IPage<?>> search(@RequestBody SearchBO searchBO, @RequestBody Page page) {
try {
LoginUser loginUser = LoginHelper.getLoginUser();
if (loginUser == null) {
return R.notLogin();
}
searchBO.setUserId(String.valueOf(loginUser.getUserId()));
} catch (Exception e) {
log.error("用户没登陆", e);
}
if(searchBO.getTitle()==null || "".equals(searchBO.getTitle())){
throw new ServiceException("请输入检索内容");
}
IPage<?> pages = null;
// 视频检索信息
if (Objects.nonNull(searchBO) && Objects.nonNull(searchBO.getType()) && (SearchTypeEnum.VIDEO.type.intValue() == searchBO.getType().intValue())) {
pages = vlogService.getIndexSearchVlogList(searchBO, page);
// 商品检索信息
} else if (Objects.nonNull(searchBO) && Objects.nonNull(searchBO.getType()) && (SearchTypeEnum.PRODUCT.type.intValue() == searchBO.getType().intValue())) {
ProductBo productBo = new ProductBo();
productBo.setNameLike(searchBO.getTitle());
pages = productService.getProduct(page, productBo);
// 用户检索信息
} else if (Objects.nonNull(searchBO) && Objects.nonNull(searchBO.getType()) && (SearchTypeEnum.MEMBER.type.intValue() == searchBO.getType().intValue())) {
MemberBO memberBO = new MemberBO();
memberBO.setNickname(searchBO.getTitle());
memberBO.setPhone(searchBO.getTitle());
pages = memberService.getMemberPageList(memberBO, page);
}
return R.ok(pages);
}
}

View File

@ -0,0 +1,45 @@
package org.dromara.app;
import com.wzj.soopin.transaction.convert.WithdrawConvert;
import com.wzj.soopin.transaction.domain.bo.WithdrawBO;
import com.wzj.soopin.transaction.enums.WithdrawType;
import com.wzj.soopin.transaction.service.IWithdrawService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.satoken.utils.LoginHelper;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Tag(name = "租户")
@RestController
@RequestMapping("/app/tenant")
@RequiredArgsConstructor
public class AppTenantController {
private final IWithdrawService withdrawService;
private final WithdrawConvert withdrawConvert;
@Operation(summary = "提现")
@Log(title = "提现 ", businessType = BusinessType.INSERT)
@PostMapping("/withdraw")
public R withdraw(@RequestBody WithdrawBO bo) {
//获取用户信息
LoginUser loginUser = LoginHelper.getLoginUser();
if (loginUser == null) {
throw new ServiceException("用户未登录");
}
Long memberId = loginUser.getUserId();
bo.setMemberId(memberId);
bo.setType(WithdrawType.REVENUE.getCode());
return R.ok(withdrawService.withdraw(withdrawConvert.toPo(bo)));
}
}

View File

@ -0,0 +1,34 @@
package org.dromara.app;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R;
import org.dromara.system.domain.SysVersion;
import org.dromara.system.domain.bo.SysVersionBo;
import org.dromara.system.domain.vo.SysVersionVo;
import org.dromara.system.service.ISysVerisonService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/app/version")
public class AppVersionController {
private final ISysVerisonService sysVerisonService;
@Operation(summary = "查询app版本管理")
@PostMapping("/page")
public R<IPage<SysVersionVo>> list(@RequestBody SysVersionBo query, Page<SysVersion> page){
return R.ok(sysVerisonService.getList(page,query));
}
}

View File

@ -0,0 +1,190 @@
package org.dromara.app;
import cn.dev33.satoken.annotation.SaIgnore;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wzj.soopin.content.domain.bo.*;
import com.wzj.soopin.content.domain.vo.IndexVlogVO;
import com.wzj.soopin.content.enums.VlogStatusEnum;
import com.wzj.soopin.content.enums.YesOrNo;
import com.wzj.soopin.content.service.IVlogPullService;
import com.wzj.soopin.content.service.VlogService;
import com.wzj.soopin.content.service.VlogUploadService;
import com.wzj.soopin.content.utils.QcCloud;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.redis.redis.RedisCache;
import org.dromara.common.satoken.utils.LoginHelper;
import org.springframework.web.bind.annotation.*;
@Slf4j
@Tag(name = "VlogController 短视频相关业务功能的接口")
@RequestMapping("/app/vlog")
@RestController
@AllArgsConstructor
public class AppVlogController {
private final VlogService vlogService;
private final QcCloud qcCloud;
private final VlogUploadService vlogUploadService;
public final RedisCache cache;
private final IVlogPullService pullService;
@Operation(summary = "首页视频列表")
@PostMapping("/indexList")
@SaIgnore
public R<Page<IndexVlogVO>> indexList(@RequestBody IndexListBO bo, @RequestBody Page page) {
Page<IndexVlogVO> pages = pullService.pullFromMq(page);
return R.ok(pages);
}
@Operation(summary = "视频详情")
@GetMapping("/detail/{vlogId}")
public R<Object> detail(@PathVariable String vlogId) {
return R.ok(vlogService.getVlogDetailById(vlogId));
}
@Operation(summary = "修改视频为私密")
@PostMapping("/changeToPrivate")
public R<Void> changeToPrivate(@RequestParam String vlogId) {
vlogService.changeToPrivateOrPublic(vlogId, YesOrNo.YES.type);
return R.ok();
}
@Operation(summary = "修改视频为公开")
@PostMapping("/changeToPublic")
public R<Void> changeToPublic(@RequestParam String vlogId) {
vlogService.changeToPrivateOrPublic(vlogId, YesOrNo.NO.type);
return R.ok();
}
@Operation(summary = "我的私密视频列表")
@PostMapping("/myPrivateList")
public R<Page<IndexVlogVO>> myPrivateList(@RequestBody MyListBO bo, @RequestBody Page page) {
LoginUser loginUser = LoginHelper.getLoginUser();
if (loginUser == null) {
return R.notLogin();
}
bo.setUserId(String.valueOf(loginUser.getUserId()));
Page<IndexVlogVO> pages = vlogService.queryMyVlogList(bo, page);
return R.ok(pages);
}
@Operation(summary = "我点赞的视频列表")
@PostMapping("/myLikedList")
public R<Page<IndexVlogVO>> myLikedList(@RequestBody MyLikedVlogBO bo, @RequestBody Page page) {
Page<IndexVlogVO> pages = vlogService.getMyLikedVlogList(page);
return R.ok(pages);
}
@Operation(summary = "我关注人的视频列表")
@PostMapping("/followList")
public R<Page<IndexVlogVO>> followList(@RequestBody SimpleListBO bo, @RequestBody Page page) {
LoginUser loginUser = LoginHelper.getLoginUser();
if (loginUser == null) {
return R.notLogin();
}
bo.setMyId(String.valueOf(loginUser.getUserId()));
Page<IndexVlogVO> pages = vlogService.getMyFollowVlogList(page);
return R.ok(pages);
}
@Operation(summary = "好友视频列表")
@PostMapping("/friendList")
public R<Page<IndexVlogVO>> friendList(@RequestBody SimpleListBO bo, @RequestBody Page page) {
LoginUser loginUser = LoginHelper.getLoginUser();
if (loginUser == null) {
return R.notLogin();
}
bo.setMyId(String.valueOf(loginUser.getUserId()));
Page<IndexVlogVO> pages = vlogService.getMyFriendVlogList(page);
return R.ok(pages);
}
@Operation(summary = "上传视频到云点播")
@PostMapping("publish")
public R<Void> publish(@RequestBody VlogBO vlogBO) throws Exception {
vlogService.createVlog(vlogBO);
return R.ok();
}
@Operation(summary = "我的公开视频列表")
@PostMapping("/myPublicList")
public R<Page<IndexVlogVO>> myPublicList(@RequestBody MyListBO bo, @RequestBody Page page) {
Page<IndexVlogVO> pages = vlogService.queryMyVlogList(bo, page);
return R.ok(pages);
}
@Operation(summary = "点赞")
@PostMapping("/like")
public R<Void> like(@RequestBody VlogBO vlogBO) {
LoginUser loginUser = LoginHelper.getLoginUser();
if (loginUser == null) {
return R.notLogin();
}
String userId = String.valueOf(loginUser.getUserId());
String vlogId = vlogBO.getId();
vlogService.userLikeVlog(userId, vlogId);
return R.ok();
}
@Operation(summary = "取消点赞")
@PostMapping("/unlike")
public R<Void> unlike(@RequestBody VlogBO vlogBO) {
LoginUser loginUser = LoginHelper.getLoginUser();
if (loginUser == null) {
return R.notLogin();
}
String userId = String.valueOf(loginUser.getUserId());
String vlogId = vlogBO.getId();
vlogService.userUnLikeVlog(userId, vlogId);
return R.ok();
}
@Operation(summary = "删除视频")
@GetMapping("/delete")
public R<Void> delete(@RequestParam String id) {
LoginUser loginUser = LoginHelper.getLoginUser();
if (loginUser == null) {
throw new ServiceException("用户未登录");
}
vlogService.removeById(id);
return R.ok();
}
@Operation(summary = "视频列表")
@PostMapping("/page")
public R<Page<IndexVlogVO>> page(@RequestBody VlogBO vlogBO) {
if (vlogBO.getMemberId() == null) {
throw new ServiceException("用户id不能为空");
}
vlogBO.setStatus(VlogStatusEnum.APPROVED.type);
vlogBO.setIsPrivate(YesOrNo.NO.type);
return R.ok(vlogService.getIndexVlogList(vlogBO, vlogBO.getPage()));
}
@Operation(summary = "手动触发缓存点赞最多视频")
@PostMapping("/cacheTopLikedVlogs")
public R<Void> cacheTopLikedVlogs(@RequestParam(defaultValue = "100") int limit) {
try {
// vlogService.cacheTopLikedVlogs(limit);
return R.ok();
} catch (Exception e) {
log.error("手动触发缓存点赞最多视频失败", e);
return R.fail("缓存失败: " + e.getMessage());
}
}
}

View File

@ -0,0 +1,30 @@
package org.dromara.app;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 买家端,退款回调
*
* @author Chopper
* @since 2020-12-18 16:59
*/
@Tag(name = "买家端,退款回调")
@RestController
@RequestMapping("/buyer/payment/cashierRefund")
@RequiredArgsConstructor
public class CashierRefundController {
// private final RefundSupport refundSupport;
//
//
// @ApiOperation(value = "退款通知")
// @RequestMapping(value = "/notify/{paymentMethod}", method = {RequestMethod.GET, RequestMethod.POST})
// public void notify(HttpServletRequest request, @PathVariable String paymentMethod) {
// PaymentMethodEnum paymentMethodEnum = PaymentMethodEnum.valueOf(paymentMethod);
// refundSupport.notify(paymentMethodEnum, request);
// }
}

View File

@ -0,0 +1,81 @@
package org.dromara.app.customer;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.wzj.soopin.content.utils.RedisOperator;
import com.wzj.soopin.order.business.IOrderBusiness;
import com.wzj.soopin.order.domain.bo.OrderBo;
import com.wzj.soopin.order.domain.bo.SaveOrderBO;
import com.wzj.soopin.order.domain.vo.OrderVO;
import com.wzj.soopin.order.service.IMemberOrderService;
import com.wzj.soopin.order.service.OrderService;
import com.wzj.soopin.order.service.VerificationCodeService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.satoken.utils.LoginHelper;
import org.springframework.web.bind.annotation.*;
@Slf4j
@Tag(name = "app-用户-订单接口")
@RequestMapping("/app/order")
@RestController
@RequiredArgsConstructor
public class AppOrderController {
private final OrderService orderService;
private final IMemberOrderService memberOrderService;
private final VerificationCodeService verificationCodeService;
private final IOrderBusiness orderBusiness;
public RedisOperator redis;
@Operation(summary = "查询订单列表")
@PostMapping("/page")
public R<IPage<OrderVO>> page(@RequestBody OrderBo bo){
LoginUser loginUser= LoginHelper.getLoginUser();
bo.setMemberId(loginUser.getUserId());
return R.ok(memberOrderService.page(bo));
}
@Operation(summary = "获取订单详细信息")
@GetMapping(value = "/{id}")
public R<OrderVO> getInfo(@PathVariable("id") Long id) {
return R.ok(orderBusiness.info(id));
}
@Operation(summary = "生成订单")
@Log(title = "生成订单", businessType = BusinessType.INSERT)
@PostMapping("/add")
public R<OrderVO> add(@RequestBody SaveOrderBO saveOrderBO) {
return R.ok(orderService.saveOrder(saveOrderBO));
}
@Operation(summary = "取消订单")
@Log(title = "取消订单", businessType = BusinessType.UPDATE)
@PostMapping("/cancel/{orderId}")
public R<OrderVO> cancel(@PathVariable("orderId") Long orderId) {
orderService.cancel(orderId);
return R.ok();
}
@Operation(summary = "发送消息")
@Log(title = "发送消息", businessType = BusinessType.UPDATE)
@PostMapping("/send/{orderId}")
public R<OrderVO> send(@PathVariable("orderId") Long orderId) {
orderService.sendMessage(orderId);
//发出消息
return R.ok();
}
}

View File

@ -0,0 +1,76 @@
package org.dromara.app.customer;
import com.wzj.soopin.order.domain.query.GrabRedPacketRequest;
import com.wzj.soopin.order.domain.query.SendRedPacketRequest;
import com.wzj.soopin.transaction.service.RedPacketService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.satoken.utils.LoginHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
/**
* 红包功能控制器
*/
@RestController
@RequestMapping("/app/customer/packet")
@Tag(name = "红包功能接口")
public class AppRedPacketController {
@Autowired
private RedPacketService redPacketService;
/**
* 发红包接口
*
* @param request 发红包请求参数
* @return 红包创建结果
*/
@PostMapping("/send")
@Operation(summary = "发红包")
public R<Map<String, Object>> sendRedPacket(@RequestBody SendRedPacketRequest request) {
LoginUser user = LoginHelper.getLoginUser();
if (user == null) {
return R.notLogin();
}
request.setSenderId(user.getUserId());
Map<String, Object> result = redPacketService.sendRedPacket(request);
return R.ok("红包发送成功", result);
}
/**
* 抢红包接口
*
* @return 抢红包结果
*/
@PostMapping("/grab")
@Operation(summary = "抢红包")
public R<Map<String, Object>> grabRedPacket(@RequestBody GrabRedPacketRequest request) {
LoginUser user = LoginHelper.getLoginUser();
if (user == null) {
return R.notLogin();
}
request.setMemberId(user.getUserId());
Map<String, Object> result = redPacketService.grabRedPacket(request);
return R.ok("红包领取成功", result);
}
/**
* 查询红包详情接口
*
* @return 红包详情
*/
@GetMapping("/refund")
@Operation(summary = "退回红包")
public R getRedPacketDetail() {
redPacketService.checkAndRefundExpiredRedPackets();
return R.ok();
}
}

View File

@ -0,0 +1,79 @@
package org.dromara.app.merchant;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.wzj.soopin.member.convert.AccountBillConvert;
import com.wzj.soopin.member.domain.bo.AccountBillBO;
import com.wzj.soopin.member.domain.vo.AccountBillVO;
import com.wzj.soopin.member.domain.vo.AccountStatisticVO;
import com.wzj.soopin.transaction.service.IAccountBillService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.system.domain.SysTenantAccount;
import org.dromara.system.service.ISysTenantAccountService;
import org.dromara.system.service.ISysTenantService;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 商户端,账单接口
*
* @author Chopper
* @since 2020-12-18 16:59
*/
@Slf4j
@Tag(name = "商户端,账单接口")
@RequestMapping("/app/merchant/account/")
@RestController
@RequiredArgsConstructor
public class AppMerchantBillController {
private final IAccountBillService service;
private final AccountBillConvert convert;
private final ISysTenantAccountService sysTenantAccountService;
private final ISysTenantService sysTenantService;
private final IAccountBillService accountBillService;
@Tag(name = "分页列表")
@PostMapping("/bill/page")
public R<IPage<AccountBillVO>> page(@RequestBody AccountBillBO bo) {
LoginUser loginUser = LoginHelper.getLoginUser();
if (loginUser == null) {
return R.fail("用户未登录");
}
if(loginUser.getTenantId() == null){
return R.fail("用户不是商户");
}
//取member对应的商户
SysTenantAccount sysTenantAccount = sysTenantAccountService.getByTenantId(loginUser.getTenantId());
// bo.setSource(AccountTypeEnum.MERCHANT.getCode());
bo.setAccountId(sysTenantAccount.getId());
IPage<AccountBillVO> voPage = service.selectVoPage(bo);
return R.ok(voPage);
}
@Operation(summary = "账户统计")
@PostMapping("/statistic")
public R<AccountStatisticVO> statistic() {
LoginUser loginUser = LoginHelper.getLoginUser();
if (loginUser == null) {
return R.fail("用户未登录");
}
if(loginUser.getTenantId() == null){
return R.fail("用户不是商户");
}
//根据当前登录的member获取用户信息
return R.ok(accountBillService.getStatistic(loginUser.getTenantId()));
}
}

View File

@ -0,0 +1,68 @@
package org.dromara.app.merchant;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.wzj.soopin.order.business.IOrderBusiness;
import com.wzj.soopin.order.domain.bo.OrderItemBo;
import com.wzj.soopin.order.domain.vo.MerchantOrderVO;
import com.wzj.soopin.order.service.IMerchantOrderService;
import com.wzj.soopin.order.service.VerificationCodeService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.domain.R;
import org.springframework.web.bind.annotation.*;
/**
* 商户端,订单接口
*
* @author Chopper
* @since 2020-12-18 16:59
*/
@Slf4j
@Tag(name = "app-商户-订单接口")
@RequestMapping("/app/merchant/order")
@RestController
@RequiredArgsConstructor
public class AppMerchantOrderController {
private final VerificationCodeService verificationCodeService;
private final IMerchantOrderService merchantOrderService;
private final IOrderBusiness orderBusiness;
@Operation(summary = "获取该商家订单子项详细信息")
@GetMapping(value = "/{orderItemId}")
public R<MerchantOrderVO> getInfo(@PathVariable("orderItemId") Long orderItemId) {
return R.ok(orderBusiness.itemInfo(orderItemId));
}
/**
* 扫码核销接口
* @return 核销结果
*/
@GetMapping("/verify")
@Operation(summary = "扫码核销接口")
public R verifyCode(@RequestParam("code") String code) {
verificationCodeService.verifyCode(code);
return R.ok("核销成功");
}
/**
* 查询核销码对应的订单
* @return 核销结果
*/
@GetMapping("/scan")
@Operation(summary = "查询核销码对应的订单")
public R<MerchantOrderVO> scan(@RequestParam("code") String code) {
return R.ok(orderBusiness.getItemInfoByVerificationCode(code));
}
@PostMapping("/page")
@Operation(summary = "查询当前商家订单列表")
public R<IPage<MerchantOrderVO>> page(@RequestBody OrderItemBo bo){
return R.ok(merchantOrderService.page(bo));
}
}

View File

@ -1,7 +1,6 @@
package org.dromara.web.controller; package org.dromara.web.controller;
import cn.dev33.satoken.annotation.SaIgnore; import cn.dev33.satoken.annotation.SaIgnore;
import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.stp.StpUtil; import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.codec.Base64; import cn.hutool.core.codec.Base64;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
@ -18,7 +17,10 @@ import org.dromara.common.core.domain.R;
import org.dromara.common.core.domain.model.LoginBody; import org.dromara.common.core.domain.model.LoginBody;
import org.dromara.common.core.domain.model.RegisterBody; import org.dromara.common.core.domain.model.RegisterBody;
import org.dromara.common.core.domain.model.SocialLoginBody; import org.dromara.common.core.domain.model.SocialLoginBody;
import org.dromara.common.core.utils.*; import org.dromara.common.core.enums.TenantType;
import org.dromara.common.core.utils.MessageUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.core.utils.ValidatorUtils;
import org.dromara.common.encrypt.annotation.ApiEncrypt; import org.dromara.common.encrypt.annotation.ApiEncrypt;
import org.dromara.common.json.utils.JsonUtils; import org.dromara.common.json.utils.JsonUtils;
import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.satoken.utils.LoginHelper;
@ -28,13 +30,9 @@ import org.dromara.common.social.utils.SocialUtils;
import org.dromara.common.sse.dto.SseMessageDto; import org.dromara.common.sse.dto.SseMessageDto;
import org.dromara.common.sse.utils.SseMessageUtils; import org.dromara.common.sse.utils.SseMessageUtils;
import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.system.domain.bo.SysTenantBo;
import org.dromara.system.domain.vo.SysClientVo; import org.dromara.system.domain.vo.SysClientVo;
import org.dromara.system.domain.vo.SysTenantVo; import org.dromara.system.domain.vo.SysTenantVo;
import org.dromara.system.service.ISysClientService; import org.dromara.system.service.*;
import org.dromara.system.service.ISysConfigService;
import org.dromara.system.service.ISysSocialService;
import org.dromara.system.service.ISysTenantService;
import org.dromara.web.domain.vo.LoginTenantVo; import org.dromara.web.domain.vo.LoginTenantVo;
import org.dromara.web.domain.vo.LoginVo; import org.dromara.web.domain.vo.LoginVo;
import org.dromara.web.domain.vo.TenantListVo; import org.dromara.web.domain.vo.TenantListVo;
@ -44,8 +42,8 @@ import org.dromara.web.service.SysRegisterService;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.net.URL;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -72,6 +70,7 @@ public class AuthController {
private final ISysSocialService socialUserService; private final ISysSocialService socialUserService;
private final ISysClientService clientService; private final ISysClientService clientService;
private final ScheduledExecutorService scheduledExecutorService; private final ScheduledExecutorService scheduledExecutorService;
private final ISysUserService userService;
/** /**
@ -80,7 +79,7 @@ public class AuthController {
* @param body 登录信息 * @param body 登录信息
* @return 结果 * @return 结果
*/ */
@ApiEncrypt // @ApiEncrypt
@PostMapping("/login") @PostMapping("/login")
public R<LoginVo> login(@RequestBody String body) { public R<LoginVo> login(@RequestBody String body) {
LoginBody loginBody = JsonUtils.parseObject(body, LoginBody.class); LoginBody loginBody = JsonUtils.parseObject(body, LoginBody.class);
@ -96,11 +95,8 @@ public class AuthController {
} else if (!SystemConstants.NORMAL.equals(client.getStatus())) { } else if (!SystemConstants.NORMAL.equals(client.getStatus())) {
return R.fail(MessageUtils.message("auth.grant.type.blocked")); return R.fail(MessageUtils.message("auth.grant.type.blocked"));
} }
// 校验租户
loginService.checkTenant(loginBody.getTenantId());
// 登录 // 登录
LoginVo loginVo = IAuthStrategy.login(body, client, grantType); LoginVo loginVo = IAuthStrategy.login(body, client, grantType);
Long userId = LoginHelper.getUserId(); Long userId = LoginHelper.getUserId();
scheduledExecutorService.schedule(() -> { scheduledExecutorService.schedule(() -> {
SseMessageDto dto = new SseMessageDto(); SseMessageDto dto = new SseMessageDto();
@ -195,6 +191,9 @@ public class AuthController {
/** /**
* 登录页面租户下拉框 * 登录页面租户下拉框
* 超级管理员可查看所有租户
* 代理租户管理员可查自己租户和parentIds中包含自己的租户
* 店铺租户和达人租户只可查看自己的租户
* *
* @return 租户列表 * @return 租户列表
*/ */
@ -209,31 +208,54 @@ public class AuthController {
return R.ok(result); return R.ok(result);
} }
List<SysTenantVo> tenantList = tenantService.queryList(new SysTenantBo()); SysTenantVo currentTenant = tenantService.queryByTenantId(LoginHelper.getTenantId());
List<TenantListVo> voList = MapstructUtils.convert(tenantList, TenantListVo.class); String companyName = currentTenant.getCompanyName();
try { if(currentTenant.getType().equals(TenantType.AGENT.getType())){
// 如果只超管返回所有租户 companyName = currentTenant.getAgencyName();
if (LoginHelper.isSuperAdmin()) { } else if (currentTenant.getType().equals(TenantType.MERCHANT.getType())) {
result.setVoList(voList); companyName = currentTenant.getStoreName();
return R.ok(result); } else if (currentTenant.getType().equals(TenantType.REFERENCE.getType())) {
companyName = "团长:" + companyName;
}
List<TenantListVo> voList = new ArrayList<>();
voList.add(TenantListVo.builder().tenantId(currentTenant.getTenantId()).companyName(companyName).domain(currentTenant.getDomain()).build());
List<SysTenantVo> sysTenantList = tenantService.getByParentId(currentTenant.getId());
List<TenantListVo> childList = sysTenantList.stream().map(vo -> {
String name = vo.getCompanyName();
if (vo.getType().equals(TenantType.AGENT.getType())) {
name = vo.getAgencyName();
} else if (vo.getType().equals(TenantType.MERCHANT.getType())) {
name = vo.getStoreName();
} else if (vo.getType().equals(TenantType.REFERENCE.getType())) {
name = "团长:" + name;
} }
} catch (NotLoginException ignored) { return TenantListVo.builder().tenantId(vo.getTenantId())
.companyName(name)
.domain(vo.getDomain())
.build();
}).toList();
if (CollUtil.isNotEmpty(childList)) {
voList.addAll(childList);
} }
result.setVoList(voList);
// 获取域名 // 获取域名 --- 暂时不需要
String host; // String host;
String referer = request.getHeader("referer"); // String referer = request.getHeader("referer");
if (StringUtils.isNotBlank(referer)) { // if (StringUtils.isNotBlank(referer)) {
// 这里从referer中取值是为了本地使用hosts添加虚拟域名方便本地环境调试 // // 这里从referer中取值是为了本地使用hosts添加虚拟域名方便本地环境调试
host = referer.split("//")[1].split("/")[0]; // host = referer.split("//")[1].split("/")[0];
} else { // } else {
host = new URL(request.getRequestURL().toString()).getHost(); // host = new URL(request.getRequestURL().toString()).getHost();
} // }
// 根据域名进行筛选 // // 根据域名进行筛选
List<TenantListVo> list = StreamUtils.filter(voList, vo -> // List<TenantListVo> list = StreamUtils.filter(voList, vo ->
StringUtils.equalsIgnoreCase(vo.getDomain(), host)); // StringUtils.equalsIgnoreCase(vo.getDomain(), host));
result.setVoList(CollUtil.isNotEmpty(list) ? list : voList); // result.setVoList(CollUtil.isNotEmpty(list) ? list : voList);
return R.ok(result); return R.ok(result);
} }
} }

View File

@ -56,23 +56,24 @@ public class CaptchaController {
* *
* @param phonenumber 用户手机号 * @param phonenumber 用户手机号
*/ */
@RateLimiter(key = "#phonenumber", time = 60, count = 1) // @RateLimiter(key = "#phonenumber", time = 60, count = 1)
@GetMapping("/resource/sms/code") @GetMapping("/resource/sms/code")
public R<Void> smsCode(@NotBlank(message = "{user.phonenumber.not.blank}") String phonenumber) { public R<String> smsCode(@NotBlank(message = "{user.phonenumber.not.blank}") String phonenumber) {
String key = GlobalConstants.CAPTCHA_CODE_KEY + phonenumber; String key = GlobalConstants.CAPTCHA_CODE_KEY + phonenumber;
String code = RandomUtil.randomNumbers(4); String code = RandomUtil.randomNumbers(4);
RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION)); RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION));
// 验证码模板id 自行处理 (查数据库或写死均可) // 验证码模板id 自行处理 (查数据库或写死均可)
String templateId = ""; String templateId = "2375314";
LinkedHashMap<String, String> map = new LinkedHashMap<>(1); LinkedHashMap<String, String> map = new LinkedHashMap<>(1);
map.put("code", code); map.put("code", code);
SmsBlend smsBlend = SmsFactory.getSmsBlend("config1"); SmsBlend smsBlend = SmsFactory.getSmsBlend("config2");
SmsResponse smsResponse = smsBlend.sendMessage(phonenumber, templateId, map); SmsResponse smsResponse = smsBlend.sendMessage(phonenumber, templateId, map);
if (!smsResponse.isSuccess()) { if (!smsResponse.isSuccess()) {
log.error("验证码短信发送异常 => {}", smsResponse); log.error("验证码短信发送异常 => {}", smsResponse);
return R.fail(smsResponse.getData().toString()); return R.fail(smsResponse.getData().toString());
} }
return R.ok(); log.info("{}:验证码发送成功,验证码为:{}", phonenumber, code);
return R.ok(code);
} }
/** /**

View File

@ -1,12 +1,18 @@
package org.dromara.web.controller; package org.dromara.web.controller;
import cn.dev33.satoken.annotation.SaIgnore; import cn.dev33.satoken.annotation.SaIgnore;
import com.wzj.soopin.order.service.OrderService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.StringUtils;
import org.dromara.web.service.IndexService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
/** /**
* 首页 * 首页
* *
@ -17,6 +23,9 @@ import org.springframework.web.bind.annotation.RestController;
@RestController @RestController
public class IndexController { public class IndexController {
private final IndexService indexService;
/** /**
* 访问首页提示语 * 访问首页提示语
*/ */
@ -25,4 +34,25 @@ public class IndexController {
return StringUtils.format("欢迎使用{}后台管理框架,请通过前端地址访问。", SpringUtils.getApplicationName()); return StringUtils.format("欢迎使用{}后台管理框架,请通过前端地址访问。", SpringUtils.getApplicationName());
} }
/**
* 获取数量统计
*/
@GetMapping("/count")
public R getCount() {
return R.ok(indexService.getCount());
}
/**
* 获取今日待办任务
*/
/**
* 获取流量概括
*/
/**
* 获取今日概括
*/
} }

View File

@ -51,4 +51,11 @@ public class LoginVo {
*/ */
private String openid; private String openid;
/**
* 用户 sig
*/
private String userSig;
private Long userId;
} }

View File

@ -1,5 +1,8 @@
package org.dromara.web.domain.vo; package org.dromara.web.domain.vo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.NoArgsConstructor;
import org.dromara.system.domain.vo.SysTenantVo; import org.dromara.system.domain.vo.SysTenantVo;
import io.github.linpeilie.annotations.AutoMapper; import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data; import lombok.Data;
@ -11,6 +14,9 @@ import lombok.Data;
*/ */
@Data @Data
@AutoMapper(target = SysTenantVo.class) @AutoMapper(target = SysTenantVo.class)
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class TenantListVo { public class TenantListVo {
/** /**

View File

@ -0,0 +1,9 @@
package org.dromara.web.service;
import java.util.Map;
public interface IndexService {
Map<String, Object> getCount();
}

View File

@ -7,6 +7,7 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Opt; import cn.hutool.core.lang.Opt;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.baomidou.lock.annotation.Lock4j; import com.baomidou.lock.annotation.Lock4j;
import com.wzj.soopin.member.domain.po.Member;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import me.zhyd.oauth.model.AuthUser; import me.zhyd.oauth.model.AuthUser;
@ -18,6 +19,7 @@ import org.dromara.common.core.domain.dto.PostDTO;
import org.dromara.common.core.domain.dto.RoleDTO; import org.dromara.common.core.domain.dto.RoleDTO;
import org.dromara.common.core.domain.model.LoginUser; import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.enums.LoginType; import org.dromara.common.core.enums.LoginType;
import org.dromara.common.core.enums.UserType;
import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.exception.user.UserException; import org.dromara.common.core.exception.user.UserException;
import org.dromara.common.core.utils.*; import org.dromara.common.core.utils.*;
@ -36,7 +38,7 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.time.Duration; import java.time.Duration;
import java.util.Date; import java.time.LocalDateTime;
import java.util.List; import java.util.List;
import java.util.function.Supplier; import java.util.function.Supplier;
@ -50,6 +52,7 @@ import java.util.function.Supplier;
@Service @Service
public class SysLoginService { public class SysLoginService {
@Value("${user.password.maxRetryCount}") @Value("${user.password.maxRetryCount}")
private Integer maxRetryCount; private Integer maxRetryCount;
@ -63,7 +66,7 @@ public class SysLoginService {
private final ISysDeptService deptService; private final ISysDeptService deptService;
private final ISysPostService postService; private final ISysPostService postService;
private final SysUserMapper userMapper; private final SysUserMapper userMapper;
private final ISysOssService ossService;
/** /**
* 绑定第三方用户 * 绑定第三方用户
@ -72,6 +75,8 @@ public class SysLoginService {
*/ */
@Lock4j @Lock4j
public void socialRegister(AuthUser authUserData) { public void socialRegister(AuthUser authUserData) {
String authId = authUserData.getSource() + authUserData.getUuid(); String authId = authUserData.getSource() + authUserData.getUuid();
// 第三方用户信息 // 第三方用户信息
SysSocialBo bo = BeanUtil.toBean(authUserData, SysSocialBo.class); SysSocialBo bo = BeanUtil.toBean(authUserData, SysSocialBo.class);
@ -155,10 +160,17 @@ public class SysLoginService {
loginUser.setUserId(userId); loginUser.setUserId(userId);
loginUser.setDeptId(user.getDeptId()); loginUser.setDeptId(user.getDeptId());
loginUser.setUsername(user.getUserName()); loginUser.setUsername(user.getUserName());
if(user.getAvatar()!=null){
SysOssVo oss=ossService.getById(user.getAvatar());
if(oss!=null){
loginUser.setAvatar(ossService.getById(user.getAvatar()).getUrl());
}
}
loginUser.setNickname(user.getNickName()); loginUser.setNickname(user.getNickName());
loginUser.setUserType(user.getUserType()); loginUser.setUserType(user.getUserType());
loginUser.setMenuPermission(permissionService.getMenuPermission(userId)); loginUser.setMenuPermission(permissionService.getMenuPermission(userId));
loginUser.setRolePermission(permissionService.getRolePermission(userId)); loginUser.setRolePermission(permissionService.getRolePermission(userId));
loginUser.setUserSig(user.getUserSig());
if (ObjectUtil.isNotNull(user.getDeptId())) { if (ObjectUtil.isNotNull(user.getDeptId())) {
Opt<SysDeptVo> deptOpt = Opt.of(user.getDeptId()).map(deptService::selectDeptById); Opt<SysDeptVo> deptOpt = Opt.of(user.getDeptId()).map(deptService::selectDeptById);
loginUser.setDeptName(deptOpt.map(SysDeptVo::getDeptName).orElse(StringUtils.EMPTY)); loginUser.setDeptName(deptOpt.map(SysDeptVo::getDeptName).orElse(StringUtils.EMPTY));
@ -171,6 +183,22 @@ public class SysLoginService {
return loginUser; return loginUser;
} }
/**
* 构建登录用户
*/
public LoginUser buildLoginUser(Member member) {
LoginUser loginUser = new LoginUser();
Long userId = member.getId();
loginUser.setUserId(userId);
loginUser.setAvatar(member.getAvatar());
loginUser.setUsername(member.getUserName());
loginUser.setNickname(member.getNickname());
loginUser.setUserType(UserType.APP_USER.getUserType());
loginUser.setUserSig(member.getUserSig());
loginUser.setPhoneNumber(member.getPhoneHidden());
return loginUser;
}
/** /**
* 记录登录信息 * 记录登录信息
* *
@ -241,8 +269,8 @@ public class SysLoginService {
} else if (SystemConstants.DISABLE.equals(tenant.getStatus())) { } else if (SystemConstants.DISABLE.equals(tenant.getStatus())) {
log.info("登录租户:{} 已被停用.", tenantId); log.info("登录租户:{} 已被停用.", tenantId);
throw new TenantException("tenant.blocked"); throw new TenantException("tenant.blocked");
} else if (ObjectUtil.isNotNull(tenant.getExpireTime()) }else if (ObjectUtil.isNotNull(tenant.getExpireTime())
&& new Date().after(tenant.getExpireTime())) { && LocalDateTime.now().isAfter(tenant.getExpireTime())) {
log.info("登录租户:{} 已超过有效期.", tenantId); log.info("登录租户:{} 已超过有效期.", tenantId);
throw new TenantException("tenant.expired"); throw new TenantException("tenant.expired");
} }

View File

@ -2,6 +2,7 @@ package org.dromara.web.service.impl;
import cn.dev33.satoken.stp.SaLoginModel; import cn.dev33.satoken.stp.SaLoginModel;
import cn.dev33.satoken.stp.StpUtil; import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@ -47,9 +48,15 @@ public class EmailAuthStrategy implements IAuthStrategy {
public LoginVo login(String body, SysClientVo client) { public LoginVo login(String body, SysClientVo client) {
EmailLoginBody loginBody = JsonUtils.parseObject(body, EmailLoginBody.class); EmailLoginBody loginBody = JsonUtils.parseObject(body, EmailLoginBody.class);
ValidatorUtils.validate(loginBody); ValidatorUtils.validate(loginBody);
String tenantId = loginBody.getTenantId();
String email = loginBody.getEmail(); String email = loginBody.getEmail();
String emailCode = loginBody.getEmailCode(); String emailCode = loginBody.getEmailCode();
// 多租户时页面不在选择租户,后端通过邮箱查询用户的默认租户
String tenantId = userMapper.selectTenantIdByEmail(email);
Assert.notBlank(tenantId, () -> new UserException("登录用户:" + email + " 不存在."));
// 校验租户
if(!"app".equals(client.getClientKey())){
loginService.checkTenant(tenantId);
}
LoginUser loginUser = TenantHelper.dynamic(tenantId, () -> { LoginUser loginUser = TenantHelper.dynamic(tenantId, () -> {
SysUserVo user = loadUserByEmail(email); SysUserVo user = loadUserByEmail(email);
loginService.checkLogin(LoginType.EMAIL, tenantId, user.getUserName(), () -> !validateEmailCode(tenantId, email, emailCode)); loginService.checkLogin(LoginType.EMAIL, tenantId, user.getUserName(), () -> !validateEmailCode(tenantId, email, emailCode));

View File

@ -0,0 +1,112 @@
package org.dromara.web.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.wzj.soopin.content.mapper.VlogMapper;
import com.wzj.soopin.goods.mapper.ProductMapper;
import com.wzj.soopin.member.domain.po.Feedback;
import com.wzj.soopin.member.service.IFeedbackService;
import com.wzj.soopin.member.service.IMemberAccountService;
import com.wzj.soopin.order.mapper.OrderMapper;
import com.wzj.soopin.transaction.domain.po.Withdraw;
import com.wzj.soopin.transaction.service.IWithdrawService;
import lombok.RequiredArgsConstructor;
import org.dromara.system.mapper.SysIntegralHistoryMapper;
import org.dromara.system.mapper.SysTenantMapper;
import org.dromara.system.mapper.SystemStatisticsMapper;
import org.dromara.web.service.IndexService;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;
/**
* @author fxh
*/
@Service
@RequiredArgsConstructor
public class IndexServiceImpl implements IndexService {
private final SysTenantMapper sysTenantMapper;
private final VlogMapper vlogMapper;
private final IMemberAccountService memberService;
private final IFeedbackService feedbackService;
private final IWithdrawService withdrawService;
private final SystemStatisticsMapper systemStatisticsMapper;
private final SysIntegralHistoryMapper sysIntegralHistoryMapper;
private final ProductMapper productMapper;
private final OrderMapper orderMapper;
@Override
public Map<String, Object> getCount() {
Map<String, Object> result = new HashMap<>(16);
//用户视频举报提现
addBasicStatistics(result);
//商品店铺订单
addCompositeStatistics(result);
// Top20排行榜
addTop20Statistics(result);
// 月度趋势统计
addMonthlyTrendStatistics(result);
return result;
}
private void addBasicStatistics(Map<String, Object> result) {
result.put("memberCount", memberService.getCount());
result.put("vlogCount", vlogMapper.countVlog());
// 待审核举报
result.put("feedbackCount", feedbackService.count(
new QueryWrapper<Feedback>().eq("status", 0)
));
// 待审核提现
result.put("WithdrawCount", withdrawService.count(
new QueryWrapper<Withdraw>().eq("audit_status", 0)
));
}
private void addCompositeStatistics(Map<String, Object> result) {
// 商品统计
Map<String, Object> productCounts = productMapper.countProduct();
if(productCounts!=null){
result.put("productCount", productCounts.get("count2"));
result.put("productAudit", productCounts.get("count1"));
}
// 店铺统计
Map<String, Object> storeCounts = sysTenantMapper.countProduct();
if(storeCounts!=null){
result.put("storeCount", storeCounts.get("count1"));
result.put("StoreAudit", storeCounts.get("count2"));
}
// 订单统计
Map<String, Object> orderCounts = orderMapper.countOrder();
if(orderCounts!=null){
result.put("orderCount", orderCounts.get("count1"));
result.put("orderAudit", orderCounts.get("count2"));
}
}
/** Top20排行榜 */
private void addTop20Statistics(Map<String, Object> result) {
result.put("top20Stores", sysTenantMapper.getTop20Stores());
result.put("top20Product", productMapper.getTop20Product());
}
/** 月度趋势统计 */
private void addMonthlyTrendStatistics(Map<String, Object> result) {
result.put("monthlyUserVolume", systemStatisticsMapper.getMonthlyUserVolume());
result.put("monthlyVlog", vlogMapper.getMonthlyVlog());
result.put("monthlyIncomeExpense", sysIntegralHistoryMapper.getIncomeExpense());
}
}

View File

@ -3,6 +3,7 @@ package org.dromara.web.service.impl;
import cn.dev33.satoken.secure.BCrypt; import cn.dev33.satoken.secure.BCrypt;
import cn.dev33.satoken.stp.SaLoginModel; import cn.dev33.satoken.stp.SaLoginModel;
import cn.dev33.satoken.stp.StpUtil; import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@ -51,12 +52,17 @@ public class PasswordAuthStrategy implements IAuthStrategy {
public LoginVo login(String body, SysClientVo client) { public LoginVo login(String body, SysClientVo client) {
PasswordLoginBody loginBody = JsonUtils.parseObject(body, PasswordLoginBody.class); PasswordLoginBody loginBody = JsonUtils.parseObject(body, PasswordLoginBody.class);
ValidatorUtils.validate(loginBody); ValidatorUtils.validate(loginBody);
String tenantId = loginBody.getTenantId();
String username = loginBody.getUsername(); String username = loginBody.getUsername();
String password = loginBody.getPassword(); String password = loginBody.getPassword();
String code = loginBody.getCode(); String code = loginBody.getCode();
String uuid = loginBody.getUuid(); String uuid = loginBody.getUuid();
// 多租户时页面不在选择租户,后端通过用户名查询用户的默认租户
String tenantId = userMapper.selectTenantIdByUserName(username);
Assert.notBlank(tenantId, () -> new UserException("登录用户:" + username + " 不存在."));
// 校验租户
if (!"app".equals(client.getClientKey())) {
loginService.checkTenant(tenantId);
}
boolean captchaEnabled = captchaProperties.getEnable(); boolean captchaEnabled = captchaProperties.getEnable();
// 验证码开关 // 验证码开关
if (captchaEnabled) { if (captchaEnabled) {

View File

@ -4,14 +4,19 @@ import cn.dev33.satoken.stp.SaLoginModel;
import cn.dev33.satoken.stp.StpUtil; import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.wzj.soopin.member.domain.po.Member;
import com.wzj.soopin.member.mapper.MemberMapper;
import com.wzj.soopin.member.service.MemberRegisterService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.constant.Constants; import org.dromara.common.core.constant.Constants;
import org.dromara.common.core.constant.GlobalConstants; import org.dromara.common.core.constant.GlobalConstants;
import org.dromara.common.core.constant.SystemConstants; import org.dromara.common.core.constant.SystemConstants;
import org.dromara.common.core.domain.model.LoginUser; import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.domain.model.RegisterBody;
import org.dromara.common.core.domain.model.SmsLoginBody; import org.dromara.common.core.domain.model.SmsLoginBody;
import org.dromara.common.core.enums.LoginType; import org.dromara.common.core.enums.LoginType;
import org.dromara.common.core.enums.UserType;
import org.dromara.common.core.exception.user.CaptchaExpireException; import org.dromara.common.core.exception.user.CaptchaExpireException;
import org.dromara.common.core.exception.user.UserException; import org.dromara.common.core.exception.user.UserException;
import org.dromara.common.core.utils.MessageUtils; import org.dromara.common.core.utils.MessageUtils;
@ -20,7 +25,6 @@ import org.dromara.common.core.utils.ValidatorUtils;
import org.dromara.common.json.utils.JsonUtils; import org.dromara.common.json.utils.JsonUtils;
import org.dromara.common.redis.utils.RedisUtils; import org.dromara.common.redis.utils.RedisUtils;
import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.system.domain.SysUser; import org.dromara.system.domain.SysUser;
import org.dromara.system.domain.vo.SysClientVo; import org.dromara.system.domain.vo.SysClientVo;
import org.dromara.system.domain.vo.SysUserVo; import org.dromara.system.domain.vo.SysUserVo;
@ -42,6 +46,9 @@ public class SmsAuthStrategy implements IAuthStrategy {
private final SysLoginService loginService; private final SysLoginService loginService;
private final SysUserMapper userMapper; private final SysUserMapper userMapper;
private final MemberMapper memberMapper;
private final MemberRegisterService memberRegisterService;
@Override @Override
public LoginVo login(String body, SysClientVo client) { public LoginVo login(String body, SysClientVo client) {
@ -50,12 +57,7 @@ public class SmsAuthStrategy implements IAuthStrategy {
String tenantId = loginBody.getTenantId(); String tenantId = loginBody.getTenantId();
String phonenumber = loginBody.getPhonenumber(); String phonenumber = loginBody.getPhonenumber();
String smsCode = loginBody.getSmsCode(); String smsCode = loginBody.getSmsCode();
LoginUser loginUser = TenantHelper.dynamic(tenantId, () -> { LoginUser loginUser = checkUser(client, phonenumber, smsCode);
SysUserVo user = loadUserByPhonenumber(phonenumber);
loginService.checkLogin(LoginType.SMS, tenantId, user.getUserName(), () -> !validateSmsCode(tenantId, phonenumber, smsCode));
// 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了
return loginService.buildLoginUser(user);
});
loginUser.setClientKey(client.getClientKey()); loginUser.setClientKey(client.getClientKey());
loginUser.setDeviceType(client.getDeviceType()); loginUser.setDeviceType(client.getDeviceType());
SaLoginModel model = new SaLoginModel(); SaLoginModel model = new SaLoginModel();
@ -69,12 +71,63 @@ public class SmsAuthStrategy implements IAuthStrategy {
LoginHelper.login(loginUser, model); LoginHelper.login(loginUser, model);
LoginVo loginVo = new LoginVo(); LoginVo loginVo = new LoginVo();
loginVo.setUserId(loginUser.getUserId());
loginVo.setAccessToken(StpUtil.getTokenValue()); loginVo.setAccessToken(StpUtil.getTokenValue());
loginVo.setExpireIn(StpUtil.getTokenTimeout()); loginVo.setExpireIn(StpUtil.getTokenTimeout());
loginVo.setClientId(client.getClientId()); loginVo.setClientId(client.getClientId());
loginVo.setUserSig(loginUser.getUserSig());
return loginVo; return loginVo;
} }
private LoginUser checkUser(SysClientVo client, String phonenumber, String smsCode) {
if("app".equals(client.getClientKey())){
//会员登录
Member member = loadMemberByPhonenumber(phonenumber);
//手机号登录如果没有则创建一个
if (member == null) {
RegisterBody registerBody = new RegisterBody();
registerBody.setPhoneNumber(phonenumber);
registerBody.setCode(smsCode);
registerBody.setUserType(UserType.APP_USER.getUserType());
registerBody.setClientId(client.getClientId());
registerBody.setUuid(phonenumber);
member = memberRegisterService.register(registerBody);
return loginService.buildLoginUser(member);
} else {
loginService.checkLogin(LoginType.SMS, "tenantId", member.getUserName(), () -> !validateSmsCode("tenantId", phonenumber, smsCode));
// 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了
LoginUser user=loginService.buildLoginUser(member);
//检查member是否绑定了用户如果有则获取用户信息
if(ObjectUtil.isNotEmpty(member.getUserId())){
SysUserVo sysUser = userMapper.selectVoById(member.getUserId());
if(ObjectUtil.isNotEmpty(sysUser)){
user.setTenantId(sysUser.getTenantId());
}
}
// 获取会员绑定团长的租户id
if(member.getSpreadUid() != null){
user.setReferenceTenantId(memberMapper.getReferenceTenantIdBySpreadUid(member.getSpreadUid()));
}
return user;
}
}else{
//管理员登录
SysUserVo user = loadUserByPhonenumber(phonenumber);
loginService.checkLogin(LoginType.SMS, user.getTenantId(), user.getUserName(), () -> !validateSmsCode("tenantId", phonenumber, smsCode));
// 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了
return loginService.buildLoginUser(user);
}
}
private void checkMemberLogin(){
}
/** /**
* 校验短信验证码 * 校验短信验证码
*/ */
@ -98,5 +151,19 @@ public class SmsAuthStrategy implements IAuthStrategy {
} }
return user; return user;
} }
private Member loadMemberByPhonenumber(String phonenumber) {
Member user = memberMapper.selectOne(new LambdaQueryWrapper<Member>().eq(Member::getPhoneHidden, phonenumber));
if (ObjectUtil.isNull(user)) {
log.info("登录用户:{} 不存在.", phonenumber);
return null;
} else if (org.dromara.common.core.domain.event.Constants.MEMBER_ACCOUNT_STATUS.FORBIDDEN.equals(user.getStatus())) {
log.info("登录用户:{} 已被停用.", phonenumber);
throw new UserException("user.blocked", phonenumber);
} else if (org.dromara.common.core.domain.event.Constants.MEMBER_ACCOUNT_STATUS.REVOKED.equals(user.getStatus())) {
log.warn("已注销的用户:{} 重新登录", phonenumber);
memberMapper.updateById(Member.builder().id(user.getId()).status(org.dromara.common.core.domain.event.Constants.MEMBER_ACCOUNT_STATUS.NORMAL).build());
}
return user;
}
} }

View File

@ -68,30 +68,22 @@ public class SocialAuthStrategy implements IAuthStrategy {
throw new ServiceException(response.getMsg()); throw new ServiceException(response.getMsg());
} }
AuthUser authUserData = response.getData(); AuthUser authUserData = response.getData();
if ("GITEE".equals(authUserData.getSource())) { // if ("GITEE".equals(authUserData.getSource())) {
// 如用户使用 gitee 登录顺手 star 给作者一点支持 拒绝白嫖 // // 如用户使用 gitee 登录顺手 star 给作者一点支持 拒绝白嫖
HttpUtil.createRequest(Method.PUT, "https://gitee.com/api/v5/user/starred/dromara/RuoYi-Vue-Plus") // HttpUtil.createRequest(Method.PUT, "https://gitee.com/api/v5/user/starred/dromara/RuoYi-Vue-Plus")
.formStr(MapUtil.of("access_token", authUserData.getToken().getAccessToken())) // .formStr(MapUtil.of("access_token", authUserData.getToken().getAccessToken()))
.executeAsync(); // .executeAsync();
HttpUtil.createRequest(Method.PUT, "https://gitee.com/api/v5/user/starred/dromara/RuoYi-Cloud-Plus") // HttpUtil.createRequest(Method.PUT, "https://gitee.com/api/v5/user/starred/dromara/RuoYi-Cloud-Plus")
.formStr(MapUtil.of("access_token", authUserData.getToken().getAccessToken())) // .formStr(MapUtil.of("access_token", authUserData.getToken().getAccessToken()))
.executeAsync(); // .executeAsync();
} // }
List<SysSocialVo> list = sysSocialService.selectByAuthId(authUserData.getSource() + authUserData.getUuid()); List<SysSocialVo> list = sysSocialService.selectByAuthId(authUserData.getSource() + authUserData.getUuid());
if (CollUtil.isEmpty(list)) { if (CollUtil.isEmpty(list)) {
throw new ServiceException("你还没有绑定第三方账号,绑定后才可以登录!"); throw new ServiceException("你还没有绑定第三方账号,绑定后才可以登录!");
} }
SysSocialVo social; SysSocialVo social = list.get(0);
if (TenantHelper.isEnable()) {
Optional<SysSocialVo> opt = StreamUtils.findAny(list, x -> x.getTenantId().equals(loginBody.getTenantId()));
if (opt.isEmpty()) {
throw new ServiceException("对不起,你没有权限登录当前租户!");
}
social = opt.get();
} else {
social = list.get(0);
}
LoginUser loginUser = TenantHelper.dynamic(social.getTenantId(), () -> { LoginUser loginUser = TenantHelper.dynamic(social.getTenantId(), () -> {
SysUserVo user = loadUser(social.getUserId()); SysUserVo user = loadUser(social.getUserId());
// 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了

View File

@ -1,8 +1,8 @@
--- # 监控中心配置 --- # 监控中心配置
spring.boot.admin.client: spring.boot.admin.client:
# 增加客户端开关 # 增加客户端开关
enabled: true enabled: false
url: http://localhost:9090/admin url: http://82.168.1.65:9090/admin
instance: instance:
service-host-type: IP service-host-type: IP
metadata: metadata:
@ -13,13 +13,13 @@ spring.boot.admin.client:
--- # snail-job 配置 --- # snail-job 配置
snail-job: snail-job:
enabled: true enabled: false
# 需要在 SnailJob 后台组管理创建对应名称的组,然后创建任务的时候选择对应的组,才能正确分派任务 # 需要在 SnailJob 后台组管理创建对应名称的组,然后创建任务的时候选择对应的组,才能正确分派任务
group: "ruoyi_group" group: "ruoyi_group"
# SnailJob 接入验证令牌 详见 script/sql/ry_job.sql `sj_group_config` 表 # SnailJob 接入验证令牌 详见 script/sql/ry_job.sql `sj_group_config` 表
token: "SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT" token: "SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT"
server: server:
host: 127.0.0.1 host: 192.168.1.65
port: 17888 port: 17888
# 命名空间UUID 详见 script/sql/ry_job.sql `sj_namespace`表`unique_id`字段 # 命名空间UUID 详见 script/sql/ry_job.sql `sj_namespace`表`unique_id`字段
namespace: ${spring.profiles.active} namespace: ${spring.profiles.active}
@ -49,9 +49,9 @@ spring:
driverClassName: com.mysql.cj.jdbc.Driver driverClassName: com.mysql.cj.jdbc.Driver
# jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562 # jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562
# rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题) # rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题)
url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true url: jdbc:mysql://82.156.121.2:13306/soopin?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
username: root username: wzj
password: root password: A085F27A43B0
# # 从库数据源 # # 从库数据源
# slave: # slave:
# lazy: true # lazy: true
@ -92,19 +92,19 @@ spring:
# 此属性控制池中连接的最长生命周期值0表示无限生命周期默认30分钟 # 此属性控制池中连接的最长生命周期值0表示无限生命周期默认30分钟
maxLifetime: 1800000 maxLifetime: 1800000
# 多久检查一次连接的活性 # 多久检查一次连接的活性
keepaliveTime: 30000 keepaliveTime: 300000
--- # redis 单机配置(单机与集群只能开启一个另一个需要注释掉) --- # redis 单机配置(单机与集群只能开启一个另一个需要注释掉)
spring.data: spring.data:
redis: redis:
# 地址 # 地址
host: localhost host: 82.156.121.2
# 端口默认为6379 # 端口默认为6379
port: 6379 port: 26379
# 数据库索引 # 数据库索引
database: 0 database: 0
# redis 密码必须配置 # 密码(如没有密码请注释掉)
password: ruoyi123 password: e4ea0caebfd2
# 连接超时时间 # 连接超时时间
timeout: 10s timeout: 10s
# 是否开启ssl # 是否开启ssl
@ -133,6 +133,30 @@ redisson:
# 发布和订阅连接池大小 # 发布和订阅连接池大小
subscriptionConnectionPoolSize: 50 subscriptionConnectionPoolSize: 50
--- # RocketMQ 配置
rocketmq:
# RocketMQ 服务器地址
name-server: 82.156.121.2:9876
# 生产者配置
producer:
# 生产者组名
group: wzj_dev
# 发送消息超时时间
send-message-timeout: 30000
# 消息最大长度
max-message-size: 4194304
# 消息发送失败重试次数
retry-times-when-send-failed: 3
# 异步消息发送失败重试次数
retry-times-when-send-async-failed: 3
# 消费者配置
consumer:
# 拉取消息最大数量
pull-batch-size: 10
# 消费者组 (系统模块)
group: wzj_dev
# 是否启动消费者
enabled: true
--- # mail 邮件发送 --- # mail 邮件发送
mail: mail:
enabled: false enabled: false
@ -182,84 +206,75 @@ sms:
config2: config2:
# 厂商标识,标定此配置是哪个厂商,详细请看厂商标识介绍部分 # 厂商标识,标定此配置是哪个厂商,详细请看厂商标识介绍部分
supplier: tencent supplier: tencent
access-key-id: 您的accessKey access-key-id: AKIDvhEVWHm0xe5JGxOZXGitnRovlKcfRzIN
access-key-secret: 您的accessKeySecret access-key-secret: qPhiTxA7oENFrCH5dvxiCQN4UdWAYgYA
signature: 您的短信签名 signature: 无终街天津科技
sdk-app-id: 您的sdkAppId sdk-app-id: 1400966042
--- # 三方授权 --- # 三方授权
justauth: justauth:
# 前端外网访问地址 # 前端外网访问地址
address: http://localhost:80 address: http://82.156.121.2:8880/
type: type:
maxkey: alipay_wallet: # 支付宝钱包
# maxkey 服务器地址
# 注意 如下均配置均不需要修改 maxkey 已经内置好了数据
server-url: http://sso.maxkey.top
client-id: 876892492581044224
client-secret: x1Y5MTMwNzIwMjMxNTM4NDc3Mzche8
redirect-uri: ${justauth.address}/social-callback?source=maxkey
topiam:
# topiam 服务器地址
server-url: http://127.0.0.1:1898/api/v1/authorize/y0q************spq***********8ol
client-id: 449c4*********937************759
client-secret: ac7***********1e0************28d
redirect-uri: ${justauth.address}/social-callback?source=topiam
scopes: [openid, email, phone, profile]
qq:
client-id: 10**********6
client-secret: 1f7d08**********5b7**********29e
redirect-uri: ${justauth.address}/social-callback?source=qq
union-id: false
weibo:
client-id: 10**********6
client-secret: 1f7d08**********5b7**********29e
redirect-uri: ${justauth.address}/social-callback?source=weibo
gitee:
client-id: 91436b7940090d09c72c7daf85b959cfd5f215d67eea73acbf61b6b590751a98
client-secret: 02c6fcfd70342980cd8dd2f2c06c1a350645d76c754d7a264c4e125f9ba915ac
redirect-uri: ${justauth.address}/social-callback?source=gitee
dingtalk:
client-id: 10**********6
client-secret: 1f7d08**********5b7**********29e
redirect-uri: ${justauth.address}/social-callback?source=dingtalk
baidu:
client-id: 10**********6
client-secret: 1f7d08**********5b7**********29e
redirect-uri: ${justauth.address}/social-callback?source=baidu
csdn:
client-id: 10**********6
client-secret: 1f7d08**********5b7**********29e
redirect-uri: ${justauth.address}/social-callback?source=csdn
coding:
client-id: 10**********6
client-secret: 1f7d08**********5b7**********29e
redirect-uri: ${justauth.address}/social-callback?source=coding
coding-group-name: xx
oschina:
client-id: 10**********6
client-secret: 1f7d08**********5b7**********29e
redirect-uri: ${justauth.address}/social-callback?source=oschina
alipay_wallet:
client-id: 10**********6 client-id: 10**********6
client-secret: 1f7d08**********5b7**********29e client-secret: 1f7d08**********5b7**********29e
redirect-uri: ${justauth.address}/social-callback?source=alipay_wallet redirect-uri: ${justauth.address}/social-callback?source=alipay_wallet
alipay-public-key: MIIB**************DAQAB alipay-public-key: MIIB**************DAQAB
wechat_open: wechat_open: # 微信开放平台
client-id: 10**********6 client-id: wxebcdaea31881caab
client-secret: 1f7d08**********5b7**********29e client-secret: 71826d76bad096ec5407897c6ed1391f
redirect-uri: ${justauth.address}/social-callback?source=wechat_open redirect-uri: ${justauth.address}/social-callback?source=wechat_open
wechat_mp: wechat_mp: # 微信小程序
client-id: 10**********6 client-id: 10**********6
client-secret: 1f7d08**********5b7**********29e client-secret: 1f7d08**********5b7**********29e
redirect-uri: ${justauth.address}/social-callback?source=wechat_mp redirect-uri: ${justauth.address}/social-callback?source=wechat_mp
wechat_enterprise: wechat_enterprise: # 微信企业
client-id: 10**********6 client-id: 10**********6
client-secret: 1f7d08**********5b7**********29e client-secret: 1f7d08**********5b7**********29e
redirect-uri: ${justauth.address}/social-callback?source=wechat_enterprise redirect-uri: ${justauth.address}/social-callback?source=wechat_enterprise
agent-id: 1000002 agent-id: 1000002
gitlab:
client-id: 10**********6
client-secret: 1f7d08**********5b7**********29e # 腾讯云IM配置
redirect-uri: ${justauth.address}/social-callback?source=gitlab tencent:
im:
enabled: true # 启用腾讯云IM
sdk-app-id: 1600080789 # 你的腾讯云 SDKAppID
secret-key: "311b5309d714a20f7f5b54360ee21b1e24ec208ebcd25ce8f47d24753bccc091" # 你的密钥
administrator: "administrator" # 管理员账号
expire-time: 604800 # UserSig 过期时间7天单位
# mongodb
data:
mongodb:
uri: 82.156.121.2:37017
database: wzj-shop
username: admin
password: A1969bf8
authentication-database: admin
# replica-set-name: mongoreplset
easypay:
api-path-prefix: https://d-phoenix-gap.easypay.com.cn:24443/yqt
req-id: D01X66666667068
certificate-id: 20250917
mcht-code: 631000000003325
easypay-public-key: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArgVerkGaSEQvZIOpLjeUoVpL0lSYLc04+txtPFtfm5r5XFbaNaf5Ahu0lziGEwWzrGONThSsnb3U9pqoY6BpqviN4h+Guw5oEdHr1T/eDkQD5urgQUaZA6lDoU9XC662r+0kpbKidvXIsK2CrShN+BF8HEJmRZuhglxh25OHWIWqQiUDjLZC+QJRZqUu9Uzy9RBBu7qa0f0xbqYl3hnYi+vH++SsyOavO2gUVQyKU5Kkt5ZJVpZFQvD3BXePgwJSpsvrjhj0hiYp2v6PScN9XHP1vXB4wtIYSFYwmVus1KkV/LfDzUm6zHjliHYTVl6lPMhveIVJlRIqInRZRHxg5QIDAQAB
merRsaPrivateKey: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCc1mku1mtfTc1vZM9z3TkRMZ9SaKP+6MdoQhjDHB9vJUOuG2Jnegej4gtzcm8MVYomV1azJMtCbPq4PN9aHegH13JthvrUPR3nAKp8AUp9Fh47ded//snNyAf7C7o8xKN5e7n89ROwacCAL2QDno76ngXzQQVj1TxY9pBdekZ03ezuDk1sv/u4FBlW8kRyaVdqyl4FdvP+EEljDe8gGxRikLyb3cK1B6G7w2BXgM/svft5SOoiqStx2XvgHRrFRB5w96TdoKNH9yxHU2clMJiz+5cej1VL6OHZspuY3cnPyJtyS+weYjDT+COLLBUe9UwbOV15DXDNpBLd34W4GiqtAgMBAAECggEAYaVwmVOwSAblp7wJGScb16OggStbJ2MAe93jEt7Yh1eZGrY7/xbP2O3smTUfBHvhZlusRB7dWf8F3l0v5iiGhRNTT/PhCPEARAl7G3emS9jQe869kkgslq06ose7bQg0i3dH5cEkQAqnameXClXWyRxHshrCY1SonO7uFPUDFtD2Z9GHu6dOWkOHfX7UETHV5/NTSqvner5M2YNsV/5To87zrmaeeNyvu91JgJSYofTD8IcMyhxcswxB9F3ECP7nulLDdCV+9mvE9zO0i4mPBxYb++87J0pu35TN9OY+gpiCK3Ed0gDqvvkTiCQEFu6y7OiqsQwy03CE5hAwWZR2YQKBgQDdb6e7+FWJSr9fIknfvZPPtKmbEkMHP1RYnVo3pmuVm14Z3UmostiSBRPMfVjeOX0N82SONM9P+1v9SDgSK3pL8rlk9Hx6D5KI7uj2IMtTVt00pO31KtxDLmXfgapDbWHK1RGEn1PDrnKYy5yOKJ8n0Wgp4lVEPIBN6uIud0A9iQKBgQC1UXdhEXFETyqEYWb9OnWbBjiVIw3D2/qW5c+WQGsHYdMEImC/0oTWIH9fKd4Azf26JjZ9nQvs5VcijJP6BXbGPqir5NgGVkwCj33PoNg4dDgIVE4BYaSp//7B6jCi5QiRTzCSOmUSkZ5L1Kz4SNEDe9r0MpLhxrsAzmR9aEJ/BQKBgHI71Ks63F2cSwd39+ZNtYA0cj7Gd/+4IvooCs+kseGXKj9rkkFOKj2CEwmuLHdP7vyQcHKQOdbIFFegtxRgi5G8oPm8yq5pdC3iGhpHJr1SlYFACGYu+zxJJlLcYIqyVf2+V3A0hZDwYLwEZjpMKHbxJ6xbz6MJFyObJZ3U9TYJAoGANXoGjJF5Z501u/+CQZN5VjSagZnqGGcL3G+BLx5msrGua9y7zjeHyCOjjWyqtnAKsllM3vVvq/nkHiN6DVaJNmUKmFARSqUvG944TAFzZAsa75H1w8CJsT34ZDbvC0wjn7/MYoRohPZ/ynu6XCwVwUJJTJaR7ZcQVmeJCdezLQUCgYEAszix6V9oL80Clb1nMwIly6I78+pcFKyk82yXxvySb6XPJvgoasbz9xYIeKlPyy6r8Aj/ujz5GVtDtkE6n6bsjekCdnUKUY3uTvFAX+YGQkuZnaPoisELJFI2Hal22tNnJyCOYh//AGAiHYpHNUKD4hsKBb45MhK1xwvTHpuLkdc=
trade-backUrl: http://82.156.121.2:8880/trans/easypay/trade/callback
wechat:
pay:
v3:
mch-id: 1658665710 # 商户号
mch-serial-no: 6BA681D9B219034D6F7851F57D61BE9317AB48FD # 商户证书序列号
api-v3-key: T9iE71aHSmjtM35z4bDLuU3gFX8s2I2h # APIv3密钥
private-key-path: "classpath:cert/apiclient_key.pem" # 商户私钥文件路径
transfer-notify-url: https://wuzhongjie.com.cn/prod-api/api/transfer/callback # 转账回调地址
app-id: wxebcdaea31881caab # 应用ID
secret: 86fbcab880e4066ac5c75af6f4f003c2 # 应用密钥
mini-program:
# app-id: wx87a5db19138da60d
# secret: 856ca8bae38ccaecc1353c9abedf6b41
app-id: wx2fb87f0f1f05d314
secret: 86fbcab880e4066ac5c75af6f4f003c2

View File

@ -0,0 +1,281 @@
--- # 监控中心配置
spring.boot.admin.client:
# 增加客户端开关
enabled: false
url: http://43.143.227.203:9090/admin
instance:
service-host-type: IP
metadata:
username: ${spring.boot.admin.client.username}
userpassword: ${spring.boot.admin.client.password}
username: @monitor.username@
password: @monitor.password@
--- # snail-job 配置
snail-job:
enabled: false
# 需要在 SnailJob 后台组管理创建对应名称的组,然后创建任务的时候选择对应的组,才能正确分派任务
group: "ruoyi_group"
# SnailJob 接入验证令牌 详见 script/sql/ry_job.sql `sj_group_config` 表
token: "SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT"
server:
host: 43.143.227.203
port: 17888
# 命名空间UUID 详见 script/sql/ry_job.sql `sj_namespace`表`unique_id`字段
namespace: ${spring.profiles.active}
# 随主应用端口漂移
port: 2${server.port}
# 客户端ip指定
host:
# RPC类型: netty, grpc
rpc-type: grpc
--- # 数据源配置
spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource
# 动态数据源文档 https://www.kancloud.cn/tracy5546/dynamic-datasource/content
dynamic:
# 性能分析插件(有性能损耗 不建议生产环境使用)
p6spy: true
# 设置默认的数据源或者数据源组,默认值即为 master
primary: master
# 严格模式 匹配不到数据源则报错
strict: true
datasource:
# 主库数据源
master:
type: ${spring.datasource.type}
driverClassName: com.mysql.cj.jdbc.Driver
# jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562
# rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题)
url: jdbc:mysql://43.143.227.203:13306/soopin?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
username: wzj
password: A085F27A43B0
# # 从库数据源
# slave:
# lazy: true
# type: ${spring.datasource.type}
# driverClassName: com.mysql.cj.jdbc.Driver
# url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
# username:
# password:
# oracle:
# type: ${spring.datasource.type}
# driverClassName: oracle.jdbc.OracleDriver
# url: jdbc:oracle:thin:@//localhost:1521/XE
# username: ROOT
# password: root
# postgres:
# type: ${spring.datasource.type}
# driverClassName: org.postgresql.Driver
# url: jdbc:postgresql://localhost:5432/postgres?useUnicode=true&characterEncoding=utf8&useSSL=true&autoReconnect=true&reWriteBatchedInserts=true
# username: root
# password: root
# sqlserver:
# type: ${spring.datasource.type}
# driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
# url: jdbc:sqlserver://localhost:1433;DatabaseName=tempdb;SelectMethod=cursor;encrypt=false;rewriteBatchedStatements=true
# username: SA
# password: root
hikari:
# 最大连接池数量
maxPoolSize: 20
# 最小空闲线程数量
minIdle: 10
# 配置获取连接等待超时的时间
connectionTimeout: 30000
# 校验超时时间
validationTimeout: 5000
# 空闲连接存活最大时间默认10分钟
idleTimeout: 600000
# 此属性控制池中连接的最长生命周期值0表示无限生命周期默认30分钟
maxLifetime: 1800000
# 多久检查一次连接的活性
keepaliveTime: 300000
--- # redis 单机配置(单机与集群只能开启一个另一个需要注释掉)
spring.data:
redis:
# 地址
host: 43.143.227.203
# 端口默认为6379
port: 16379
# 数据库索引
database: 2
# 密码(如没有密码请注释掉)
password: e4ea0caebfd2
# 连接超时时间
timeout: 10s
# 是否开启ssl
ssl.enabled: false
# redisson 配置
redisson:
# redis key前缀
keyPrefix:
# 线程池数量
threads: 4
# Netty线程池数量
nettyThreads: 8
# 单节点配置
singleServerConfig:
# 客户端名称 不能用中文
clientName: RuoYi-Vue-Plus
# 最小空闲连接数
connectionMinimumIdleSize: 8
# 连接池大小
connectionPoolSize: 32
# 连接空闲超时,单位:毫秒
idleConnectionTimeout: 10000
# 命令等待超时,单位:毫秒
timeout: 3000
# 发布和订阅连接池大小
subscriptionConnectionPoolSize: 50
--- # RocketMQ 配置
rocketmq:
# RocketMQ 服务器地址
name-server: 43.143.227.203:9876
# 生产者配置
producer:
# 生产者组名
group: wzj_prod
# 发送消息超时时间
send-message-timeout: 30000
# 消息最大长度
max-message-size: 4194304
# 消息发送失败重试次数
retry-times-when-send-failed: 3
# 异步消息发送失败重试次数
retry-times-when-send-async-failed: 3
# 消费者配置
consumer:
# 拉取消息最大数量
pull-batch-size: 10
# 消费者组 (系统模块)
group: wzj_prod
# 是否启动消费者
enabled: false
--- # mail 邮件发送
mail:
enabled: false
host: smtp.163.com
port: 465
# 是否需要用户名密码验证
auth: true
# 发送方遵循RFC-822标准
from: xxx@163.com
# 用户名注意如果使用foxmail邮箱此处user为qq号
user: xxx@163.com
# 密码注意某些邮箱需要为SMTP服务单独设置密码详情查看相关帮助
pass: xxxxxxxxxx
# 使用 STARTTLS安全连接STARTTLS是对纯文本通信协议的扩展。
starttlsEnable: true
# 使用SSL安全连接
sslEnable: true
# SMTP超时时长单位毫秒缺省值不超时
timeout: 0
# Socket连接超时值单位毫秒缺省值不超时
connectionTimeout: 0
--- # sms 短信 支持 阿里云 腾讯云 云片 等等各式各样的短信服务商
# https://sms4j.com/doc3/ 差异配置文档地址 支持单厂商多配置,可以配置多个同时使用
sms:
# 配置源类型用于标定配置来源(interface,yaml)
config-type: yaml
# 用于标定yml中的配置是否开启短信拦截接口配置不受此限制
restricted: true
# 短信拦截限制单手机号每分钟最大发送,只对开启了拦截的配置有效
minute-max: 1
# 短信拦截限制单手机号每日最大发送量,只对开启了拦截的配置有效
account-max: 30
# 以下配置来自于 org.dromara.sms4j.provider.config.BaseConfig类中
blends:
# 唯一ID 用于发送短信寻找具体配置 随便定义别用中文即可
# 可以同时存在两个相同厂商 例如: ali1 ali2 两个不同的阿里短信账号 也可用于区分租户
config1:
# 框架定义的厂商名称标识,标定此配置是哪个厂商,详细请看厂商标识介绍部分
supplier: alibaba
# 有些称为accessKey有些称之为apiKey也有称为sdkKey或者appId。
access-key-id: 您的accessKey
# 称为accessSecret有些称之为apiSecret
access-key-secret: 您的accessKeySecret
signature: 您的短信签名
sdk-app-id: 您的sdkAppId
config2:
# 厂商标识,标定此配置是哪个厂商,详细请看厂商标识介绍部分
supplier: tencent
access-key-id: AKIDvhEVWHm0xe5JGxOZXGitnRovlKcfRzIN
access-key-secret: qPhiTxA7oENFrCH5dvxiCQN4UdWAYgYA
signature: 无终街天津科技
sdk-app-id: 1400966042
--- # 三方授权
justauth:
# 前端外网访问地址
address: http://82.156.121.2:8880/
type:
alipay_wallet: # 支付宝钱包
client-id: 10**********6
client-secret: 1f7d08**********5b7**********29e
redirect-uri: ${justauth.address}/social-callback?source=alipay_wallet
alipay-public-key: MIIB**************DAQAB
wechat_open: # 微信开放平台
client-id: wxebcdaea31881caab
client-secret: 71826d76bad096ec5407897c6ed1391f
redirect-uri: ${justauth.address}/social-callback?source=wechat_open
wechat_mp: # 微信小程序
client-id: 10**********6
client-secret: 1f7d08**********5b7**********29e
redirect-uri: ${justauth.address}/social-callback?source=wechat_mp
wechat_enterprise: # 微信企业
client-id: 10**********6
client-secret: 1f7d08**********5b7**********29e
redirect-uri: ${justauth.address}/social-callback?source=wechat_enterprise
agent-id: 1000002
# 腾讯云IM配置
tencent:
im:
enabled: true # 启用腾讯云IM
sdk-app-id: 1600080789 # 你的腾讯云 SDKAppID
secret-key: "311b5309d714a20f7f5b54360ee21b1e24ec208ebcd25ce8f47d24753bccc091" # 你的密钥
administrator: "administrator" # 管理员账号
expire-time: 604800 # UserSig 过期时间7天单位
# mongodb
data:
mongodb:
uri: 82.156.121.2:37017
database: wzj-shop
username: admin
password: A1969bf8
authentication-database: admin
# replica-set-name: mongoreplset
easypay:
api-path-prefix: https://phoenix.eycard.cn/yqt
req-id: D01X00000801861
certificate-id: 20250917
mcht-code: 531000022034161
easypay-public-key: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCLLVY70e67BcK4V08P+69dfBeMmMYDopf3HF9G6meqPTVxyGYlEb0XwT0UA6g8t2HzG8FaKgTFKgOvhr+EFbBcF+AYdrgFYZSjR4hWBkWiOyKC66wQ7kQhYzC4kwetcDp5TftJfSivbAC1Lm8/Gf2+ZpaDuHDPjLCFS2gQYI5dqwIDAQAB
merRsaPrivateKey: MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDLgDEh0hsPTmHLdEYp6LCo3LMnXMLCV+wUxRn5lvcAa7gn8RZyLDGiT5WdR0SpJDbBhWL1WbnUd7dJulzjbb0N5NzrO3HntjzKIpzhfChw3BBtM3PR8xvS17Wt4vRN6JvY4w0sphKesxbHWiMHUTOzKrQBEdXasMujmxV0N9R2GzTLK0Pn4ROWCzeQQhiJ2oOc3Eqkus9/C+3LcxkU08nF/q0X/kzHGS+Gn+JL/Eo6vpQExg7rQs0mnrKvNuPPGKpyKNpRmKWtiA8GTBeFnwZlP8kYj9Z8NYxLsT6fJnqpZ8wZ++T2PS7CIIo6JSIKz0ElNrRRD2Ei7lyCZAjUBQLLAgMBAAECggEBAIRjGhOBhx8XA+IC+55KBZtlMJub6gvafPgqHbLUtk2sxjodylduTr/j/FY8RfuvVnvhFba9r3n8g93QApvmCUafq+TQYFK4qKVrjRnX1stNLtaL0X41JNWuhT/hVMPWXoTjeO+h/p0Frvzzs7QP7I1Ta5UCkFhcCa6etn9Lzskh0uXe4ylMmt5lAuvFAeIuE5icMxu4n75RXUVxaBSOKjQ0ujQWMh46ncrX0f9oGkDbWE37LF61sf2iuXpPwnIAwk/e/zOpnCi9EHOJtCJbVr+ncDRvlZsEf5hVnxYgT2bQrUrSD9An5e4zgJF6rigsDhmNfvp0W/bJnXPIIg1MYbECgYEA5MlizB9XmttiaAo9sMjAUE18cxgEq2pIU8l8WOj//XAsf64AlrlWJxpJdNYkfdRiinnRIxroo1cYx3RMWqdGbYVk+7DJBNut6R0bg0oGgJoeBFnCe/xNGsBk7MZwc4//5sfRC2rbtuYFPn8VkNB5HllhddD51L6lObAp4Uf14/MCgYEA47TX4AmgcAjhVCUvC4ZUuiqAku/suw0vkG6FNxuSYY5GezPvwWx0JviaohaIm5JkgjNNASFhx12XG+PZoPDNGi9vzotVkI69LnOdlf3imVaJR7u5H8730Thbdd5oKi66KYXJGv3hppwh7qAu8VkdMavvCT24jILNiGiA0OBOE8kCgYA5JoFSgiXNHi5X1O8SISPBK4oB6icIdtU4cOVqBFImCgZjoqCtBgEaZXuh/vhAonQ3KTTv8wHYA6LB+DA2mQCDzUWrhb7BQusPh2DfC/fR2i3TYmStuhm8rADKEMv4YilHifSTSI84Af+fW/mUIi+PQD6TQq+V0EXPwkzD5MjstwKBgQDZZ5SlBwvza8cXe9kK+9pxVJslr4UqolBDagIut1hvZFPO1auX1WCgxMN+9ly/jGoCFdDzv1eH7ceUjVr/2mk5EwmA/m9XcbEWZLSUvK5ZENJJduYthIH/c/t+8jYp8Cs18dIsvzFuzatoFfA75oWFI086V3+YSFrMXlp/E2n4YQKBgQCKiynvzcRA8GoK6ibGhwUc5lpVUOVqpIdmVG5bXbnKYoU7Jkf2pOUwzLQGKOj9KS1Z80jkZA9p22BLKD/VXF0PvGBhx1Ujpil1vd96I/KcGRsmCu3b3AxK7qzDt6Y0nVk5bN72RYq4F/iRU+ijoIAuLsyrn/e0eaJweiqzr/gK4g==
trade-backUrl: http://43.143.227.203:8880/trans/easypay/trade/callback
wechat:
pay:
v3:
mch-id: 1658665710 # 商户号
mch-serial-no: 6BA681D9B219034D6F7851F57D61BE9317AB48FD # 商户证书序列号
api-v3-key: T9iE71aHSmjtM35z4bDLuU3gFX8s2I2h # APIv3密钥
private-key-path: "classpath:cert/apiclient_key.pem" # 商户私钥文件路径
transfer-notify-url: https://wuzhongjie.com.cn/prod-api/trans/withdraw/callback # 转账回调地址
app-id: wxebcdaea31881caab # 应用ID
secret: 71826d76bad096ec5407897c6ed1391f # 应用密钥
callback-url: https://wuzhongjie.com.cn/prod-api/app/payment/callback/WECHAT
mini-program:
# app-id: wx87a5db19138da60d
# secret: 856ca8bae38ccaecc1353c9abedf6b41
app-id: wx2fb87f0f1f05d314
secret: 86fbcab880e4066ac5c75af6f4f003c2

View File

@ -1,11 +1,8 @@
--- # 临时文件存储位置 避免临时文件被系统清理报错
spring.servlet.multipart.location: /ruoyi/server/temp
--- # 监控中心配置 --- # 监控中心配置
spring.boot.admin.client: spring.boot.admin.client:
# 增加客户端开关 # 增加客户端开关
enabled: true enabled: false
url: http://localhost:9090/admin url: http://43.143.227.203:9090/admin
instance: instance:
service-host-type: IP service-host-type: IP
metadata: metadata:
@ -16,13 +13,13 @@ spring.boot.admin.client:
--- # snail-job 配置 --- # snail-job 配置
snail-job: snail-job:
enabled: true enabled: false
# 需要在 SnailJob 后台组管理创建对应名称的组,然后创建任务的时候选择对应的组,才能正确分派任务 # 需要在 SnailJob 后台组管理创建对应名称的组,然后创建任务的时候选择对应的组,才能正确分派任务
group: "ruoyi_group" group: "ruoyi_group"
# SnailJob 接入验证令牌 详见 script/sql/ry_job.sql `sj_group_config` # SnailJob 接入验证令牌 详见 script/sql/ry_job.sql `sj_group_config`
token: "SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT" token: "SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT"
server: server:
host: 127.0.0.1 host: 43.143.227.203
port: 17888 port: 17888
# 命名空间UUID 详见 script/sql/ry_job.sql `sj_namespace`表`unique_id`字段 # 命名空间UUID 详见 script/sql/ry_job.sql `sj_namespace`表`unique_id`字段
namespace: ${spring.profiles.active} namespace: ${spring.profiles.active}
@ -40,7 +37,7 @@ spring:
# 动态数据源文档 https://www.kancloud.cn/tracy5546/dynamic-datasource/content # 动态数据源文档 https://www.kancloud.cn/tracy5546/dynamic-datasource/content
dynamic: dynamic:
# 性能分析插件(有性能损耗 不建议生产环境使用) # 性能分析插件(有性能损耗 不建议生产环境使用)
p6spy: false p6spy: true
# 设置默认的数据源或者数据源组,默认值即为 master # 设置默认的数据源或者数据源组,默认值即为 master
primary: master primary: master
# 严格模式 匹配不到数据源则报错 # 严格模式 匹配不到数据源则报错
@ -52,35 +49,35 @@ spring:
driverClassName: com.mysql.cj.jdbc.Driver driverClassName: com.mysql.cj.jdbc.Driver
# jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562 # jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562
# rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题) # rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题)
url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true url: jdbc:mysql://mysql:3306/soopin?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
username: root username: wzj_prod
password: root password: Kp8$rT2*jQ6$sH4%
# # 从库数据源 # # 从库数据源
# slave: # slave:
# lazy: true # lazy: true
# type: ${spring.datasource.type} # type: ${spring.datasource.type}
# driverClassName: com.mysql.cj.jdbc.Driver # driverClassName: com.mysql.cj.jdbc.Driver
# url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
# username: # username:
# password: # password:
# oracle: # oracle:
# type: ${spring.datasource.type} # type: ${spring.datasource.type}
# driverClassName: oracle.jdbc.OracleDriver # driverClassName: oracle.jdbc.OracleDriver
# url: jdbc:oracle:thin:@//localhost:1521/XE # url: jdbc:oracle:thin:@//localhost:1521/XE
# username: ROOT # username: ROOT
# password: root # password: root
# postgres: # postgres:
# type: ${spring.datasource.type} # type: ${spring.datasource.type}
# driverClassName: org.postgresql.Driver # driverClassName: org.postgresql.Driver
# url: jdbc:postgresql://localhost:5432/postgres?useUnicode=true&characterEncoding=utf8&useSSL=true&autoReconnect=true&reWriteBatchedInserts=true # url: jdbc:postgresql://localhost:5432/postgres?useUnicode=true&characterEncoding=utf8&useSSL=true&autoReconnect=true&reWriteBatchedInserts=true
# username: root # username: root
# password: root # password: root
# sqlserver: # sqlserver:
# type: ${spring.datasource.type} # type: ${spring.datasource.type}
# driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver # driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
# url: jdbc:sqlserver://localhost:1433;DatabaseName=tempdb;SelectMethod=cursor;encrypt=false;rewriteBatchedStatements=true # url: jdbc:sqlserver://localhost:1433;DatabaseName=tempdb;SelectMethod=cursor;encrypt=false;rewriteBatchedStatements=true
# username: SA # username: SA
# password: root # password: root
hikari: hikari:
# 最大连接池数量 # 最大连接池数量
maxPoolSize: 20 maxPoolSize: 20
@ -95,19 +92,19 @@ spring:
# 此属性控制池中连接的最长生命周期值0表示无限生命周期默认30分钟 # 此属性控制池中连接的最长生命周期值0表示无限生命周期默认30分钟
maxLifetime: 1800000 maxLifetime: 1800000
# 多久检查一次连接的活性 # 多久检查一次连接的活性
keepaliveTime: 30000 keepaliveTime: 300000
--- # redis 单机配置(单机与集群只能开启一个另一个需要注释掉) --- # redis 单机配置(单机与集群只能开启一个另一个需要注释掉)
spring.data: spring.data:
redis: redis:
# 地址 # 地址
host: localhost host: redis
# 端口默认为6379 # 端口默认为6379
port: 6379 port: 6379
# 数据库索引 # 数据库索引
database: 0 database: 2
# redis 密码必须配置 # 密码(如没有密码请注释掉)
password: ruoyi123 password: e4ea0caebfd2
# 连接超时时间 # 连接超时时间
timeout: 10s timeout: 10s
# 是否开启ssl # 是否开启ssl
@ -118,17 +115,17 @@ redisson:
# redis key前缀 # redis key前缀
keyPrefix: keyPrefix:
# 线程池数量 # 线程池数量
threads: 16 threads: 4
# Netty线程池数量 # Netty线程池数量
nettyThreads: 32 nettyThreads: 8
# 单节点配置 # 单节点配置
singleServerConfig: singleServerConfig:
# 客户端名称 不能用中文 # 客户端名称 不能用中文
clientName: RuoYi-Vue-Plus clientName: RuoYi-Vue-Plus
# 最小空闲连接数 # 最小空闲连接数
connectionMinimumIdleSize: 32 connectionMinimumIdleSize: 8
# 连接池大小 # 连接池大小
connectionPoolSize: 64 connectionPoolSize: 32
# 连接空闲超时,单位:毫秒 # 连接空闲超时,单位:毫秒
idleConnectionTimeout: 10000 idleConnectionTimeout: 10000
# 命令等待超时,单位:毫秒 # 命令等待超时,单位:毫秒
@ -136,6 +133,30 @@ redisson:
# 发布和订阅连接池大小 # 发布和订阅连接池大小
subscriptionConnectionPoolSize: 50 subscriptionConnectionPoolSize: 50
--- # RocketMQ 配置
rocketmq:
# RocketMQ 服务器地址
name-server: rocketmq-namesrv:9876
# 生产者配置
producer:
# 生产者组名
group: wzj_prod
# 发送消息超时时间
send-message-timeout: 30000
# 消息最大长度
max-message-size: 4194304
# 消息发送失败重试次数
retry-times-when-send-failed: 3
# 异步消息发送失败重试次数
retry-times-when-send-async-failed: 3
# 消费者配置
consumer:
# 拉取消息最大数量
pull-batch-size: 10
# 消费者组 (系统模块)
group: wzj_prod
# 是否启动消费者
enabled: true
--- # mail 邮件发送 --- # mail 邮件发送
mail: mail:
enabled: false enabled: false
@ -185,83 +206,76 @@ sms:
config2: config2:
# 厂商标识,标定此配置是哪个厂商,详细请看厂商标识介绍部分 # 厂商标识,标定此配置是哪个厂商,详细请看厂商标识介绍部分
supplier: tencent supplier: tencent
access-key-id: 您的accessKey access-key-id: AKIDvhEVWHm0xe5JGxOZXGitnRovlKcfRzIN
access-key-secret: 您的accessKeySecret access-key-secret: qPhiTxA7oENFrCH5dvxiCQN4UdWAYgYA
signature: 您的短信签名 signature: 无终街天津科技
sdk-app-id: 您的sdkAppId sdk-app-id: 1400966042
--- # 三方授权 --- # 三方授权
justauth: justauth:
# 前端外网访问地址 # 前端外网访问地址
address: http://localhost:80 address: http://82.156.121.2:8880/
type: type:
maxkey: alipay_wallet: # 支付宝钱包
# maxkey 服务器地址
# 注意 如下均配置均不需要修改 maxkey 已经内置好了数据
server-url: http://sso.maxkey.top
client-id: 876892492581044224
client-secret: x1Y5MTMwNzIwMjMxNTM4NDc3Mzche8
redirect-uri: ${justauth.address}/social-callback?source=maxkey
topiam:
# topiam 服务器地址
server-url: http://127.0.0.1:1989/api/v1/authorize/y0q************spq***********8ol
client-id: 449c4*********937************759
client-secret: ac7***********1e0************28d
redirect-uri: ${justauth.address}/social-callback?source=topiam
scopes: [ openid, email, phone, profile ]
qq:
client-id: 10**********6
client-secret: 1f7d08**********5b7**********29e
redirect-uri: ${justauth.address}/social-callback?source=qq
union-id: false
weibo:
client-id: 10**********6
client-secret: 1f7d08**********5b7**********29e
redirect-uri: ${justauth.address}/social-callback?source=weibo
gitee:
client-id: 91436b7940090d09c72c7daf85b959cfd5f215d67eea73acbf61b6b590751a98
client-secret: 02c6fcfd70342980cd8dd2f2c06c1a350645d76c754d7a264c4e125f9ba915ac
redirect-uri: ${justauth.address}/social-callback?source=gitee
dingtalk:
client-id: 10**********6
client-secret: 1f7d08**********5b7**********29e
redirect-uri: ${justauth.address}/social-callback?source=dingtalk
baidu:
client-id: 10**********6
client-secret: 1f7d08**********5b7**********29e
redirect-uri: ${justauth.address}/social-callback?source=baidu
csdn:
client-id: 10**********6
client-secret: 1f7d08**********5b7**********29e
redirect-uri: ${justauth.address}/social-callback?source=csdn
coding:
client-id: 10**********6
client-secret: 1f7d08**********5b7**********29e
redirect-uri: ${justauth.address}/social-callback?source=coding
coding-group-name: xx
oschina:
client-id: 10**********6
client-secret: 1f7d08**********5b7**********29e
redirect-uri: ${justauth.address}/social-callback?source=oschina
alipay_wallet:
client-id: 10**********6 client-id: 10**********6
client-secret: 1f7d08**********5b7**********29e client-secret: 1f7d08**********5b7**********29e
redirect-uri: ${justauth.address}/social-callback?source=alipay_wallet redirect-uri: ${justauth.address}/social-callback?source=alipay_wallet
alipay-public-key: MIIB**************DAQAB alipay-public-key: MIIB**************DAQAB
wechat_open: wechat_open: # 微信开放平台
client-id: 10**********6 client-id: wxebcdaea31881caab
client-secret: 1f7d08**********5b7**********29e client-secret: 71826d76bad096ec5407897c6ed1391f
redirect-uri: ${justauth.address}/social-callback?source=wechat_open redirect-uri: ${justauth.address}/social-callback?source=wechat_open
wechat_mp: wechat_mp: # 微信小程序
client-id: 10**********6 client-id: 10**********6
client-secret: 1f7d08**********5b7**********29e client-secret: 1f7d08**********5b7**********29e
redirect-uri: ${justauth.address}/social-callback?source=wechat_mp redirect-uri: ${justauth.address}/social-callback?source=wechat_mp
wechat_enterprise: wechat_enterprise: # 微信企业
client-id: 10**********6 client-id: 10**********6
client-secret: 1f7d08**********5b7**********29e client-secret: 1f7d08**********5b7**********29e
redirect-uri: ${justauth.address}/social-callback?source=wechat_enterprise redirect-uri: ${justauth.address}/social-callback?source=wechat_enterprise
agent-id: 1000002 agent-id: 1000002
gitlab:
client-id: 10**********6
client-secret: 1f7d08**********5b7**********29e # 腾讯云IM配置
redirect-uri: ${justauth.address}/social-callback?source=gitlab tencent:
im:
enabled: true # 启用腾讯云IM
sdk-app-id: 1600080789 # 你的腾讯云 SDKAppID
secret-key: "311b5309d714a20f7f5b54360ee21b1e24ec208ebcd25ce8f47d24753bccc091" # 你的密钥
administrator: "administrator" # 管理员账号
expire-time: 604800 # UserSig 过期时间7天单位
# mongodb
data:
mongodb:
uri: 82.156.121.2:37017
database: wzj-shop
username: admin
password: A1969bf8
authentication-database: admin
# replica-set-name: mongoreplset
easypay:
api-path-prefix: https://phoenix.eycard.cn/yqt
req-id: D01X00000801861
certificate-id: 20250917
mcht-code: 531000022034161
easypay-public-key: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCLLVY70e67BcK4V08P+69dfBeMmMYDopf3HF9G6meqPTVxyGYlEb0XwT0UA6g8t2HzG8FaKgTFKgOvhr+EFbBcF+AYdrgFYZSjR4hWBkWiOyKC66wQ7kQhYzC4kwetcDp5TftJfSivbAC1Lm8/Gf2+ZpaDuHDPjLCFS2gQYI5dqwIDAQAB
merRsaPrivateKey: MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDLgDEh0hsPTmHLdEYp6LCo3LMnXMLCV+wUxRn5lvcAa7gn8RZyLDGiT5WdR0SpJDbBhWL1WbnUd7dJulzjbb0N5NzrO3HntjzKIpzhfChw3BBtM3PR8xvS17Wt4vRN6JvY4w0sphKesxbHWiMHUTOzKrQBEdXasMujmxV0N9R2GzTLK0Pn4ROWCzeQQhiJ2oOc3Eqkus9/C+3LcxkU08nF/q0X/kzHGS+Gn+JL/Eo6vpQExg7rQs0mnrKvNuPPGKpyKNpRmKWtiA8GTBeFnwZlP8kYj9Z8NYxLsT6fJnqpZ8wZ++T2PS7CIIo6JSIKz0ElNrRRD2Ei7lyCZAjUBQLLAgMBAAECggEBAIRjGhOBhx8XA+IC+55KBZtlMJub6gvafPgqHbLUtk2sxjodylduTr/j/FY8RfuvVnvhFba9r3n8g93QApvmCUafq+TQYFK4qKVrjRnX1stNLtaL0X41JNWuhT/hVMPWXoTjeO+h/p0Frvzzs7QP7I1Ta5UCkFhcCa6etn9Lzskh0uXe4ylMmt5lAuvFAeIuE5icMxu4n75RXUVxaBSOKjQ0ujQWMh46ncrX0f9oGkDbWE37LF61sf2iuXpPwnIAwk/e/zOpnCi9EHOJtCJbVr+ncDRvlZsEf5hVnxYgT2bQrUrSD9An5e4zgJF6rigsDhmNfvp0W/bJnXPIIg1MYbECgYEA5MlizB9XmttiaAo9sMjAUE18cxgEq2pIU8l8WOj//XAsf64AlrlWJxpJdNYkfdRiinnRIxroo1cYx3RMWqdGbYVk+7DJBNut6R0bg0oGgJoeBFnCe/xNGsBk7MZwc4//5sfRC2rbtuYFPn8VkNB5HllhddD51L6lObAp4Uf14/MCgYEA47TX4AmgcAjhVCUvC4ZUuiqAku/suw0vkG6FNxuSYY5GezPvwWx0JviaohaIm5JkgjNNASFhx12XG+PZoPDNGi9vzotVkI69LnOdlf3imVaJR7u5H8730Thbdd5oKi66KYXJGv3hppwh7qAu8VkdMavvCT24jILNiGiA0OBOE8kCgYA5JoFSgiXNHi5X1O8SISPBK4oB6icIdtU4cOVqBFImCgZjoqCtBgEaZXuh/vhAonQ3KTTv8wHYA6LB+DA2mQCDzUWrhb7BQusPh2DfC/fR2i3TYmStuhm8rADKEMv4YilHifSTSI84Af+fW/mUIi+PQD6TQq+V0EXPwkzD5MjstwKBgQDZZ5SlBwvza8cXe9kK+9pxVJslr4UqolBDagIut1hvZFPO1auX1WCgxMN+9ly/jGoCFdDzv1eH7ceUjVr/2mk5EwmA/m9XcbEWZLSUvK5ZENJJduYthIH/c/t+8jYp8Cs18dIsvzFuzatoFfA75oWFI086V3+YSFrMXlp/E2n4YQKBgQCKiynvzcRA8GoK6ibGhwUc5lpVUOVqpIdmVG5bXbnKYoU7Jkf2pOUwzLQGKOj9KS1Z80jkZA9p22BLKD/VXF0PvGBhx1Ujpil1vd96I/KcGRsmCu3b3AxK7qzDt6Y0nVk5bN72RYq4F/iRU+ijoIAuLsyrn/e0eaJweiqzr/gK4g==
trade-backUrl: http://43.143.227.203:8880/trans/easypay/trade/callback
wechat:
pay:
v3:
mch-id: 1658665710 # 商户号
mch-serial-no: 6BA681D9B219034D6F7851F57D61BE9317AB48FD # 商户证书序列号
api-v3-key: T9iE71aHSmjtM35z4bDLuU3gFX8s2I2h # APIv3密钥
private-key-path: "/java/cert/apiclient_key.pem" # 商户私钥文件路径
transfer-notify-url: https://wuzhongjie.com.cn/prod-api/trans/withdraw/callback # 转账回调地址
app-id: wxebcdaea31881caab # 应用ID
secret: 71826d76bad096ec5407897c6ed1391f # 应用密钥
callback-url: https://wuzhongjie.com.cn/prod-api/app/payment/callback/WECHAT
mini-program:
# app-id: wx87a5db19138da60d
# secret: 856ca8bae38ccaecc1353c9abedf6b41
app-id: wx2fb87f0f1f05d314
secret: 86fbcab880e4066ac5c75af6f4f003c2

View File

@ -32,13 +32,25 @@ captcha:
# 字符验证码长度 # 字符验证码长度
charLength: 4 charLength: 4
pagehelper:
helperDialect: mysql
supportMethodsArguments: true
params: count=countSql
# 日志配置 # 日志配置
logging: logging:
level: level:
org.dromara: @logging.level@ org.dromara: @logging.level@
org.springframework: warn com.wzj.soopin: @logging.level@
org.mybatis.spring.mapper: error org.apache.http.wire: @logging.level@
org.apache.fury: warn org.springframework: @logging.level@
org.mybatis.spring: @logging.level@
com.baomidou: @logging.level@
org.apache.fury: @logging.level@
org.redisson: @logging.level@
com.zaxxer.hikari.pool: @logging.level@
software.amazon.awssdk.transfer: @logging.level@
com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor: @logging.level@
config: classpath:logback-plus.xml config: classpath:logback-plus.xml
# 用户配置 # 用户配置
@ -67,9 +79,9 @@ spring:
servlet: servlet:
multipart: multipart:
# 单个文件大小 # 单个文件大小
max-file-size: 10MB max-file-size: 300MB
# 设置总上传的文件大小 # 设置总上传的文件大小
max-request-size: 20MB max-request-size: 300MB
mvc: mvc:
# 设置静态资源路径 防止所有请求都去查静态资源 # 设置静态资源路径 防止所有请求都去查静态资源
static-path-pattern: /static/** static-path-pattern: /static/**
@ -94,7 +106,7 @@ sa-token:
# 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录) # 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录)
is-concurrent: true is-concurrent: true
# 在多人登录同一账号时是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token) # 在多人登录同一账号时是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token)
is-share: false is-share: true
# jwt秘钥 # jwt秘钥
jwt-secret-key: abcdefghijklmnopqrstuvwxyz jwt-secret-key: abcdefghijklmnopqrstuvwxyz
@ -108,9 +120,18 @@ security:
- /**/*.js - /**/*.js
- /favicon.ico - /favicon.ico
- /error - /error
- /webjars/**
- /swagger-resources/**
- /*/api-docs - /*/api-docs
- /*/api-docs/** - /*/api-docs/**
- /warm-flow-ui/token-name - /warm-flow-ui/token-name
- /app/**
- /resource/oss/**
- /callback/api
- /cms/vlog/vodCallBack
- /api/transfer/callback
- /trans/withdraw/callback
- /app/payment/callback/*
# 多租户配置 # 多租户配置
tenant: tenant:
@ -119,14 +140,77 @@ tenant:
# 排除表 # 排除表
excludes: excludes:
- sys_menu - sys_menu
- cont_users
- cont_vlog
- cont_comment
- cont_my_liked_vlog
- ums_fans
- sys_tenant - sys_tenant
- sys_tenant_package - sys_tenant_package
- aws_system_statistics
- act_integral_history
- sys_role_dept - sys_role_dept
- sys_role_menu - sys_role_menu
- sys_user_post - sys_user_post
- sys_user_role - sys_user_role
- sys_user_tenant
- sys_message
- sys_client - sys_client
- sys_oss_config - sys_oss_config
- ums_member
- ums_member_address
- ums_member_login_info
- ums_cart
- ums_account
- ums_account_change_record
- sys_message_template
- sys_message_user
- ums_fans
- ums_block
- ums_forbidden
- ums_member_bank
- ums_tenant_forbidden
- oms_aftersale
- oms_aftersale_item
- oms_order
- oms_order_delivery_history
- oms_order_item
- oms_order_operate_history
- oms_wechat_payment_history
- pms_brand
- pms_product_category
- pms_product_snapshot
- pms_sku
- pms_sku_snapshot
- oms_verification_codes
- oms_verification_logs
- ums_feedback
- trans_account_bill
- trans_charge
- trans_withdraw
- trans_divide
- trans_divide_detail
- trans_divide_rule
- trans_divide_rule_detail
- trans_pay_order
- cont_vlog_member
- aws_system_statistics
- act_integral_history
- sys_version
- ums_member_wechat
- sys_tenant_extend
- sys_commission_template
- sys_commission_rate_range
- oms_red_packet
- oms_red_packet_receive
- sys_commission_template
- sys_commission_rate_range
- cont_article
- cont_article_category
-
# MyBatisPlus配置 # MyBatisPlus配置
# https://baomidou.com/config/ # https://baomidou.com/config/
@ -134,11 +218,11 @@ mybatis-plus:
# 自定义配置 是否全局开启逻辑删除 关闭后 所有逻辑删除功能将失效 # 自定义配置 是否全局开启逻辑删除 关闭后 所有逻辑删除功能将失效
enableLogicDelete: true enableLogicDelete: true
# 多包名使用 例如 org.dromara.**.mapper,org.xxx.**.mapper # 多包名使用 例如 org.dromara.**.mapper,org.xxx.**.mapper
mapperPackage: org.dromara.**.mapper mapperPackage: org.dromara.**.mapper,com.wzj.soopin.**.mapper
# 对应的 XML 文件位置 # 对应的 XML 文件位置
mapperLocations: classpath*:mapper/**/*Mapper.xml mapperLocations: classpath*:mapper/**/*Mapper.xml,classpath*:mapper/**/*.xml
# 实体扫描多个package用逗号或者分号分隔 # 实体扫描多个package用逗号或者分号分隔
typeAliasesPackage: org.dromara.**.domain typeAliasesPackage: org.dromara.**.domain,com.wzj.soopin.**.domain
global-config: global-config:
dbConfig: dbConfig:
# 主键类型 # 主键类型
@ -155,7 +239,7 @@ mybatis-encryptor:
# 编码方式 BASE64/HEX。默认BASE64 # 编码方式 BASE64/HEX。默认BASE64
encode: BASE64 encode: BASE64
# 安全秘钥 对称算法的秘钥 如AESSM4 # 安全秘钥 对称算法的秘钥 如AESSM4
password: password: 123456
# 公私钥 非对称算法的公私钥 如SM2RSA # 公私钥 非对称算法的公私钥 如SM2RSA
publicKey: publicKey:
privateKey: privateKey:
@ -177,9 +261,15 @@ springdoc:
api-docs: api-docs:
# 是否开启接口文档 # 是否开启接口文档
enabled: true enabled: true
# swagger-ui: # 文档路径
# # 持久化认证数据 path: /v3/api-docs
# persistAuthorization: true swagger-ui:
# 文档路径
path: /swagger-ui/index.html
# 持久化认证数据
persistAuthorization: true
# 是否启用
enabled: true
info: info:
# 标题 # 标题
title: '标题RuoYi-Vue-Plus多租户管理系统_接口文档' title: '标题RuoYi-Vue-Plus多租户管理系统_接口文档'
@ -201,17 +291,27 @@ springdoc:
name: ${sa-token.token-name} name: ${sa-token.token-name}
#这里定义了两个分组,可定义多个,也可以不定义 #这里定义了两个分组,可定义多个,也可以不定义
group-configs: group-configs:
- group: 1.演示模块 - group: 1.会员模块
packages-to-scan: org.dromara.demo packages-to-scan: com.wzj.soopin.member
- group: 2.通用模块 - group: 2.订单模块
packages-to-scan: org.dromara.web packages-to-scan: com.wzj.soopin.order
- group: 3.系统模块 - group: 3.商品模块
packages-to-scan: com.wzj.soopin.goods
- group: 4.内容模块
packages-to-scan: com.wzj.soopin.content
- group: 5.交易模块
packages-to-scan: com.wzj.soopin.transaction
- group: 6.IM模块
packages-to-scan: com.wzj.soopin.im
- group: 7.系统模块
packages-to-scan: org.dromara.system packages-to-scan: org.dromara.system
- group: 4.代码生成模块 - group: 8.app会员模块
packages-to-scan: org.dromara.generator packages-to-scan: org.dromara.app.customer
- group: 5.工作流模块 - group: 9.app商户模块
packages-to-scan: org.dromara.workflow packages-to-scan: org.dromara.app.merchant
legacy-mode: true
knife4j:
enable: true
# 防止XSS攻击 # 防止XSS攻击
xss: xss:
# 过滤开关 # 过滤开关
@ -219,6 +319,8 @@ xss:
# 排除链接(多个用逗号分隔) # 排除链接(多个用逗号分隔)
excludeUrls: excludeUrls:
- /system/notice - /system/notice
- /pms/product/add
- /pms/product/update
# 全局线程池相关配置 # 全局线程池相关配置
# 如使用JDK21请直接使用虚拟线程 不要开启此配置 # 如使用JDK21请直接使用虚拟线程 不要开启此配置
@ -279,3 +381,24 @@ warm-flow:
- 255,205,23 - 255,205,23
## 已办理 ## 已办理
- 157,255,0 - 157,255,0
# 腾讯云配置
tencent:
cloud:
secret-id: "AKIDvhEVWHm0xe5JGxOZXGitnRovlKcfRzIN"
secret-key: "qPhiTxA7oENFrCH5dvxiCQN4UdWAYgYA"
region: ap-guangzhou # 默认广州地区
vod:
app-id: 1323742234 # 点播应用ID
http:
client:
connect-timeout: 10s
read-timeout: 30s
vlog:
storage-path: /data/vlogdata/
prefix: vlog_
suffix: .mp4

Binary file not shown.

View File

@ -0,0 +1,25 @@
-----BEGIN CERTIFICATE-----
MIIEKzCCAxOgAwIBAgIUa6aB2bIZA01veFH1fWG+kxerSP0wDQYJKoZIhvcNAQEL
BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT
FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg
Q0EwHhcNMjMxMTA2MDkwODIwWhcNMjgxMTA0MDkwODIwWjCBhDETMBEGA1UEAwwK
MTY1ODY2NTcxMDEbMBkGA1UECgwS5b6u5L+h5ZWG5oi357O757ufMTAwLgYDVQQL
DCfml6Dnu4jooZfvvIjlpKnmtKXvvInnp5HmioDmnInpmZDlhazlj7gxCzAJBgNV
BAYMAkNOMREwDwYDVQQHDAhTaGVuWmhlbjCCASIwDQYJKoZIhvcNAQEBBQADggEP
ADCCAQoCggEBAPIJ7lvlud4KUXNjQb044xtoBWuF516f8h2mPrtIMkrKb4R9gKbE
OaRFbeGOL5FAcRS0jWYtEoWgRrQ1EVim0Lhlqq5OAAiKtgTphW0ZSiK4dauhzFMI
WByO/KalzzwKWFT0iFHP4UqiWZL1g9Dw9BUiJM3EnutQ7gP9d2wAm8h4Ltoo4Mfm
RA5IqQzlItXrNMEr/iHpAsPEWuQOviVuut2xJHhm7blgWqg0IwtdljvSYGXE77Hv
Cjr1RCVxTC8xtmKc8X5kaKEXH1d9fFH8sovyTF5pOiYZEkhOybtJE626etHbrVhk
Nl0YDS1o9ypNrcYIQe/Um9JuCqxOl6H/Uh0CAwEAAaOBuTCBtjAJBgNVHRMEAjAA
MAsGA1UdDwQEAwID+DCBmwYDVR0fBIGTMIGQMIGNoIGKoIGHhoGEaHR0cDovL2V2
Y2EuaXRydXMuY29tLmNuL3B1YmxpYy9pdHJ1c2NybD9DQT0xQkQ0MjIwRTUwREJD
MDRCMDZBRDM5NzU0OTg0NkMwMUMzRThFQkQyJnNnPUhBQ0M0NzFCNjU0MjJFMTJC
MjdBOUQzM0E4N0FEMUNERjU5MjZFMTQwMzcxMA0GCSqGSIb3DQEBCwUAA4IBAQCv
bdw6QwSePVI64eTddCW8pY9Dbi66IjUcqgvjwDzHIUQCMx0NHBGJRCmN0f/f5xpM
nVg4I7RAkQ7WgFM78+MYUFJ5II368El8vTnhzRQ3Fv27v22G1EE/RAl7cQF9VB0X
j1gaB09pPqfMD40Mg522CNh7NNVqCPr3mlTAj2PMalCT7VhDDqUxmqm9RtBd9ARN
FMqx+FrUuFR5Y0N5o0OVcMbGcl8/krLqeUSZwy1Y42+KbViEqRxjTTOJEw/0B6TS
6nUIBddt24ucWnOmlkhfs8Xf4YbLSP52H9EfSOgZ4vZ2OZ0kBngbZzZgLSFM2LNk
UEBJbv+ElQBvKr2GP+EC
-----END CERTIFICATE-----

View File

@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDyCe5b5bneClFz
Y0G9OOMbaAVrheden/Idpj67SDJKym+EfYCmxDmkRW3hji+RQHEUtI1mLRKFoEa0
NRFYptC4ZaquTgAIirYE6YVtGUoiuHWrocxTCFgcjvympc88ClhU9IhRz+FKolmS
9YPQ8PQVIiTNxJ7rUO4D/XdsAJvIeC7aKODH5kQOSKkM5SLV6zTBK/4h6QLDxFrk
Dr4lbrrdsSR4Zu25YFqoNCMLXZY70mBlxO+x7wo69UQlcUwvMbZinPF+ZGihFx9X
fXxR/LKL8kxeaTomGRJITsm7SROtunrR261YZDZdGA0taPcqTa3GCEHv1JvSbgqs
Tpeh/1IdAgMBAAECggEBAOqp3kOS8yXn8xhgf3gqE2aa78ZTyQLhKCi+6ctCMCB7
LKvT0kvdq9Usy2AILu4xAHIGq6EIyhBsWKCXYv4EnhBp4ZWlYjrl4ZvZnNct0cbf
+JYzBJrsWCE4MJSR5d5cWU/k1dYcKl3mEdp91xNYyg1DUVN+8mVLzbhoosQ/wsoU
eQUOld/ldLJeXHNv+yy3ow8osMvka0grDXQG4X6VFBDVQeBDt3+kheLkCD1caTQ3
JRaABO9WBnir7wsTwaDQLgoPdxzhxSvi9NjKHkM+Vph+NujMIUt57i3xVlcfj+dG
op+6rwcBP6F/8SQasU8Nbvjt5omc05/U6a8DesgkboECgYEA+zLWFhfwCZFZJGgs
8iLFbiYsQL2Wew4wN854atN5qUeew+tYz91LPDX/VWcH9xI5iXmP+tU7x0hASFhM
N0z0VqRWoKBANnAeQ6+0QRHIqJUujC7YEgv35ZdiwEBZ4K5A+gaW444SO/O8j4pL
ou8vnYjh48T1YQ88VCoki2k3oukCgYEA9qpGMYdSBZi5Hafw4A2oq2QDRPS3IONO
VTVRZFUjS1qRGeSfRdydPkLZp9g9rewMnEVCLHr+f8Ij6PdGxuWd5XaiPGIUAeru
ozwi750bzzXWuLIoUJIM9WoQCeW58Lfcm5nqsIvOSPs1F5uOkbzvfyN1LSlDUesU
Jn9nXHrsLRUCgYAjuBPXKmo4ghGB6spRV/5o7kamog7OyrKyjMp0rkODfaqmw0Vq
sVXsZuU62J66VD4YPU/q4/1PFggGAYA88NVhqJak2oSm+QRkrYxdIFE/H49x4YtZ
7Ze/bupc2gmtuDmHE/7Ktr4DBmKOqqScs5Q6u2cbgzs9JPR4J1Hw/PIrWQKBgEmq
CFR6STCKr53/rZv7+EdXEvLg8l/MAnTH+4qvMl8qqPLGqBpBDGSvqjjKB4GNYSa6
OEz4XlDhNcA5ONXldQY2K7VExRzdgG8XYoeUr91uArYd3pRRSbVw+2E5ThJplmSR
ztjyp6R8ARsPxcAYYJ3jhPb7v7MTNW1Z1xBzVV0RAoGBAOyuU/VZh/8m3qW4DyHU
FQWsBaTCy++XY2BZBItcrOqtMbUuDV70Uv01DIz0Lye/ne/IEUsHEEKuUJxhAHyV
Ozm4GeWNA9PylIgisR57McnoFbpdHhkQ7HEtGL9j0C7MmupFSuRuVy8Fi5cdJYZa
C0KwAgwpfhp35P+XWf+v4TRH
-----END PRIVATE KEY-----

View File

@ -0,0 +1,3 @@
-----BEGIN PRIVATE KEY-----
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDLgDEh0hsPTmHLdEYp6LCo3LMnXMLCV+wUxRn5lvcAa7gn8RZyLDGiT5WdR0SpJDbBhWL1WbnUd7dJulzjbb0N5NzrO3HntjzKIpzhfChw3BBtM3PR8xvS17Wt4vRN6JvY4w0sphKesxbHWiMHUTOzKrQBEdXasMujmxV0N9R2GzTLK0Pn4ROWCzeQQhiJ2oOc3Eqkus9/C+3LcxkU08nF/q0X/kzHGS+Gn+JL/Eo6vpQExg7rQs0mnrKvNuPPGKpyKNpRmKWtiA8GTBeFnwZlP8kYj9Z8NYxLsT6fJnqpZ8wZ++T2PS7CIIo6JSIKz0ElNrRRD2Ei7lyCZAjUBQLLAgMBAAECggEBAIRjGhOBhx8XA+IC+55KBZtlMJub6gvafPgqHbLUtk2sxjodylduTr/j/FY8RfuvVnvhFba9r3n8g93QApvmCUafq+TQYFK4qKVrjRnX1stNLtaL0X41JNWuhT/hVMPWXoTjeO+h/p0Frvzzs7QP7I1Ta5UCkFhcCa6etn9Lzskh0uXe4ylMmt5lAuvFAeIuE5icMxu4n75RXUVxaBSOKjQ0ujQWMh46ncrX0f9oGkDbWE37LF61sf2iuXpPwnIAwk/e/zOpnCi9EHOJtCJbVr+ncDRvlZsEf5hVnxYgT2bQrUrSD9An5e4zgJF6rigsDhmNfvp0W/bJnXPIIg1MYbECgYEA5MlizB9XmttiaAo9sMjAUE18cxgEq2pIU8l8WOj//XAsf64AlrlWJxpJdNYkfdRiinnRIxroo1cYx3RMWqdGbYVk+7DJBNut6R0bg0oGgJoeBFnCe/xNGsBk7MZwc4//5sfRC2rbtuYFPn8VkNB5HllhddD51L6lObAp4Uf14/MCgYEA47TX4AmgcAjhVCUvC4ZUuiqAku/suw0vkG6FNxuSYY5GezPvwWx0JviaohaIm5JkgjNNASFhx12XG+PZoPDNGi9vzotVkI69LnOdlf3imVaJR7u5H8730Thbdd5oKi66KYXJGv3hppwh7qAu8VkdMavvCT24jILNiGiA0OBOE8kCgYA5JoFSgiXNHi5X1O8SISPBK4oB6icIdtU4cOVqBFImCgZjoqCtBgEaZXuh/vhAonQ3KTTv8wHYA6LB+DA2mQCDzUWrhb7BQusPh2DfC/fR2i3TYmStuhm8rADKEMv4YilHifSTSI84Af+fW/mUIi+PQD6TQq+V0EXPwkzD5MjstwKBgQDZZ5SlBwvza8cXe9kK+9pxVJslr4UqolBDagIut1hvZFPO1auX1WCgxMN+9ly/jGoCFdDzv1eH7ceUjVr/2mk5EwmA/m9XcbEWZLSUvK5ZENJJduYthIH/c/t+8jYp8Cs18dIsvzFuzatoFfA75oWFI086V3+YSFrMXlp/E2n4YQKBgQCKiynvzcRA8GoK6ibGhwUc5lpVUOVqpIdmVG5bXbnKYoU7Jkf2pOUwzLQGKOj9KS1Z80jkZA9p22BLKD/VXF0PvGBhx1Ujpil1vd96I/KcGRsmCu3b3AxK7qzDt6Y0nVk5bN72RYq4F/iRU+ijoIAuLsyrn/e0eaJweiqzr/gK4g==
-----END PRIVATE KEY-----

View File

@ -0,0 +1 @@
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy4AxIdIbD05hy3RGKeiwqNyzJ1zCwlfsFMUZ+Zb3AGu4J/EWciwxok+VnUdEqSQ2wYVi9Vm51He3Sbpc4229DeTc6ztx57Y8yiKc4XwocNwQbTNz0fMb0te1reL0Teib2OMNLKYSnrMWx1ojB1Ezsyq0ARHV2rDLo5sVdDfUdhs0yytD5+ETlgs3kEIYidqDnNxKpLrPfwvty3MZFNPJxf6tF/5Mxxkvhp/iS/xKOr6UBMYO60LNJp6yrzbjzxiqcijaUZilrYgPBkwXhZ8GZT/JGI/WfDWMS7E+nyZ6qWfMGfvk9j0uwiCKOiUiCs9BJTa0UQ9hIu5cgmQI1AUCywIDAQAB

View File

@ -16,11 +16,17 @@
<!-- 控制台输出 --> <!-- 控制台输出 -->
<appender name="file_console" class="ch.qos.logback.core.rolling.RollingFileAppender"> <appender name="file_console" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-console.log</file> <file>${log.path}/sys-console.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 日志文件名格式 --> <!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/sys-console.%d{yyyy-MM-dd}.log</fileNamePattern> <fileNamePattern>${log.path}/sys-console.%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
<!-- 日志最大 1天 --> <!-- 日志最大 1天 -->
<maxHistory>1</maxHistory> <maxHistory>7</maxHistory>
<!-- 日志文件最大大小 -->
<maxFileSize>10MB</maxFileSize>
<!-- 启动时清理历史日志 -->
<cleanHistoryOnStart>true</cleanHistoryOnStart>
<!-- 总日志文件大小限制 -->
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy> </rollingPolicy>
<encoder> <encoder>
<pattern>${log.pattern}</pattern> <pattern>${log.pattern}</pattern>
@ -28,19 +34,25 @@
</encoder> </encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<!-- 过滤的级别 --> <!-- 过滤的级别 -->
<level>INFO</level> <level>debug</level>
</filter> </filter>
</appender> </appender>
<!-- 系统日志输出 --> <!-- 系统日志输出 -->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender"> <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-info.log</file> <file>${log.path}/sys-info.log</file>
<!-- 循环政策:基于时间创建日志文件 --> <!-- 循环政策:基于时间和大小创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 日志文件名格式 --> <!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern> <fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
<!-- 日志最大的历史 60天 --> <!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory> <maxHistory>60</maxHistory>
<!-- 日志文件最大大小 -->
<maxFileSize>10MB</maxFileSize>
<!-- 启动时清理历史日志 -->
<cleanHistoryOnStart>true</cleanHistoryOnStart>
<!-- 总日志文件大小限制 -->
<totalSizeCap>5GB</totalSizeCap>
</rollingPolicy> </rollingPolicy>
<encoder> <encoder>
<pattern>${log.pattern}</pattern> <pattern>${log.pattern}</pattern>
@ -57,12 +69,18 @@
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender"> <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-error.log</file> <file>${log.path}/sys-error.log</file>
<!-- 循环政策:基于时间创建日志文件 --> <!-- 循环政策:基于时间和大小创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 日志文件名格式 --> <!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern> <fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
<!-- 日志最大的历史 60天 --> <!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory> <maxHistory>60</maxHistory>
<!-- 日志文件最大大小 -->
<maxFileSize>10MB</maxFileSize>
<!-- 启动时清理历史日志 -->
<cleanHistoryOnStart>true</cleanHistoryOnStart>
<!-- 总日志文件大小限制 -->
<totalSizeCap>5GB</totalSizeCap>
</rollingPolicy> </rollingPolicy>
<encoder> <encoder>
<pattern>${log.pattern}</pattern> <pattern>${log.pattern}</pattern>
@ -98,32 +116,32 @@
</appender> </appender>
<!-- 整合 skywalking 控制台输出 tid --> <!-- 整合 skywalking 控制台输出 tid -->
<!-- <appender name="console" class="ch.qos.logback.core.ConsoleAppender">--> <!-- <appender name="console" class="ch.qos.logback.core.ConsoleAppender">-->
<!-- <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">--> <!-- <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">-->
<!-- <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">--> <!-- <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">-->
<!-- <pattern>[%tid] ${console.log.pattern}</pattern>--> <!-- <pattern>[%tid] ${console.log.pattern}</pattern>-->
<!-- </layout>--> <!-- </layout>-->
<!-- <charset>utf-8</charset>--> <!-- <charset>utf-8</charset>-->
<!-- </encoder>--> <!-- </encoder>-->
<!-- </appender>--> <!-- </appender>-->
<!-- 整合 skywalking 推送采集日志 --> <!-- 整合 skywalking 推送采集日志 -->
<!-- <appender name="sky_log" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">--> <!-- <appender name="sky_log" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">-->
<!-- <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">--> <!-- <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">-->
<!-- <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">--> <!-- <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">-->
<!-- <pattern>[%tid] ${console.log.pattern}</pattern>--> <!-- <pattern>[%tid] ${console.log.pattern}</pattern>-->
<!-- </layout>--> <!-- </layout>-->
<!-- <charset>utf-8</charset>--> <!-- <charset>utf-8</charset>-->
<!-- </encoder>--> <!-- </encoder>-->
<!-- </appender>--> <!-- </appender>-->
<!--系统操作日志--> <!--系统操作日志-->
<root level="info"> <root level="debug">
<appender-ref ref="console" /> <appender-ref ref="console" />
<appender-ref ref="async_info" /> <appender-ref ref="async_info" />
<appender-ref ref="async_error" /> <appender-ref ref="async_error" />
<appender-ref ref="file_console" /> <appender-ref ref="file_console" />
<!-- <appender-ref ref="sky_log"/>--> <!-- <appender-ref ref="sky_log"/>-->
</root> </root>
</configuration> </configuration>

View File

@ -34,6 +34,8 @@
<module>ruoyi-common-tenant</module> <module>ruoyi-common-tenant</module>
<module>ruoyi-common-websocket</module> <module>ruoyi-common-websocket</module>
<module>ruoyi-common-sse</module> <module>ruoyi-common-sse</module>
<module>ruoyi-common-mongo</module>
<module>ruoyi-common-mq</module>
</modules> </modules>
<artifactId>ruoyi-common</artifactId> <artifactId>ruoyi-common</artifactId>

View File

@ -88,11 +88,24 @@
<artifactId>mapstruct-plus-spring-boot-starter</artifactId> <artifactId>mapstruct-plus-spring-boot-starter</artifactId>
</dependency> </dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
</dependency>
<!-- 离线IP地址定位库 --> <!-- 离线IP地址定位库 -->
<dependency> <dependency>
<groupId>org.lionsoul</groupId> <groupId>org.lionsoul</groupId>
<artifactId>ip2region</artifactId> <artifactId>ip2region</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-crypto</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
</dependency>
</dependencies> </dependencies>

View File

@ -0,0 +1,124 @@
package org.dromara.common.core.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* 读取项目相关配置
*
* @author ruoyi
*/
@Component
@ConfigurationProperties(prefix = "ruoyi")
public class RuoYiConfig
{
/** 项目名称 */
private String name;
/** 版本 */
private String version;
/** 版权年份 */
private String copyrightYear;
/** 实例演示开关 */
private boolean demoEnabled;
/** 上传路径 */
private static String profile;
/** 获取地址开关 */
private static boolean addressEnabled;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getVersion()
{
return version;
}
public void setVersion(String version)
{
this.version = version;
}
public String getCopyrightYear()
{
return copyrightYear;
}
public void setCopyrightYear(String copyrightYear)
{
this.copyrightYear = copyrightYear;
}
public boolean isDemoEnabled()
{
return demoEnabled;
}
public void setDemoEnabled(boolean demoEnabled)
{
this.demoEnabled = demoEnabled;
}
public static String getProfile()
{
return profile;
}
public void setProfile(String profile)
{
RuoYiConfig.profile = profile;
}
public static boolean isAddressEnabled()
{
return addressEnabled;
}
public void setAddressEnabled(boolean addressEnabled)
{
RuoYiConfig.addressEnabled = addressEnabled;
}
/**
* 获取导入上传路径
*/
public static String getImportPath()
{
return getProfile() + "/import";
}
/**
* 获取头像上传路径
*/
public static String getAvatarPath()
{
return getProfile() + "/avatar";
}
/**
* 获取下载路径
*/
public static String getDownloadPath()
{
return getProfile() + "/download/";
}
/**
* 获取上传路径
*/
public static String getUploadPath()
{
return getProfile() + "/upload";
}
}

View File

@ -0,0 +1,48 @@
package org.dromara.common.core.constant;
public class BaseInfoProperties {
public static final Integer COMMON_START_PAGE = 1;
public static final Integer COMMON_START_PAGE_ZERO = 0;
public static final Integer COMMON_PAGE_SIZE = 10;
public static final String MOBILE_SMSCODE = "mobile:smscode";
public static final String REDIS_USER_TOKEN = "redis_user_token";
public static final String REDIS_USER_INFO = "redis_user_info";
// 短视频的评论总数
public static final String REDIS_VLOG_COMMENT_COUNTS = "redis_vlog_comment_counts";
// 短视频的评论喜欢数量
public static final String REDIS_VLOG_COMMENT_LIKED_COUNTS = "redis_vlog_comment_liked_counts";
// 用户点赞评论
public static final String REDIS_USER_LIKE_COMMENT = "redis_user_like_comment";
//我的关注总数
public static final String REDIS_MY_FOLLOWS_COUNTS = "redis_my_follows_counts";
// 我的粉丝总数
public static final String REDIS_MY_FANS_COUNTS = "redis_my_fans_counts";
// 视频和发布者获赞数
public static final String REDIS_VLOG_BE_LIKED_COUNTS = "redis_vlog_be_liked_counts";
public static final String REDIS_VLOGER_BE_LIKED_COUNTS = "redis_vloger_be_liked_counts";
// 博主和粉丝的关联关系用于判断他们是否互粉
public static final String REDIS_FANS_AND_VLOGGER_RELATIONSHIP = "redis_fans_and_vlogger_relationship";
// 拉黑
public static final String REDIS_USER_BLOCK = "redis_user_block";
// 举报视频
public static final String REDIS_VIDEO_BLOCK = "redis_video_block";
//已读视频
public static final String REDIS_USER_READ_VLOG = "redis_user_read_vlog";
// 已读评论
public static final String REDIS_USER_READ_COMMENT = "redis_user_read_comment";
// 用户是否喜欢/点赞视频取代数据库的关联关系1喜欢0不喜欢默认 redis_user_like_vlog:{userId}:{vlogId}
public static final String REDIS_USER_LIKE_VLOG = "redis_user_like_vlog";
}

View File

@ -27,4 +27,36 @@ public interface CacheConstants {
*/ */
String PWD_ERR_CNT_KEY = "pwd_err_cnt:"; String PWD_ERR_CNT_KEY = "pwd_err_cnt:";
/**
* 用户
*/
String MEMBER ="MEMBER:";
/**
* 粉丝
*/
String MEMBER_FANS="MEMBER_FANS:";
/**
* 关注
*/
String MEMBER_FOLLOW="MEMBER_FOLLOW:";
String BLACK_LIST="BLACK_LIST:";
String GROUP="GROUP:";
String GROUP_MEMBER="GROUP_MEMBER:";
String VLOG="VLOG:";
String COMMENT="COMMENT:";
String CHAT="CHAT:";
String IM_MSG_RECEIVE="im:msg:receive:";
} }

View File

@ -81,8 +81,14 @@ public interface CacheNames {
String SYS_OSS_CONFIG = GlobalConstants.GLOBAL_REDIS_KEY + "sys_oss_config"; String SYS_OSS_CONFIG = GlobalConstants.GLOBAL_REDIS_KEY + "sys_oss_config";
/** /**
* 在线用户 * 延时队列订单未支付取消
*/ */
String ONLINE_TOKEN = "online_tokens"; String DELAY_ORDER_UNPAY = GlobalConstants.GLOBAL_REDIS_KEY + "order_unpay";
/**
* 延时队列订单支付未核销
*/
String DELAY_ORDER_TO_BE_USED = GlobalConstants.GLOBAL_REDIS_KEY + "order_tobe_used";
} }

View File

@ -0,0 +1,551 @@
package org.dromara.common.core.constant;
/**
* 缓存前缀
*
* @author pikachu
* @version 4.1
* @since 1.0
* 2018/3/19
*/
public enum CachePrefix {
/**
* nonce
*/
NONCE,
/**
* 在线人数
*/
ONLINE_NUM,
/**
* 会员分布数据
*/
MEMBER_DISTRIBUTION,
/**
* 在线会员统计
*/
ONLINE_MEMBER,
/**
* token 信息
*/
ACCESS_TOKEN,
/**
* token 信息
*/
REFRESH_TOKEN,
/**
* 联合登录响应
*/
CONNECT_RESULT,
/**
* 微信联合登陆 session key
*/
SESSION_KEY,
/**
* 权限
*/
PERMISSION_LIST,
/**
* 部门id列表
*/
DEPARTMENT_IDS,
/**
* 用户错误登录限制
*/
LOGIN_TIME_LIMIT,
/**
* 系统设置
*/
SETTING,
/**
* 验证码滑块源
*/
VERIFICATION,
/**
* 验证码滑块源
*/
VERIFICATION_IMAGE,
/**
* 快递平台
*/
EXPRESS,
/**
* 图片验证码
*/
CAPTCHA,
/**
* 商品
*/
GOODS,
/**
* 商品SKU
*/
GOODS_SKU,
/**
* 运费模板脚本
*/
SHIP_SCRIPT,
/**
* 商品sku
*/
SKU,
/**
* sku库存
*/
SKU_STOCK,
/**
* 促销商品sku库存
*/
PROMOTION_GOODS_STOCK,
/**
* 商品库存
*/
GOODS_STOCK,
/**
* 商品分类 树状结构
*/
CATEGORY,
/**
* 商品分类 集合
*/
CATEGORY_ARRAY,
/**
* 浏览次数
*/
VISIT_COUNT,
/**
* 存储方案
*/
UPLOADER,
/**
* 地区
*/
REGION,
/**
* 短信网关
*/
SPlATFORM,
/**
* 短信验证码前缀
*/
_CODE_PREFIX,
/**
* smtp
*/
SMTP,
/**
* 系统设置
*/
SETTINGS,
/**
* 电子面单
*/
WAYBILL,
/**
* 短信验证码
*/
SMS_CODE,
/**
* 邮箱验证码
*/
EMAIL_CODE,
/**
* 管理员角色权限对照表
*/
ADMIN_URL_ROLE,
/**
* 店铺管理员角色权限对照表
*/
STORE_URL_ROLE,
/**
* 手机验证标识
*/
MOBILE_VALIDATE,
/**
* 邮箱验证标识
*/
EMAIL_VALIDATE,
/**
* 店铺运费模版列表
*/
SHIP_TEMPLATE,
/**
* 店铺中某个运费模版
*/
SHIP_TEMPLATE_ONE,
//================促销=================
/**
* 促销活动
*/
PROMOTION,
/**
* 促销活动
*/
PROMOTION_GOODS,
/*** 单品立减 */
STORE_ID_MINUS,
/*** 第二件半价 */
STORE_ID_HALF_PRICE,
/*** 满优惠 */
STORE_ID_FULL_DISCOUNT,
/**
* 秒杀活动活动缓存key前缀
*/
STORE_ID_SECKILL,
/**
* 团购活动缓存key前缀
*/
STORE_ID_GROUP_BUY,
/**
* 积分商品缓存key前缀
*/
STORE_ID_EXCHANGE,
//================交易=================
/**
* 购物车原始数据
*/
CART_ORIGIN_DATA_PREFIX,
/**
* 立即购买原始数据
*/
BUY_NOW_ORIGIN_DATA_PREFIX,
/**
* 交易原始数据
*/
TRADE_ORIGIN_DATA_PREFIX,
/**
* 立即购买sku
*/
CART_SKU_PREFIX,
/**
* 购物车视图
*/
CART_MEMBER_ID_PREFIX,
/**
* 购物车用户选择的促销信息
*/
CART_PROMOTION_PREFIX,
/**
* 交易_交易价格的前缀
*/
PRICE_SESSION_ID_PREFIX,
/**
* 交易_交易单
*/
TRADE_SESSION_ID_PREFIX,
/**
* 结算参数
*/
CHECKOUT_PARAM_ID_PREFIX,
/**
* 交易单号前缀
*/
TRADE_SN_CACHE_PREFIX,
/**
* 订单编号前缀
*/
ORDER_SN_CACHE_PREFIX,
/**
* 订单编号标记
*/
ORDER_SN_SIGN_CACHE_PREFIX,
/**
* 订单编号前缀
*/
PAY_LOG_SN_CACHE_PREFIX,
/**
* 合同编号
*/
CONTRACT_SN_CACHE_PREFIX,
/**
* 零钱
*/
SMALL_CHANGE_CACHE_PREFIX,
/**
* 售后服务单号前缀
*/
AFTER_SALE_SERVICE_PREFIX,
/**
* 交易
*/
TRADE,
/**
* 站点导航栏
*/
SITE_NAVIGATION,
/**
* 支付参数
*/
PAYMENT_CONFIG,
/**
* 流程控制
*/
FLOW,
/**
* 热门搜索
*/
HOT_WORD,
/**
* 会员积分
*/
MEMBER_POINT,
/**
* 会员积分
*/
POINT_ORDER,
/**
* 微博登录
*/
WEIBO_STATE,
/**
* 微博登录
*/
QQ_STATE,
/**
* 微博登录
*/
GITHUB_STATE,
/**
* 验证码key
*/
VERIFICATION_KEY,
/**
* 验证码验证结果
*/
VERIFICATION_RESULT,
/**
* 微信CGItoken
*/
WECHAT_CGI_ACCESS_TOKEN,
/**
* 微信JSApitoken
*/
WECHAT_JS_API_TOKEN,
/**
* 微信会话信息
*/
WECHAT_SESSION_PARAMS,
/**
* 第三方用户权限
*/
ALIPAY_CONFIG,
/**
* 微信支付配置
*/
WECHAT_PAY_CONFIG,
/**
* 微信支付平台证书配置
*/
WECHAT_PLAT_FORM_CERT,
/**
* 第三方用户权限
*/
CONNECT_AUTH,
/**
* 平台PageView 统计
*/
PV,
/**
* 平台UserView 统计
*/
UV,
/**
* 平台 商品PV 统计
*/
GOODS_PV,
/**
* 平台 商品UV 统计
*/
GOODS_UV,
/**
* 店铺PageView 统计
*/
STORE_PV,
/**
* 店铺UserView 统计
*/
STORE_UV,
/**
* 店铺 商品PV 统计
*/
STORE_GOODS_PV,
/**
* 店铺 商品UV 统计
*/
STORE_GOODS_UV,
/**
* 分销员
*/
DISTRIBUTION,
/**
* 找回手机
*/
FIND_MOBILE,
/**
* 文章分类
*/
ARTICLE_CATEGORY,
/**
* 文章
*/
ARTICLE_CACHE,
/**
* 初始化索引
*/
INIT_INDEX_PROCESS,
/**
* 初始化索引标示
*/
INIT_INDEX_FLAG,
/**
* 店铺分类
*/
STORE_CATEGORY,
/**
* 用户菜单
*/
MENU_USER_ID,
/**
* 用户菜单
*/
USER_MENU,
/**
* 订单暂时缓存
*/
ORDER,
/**
* 敏感词
*/
SENSITIVE,
/**
* 用户 UserSig 缓存前缀
*/
USER_SIG("user:sig:"),
/**
* 页面
*/
PAGE,
/**
* 文章缓存
*/
ARTICLE("ARTICLE:"),
/**
* 会员足迹
*/
FOOTPRINT;
private String prefix;
CachePrefix(String prefix) {
this.prefix = prefix;
}
CachePrefix() {
this.prefix = this.name() + "_";
}
public String getPrefix1() {
return prefix;
}
public static String removePrefix(String str) {
return str.substring(str.lastIndexOf("}_") + 2);
}
/**
* 通用获取缓存key值
*
* @return 缓存key值
*/
public String getPrefix() {
return "{" + this.name() + "}_";
}
// /**
// * 通用获取缓存key值
// *
// * @param typeEnum 促销枚举
// * @return 缓存key值
// */
// public String getPrefix(PromotionTypeEnum typeEnum) {
// return "{" + this.name() + "_" + typeEnum.name() + "}_";
// }
//
// /**
// * 获取缓存key值 + 用户端
// * 例如三端都有用户体系需要分别登录如果用户名一致则redis中的权限可能会冲突出错
// *
// * @param user 角色
// * @return 缓存key值 + 用户端
// */
// public String getPrefix(UserEnums user) {
// return "{" + this.name() + "_" + user.name() + "}_";
// }
}

View File

@ -65,12 +65,22 @@ public interface Constants {
/** /**
* 验证码有效期分钟 * 验证码有效期分钟
*/ */
Integer CAPTCHA_EXPIRATION = 2; Integer CAPTCHA_EXPIRATION = 5;
/** /**
* 顶级父级id * 顶级父级id
*/ */
Long TOP_PARENT_ID = 0L; Long TOP_PARENT_ID = 0L;
/**
* 订单未支付自动取消时间分钟
*/
Long ORDER_CANCEL_TIME = 30L;
/**
* 订单支付未核销自动退款时间
*/
Long ORDER_REFUND_TIME = 14L;
} }

View File

@ -12,6 +12,11 @@ public interface GlobalConstants {
*/ */
String GLOBAL_REDIS_KEY = "global:"; String GLOBAL_REDIS_KEY = "global:";
/**
* 全局字典 redis key
*/
String GLOBAL_DICT_KEY = GLOBAL_REDIS_KEY + "sys_dict";
/** /**
* 验证码 redis key * 验证码 redis key
*/ */
@ -31,4 +36,62 @@ public interface GlobalConstants {
* 三方认证 redis key * 三方认证 redis key
*/ */
String SOCIAL_AUTH_CODE_KEY = GLOBAL_REDIS_KEY + "social_auth_codes:"; String SOCIAL_AUTH_CODE_KEY = GLOBAL_REDIS_KEY + "social_auth_codes:";
/**
* 会员 redis key
*/
String MEMBER_KEY = GLOBAL_REDIS_KEY + "member:";
/**
* 视频 redis key
*/
String VLOG_KEY = GLOBAL_REDIS_KEY + "vlog:";
/**
* 会员视频 redis key
*/
String GLOBAL_OFFSET = GLOBAL_REDIS_KEY + "offset:";
/**
* 热点视频 redis key
*/
String HOT_VLOG_TAG = "HOT";
/**
* 我喜欢的视频 redis key
*/
String GLOBAL_VLOG_DOILIKE = "global:vlog:doilike:";
String GLOBAL_VLOG_MY_LIKED_LIST= "global:vlog:myliked:list:";
/**
* 我喜欢的视频数量 redis key
*/
String GLOBAL_VLOG_MY_LIKED_COUNT = "global:vlog:myliked:count:";
/**
* 视频被喜欢的数量 redis key
*/
String GLOBAL_VLOG_LIKED_COUNT = "global:vlog:myvlogliked:count:";
String GLOBAL_VLOG_ALL_LIKED_COUNT="global:vlog:myallliked:count:";
String GLOBAL_MEMBER_FANS_COUNT="global:member:myfans:count:";
/**
* 我关注的视频数量 redis key
*/
String GLOBAL_MEMBER_FOLLOW_COUNT="global:member:myfollow:count:";
/**
* 我关注的视频数量 redis key
*/
String GLOBAL_MEMBER_FRIENDS_COUNT="global:member:myfriends:count:";
String GLOBAL_MEMBER_DOIFOLLOW="global:member:doifollow:";
} }

View File

@ -0,0 +1,661 @@
package org.dromara.common.core.constant;
/**
* 返回状态码
* 第一位 1:商品2:用户3:交易,4:促销,5:店铺,6:页面,7:设置,8:其他
*
* @author Chopper
* @since 2020/4/8 1:36 下午
*/
public enum ResultCode {
REGION_ALREADY_HAS_AGENT(100,"区域为空"),
/**
* 成功状态码
*/
SUCCESS(200, "成功"),
/**
* 失败返回码
*/
ERROR(400, "服务器繁忙,请稍后重试"),
/**
* 失败返回码
*/
DEMO_SITE_EXCEPTION(4001, "演示站点禁止使用"),
/**
* 参数异常
*/
PARAMS_ERROR(4002, "参数异常"),
/**
* 系统异常
*/
WECHAT_CONNECT_NOT_EXIST(1001, "微信联合登录未配置"),
VERIFICATION_EXIST(1002, "验证码服务异常"),
LIMIT_ERROR(1003, "访问过于频繁,请稍后再试"),
ILLEGAL_REQUEST_ERROR(1004, "非法请求,请重新刷新页面操作"),
IMAGE_FILE_EXT_ERROR(1005, "不支持图片格式"),
FILE_NOT_EXIST_ERROR(1011, "上传文件不能为空"),
FILE_TYPE_NOT_SUPPORT(1010, "不支持上传的文件类型!"),
PLATFORM_NOT_SUPPORTED_IM(1006, "平台未开启IM"),
STORE_NOT_SUPPORTED_IM(1007, "店铺未开启IM"),
UNINITIALIZED_PASSWORD(1008, "非初始化密码,无法进行初始化设置"),
FILE_DIRECTORY_NOT_EMPTY(1012, "文件夹下有文件,请删除所有文件后删除文件夹!"),
/**
* 分类
*/
CATEGORY_NOT_EXIST(10001, "商品分类不存在"),
CATEGORY_NAME_IS_EXIST(10002, "该分类名称已存在"),
CATEGORY_PARENT_NOT_EXIST(10003, "该分类名称已存在"),
CATEGORY_BEYOND_THREE(10004, "最多为三级分类,添加失败"),
CATEGORY_HAS_CHILDREN(10005, "此类别下存在子类别不能删除"),
CATEGORY_HAS_GOODS(10006, "此类别下存在商品不能删除"),
CATEGORY_SAVE_ERROR(10007, "此类别下存在商品不能删除"),
CATEGORY_PARAMETER_NOT_EXIST(10012, "分类绑定参数组不存在"),
CATEGORY_PARAMETER_SAVE_ERROR(10008, "分类绑定参数组添加失败"),
CATEGORY_PARAMETER_UPDATE_ERROR(10009, "分类绑定参数组添加失败"),
CATEGORY_DELETE_FLAG_ERROR(10010, "子类状态不能与父类不一致!"),
CATEGORY_COMMISSION_RATE_ERROR(10011, "分类的佣金不正确!"),
/**
* 商品
*/
GOODS_ERROR(11001, "商品异常,请稍后重试"),
GOODS_NOT_EXIST(11001, "商品已下架"),
GOODS_NAME_ERROR(11002, "商品名称不正确名称应为2-50字符"),
GOODS_UNDER_ERROR(11003, "商品下架失败"),
GOODS_UPPER_ERROR(11004, "商品上架失败"),
GOODS_AUTH_ERROR(11005, "商品审核失败"),
POINT_GOODS_ERROR(11006, "积分商品业务异常,请稍后重试"),
POINT_GOODS_NOT_EXIST(11020, "积分商品不存在"),
POINT_GOODS_CATEGORY_EXIST(11021, "当前积分商品分类已存在"),
GOODS_SKU_SN_ERROR(11007, "商品SKU货号不能为空"),
GOODS_SKU_PRICE_ERROR(11008, "商品SKU价格不能小于等于0"),
GOODS_SKU_COST_ERROR(11009, "商品SKU成本价不能小于等于0"),
GOODS_SKU_WEIGHT_ERROR(11010, "商品重量不能为负数"),
GOODS_SKU_QUANTITY_ERROR(11011, "商品库存数量不能为负数"),
GOODS_SKU_QUANTITY_NOT_ENOUGH(11011, "商品库存不足"),
MUST_HAVE_GOODS_SKU(11012, "规格必须要有一个!"),
MUST_HAVE_SALES_MODEL(11022, "销售模式为批发时必须要有批发规则!"),
HAVE_INVALID_SALES_MODEL(11023, "批发规则存在小于等于0的无效数据"),
MUST_HAVE_GOODS_SKU_VALUE(11024, "规格值不能为空!"),
DO_NOT_MATCH_WHOLESALE(11025, "批发商品购买数量不能低于起拍量!"),
GOODS_NOT_ERROR(11026, "商品不存在"),
GOODS_PARAMS_ERROR(11013, "商品参数错误,刷新后重试"),
PHYSICAL_GOODS_NEED_TEMP(11014, "实物商品需选择配送模板"),
VIRTUAL_GOODS_NOT_NEED_TEMP(11015, "虚拟商品无需选择配送模板"),
GOODS_NOT_EXIST_STORE(11017, "当前用户无权操作此商品"),
GOODS_TYPE_ERROR(11016, "需选择商品类型"),
GOODS_STOCK_IMPORT_ERROR(11018, "导入商品库存失败,请检查表格数据"),
/**
* 参数
*/
PARAMETER_SAVE_ERROR(12001, "参数添加失败"),
PARAMETER_UPDATE_ERROR(12002, "参数编辑失败"),
/**
* 规格
*/
SPEC_SAVE_ERROR(13001, "规格修改失败"),
SPEC_UPDATE_ERROR(13002, "规格修改失败"),
SPEC_DELETE_ERROR(13003, "分类已经绑定此规格,请先解除关联"),
/**
* 品牌
*/
BRAND_SAVE_ERROR(14001, "品牌添加失败"),
BRAND_UPDATE_ERROR(14002, "品牌修改失败"),
BRAND_DISABLE_ERROR(14003, "品牌禁用失败"),
BRAND_DELETE_ERROR(14004, "品牌删除失败"),
BRAND_NAME_EXIST_ERROR(20002, "品牌名称重复!"),
BRAND_USE_DISABLE_ERROR(20003, "分类已经绑定品牌,请先解除关联"),
BRAND_BIND_GOODS_ERROR(20005, "品牌已经绑定商品,请先解除关联"),
BRAND_NOT_EXIST(20004, "品牌不存在"),
/**
* 用户
*/
USER_EDIT_SUCCESS(20001, "用户修改成功"),
USER_NOT_EXIST(20002, "用户不存在"),
USER_NOT_LOGIN(20003, "用户未登录"),
USER_AUTH_EXPIRED(20004, "用户已退出,请重新登录"),
// USER_AUTH_EXPIRE(408, "账号已被其他设备登录"),
USER_AUTHORITY_ERROR(20005, "权限不足"),
USER_CONNECT_LOGIN_ERROR(20006, "未找到登录信息"),
USER_EXIST(20008, "该用户名或手机号已被注册"),
USER_PHONE_NOT_EXIST(20009, "手机号不存在"),
USER_PASSWORD_ERROR(20010, "密码不正确"),
USER_NOT_PHONE(20011, "非当前用户的手机号"),
USER_CONNECT_ERROR(20012, "联合第三方登录,授权信息错误"),
USER_RECEIPT_REPEAT_ERROR(20013, "会员发票信息重复"),
USER_RECEIPT_NOT_EXIST(20014, "会员发票信息不存在"),
USER_EDIT_ERROR(20015, "用户修改失败"),
USER_OLD_PASSWORD_ERROR(20016, "旧密码不正确"),
USER_COLLECTION_EXIST(20017, "无法重复收藏"),
USER_GRADE_IS_DEFAULT(20018, "会员等级为默认会员等级"),
USER_NOT_BINDING(20020, "未绑定用户"),
USER_AUTO_REGISTER_ERROR(20021, "自动注册失败,请稍后重试"),
USER_OVERDUE_CONNECT_ERROR(20022, "授权信息已过期,请重新授权/登录"),
USER_CONNECT_BANDING_ERROR(20023, "当前联合登陆方式,已绑定其他账号,需进行解绑操作"),
USER_CONNECT_NOT_EXIST_ERROR(20024, "暂无联合登陆信息,无法实现一键注册功能,请点击第三方登录进行授权"),
USER_POINTS_ERROR(20024, "用户积分不足"),
CLERK_SUPPER(20025, "店主无法操作"),
CLERK_SAVE_ERROR(20026, "店员保存失败"),
CLERK_NOT_FOUND_ERROR(20027, "店员不存在"),
USER_STATUS_ERROR(20028, "用户已禁用"),
CLERK_USER_ERROR(20029, "此账户已经绑定其他店铺"),
CLERK_ALREADY_EXIT_ERROR(20030, "店员已经存在"),
CLERK_DISABLED_ERROR(20031, "店员已禁用"),
CLERK_CURRENT_SUPPER(20032, "无法删除当前登录店员"),
CANT_EDIT_CLERK_SHOPKEEPER(20033, "无法在店员管理编辑店员信息"),
USER_MOBILE_REPEATABLE_ERROR(20034, "该手机号已存在"),
/**
* 权限
*/
PERMISSION_DEPARTMENT_ROLE_ERROR(21001, "角色已绑定部门,请逐个删除"),
PERMISSION_USER_ROLE_ERROR(21002, "角色已绑定管理员,请逐个删除"),
PERMISSION_MENU_ROLE_ERROR(21003, "菜单已绑定角色,请先删除或编辑角色"),
PERMISSION_DEPARTMENT_DELETE_ERROR(21004, "部门已经绑定管理员,请先删除或编辑管理员"),
PERMISSION_BEYOND_TEN(21005, "最多可以设置10个角色"),
PERMISSION_NOT_FOUND_ERROR(21006, "部门不存在"),
PERMISSION_ROLE_NOT_FOUND_ERROR(21007, "角色不存在"),
PERMISSION_CLERK_BAND_ERROR(21008, "此手机号码已绑定其他店铺 "),
/**
* 分销
*/
DISTRIBUTION_CLOSE(22000, "分销功能关闭"),
DISTRIBUTION_NOT_EXIST(22001, "分销员不存在"),
DISTRIBUTION_IS_APPLY(22002, "分销员已申请,无需重复提交"),
DISTRIBUTION_AUDIT_ERROR(22003, "审核分销员失败"),
DISTRIBUTION_RETREAT_ERROR(22004, "分销员清退失败"),
DISTRIBUTION_CASH_NOT_EXIST(22005, "分销员提现记录不存在"),
DISTRIBUTION_GOODS_DOUBLE(22006, "不能重复添加分销商品"),
DISTRIBUTION_EDIT_ERROR(22007, "修改分销员失败"),
/**
* 购物车
*/
CART_ERROR(30001, "读取结算页的购物车异常"),
CART_NUM_ERROR(30010, "购买数量必须大于0"),
CART_PINTUAN_NOT_EXIST_ERROR(30002, "拼团活动已关闭,请稍后重试"),
CART_PINTUAN_LIMIT_ERROR(30003, "购买数量超过拼团活动限制数量"),
SHIPPING_NOT_APPLY(30005, "购物商品不支持当前收货地址配送"),
/**
* 订单
*/
ORDER_ERROR(31001, "创建订单异常,请稍后重试"),
ORDER_NOT_EXIST(31002, "订单不存在"),
ORDER_DELIVERED_ERROR(31003, "订单状态错误,无法进行确认收货"),
ORDER_UPDATE_PRICE_ERROR(31004, "已支付的订单不能修改金额"),
ORDER_LOGISTICS_ERROR(31005, "物流错误"),
ORDER_DELIVER_ERROR(31006, "物流错误"),
ORDER_NOT_USER(31007, "非当前会员的订单"),
ORDER_TAKE_ERROR(31008, "当前订单无法核销"),
MEMBER_ADDRESS_NOT_EXIST(31009, "订单无收货地址,请先配置收货地址"),
STORE_ADDRESS_NOT_EXIST(31009, "订单没有自提地址,请先选择自提地址"),
ORDER_DELIVER_NUM_ERROR(31010, "没有待发货的订单"),
ORDER_NOT_SUPPORT_DISTRIBUTION(31011, "购物车中包含不支持配送的商品,请重新选择收货地址,或者重新选择商品"),
ORDER_NOT_EXIST_VALID(31041, "购物车中无有效商品,请检查购物车内商品,或者重新选择商品"),
ORDER_CAN_NOT_CANCEL(31012, "当前订单状态不可取消"),
ORDER_BATCH_DELIVER_ERROR(31013, "批量发货,文件读取失败"),
ORDER_ITEM_NOT_EXIST(31014, "当前订单项不存在!"),
POINT_NOT_ENOUGH(31015, "当前会员积分不足购买当前积分商品!"),
ORDER_LABEL_ORDER_ERROR(31016, "订单不能打印电子面单"),
ORDER_PRICE_ERROR(31017,"订单金额不能小于等于0"),
ORDER_PACKAGE_NOT_EXIST(31017, "当前订单包裹不存在!"),
/**
* 支付
*/
PAY_UN_WANTED(32000, "当前订单不需要付款,返回订单列表等待系统订单出库即可"),
PAY_SUCCESS(32001, "支付成功"),
PAY_INCONSISTENT_ERROR(32002, "付款金额和应付金额不一致"),
PAY_DOUBLE_ERROR(32003, "订单已支付,不能再次进行支付"),
PAY_CASHIER_ERROR(32004, "收银台信息获取错误"),
PAY_ERROR(32005, "支付业务异常,请稍后重试"),
PAY_BAN(32006, "当前订单不需要付款,请返回订单列表重新操作"),
PAY_PARTIAL_ERROR(32007, "该订单已部分支付,请前往订单中心进行支付"),
PAY_NOT_SUPPORT(32008, "支付暂不支持"),
PAY_CLIENT_TYPE_ERROR(32009, "错误的客户端"),
PAY_POINT_ENOUGH(32010, "积分不足,不能兑换"),
PAY_NOT_EXIST_ORDER(32011, "支付订单不存在"),
CAN_NOT_RECHARGE_WALLET(32012, "不能使用余额进行充值"),
RECHARGE_PRICE_ERROR(32013, "充值金额错误"),
WITHDRAW_ERROR(33000, "提现失败"),
WITHDRAW_AUDIT_ERROR(33001, "提现审核失败"),
WITHDRAW_WALLET_ERROR(33002, "提现到钱包失败"),
PACKET_SINGLE_COUNT_ERROR(35000, "单聊红包数量只能为1"),
/**
* 售后
*/
AFTER_SALES_NOT_PAY_ERROR(33001, "当前订单未支付,不能申请售后"),
AFTER_SALES_CANCEL_ERROR(33002, "当前售后单无法取消"),
AFTER_SALES_BAN(33003, "订单状态不允许申请售后,请联系平台或商家"),
AFTER_SALES_DOUBLE_ERROR(33004, "售后已审核,无法重复操作"),
AFTER_SALES_LOGISTICS_ERROR(33005, "物流公司错误,请重新选择"),
AFTER_STATUS_ERROR(33006, "售后状态错误,请刷新页面"),
RETURN_MONEY_OFFLINE_BANK_ERROR(33007, "当账号类型为银行转账时,银行信息不能为空"),
AFTER_SALES_PRICE_ERROR(33004, "申请退款金额错误"),
AFTER_GOODS_NUMBER_ERROR(33008, "申请售后商品数量错误"),
/**
* 投诉
*/
COMPLAINT_ORDER_ITEM_EMPTY_ERROR(33100, "订单不存在"),
COMPLAINT_SKU_EMPTY_ERROR(33101, "商品已下架,如需投诉请联系平台客服"),
COMPLAINT_ERROR(33102, "投诉异常,请稍后重试"),
COMPLAINT_NOT_EXIT(33103, "当前投诉记录不存在"),
COMPLAINT_ARBITRATION_RESULT_ERROR(33104, "结束订单投诉时,仲裁结果不能为空"),
COMPLAINT_APPEAL_CONTENT_ERROR(33105, "商家申诉时,申诉内容不能为空"),
COMPLAINT_CANCEL_ERROR(33106, "申诉已完成,不需要进行取消申诉操作"),
/**
* 余额
*/
WALLET_NOT_EXIT_ERROR(34000, "钱包不存在,请联系管理员"),
WALLET_INSUFFICIENT(34001, "余额不足以支付订单,请充值!"),
WALLET_WITHDRAWAL_INSUFFICIENT(34002, "可提现金额不足!"),
WALLET_WITHDRAWAL_FROZEN_AMOUNT_INSUFFICIENT(34006, "冻结金额不足,无法处理提现申请请求!"),
WALLET_ERROR_INSUFFICIENT(34003, "零钱提现失败!"),
WALLET_REMARK_ERROR(34004, "请填写审核备注!"),
WALLET_EXIT_ERROR(34005, "钱包已存在,无法重复创建"),
WALLET_APPLY_ERROR(34006, "提现申请异常!"),
WALLET_APPLY_MIN_PRICE_ERROR(34007, "提现最低提现金额错误!"),
WALLET_WITHDRAWAL_AMOUNT_ERROR(34008, "申请提现金额异常!"),
/**
* 评价
*/
EVALUATION_DOUBLE_ERROR(35001, "无法重复提交评价"),
/**
* 活动
*/
PROMOTION_GOODS_NOT_EXIT(40000, "当前促销商品不存在!"),
PROMOTION_GOODS_QUANTITY_NOT_EXIT(40020, "当前促销商品库存不足!"),
PROMOTION_GOODS_DO_NOT_JOIN_WHOLESALE(40050, "批发商品无法参加促销"),
PROMOTION_SAME_ACTIVE_EXIST(40001, "活动时间内已存在同类活动,请选择关闭、删除当前时段的活动"),
PROMOTION_START_TIME_ERROR(40002, "活动起始时间不能小于当前时间"),
PROMOTION_END_TIME_ERROR(40003, "活动结束时间不能小于当前时间"),
PROMOTION_TIME_ERROR(40004, "活动起始时间必须大于结束时间"),
PROMOTION_TIME_NOT_EXIST(40011, "活动起始时间和活动结束时间不能为空"),
PROMOTION_SAME_ERROR(40005, "当前时间段已存在相同活动!"),
PROMOTION_GOODS_ERROR(40006, "请选择要参与活动的商品"),
PROMOTION_STATUS_END(40007, "当前活动已停止"),
PROMOTION_UPDATE_ERROR(40008, "当前活动已开始/结束,无法编辑!"),
PROMOTION_ACTIVITY_GOODS_ERROR(40009, "当前活动已经开始无法添加商品"),
PROMOTION_ACTIVITY_ERROR(400010, "当前促销活动不存在"),
PROMOTION_LOG_EXIST(40011, "活动已参加,已发重复参加"),
APPLY_END_TIME_ERROR(40012, "参与截至时间不能小于当前时间,不能大于活动开始时间"),
/**
* 优惠券
*/
COUPON_LIMIT_ERROR(41000, "超出领取限制"),
COUPON_EDIT_STATUS_SUCCESS(41001, "修改状态成功!"),
COUPON_CANCELLATION_SUCCESS(41002, "会员优惠券作废成功"),
COUPON_EXPIRED(41003, "优惠券已使用/已过期,不能使用"),
COUPON_EDIT_STATUS_ERROR(41004, "优惠券修改状态失败!"),
COUPON_RECEIVE_ERROR(41005, "当前优惠券已经被领取完了,下次要早点来哦"),
COUPON_NUM_INSUFFICIENT_ERROR(41006, "优惠券剩余领取数量不足"),
COUPON_NOT_EXIST(41007, "当前优惠券不存在"),
COUPON_LIMIT_NUM_LESS_THAN_0(41008, "领取限制数量不能为负数"),
COUPON_LIMIT_GREATER_THAN_PUBLISH(41009, "领取限制数量超出发行数量"),
COUPON_DISCOUNT_ERROR(41010, "优惠券折扣必须小于10且大于0"),
COUPON_SCOPE_TYPE_GOODS_ERROR(41011, "当前关联范围类型为指定商品时,商品列表不能为空"),
COUPON_SCOPE_TYPE_CATEGORY_ERROR(41012, "当前关联范围类型为部分商品分类时范围关联的id不能为空"),
COUPON_SCOPE_TYPE_STORE_ERROR(41013, "当前关联范围类型为部分店铺分类时范围关联的id不能为空"),
COUPON_SCOPE_ERROR(41014, "指定商品范围关联id无效"),
COUPON_MEMBER_NOT_EXIST(41015, "没有当前会员优惠券"),
COUPON_MEMBER_STATUS_ERROR(41016, "当前会员优惠券已过期/作废无法变更状态!"),
COUPON_RANGE_ERROR(41017, "优惠券使用时间范围错误"),
SPECIAL_CANT_USE(41019, "特殊商品不能使用优惠券,不能使用"),
COUPON_SAVE_ERROR(41020, "保存优惠券失败"),
COUPON_DELETE_ERROR(41021, "删除优惠券失败"),
COUPON_ACTIVITY_NOT_EXIST(41022, "当前优惠券活动不存在"),
COUPON_ACTIVITY_SAVE_ERROR(41023, "保存优惠券活动失败"),
COUPON_ACTIVITY_MAX_NUM(41024, "优惠券活动赠券数量最多为5"),
COUPON_DO_NOT_RECEIVER(41030, "当前优惠券不允许主动领取"),
/**
* 拼团
*/
PINTUAN_MANUAL_OPEN_SUCCESS(42001, "手动开启拼团活动成功"),
PINTUAN_MANUAL_CLOSE_SUCCESS(42002, "手动关闭拼团活动成功"),
PINTUAN_ADD_SUCCESS(42003, "添加拼团活动成功"),
PINTUAN_EDIT_SUCCESS(42004, "修改拼团活动成功"),
PINTUAN_DELETE_SUCCESS(42005, "删除拼团活动成功"),
PINTUAN_MANUAL_OPEN_ERROR(42006, "手动开启拼团活动失败"),
PINTUAN_MANUAL_CLOSE_ERROR(42007, "手动关闭拼团活动失败"),
PINTUAN_ADD_ERROR(42008, "添加拼团活动失败"),
PINTUAN_EDIT_ERROR(42009, "修改拼团活动失败"),
PINTUAN_EDIT_ERROR_ITS_OPEN(42019, "拼团活动已开启,无法修改拼团活动!"),
PINTUAN_DELETE_ERROR(42010, "删除拼团活动失败"),
PINTUAN_JOIN_ERROR(42011, "不能参与自己发起的拼团活动!"),
PINTUAN_LIMIT_NUM_ERROR(42012, "购买数量超过拼团活动限制数量!"),
PINTUAN_NOT_EXIST_ERROR(42013, "当前拼团活动不存在!"),
PINTUAN_GOODS_NOT_EXIST_ERROR(42014, "当前拼团商品不存在!"),
/**
* 满额活动
*/
FULL_DISCOUNT_EDIT_SUCCESS(43001, "修改满优惠活动成功"),
FULL_DISCOUNT_EDIT_DELETE(43002, "删除满优惠活动成功"),
FULL_DISCOUNT_MODIFY_ERROR(43003, "当前编辑的满优惠活动已经开始或者已经结束,无法修改"),
FULL_DISCOUNT_NOT_EXIST_ERROR(43004, "当前要操作的满优惠活动不存在!"),
FULL_DISCOUNT_WAY_ERROR(43005, "请选择一种优惠方式!"),
FULL_DISCOUNT_GIFT_ERROR(43006, "请选择赠品!"),
FULL_DISCOUNT_COUPON_TIME_ERROR(43007, "赠送的优惠券有效时间必须在活动时间之内"),
FULL_DISCOUNT_MONEY_ERROR(43008, "请填写满减金额"),
FULL_DISCOUNT_MONEY_GREATER_THAN_MINUS(43009, "满减金额不能大于优惠门槛"),
FULL_RATE_NUM_ERROR(43010, "请填写打折数值"),
/**
* 直播
*/
STODIO_GOODS_EXIST_ERROR(44001, "直播商品已存在"),
COMMODITY_ERROR(44002, "添加直播商品失败"),
/**
* 秒杀
*/
SECKILL_NOT_START_ERROR(45000, "今日没有限时抢购活动,请明天再来看看吧。"),
SECKILL_NOT_EXIST_ERROR(45001, "当前参与的秒杀活动不存在!"),
SECKILL_APPLY_NOT_EXIST_ERROR(45010, "当前参与的秒杀活动不存在!"),
SECKILL_UPDATE_ERROR(45002, "当前秒杀活动活动已经开始,无法修改!"),
SECKILL_PRICE_ERROR(45003, "活动价格不能大于商品原价"),
SECKILL_TIME_ERROR(45004, "时刻参数异常"),
SECKILL_DELETE_ERROR(45005, "该秒杀活动活动的状态不能删除"),
SECKILL_OPEN_ERROR(45010, "该秒杀活动活动的状态不能删除"),
SECKILL_CLOSE_ERROR(45006, "该秒杀活动活动的状态不能关闭"),
/**
* 优惠券活动
*/
COUPON_ACTIVITY_START_TIME_ERROR(46001, "活动时间小于当前时间,不能进行编辑删除操作"),
COUPON_ACTIVITY_MEMBER_ERROR(46002, "指定精准发券则必须指定会员,会员不可以为空"),
COUPON_ACTIVITY_ITEM_ERROR(46003, "优惠券活动必须指定优惠券,不能为空"),
COUPON_ACTIVITY_ITEM_MUST_NUM_ERROR(46004, "优惠券活动最多指定10个优惠券"),
COUPON_ACTIVITY_ITEM_NUM_ERROR(46005, "赠券数量必须大于0"),
COUPON_ACTIVITY_ITEM_NUM_MAX_VALUE_2(46006, "赠券数量最大为2"),
/**
* 其他促销
*/
MEMBER_SIGN_REPEAT(47001, "请勿重复签到"),
POINT_GOODS_ACTIVE_STOCK_ERROR(47002, "活动库存数量不能高于商品库存"),
POINT_GOODS_ACTIVE_STOCK_INSUFFICIENT(47003, "积分商品库存不足"),
/**
* 砍价活动
*/
KANJIA_GOODS_ACTIVE_STOCK_ERROR(48001, "活动库存数量不能高于商品库存"),
KANJIA_GOODS_ACTIVE_PRICE_ERROR(48002, "最低购买金额不能高于商品金额"),
KANJIA_GOODS_ACTIVE_HIGHEST_PRICE_ERROR(48003, "最高砍价金额不能为0且不能超过商品金额"),
KANJIA_GOODS_ACTIVE_LOWEST_PRICE_ERROR(48004, "最低砍价金额不能为0且不能超过商品金额"),
KANJIA_GOODS_ACTIVE_HIGHEST_LOWEST_PRICE_ERROR(48005, "最低砍价金额不能高于最高砍价金额"),
KANJIA_GOODS_ACTIVE_SETTLEMENT_PRICE_ERROR(48006, "结算金额不能高于商品金额"),
KANJIA_GOODS_DELETE_ERROR(48007, "删除砍价商品异常"),
KANJIA_GOODS_UPDATE_ERROR(48012, "更新砍价商品异常"),
KANJIA_ACTIVITY_NOT_FOUND_ERROR(48008, "砍价记录不存在"),
KANJIA_ACTIVITY_LOG_MEMBER_ERROR(48009, "当前会员已经帮砍"),
KANJIA_ACTIVITY_MEMBER_ERROR(48010, "当前会员已经发起此砍价商品活动"),
KANJIA_ACTIVITY_NOT_PASS_ERROR(48011, "当前砍价未满足条件,不能进行购买"),
KANJIA_NUM_BUY_ERROR(48012, "砍价商品购买数量不正确"),
/**
* 店铺
*/
STORE_NOT_EXIST(50001, "此店铺不存在"),
STORE_NAME_EXIST_ERROR(50002, "店铺名称已存在!"),
STORE_APPLY_DOUBLE_ERROR(50003, "已经拥有店铺!"),
STORE_NOT_OPEN(50004, "该会员未开通店铺"),
STORE_NOT_LOGIN_ERROR(50005, "未登录店铺"),
STORE_CLOSE_ERROR(50006, "店铺关闭,请联系管理员"),
STORE_DELIVER_GOODS_ADDRESS(50007,"请填写商家发货地址"),
FREIGHT_TEMPLATE_NOT_EXIST(50010, "当前模版不存在"),
STORE_STATUS_ERROR(50011, "店铺在申请中或审核中,请勿重复操作"),
STORE_DELIVER_ADDRESS_EXIST(50012,"请填写发货地址"),
/**
* 结算单
*/
BILL_CHECK_ERROR(51001, "只有已出账结算单可以核对"),
BILL_COMPLETE_ERROR(51002, "只有已审核结算单可以支付"),
/**
* 文章
*/
ARTICLE_CATEGORY_NAME_EXIST(60001, "文章分类名称已存在"),
ARTICLE_CATEGORY_PARENT_NOT_EXIST(60002, "文章分类父分类不存在"),
ARTICLE_CATEGORY_BEYOND_TWO(60003, "最多为二级分类,操作失败"),
ARTICLE_CATEGORY_DELETE_ERROR(60004, "该文章分类下存在子分类,不能删除"),
ARTICLE_CATEGORY_HAS_ARTICLE(60005, "该文章分类下存在文章,不能删除"),
ARTICLE_CATEGORY_NO_DELETION(60007, "默认文章分类不能进行删除"),
ARTICLE_NO_DELETION(60008, "默认文章不能进行删除"),
/**
* 页面
*/
PAGE_NOT_EXIST(61001, "页面不存在"),
PAGE_OPEN_DELETE_ERROR(61002, "当前页面为开启状态,无法删除"),
PAGE_DELETE_ERROR(61003, "当前页面为唯一页面,无法删除"),
PAGE_RELEASE_ERROR(61004, "页面已发布,无需重复提交"),
/**
* 设置
*/
SETTING_NOT_TO_SET(70001, "该参数不需要设置"),
ALIPAY_NOT_SETTING(70002, "支付宝支付未配置"),
ALIPAY_EXCEPTION(70003, "支付宝支付错误,请稍后重试"),
ALIPAY_PARAMS_EXCEPTION(70004, "支付宝参数异常"),
LOGISTICS_NOT_SETTING(70005, "您还未配置快递查询"),
LOGISTICS_CHECK_SETTING(70005, "操作失败,请检查您的快递鸟配置"),
ORDER_SETTING_ERROR(70006, "系统订单配置异常"),
ALI_SMS_SETTING_ERROR(70007, "您还未配置阿里云短信"),
SMS_SIGN_EXIST_ERROR(70008, "短信签名已存在"),
/**
* 站内信
*/
NOTICE_NOT_EXIST(80001, "当前消息模板不存在"),
NOTICE_ERROR(80002, "修改站内信异常,请稍后重试"),
NOTICE_SEND_ERROR(80003, "发送站内信异常,请检查系统日志"),
/**
* OSS
*/
OSS_NOT_EXIST(80101, "OSS未配置"),
OSS_EXCEPTION_ERROR(80102, "文件上传失败,请稍后重试"),
OSS_DELETE_ERROR(80103, "图片删除失败"),
/**
* 验证码
*/
VERIFICATION_SEND_SUCCESS(80201, "短信验证码,发送成功"),
VERIFICATION_ERROR(80202, "验证失败"),
VERIFICATION_CODE_INVALID(80204, "验证码已失效,请重新校验"),
VERIFICATION_SMS_CHECKED_ERROR(80210, "短信验证码错误,请重新校验"),
/**
* 微信相关异常
*/
WECHAT_CONNECT_NOT_SETTING(80300, "微信联合登陆信息未配置"),
WECHAT_PAYMENT_NOT_SETTING(80301, "微信支付信息未配置"),
WECHAT_QRCODE_ERROR(80302, "微信二维码生成异常"),
WECHAT_MP_MESSAGE_ERROR(80303, "微信小程序小消息订阅异常"),
WECHAT_JSAPI_SIGN_ERROR(80304, "微信JsApi签名异常"),
WECHAT_CERT_ERROR(80305, "证书获取失败"),
WECHAT_MP_MESSAGE_TMPL_ERROR(80306, "未能获取到微信模版消息id"),
WECHAT_ERROR(80307, "微信接口异常"),
APP_VERSION_EXIST(80307, "APP版本已存在"),
APP_VERSION_PARAM_ERROR(80308, "添加APP版本参数异常"),
// 未选择APP类型
APP_VERSION_TYPE_ERROR(80308, "请选择有效的APP类型"),
/**
* IM
*/
IM_MESSAGE_ADD_ERROR(80400,"IM消息发送错误"),
IM_MESSAGE_EDIT_ERROR(80400,"IM消息更新错误"),
/**
* 其他
*/
CUSTOM_WORDS_EXIST_ERROR(90000, "当前自定义分词已存在!"),
CUSTOM_WORDS_NOT_EXIST_ERROR(90001, "当前自定义分词不存在!"),
CUSTOM_WORDS_SECRET_KEY_ERROR(90002, "秘钥验证失败!"),
CONNECT_NOT_EXIST(90000, "登录方式不存在!"),
ELASTICSEARCH_INDEX_INIT_ERROR(90003, "索引初始化失败!"),
PURCHASE_ORDER_DEADLINE_ERROR(90004, "供求单,已超过报名截止时间"),
USER_ADD_ERROR(90005, "用户添加失败"),
INDEX_BUILDING(90005, "索引正在生成"),
/**
* 只有达人才能申生成分享吗
*/
SHARE_CODE_NOT_MA(30005,"只有达人才能生成分享吗"),
/**
* 分享码不存在
*/
SHARE_CODE_NOT_EXIST(30001, "分享码不存在"),
/**
* 分享码已被使用
*/
SHARE_CODE_ALREADY_USED(30002, "分享码已被使用"),
/**
* 分享码已存在
*/
SHARE_CODE_ALREADY_EXIST(30003, "分享码已存在"),
/**
* 不能绑定自己的分享码
*/
CANNOT_BIND_OWN_CODE(30004, "不能绑定自己的分享码"),
/**
* 已绑定过这个分享码
*/
ALREADY_BIND_THIS_CODE(30008, "已绑定过这个分享码"),
/**
* 已绑定过其他达人
*/
ALREADY_BIND_SHARE_CODE(30009, "已绑定过其他达人,不能重复绑定"),
/**
* 分享码无效
*/
SHARE_CODE_INVALID(30006, "分享码无效"),
EXPERT_NOT_EXIST(30010,"达人不存在"),
EXPERT_EXIST(3012,"达人已经存在"),
INVALID_CODE_OR_PHONE(3011,"无效的分享码或手机号格式"),
/**
* 分享码已被绑定
*/
SHARE_CODE_ALREADY_BIND(30007, "分享码已被绑定"),
/**
* 分享码不能绑定自己
*/
SHARE_CODE_CANNOT_BIND_SELF(500, "分享码不能绑定自己"),
/**
* 只有达人可以生成邀请码
*/
ONLY_EXPERT_CAN_GENERATE_CODE(500, "只有达人可以生成邀请码"),
/**
* 达人不能绑定邀请码
*/
EXPERT_CANNOT_BIND_CODE(500, "达人不能绑定邀请码"),
/**
* 核销码不存在
*/
VERIFICATION_CODE_NOT_EXIST(500, "核销码不存在"),
/**
* 核销码已过期
*/
VERIFICATION_CODE_EXPIRED(500, "核销码已过期"),
/**
* 核销码已被使用
*/
VERIFICATION_CODE_ALREADY_USED(500, "核销码已被使用"),
/**
* 核销操作繁忙
*/
VERIFICATION_OPERATION_BUSY(500, "核销操作繁忙,请稍后重试"),
/**
* 订单状态错误
*/
ORDER_STATUS_ERROR(500, "订单状态错误"),
/**
* 订单类型错误
*/
ORDER_TYPE_ERROR(500, "订单类型错误"),
/**
* 订单已核销
*/
ORDER_ALREADY_VERIFICATION(500, "订单已核销");
// /**
// * 订单不存在
// */
// ORDER_NOT_EXIST(400, "订单不存在")
// /**
// * 订单项不存在
// */
// ORDER_ITEM_NOT_EXIST(400, "订单项不存在");
private final Integer code;
private final String message;
ResultCode(Integer code, String message) {
this.code = code;
this.message = message;
}
public Integer code() {
return this.code;
}
public String message() {
return this.message;
}
}

View File

@ -15,7 +15,7 @@ public interface TenantConstants {
/** /**
* 超级管理员角色 roleKey * 超级管理员角色 roleKey
*/ */
String SUPER_ADMIN_ROLE_KEY = "superadmin"; String SUPER_ADMIN_ROLE_KEY = "superadmin";
/** /**
* 租户管理员角色 roleKey * 租户管理员角色 roleKey

View File

@ -0,0 +1,33 @@
package org.dromara.common.core.domain;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class BaseBO <T> {
private Integer current=1;
private Integer size=10;
protected LocalDateTime beginTime;
protected LocalDateTime endTime;
/**
* bo转换成queryWrapper
*
* @return
*/
public LambdaQueryWrapper<T> toWrapper() {
return new LambdaQueryWrapper<T>();
}
public Page<T> getPage() {
return new Page<>(current, size);
}
}

View File

@ -0,0 +1,15 @@
package org.dromara.common.core.domain;
import java.util.Map;
public interface IQuery {
/**
* @return 搜索值
*/
String getSearchValue();
/**
* @return 所有参数
*/
Map<String, Object> getParams();
}

View File

@ -3,6 +3,7 @@ package org.dromara.common.core.domain;
import org.dromara.common.core.constant.HttpStatus; import org.dromara.common.core.constant.HttpStatus;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import org.dromara.common.core.constant.ResultCode;
import java.io.Serial; import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
@ -38,6 +39,9 @@ public class R<T> implements Serializable {
public static <T> R<T> ok() { public static <T> R<T> ok() {
return restResult(null, SUCCESS, "操作成功"); return restResult(null, SUCCESS, "操作成功");
} }
public static <T> R<T> notLogin() {
return restResult(null, ResultCode.USER_CONNECT_LOGIN_ERROR.code(),ResultCode.USER_CONNECT_LOGIN_ERROR.message());
}
public static <T> R<T> ok(T data) { public static <T> R<T> ok(T data) {
return restResult(data, SUCCESS, "操作成功"); return restResult(data, SUCCESS, "操作成功");

View File

@ -0,0 +1,256 @@
package org.dromara.common.core.domain.event;
/**
* 通用常量信息
*
* @author ruoyi
*/
public class Constants
{
/**
* UTF-8 字符集
*/
public static final String UTF8 = "UTF-8";
/**
* GBK 字符集
*/
public static final String GBK = "GBK";
/**
* http请求
*/
public static final String HTTP = "http://";
/**
* https请求
*/
public static final String HTTPS = "https://";
/**
* 通用成功标识
*/
public static final String SUCCESS = "0";
/**
* 通用失败标识
*/
public static final String FAIL = "1";
/**
* 登录成功
*/
public static final String LOGIN_SUCCESS = "Success";
/**
* 注销
*/
public static final String LOGOUT = "Logout";
/**
* 注册
*/
public static final String REGISTER = "Register";
/**
* 登录失败
*/
public static final String LOGIN_FAIL = "Error";
/**
* 验证码 redis key
*/
public static final String CAPTCHA_CODE_KEY = "captcha_codes:";
/**
* 登录用户 redis key
*/
public static final String LOGIN_TOKEN_KEY = "login_tokens:";
public static final String LOGIN_MEMBER_TOKEN_KEY = "login_member_tokens:";
public static final String MEMBER_INFO = "member_info";
/**
* 防重提交 redis key
*/
public static final String REPEAT_SUBMIT_KEY = "repeat_submit:";
/**
* 限流 redis key
*/
public static final String RATE_LIMIT_KEY = "rate_limit:";
/**
* 验证码有效期分钟
*/
public static final Integer CAPTCHA_EXPIRATION = 5;
/**
* 令牌
*/
public static final String TOKEN = "token";
/**
* 令牌前缀
*/
public static final String TOKEN_PREFIX = "Bearer ";
/**
* 令牌前缀
*/
public static final String LOGIN_USER_KEY = "login_user_key";
public static final String LOGIN_MEMBER_KEY = "login_member_key";
/**
* 用户ID
*/
public static final String JWT_USERID = "userid";
/**
* 用户名称
*/
// public static final String JWT_USERNAME = Claims.SUBJECT;
/**
* 用户头像
*/
public static final String JWT_AVATAR = "avatar";
/**
* 创建时间
*/
public static final String JWT_CREATED = "created";
/**
* 用户权限
*/
public static final String JWT_AUTHORITIES = "authorities";
/**
* 参数管理 cache key
*/
public static final String SYS_CONFIG_KEY = "sys_config:";
public static final String INTEGRAL_RULE_KEY = "activity-integral-income-set-key";
/**
* 字典管理 cache key
*/
public static final String SYS_DICT_KEY = "sys_dict:";
/**
* 资源映射路径 前缀
*/
public static final String RESOURCE_PREFIX = "/profile";
/**
* RMI 远程方法调用
*/
public static final String LOOKUP_RMI = "rmi://";
/**
* LDAP 远程方法调用
*/
public static final String LOOKUP_LDAP = "ldap://";
public static final String SPAN_ID = "spanId";
/**
* 会员账号状态
*/
public static class MEMBER_ACCOUNT_STATUS {
public static final Integer FORBIDDEN = 0;
public static final Integer NORMAL = 1;
// 注销
public static final Integer REVOKED = 2;
}
/**
* 登录提示信息
*/
public static class LOGIN_INFO {
public static final String WRONG = "账号或密码错误";
public static final String FORBIDDEN = "您的账号被禁用,请联系管理员";
public static final String SUCCESS = "登录成功";
public static final String TO_REGISTER = "请先注册";
}
/**
* 验证码相关提示信息
*/
public static class VERIFY_CODE_INFO {
public static final String EXPIRED = "验证码已过期";
public static final String WRONG = "验证码错误";
}
/**
* 上架状态0->下架1->上架
*/
public static class PublishStatus {
public static final Integer GROUNDING = 1;
public static final Integer UNDERCARRIAGE = 0;
}
/**
* 0->未支付1->支付宝2->微信
*/
public static class PayType {
public static final Integer NO_PAY = 0;
public static final Integer ALIPAY = 1;
public static final Integer WECHAT = 2;
public static final Integer UNION = 3;
}
/**
* 订单来源 购物车cart
*/
public static class OrderFrom {
public static final String CART = "cart";
}
/**
* H5订单查询状态
* -1->全部 0->待付款1->待发货2->待收货3->已完成4->已关闭5->无效订单 -2->售后单
*/
public static class H5OrderStatus{
public static final Integer ALL = -1;
public static final Integer UN_PAY = 0;
public static final Integer NOT_DELIVERED = 1;
public static final Integer DELIVERED = 2;
public static final Integer COMPLETED = 3;
public static final Integer CLOSED = 4;
public static final Integer INVALID = 5;
public static final Integer REFUND = -2;
}
/**
* 交易类型1为支付 2为提现 3为退款
*/
public static class PaymentOpType {
public static final Integer PAY = 1;
public static final Integer WITHDRAWAL = 2;
public static final Integer REFUND = 3;
}
/**
* 状态0未完成交易 1完成关键交易
*/
public static class PaymentStatus {
public static final Integer INCOMPLETE = 0;
public static final Integer COMPLETE = 1;
}
public static class OptType {
public static final Integer AGREE = 1;
public static final Integer REFUSE = 2;
public static final Integer GIVING = 3;
}
/**
* 自动识别json对象白名单配置仅允许解析的包名范围越小越安全
*/
public static final String[] JSON_WHITELIST_STR = { "org.springframework", "com.ruoyi","com.cyl" };
}

View File

@ -0,0 +1,78 @@
package org.dromara.common.core.domain.event;
/**
* 用户常量信息
*
* @author ruoyi
*/
public class UserConstants
{
/**
* 平台内系统用户的唯一标志
*/
public static final String SYS_USER = "SYS_USER";
/** 正常状态 */
public static final String NORMAL = "0";
/** 异常状态 */
public static final String EXCEPTION = "1";
/** 用户封禁状态 */
public static final String USER_DISABLE = "1";
/** 角色封禁状态 */
public static final String ROLE_DISABLE = "1";
/** 部门正常状态 */
public static final String DEPT_NORMAL = "0";
/** 部门停用状态 */
public static final String DEPT_DISABLE = "1";
/** 字典正常状态 */
public static final String DICT_NORMAL = "0";
/** 是否为系统默认(是) */
public static final String YES = "Y";
/** 是否菜单外链(是) */
public static final String YES_FRAME = "0";
/** 是否菜单外链(否) */
public static final String NO_FRAME = "1";
/** 菜单类型(目录) */
public static final String TYPE_DIR = "M";
/** 菜单类型(菜单) */
public static final String TYPE_MENU = "C";
/** 菜单类型(按钮) */
public static final String TYPE_BUTTON = "F";
/** Layout组件标识 */
public final static String LAYOUT = "Layout";
/** ParentView组件标识 */
public final static String PARENT_VIEW = "ParentView";
/** InnerLink组件标识 */
public final static String INNER_LINK = "InnerLink";
/** 校验返回结果码 */
public final static String UNIQUE = "0";
public final static String NOT_UNIQUE = "1";
/**
* 用户名长度限制
*/
public static final int USERNAME_MIN_LENGTH = 2;
public static final int USERNAME_MAX_LENGTH = 20;
/**
* 密码长度限制
*/
public static final int PASSWORD_MIN_LENGTH = 5;
public static final int PASSWORD_MAX_LENGTH = 20;
}

View File

@ -0,0 +1,37 @@
package org.dromara.common.core.domain.model;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class BaseAudit {
/**
* 创建者
*/
private Long createBy;
/**
* 创建时间
*/
/**
* 创建部门
*/
@TableField(fill = FieldFill.INSERT)
// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
/**
* 更新者
*/
private Long updateBy;
/**
* 更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
}

View File

@ -107,6 +107,11 @@ public class LoginUser implements Serializable {
*/ */
private String nickname; private String nickname;
/**
* 用户手机号
*/
private String phoneNumber;
/** /**
* 角色对象 * 角色对象
*/ */
@ -132,6 +137,23 @@ public class LoginUser implements Serializable {
*/ */
private String deviceType; private String deviceType;
/**
* 腾讯IM用户Sig
*/
private String userSig;
/**
* 头像
*/
private String avatar;
/**
* 所属团长的租户Id
*/
private String referenceTenantId;
/** /**
* 获取登录id * 获取登录id
*/ */
@ -145,4 +167,6 @@ public class LoginUser implements Serializable {
return userType + ":" + userId; return userType + ":" + userId;
} }
} }

View File

@ -30,4 +30,6 @@ public class RegisterBody extends LoginBody {
private String userType; private String userType;
private String phoneNumber;
} }

View File

@ -0,0 +1,31 @@
package org.dromara.common.core.enums;
/**
* 售后状态
*
* @author ruoyi
*/
public enum AftersaleStatus
{
APPLY(0, "待处理"),
WAIT(1, "退货中"),
SUCCESS(2, "已完成"),
REJECT(3, "已拒绝"),
CANCEL(4,"用户取消");
private final Integer type;
private final String msg;
private AftersaleStatus(Integer type, String msg) {
this.type = type;
this.msg = msg;
}
public Integer getType() {
return this.type;
}
public String getMsg() {
return this.msg;
}
}

View File

@ -0,0 +1,24 @@
package org.dromara.common.core.enums;
/**
* 数字编码前缀扫码用
*/
public enum CodePrefix {
/**
* 订单
*/
DD,
/**
* 核销
*/
HXM,
/**
* 好友
*/
HYM,
/**
* 推广
*/
TGM;
}

View File

@ -0,0 +1,31 @@
package org.dromara.common.core.enums;
/**
* 用户状态
*
* @author ruoyi
*/
public enum OrderRefundStatus
{
NO_REFUND(1, "无售后"),
APPLY(2, "申请中"),
WAIT(3, "退款中"),
SUCCESS(4, "退款成功"),
FAIL(5,"退款失败");
private final Integer type;
private final String msg;
private OrderRefundStatus(Integer type, String msg) {
this.type = type;
this.msg = msg;
}
public Integer getType() {
return this.type;
}
public String getMsg() {
return this.msg;
}
}

View File

@ -0,0 +1,18 @@
package org.dromara.common.core.enums;
/**
* @Desc: 性别 枚举
*/
public enum Sex {
woman(0, ""),
man(1, ""),
secret(2, "保密");
public final Integer type;
public final String value;
Sex(Integer type, String value) {
this.type = type;
this.value = value;
}
}

View File

@ -0,0 +1,31 @@
package org.dromara.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 租户签约状态
* 0->待提交
* 1->待审核
* 2->待确认
* 3->有效
* 4->无效
* 5->过期
*
* @author huk
*/
@Getter
@AllArgsConstructor
public enum TenantSignStatus
{
TO_BE_SUBMITTED("0", "待提交"),
TO_BE_REVIEWED("1", "待审核"),
TO_BE_CONFIRMED("2", "待确认"),
IN_EFFECT("3", "签约生效"),
INVALID("4", "无效"),
EXPIRED("5", "过期");
private final String status;
private final String desc;
}

View File

@ -0,0 +1,43 @@
package org.dromara.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 租户类型枚举 2->商家,3->代理,4->平台,5->团长
*/
@Getter
@AllArgsConstructor
public enum TenantType {
MERCHANT(2, "商家"),
AGENT(3, "代理"),
PLATFORM(4, "平台"),
REFERENCE(5, "团长");
private final int type;
private final String desc;
public static TenantType valueOf(int type) {
for (TenantType tenantType : TenantType.values()) {
if (tenantType.type == type) {
return tenantType;
}
}
throw new IllegalArgumentException("No enum constant with type " + type);
}
public static boolean allowCreateByType(Integer currentTenantType, Integer newTenantType) {
boolean allow = false;
if (currentTenantType == PLATFORM.type) {
// 超级管理租户创建租户没有限制
allow = true;
} else if (currentTenantType == TenantType.AGENT.type) {
// 代理商只能创建商铺或达人
allow = newTenantType == TenantType.AGENT.type || newTenantType == TenantType.MERCHANT.type || newTenantType == TenantType.REFERENCE.type;
}
return allow;
}
}

View File

@ -0,0 +1,17 @@
package org.dromara.common.core.enums;
/**
* @Desc: 是否 枚举
*/
public enum YesOrNo {
NO(0, ""),
YES(1, "");
public final Integer type;
public final String value;
YesOrNo(Integer type, String value) {
this.type = type;
this.value = value;
}
}

View File

@ -1,6 +1,8 @@
package org.dromara.common.core.exception; package org.dromara.common.core.exception;
import lombok.*; import lombok.*;
import org.dromara.common.core.constant.ResultCode;
import org.dromara.common.core.exception.base.BaseException;
import java.io.Serial; import java.io.Serial;
@ -41,6 +43,10 @@ public final class ServiceException extends RuntimeException {
this.message = message; this.message = message;
this.code = code; this.code = code;
} }
public ServiceException(ResultCode resultCode) {
this.message = resultCode.message();
this.code = resultCode.code();
}
@Override @Override
public String getMessage() { public String getMessage() {
@ -56,4 +62,16 @@ public final class ServiceException extends RuntimeException {
this.detailMessage = detailMessage; this.detailMessage = detailMessage;
return this; return this;
} }
public static ServiceException of(String message) {
return new ServiceException(message);
}
public static ServiceException of(Integer code, String message) {
return new ServiceException(message, code);
}
public static ServiceException of(ResultCode resultCode) {
return new ServiceException(resultCode);
}
} }

View File

@ -0,0 +1,104 @@
package org.dromara.common.core.utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Created by yangyincong on 15/8/16.
* ID生成器 workId (1~4)
*/
public class IDGenerator {
private final static Logger logger = LoggerFactory.getLogger(IDGenerator.class);
private final static long twepoch = 1361753741828L;
private final static long workerIdBits = 4L;
private final static long maxWorkerId = -1L ^ -1L << workerIdBits;
private final static long sequenceBits = 10L;
private long workerId;
private long sequence = 0L;
private final static long workerIdShift = sequenceBits;
private final static long timestampLeftShift = sequenceBits + workerIdBits;
private final static long sequenceMask = -1L ^ -1L << sequenceBits;
private long lastTimestamp = -1L;
private IDGenerator(final long workerId) {
super();
this.workerId = workerId;
}
public static long generateMinId(int wid, long time) {
return (time - twepoch << timestampLeftShift) | (wid << workerIdShift);
}
public synchronized long nextId() {
long timestamp = this.timeGen();
if (this.lastTimestamp == timestamp) {
this.sequence = (this.sequence + 1) & sequenceMask;
if (this.sequence == 0) {
timestamp = this.tilNextMillis(this.lastTimestamp);
}
} else {
this.sequence = 0;
}
if (timestamp < this.lastTimestamp) {
try {
throw new Exception(
String.format(
"Clock moved backwards. Refusing to generate id for %d milliseconds",
this.lastTimestamp - timestamp));
} catch (Exception e) {
e.printStackTrace();
}
}
this.lastTimestamp = timestamp;
long nextId = ((timestamp - twepoch << timestampLeftShift))
| (this.workerId << workerIdShift) | (this.sequence);
return nextId;
}
public static long generateMaxId(long wid, long time) {
return (time - twepoch << timestampLeftShift) | (wid << workerIdShift) | sequenceMask;
}
private long tilNextMillis(final long lastTimestamp) {
long timestamp = this.timeGen();
while (timestamp <= lastTimestamp) {
timestamp = this.timeGen();
}
return timestamp;
}
private long timeGen() {
return System.currentTimeMillis();
}
private static IDGenerator generator;
public static synchronized void init(Long workerId) throws Exception {
workerId = workerId % maxWorkerId;
logger.info("程序中init的workid为{}", workerId);
if (workerId > maxWorkerId || workerId < 0) {
throw new IllegalArgumentException(String.format(
"worker Id can't be greater than %d or less than 0",
IDGenerator.maxWorkerId));
}
generator = new IDGenerator(workerId);
}
public static Long generateId() {
if (null == generator) {
synchronized (IDGenerator.class) {
if (null == generator) {
try {
init(2L);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
return generator.nextId();
}
}

View File

@ -0,0 +1,27 @@
package org.dromara.common.core.utils;
import java.util.HashMap;
import java.util.Map;
/**
*
*/
public class LocalDataUtil {
private static ThreadLocal<Map<String, Object>> LOCAL_VARS = new ThreadLocal<Map<String, Object>>();
public static void setVar(String key, Object obj) {
Map<String, Object> stringObjectMap = LOCAL_VARS.get();
if (null == stringObjectMap) {
stringObjectMap = new HashMap<>();
LOCAL_VARS.set(stringObjectMap);
}
stringObjectMap.put(key, obj);
}
public static Object getVar(String key) {
Map<String, Object> stringObjectMap = LOCAL_VARS.get();
return null != stringObjectMap ? stringObjectMap.get(key) : null;
}
}

View File

@ -0,0 +1,14 @@
package org.dromara.common.core.utils;
/**
* 手机号工具类
*/
public class PhoneUtils {
public static String hidePhone(String phone){
if (StringUtils.isEmpty(phone) || phone.length() < 11){
throw new RuntimeException("手机号格式错误");
}
return phone.substring(0, 3) + "****" + phone.substring(7, 11);
}
}

View File

@ -0,0 +1,120 @@
package org.dromara.common.core.utils;
import org.springframework.security.core.Authentication;
import org.dromara.common.core.constant.HttpStatus;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.exception.ServiceException;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
/**
* 安全服务工具类
*
* @author ruoyi
*/
public class SecurityUtils
{
private static BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
/**
* 用户ID
**/
public static Long getUserId()
{
try
{
return getLoginUser().getUserId();
}
catch (Exception e)
{
throw new ServiceException("获取用户ID异常", HttpStatus.UNAUTHORIZED);
}
}
/**
* 获取部门ID
**/
public static Long getDeptId()
{
try
{
return getLoginUser().getDeptId();
}
catch (Exception e)
{
throw new ServiceException("获取部门ID异常", HttpStatus.UNAUTHORIZED);
}
}
/**
* 获取用户账户
**/
public static String getUsername()
{
try
{
return getLoginUser().getUsername();
}
catch (Exception e)
{
throw new ServiceException("获取用户账户异常", HttpStatus.UNAUTHORIZED);
}
}
/**
* 获取用户
**/
public static LoginUser getLoginUser()
{
try
{
return (LoginUser) getAuthentication().getPrincipal();
}
catch (Exception e)
{
throw new ServiceException("获取用户信息异常", HttpStatus.UNAUTHORIZED);
}
}
/**
* 获取Authentication
*/
public static Authentication getAuthentication()
{
return SecurityContextHolder.getContext().getAuthentication();
}
/**
* 生成BCryptPasswordEncoder密码
*
* @param password 密码
* @return 加密字符串
*/
public static String encryptPassword(String password) {
return passwordEncoder.encode(password);
}
/**
* 判断密码是否相同
*
* @param rawPassword 真实密码
* @param encodedPassword 加密后字符
* @return 结果
*/
public static boolean matchesPassword(String rawPassword, String encodedPassword)
{
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
return passwordEncoder.matches(rawPassword, encodedPassword);
}
/**
* 是否为管理员
*
* @param userId 用户ID
* @return 结果
*/
public static boolean isAdmin(Long userId)
{
return userId != null && 1L == userId;
}
}

View File

@ -62,6 +62,40 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils {
return StrUtil.trim(str); return StrUtil.trim(str);
} }
/**
* * 判断一个对象是否为空
*
* @param object Object
* @return true为空 false非空
*/
public static boolean isNull(Object object)
{
return object == null;
}
/**
* * 判断一个对象是否非空
*
* @param object Object
* @return true非空 false
*/
public static boolean isNotNull(Object object)
{
return !isNull(object);
}
/**
* * 判断一个对象是否是数组类型Java基本型别的数组
*
* @param object 对象
* @return true是数组 false不是数组
*/
public static boolean isArray(Object object)
{
return isNotNull(object) && object.getClass().isArray();
}
/** /**
* 截取字符串 * 截取字符串
* *

View File

@ -0,0 +1,77 @@
package org.dromara.common.core.utils.file;
import org.apache.commons.lang3.StringUtils;
import java.io.File;
/**
* 文件类型工具类
*
* @author ruoyi
*/
public class FileTypeUtils
{
/**
* 获取文件类型
* <p>
* 例如: ruoyi.txt, 返回: txt
*
* @param file 文件名
* @return 后缀不含".")
*/
public static String getFileType(File file)
{
if (null == file)
{
return StringUtils.EMPTY;
}
return getFileType(file.getName());
}
/**
* 获取文件类型
* <p>
* 例如: ruoyi.txt, 返回: txt
*
* @param fileName 文件名
* @return 后缀不含".")
*/
public static String getFileType(String fileName)
{
int separatorIndex = fileName.lastIndexOf(".");
if (separatorIndex < 0)
{
return "";
}
return fileName.substring(separatorIndex + 1).toLowerCase();
}
/**
* 获取文件类型
*
* @param photoByte 文件字节码
* @return 后缀不含".")
*/
public static String getFileExtendName(byte[] photoByte)
{
String strFileExtendName = "JPG";
if ((photoByte[0] == 71) && (photoByte[1] == 73) && (photoByte[2] == 70) && (photoByte[3] == 56)
&& ((photoByte[4] == 55) || (photoByte[4] == 57)) && (photoByte[5] == 97))
{
strFileExtendName = "GIF";
}
else if ((photoByte[6] == 74) && (photoByte[7] == 70) && (photoByte[8] == 73) && (photoByte[9] == 70))
{
strFileExtendName = "JPG";
}
else if ((photoByte[0] == 66) && (photoByte[1] == 77))
{
strFileExtendName = "BMP";
}
else if ((photoByte[1] == 80) && (photoByte[2] == 78) && (photoByte[3] == 71))
{
strFileExtendName = "PNG";
}
return strFileExtendName;
}
}

View File

@ -1,5 +1,7 @@
package org.dromara.common.core.utils.file; package org.dromara.common.core.utils.file;
import cn.hutool.core.util.StrUtil;
/** /**
* 媒体类型工具类 * 媒体类型工具类
* *
@ -37,4 +39,29 @@ public class MimeTypeUtils {
// pdf // pdf
"pdf"}; "pdf"};
public static String getExtension(String prefix)
{
switch (prefix)
{
case IMAGE_PNG:
return "png";
case IMAGE_JPG:
return "jpg";
case IMAGE_JPEG:
return "jpeg";
case IMAGE_BMP:
return "bmp";
case IMAGE_GIF:
return "gif";
default:
return "";
}
}
public static boolean isImg(String contentType) {
String ext = MimeTypeUtils.getExtension(contentType);
return StrUtil.isNotEmpty(ext);
}
} }

View File

@ -21,11 +21,6 @@
<artifactId>ruoyi-common-core</artifactId> <artifactId>ruoyi-common-core</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-api</artifactId>
</dependency>
<dependency> <dependency>
<groupId>com.github.therapi</groupId> <groupId>com.github.therapi</groupId>
<artifactId>therapi-runtime-javadoc</artifactId> <artifactId>therapi-runtime-javadoc</artifactId>
@ -36,6 +31,12 @@
<artifactId>jackson-module-kotlin</artifactId> <artifactId>jackson-module-kotlin</artifactId>
</dependency> </dependency>
<dependency>
<groupId>com.github.xingfudeshi</groupId>
<artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@ -310,4 +310,10 @@ public class EncryptUtils {
return SmUtil.sm3(data); return SmUtil.sm3(data);
} }
public static void main(String[] args) {
String data = "123456";
String password="1234567890123456";
System.out.println(encryptByAes(data,password));
}
} }

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