1210 Commits

Author SHA1 Message Date
3a11f18656 fix 修复 StreamUtils 返回不可变类型报错问题 2025-09-02 15:58:11 +08:00
5a43212ccc fix 修复 StreamUtils 返回不可变类型报错问题 2025-09-02 15:51:42 +08:00
f4cfd1c913 !759 [fix] 解决工作流通知messageType参数判空逻辑错误的问题
* [fix] 解决工作流通知messageType参数判空逻辑错误的问题
2025-09-02 04:57:56 +00:00
26ce8f30c9 update 优化 支持子菜单配置默认激活的父菜单activeMenu 2025-09-02 10:45:54 +08:00
2258962770 Revert "!734 update 重写selectOne方法"
This reverts commit f2e0361fb6.
2025-09-01 14:25:47 +08:00
655e84012c Revert "update 优化 增加selectOne使用注意事项"
This reverts commit bf10a13088.
2025-09-01 14:25:40 +08:00
f683ef00b8 fix 修复 json模块配置 默认覆盖了spring module 配置问题 改为让spring自动加载注册 2025-09-01 11:46:57 +08:00
424b2ea164 update Excel写出包装器添加泛型用于限定write入参类型 2025-08-31 13:24:12 +08:00
7bb4838132 feat add Excel工具类支持更灵活的自定义导出方式,以便用户分批处理导出数据 2025-08-30 18:09:01 +08:00
20516758ea upadte 优化Stream流工具类 2025-08-30 16:53:13 +08:00
2d5f84ebc2 upadte 优化Stream流工具类 2025-08-30 16:46:04 +08:00
6bc28e41de update 优化 工作流代码 2025-08-29 10:06:22 +08:00
a4fb3fadaf update 优化 将返回值从bo改为vo 2025-08-29 09:52:21 +08:00
cfa67fcd8c Revert "update 添加 FlowCopyVo 类,优化抄送对象处理逻辑"
This reverts commit e5e8d305d2.
2025-08-29 01:35:27 +00:00
e5e8d305d2 update 添加 FlowCopyVo 类,优化抄送对象处理逻辑 2025-08-29 09:29:12 +08:00
9d0084409e update 优化 支持后端监听器解析节点扩展数据到流程变量(按钮权限 抄送人 扩展变量) 2025-08-28 17:56:10 +08:00
ee02f46dfd update 优化 支持前端返回节点扩展数据(按钮权限 抄送人 扩展变量) 2025-08-28 17:55:04 +08:00
25de0b3530 update 解析扩展属性 JSON,构建 Node 扩展属性对象,增强代码可读性 2025-08-28 16:25:33 +08:00
aa76859a05 update 添加抄送设置和变量枚举,优化扩展节点配置逻辑 2025-08-28 15:00:32 +08:00
71b70a59fe fix 修复 判断错误导致新增报错问题 2025-08-28 10:59:00 +08:00
05c9528549 !752 update 优化流程实例业务扩展的保存和删除逻辑,增强代码可读性
* update 优化流程实例业务扩展的保存和删除逻辑,增强代码可读性
2025-08-27 11:10:03 +00:00
1feb2a3861 fix 修复 菜单与部门 未做角色状态判断 2025-08-27 17:54:05 +08:00
237e78e80c update hutool 5.8.38 => 5.8.40 默认支持了验证码不生成负数 2025-08-27 11:58:07 +08:00
ffc3dcaec9 upadte 优化Excel单元格合并处理器代码逻辑分支 2025-08-26 17:13:35 +08:00
a94e474069 fix 修复 时间解析类异常问题 2025-08-26 16:10:17 +08:00
40a0e57870 fix 修复 时间解析类异常问题 2025-08-26 16:02:11 +08:00
c01ed34602 update fastexcel 1.2.0 => 1.3.0 2025-08-25 13:50:09 +08:00
26a99003d2 update springdoc 2.8.10 => 2.8.11
update redisson 3.50.0 => 3.51.0
2025-08-25 09:58:46 +08:00
93c886d3ed update 优化 对三方授权 redirectUri 回调地址进行url编码 2025-08-25 09:58:06 +08:00
9e1027690b update 更新 warm-flow 版本至 1.8.1 2025-08-22 10:23:37 +08:00
cc120c06fd !746 update 优化代码生成模板空格对齐
* update 优化代码生成模板空格对齐
2025-08-22 02:16:51 +00:00
3827da078a update 移除不必要的流程状态颜色配置 2025-08-22 09:54:40 +08:00
70d3505b94 update springdoc 2.8.9 => 2.8.10 2025-08-21 10:07:15 +08:00
a39a69cac5 reset 回滚错误提交 2025-08-21 09:25:56 +08:00
1dbce3ab7c fix 修复 校验租户账号余额 查询语句错误 2025-08-21 09:20:35 +08:00
9742b1b596 fix 修复 流程重新提交报错问题 2025-08-19 17:59:29 +08:00
d98d11ae2d fix 修复 流程重新提交报错问题 2025-08-19 17:48:30 +08:00
6742dcb33e fix 修复 sql书写错误 2025-08-19 17:18:37 +08:00
09a51478a5 add 新增 请假表 申请编号字段sql 2025-08-18 09:44:22 +08:00
f02601ab2c update 优化 表sql书写格式 2025-08-16 11:31:45 +08:00
ac56ca0e81 add 补充流程扩展sql 2025-08-15 21:35:42 +08:00
0fcf77e2ed add 增加流程业务扩展 2025-08-15 21:18:25 +08:00
0f0a3a181e !743 update 注册功能同步优化 验证码校验逻辑
* update 注册功能同步优化 验证码校验逻辑
2025-08-15 08:29:49 +00:00
e24e2c51e4 update 优化 验证码校验逻辑 2025-08-15 14:04:17 +08:00
2b0dd82d3d update 优化 工作流后台发起或审批可以手动设置办理人 2025-08-15 11:18:46 +08:00
b97f711eb4 update snailjob 1.7.0 => 1.7.2 2025-08-14 09:52:46 +08:00
0250ca4eb8 update warm-flow 升级 1.8.0 正式版 2025-08-14 09:51:44 +08:00
23338995d7 update warm-flow 升级 1.8.0-m3 2025-08-13 10:27:52 +08:00
84fd02e7d8 update 优化数据库类型获取和判断逻辑,增强代码可读性 2025-08-12 21:55:24 +08:00
ae5bec994d upadte 优化Excel单元格合并代码逻辑,明确处理类职责 2025-08-12 18:26:18 +08:00
8f3a1b589e upadte 优化OSS文件下载代码 2025-08-12 16:37:06 +08:00
ad6b3d4b3f update 改用发布订阅的方式替代阻塞流,优化大文件下载时的内存占用 2025-08-12 16:17:07 +08:00
e2801037cf update 优化 删除监控无用配置代码(升级之后不需要了) 2025-08-11 14:04:39 +08:00
65061f17fe update 优化 由spring自己初始化线程池 2025-08-11 09:47:08 +08:00
d0f4d93615 !739 支持 @ExcelIgnoreUnannotated 注解,修复未注解字段导致列合并错位的问题
* 优化避免每个字段都进行ExcelIgnoreUnannotated.class判断
* 支持 @ExcelIgnoreUnannotated 注解,修复未注解字段导致列合并错位的问题
2025-08-07 09:11:42 +00:00
5d69832423 update 优化以逗号拼接元素 2025-08-06 11:43:37 +08:00
0c1e39ea14 update 优化以逗号拼接元素 2025-08-06 11:18:06 +08:00
a39bc870d1 update 优化发布流程定义抛出异常
- StringUtils.join 默认会跳过 null,不会抛异常
2025-08-06 10:51:51 +08:00
7357912681 update 新增支持占位符格式的 ServiceException 构造方法
- 新增 ServiceException(String message, Object... args) 构造器,内部使用 Hutool StrFormatter.format 格式化消息
- 解决日志打印和异常抛出信息格式不统一的问题,统一使用 {} 占位符
- 优化异常消息书写,简化拼接,提升代码可读性和维护性
2025-08-06 10:43:41 +08:00
901992674e add 增加赞助商 2025-08-06 10:21:12 +08:00
7ceb85ffa0 add 增加赞助商 2025-08-06 10:08:22 +08:00
4672d7de4d fix 修复 撤销终止等操作 都变成退回的问题 2025-08-05 11:55:15 +08:00
87ab6e1744 remove 删除无用代码 2025-08-04 18:43:39 +08:00
ae0a03728b Merge branch 'dev' of https://gitee.com/dromara/RuoYi-Vue-Plus into dev 2025-08-04 18:41:02 +08:00
6fc82a59f1 add 增加启动流程并办理第一个任务接口 2025-08-04 18:40:14 +08:00
6c33fa48ec update snailjob 1.6.0 => 1.7.0(新增的网卡配置有异常等待官方修复 不耽误正常使用) 2025-08-04 14:32:56 +08:00
343d5d21d8 update 更新工作流sql 2025-08-04 11:15:57 +08:00
0ba909c52e update work-flow 1.6.8 => 1.8.0-m1 2025-08-01 18:34:09 +08:00
808ce9c25a update 优化办理人权限设置列表 2025-08-01 17:57:46 +08:00
4351fc5239 update 优化 升级jdk版本 2025-08-01 17:22:47 +08:00
a545f7fc44 update 优化 setCacheObject 简化写法 2025-08-01 16:30:33 +08:00
acfcdf4d9a update 全局替换为 Convert.toStr,优化 null 字符串处理 2025-08-01 15:29:36 +08:00
9683252783 fix 修复 配置缺失 2025-08-01 09:19:15 +08:00
49c00e162b update 删除无用依赖引入 2025-07-31 11:25:07 +08:00
076a0a44fa update 优化 isLogin 判断逻辑 2025-07-31 10:17:27 +08:00
0d93589d99 update 优化 PlusSaTokenDao 删除key同步删除本地缓存 2025-07-31 10:11:46 +08:00
54a8189e27 fix 修复 依赖漏删 2025-07-31 09:21:18 +08:00
84f17011ad fix 修复 监控代码报错问题 2025-07-30 16:57:57 +08:00
f47bd39644 update 优化 springboot 3.5 新特性与过期代码 2025-07-30 16:10:00 +08:00
89f9617ccb update springboot 3.4.7 => 3.5.4
update springboot-admin 3.4.7 => 3.5.1
update springdoc 2.8.8 => 2.8.9
update lombok 1.18.36 => 1.18.38
2025-07-30 15:09:18 +08:00
bf10a13088 update 优化 增加selectOne使用注意事项 2025-07-30 15:07:38 +08:00
f2e0361fb6 !734 update 重写selectOne方法
* update 重写selectOne方法
2025-07-30 02:46:51 +00:00
554152635d update 优化数据权限注解切点逻辑,使切点逻辑更清晰 2025-07-29 15:52:08 +08:00
b379574637 update 优化 压制配置警告 2025-07-29 14:57:42 +08:00
6a556cc6ff fix 修复 snailjob 未判断配置空的情况 2025-07-29 14:27:18 +08:00
a6950275ad update 优化 调整包名 2025-07-29 11:27:42 +08:00
58b1bf5c33 !731 update 把数据权限注解全部交给AOP处理,使用自定义动态方法匹配器匹配注解
* update 把数据权限注解全部交给AOP处理,使用自定义动态方法匹配器匹配注解
2025-07-29 03:25:59 +00:00
c85f693ca6 update 优化 调整自动审批代码逻辑 2025-07-28 17:09:45 +08:00
5f466fd0c4 update 优化 getBackTaskNode 获取驳回节点接口 如果是委派直接返回当前节点 不允许驳回到其他节点 2025-07-28 16:25:20 +08:00
127eaf936c update 增加国内文档加速地址 2025-07-28 13:38:27 +08:00
fcd8556076 !732 [fix] 解决委托、转办时nextTasks为空导致空指针的问题
* [fix] 解决委托、转办时nextTasks为空导致空指针的问题
2025-07-28 02:24:27 +00:00
0512781513 update 优化代码 2025-07-28 09:58:40 +08:00
may
2472359adb add 增加下一节点执行人是当前任务处理人自动审批
fix 修复已完成的实例删除失败
2025-07-27 10:44:57 +08:00
29d4bb4e59 fix 修复权限判断逻辑 2025-07-26 16:58:26 +08:00
cce95424ce fix 修复权限判断逻辑 2025-07-26 16:40:07 +08:00
may
8d7358e663 update 调整变量修改 2025-07-25 23:18:28 +08:00
may
240f10ab45 update 调整变量修改 2025-07-25 23:16:22 +08:00
48213bc9c9 fix 修复 个人中心数据被脱敏问题 2025-07-25 16:36:24 +08:00
3995d9699d fix 修复 权限为null导致报错问题 2025-07-25 15:47:16 +08:00
ecd4e3eaf0 fix 修复 监听器变量使用错误 2025-07-24 15:23:23 +08:00
2e3a42c669 update 优化 调整上传超时时间 2025-07-23 17:46:30 +08:00
82997fc6cd update 优化 getInfo 接口忽略数据权限 2025-07-22 18:08:44 +08:00
0dce571270 add 增加催办接口,调整消息发送 2025-07-22 11:46:04 +08:00
9375578925 add 增加修改流程变量接口 2025-07-22 10:39:17 +08:00
e19ccf5064 remove 删除无用导入 2025-07-22 09:49:40 +08:00
1cea7b72d7 update 优化 去除无用配置 2025-07-19 23:48:30 +08:00
5da9ddf5e3 update 新增赞助商 2025-07-19 23:47:29 +08:00
93ee01c6b9 update 更新snailjob服务端配置 2025-07-19 18:07:09 +08:00
acd30fda3c update 优化 删除无用sql 2025-07-18 23:52:28 +08:00
3f62a76cc8 update 更新snailjob版本到1.6.0 2025-07-18 18:26:09 +08:00
b0b4e573f6 fix 修复 oracle数据库无法使用不等于语法问题 2025-07-17 16:16:28 +08:00
de61899eed update 优化 对登录也租户列表接口进行限流 防止盗刷 2025-07-17 15:15:28 +08:00
3a9bdb36f1 update 优化 增加请求流程后端发起demo案例 2025-07-17 14:28:37 +08:00
may
b815b8e574 fix 修复退回后审批记录申请人错误 #ICMEJ1 2025-07-15 20:22:07 +08:00
45edee4e63 update 优化 支持在监听器设置流程变量 2025-07-15 16:57:44 +08:00
868bc492a2 update 优化 支持在监听器设置流程变量 2025-07-15 16:56:57 +08:00
90fef1bb17 update 优化 菜单权限查询 2025-07-14 10:58:12 +08:00
may
d79b48ea99 fix 修复设计器画线驳回驳回到申请人后状态未修改 2025-07-12 14:49:32 +08:00
f6993a1491 update 优化 日志脱敏支持List参数 2025-07-11 18:14:14 +08:00
6b0b7382a6 update 优化判断流程是否已结束 2025-07-10 17:36:42 +08:00
c41add355f update 优化 任务创建监听器 使用下一个节点的任务数据 2025-07-10 17:05:33 +08:00
74e3d232f5 update 优化 工作流任务创建监听器 传递流程参数 2025-07-09 10:43:22 +08:00
03fca40c7d update 优化 监控使用springSecurity新语法 2025-07-09 09:56:32 +08:00
b2ad257bd8 fix 修复 代码生成 setIsRequired 标志写反 2025-07-09 09:35:35 +08:00
7e4f0d73f4 update 优化流程分类新增修改 2025-07-08 18:01:38 +08:00
2ec802f17f fix 修复 satokenDao 无法更新已存在数据的ttl问题 2025-07-08 14:33:50 +08:00
e0ce662c28 update 优化SpEL表达式回显查询条件 2025-07-07 16:10:34 +08:00
3d9ed1b92f update 优化 sse 登录校验 避免大量报错 2025-07-07 15:45:34 +08:00
d4e6e70c43 update 优化 sql版本号更新 2025-07-07 15:30:22 +08:00
2095a96e67 update 优化 删除无用接口 2025-07-07 15:27:49 +08:00
328b61b252 !726 update 优化租户字典同步逻辑代码并添加注释
* update 优化字典同步逻辑代码并添加注释
2025-07-07 01:11:31 +00:00
781463417c update 优化SpEL表达式回显名称 2025-07-06 19:24:37 +08:00
446a14b928 update SpEL表达式回显名称 2025-07-06 19:21:23 +08:00
6c2518640b update 补充工作流动态启用注解 2025-07-06 17:50:25 +08:00
d8d138092f update 优化接口防重和加锁 2025-07-06 17:04:46 +08:00
ec31b736c7 !725 更新 pr!723 xml
* update: 更新 mapper.xml ;
* update: 更新 FlowSpelBo 参数空值校验 ;
2025-07-06 06:08:44 +00:00
e7467b2c5c !724 更新 pr!723 参数校验以及sql脚本
* update: 更新 FlowSpelBo 参数空值校验 ;
2025-07-06 06:02:44 +00:00
8050e2f1b1 update 优化 !pr723 排除租户全局使用 优化sql脚本 2025-07-06 11:16:23 +08:00
7de4559b4a update 优化 !pr723 排除租户全局使用 优化sql脚本 2025-07-06 11:10:18 +08:00
fc9c0d7657 update 优化 !pr723 排除租户全局使用 优化sql脚本 2025-07-06 11:05:46 +08:00
ab3037dc4f !723 新增工作流扩展spel表达式
* update: 更新变量名称以及初始化数据 ;
* add: 新增 FlowSpel sql 脚本 ;
2025-07-06 02:54:04 +00:00
8281b838b9 update 优化 删除无用注释 导致代码报null问题 2025-07-06 10:41:18 +08:00
2bc7171abd fix 修复密码校验误删字段 2025-07-04 19:29:30 +08:00
4f99487d24 update 优化密码校验 2025-07-04 19:18:42 +08:00
a7cddc8d40 update 优化校验角色是否有数据权限 2025-07-04 18:52:29 +08:00
f3c4c02d73 update 优化校验角色是否有数据权限 2025-07-04 18:39:54 +08:00
eb631360f4 update 优化 删除无用注释 2025-07-04 18:19:50 +08:00
a62bf04428 !721 update 发号器工具类便利性优化
* update 发号器工具类便利性优化
2025-07-04 09:46:23 +00:00
7147f81b42 fix 修复 错误修改导致页面逻辑错误 2025-07-04 17:42:19 +08:00
c9098563ca fix 修复 数据权限字段编辑错误 2025-07-04 16:55:20 +08:00
d4a8c25eab update 优化数据权限 2025-07-04 16:53:18 +08:00
0ddba506bf update 优化新增角色信息 2025-07-04 16:16:12 +08:00
d02bea85cb update 优化新增用户岗位信息判空逻辑 2025-07-04 15:54:39 +08:00
d27c58bfe8 docs 补充重构数据权限注释 2025-07-04 15:35:04 +08:00
34bb51f5c0 update 优化 增加岗位修改校验 2025-07-04 15:29:51 +08:00
64c37aaec6 update 重构用户 角色 部门 菜单的数据权限设计逻辑更符合实际业务场景与优化查询写法提高效率 2025-07-04 14:50:33 +08:00
3de036adde update 优化 屏蔽掉无用接口 2025-07-04 09:34:15 +08:00
e0df8c15d8 update 优化 修改类名 避免无用扫描 2025-07-04 09:19:29 +08:00
176793e15b update 优化 工作流代码写法 2025-07-03 14:48:53 +08:00
589ec1fdbc update 优化 增加oss扩展contentType存储 2025-07-03 10:39:23 +08:00
b421c8d017 !711 update 优化附件扩展字段对象(存储在 SysOss.ext1 的 JSON 字符串中)
* update 优化文件上传附件扩展字段对象
* update 优化保存文件的大小,方便前端进行分片下载
2025-07-03 02:20:53 +00:00
e2200bac71 update 优化流程图按审批人分组去重 2025-07-02 19:08:52 +08:00
f8950d1e20 update 优化获取流程记录 2025-07-02 18:21:53 +08:00
9dfe9f610d !715 update 优化工作流待办任务查询
* update 优化工作流待办任务查询
2025-07-02 09:15:56 +00:00
17610e8721 remove 删除 无用注解 2025-07-02 14:55:44 +08:00
f29b787767 fix 修复 有某些无聊人士 对一个demo案例提漏洞 CVE-2025-6925 2025-07-02 14:35:25 +08:00
9775283a24 !714 update 优化工作流小改动
* update 优化工作流小改动
2025-07-02 05:17:43 +00:00
debc73d7d4 !713 update 优化StreamUtils使用以及岗位删除优化
* update 优化命名含义
* update 优化StreamUtils使用以及岗位删除优化
2025-07-02 05:17:18 +00:00
d501e82541 🐳🐳🐳发布 5.4.1 小步迭代修复问题 2025-07-01 09:11:10 +08:00
3002585e63 fix 修复 修改数据权限漏改语句 2025-06-30 16:31:58 +08:00
60aca2eef3 !710 update 使用新版数据权限
* update 使用新版数据权限
2025-06-30 01:42:51 +00:00
5baf342478 !708 update 优化代码小改动
* update 优化代码小改动的逻辑性错误
* update 优化代码小改动
2025-06-27 05:34:43 +00:00
3f9919fbee update 优化 Redis缓存监控接口 手动归还连接给连接池 提高效率 2025-06-27 10:19:26 +08:00
682d8b0099 !705 update 优化分页写法
* update 优化分页写法
2025-06-27 01:32:55 +00:00
bbabffe191 !702 update 优化参数配置
* update 优化参数配置
2025-06-27 01:10:26 +00:00
6722f2eeed !703 update 优化客户端管理
* update 优化客户端管理
2025-06-27 01:07:11 +00:00
5a9728c868 update 优化流程查询以及多根节点构建树结构 2025-06-26 17:20:04 +08:00
eea96e87d9 update 优化构建多根节点的树结构(支持多个顶级节点) 2025-06-26 15:10:17 +08:00
e659740cb8 Revert "update 升级warm-flow1.7.4->1.7.5-m2 优化流程图悬浮窗"
This reverts commit 8f5d60f543.
2025-06-26 07:07:03 +00:00
314909a536 fix 修复 excel 备注与必填注解指定下标位置问题 去除下标跟随主要注解顺序 2025-06-26 14:04:36 +08:00
8f5d60f543 update 升级warm-flow1.7.4->1.7.5-m2 优化流程图悬浮窗 2025-06-26 11:26:17 +08:00
1ad0d5387b fix 修复 单元格样式覆盖问题 2025-06-26 10:41:06 +08:00
770c3bd03e fix 修复 删除错误的注解导致前端时间不显示问题 2025-06-26 09:53:40 +08:00
4b04a4bf09 update 优化全局日期格式转换配置,提升日期参数解析兼容性 2025-06-24 16:10:26 +08:00
1598447f6b Revert "update 优化SSE连接"
This reverts commit a8a1db4463.
2025-06-24 06:51:28 +00:00
a8a1db4463 update 优化SSE连接 2025-06-24 14:37:02 +08:00
4b47053dcf fix 修复 超时时间单位设置错误 应该是毫秒 2025-06-24 11:42:22 +08:00
03054fc1e8 reset 回滚aws-s3版本 有未知问题 2025-06-24 11:24:28 +08:00
9dce540a09 fix 修复 sqlserver 字段长度错误 2025-06-23 18:17:41 +08:00
534182deff !698 fix 修复 办理任务时未传参数,导致执行任务无法获取到任务参数的问题
* fix 修复 办理任务时未传参数,导致执行任务无法获取到任务参数的问题
2025-06-23 08:57:30 +00:00
4577c45110 fix 修复 升级anyline返回值类型变更导致问题 2025-06-23 14:55:51 +08:00
0796791ec9 fix 修复 升级anyline返回值类型变更导致问题 2025-06-23 14:42:06 +08:00
84baac0a4f update 优化 sse 超时时间设置为一天 避免连接之后直接关闭浏览器导致连接停滞 2025-06-22 16:39:05 +08:00
74d257a610 update 更新工作流sql(小改动) 2025-06-20 11:01:17 +08:00
cb8fa6ff9a update QueueUtils 与相关代码标记过期(redisson 新版本已经将队列功能标记删除 一些技术问题无法解决 建议搭建MQ使用) 2025-06-20 10:25:43 +08:00
c157012807 update spring-boot 3.4.6 => 3.4.7
update satoken 1.42.0 => 1.44.0
update hutool 5.8.35 => 5.8.38
update redisson 3.45.1 => 3.50.0
update aws-s3 2.28.22 => 2.31.67
update anyline 8.7.2-20250101 => 8.7.2-20250603
update maven-jar-plugin 3.2.2 => 3.4.2
update maven-war-plugin 3.2.2 => 3.4.0
update maven-compiler-plugin 3.11.0 => 3.14.0
update maven-surefire-plugin 3.1.2 => 3.5.3
2025-06-20 10:25:42 +08:00
ffa01bdb3a update 优化类型转换逻辑、删除冗余代码 2025-06-20 10:25:02 +08:00
3fa572f0a8 update 优化 去除自动注入日志警告改为默认值 避免一大堆人去定时任务搞什么登录 2025-06-20 09:27:49 +08:00
f868de1b7b fix 临时修复流程图提示信息,后续版本将通过defjson获取流程实例ID 2025-06-19 19:02:22 +08:00
fb785dc17f update 优化工作流的流程图提示信息查询 2025-06-19 18:31:58 +08:00
f3d475438f update 优化工作流的流程图提示信息 2025-06-19 18:13:34 +08:00
d7af327248 update 升级warm-flow1.7.3->1.7.4 支持流程图悬浮窗 2025-06-19 17:16:18 +08:00
bd88e27c82 update 优化 加密模块 解密拦截器 将参数一起解密了 防止参数被多次加密不正常 2025-06-17 11:03:20 +08:00
83b6addbba update 优化工作流设计器获取任务执行人默认正常状态 2025-06-17 09:49:31 +08:00
d51f3b9f4e update 优化工作流内置变量表达式解析日志级别 2025-06-17 09:17:49 +08:00
9256432532 update 优化工作流,跳过以 $ 或 # 开头的内置变量表达式解析 2025-06-16 19:55:34 +08:00
97d3a31aba fix 修复 snailjob的oracle.sql书写错误 2025-06-16 11:27:49 +08:00
d9cc85187a update 删除无用功能 2025-06-13 17:30:01 +08:00
2ff2d89b2d update 删除无用功能 2025-06-13 14:24:27 +08:00
be2e5059fd update 优化 去除snailjob的jvm参数 默认不限制 2025-06-12 17:39:34 +08:00
fad91f01ff update 优化 去除正则校验 无用配置导致问题 2025-06-09 14:54:03 +08:00
8f95374cef update 优化默认部门,不允许删除 2025-06-06 10:06:23 +08:00
7471fa7ee0 update 优化根部门不允许删除以及办理人权限名称回显 2025-06-06 09:45:06 +08:00
529f1e5dbb update 优化 租户套餐菜单查询过滤掉 租户管理相关菜单 2025-06-05 18:27:44 +08:00
eff131a1ed update 优化 忽略租户表判断改为精确匹配 2025-06-05 16:47:34 +08:00
60b0faa3c6 update 优化 将debian换为更新更契合的rockylinux(centos作者写的稳定) 升级jdk版本避免漏洞 2025-06-03 17:11:39 +08:00
b2d694b90b reset 修复 satoken异步调用需要手动传递上下文 (跟satoken无关的场景不用处理) 2025-06-03 16:13:05 +08:00
fecc564099 fix 修复 部分数据库转移符解析问题导致路由不生效 统一改为使用单斜杠处理 2025-06-03 11:17:17 +08:00
297e920179 fix 修复 satoken异步调用需要手动传递上下文 2025-06-03 10:14:13 +08:00
ea9379a52f fix 修复 justauth 官方代码bug 2025-05-30 23:40:39 +08:00
0b0f2ee8ea !692 fix: 需要传递 version 字段才能启用乐观锁
* fix: 需要传递 version 字段才能启用乐观锁
2025-05-30 08:07:24 +00:00
6d2f104a43 fixbug 修复地址解析工具类报错#ICBHUQ 2025-05-29 19:50:50 +08:00
2e50e30778 fix 修复 流程数据重复更新 状态被覆盖 无法完成流程问题 2025-05-29 18:15:47 +08:00
daf79683b3 update 优化 给测试用户增加菜单权限(可不更新) 2025-05-29 17:22:14 +08:00
5849ddc160 update 优化 给测试用户增加菜单权限(可不更新) 2025-05-29 17:05:29 +08:00
c88367939c update 优化 PermissionService 无实现类也可以启动服务 2025-05-29 16:28:09 +08:00
a748d0d62c fix 修复 监听器 flowParams 为null报错问题 2025-05-29 15:38:29 +08:00
cd531f1d39 🐳🐳🐳发布 5.4.0 正式版
fix
2025-05-29 11:13:39 +08:00
92f73a4a72 update warmflow 升级到正式版 1.7.3 2025-05-29 10:41:06 +08:00
a4e3f7ea5e update 用户查询添加用户昵称条件 2025-05-29 10:39:56 +08:00
26b4561a71 update minio 更新到最新 RELEASE.2025-04-22T22-12-26Z minio 最后一个未阉割版本 不能再进行升级 在往上的版本功能被阉割 2025-05-29 10:13:33 +08:00
dbe276a33b update 调整任务监听名称 2025-05-29 09:05:36 +08:00
4ab4e1685c update 优化事件发布 2025-05-28 20:56:27 +08:00
aab87d322c update 优化 删除重复执行的代码 2025-05-28 16:56:09 +08:00
79ee168293 update 优化禁止删除默认流程分类 2025-05-28 14:51:43 +08:00
10e4b0618c update 优化 调整菜单顺序 相关菜单放到一起 2025-05-28 11:07:23 +08:00
7c3316e116 update 调整查询流程任务记录 2025-05-27 22:21:10 +08:00
8460316632 update 调整工作流放行uri 2025-05-27 22:05:55 +08:00
5d356aa6c4 update 优化 工作流代码 2025-05-27 17:29:07 +08:00
a776d28294 update 优化 删除工作流字体文件(不需要了 改成前端渲染了) 2025-05-27 17:13:32 +08:00
a002a4e7a1 !690 新增通过前端显示流程图方式和新增办理人转换接口
* feat 新增通过前端显示流程图方式
2025-05-27 09:02:05 +00:00
79ec850eca !689 update 删除退回任务bo关于驳回的节点的非空校验
* update 删除退回任务bo关于驳回的节点的非空校验
2025-05-26 12:50:03 +00:00
d1889c42a3 update 优化 权限获取 增加用户登录了但是查询的loginId是别人的场景 2025-05-26 16:31:10 +08:00
a7ea096319 fix 修复 解决通过loginId查询角色和菜单权限 而非当前用户时 报错问题 2025-05-26 15:59:04 +08:00
4e3fc7002d update minio 更新到最新 RELEASE.2025-05-24T17-08-30Z 2025-05-26 14:43:37 +08:00
1752695751 update mapstruct-plus 1.4.6 => 1.4.8 2025-05-26 14:43:05 +08:00
2b89c3f8d0 update 优化 表格增加border 2025-05-26 12:17:33 +08:00
6b387b2456 update springboot 3.4.5 => 3.4.6
update springdoc 2.8.5 => 2.8.8
update mybatis-plus 3.5.11 => 3.5.12
update springboot-admin 3.4.5 => 3.4.7
2025-05-26 11:56:05 +08:00
ffc971cf92 fix 修复 flowParams 为null导致的报错 2025-05-26 10:07:08 +08:00
887d5e85d0 add 增加logicflow流程图预览 2025-05-25 11:48:01 +08:00
8c603ff8d7 update 调整优化监听 2025-05-24 00:16:27 +08:00
a0831dda45 fix 修复 请假表单菜单sql 展示状态错误问题
Signed-off-by: 疯狂的狮子Li <15040126243@163.com>
2025-05-23 10:07:25 +00:00
336b2e8cc3 !686 feat 新增批量级联删除菜单接口
* feat 新增批量级联删除菜单接口
2025-05-23 10:04:44 +00:00
cea4855f57 update 代码生成ServiceImpl层增加日志注解 2025-05-23 11:51:09 +08:00
9fc043b105 !684 fix: sql补全分号
* fix: sql补全分号
2025-05-22 13:39:05 +00:00
d729c8ecde update 调整流程监听 2025-05-22 20:34:25 +08:00
b726a91cdb update 新增发号器工具类方法 2025-05-22 17:52:23 +08:00
qxy
05d5d9be2c !683 update 优化 nginx代理snail-job websocket参数, 解决部署到服务器后,查看日志会显示ws连接失败
* update snail-job websocket配置, 解决部署到服务器后,查看日志会显示ws连接失败
2025-05-22 09:49:27 +00:00
c40a8b2f0b update 优化 动态路由迁移到菜单管理 2025-05-22 17:41:35 +08:00
8232908b3f update 优化统一请假日期字段格式处理 2025-05-22 17:07:05 +08:00
1db0bc83b2 update 优化 工作流创建事件 将状态交给业务方处理 2025-05-21 15:42:42 +08:00
74a0ec1ec3 update 优化 字典项校验注解增加分隔符属性 2025-05-20 14:19:21 +08:00
1228e8f3ea update 统一校验器名称风格 2025-05-20 14:03:11 +08:00
737838d92f add 新增自定义字典值校验器 2025-05-20 12:31:49 +08:00
c054029cfc update snailjob 1.4.0 => 1.5.0 2025-05-19 21:23:45 +08:00
62bbd78033 add 增加 成员项目地址 2025-05-19 17:09:38 +08:00
82a5ed632f add 增加 成员项目地址 2025-05-19 16:06:17 +08:00
52ddccba3e update 升级JustAuth的钉钉和微信第三方登录 2025-05-19 15:13:12 +08:00
1a12aecd49 docs 优化工作流自定义条件注解注释 2025-05-19 12:27:56 +08:00
777ae645c5 update 手动合并冲突 优化 工作流模块下一个节点指定办理人、角色和部门转具体用户、抄送人和消息推送,改到通过全局分派监听器和完成监听器处理
update 修复退回申请人无法发送消息问题
2025-05-19 11:31:01 +08:00
21c87eee9a update 升级warm-flow1.7.0->1.7.2 2025-05-16 20:29:30 +08:00
0c8ac12e4d fix 修复 类名书写错误 2025-05-15 17:48:33 +08:00
cf871d9387 update 优化 mysql建议版本升级到8.0.42 2025-05-14 18:08:58 +08:00
90fb26fbf1 update 优化 redis建议版本升级到7.2.8 2025-05-14 18:01:46 +08:00
fdfca0b33a update 优化 代码写法 2025-05-12 18:28:24 +08:00
facd3e351f fix 修复 重构导致的问题 2025-05-12 18:22:11 +08:00
a4ad56f0eb fix 继续修复查询办理人错误使用 2025-05-12 18:18:10 +08:00
b9e5914bab fix 修复查询办理人错误使用 2025-05-12 18:11:32 +08:00
553fca28a2 update 优化假分页方法 2025-05-12 16:51:58 +08:00
97caabe0a2 update 优化 update sql 书写错误 2025-05-12 13:01:55 +08:00
122f2770b2 update 优化 !pr678 代码结构 2025-05-12 12:56:24 +08:00
748c95b30f update 优化 增加 其他数据库的升级sql 2025-05-12 10:59:12 +08:00
e0672fc753 update 优化 增加对接gitea对接前端的pr地址 2025-05-12 10:12:20 +08:00
5a1523564b !677 add 新增 对接 gitea 三方单点登录
* add 新增 对接 gitea 三方单点登录
2025-05-12 02:07:46 +00:00
0c2fe34d92 !678 add 新增自定义 Date 类型反序列化处理器(支持多种格式)
* add 新增自定义 Date 类型反序列化处理器(支持多种格式)
2025-05-12 02:04:43 +00:00
2dde42168f update 更新 readme 增加新成员项目 2025-05-12 09:33:32 +08:00
a5c2093c76 docs 修正验证码注释 2025-05-11 18:12:49 +08:00
ea74803ccc add 新增请求体读取异常处理 2025-05-11 17:57:42 +08:00
9df837f047 update 重构办理人接口 2025-05-10 16:51:56 +08:00
d6758dc47b update 调整获取申请人节点接口 2025-05-10 16:41:50 +08:00
5a8dc8e1cf update 升级warm-flow1.7.0
update 调整流程撤销
remove 删除无用代码
2025-05-10 15:51:17 +08:00
eac7f1b4e2 docs 优化EncryptUtils加解密注释 2025-05-10 14:48:34 +08:00
3749e7e724 update 更新 readme 2025-05-09 16:04:05 +08:00
b709bc0214 update 更新 readme 2025-05-09 15:00:37 +08:00
a09414110e update 优化 compose编排增加snailjob端口防止集群冲突 2025-05-08 23:14:07 +08:00
053dc50c4d update 更新 readme 2025-05-08 22:14:07 +08:00
5382722867 update 优化 多租户忽略表判断支持忽略大小写 2025-05-06 13:30:03 +08:00
5e51077347 update 优化 直接从ClassPath加载ip2region数据库文件 2025-04-29 19:01:45 +08:00
6d44069364 !675 update 查询系统菜单列表新增菜单类型与父级ID查询条件
* update 查询系统菜单列表新增菜单类型与父级ID查询条件
2025-04-29 08:29:46 +00:00
e1e3843ec0 fix 修复 snailjob http basic验证判断错误 2025-04-27 22:09:14 +08:00
15905b7022 update 放开申请人附件与抄送限制 附件改为按钮权限控制 2025-04-26 12:52:36 +08:00
1c5ae2f168 update 优化 获取地址支持IPv6逻辑 2025-04-26 00:20:34 +08:00
f29e0223a7 update 优化 获取地址支持IPv6判断而不是抛异常 2025-04-26 00:11:58 +08:00
9fbe3cf399 update springboot 3.4.4 => 3.4.5 2025-04-25 16:40:13 +08:00
e4f1da30fc update 优化日期与字符串工具类 2025-04-25 13:38:41 +08:00
21deab4bf1 update 删除已经不存在的功能 2025-04-25 09:52:01 +08:00
d7d7dcbcf7 docs 优化枚举类型注释 2025-04-23 12:30:07 +08:00
3f680385a9 update 更新协议地址 2025-04-22 16:08:38 +08:00
7ecf4bbf1c update 优化 关于excel说明 2025-04-18 17:47:05 +08:00
ae65985fbc !668 update EasyExcel升级原作者FastExcel
* remove 移除之前暂时性控制漏洞依赖
* update EasyExcel升级1.2.0并升级commons-io到最新版解决导出报方法找不到异常
* update EasyExcel升级原作者FastExcel
2025-04-18 09:30:33 +00:00
2a34c3ebb2 !672 fix: 修复 excel 合并单元格在导出在最后一行无法合并时,之前的数据合并失效问题
* fix: 修复 excel 合并单元格在导出在最后一行无法合并时,之前的数据合并失效问题
2025-04-18 05:30:12 +00:00
3b46f8c8cf update 优化返回任务指派的列表增加时间查询条件 2025-04-18 11:48:31 +08:00
7c2efb1aef update 优化 getNextNodeList 只获取中间节点用于审批 过滤其他无用节点 2025-04-17 14:00:13 +08:00
Q&Q
ea25474529 !670 fix 修复 sqlserver 脚本内的缺失符号
* fix 修复 sqlserver 脚本内的缺失符号
2025-04-16 06:22:07 +00:00
33e1d34ce5 update 优化 缓存注解支持关闭本地缓存 2025-04-14 10:09:03 +08:00
142fb33d81 update 优化 实体类统一使用包装类型 2025-04-14 09:33:36 +08:00
ee6c0388da update warm-flow 1.6.8 => 1.6.10 2025-04-14 09:05:15 +08:00
c171817d6a add 新增 一大堆snailjob的demo案例(感谢 老马) 2025-04-13 19:16:57 +08:00
71dddee146 update 优化Mybatis异常处理器 2025-04-13 13:28:40 +08:00
d456ff64f1 Revert "update 优化返回vo的boolean类型统一使用包装类"
This reverts commit 9e78fcccf7.
2025-04-13 12:49:03 +08:00
9e78fcccf7 update 优化返回vo的boolean类型统一使用包装类 2025-04-13 12:46:24 +08:00
878cd7e9f0 update 优化工作流用户查询构建 2025-04-12 17:22:44 +08:00
5c9721cfac update 优化工作流权限按钮获取,若需要扩展更多按钮权限,只需在 sources 中新增对应的枚举类或字典类型 2025-04-11 16:01:03 +08:00
31502dccc7 update satoken 1.40.0 => 1.42.0 适配所有升级项(改动较多)
SaLoginModel -> SaLoginParameter
device -> deviceType
satoken BCrypt -> hutool BCrypt(satoken不维护了)
SaTokenDao -> SaTokenDaoBySessionFollowObject(satoken做了重构封装)
sse 适配新satoken版本拦截器变化
2025-04-11 15:36:38 +08:00
538aa8d908 update 优化 统一流程demo 权限人分隔符 2025-04-11 15:07:18 +08:00
00003b2c57 fix 修复 sqlserver 脚本内的多余符号 2025-04-11 10:18:05 +08:00
a2c238d466 update bouncycastle 1.76 => 1.80 2025-04-10 17:29:44 +08:00
d89f147c54 fix 修复 临时解决sa-token使用秒 redis是毫秒导致1秒的精度问题 手动补偿(等satoken官方修复) 2025-04-10 17:22:34 +08:00
53cf1b2013 update 优化工作流获取流程变量 2025-04-10 16:44:51 +08:00
564ab331d7 update 统一工作流FlowParams构造方式为建造者模式,提升代码可读性 2025-04-10 16:01:29 +08:00
a690ece164 update 优化 调整监听器事件参数代码 2025-04-09 11:53:40 +08:00
b50904c6ff update 优化工作流流程监听增加节点信息 2025-04-09 10:57:29 +08:00
70aa14ecf8 update 优化工作流办理人权限处理器 2025-04-09 10:35:19 +08:00
c37b92978a update 调整注释 删除不存在的错误的东西 2025-04-09 10:23:59 +08:00
ef39ad7107 update 增加赞助商 2025-04-08 10:16:31 +08:00
48d3ef9818 update 优化 统一校验注解长度 2025-04-08 10:16:20 +08:00
5bf901cdcd update 优化 增加api审批简化方法 2025-04-03 13:34:41 +08:00
8e99dd306a https://gitee.com/dromara/RuoYi-Vue-Plus/issues/IBYCY7
fix 修复选择弹窗会签人员后,会签审批出现每个任务的审批人都是选择的多人
2025-04-02 21:03:58 +08:00
07fdc240d7 fix 修复 在线用户设置过期时间与客户端不同步问题 2025-04-02 14:04:41 +08:00
023ceaaf91 !666 fix: 模板导出多个字段下拉值超过100个异常,采用多个sheet的方案解决。
* fix: 模板导出多个字段下拉值超过100个异常,采用多个sheet的方案解决。
2025-04-02 05:20:53 +00:00
9e551a0b2a !665 admin Dockerfile 构建文件新增暴露 snail job 客户端端口 用于定时任务调度中心通信
* admin Dockerfile 构建文件新增暴露 snail job 客户端端口 用于定时任务调度中心通信
2025-04-01 06:29:08 +00:00
7c3f3523ea update 优化 使用 record 简化vo代码 2025-03-31 11:31:05 +08:00
40eac07789 update 优化 FlwNodeExtServiceImpl 代码实现 2025-03-31 10:56:03 +08:00
5868fadbf5 update 优化 sse 删除之后 手动触发完成 防止内存泄漏 2025-03-31 09:42:30 +08:00
124bcc4bba update 优化 sse 删除之后 手动触发完成 防止内存泄漏 2025-03-31 09:41:53 +08:00
e71d6fa983 update 优化 支持excel方法抛出json异常 2025-03-28 23:12:40 +08:00
7129ad4fac Revert "update 优化 支持excel方法抛出json异常"
This reverts commit 16923cc86a.
2025-03-28 23:11:11 +08:00
16923cc86a update 优化 支持excel方法抛出json异常 2025-03-28 22:51:32 +08:00
3761473967 🐳发布 5.3.1 正式版 2025-03-27 10:45:00 +08:00
34031cae8d update 优化 删除无用配置 2025-03-27 10:38:48 +08:00
26abb98747 fix 修复 excel模板导出数据被覆盖的问题 2025-03-27 10:03:16 +08:00
c2f67b4a77 update 优化 统一用户密码校验长度 2025-03-27 09:32:16 +08:00
4d925a4d62 update mybatis-plus 3.5.10.1 => 3.5.11
update snailjob 1.4.0-beta2 => 1.4.0 正式版
2025-03-26 15:18:39 +08:00
4e62054bd1 fix 修复 跨域未设置请求头问题(cloud版本不需要 vue版本需要) 2025-03-26 14:30:25 +08:00
fe40d7db32 发布 5.3.1-BETA2 公测版本 2025-03-21 15:17:31 +08:00
c0eeafb5cd update 优化 excel导出 下拉框支持顺序 2025-03-21 15:14:54 +08:00
5626b97a19 update 优化 兼容老版本数据权限用户写法 2025-03-21 14:42:58 +08:00
0f95e9393d update springboot 3.4.3 => 3.4.4 2025-03-21 13:55:38 +08:00
5de1ffff90 update 优化 excel导出 下拉框支持顺序 2025-03-21 13:53:23 +08:00
33698ee448 fix 修复 转换id 参数为null报错问题 2025-03-20 16:53:15 +08:00
5e5d478cf2 !660 fix 修复 pg强类型校验问题
* fix 修复 pg强类型校验问题
2025-03-19 06:50:24 +00:00
778096d100 !658 fix 修复pg数据库 强类型转换报错
* fix 修复pg数据库 强类型转换报错
2025-03-19 05:23:34 +00:00
bba163f7b4 update warm-flow 1.6.7 => 1.6.8 2025-03-19 11:34:53 +08:00
d4f792810e update 优化 简化 SysTaskAssigneeServiceImpl 代码实现 2025-03-19 10:09:32 +08:00
d14ee59912 update springboot-admin 3.4.2 => 3.4.5
update redisson 3.44.0 => 3.45.1
update sms4j 3.3.3 => 3.3.4
2025-03-18 17:25:01 +08:00
be5d69d5a5 update snailjob 1.3.0 => 1.4.0-beta2 2025-03-18 17:18:50 +08:00
97c36674e4 update 优化 打包默认跳过测试 减少心智难度 2025-03-18 13:44:35 +08:00
1f1564fad9 update 优化 修改oss枚举包名与其他模块统一 2025-03-17 09:32:53 +08:00
c79e053bea update 调整流程定义,修复使用leave6提交错误问题 2025-03-15 22:53:31 +08:00
92e9ed771b update 优化 代码书写格式 2025-03-13 17:47:32 +08:00
800c6c8ff3 update 优化工作流办理人标识符解析 2025-03-13 17:26:05 +08:00
865627fdad update 优化获取节点扩展属性,简化节点编码 2025-03-13 16:20:48 +08:00
192537672e !654 update 优化函数注释以准确描述SSE会话
* update 优化函数注释以准确描述SSE会话
2025-03-13 07:37:22 +00:00
384f9528e7 fix 修复 实体类书写错误 2025-03-13 13:39:36 +08:00
5fc76b6426 发布 5.3.1-BETA 公测版本 2025-03-13 13:26:46 +08:00
4d8a45204c fix 修复 部门树对应前端新树结构缺少字段问题 2025-03-13 12:51:42 +08:00
2de9397db8 remove 删除无用代码 2025-03-13 11:36:49 +08:00
bfc73ed214 update 优化 将crt客户端替换为Netty客户端 节约17M打包大小 2025-03-13 11:34:26 +08:00
8bf741fd5b fix 修复 关闭验证码后 限流注解仍然生效问题 2025-03-12 17:29:48 +08:00
460545a75e update 优化 字典方法命名 2025-03-11 17:56:02 +08:00
a93b30ec91 update warm-flow 1.6.7 升级正式版 2025-03-11 14:15:20 +08:00
34bac1add9 update 优化权限标识符增加通配符* 2025-03-10 11:12:39 +08:00
f028cb76fc add 增加示例 2025-03-08 00:36:44 +08:00
5a4be5fba1 add 增加条件表达式示例
fix 修复提交修改变量参数没有覆盖变量问题
2025-03-08 00:35:57 +08:00
23245b78ca fix 修复获取下一环节排他网关出现条件错误
add 增加示例
2025-03-08 00:09:08 +08:00
13ac302525 update 优化 getLoginUser 方法 支持返回多种类型登陆实体 2025-03-07 15:09:44 +08:00
96a62a3564 update 回滚错误修改 2025-03-07 15:06:36 +08:00
7adf702283 update 优化 getLoginUser 方法 支持返回多种类型登陆实体 2025-03-07 15:05:14 +08:00
279c8e014a update 补充注释 2025-03-06 22:23:48 +08:00
b7517cbbd4 update 优化 重构将 WorkflowUtils 工具类改为 FlwCommonService 更通用的业务处理 2025-03-06 17:36:47 +08:00
45eac02f4f update 优化 将工作流消息发送从工具类迁移到业务内 便于扩展 2025-03-06 16:46:39 +08:00
a6b7c3afe6 fix 修复 前端树处理优化后 后端缺字段问题 2025-03-06 16:08:15 +08:00
e99e4f6c58 update 调整获取下一节点 2025-03-05 22:32:18 +08:00
bcb97bc406 add 添加设置下一审批人 2025-03-05 22:26:31 +08:00
ad01406fc1 update 优化 text 设置默认值某些版本可能有问题 改为默认null 2025-03-05 15:33:11 +08:00
15eb08c065 update 调整获取下一节点,增加用户分页查询参数 2025-03-04 21:51:16 +08:00
2340556091 update 优化 调整字段长度 2025-03-04 10:03:13 +08:00
65c54184e8 update 优化 sys_oss 表增加扩展字段 ext1 2025-03-04 09:51:46 +08:00
9dcb7c6a12 update 优化 增加5.3.0-5.3.1升级sql 2025-03-04 09:44:11 +08:00
0c6faa751a update 删除无用sql 2025-03-04 09:34:17 +08:00
b465cb34de Merge branch 'dev' of https://gitee.com/dromara/RuoYi-Vue-Plus into dev 2025-03-03 21:02:13 +08:00
21c12a791a add 添加获取节点接口 2025-03-03 21:02:03 +08:00
723a0b6d9c update mybatis-plus 3.5.10 => 3.5.10.1 修复个bug 2025-03-03 13:49:58 +08:00
c4ef053958 add 增加节点查询 2025-03-02 00:09:18 +08:00
055d1f3bb2 update 调整流程图颜色 2025-03-01 23:55:48 +08:00
fe27d8920a add 增加按钮权限 2025-03-01 23:46:20 +08:00
df65670d3d update 优化校验框架配置类加载顺序,确保优先于默认的验证配置 2025-02-28 16:06:16 +08:00
2623d0b343 update 调整注释错误,补充注释 2025-02-28 14:46:59 +08:00
c0e0b41d13 update 更新warm-flow版本到1.6.7-M2,权限按钮改为枚举类 2025-02-28 12:05:35 +08:00
8763bfa3d3 update 优化删除无用排除 2025-02-27 17:31:08 +08:00
71180584da update 优化根据字典类型查询信息增加一级缓存 2025-02-26 09:54:20 +08:00
319a89e320 fix 修复 oracle 同步字典报错问题 2025-02-25 23:39:02 +08:00
0673cf8849 update 优化流程设计器-节点扩展属性注释 2025-02-25 22:56:27 +08:00
b537899e62 update 更新warm-flow版本到1.6.7-M1 2025-02-25 22:18:58 +08:00
7b679e60e0 update 优化工作流设计器获取任务执行人查询正常状态 2025-02-25 17:55:54 +08:00
bb475a6088 update 优化 删除无用配置类 2025-02-21 20:31:58 +08:00
a217c495d1 update 优化 租户表企业名与部门表长度保持一致 防止长度不一致报错 2025-02-21 15:40:31 +08:00
bdb86e2b3a update springboot 3.4.2 => 3.4.3
update springdoc 2.8.4 => 2.8.5
2025-02-21 10:10:09 +08:00
e8700ac44b update 优化 删除多余响应头设置 2025-02-21 09:37:24 +08:00
d80f6ab695 fix 修复 oracle 新建租户报错问题 2025-02-20 17:46:04 +08:00
381be5a1a1 fix 修复 oracle 表别名不能写as关键字 2025-02-19 13:27:46 +08:00
214cbac9a6 update 优化 ProcessTaskEvent 改名为 ProcessCreateTaskEvent 避免错误理解 2025-02-19 09:43:17 +08:00
906a031172 update 优化部门下岗位名称重复 2025-02-19 09:07:46 +08:00
236dd6e054 update 删除无用文件 2025-02-17 15:22:47 +08:00
eb17eb6559 !646 fix 修复Caffeine缓存未清空导致的部门创建显示延迟问题
* fix 修复Caffeine缓存未清空导致的部门创建显示延迟问题
2025-02-15 04:58:37 +00:00
2746af21f0 update 优化 根部门祖级列表常量和备注,以避免歧义 2025-02-13 17:39:30 +08:00
78abb617ce update 优化 nginx开启静态资源压缩 增加静态文件传输效率 2025-02-11 16:03:14 +08:00
3c57c0e7f9 update springboot-admin 3.4.1 => 3.4.2 修复重新登录404问题 2025-02-11 09:51:31 +08:00
934bbe8bd7 update springboot 3.4.1 => 3.4.2
update springdoc 2.8.3 => 2.8.4
update satoken 1.39.0 => 1.40.0
update redisson 3.43.0 => 3.44.0
2025-02-07 14:15:54 +08:00
718a010c0f Revert "fix 修复 monitor 设置 context-path 导致退出重新登录404问题"
This reverts commit d194b39e57.
2025-02-07 13:07:53 +08:00
a87071b834 fix 修复 结束监听器 flowParam 可能为null问题 2025-02-06 16:16:14 +08:00
2c598f93ab fix 修复 splitTo 转换后的list包含null问题 2025-02-06 16:15:19 +08:00
0937093851 fix 修复 sse关闭 用户id或token为空报错问题 2025-02-06 16:14:51 +08:00
b528f0bd14 🧨🧨🧨发布 5.3.0 新春版 祝大家新年快乐 2025-01-24 13:06:31 +08:00
7c2c82fc0a fix 修复 postgres sql缺少字段问题 2025-01-24 12:42:48 +08:00
ffe8b16ff3 fix 修复 翻译报错问题 2025-01-24 12:17:36 +08:00
ecf7ebad53 update snailjob 升级 1.3.0 正式版
update warmflow 升级 1.6.6 正式版
2025-01-24 11:30:46 +08:00
3bf26cd509 fix 修复 pg强类型校验问题 2025-01-24 11:30:18 +08:00
a671d4a8a8 update warm-flow 升级 1.6.0 正式版 2025-01-22 16:41:14 +08:00
d9713d0f8c update 优化 测试用户增加工作流业务查看审批权限 2025-01-22 16:32:17 +08:00
aeaa33ebd3 fix 修复 params可能为null问题 2025-01-22 14:24:56 +08:00
c64de03d27 update 优化 WorkflowService 增加获取流程变量方法 2025-01-22 11:24:06 +08:00
2d99304396 update 优化 WorkflowService 增加获取流程变量方法 2025-01-22 11:19:51 +08:00
a22dc9537f update 优化 业务事件监听器增加流程审批参数传递 更方便的对接业务数据 2025-01-22 11:13:24 +08:00
6c28f8a0dd update 优化 驳回增加附件上传 2025-01-22 11:12:38 +08:00
c100168374 update 删除无用链接 2025-01-20 18:26:54 +08:00
8636d8b3e8 update snailjob 1.3.0-beta2 2025-01-20 15:08:40 +08:00
37b2d648b1 update 优化 发起流程api返回值使用对象封装 2025-01-20 12:52:55 +08:00
27b4992f6e fix 修复 流程类别回显问题 2025-01-20 12:38:10 +08:00
001297ca7a 发布 5.3.0-BETA 公测版本 2025-01-20 11:35:05 +08:00
4f3cbc4bc2 fix 修复分页构建没有默认值 2025-01-18 10:37:42 +08:00
008e02a406 update 优化任务办理 2025-01-17 21:58:43 +08:00
e8acfac091 fix 修复 文件下载 设置content-length无效问题 2025-01-17 18:03:00 +08:00
e1a26b0388 update 优化 缺少导包问题 2025-01-17 17:12:57 +08:00
a6fc47b4f6 fix 修复 部署工作流缺少字体文件问题 2025-01-17 17:08:50 +08:00
ce7f5121b0 update 优化 查询oss图片url接口改为query标识符 2025-01-17 17:08:50 +08:00
b38ca837d6 update 优化 绑定三方与解绑三方校验token是否存在 2025-01-17 17:08:50 +08:00
a2714fb9f7 update 优化 OSS私有桶的临时URL获取方法
Signed-off-by: 秋辞未寒 <545073804@qq.com>
2025-01-17 07:55:17 +00:00
8c57d694c5 update 优化 编译警告问题 替换过期方法与类 2025-01-17 10:49:32 +08:00
0ae521a7dc update springboot 3.3.5 => 3.4.1
update springdoc 2.7.0 => 2.8.3
update mybatis-plus 3.5.9 => 3.5.10
update hutool 5.8.31 => 5.8.35
update springboot-admin 3.3.4 => 3.4.1
update redisson 3.39.0 => 3.43.0
update mapstruct-plus 1.4.5 => 1.4.6
update lombok 1.18.34 => 1.18.36
update anyline 20241022 => 20250101
update snailjob beta1 => beta1.1
2025-01-17 10:42:31 +08:00
79ec3fd2c9 update 优化 升级warmflow 1.6.0-m5 解决监听器错误触发问题 2025-01-17 09:29:22 +08:00
69b95b3e7a update 优化 默认注释掉slave数据源 2025-01-16 17:56:29 +08:00
9d8b9fabbe update 优化 ws模块替换session的时候关闭session连接 2025-01-16 11:50:19 +08:00
875c9fa77c fix 修复 升级之后部署异常问题 2025-01-16 11:00:38 +08:00
6bc2d9d4a7 update 优化 升级sqlserver warmflow sql脚本 2025-01-16 10:23:55 +08:00
fe5a1f358d update 优化 更正类命名 2025-01-16 09:34:31 +08:00
1972537176 update 回退update.sql修改 2025-01-15 20:50:56 +08:00
8f21e9e2fd update 优化代码以及注释 2025-01-15 20:46:11 +08:00
089a79002f update 升级warm-flow的sql语句 2025-01-15 19:06:42 +08:00
ece1dee990 update 将部署文件迁移到更适合的文件夹下 2025-01-15 17:41:57 +08:00
652f5161a9 update 适配 新版本将xml转为json 2025-01-15 17:40:31 +08:00
4ba4ea4fcc update 升级warm-flow到1.6.0-m4 2025-01-15 16:56:09 +08:00
3444b50da6 update 优化 工作流配置书写错误 2025-01-15 09:56:08 +08:00
62b7d96551 fix 修复 实体类方法书写错误(不影响功能) 2025-01-14 23:00:04 +08:00
cb71df8a42 update 优化 工作流使用系统自带雪花生成器 2025-01-14 14:41:01 +08:00
dd54cc972a fix 修复 配置名书写错误 2025-01-14 14:12:19 +08:00
6f14c91d30 update 优化 !pr636 改为注解方式关闭 2025-01-14 14:05:30 +08:00
6f0dd8dc89 !636 update 优化 支持通过配置文件关闭工作流
* update 优化 支持通过配置文件关闭工作流
2025-01-14 05:40:07 +00:00
7d82f954ac update 优化 部分代码与bug 2025-01-13 19:37:45 +08:00
69130a76e4 fix 修复 多角色未拆分问题 2025-01-13 19:09:13 +08:00
9086d32bee fix 修复 多角色未拆分问题 2025-01-13 18:52:52 +08:00
a680310f80 fix 修复 satoken dao层获取timeout为秒导致丢失毫秒进度问题(临时修复 等satoken官方解决) 2025-01-13 15:03:23 +08:00
a07880e1d0 Revert "fix 修复 satoken dao层获取timeout为秒导致丢失毫秒进度问题(临时修复 等satoken官方解决)"
This reverts commit e36e8f7758.
2025-01-13 14:26:31 +08:00
ae584d54a6 !635 合并 warmflow 功能分支
* update 优化 工作流设计器支持token传输 只需要放行token头获取即可
* Merge remote-tracking branch 'origin/dev' into warm-flow-future
* update 优化 无需多余set变量
* update 优化 避免重复处理
* update 优化 实体类隔离
* add 增加流程启动,办理接口
* update 调整流程驳回
* Merge remote-tracking branch 'origin/dev' into warm-flow-future
* update warmflow 1.3.7
* update 增加 warmflow oracle pg sqlserver sql脚本文件
* update 增加 warmflow oracle pg sqlserver sql脚本文件
* add 新增workflow不同的sql语句
* add 新增添加租户同步默认流程定义
* update 优化 流程列表查询 删除无用mapper
* update 导入流程 支持并发多文件上传
* update 调整流程定义查询
* update 优化 统一书写格式
* Merge remote-tracking branch 'origin/dev' into warm-flow-future
* update 优化发布事件增加租户ID
* update 调整驳回记录
* Revert "update 获取用户简略信息,祖级部门列表,部门负责人等"
* update 获取用户简略信息,祖级部门列表,部门负责人等
* update 更新warm-flow版本到v1.3.6-m1
* update 更新注释信息
* fix 临时修复 warm参数读取问题
* update warm-flow 1.3.4 => 1.3.5 优化流程图导入
* update 更新warm-flow版本到v1.3.5 2024-12-20
* update 增加抄送人名称
* update 我的抄送增加申请人以及更新时间
* update 优化监听事件注释
* update 优化流程分类名称翻译回显
* fix 修改根据流程分类id查询
* update 新增流程分类id查询
* fix 修复抄送错误
* fix 修复错误判空
* fix 修复错误判空
* update 新增删除流程事件
* Merge remote-tracking branch 'origin/dev' into warm-flow-future
* Merge remote-tracking branch 'origin/dev' into warm-flow-future
* update 调整sql书写顺序
* fix 修复 抄送缺数据问题 与 已完成任务数据取错问题
* update 新增根据业务id查询流程实例详细信息
* update 调整变量参数
* update 调整分类接口
* update 统一业务id参数
* update 调整返回参数
* update 增加业务id通用查询条件
* update 优化代码 修复bug
* update 优化新增流程分类判断
* Merge remote-tracking branch 'origin/dev' into warm-flow-future
* update 调整驳回
* update 优化错误注释
* update 优化流程分类sql语句
* update 调整驳回
* update 删除流程分类状态
* update 增加流程定义防重
* [fix]
* update 优化代码 修复bug
* update 优化流程定义增加类别树查询
* update 新增翻译根据流程分类ID查询流程分类名称
* update 根据分页对象构建表格分页数据对象
* update 优化流程定义列表名称
* update 优化流程分类校验
* update 导入流程 支持自定义类别
* update 流程案例 增加表单路径
* update 流程定义查询返回表单路径
* update 优化任务业务层
* fix 修复 请假天数不准确问题
* update 优化驳回 撤销
* update 删除类别查询权限 通用查询不需要加权限
* fix 修复 变量名修改错误
* Merge branch 'warm-flow-future' of https://gitee.com/dromara/RuoYi-Vue…
* update 调整驳回
* update 表名类名统一命名
* Merge branch 'warm-flow-future' of https://gitee.com/dromara/RuoYi-Vue…
* update 挑战者驳回 撤销
* Merge remote-tracking branch 'origin/dev' into warm-flow-future
* fix 修复会签 票签撤销问题
* update 调整并行环节撤销错误 增加办理校验
* Merge branch 'warm-flow-future' of https://gitee.com/dromara/RuoYi-Vue…
* update 优化获取办理人
* update 优化 workflow模块增加doc依赖输出接口文档
* Revert "update 优化 删除无用方法"
* Merge remote-tracking branch 'origin/dev' into warm-flow-future
* Merge branch 'warm-flow-future' of https://gitee.com/dromara/RuoYi-Vue…
* update 调整代办人查询错误 增加示例
* update 优化 重构代码
* update 优化 重构代码
* update 优化 将工作流消息推送改为sse
* add 添加模型
* update 调整审批记录
* update 调整请假案例
* fix 修复流程定义查询错误
* update 调整流程实例查询错误
* update 调整获取当前登录任务实例
* add 添加消息发送
* update 调整办理监听
* [add]
* [fix]
* update 重构 将工作流查询逻辑封装为单独的service类
* [update]
* [add]
* 办理附件提交
* 申请人查询修改
* update 回退优化 删除无用方法
* update 优化任务办理人翻译实现
* update 优化任务分配人枚举
* update 优化 删除无用方法
* Merge remote-tracking branch 'origin/dev' into warm-flow-future
* Merge remote-tracking branch 'origin/dev' into warm-flow-future
* [add]
* update 优化全局任务办理监听
* update 删除无用引入
* Merge remote-tracking branch 'origin/dev' into warm-flow-future
* update 优化激活/挂起取反逻辑
* !614 style workflow xml 格式
* style workflow xml 格式
* !612 fix FlwInstanceMapper xml错误
* fix FlwInstanceMapper xml错误
* update 优化 后端代码
* update 优化接口请求路径
* update 调整已办排序
* add 添加任务作废
* update 调整任务办理操作
* update 调整加签,减签校验
* update 调整加签
* add 添加获取当前任务的办理人接口
* add 添加任务查询会签,票签比例
* update 调整任务,实例查询
* update 调整任务委托,转办,优化部分代码等
* update 调整流程定义视图
* add 添加任务,流程实例常用查询接口
* Merge branch 'dev' into warm-flow-future
* update 优化工作流常量使用
* update 优化流程记录运行时长获取
* update 优化任务管理控制层
* update 回复业务状态枚举
* update 优化业务状态枚举
* update 调整昵称翻译
* update 调整修改办理人接口
* update 调整流程全局监听,调整任务办理人批量修改,优化代码
* update 优化查询可驳回节点
* update 优化添加抄送人
* update 优化增加人员类型枚举,删除无用常量
* update 优化请假天数工具类,删除缓存,加锁处理,可以采用外部传参的形式处理redis部分
* update 优化请假天数计算
* update 优化任务完成时间处理
* update 优化任务办理人获取
* update 优化任务操作,委派、转办、加签、减签、修改办理人等
* add 新增warm-flow-all.sql
* del 删除多余SQL
* del 删除无用vo
* del 删除表单管理信息
* del 删除节点配置信息
* update 优化节点类型常量获取
* update 优化权限办理人获取
* update 优化权限办理人获取判断
* update 提交等待新版本待优化的开始监听信息
* update 新增获取部门负责人
* add 新增分派办理人监听器
* update 优化或者字符串用户ID
* update 用户前缀去掉
* update 调整流程实例状态查询
* add 添加流程撤销
* add 添加流程抄送
* add 新增办理人权限处理器
* update 升级warm-flow1.3.4
* Merge branch 'dev' into warm-flow-future
* update 调整流程定义复制
* update 调整流程启动设置启动人变量
* update 调整流程定义删除
* update 调整流程定义导入
* update 调整工作流任务,流程定义等查询
* update 调整工作流人员翻译查询
* update 调整转办,加签等参数
* update 调整流程办理设置办理人
* update 调整流程设计保存
* update 调整流程状态,移除过时方法,调整查询办理人
* update 补充工作流请求增加鉴权
* update 工作流请求增加鉴权
* update 新增流程完成监听器
* update 新增流程启动监听器
* Merge remote-tracking branch 'origin/dev' into warm-flow-future
* update 更新warm-flow版本
* update 优化workflow表sql格式
* update 优化,增加岗位权限判空处理
* update 当前用户所有权限岗位ID改为从token获取
* update 当前用户所有权限增加岗位ID权限
* update 更新通过岗位ID查询用户
* update 优化激活/挂起流程定义判断
* Revert "add 新增异常处理器和工作流封装包"
* add 新增异常处理器和工作流封装包
* update 优化待办任务查询以及任务流转
* update 优化工作流工具,避免多次获取请求
* fix 修改无效标识
* Merge remote-tracking branch 'origin/dev' into warm-flow-future
* update 查询部门并返回任务指派的列表根据部门树搜索
* Merge remote-tracking branch 'origin/dev' into warm-flow-future
* update 优化任务办理人分组
* update 优化任务办理人查询
* update 优化任务办理人查询
* update 优化任务办理人
* update 完善任务办理人
* add 新增角色办理人
* !596 优化工作流代码逻辑
* update 优化工作流工具冗余代码
* update 优化工作流代码逻辑
* update 调整办理 驳回 终止等状态
* update 调整流程定义查询
* 解决冲突提交 warmflow代码
* update 升级warm-flow到1.3.0 调整流程办理 ,驳回,终止等 添加自定义监听
* Merge remote-tracking branch 'origin/dev' into warm-flow-future
* update 调整流程xml查询
* update 调整驳回
* update 升级warm-flow
* update 调整任务办理设置办理人
* 调整转办,委托参数
* update warm-flow 1.2.4 => 1.2.7
* Merge remote-tracking branch 'origin/dev' into warm-flow-future
* update 调整抄送错误
* 添加已办,未办
* Merge branch 'warm-flow-future' of https://gitee.com/dromara/RuoYi-Vue…
* add 添加我发起的单据接口
* Merge remote-tracking branch 'origin/dev' into warm-flow-future
* update 调整流程实例,待办查询
* remove 删除无用校验
* add 添加待办人查询
* Merge branch 'dev' into warm-flow-future
* update 调整字段错误,流程导入
* add 添加流程激活/挂起接口 升级warm-flow到1.2.4
* add 添加历史流程定义查询 调整流程发布
* Merge remote-tracking branch 'origin/dev' into warm-flow-future
* Merge remote-tracking branch 'origin/dev' into warm-flow-future
* Merge remote-tracking branch 'origin/dev' into warm-flow-future
* Merge remote-tracking branch 'origin/dev' into warm-flow-future
* update 优化 TenantSpringCacheManager 处理逻辑
* fix 修复 一级缓存key未区分租户问题
* update 优化 角色权限判断
* update 更新 readme
* update 优化 增加删除标志位常量优化查询代码
* fix 修复 登出无法正确删除对应的租户数据问题
* update 优化 sse 拦截网络中断io异常
* fix 修复 登录错误锁定不区分租户问题
* update 优化 sse 关闭连接各种异常问题
* update 优化 监控使用独立web依赖
* fix 修复 代码生成 错误匹配表名问题
* update 优化 适配 anyline 新改动
* update anyline 8.7.2-20240728
* update 脱敏策略优化增加密码
* add 新增 更多脱敏策略
* update 优化oss查询代码
* update 优化 sse发送消息 增加token有效期判断
* fix 修复 登出后重新登录 sse推送报错问题
* fix 修复 代码生成 数据源切换问题
* update anyline 8.7.2-20240726
* fix 修复 代码生成 表结构缓存问题
* update snailjob 1.1.0 => 1.1.1
* fix 修复 代码生成 表结构缓存问题
* update 优化 sse 自动装配
* 初始化添加warm-flow
2025-01-13 06:08:15 +00:00
e36e8f7758 fix 修复 satoken dao层获取timeout为秒导致丢失毫秒进度问题(临时修复 等satoken官方解决) 2025-01-13 13:36:12 +08:00
b47798ef19 update 优化 无需多余set变量 2025-01-12 20:36:22 +08:00
55b1a67637 update 优化 避免重复处理 2025-01-12 20:36:21 +08:00
d2b9cd2797 update 优化 数据权限 判断当前注解不满足模板则跳过 2025-01-09 14:27:52 +08:00
9a95c46578 update 优化 将servlet改为saholder 兼容其他场景 2025-01-08 15:50:38 +08:00
a58f72868a update 优化 工具类封装 2025-01-08 14:47:57 +08:00
820db87604 update 优化 使用request存储动态租户 避免单请求多次查询redis获取 2025-01-08 10:57:14 +08:00
254e61ab01 fix 修复 postgresql的表元数据没有创建时间这个东西(好奇葩) 只能new Date代替 2025-01-07 13:52:29 +08:00
ad53965626 !634 docs: 修改应用配置文件中的注释错别字
* docs: 修改应用配置文件中的注释错别字
2025-01-07 03:59:34 +00:00
4de9fa33b7 update 优化修改部门信息增加事务 2025-01-07 05:23:27 +08:00
08e40b611b fix 修复 数据权限 多角色多注解包含忽略权限标识符逻辑不正确问题 2025-01-05 23:00:56 +08:00
dap
8bd2e27653 update: 增加菜单选择拓展参数 2025-01-04 16:08:57 +08:00
d023510f7e !632 update snailjob 1.2.0 => 1.3.0-beta1
* update snailjob 1.2.0 => 1.3.0-beta1
2025-01-03 07:13:22 +00:00
ec5ca0a08f fix 修复 redisson发号器未初始化发号器步长导致过期时间未生效的问题
Signed-off-by: 秋辞未寒 <545073804@qq.com>
2025-01-03 01:44:39 +00:00
a46c798e01 update 优化 延迟线程池 支持虚拟线程 2025-01-02 15:42:24 +08:00
41a3bdf73d !629 update 优化jdk21环境开启虚拟线程时的定时任务池
* update 优化jdk21环境开启虚拟线程时的定时任务池
2025-01-02 07:34:40 +00:00
a7b83672ba update 优化 sse 如果获取token列表为空 删除userid对应的存储 2024-12-27 11:17:09 +08:00
c2746c2392 update 优化 数据权限处理器 增加默认值处理 针对于表达式变量与注解不对应或者表达式变量为null的情况 2024-12-26 13:26:18 +08:00
492e7dab26 fix 修复 未开启sse 找不到bean问题 2024-12-25 09:30:14 +08:00
5480e419b6 update sqlkeyword 2024-12-25 09:23:13 +08:00
251a617ecc !626 fix 修复excel模板导出异常
* fix: 修复excel模板导出异常
2024-12-24 03:04:27 +00:00
36de389fa4 update 增加 赞助商 2024-12-21 13:38:24 +08:00
f4f052deb4 update 增加 赞助商 2024-12-21 13:32:19 +08:00
3a0fbd45ae update 增加 赞助商 2024-12-21 13:30:19 +08:00
f20c271972 !622 fix 修正注释错别字和顺序
* fix 修正注释错别字和顺序
2024-12-19 16:26:26 +00:00
ad85fa2016 update 优化 sse工具类 2024-12-19 10:54:08 +08:00
1a403361c9 update 优化 关闭sse后 使用工具报错 2024-12-19 09:19:12 +08:00
9ad64521d3 update 优化 !pr_610 代码实现 2024-12-18 17:46:53 +08:00
ff76df9ae0 增加导出模板必填、备注
增加单独的导出模板 方法
2024-12-18 17:27:16 +08:00
da1cd55c1d update 优化 增加mybatis-plus一键开启/关闭逻辑删除功能 2024-12-18 13:30:09 +08:00
a65baf5d67 update 优化 增加mybatis-plus一键开启/关闭逻辑删除功能 2024-12-18 11:32:22 +08:00
489cb52976 !620 update 修改日志颜色
* update 修改日志颜色
* update 修改日志颜色
2024-12-17 07:34:15 +00:00
591f86e4e9 !619 fix 修复数据权限导致的个人中心的修改头像和修改密码接口错误
Merge pull request !619 from QianRj/dev
2024-12-17 05:22:15 +00:00
9768023d38 fix: 修复数据权限导致的个人中心的修改头像和修改密码接口错误 2024-12-17 12:35:19 +08:00
60af92ed2d !618 update 适配 TOPAIM 2.0 单点登录
Merge pull request !618 from 马铃薯头/dev
2024-12-16 11:27:49 +00:00
4d566071db Merge remote-tracking branch 'origin/dev' into dev 2024-12-16 19:26:37 +08:00
aface5ded1 update 适配 TOPIAM 2.0 单点登录 2024-12-16 18:53:58 +08:00
7f6b71d938 fix 修复 升级justauth底层方法修改导致代码编译问题 2024-12-15 16:24:52 +08:00
c8ed71d010 update 使用justauth扩展功能支持微信小程序登录 2024-12-14 23:06:09 +08:00
df6649907d update justauth 1.16.6 => 1.16.7 支持多种登录方式 不限于三方登录 2024-12-14 23:05:15 +08:00
2fb1c99f56 !616 fix: 修复部门数据权限缓存错误
Merge pull request !616 from QianRj/dev
2024-12-14 14:30:14 +00:00
fcebda8987 fix: 修复数据权限缓存错误 2024-12-13 20:37:55 +08:00
0185a468bd update 优化 删除无用方法 2024-12-13 00:15:49 +08:00
c566f2ae28 update 优化 调整方法位置 2024-12-12 23:38:16 +08:00
29c5ff89ba update 优化 重构DateUtils工具类 更加实用 2024-12-12 23:33:00 +08:00
ab3e4978b1 update 优化 为部门角色岗位用户增加一些常用查询方法 2024-12-12 23:32:33 +08:00
0027f671d2 update 优化 登录用户增加岗位数据 2024-12-12 23:31:26 +08:00
06a8ab0ab2 !608 add 新增 基于Redisson的发号器工具
Merge pull request !608 from 秋辞未寒/dev
2024-12-12 14:28:25 +00:00
4352b3fe4a update 回退一些不应该被优化的代码 2024-12-12 22:20:32 +08:00
dd17246086 !613 refactor 优化代码
* update 优化代码
2024-12-12 14:15:59 +00:00
d7b0dc91d5 update 优化 去除部门查询状态校验 改为前端过滤 便于查看禁用部门下的其他数据 2024-12-11 18:12:31 +08:00
4598d4d843 update 优化 部门树增加禁用标志位 2024-12-11 15:31:17 +08:00
8a731efe0d update 优化 workflow 模块增加接口文档生成功能 2024-12-11 14:01:41 +08:00
59fd7eeeb3 add 新增 基于Redisson的发号器工具 2024-12-10 09:55:11 +00:00
552e543471 update 优化 pr代码 2024-12-10 17:46:45 +08:00
b1badca062 !607 add 新增 validation支持枚举校验
Merge pull request !607 from 秋辞未寒/dev
2024-12-10 09:34:50 +00:00
9f34edee4f reset 回滚错误提交 2024-12-10 12:41:59 +08:00
d257de7882 update 兼容云厂商自定义域名 2024-12-10 11:47:13 +08:00
4821902fdc update 更新 枚举校验通过枚举字段的getter方法取值
Signed-off-by: 秋辞未寒 <545073804@qq.com>
2024-12-09 10:16:49 +00:00
a1f82a7d08 删除文件 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/enumd/ValidateEnum.java 2024-12-09 09:43:01 +00:00
9009a90ef2 update 更新 枚举校验通过获取枚举值,不再需要实现接口
Signed-off-by: 秋辞未寒 <545073804@qq.com>
2024-12-09 09:41:52 +00:00
fc9c90ad99 fix 修复 三方缺失参数问题 2024-12-09 17:35:53 +08:00
9e613488f1 add 新增 validation支持枚举校验
Signed-off-by: 秋辞未寒 <545073804@qq.com>
2024-12-09 09:03:31 +00:00
5e6cb0dd3c update 优化 代码生成 增加buildQueryWrapper默认排序规则 2024-12-09 13:31:17 +08:00
2bb787886d update 优化 代码生成 增加buildQueryWrapper默认排序规则 2024-12-09 12:42:36 +08:00
ed6f8262c6 update 优化 代码生成 创建更新时间被覆盖问题 2024-12-09 12:39:27 +08:00
64d574cf06 update 优化代码生成排序问题 2024-12-09 11:20:05 +08:00
e0b0ffcb28 update 优化 书写错误 2024-12-06 14:02:46 +08:00
c17225abb1 update 优化 在线用户查询 优先查询租户下数据 减少数据量 2024-12-06 10:11:38 +08:00
19aed0a1e4 update 优化 项目名前增加社区名 2024-12-04 10:11:41 +08:00
14c1bde958 update 优化 租户域名使用忽略大小写匹配 2024-12-03 11:01:01 +08:00
eed929b9fe fix 修复 代码生成 表名中间带有特殊字符被过滤问题 改为开头过滤 2024-12-02 23:24:30 +08:00
eda67dd572 update 优化 代码生成器 将数据库字段默认转为小写 避免某些数据库大写出现的问题 2024-12-02 10:05:25 +08:00
fef2d5207b update 优化 由于sse重试机制导致经常输出认证失败日志过多 将sse失败改为debug 2024-12-02 09:36:46 +08:00
87294b41af update 优化 有界队列销毁方式 应该使用特殊销毁方法 2024-11-29 16:26:56 +08:00
99d9c516fc update 优化 销毁策略 2024-11-29 16:21:19 +08:00
476c7a77c8 update 优化 redis序列化 支持更快的apache二进制跨语言序列化方案 2024-11-27 18:23:10 +08:00
8dc4b5cf6b update 优化 租户日志模块名 2024-11-27 15:22:05 +08:00
eba6b48daf update springdoc 2.6.0 => 2.7.0
update redisson 3.37.0 => 3.39.0
2024-11-26 16:29:26 +08:00
1aff46bc1c fix 修复 字段长度超出数据库限制问题 2024-11-26 15:38:22 +08:00
e78684886d update 优化 数据权限处理 2024-11-25 11:58:39 +08:00
7f35925794 update 优化 增加默认数据权限 "部门及以下或本人数据权限" 选项 2024-11-25 10:33:42 +08:00
71a59d3e5f fix 修复 过滤器正则错误
Signed-off-by: 疯狂的狮子Li <15040126243@163.com>
2024-11-23 07:59:40 +00:00
4af46a6045 update 优化 校验租户判空逻辑
Signed-off-by: 秋辞未寒 <545073804@qq.com>
2024-11-23 06:57:11 +00:00
d194b39e57 fix 修复 monitor 设置 context-path 导致退出重新登录404问题 2024-11-22 17:54:16 +08:00
cd08f66c59 update 优化 代码生成器 pg数据库 主键获取不精确问题 2024-11-22 17:18:27 +08:00
ef919b9f3d update 优化 代码生成器类型获取 2024-11-22 17:01:05 +08:00
847b158283 update 优化 个人中心强退设备接口路径 2024-11-22 15:59:40 +08:00
dd2abd95c9 fix 修复 aop 无法拦截mapper接口上的注解导致的问题 类上依旧使用扫描处理 2024-11-22 10:43:44 +08:00
b5908d52d7 !600 update 升级SnailJob版本到1.2.0
Merge pull request !600 from dhb52/dev
2024-11-20 05:30:10 +00:00
bf515042d0 update 升级SnailJob版本到1.2.0 2024-11-20 12:44:22 +08:00
e94fccc784 update 优化 Dockerfile 消除warn警告 2024-11-20 11:03:55 +08:00
6d45199592 update 修改 readme 增加成员项目说明 2024-11-15 16:28:33 +08:00
57b3b329a8 docs 补充客户端工具类注释 2024-11-15 15:17:36 +08:00
a0fc268bb9 docs 补充Undertow自定义配置信息注释 2024-11-15 14:51:34 +08:00
631739733f Revert "update 优化 加密拦截器plugin方法按规定返回代理对象"
This reverts commit f6d9bec16c.
2024-11-15 11:11:42 +08:00
2d2bd48963 update 优化 拦截爬虫跟踪等垃圾请求 2024-11-15 11:03:20 +08:00
f6d9bec16c update 优化 加密拦截器plugin方法按规定返回代理对象 2024-11-15 10:30:06 +08:00
0f1118e03a docs 修正EncryptUtils加解密错误注释 2024-11-15 09:14:52 +08:00
009ac75229 fix 修复 数据权限多角色与权限标识符共用导致的问题 https://gitee.com/dromara/RuoYi-Vue-Plus/issues/IB4CS4 2024-11-14 16:57:10 +08:00
b64ac8d7f6 update 优化 将Log记录异常长度改为5000 2024-11-14 16:23:52 +08:00
41240fc415 update 优化 将Log记录参数长度扩充为5000更符合实际需求 2024-11-14 16:21:56 +08:00
a18e430056 update 优化部署配置 2024-11-14 15:56:16 +08:00
1a993a7899 update 优化 xss包装器 Parameter 处理 兼容某些容器不允许改参数的情况 2024-11-12 18:17:47 +08:00
d3b5220dc3 update 排除 websocket包内包含的tomcat依赖 2024-11-12 15:10:04 +08:00
4f92c0317e update 优化 删除无意义的方法 2024-11-12 10:50:10 +08:00
a098565c37 fix 修复 误删代码 2024-11-12 10:48:28 +08:00
0d5fe5d91e update 优化 支持脱敏传多角色多权限标识 2024-11-12 10:39:41 +08:00
5c66f3b90c update 优化 支持脱敏传多角色多权限标识 2024-11-12 10:37:51 +08:00
63d22b9b33 update 优化 角色删除清理缓存 2024-11-11 13:58:29 +08:00
b4678b74ab update 优化 使用ObjectUtils新增方法封装代码 2024-11-11 13:52:16 +08:00
a82ed1e9dd update 优化 数据权限查询增加缓存 2024-11-11 13:30:58 +08:00
d2ffbfb80b !599 add 新增 对象工具类
Merge pull request !599 from 秋辞未寒/dev
2024-11-11 03:48:03 +00:00
5d61782a6c add 新增 对象工具类
Signed-off-by: 秋辞未寒 <545073804@qq.com>
2024-11-11 03:40:48 +00:00
1b8c9fdaa9 update 优化 代码生成器数字类别判断 2024-11-11 10:45:00 +08:00
90328ae79b update 优化 逻辑删除状态改为1 避免误解 2024-11-11 10:26:34 +08:00
9cdcbbccbf update 重构 将UserConstants改为SystemConstants 统一常量使用 降低使用难度避免误解 2024-11-11 10:26:34 +08:00
b820a98c6c docs:补充Mapper层注释 2024-11-11 10:05:52 +08:00
8e749c472a fix 修复 PageQuery 转json报错问题 2024-11-09 21:01:40 +08:00
70a5077291 fix 修复 sse 关闭接口无法断连问题 2024-11-08 00:30:43 +08:00
8a5d8cc9b9 add 增加 邮件多附件demo 2024-11-07 22:26:40 +08:00
0a0a16f969 update 优化 封装部门基于父id查询方法 2024-11-07 15:48:34 +08:00
73d5fbd085 fix 修复 PlusSmsDao#clean 方法书写错误 2024-11-06 22:14:24 +08:00
9da3d25292 !595 修复大数量级联下拉导致的禁止写入错误
Merge pull request !595 from Emil.Zhang/dev
2024-11-06 07:40:32 +00:00
0385a444c2 fixed(级联下拉框数据错误)
1.修复过多级联下拉选项导致的无法写入问题
2024-11-06 15:01:38 +08:00
7d856b030b update 优化 不传用户id不校验数据权限 2024-11-05 16:52:10 +08:00
8c0441b91a !594 update 优化代码
Merge pull request !594 from DoubleH/dev
2024-11-04 09:53:56 +00:00
cxh
baef55ae1b update 优化代码
1. 删除内部if对部门不为null的多余判断,可以提前判断
2. 使用内部工具类StreamUtils
2024-11-04 17:42:37 +08:00
80e6943d2e add 增加 gitcode 链接地址 2024-11-04 14:08:46 +08:00
2ffdd56301 update 优化 部门树多基点展示问题 支持相同名称节点并排展示 2024-11-04 11:38:55 +08:00
53635da552 fix 修复 某些模块不存在 mp 依赖导致方法报错问题 2024-11-02 20:02:08 +08:00
5e7fb88762 update 优化 去除OSS桶检测 桶不存在自然会报错无需额外检测 2024-10-31 17:59:56 +08:00
d89727725b update 优化 删除无用注释 2024-10-31 15:55:28 +08:00
8cd7e3c924 update 优化 限流注解增加固定清理时间 2024-10-30 16:43:30 +08:00
0baf2c5861 fix 修复 新版本mp默认使用最新 sqlserver 语法导致代码生成分页报错问题 2024-10-30 10:51:45 +08:00
b0548f9a56 update 优化 sys_social表 租户id增加默认值 2024-10-29 20:21:58 +08:00
2d190cfb19 update 优化 jackson 过期方法 2024-10-29 19:12:19 +08:00
3b5858b114 update mybatis-plus 3.5.8 => 3.5.9 2024-10-29 19:12:07 +08:00
112157ade0 update 优化 多租户插件初始化流程 2024-10-29 16:55:41 +08:00
8cd30ae86b update 优化 多租户插件初始化流程 2024-10-29 16:42:53 +08:00
9b6b288e73 update 优化 多租户插件初始化流程 2024-10-29 16:42:04 +08:00
1757e5519d update 优化 去除GenUtils设置createby逻辑 统一走自动注入设置 2024-10-29 11:19:08 +08:00
a21fa666fd update springboot 3.2.11 => 3.3.5
update springboot-admin 3.2.3 => 3.3.4
2024-10-29 09:39:45 +08:00
df9a57c379 !592 替换RedisUtils中的过时方法
* update:替换RedisUtils中的废弃方法getKeysStreamByPattern及trySetRate
2024-10-29 01:29:15 +00:00
5f31efd33e update 优化 删除桶自动创建代码逻辑(云厂商限制不允许操作桶) 2024-10-28 18:10:49 +08:00
2a9f245b39 update 优化 删除桶自动创建代码逻辑(云厂商限制不允许操作桶) 2024-10-28 18:09:32 +08:00
761586cc3c reset 回滚错误修改 2024-10-28 17:44:21 +08:00
6731b7947b update 优化 角色清理在线用户代码逻辑 2024-10-28 10:21:55 +08:00
ddc8bd1139 [重大更新] update (实验性功能慎更)重构数据权限实现逻辑 支持任意mapper方法标注注解 无需再找真实mapper标注 2024-10-27 23:25:22 +08:00
6ae9bbdb31 fix 修复 注册日志记录状态错误 2024-10-25 11:30:56 +08:00
6c950c9569 🎀发布 5.2.3 正式版 2024-10-25 10:58:01 +08:00
3ce3ffca05 update springboot 3.2.10 => 3.2.11
update redisson 3.36.0 => 3.37.0
update mapstruct-plus 1.4.4 => 1.4.5
update anyline 8.7.2-20240930 => 8.7.2-20241022
2024-10-25 10:32:52 +08:00
d3ccc43d68 update 优化 postgres适配findInSet写法 提高查询效率 2024-10-24 14:47:58 +08:00
4c96440686 fix 修复 设置流程变量 代码使用错误问题 2024-10-23 17:38:21 +08:00
8d8d76364b fix 修复 xss过滤器 未过滤url参数问题 2024-10-21 13:59:39 +08:00
82af98c205 fix 修复 代码书写错误 2024-10-21 13:38:09 +08:00
fdbe8c2395 update 优化 过滤器初始化写法 2024-10-20 11:43:39 +08:00
59715b1e02 fix 修复 及其特殊场景下获取 StopWatch 为null问题 2024-10-20 00:23:33 +08:00
f2ec530065 fix 修复 字典同步 数据异常问题 2024-10-19 14:50:58 +08:00
ac89cb46f5 fix 修复重新生成租户ID未生效的问题 2024-10-17 22:38:12 +08:00
abfa995a32 update 优化 监听器兼容所有demo案例 2024-10-17 18:12:26 +08:00
51cfbef887 update 优化 操作日志记录DELETE请求参数 2024-10-17 17:34:33 +08:00
7171ed1508 update 优化 snailjob客户端ip配置说明 2024-10-17 17:25:02 +08:00
6727f3e6a4 fix 修复oss上传10秒超时,设置默认时间一分钟 2024-10-16 15:28:38 +08:00
81006c758a docs 自行开启云存储访问控制ACl策略注释 2024-10-16 10:47:26 +08:00
01025c4024 update 更新AWS SDK版本 2024-10-16 10:39:58 +08:00
517277132e fix 修复腾讯云oss不支持高危权限设置ACL 2024-10-16 10:36:43 +08:00
dc5c92ee2d fix 修复同步云厂商要求明确配置访问样式(路径样式访问) 2024-10-16 10:33:11 +08:00
57e142e160 fix 修复 特性情况下自定义验证异常处理器报null问题 2024-10-15 17:35:51 +08:00
c563afed59 fix 修复 EncryptorManager 缓存失效问题导致的内存膨胀 2024-10-14 00:38:07 +08:00
556cf87f0e update 优化 补全 pg 数据类型 2024-10-12 16:23:17 +08:00
e0a00cfe98 update 优化 补全 @Override 注解 2024-10-08 16:30:04 +08:00
d60774a7b8 reset 回滚错误提交 2024-10-08 16:10:27 +08:00
e3d40b75cb fix 修复 同一个用户不同token连接不同服务导致发送不到问题(改为全局发送) 2024-10-08 14:43:59 +08:00
eb4479e940 fix 修复 同步字典存储是未忽略租户 2024-10-01 10:52:07 +08:00
7e6d0a5c64 update anyline 20240808 => 20240930 2024-09-30 17:56:04 +08:00
88dd4165cb update sms4j 3.3.2 => 3.3.3 2024-09-29 17:41:36 +08:00
e96118c574 fix 修复 部分web异常被CryptoFilter截胡问题 2024-09-29 17:41:16 +08:00
39c4e5fe55 !589 fix postgres数据库脚本租户管理名称错误
Merge pull request !589 from LionZzzi/fix
2024-09-25 02:14:52 +00:00
46141dc114 fix(postgres数据库脚本): 变更租户管理目录的主菜单为租户管理 2024-09-25 10:00:33 +08:00
e3a25f2425 fix 修复 代码生成器 postgres 数据库主键类型映射错误问题 2024-09-24 18:17:49 +08:00
64289c16f3 update 优化 适配mp新版本 方法名改动 2024-09-20 15:43:56 +08:00
6b05ddb576 update 优化 redis操作 如果无法忽略租户id则全局处理 2024-09-19 23:13:00 +08:00
88ee252fce update springboot 3.2.9 => 3.2.10 2024-09-19 18:09:03 +08:00
2add7291ab update 优化 sse 异常单独处理 避免出现异常报错问题 2024-09-19 17:53:41 +08:00
501be029c6 update 优化 sse 异常单独处理 避免出现异常报错问题 2024-09-19 17:40:42 +08:00
d86652dee1 update easyexcel 4.0.2 => 4.0.3
update redisson 3.34.1 => 3.36.0
2024-09-19 13:55:46 +08:00
272ca613ee update mybatis-plus 3.5.7 => 3.5.8 代码适配更改 2024-09-19 13:45:57 +08:00
74af811a3b update 优化 删除掉有问题的方法(使用RedisUtils) 2024-09-18 18:07:28 +08:00
fc72b67090 update 优化 全局开启xss过滤 提高安全性 与cloud版本保持一致 2024-09-13 18:02:44 +08:00
e33f76d710 update 优化 去除返回前端的异常信息里包含html标签问题 2024-09-13 17:42:21 +08:00
1c3d594947 docs 查询表名列表增加注释 2024-09-13 15:00:16 +08:00
64d9b27310 update 优化 判断当前会话是否已经登录 2024-09-13 14:41:01 +08:00
f3f3593cfe update 优化 删除不应该set的属性 2024-09-13 09:38:56 +08:00
e5e8e3ce7c update 优化 租户状态更改接口严谨性 2024-09-12 16:58:47 +08:00
a7fd7ba72c fix 修复 临时处理 scala库版本漏洞问题 2024-09-11 16:00:39 +08:00
020f090f4a update 优化 删除okhttp无用版本限制(spring已经限制过了) 2024-09-11 15:59:54 +08:00
5e3231d59b !582 优化admin配置文件读取
* update 优化admin监控配置读取名称
* update 优化admin监控配置读取
2024-09-11 04:02:16 +00:00
b522bc015d update 优化 操作日志查询代码 2024-09-11 10:23:16 +08:00
6e64fd7fd7 !585 修复工作流分页查询不兼容sql server的问题
Merge pull request !585 from 赖小麦/fix_workflow_page_query_error_to_sqlserver
2024-09-11 01:27:20 +00:00
8b44f5cdbc 修复:工作流中(我的待办、我的已办、我的抄送默认)的分页查询语句不兼容sqlserver的问题 2024-09-10 12:05:08 +08:00
f9b7d955aa add 新增TreeUtil获取节点列表中所有节点的叶子节点 2024-09-10 10:15:01 +08:00
6ea2a2fc51 update 优化 统一sql文件命名方式 2024-09-09 11:37:02 +08:00
760c8d7200 update 优化 提供生产环境默认组配置 2024-09-09 11:30:40 +08:00
32ad28c3dc update 优化通过角色ID查询用户逻辑 2024-09-06 14:24:06 +08:00
6886e9fd5b update 优化查询用户时多余重复判断以及去重 2024-09-06 14:14:15 +08:00
f20130d3db fix 修复 commons-io 依赖冲突问题 2024-09-05 18:50:28 +08:00
df9cc881f1 update 优化 连接SSE token过期导致的 Servlet异常 2024-09-05 18:50:00 +08:00
4044988afa update 优化 代码生成菜单id匹配写法 2024-09-04 16:16:53 +08:00
d3360e81b9 update sa-token 1.38.0 => 1.39.0 2024-09-03 13:52:50 +08:00
df070b7d78 update 调整 xml 格式 2024-09-02 14:16:40 +08:00
83dd98faf3 fix 修复 开启子部门 父部门未关联开启问题 2024-09-02 14:12:02 +08:00
37f89f560f update 优化 更新sql关键字 2024-09-02 13:06:31 +08:00
918ed0d6d0 update 优化 删除多余的引号 2024-08-31 23:30:50 +08:00
a3c9edde78 fix 修复 升级依赖导致的依赖冲突 2024-08-29 20:53:39 +08:00
cac0a4cd16 update 优化 RegexUtils#extractFromString 方法未匹配返回null不返回默认值问题 2024-08-29 14:12:07 +08:00
581b6e03d5 update 优化 oss上传直接从请求头获取文件类型 2024-08-29 10:49:41 +08:00
801cc584e5 update 优化 代码生成表名判断 使用开头判断避免误判 2024-08-29 10:41:45 +08:00
b82ff8617e add 增加 同步租户字典功能 2024-08-26 17:56:19 +08:00
c87016c1af update 优化 excel导入 适配异常结构 2024-08-26 15:38:48 +08:00
463048e017 😴发布 5.2.2 正式版 安全性提升 2024-08-26 11:39:22 +08:00
79aee1d312 add 添加按照部门id,角色id查询用户 2024-08-24 11:16:39 +08:00
eb038e91dd update springboot 3.2.8 => 3.2.9 2024-08-23 10:52:53 +08:00
308c22f922 fix 修复 三方登录构建去除无用代码 2024-08-23 10:30:29 +08:00
457e59e61c fix 修复 多线程对同一个session发送ws消息报错问题 2024-08-22 17:53:55 +08:00
a964ccbd10 update snailjob 1.1.1 => 1.1.2
update mapstruct-plus 1.4.3 => 1.4.4
2024-08-22 11:19:43 +08:00
0af532f4f1 update 优化 去除日志部署环境判断 通过日志级别控制 2024-08-22 11:19:13 +08:00
4743eb1d3b update 优化 忽略租户与忽略数据权限支持嵌套使用 2024-08-21 13:54:40 +08:00
23aafe1cfe update 优化 忽略租户与忽略数据权限支持嵌套使用 2024-08-21 13:54:01 +08:00
3f2499feac update 优化 租户相关controller 增加租户开关配置控制是否注册 2024-08-19 09:14:50 +08:00
fb97649151 remove 移除 alibaba ttl 与线程池搭配有问题(可传递但无法清除与更新) 2024-08-17 10:30:03 +08:00
b33b645ef0 remove 移除 alibaba ttl 与线程池搭配有问题(可传递但无法清除与更新) 2024-08-17 10:29:33 +08:00
9318f182b0 reset 回滚 修改spring源码上下文持有者(存在数据未清理内存泄漏问题) 2024-08-17 10:10:51 +08:00
facbb7f28f update 优化 个人中心编辑 忽略数据权限 2024-08-15 20:28:52 +08:00
4de45ce170 update 优化 兼容部分用户不想给用户分配角色与部门的场景 2024-08-15 19:52:03 +08:00
96d57bd263 update 优化 租户套餐重名校验 2024-08-15 19:34:02 +08:00
bb4587fe05 update 优化 部门下存在岗位不允许删除 2024-08-15 19:29:04 +08:00
19c83f02aa update 优化 角色编辑状态未校验问题 2024-08-15 19:14:51 +08:00
0e1fcbfe9c update 优化 用户脱敏增加编辑权限标识符 2024-08-15 18:52:01 +08:00
eda882433a update 优化 删除报警注释 2024-08-15 17:45:06 +08:00
e6847605cc update 优化 删除无用注释 2024-08-15 17:43:57 +08:00
5bdffdb368 update 优化 代码生成器 自动适配oss翻译 2024-08-15 14:10:14 +08:00
0ad52b18b8 update 优化 代码生成器 自动适配oss翻译 2024-08-15 14:09:20 +08:00
77f44574c0 update 优化 修改spring源码上下文持有者 支持线程切换传递上下文数据 支持一切异步获取用户信息等操作 2024-08-15 11:53:15 +08:00
ca06a2311d update hutool 5.8.29 => 5.8.31 解决hutool不兼容jakarta问题 2024-08-13 13:32:34 +08:00
b8d9af65e2 update 增加sse注释说明 2024-08-09 17:24:44 +08:00
bc2b4876b6 fix 修复代码生成集合类型工具判断 2024-08-09 14:08:19 +08:00
23b70ca0be update anyline 8.7.2-20240808 2024-08-09 11:54:47 +08:00
44d776a76f update sms4j 3.2.1 => 3.3.2 2024-08-09 10:38:43 +08:00
f03c00b2c1 reset 回滚 sms4j 版本升级(有问题) 2024-08-07 22:27:05 +08:00
7f60ba9888 update redisson 3.33.0 => 3.34.1
update mapstruct-plus 1.3.6 => 1.4.3
update sms4j 3.2.1 => 3.3.1
update lombok 1.18.32 => 1.18.34
2024-08-07 11:22:14 +08:00
31569646b0 fix 修复 依赖漏洞 限制部分依赖版本 2024-08-07 11:20:34 +08:00
3fc37d6362 update easyexcel 3.3.4 => 4.0.2 2024-08-07 11:19:16 +08:00
6d28072167 update 优化 临时升级 undertow 版本 解决虚拟线程溢出问题 2024-08-07 09:58:11 +08:00
f124fbd6aa fix 修复 关闭应用sse销毁报错问题 2024-08-07 09:57:20 +08:00
88a4a51956 update 默认开启工作流 2024-08-06 16:10:11 +08:00
4306ea4181 update 优化 支持通过配置文件关闭工作流 2024-08-06 16:07:22 +08:00
e19140462d fix 修复 关闭 sse 报错问题 2024-08-06 15:38:16 +08:00
20cc8a6d6c fix 修复 excel 基于其他字段 合并错误问题 2024-08-06 13:53:40 +08:00
a9d7a42c65 update 优化 增加mp填充器兜底策略 2024-08-04 22:58:17 +08:00
f51e6d81b1 update 优化 TenantSpringCacheManager 处理逻辑 2024-08-04 10:45:25 +08:00
f119d082cf fix 修复 一级缓存key未区分租户问题 2024-08-04 10:40:22 +08:00
ecfaa9ad5c update 优化 角色权限判断 2024-08-02 17:09:46 +08:00
f32d0266ee update 更新 readme 2024-08-02 11:37:21 +08:00
7393a61305 fix 修复 id字符串格式转换错误问题 2024-08-02 10:36:34 +08:00
2b0efd1f93 update 优化 增加删除标志位常量优化查询代码 2024-08-02 10:07:47 +08:00
b615a3b088 fix 修复 id字符串格式转换错误问题 2024-08-02 10:03:17 +08:00
85403e975f fix 修复 登出无法正确删除对应的租户数据问题 2024-08-02 00:55:42 +08:00
615ad918ca update 优化 sse 拦截网络中断io异常 2024-08-02 00:55:11 +08:00
b886f3a04b fix 修复 登录错误锁定不区分租户问题 2024-08-01 23:20:29 +08:00
588a47897a fix 修复 转换模型缺少分类字段 2024-08-01 15:15:54 +08:00
2869d590e6 update 优化 sse 关闭连接各种异常问题 2024-08-01 14:55:43 +08:00
6b14bce25e update 优化 监控使用独立web依赖 2024-07-31 17:09:16 +08:00
5aa346327f fix 修复 代码生成 错误匹配表名问题 2024-07-31 13:02:33 +08:00
fcf8516f0d update 优化 适配 anyline 新改动 2024-07-31 09:48:05 +08:00
2a340d4d83 update anyline 8.7.2-20240728 2024-07-29 17:47:01 +08:00
508d7a37e3 update 脱敏策略优化增加密码 2024-07-29 15:18:23 +08:00
08fece39d8 add 新增 更多脱敏策略 2024-07-29 15:04:54 +08:00
857a0b1006 update 优化oss查询代码 2024-07-29 14:33:54 +08:00
239d59c864 update 优化 sse发送消息 增加token有效期判断 2024-07-29 12:44:45 +08:00
7297053dd6 fix 修复 登出后重新登录 sse推送报错问题 2024-07-29 12:28:01 +08:00
bd872f624a fix 修复 代码生成 数据源切换问题 2024-07-27 23:57:13 +08:00
86acb14f05 update anyline 8.7.2-20240726 2024-07-27 15:09:33 +08:00
9825f349ac fix 修复 代码生成 表结构缓存问题 2024-07-27 14:22:57 +08:00
19fd562c24 update snailjob 1.1.0 => 1.1.1 2024-07-27 14:20:20 +08:00
b6d939a9ff fix 修复 代码生成 表结构缓存问题 2024-07-27 14:00:50 +08:00
1619edb8a1 update 优化 sse 自动装配 2024-07-27 14:00:35 +08:00
782821aeb2 update 优化 设置nginx sse相关代理参数 2024-07-26 18:11:36 +08:00
51498958fa fix 修复 权限标识符处理未设置成功状态问题 2024-07-26 17:17:18 +08:00
51edb74474 fix 修复 后端发消息发送失败无限重试问题 2024-07-26 17:14:23 +08:00
d5ab2a7557 update 优化 调整默认推送使用SSE 2024-07-26 16:24:26 +08:00
ee3525cfb2 add 增加 ruoyi-common-sse 模块 支持SSE推送 比ws更轻量更稳定的推送 2024-07-26 16:05:35 +08:00
e9bd0858e2 update 优化 删除无用配置 2024-07-25 13:21:32 +08:00
f46d881866 add 增加 snailjob 健康检查 actuator 账号密码认证 2024-07-25 13:12:58 +08:00
ee5e718f83 !567 update 优化 Monitor监控服务通知分类打印
Merge pull request !567 from AprilWind/dev
2024-07-25 03:10:35 +00:00
e25083aea4 del 删除无用依赖 2024-07-25 10:55:46 +08:00
e74f0ca6f8 update 优化Monitor监控服务信息事件通知 2024-07-25 10:37:27 +08:00
52b0fa9a54 update 优化Monitor监控服务通知分类(可扩展邮箱发送,短信发送) 2024-07-25 10:00:10 +08:00
105c007f03 add 增加 springboot actuator 账号密码认证 杜绝内外网信息泄漏问题 2024-07-24 18:56:40 +08:00
0a3d5fd5d4 update 优化 代码生成分页实现 避免数据误传等问题 2024-07-23 17:05:46 +08:00
ae3c02d4b2 update 优化 代码生成分页实现 避免数据误传等问题 2024-07-23 17:05:20 +08:00
9e17d07a17 update 优化 限流注解 又写key又不是表达式的情况 2024-07-23 16:34:53 +08:00
dcfab4e011 update 优化 代码生成 相关sql 2024-07-23 13:21:15 +08:00
0b78f9361d fix 修复 已经导入的表 未过滤问题 2024-07-23 11:44:39 +08:00
0c4e9dc813 update anyline 8.7.2-20240722 2024-07-23 10:37:15 +08:00
d894cae073 update 优化 代码生成屏蔽无用表 2024-07-23 10:35:22 +08:00
84f553a911 fix 修复 代码生成 报错与警告 2024-07-23 10:06:15 +08:00
05580deaa9 fix 修复 无法导入 bpmn 类型文件问题 2024-07-23 09:58:18 +08:00
aac83bbb91 update 获取表元数据 字段是否必填 和 是否自增 2024-07-22 17:06:46 +08:00
249f1f48a6 reset 回滚错误提交 2024-07-19 17:55:13 +08:00
bfb92fe667 update 优化 依赖配置 2024-07-19 17:54:44 +08:00
640dc43bbe !565 流程发送消息未查询用户邮箱和手机号
Merge pull request !565 from 愿丶/dev-pr
2024-07-19 09:43:47 +00:00
8859d915b0 update workflowUtils查询用户信息发送消息未查询邮件和手机号 2024-07-19 17:39:19 +08:00
82fdb37c6b fix 修复判断表名为空错误 2024-07-19 16:50:40 +08:00
49c18dab63 update 优化根据表名称查询列信息 2024-07-19 16:44:12 +08:00
f5b8a22bde update 更改D-ORM依赖为全依赖 2024-07-19 15:55:31 +08:00
b6b0f9c47d update 优化代码生成表名查询数据库 2024-07-19 15:54:37 +08:00
a2a2fa2311 update 优化查询数据库列表 2024-07-19 15:29:38 +08:00
34690e3e65 update springboot 3.2.6 => 3.2.8
update springdoc 2.5.0 => 2.6.0
update hutool 5.8.27 => 5.8.29
update redisson 3.31.0 => 3.33.0
update flowable 7.0.0 => 7.0.1
2024-07-19 10:08:28 +08:00
54f58257f9 update 优化 注释掉其他数据库 jdbc 依赖 由用户手动添加 2024-07-16 11:04:48 +08:00
58b6c4668f update 优化 oracle snailjob 兼容低版本oracle索引名称长度限制 2024-07-16 09:42:50 +08:00
d0e7eb8409 !564 升级SnailJob版本到1.1.0
Merge pull request !564 from dhb52/dev
2024-07-15 14:49:55 +00:00
77a7a8f30e chore: 升级SnailJob版本到1.1.0 2024-07-15 18:16:43 +08:00
f76738e02b update 优化 bug 模板 2024-07-15 15:18:29 +08:00
ab147df2f1 update 优化 数据权限支持通过菜单标识符获取数据所有权 2024-07-12 13:51:34 +08:00
5444ccc857 update 优化 数据权限支持自定义连接符 2024-07-12 13:15:23 +08:00
fc89d62f1a update 优化 TestDemo 删除前校验数据权限 2024-07-12 12:57:45 +08:00
94467273c5 update 优化 更换docker镜像底层系统 避免无字体情况 2024-07-09 16:37:05 +08:00
835de64bea ♥️发布 5.2.1 正式版本 2024-07-09 10:42:16 +08:00
113da3437b fix 修复 isLogin 方法抛异常无法正常返回值问题 2024-07-09 09:23:01 +08:00
b0b6d01357 update 优化 工作流相关代码方法 2024-07-06 14:42:08 +08:00
6cc24dc763 !561 使用封装好的StreamUtils工具类代替项目中的部分stream操作
* refactor : 使用封装好的StreamUtils工具类代替项目中的部分stream操作
2024-07-06 05:58:26 +00:00
0cb3105cea update 优化 为需要字体的服务 补充字体 2024-07-05 10:12:09 +08:00
00502a4689 update 优化 更新使用 Spring 官方推荐 JDK 2024-07-04 15:54:43 +08:00
ebb7242b71 update 更新 redis 密码策略 2024-07-03 11:43:59 +08:00
0fbb96c4ac fix 修复 sql修改错误 2024-07-03 10:03:34 +08:00
e942ffed71 update 优化 删除无用校验 2024-07-02 13:19:08 +08:00
319270bf2b update 优化 删除无用校验 2024-07-02 13:18:35 +08:00
8b69de0d54 update 优化 删除无用校验 2024-07-02 13:17:20 +08:00
f929513310 update 优化 webscoket 配置与异常拦截 2024-07-02 12:00:08 +08:00
0d25b82087 update 优化 isTenantAdmin 空校验 2024-07-01 15:21:02 +08:00
c75857b1ea update 优化 修改 snailjob 默认端口 2024-07-01 14:56:05 +08:00
6d353869ef update 优化 修改 snailjob 默认端口 避免与系统内置端口冲突问题 2024-07-01 14:34:51 +08:00
6ba7249a75 update 优化 修改 snailjob 默认端口 避免与系统内置端口冲突问题 2024-07-01 14:33:38 +08:00
2ee543e2a4 update 优化 去除已经用不上的配置 2024-07-01 12:46:49 +08:00
871dfa9a67 !559 refactor: 修改路由name命名规则
Merge pull request !559 from 玲娜贝er/dev
2024-07-01 01:12:32 +00:00
dap
17fe2d5863 refactor: 修改路由name命名规则 2024-07-01 08:47:13 +08:00
d5b62a2126 fix 修复 pg数据库 查询报错问题 2024-06-28 16:28:36 +08:00
a4a833f15f !557 README文档错别字修复
Merge pull request !557 from mxyyyy/dev
2024-06-28 06:12:15 +00:00
a4fe077a23 update 优化 大数据量下join卡顿问题 使用子查询提高性能 2024-06-28 12:49:58 +08:00
bfa77361b7 docs: README文档错别字 2024-06-28 12:05:03 +08:00
3dff529920 !556 新增mybatis注释
* docs 新增mybatis注释
2024-06-27 09:46:17 +00:00
3681150010 !555 优化用户ID查询角色列表
Merge pull request !555 from AprilWind/dev
2024-06-27 07:38:36 +00:00
f0b4fcbdf0 update 优化用户ID查询角色列表 2024-06-27 15:30:24 +08:00
5c7e8c5381 !553 优化获取用户账户
Merge pull request !553 from AprilWind/dev
2024-06-27 06:49:59 +00:00
a144fa449b update 优化获取用户账户 2024-06-27 14:43:33 +08:00
4f9ceb0a80 fix 修复 spring重大bug 导致 actuator 泄漏问题 2024-06-21 16:31:05 +08:00
12338fc0b4 update 优化 租户列表接口 避免登录之后列表被域名过滤 2024-06-21 15:51:39 +08:00
6d2cc6e87d update 优化 替换过期方法 2024-06-21 14:59:50 +08:00
52598e5c5c fix 修复 新版上传未设置acl问题 2024-06-21 12:35:54 +08:00
903d810edc fix 修复 新版上传未设置acl问题 2024-06-21 12:34:50 +08:00
475b169952 update 优化 更改prod环境 snailjob状态 默认启用 2024-06-21 10:50:41 +08:00
ba1f66367b fix 修复 postgres flowable sql 缺失字段问题 2024-06-21 10:17:03 +08:00
b27f560b33 ♥️发布 5.2.0 正式版本 2024-06-20 10:09:26 +08:00
59edca8fca update 优化 snailjob 客户端端口随主应用漂移端口 2024-06-20 10:06:17 +08:00
147a90302d fix 修复 临时修复 mp3.5.7 批处理判断bug 2024-06-20 09:49:18 +08:00
b4b5aedc82 reset 回滚错误修改 2024-06-20 09:37:52 +08:00
81293c9368 update 优化 异常日志输出方式 2024-06-19 17:45:58 +08:00
7c82b4c370 update 优化 三方登录不同域名问题 采用新方案 2024-06-19 14:29:32 +08:00
045e09f029 reset 回滚三方授权修改 2024-06-19 10:12:08 +08:00
cbd59f84fd update 优化 三方登录不同域名获取不到租户id问题 2024-06-18 18:44:04 +08:00
086b206139 update 删除 无用方法 mp 新版本自带了 2024-06-17 18:30:14 +08:00
d56e8d79ec !550 chore: 升级SnailJob版本到1.0.1
Merge pull request !550 from dhb52/dev
2024-06-17 08:11:10 +00:00
d61459e912 chore: 升级SnailJob版本到1.0.1 2024-06-17 16:08:41 +08:00
33880f3e86 update 优化 snailjob 与 其他应用端口冲突问题 改为主应用漂移端口 2024-06-17 14:13:34 +08:00
6186881615 update 优化 特殊service传值方式 2024-06-17 11:12:52 +08:00
20a3396128 fix 修复 websocket clientid 参数不走mvc拦截器 无法生效问题 2024-06-17 10:43:37 +08:00
e5ee98a6aa update 优化 获取aop代理的方式 减少与其他使用aop的功能冲突的概率 2024-06-15 16:45:28 +08:00
8985f1dba6 update 优化 书写错误 2024-06-15 16:27:01 +08:00
5e09884e99 update mybatis-plus 3.5.6 => 3.5.7
update redisson 3.29.0 => 3.31.0
update dynamic-ds 4.3.0 => 4.3.1
2024-06-15 15:29:29 +08:00
0cb0a355bb update 优化ws打印日志 2024-06-13 16:42:28 +08:00
26445851cc fix 修复token无效时关闭ws 2024-06-13 16:14:28 +08:00
810691b5df update 优化流程办理监听,优化示例说明 2024-06-08 09:22:20 +08:00
5d18d02a9c update 优化示例 2024-06-07 22:19:09 +08:00
65421639f1 remove 删除无用导入 2024-06-07 21:42:24 +08:00
a474e9e5d1 add 补充全部流程key监听示例 2024-06-07 21:27:05 +08:00
7b9358a4f0 ♥️发布 5.2.0-BETA2 公测版本 2024-06-06 11:13:47 +08:00
ff684cad44 fix 修复驳回删除任务可能空指针异常,调整示例状态 2024-06-04 22:26:03 +08:00
0b4f6dd29b update 调整流程图查询异常 2024-06-04 13:37:01 +08:00
b4f512f667 update 优化 去除错误修改 2024-06-03 22:47:04 +08:00
7dda9974f1 !548 feat: 升级SnailJob 1.0.0-beta3
Merge pull request !548 from dhb52/dev
2024-06-03 14:46:21 +00:00
95791254a9 fix 修复抄送后有多条记录信息展示错误 2024-06-03 22:27:25 +08:00
e0253a4ea8 add 添加流程记录版本信息 2024-06-03 21:32:23 +08:00
cfc2dba275 remove 删除无用参数 2024-06-03 21:22:38 +08:00
867e7bf665 update 调整模型部署错误 添加获取流程实例id接口 2024-06-03 21:03:58 +08:00
7c448aed9f update 优化 通用接口用法 2024-06-03 16:44:20 +08:00
8a388a0d8b update 优化 补全缺失的模块 2024-06-03 16:39:20 +08:00
62a2e9de37 update 优化 去除WorkflowUtils 工具类无用方法 2024-06-03 15:52:58 +08:00
1184274246 update 优化 去除工作流无用接口 2024-06-03 15:48:46 +08:00
51d66199b1 update 优化 去除请假案例无用调用 2024-06-03 15:47:35 +08:00
e7e988f97a update 删除 无用事件属性 2024-06-03 15:05:27 +08:00
a17211dc96 update 删除 无用事件属性 2024-06-03 15:04:42 +08:00
2c1769575c feat: 升级SnailJob 1.0.0-beta3 2024-06-03 14:30:20 +08:00
5d3af1a932 add 添加单据暂存状态 2024-06-03 13:48:30 +08:00
f2e0ffb2b2 update 调整注释错误 2024-06-02 18:32:47 +08:00
2e32b748b6 update 调整缩进,补充注释 2024-06-02 18:30:15 +08:00
512b5204bc add 添加业务表状态更新示例 2024-06-02 18:24:52 +08:00
44bef2d6d9 add 增加设置流程变量接口 2024-06-02 15:02:59 +08:00
7e2257b224 update 调整模型不在使用内置监听,删除示例 2024-06-02 14:54:29 +08:00
0b04ac79d0 update 优化调整自定义监听 2024-06-02 14:42:05 +08:00
7b02ad3c00 remove 删除无用导入 2024-06-02 11:28:19 +08:00
9b507f06c4 update 增加通用接口 降低耦合 2024-06-02 10:19:18 +08:00
6ce92e1669 fix 修复任务查询错误 2024-06-02 09:40:10 +08:00
d443304829 fix 修复任务查询错误 2024-06-02 09:38:57 +08:00
c84f24fe20 add 添加通用接口 2024-05-31 22:58:13 +08:00
9175b7a4c1 update 优化流程实例接口全部按照业务id操作 2024-05-31 22:10:41 +08:00
1c011fbd7b update 增加 注释说明 2024-05-31 18:15:06 +08:00
56531afd1a update 调整 pom 文件格式 2024-05-31 16:17:06 +08:00
b6e294c137 update 更新 工作流说明 2024-05-31 15:45:57 +08:00
0f9936a542 update 更改 工作流 测试用例接口路径 2024-05-31 11:27:28 +08:00
9855f60f1f update 更改 工作流 测试用例接口路径 2024-05-31 11:25:12 +08:00
07adf67dfc fix 修复 update sql缺少字段问题 2024-05-31 10:18:07 +08:00
125b03adfc update 移除 表单构建菜单(没有可用组件 用处不大以后再考虑) 2024-05-29 18:34:30 +08:00
528b65ae04 update 优化 satoken dao多级缓存实现 设置或更新数据清理本地缓存 2024-05-29 15:44:53 +08:00
55fda94b6a update 优化 调整命名错误 2024-05-29 10:45:01 +08:00
67ab7a04ad fix 修复撤销失败 2024-05-27 15:58:52 +08:00
94797a2d2b fix 修复 oss未使用租户 拼接租户id null问题 2024-05-27 15:14:16 +08:00
1bd40a0cff Merge remote-tracking branch 'origin/dev' into dev 2024-05-27 12:23:52 +08:00
102003a52b update 完善websocket包注释 2024-05-27 12:23:28 +08:00
6777ae046e fix 修复 返回值设置错误问题 2024-05-27 11:59:35 +08:00
a32f55a920 update snailjob beta1 => beta2 2024-05-27 09:45:44 +08:00
f3cc05e651 update springboot 3.2.5 => 3.2.6 2024-05-27 09:44:46 +08:00
52a53791c8 add 新增SMS异常处理器 2024-05-26 20:30:50 +08:00
e181e340e4 fix 修复分布式锁Lock4j异常打印 2024-05-26 20:18:14 +08:00
2cf2cc46f2 update 优化修改用户信息校验 2024-05-25 22:43:33 +08:00
11bfde3dc1 Merge remote-tracking branch 'origin/dev' into dev 2024-05-25 22:39:50 +08:00
dd6d4c67ed update 优化修改用户信息 2024-05-25 22:39:40 +08:00
f13b9d2764 !540 流程任务办理时校验是否是任务办理人优化
Merge pull request !540 from 时光/dev-check-curruser-task
2024-05-25 02:07:21 +00:00
50ed9b327f !541 fix: 修复用户昵称修改后未清除对应缓存问题
Merge pull request !541 from 蒸汽咸鱼/dev
2024-05-25 02:06:49 +00:00
49f101308f !543 回退 'Pull Request !542 : 更新SnailJob版本到1.0.0-beta2'
Merge pull request !543 from 疯狂的狮子Li/revert-merge-542-dev
2024-05-25 02:05:56 +00:00
2154033879 回退 'Pull Request !542 : 更新SnailJob版本到1.0.0-beta2' 2024-05-25 02:05:34 +00:00
ba1a540add !542 更新SnailJob版本到1.0.0-beta2
* feat: 配置项变更,避免误解snail-job.group-name => snail-job.group
* chore: 更新snail-job版本到1.0.0-beta2
2024-05-24 05:30:51 +00:00
ea23e604f9 fix 修复用户昵称修改后未清除对应缓存问题 2024-05-24 09:12:17 +08:00
7cf9c15984 流程办理时校验是否是任务办理人【提交、委托、转办、终止、退回】 2024-05-23 21:49:24 +08:00
a3f43f8ea3 fix 修复本地文件上传图片预览问题 2024-05-23 09:51:20 +08:00
3a933e6f2b update 删除多余依赖 2024-05-23 09:40:14 +08:00
9a15298e63 fix 修复图片预览问题 2024-05-23 09:32:09 +08:00
7367457500 fix 修复 查询审核人权限不够问题 2024-05-22 18:26:31 +08:00
831aec3af9 !539 解决sqlserver对应flowable脚本缺少字段问题
Merge pull request !539 from ZorA/sqlserver
2024-05-22 08:44:32 +00:00
5b67b182c3 fix 修复:sqlserver数据源,flowable初始化sql脚本字段缺失问题 2024-05-22 16:37:00 +08:00
5fc0a298a5 update 优化 切换动态租户 默认线程内切换(如需全局 手动传参) 2024-05-21 09:53:19 +08:00
69e3afc770 !538 ♥️发布 5.2.0-BETA 公测版本
Merge pull request !538 from 疯狂的狮子Li/dev
2024-05-20 02:25:23 +00:00
45d431f24e Merge branch '5.X' of gitee.com:dromara/RuoYi-Vue-Plus into dev
Signed-off-by: 疯狂的狮子Li <15040126243@163.com>
2024-05-20 02:25:01 +00:00
6a3a27026d ♥️发布 5.2.0-BETA 公测版本 2024-05-20 10:21:07 +08:00
0310637b07 update 优化代码生成注释,删除无用引入 2024-05-20 09:32:24 +08:00
9662d8a2ab !537 fix: admin 模块缺少引入 common-mail
Merge pull request !537 from dhb52/dev
2024-05-19 14:19:41 +00:00
e81d8527c4 update 调整工作流菜单图标 2024-05-18 12:39:52 +08:00
02a8bfb5ae fix: admin 模块缺少引入 common-mail 2024-05-17 23:04:07 +08:00
845e95bd07 update 优化获取流程记录 2024-05-17 20:42:44 +08:00
5eea8fda26 update 优化 更改 readme 关于调度中心说明 2024-05-17 17:13:31 +08:00
b9133484f0 update 优化 更新二级缓存同时清空一级缓存 2024-05-17 13:42:31 +08:00
ef4beaceb0 !536 package-info.java中删除了powerjob相关的注释
Merge pull request !536 from 孤舟烟雨/dev
2024-05-17 03:34:02 +00:00
68dff22b77 删除powerjob相关 2024-05-17 10:47:42 +08:00
0d0ae31d52 update 优化 代码生成 pj -> sj 2024-05-17 10:15:54 +08:00
bdcd889df4 update 优化 增加 snailjob banner 2024-05-17 10:13:07 +08:00
ef57259386 !535 feat: EasyRetry-v3.2.0 => SnailJob-v1.0.0beta1
* feat: EasyRetry-v3.2.0 => SnailJob-v1.0.0beta1
2024-05-17 01:54:18 +00:00
416ca05be4 remove 移除 powerjob相关配置 2024-05-16 18:00:54 +08:00
479b17a8c2 update 取消多余父部门类别编码获取 2024-05-16 17:57:49 +08:00
624fd87751 update 优化部门类别编码获取 2024-05-16 17:52:16 +08:00
727df8dd94 remove 移除 powerjob 2024-05-16 17:35:21 +08:00
8ae9fc10eb fix 修复 oss 预览开关未清理缓存导致延迟生效问题 2024-05-16 14:30:36 +08:00
1ff6502ea9 remove 移除 powerjob 相关菜单 2024-05-16 13:33:20 +08:00
594165da6a remove 移除 powerjob 2024-05-16 10:39:37 +08:00
c03c72c7d0 remove 移除 powerjob 2024-05-16 10:36:49 +08:00
78115e0504 !534 新增工具类注释
Merge pull request !534 from AprilWind/dev-docs
2024-05-14 13:34:54 +00:00
cb9ed5add0 update 新增工具类注释 2024-05-14 17:05:52 +08:00
4bb416945b update 优化 代码生成 el-radio 标签过期属性 2024-05-13 17:29:15 +08:00
1375a19a46 update 优化 执行单元测试 编码问题 2024-05-13 17:19:24 +08:00
125b50b33e update 优化 代码生成模板 2024-05-13 17:03:03 +08:00
65d25c6f64 !533 修正Oracle的SQL脚本
Merge pull request !533 from Tom Xin/dev_fix
2024-05-13 08:56:03 +00:00
3879fa5df2 修正Oracle的sql 2024-05-13 16:29:43 +08:00
df1cd7e07f fix 修复 三方账号可以绑定多平台账号问题 2024-05-13 11:10:17 +08:00
2a9897057e update satoken 1.37.0 -> 1.38.0 2024-05-13 11:02:49 +08:00
ea5d657e31 fix 修复 三方账号可以被同一个用户多次绑定问题 2024-05-11 19:52:33 +08:00
a36a07ae6f !531 主建错别字修复
Merge pull request !531 from LiuHengShu/错别字修复
2024-05-11 11:12:17 +00:00
acaa220a70 fix 修正 主建错别字 2024-05-11 09:54:10 +08:00
3ffd1e3b41 update 优化 异常处理器自动配置 2024-05-10 11:17:44 +08:00
14cedccaf3 !530 新增分布式锁Lock4j异常拦截
* update 新增Redis异常处理器处理Lock4j异常
2024-05-10 02:29:04 +00:00
041d8399ba add 补充说明 2024-05-09 21:40:54 +08:00
32171508e1 !529 fix 修正 认证策略注释错误
Merge pull request !529 from neviabit/dev
2024-05-09 10:12:04 +00:00
11c15c47d1 fix 修正 认证策略注释错误 2024-05-09 10:08:09 +00:00
853fc6678b !528 优化文件下载
Merge pull request !528 from 秋辞未寒/dev_download
2024-05-09 09:37:21 +00:00
d6db49e621 update 优化文件下载 2024-05-09 17:17:03 +08:00
405a98c8f3 update 优化 规范命名规则 2024-05-09 17:08:21 +08:00
cb296ef2cd update 重构 workflow 模块与 system 模块解耦 2024-05-09 15:09:54 +08:00
bebd9e7a54 update 优化 去除gc日志参数(有需要自己加) 2024-05-08 18:09:05 +08:00
ae0bd608a9 update 优化 删除无用参数 2024-05-07 18:13:45 +08:00
31d445c6a1 update 调整用户id翻译,优化审批记录待审批候选人显示问题 2024-05-06 22:18:14 +08:00
f7f2c1730d update 优化 拆分异常处理器 2024-04-30 16:43:26 +08:00
2782c369c9 update 优化 常规web异常状态码 2024-04-30 16:25:51 +08:00
659db611ea update 优化 设置静态资源路径防止所有请求都可以访问静态资源 2024-04-30 16:25:26 +08:00
9e5f7be1c5 update 增加 job 测试demo数据 2024-04-30 15:52:12 +08:00
bd4f7ff3aa !524 fix 修复 https问题 站点填域名。需要启用路径样式访问
Merge pull request !524 from AprilWind/fix/dev-oss
2024-04-30 01:43:46 +00:00
155aa3ba5c update 优化是否启用路径样式注释 2024-04-29 18:06:25 +08:00
31cd1258f8 fix 站点填域名。需要启用路径样式访问 2024-04-29 17:59:26 +08:00
18e3b424d6 fix 修复 兼容redis5.0出现的问题 2024-04-28 12:31:59 +08:00
d403688a0c fix 修复 oracle 排除表名不生效问题 2024-04-27 16:41:48 +08:00
17bf0c0623 update 优化 代码生成表导入 排除工作流相关表 2024-04-27 16:15:14 +08:00
b296486892 Merge branch 'dev' of https://gitee.com/dromara/RuoYi-Vue-Plus into dev 2024-04-26 20:51:09 +08:00
64dccb192c update 更新模型错误数据,优化参数 2024-04-26 20:50:40 +08:00
c15a27709d update 优化 用户注册 创建人使用无意义值 2024-04-26 20:25:15 +08:00
33de9f9337 fix 修复 postgres 合并 test.sql出现的错误 2024-04-25 17:00:34 +08:00
aa0ebd45b9 update script/sql/sqlserver/sqlserver_ry_vue_5.X.sql.
update 优化 !pr520 存在的问题

Signed-off-by: 秋辞未寒 <545073804@qq.com>
2024-04-25 07:33:32 +00:00
2583632883 update springboot 3.2.4 => 3.2.5
update mybatis-plus 3.5.5 => 3.5.6 适配更改代码
update springdoc 2.4.0 => 2.5.0
update easyexcel 3.3.3 => 3.3.4
update redisson 3.27.2 => 3.29.0
update lombok 1.18.30 => 1.18.32
update sms4j 3.2.0 => 3.2.1
2024-04-25 12:50:42 +08:00
2472d531f5 update 优化 替换过期工具类与优化代码用法 2024-04-25 12:48:43 +08:00
fb43fb9af7 fix 修复 岗位数据权限标识错误问题 2024-04-25 12:32:28 +08:00
56a640a5c6 update 修改 admin 所属岗位的默认值 避免回显问题 2024-04-25 00:14:36 +08:00
ffa702935c update 优化 !pr520 存在的问题 2024-04-25 00:03:01 +08:00
8482203c3b !520 add 新增岗位编码与部门编码 并将岗位放到部门下
* add 新增岗位编码以及查询
* add 新增部门编码以及查询
2024-04-24 14:29:46 +00:00
eb06eb7266 fix 修复 字典键值可重复配置问题 2024-04-24 18:06:19 +08:00
ea64f505af update 优化 redis 对Long值的存储类型不同问题 2024-04-24 13:15:43 +08:00
748411c8db fix 修复 部分浏览器无法获取加密响应头问题 2024-04-23 11:36:23 +08:00
90aad8ed9a !521 update 优化工作流模块 判断集合工具类,统一为CollUtil
Merge pull request !521 from 追梦稻草人Li/dev
2024-04-23 02:21:58 +00:00
6cc2da03e0 update 优化工作流模块的集合工具类,统一为CollUtil 2024-04-23 10:18:50 +08:00
e1b94d6a28 !517 在线设备管理
* update 在线登录设备管理与前端请求一致
* update 在线登录设备管理增加退出日志
* add 新增在线登录设备管理
2024-04-19 05:00:57 +00:00
1abd2e7d7e update 优化到期时间生成任务 2024-04-17 16:06:47 +08:00
8352f18b3a update 优化 去除加密请求类型限制 2024-04-11 22:54:02 +08:00
9ff0b09d4d fix 修复 easy-retry-server 日志xml配置错误 2024-04-11 15:08:55 +08:00
2e08825da8 update 优化 mp多租户插件注入逻辑 2024-04-09 11:07:08 +08:00
cf81f641bd update 修改流程定义删除 2024-04-08 22:43:12 +08:00
07891edd16 add 补充模型 2024-04-08 21:35:51 +08:00
6ea777d584 Merge branch 'dev' of https://gitee.com/dromara/RuoYi-Vue-Plus into dev 2024-04-08 21:32:27 +08:00
040ecb2532 add 添加初始化配置数据(demo使用,不用可删除) 2024-04-08 21:30:36 +08:00
f5f8fa2471 update 添加EasyRetry新增配置项注释 2024-04-08 14:56:34 +08:00
c728116788 !512 fix: easy-retry 3.2.0升级修复
Merge pull request !512 from dhb52/dev
2024-04-08 06:12:10 +00:00
6438f80526 fix: easy-retry 3.2.0升级修复
1. SQLServer,Oracle的IDENTITY字段不能插入值
2. SQLServer er_system_user_=> er_system_user
3. ruoyi-admin增加token配置
2024-04-08 13:57:14 +08:00
0b43cf4b1c fix easy-retry数据库脚本表前缀er_支持修复 2024-04-08 11:59:29 +08:00
8677f78a56 !511 update 更新EasyRetry v3.1.1 => v3.2.0 更新数据库sql脚本,添加表前缀er_支持
Merge pull request !511 from 秋辞未寒/dev_easyretry
2024-04-08 03:07:04 +00:00
54606b05c0 update 更新EasyRetry v3.1.1 => v3.2.0 更新数据库sql脚本,添加表前缀er_支持 2024-04-08 10:56:35 +08:00
6ad126cf64 update 修改流程部署时更新流程定义配置 2024-04-07 21:17:55 +08:00
654b84f4f2 !510 add BaseMapperPlus提供一组可选是否抛出异常的selectVoOne方法
* add BaseMapperPlus提供一组可选是否抛出异常的selectVoOne方法
2024-04-07 09:31:58 +00:00
9ddf0c6e76 update 补充sql 2024-04-07 14:43:40 +08:00
7e3984e341 update 更新模型 2024-04-06 21:14:18 +08:00
af77657a86 update 调整流程定义配置逻辑 2024-04-06 21:06:25 +08:00
eb03afef41 update 补充节点配置sql 2024-04-06 11:29:42 +08:00
1da98c8a82 update 优化表单绑定逻辑,移除流程定义配置表单 2024-04-06 11:20:29 +08:00
a73c65eae9 fix 修改已办任务查询数据错误 2024-04-06 11:14:27 +08:00
5dc14666cc update 修复办理委托空指针错误 2024-04-03 20:41:30 +08:00
dd219ad295 !508 update 优化工作流ActTaskMapper.xml结果集定义
Merge pull request !508 from 秋辞未寒/dev_mpxml
2024-04-03 03:13:59 +00:00
4e871e02e6 update 优化Mapper.xml结果集定义 2024-04-03 09:05:39 +08:00
cbc1030043 add 添加流程版本 2024-04-02 20:52:52 +08:00
061c6e822d update 优化 移除删表语句 用户自行处理 2024-04-02 17:02:25 +08:00
17d259dc52 update 优化 移除删表语句 用户自行处理 2024-04-02 16:57:34 +08:00
0a319b31c8 update 优化 移除删表语句 用户自行处理 2024-04-02 16:57:17 +08:00
8b1e34d800 !507 update 优化多余的bean转换
Merge pull request !507 from 秋辞未寒/dev_beancp
2024-04-02 08:47:53 +00:00
e548a05cf0 update 优化多余的bean转换 2024-04-02 16:39:25 +08:00
089b089fce update 补充优化sql脚本 添加注释 2024-04-01 10:29:12 +08:00
aa3e8c9986 update 优化 调整sql不一致问题 2024-03-31 22:19:55 +08:00
497176d9d1 add 补充工作流脚本 2024-03-31 19:29:19 +08:00
4e52369542 update 优化 合并 test.sql 到主 sql 内 2024-03-31 16:18:58 +08:00
ba37178ebb remove 删除 已经没有存在意义的用户 2024-03-31 15:56:33 +08:00
343de424ab update 调整流程定义配置注释 2024-03-31 15:51:21 +08:00
2d790f3c4d add 补充菜单sql 2024-03-31 15:37:02 +08:00
651b2e140b add 添加表单配置 2024-03-31 15:34:27 +08:00
c859fa4c38 update 调整自定义任务 2024-03-29 15:59:48 +08:00
26e149a357 update 优化 RedisUtils 支持忽略租户 2024-03-29 15:32:49 +08:00
2ed765d204 add 增加 广告赞助商 2024-03-29 11:19:45 +08:00
8e091d712f fix 修复 临时解决 token与token-session 过期时间不一致问题(等satoken处理)
Signed-off-by: 疯狂的狮子Li <15040126243@163.com>
2024-03-29 03:11:05 +00:00
812d9eb0e8 update 优化 去除无用标识符 2024-03-28 14:52:00 +08:00
ed43774129 add 添加任务过期自动审批 2024-03-27 22:23:02 +08:00
945202652a update 调整工作流分页返回参数 2024-03-27 21:15:42 +08:00
6954fdec0a fix 修复工具类可能出现空指针情况 2024-03-27 14:19:34 +08:00
148ad7a3d1 update 补充工作流sql脚本 2024-03-26 22:00:31 +08:00
b209030f45 add 增加 easy-retry-server 运行构建配置文件 2024-03-26 11:22:53 +08:00
425dbd5604 add 增加 easy-retry-server 运行构建配置文件 2024-03-26 11:21:54 +08:00
4cf14ef5ac fix 修复 easy-retry-server 日志xml配置错误 2024-03-26 11:21:10 +08:00
f429065ab4 update 更新 ip地址 xdb文件 2024-03-26 10:37:39 +08:00
9d35575051 update springboot 3.2.3 => 3.2.4
update springdoc 2.3.0 => 2.4.0
update springboot-admin 3.2.2 => 3.2.3
update redisson 3.27.0 => 3.27.2
update sms4j 3.1.1 => 3.2.0
2024-03-26 10:37:39 +08:00
b5ad057f06 update 调整办理校验 2024-03-25 23:31:59 +08:00
ab2af1669c add 添加流程办理校验,添加部署后如果流程定义最高版本有表单配置将此版本配置同步到部署得流程定义 2024-03-25 23:30:05 +08:00
11615685b7 update 调整抄送查询,流程定义删除 2024-03-24 15:12:07 +08:00
b017cb7b54 add 添加流程实例,全部待办表单参数 2024-03-22 23:42:05 +08:00
960bea96b4 !501 更新AWS SDK 版本到2.25.15
Merge pull request !501 from AprilWind/dev
2024-03-22 05:55:57 +00:00
979cfc9af0 update 更新AWS SDK 版本,需要时显式配置最大连接数,最低使用内存 2024-03-22 13:50:31 +08:00
ed8202891f update 调整请假申请返回值,我的发起查询 2024-03-21 21:48:44 +08:00
6f5a368c86 add 添加流程表单配置 2024-03-21 21:02:16 +08:00
c6c615308c update 调整sql 字段类型 2024-03-18 20:41:25 +08:00
105dfd96c1 fix 修复我发起得列表查询错误,调整撤销后未办理任务设置null 2024-03-18 20:33:39 +08:00
65c51124f8 update 合并流程模型 2024-03-18 11:55:51 +08:00
6309af9db8 update easy-retry 3.1.0 => 3.1.1 增加日志自动推送配置 2024-03-17 23:26:23 +08:00
5360ec6ec3 add 添加节点审批记录,调整流程驳回 2024-03-17 18:25:20 +08:00
7c7cfc8c39 update 调整模型zip导出 2024-03-16 22:00:58 +08:00
f3207649ff update 调整模型部署,模型导出批量导出,上传 2024-03-16 21:59:53 +08:00
6086db3b0b fix 修复 nginx代理easy-retry缺少路径问题 2024-03-15 15:15:37 +08:00
fd4c91301e !496 工作流工具方法优化
Merge pull request !496 from 秋辞未寒/dev
2024-03-15 05:00:16 +00:00
581d7144d6 update 优化 工作流抄送任务获取多次获取租户
update 优化 工作流获取当前任务参与者存在多个办理人认领逻辑
update 优化 工作流发送消息类型判断逻辑
2024-03-15 10:32:43 +08:00
a458c7056d update 优化 !pr493 代码结构与问题修复 2024-03-14 17:28:10 +08:00
7b8822f664 !494 fix: easyretry扩展模块pom.xml的build脚本有误
Merge pull request !494 from dhb52/feature/easyretry
2024-03-14 07:48:18 +00:00
c8cd4e2d01 fix: easyretry扩展模块的build脚本问题 2024-03-14 08:48:15 +08:00
abe6b05c5c update 优化 !pr493 代码结构与问题修复 2024-03-14 01:13:29 +08:00
1b6b74c67b !493 新增EasyRetry扩展模块
Merge pull request !493 from dhb52/feature/easyretry
2024-03-13 16:07:34 +00:00
df5cbaaea8 EasyRetry Server 扩展模块 2024-03-14 00:01:17 +08:00
9a14e90642 fix 修复驳回查询当前任务错误 2024-03-12 22:09:17 +08:00
fb337f57b8 fix 修复办理后可能出现办理人为空 2024-03-12 21:38:26 +08:00
9f09083247 fix 修复选择一人时还需要认领问题 2024-03-12 21:33:39 +08:00
74e55720d7 update 调整全部已办排除抄送 2024-03-11 21:13:54 +08:00
e30e4fe447 update 修改我的已办过滤抄送数据,添加已审批过得节点查询接口 2024-03-11 21:02:05 +08:00
5d38f4bb77 fix 修复 用户未设置部门 登录报错问题 2024-03-11 16:33:11 +08:00
dbef39a7a6 update copyright 2024 2024-03-11 10:59:01 +08:00
f66b196046 !492 update 优化新增修改菜单权限字符校验
Merge pull request !492 from AprilWind/dev
2024-03-11 02:24:32 +00:00
bb59cb204d update 优化新增修改菜单权限字符校验 2024-03-09 17:37:48 +08:00
731bcc7e93 fix 修复待办认领后查询数据错误 2024-03-09 15:37:23 +08:00
b3dbb19afc add 提交流程变量vo 2024-03-09 13:50:17 +08:00
b4e1e32d20 add 添加查询流程变量接口 2024-03-09 13:40:41 +08:00
c9cceb9e2d update 补充流程分类sql数据 2024-03-09 11:30:55 +08:00
fe13fd899c fix 修改无法终止流程bug,补充注释 2024-03-09 11:09:42 +08:00
81b2999dc4 fix 修改流程预览悬浮无已审批人员问题 2024-03-08 23:04:01 +08:00
598ece677d Merge remote-tracking branch 'origin/dev' into dev 2024-03-08 16:18:23 +08:00
2142fc8876 update 修复我的待办查询报错问题 2024-03-08 16:18:14 +08:00
67d96a63f1 update 优化 验证码背景色改为浅灰色 2024-03-08 14:35:27 +08:00
efc46c17b2 update 修改jdk默认版本为17 2024-03-08 12:20:08 +08:00
acae5616f8 update 修改获取当前任务 2024-03-07 21:55:24 +08:00
672320f38b update 优化当前任务审批人 添加获取当前任务查询 2024-03-07 18:28:41 +08:00
f3cd3bb63f Merge branch 'dev' of https://gitee.com/dromara/RuoYi-Vue-Plus into dev 2024-03-07 17:53:58 +08:00
ea98435acd remove 删除无用代码 2024-03-07 17:53:42 +08:00
d545f8ddda update 优化 更改流程命名 2024-03-07 16:56:00 +08:00
d4685e5f95 add 添加撤销,终止,驳回,作废等状态校验 2024-03-07 15:42:32 +08:00
e7907a4664 Merge remote-tracking branch 'origin/dev' into dev 2024-03-07 15:14:37 +08:00
60862ffc3e update 优化 重复get方法 2024-03-07 15:14:27 +08:00
154ee06d70 fix 修复 oracle与postgres sql脚本租户id设置错误问题 2024-03-07 15:08:56 +08:00
22d87c7c9d update 优化 工作流代码与接口命名 2024-03-07 14:09:30 +08:00
e8f8b41f8b remove 移除无用代码 2024-03-07 13:31:54 +08:00
079f90766f update 修复创建任务,模型租户判断 2024-03-07 13:21:07 +08:00
acc7f3dfe5 update 优化 封装 QueryUtils 查询工具 简化工作流业务查询代码 2024-03-06 23:56:43 +08:00
234d8989d7 update 优化 支持工作流关闭租户 2024-03-06 19:07:23 +08:00
acb6aeffd1 update 优化 去除非必要注解 2024-03-06 00:01:51 +08:00
b8135557e5 update 优化 更改流程文件命名 2024-03-05 23:58:51 +08:00
d54772815b !491 合并flowable工作流功能
* update 优化 表字段映射于数据库保持一致
* remove 删除无用代码
* remove 删除无用代码
* fix 修复 实体类未实现序列化接口问题
* update 优化 表字段映射于数据库保持一致
* update 优化 统一sql名称
* fix 修复 接口名称编写错误
* merge dev
* update 调整sql 添加抄送查询
* update 调整菜单
* update 调整sql脚本
* update 调整任务查询 添加抄送
* add 抄送任务
* remove 删除错误代码
* remove 删除无用代码
* update 调整作废,撤销等校验
* fix 修复 流程作废异常问题
* update 优化 flowable 配置到主yml文件
* update 调整 数据排序规则
* fix 修复 数据库无法自动执行建表sql问题
* update 优化 工作流id生成器保持全局统一
* add 添加附件任务查询
* add 添加审批附件上传
* update 调整bpmn文件修复驳回失败问题
* update 调整会签类型转换异常
* add 添加获取运行中流程信息,流程扩展信息,补充注解,删除无用代码
* update 调整流程转换,流程启动,上传新bpmn文件
* update 调整方法
* update 调整模型修改
* fix 修复 user与dept xml 编写错误
* remove 移除原生ui接口,增加新ui接口
* update 优化 下拉选接口数据权限
* update 优化 删除观测用日志记录
* reset 还原修复命名
* update 修复命名
* add 新增 用户、部门、角色、岗位 下拉选接口与代码实现优化
* update 调整任务办理异步时流程状态错误问题
* add 工作流用户查询
* remove 删除无用注释 添加非空校验
* update 优化获取审批记录
* update 调整事件办理
* update 调整工作流选人接口
* Merge branch 'dev' into future/flowable
* update 办理调整执行顺序
* update 调整流程办理优化撤销,驳回,草稿等动作
* fix 修复子流程中设置发起人变量错误问题
* Merge branch 'dev' into future/flowable
* update 调整流程执行非空校验,调整任务节点执行
* update 调整注释
* add 添加自定义任务监听策略
* !469 update-完善对模型key校验逻辑
* update-修改常量命名
* update-完善对模型key校验逻辑
* add 添加sql脚本
* Merge branch 'dev' into future/flowable
* Merge branch 'dev' into future/flowable
* Merge branch 'future/flowable' of https://gitee.com/dromara/RuoYi-Vue-…
* add 添加SQLserve脚本
* add 添加流程监听示例
* update 调整获取审批记录
* Merge branch 'future/flowable' of https://gitee.com/dromara/RuoYi-Vue-…
* update  调整请假查询 修改流程定义查看xml
* update 调整流程实例删除
* update 调整sql
* add 添加sql脚本
* update 调整sql
* update 调整请假申请,调整菜单sql
* update 调整设计器保存发起人变量,修改菜单sql
* update 依赖调整
* update 调整flw依赖
* update 升级7.0后移除画图mule类型
* update 调整flw依赖
* update 移动模型设计器翻译方法
* update 调整flw依赖
* fix 修复 误删依赖
* Merge remote-tracking branch 'origin/dev' into future/flowable
* remove 移除动态表单
* Merge remote-tracking branch 'origin/dev' into future/flowable
* update 优化代码结构
* update 调整请假申请包结构
* Merge branch 'dev' into future/flowable
* add 添加文件,调整分类查询
* Merge branch 'dev' into future/flowable
* Merge branch 'future/flowable' of https://gitee.com/dromara/RuoYi-Vue-…
* add bpmn文件 调整流程办理
* Merge branch 'dev' into future/flowable
* Merge branch 'future/flowable' of https://gitee.com/dromara/RuoYi-Vue-…
* Merge branch '5.X' into future/flowable
* update 调整消息发送
* update 调整名称
* update 调整流程实例查询
* add 添加任务催办,任务改派
* fix 修复 用户注册接口校验用户名不区分租户问题
* update 还原待办任务,添加待办消息发送
* update 优化任务待办,排除非待办任务
* Merge branch '5.X' into future/flowable
* update 修改流程启动后重新覆盖流程变量,删除并行流程驳回,撤销后,垃圾数据
* update 升级flowable7.0,添加业务单据删除流程信息
* Merge branch '5.X' into future/flowable
* add 添加动态表单提交流程
* Merge branch 'future/flowable' of https://gitee.com/dromara/RuoYi-Vue-…
* add 添加动态表单单据
* update 升级flowable到7.0.0.M2,调整工作流提交校验,调整工作流工具类
* add 新增流程定义与表单关联
* update 调整修改流程分类后更新流程分类编码
* update 调整流程定义图片预览
* update 调整人员查询
* update 优化作废,撤销等备注
* Merge branch '5.X' into future/flowable
* Merge branch 'future/flowable' of https://gitee.com/dromara/RuoYi-Vue-…
* fix 解决设计器选择设置流程发起人设置变量有问题
* add 添加引擎调度监听
* merge 合并5.x分支代码
* remove 移除flow-ui
* update 调整日志打印
* add 添加按照业务id删除流程记录
* add 添加请假申请示例,添加流程定义文件部署,添加sql菜单
* update 移除流程表单 formConfig 属性,表单配置信息都放一起便于使用。
* update 调整菜单
* add 添加mysql工作流菜单
* update 调整获取加签人,审判记录
* update 调整流程作废
* add 添加任务完成状态
* add 添加加签,减签人员接口
* update 调整任务驳回后设置审批人
* add 添加驳回申请人
* add 添加查询当前租户所有待办,已办任务
* add 添加会签任务加签减签,添加任务作废理由
* update 调整流程实例,流程定义检索
* update 调整撤销流程申请,当前登录人单据
* add 添加办理人名称翻译
* add 添加流程流程实例,流程定义分类查询
* add 添加模型分类查询
* add 添加流程分类
* add 添加流程表单操作相关接口
* fix 修复修改流程历史流程实例错误问题
* update 调整已办任务排序,添加注释
* update 调整用户,用户组查询
* add 添加获取当前任务参与者,优化任务待办,已办
* add 添加当前登录人单据列表,添加单据状态
* update 补充任务撤销事务
* add 添加撤销流程申请
* update 优化流程实例删除
* fix 修复流程实例查询挂起状态错误
* update 优化流程办理 流程挂起抛出异常
* add 添加业务状态枚举。添加流程启动,审批,终止等状态
* update 优化流程启动
* add 添加流程实例作废,运行中流程实例删除,已完成流程实例删除
* add 添加节点信息
* 调整流程预览
* add 添加审批记录
* 还原代码
* fix 修复模型导出错误
* add 增加委托办理,调整流程启动
* add 添加转办任务
* add 添加任务拾取,任务归还,任务终止,任务委托
* fix 修复任务,流程实例分页模糊查询失效
* add 添加流程实例运行中,已结束分页查询
* add 添加通过流程实例id获取历史流程图,添加flowable配置,调整流程办理
* add 添加流程办理,流程待办,已办分页查询
* 删除无用导入
* 调整流程查询租户id
* add 添加流程启动
* 添加模型人员用户,组查询
* add 添加模型部署模型校验
* 修改模型部署导出校验
* fix 修复模型画图保存时key不回显问题
* add 添加流程定义转换为模型
* 优化模型编辑校验,流程定义删除,流程定义激活挂起等
* add 添加流程定义删除,流程定义挂起激活,流程定义版本迁移
* 调整ObjectNode.put警告
* 删除无用依赖,优化模型修改,导出,部署非空校验
* 删除无用导入
* 添加流程定义分页,查看图片,查看xml
* 添加模型部署,导出模型
* 修改画图账户登录信息
* 添加模型编辑key重复校验,添加租户查询,删除忽略token注解
* 添加模型新增校验
* 添加工作流模型新增,修改,查询,删除
* 【ADD】集成原生Flowable-ui
* 添加workflow模块,添加flowable依赖,yml配置信息
2024-03-05 14:57:39 +00:00
5f7f8a31e9 update 更新 mybatis 多包扫描配置 2024-02-26 10:42:14 +08:00
56798131b3 update spring-boot 3.2.2 => 3.2.3
update spring-boot-admin 3.2.1 => 3.2.2
update hutool 5.8.24 => 5.8.26
update mapstruct-plus 1.3.5 => 1.3.6
2024-02-23 10:33:33 +08:00
3b932cfa7b update 优化 AsyncConfig 虚拟线程名称支持 2024-02-21 13:30:05 +08:00
2d27100b5d update redisson 3.25.2 => 3.27.0 支持虚拟线程 2024-02-21 13:29:32 +08:00
5e1bd0d679 fix 修复 空指针null问题 2024-02-20 17:10:50 +08:00
d954cf01f3 update 优化 删除无用配置 2024-02-19 16:39:15 +08:00
e655da45e2 update 优化 删除无用变量 2024-02-19 11:51:45 +08:00
c7246b3a84 update 优化 mybatis依赖设置为可选依赖 避免出现不应该注入的情况 2024-02-06 17:44:53 +08:00
bef6bb7004 !486 RateLimiter优化
Merge pull request !486 from ly-chn/rate-limiter-feat
2024-02-04 04:05:45 +00:00
ef8c567ab6 update: 优化RateLimiter注解使用体验
feat RateLimiter添加更丰富的SpEL支持, 如bean调用, 参数p0, p1调用

feat RateLimiter支持IDEA下参数提示, 自动重命名(需要安装`SpEL Assistant`插件)
2024-02-04 11:50:00 +08:00
0fd001f229 update 优化 GET 方法响应体支持加密 2024-02-04 10:30:15 +08:00
55ce0e34c9 !480 优化单元格合并后多余内容的清除
* excel插件 优化合并策略 在合适的生命周期完成合并 去除被合并单元格的非首行内容
2024-02-04 01:52:19 +00:00
70bf1a48d0 !481 单元格合并可以基于注解选择哪些其他字段需要同时相等方可进行该单元格合并
* excel插件 原有的合并策略写死了根据前一字段是否一致来判断后一字段的合并 感觉这样不灵活 如有特殊需求 字段排序不规整 于是扩充了注解的…
2024-02-04 01:51:52 +00:00
7b4e8324a9 fix 修复 user与dept xml 编写错误 2024-02-01 12:20:00 +08:00
3913bf68c6 update 优化 下拉选接口数据权限 2024-01-31 23:24:51 +08:00
ea48115190 update 优化 删除观测用日志记录 2024-01-28 23:15:37 +08:00
9fdd4d0fba update 优化 补全prod配置文件缺失配置 2024-01-27 12:58:24 +08:00
bec97982a6 update 优化 自动填充更新人逻辑 2024-01-27 12:57:43 +08:00
3a4990e3d4 fix 修复 岗位下拉框接口权限标识符错误 2024-01-27 00:54:49 +08:00
995ddf6d98 add 新增 用户、部门、角色、岗位 下拉选接口与代码实现优化 2024-01-27 00:51:50 +08:00
1997a607ba update 优化 删除无用配置 2024-01-25 17:29:08 +08:00
3d406c2d07 fix 修复 excel 表达式字典 下拉框导出格式错误 2024-01-25 15:06:43 +08:00
591331b70c update 优化 !pr485 代码变量 2024-01-25 15:05:28 +08:00
4273f2db34 !485 优化 OssFactory 获取实例锁性能
Merge pull request !485 from fanc/dev
2024-01-25 07:00:52 +00:00
cb913a9adc fix 提升锁的作用域 并采用双重校验锁
Signed-off-by: fanc <1571025887@qq.com>
2024-01-25 06:48:29 +00:00
7c5898ddf6 update 优化 OssFactory 获取实例锁性能 2024-01-25 10:14:22 +08:00
a07e5d7833 update 优化 解除注释 使用spring包装虚拟线程池无须担心idea警告问题 2024-01-22 13:02:43 +08:00
9766f61cf8 update springboot 3.2.1 => 3.2.2
update springboot-admin 3.2.0 => 3.2.1
2024-01-20 18:27:14 +08:00
58657e53bf !483 同步cloud版本
Merge pull request !483 from AprilWind/dev-docs
2024-01-20 10:24:28 +00:00
391c92a6c6 update 使用springboot封装的虚拟线程池 2024-01-20 18:24:04 +08:00
65480ebe96 update 优化代码格式 2024-01-20 11:30:49 +08:00
5e5fe434e2 update 删除多余注解 2024-01-18 18:35:07 +08:00
b628c9b027 update sms4j 2.2.0 => 3.1.1 大升级 支持自定义配置key 可用于多厂商多租户等 2024-01-18 18:33:47 +08:00
928e418f3f add 增加 赞助商 数驼科技 2024-01-18 17:48:07 +08:00
e5089dc126 add 增加 赞助商 数驼科技 2024-01-18 17:31:52 +08:00
6cff0375fb update 优化 登录消息 支持集群发送 2024-01-18 12:17:18 +08:00
afa8a1f298 update 优化 消除无用 mapper 扫描警告 2024-01-18 10:32:53 +08:00
8c3462079b update 优化 数据权限 使用预扫描mapper注解提升代码性能 2024-01-17 23:05:21 +08:00
f1eeb08d90 update 优化 !pr479 代码效率与书写格式 2024-01-17 21:20:29 +08:00
cad250f02a !479 update 优化 使用预扫描实体类提升代码性能
* 优化了数据库字段加解密的缓存机制.在自动配置类启动时,就把有加密注解的类进行缓存,以提高速度.
2024-01-17 05:47:44 +00:00
13e60a6048 update 优化 oss 下载使用临时文件避免线程冲突 2024-01-15 09:36:55 +08:00
e115f5f2f4 update 优化 替换过期方法 2024-01-14 22:45:42 +08:00
348bd00fa3 [重大更新] 升级 awsS3 到2.X版本 支持异步与自动分片上传下载 2024-01-14 21:20:00 +08:00
2417517aee add 新增 正则工具类 字符串提取 字符串校验 2024-01-14 20:44:45 +08:00
05880981f8 update 优化 删除无用代码 2024-01-14 00:53:07 +08:00
d4f8b93fe3 add 增加 StringUtils.isVirtual 方法
update 优化 undertow 虚拟线程实现
2024-01-12 17:27:40 +08:00
7f64fa7037 update lock4j 2.2.5 => 2.2.7 消除启动警告 2024-01-12 15:04:41 +08:00
eca2be1a2e update 优化 Async 针对虚拟线程配置 与其他注意事项注释 2024-01-12 10:24:00 +08:00
3d03a5b319 fix 修复 用户登录查询部门缓存无法获取租户id问题 2024-01-11 23:21:24 +08:00
59385fc08d fix 修复 InjectionMetaObjectHandler 已存在数据依旧会获取用户信息报异常问题 2024-01-11 23:19:25 +08:00
fcabba1087 fix 修复 caffeine共享 key冲突导致的数据问题 2024-01-11 23:18:16 +08:00
2ac24d62a0 fix 修复 类型判断问题 2024-01-09 17:29:13 +08:00
f0b9c21169 update 优化 !pr477 数据库类型 2024-01-08 23:02:17 +08:00
46e46e60a6 update 规范设计模式命名 2024-01-08 22:51:39 +08:00
606290e185 !477 JustAuth 整合 TopIam 单点登录
Merge pull request !477 from 马铃薯头/dev
2024-01-08 04:04:44 +00:00
845b57e931 JustAuth 整合 TopIam 单点登录 2024-01-08 11:54:30 +08:00
e7ca94bab1 update 优化 使用翻译注解简化用户查询 调整用户查询逻辑
update 优化 使用翻译注解简化用户查询 调整用户查询逻辑
2024-01-06 20:48:20 +08:00
a7bb4ee50c !475 LoginHelper类 login方法 存在 重复代码
Merge pull request !475 from simple/loginhelper
2024-01-06 11:43:39 +00:00
339f85741f fix: LoginHelper类 login方法 存在 重复代码 2024-01-06 18:20:21 +08:00
63374ee876 fix 修复 一级缓存带来的问题 2024-01-05 19:10:37 +08:00
e77ede91b9 update 优化 删除多余提交记录 2024-01-05 09:48:58 +08:00
30d7651322 update springboot 3.1.7 => 3.2.1 全面支持虚拟线程
update springboot-admin 3.1.8 => 3.2.0
update springdoc 2.2.0 => 2.3.0
update redisson 3.24.3 => 3.25.2
update hutool 5.8.22 => 5.8.24
update dynamic-ds 4.2.0 => 4.3.0
2024-01-04 16:33:48 +08:00
f101d70523 !473 perf: 减少powerjob不必要的nginx代理路径
Merge pull request !473 from dhb52/dev
2024-01-04 03:02:29 +00:00
5cf84980e8 update revision 5.2.0-SNAPSHOT 2024-01-04 10:28:03 +08:00
3035eb4a54 update 优化 全局创建 caffeine 实例 2024-01-04 09:54:03 +08:00
b4710edc18 update README.md.
update 优化 readme

Signed-off-by: 疯狂的狮子Li <15040126243@163.com>
2024-01-03 10:57:13 +00:00
3e2a6492f4 update 优化 readme 2024-01-03 18:54:49 +08:00
e11b1bb2ec update 优化 移除ThreadLocalHolder(不可控问题太多) 2024-01-03 17:45:02 +08:00
57318cc55d [重大更新] 新增 PlusCacheWrapper装饰器 为SpringCache增加本地缓存减少redis查询提高性能(尝试性更新问题未知 请勿轻易更新尝试) 2024-01-03 10:25:23 +08:00
8d3d93e537 perf: 减少powerjob不必要的代理路径
Signed-off-by: dhb52 <dhb52@126.com>
2024-01-02 15:15:08 +00:00
df5edb67f0 [重大更新] 使用caffeine重构PlusSaTokenDao层实现 减少将近90%的redis查询提高性能(尝试性更新问题未知 请勿轻易更新尝试) 2024-01-02 20:01:09 +08:00
12b40f2bbe !472 powerjob反向代理添加fonts,修复fontawesome显示
Merge pull request !472 from dhb52/dev
2024-01-02 10:21:36 +00:00
8660db3bb3 fix: powerjob反向代理添加fonts,修复fontawesome显示
Signed-off-by: dhb52 <dhb52@126.com>
2024-01-02 10:13:46 +00:00
649099a841 fix 修复 临时解决 token与token-session 过期时间不一致问题(等satoken处理) 2024-01-02 17:06:05 +08:00
b4f91a9bbd add 增加 README 赞助商链接 2024-01-02 13:10:13 +08:00
f72ce39c13 fix 修复 关闭租户功能 三方登录报错问题 2024-01-02 13:00:19 +08:00
f5420f1f07 fix 修复 登录未查询部门名称问题 2023-12-29 12:50:31 +08:00
2cf7c45ac5 update 优化 删除已经无用的依赖 2023-12-29 11:50:55 +08:00
4ceb79afa3 !467 新增 ThreadLocalHolder 整合 SaHolder,ThreadLocal
* fix 修复 issue#I8RWB5 字段缺少问题 ;
* add 新增 ThreadLocalHolder 替换 SaHolder ;
2023-12-29 03:39:15 +00:00
84671e5972 fix 修复 部门树排序问题 2023-12-29 11:36:43 +08:00
9c84530593 update 优化 框架整体提高查询性能 2023-12-26 00:46:34 +08:00
363af040d6 update 优化 将p6spy配置文件统一放置到 common-mybatis 插件包内 2023-12-25 15:50:51 +08:00
2ea30af4c4 update mybatis-plus 3.5.4 => 3.5.4 修复与boot代码冲突问题 2023-12-25 13:23:37 +08:00
6ccef6c1d0 update 优化 代码生成提交数据提示语 2023-12-24 19:51:45 +08:00
2a9624d404 Merge remote-tracking branch 'origin/dev' into 5.X 2023-12-23 23:08:14 +08:00
a1f404d548 fix 修复 CryptoFilter 代码逻辑问题 2023-12-23 23:06:47 +08:00
c95a197028 Merge branch 'dev' into 5.X 2023-12-22 16:05:00 +08:00
82c62091aa fix 修复 mybatis-plus 与 springboot 冲突问题(等mp发新版本删除) 2023-12-22 16:01:31 +08:00
606 changed files with 33697 additions and 10001 deletions

View File

@ -1,49 +0,0 @@
### 使用版本(未按照模板填写直接删除)
- jdk版本(带上尾号): 例如 1.8.0_202
- 框架版本(项目启动时输出的版本号): 例如 4.4.0
- 其他依赖版本(你觉得有必要的):
### 问题前提
> 功能不好用 不会用 是否已经看过项目文档
> 项目运行报错 是否已经拿着报错信息去百度 常见报错百度百度足以
> 是否搜索过其他issue 一些已经解决的问题 会在issue内留下解决方法
> 无法线上解决或者与框架无关的问题的欢迎加VIP群跟作者一对一谈
### 异常模块
> 此报错都涉及到那些系统模块
例如 ruoyi-system ruoyi-auth 等等
### 问题描述
> 越详细越容易直击问题所在
已知: XXX功能不好用 或 XXX数据不正常 等等
### 希望结果
> 想知道你觉得怎么样是正常或者合理的
希望功能可以有XXX结果 或者 XXX现象
### 重现步骤
> 作者并不知道这个问题是如何出现的
- 1
- 2
- 3
### 相关代码与报错信息(请勿发混乱格式)
> 代码可按照如下形式提供或者截图均可 越详细越好
> 大多数问题都是 代码编写错误问题 逻辑问题 或者用法错误等问题
```java
public class XXX {
}
```

View File

@ -9,8 +9,9 @@ body:
label: 版本
description: 你当前正在使用我们软件的哪个版本(pom文件内的版本号)
value: |
jdk版本(带上尾号): 例如 17.0.8
框架版本(项目启动时输出的版本号): 例如 5.1.1
注意: 未填写版本号不予处理直接关闭或删除
jdk版本(带上尾号):
框架版本(项目启动时输出的版本号):
其他依赖版本(你觉得有必要的):
validations:
required: true

View File

@ -2,7 +2,7 @@
<configuration default="false" name="ruoyi-monitor-admin" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
<deployment type="dockerfile">
<settings>
<option name="imageTag" value="ruoyi/ruoyi-monitor-admin:5.1.2" />
<option name="imageTag" value="ruoyi/ruoyi-monitor-admin:5.4.1" />
<option name="buildOnly" value="true" />
<option name="sourceFilePath" value="ruoyi-extend/ruoyi-monitor-admin/Dockerfile" />
</settings>

View File

@ -2,7 +2,7 @@
<configuration default="false" name="ruoyi-server" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
<deployment type="dockerfile">
<settings>
<option name="imageTag" value="ruoyi/ruoyi-server:5.1.2" />
<option name="imageTag" value="ruoyi/ruoyi-server:5.4.1" />
<option name="buildOnly" value="true" />
<option name="sourceFilePath" value="ruoyi-admin/Dockerfile" />
</settings>

View File

@ -1,10 +1,10 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="ruoyi-powerjob-server" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
<configuration default="false" name="ruoyi-snailjob-server" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
<deployment type="dockerfile">
<settings>
<option name="imageTag" value="ruoyi/ruoyi-powerjob-server:5.1.2" />
<option name="imageTag" value="ruoyi/ruoyi-snailjob-server:5.4.1" />
<option name="buildOnly" value="true" />
<option name="sourceFilePath" value="ruoyi-extend/ruoyi-powerjob-server/Dockerfile" />
<option name="sourceFilePath" value="ruoyi-extend/ruoyi-snailjob-server/Dockerfile" />
</settings>
</deployment>
<method v="2" />

View File

@ -6,24 +6,41 @@
[![码云Gitee](https://gitee.com/dromara/RuoYi-Vue-Plus/badge/star.svg?theme=blue)](https://gitee.com/dromara/RuoYi-Vue-Plus)
[![GitHub](https://img.shields.io/github/stars/dromara/RuoYi-Vue-Plus.svg?style=social&label=Stars)](https://github.com/dromara/RuoYi-Vue-Plus)
[![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://gitee.com/dromara/RuoYi-Vue-Plus/blob/master/LICENSE)
[![Star](https://gitcode.com/dromara/RuoYi-Vue-Plus/star/badge.svg)](https://gitcode.com/dromara/RuoYi-Vue-Plus)
[![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://gitee.com/dromara/RuoYi-Vue-Plus/blob/5.X/LICENSE)
[![使用IntelliJ IDEA开发维护](https://img.shields.io/badge/IntelliJ%20IDEA-提供支持-blue.svg)](https://www.jetbrains.com/?from=RuoYi-Vue-Plus)
<br>
[![RuoYi-Vue-Plus](https://img.shields.io/badge/RuoYi_Vue_Plus-5.1.2-success.svg)](https://gitee.com/dromara/RuoYi-Vue-Plus)
[![Spring Boot](https://img.shields.io/badge/Spring%20Boot-3.1-blue.svg)]()
[![RuoYi-Vue-Plus](https://img.shields.io/badge/RuoYi_Vue_Plus-5.4.1-success.svg)](https://gitee.com/dromara/RuoYi-Vue-Plus)
[![Spring Boot](https://img.shields.io/badge/Spring%20Boot-3.4-blue.svg)]()
[![JDK-17](https://img.shields.io/badge/JDK-17-green.svg)]()
[![JDK-21](https://img.shields.io/badge/JDK-21-green.svg)]()
> RuoYi-Vue-Plus 是重写 RuoYi-Vue 针对 `分布式集群与多租户` 场景全方位升级(不兼容原框架)
> Dromara RuoYi-Vue-Plus 是重写 RuoYi-Vue 针对 `分布式集群与多租户` 场景全方位升级(不兼容原框架)
> 项目代码、文档 均开源免费可商用 遵循开源协议在项目中保留开源协议文件即可<br>
活到老写到老 为兴趣而开源 为学习而开源 为让大家真正可以学到技术而开源
> 系统演示: [传送门](https://plus-doc.dromara.org/#/common/demo_system)
> 前端项目地址: [plus-ui](https://gitee.com/JavaLionLi/plus-ui)
> 官方前端项目地址: [gitee](https://gitee.com/JavaLionLi/plus-ui) - [github](https://github.com/JavaLionLi/plus-ui) - [gitcode](https://gitcode.com/dromara/plus-ui)<br>
> 成员前端项目地址: 基于vben5 [ruoyi-plus-vben5](https://gitee.com/dapppp/ruoyi-plus-vben5)<br>
> 成员前端项目地址: 基于soybean [ruoyi-plus-soybean](https://gitee.com/xlsea/ruoyi-plus-soybean)<br>
> 成员项目地址: 删除多租户与工作流 [RuoYi-Vue-Plus-Single](https://gitee.com/ColorDreams/RuoYi-Vue-Plus-Single)<br>
> 文档地址: [plus-doc](https://plus-doc.dromara.org) - [plus-doc(国内备用)](https://dromara.gitee.io/plus-doc)
> 文档地址: [plus-doc](https://plus-doc.dromara.org) 国内加速: [plus-doc.top](https://plus-doc.top)
## 赞助商
MaxKey 业界领先单点登录产品 - https://gitee.com/dromara/MaxKey <br>
CCFlow 驰聘低代码-流程-表单 - https://gitee.com/opencc/RuoYi-JFlow <br>
数舵科技 软件定制开发APP小程序等 - http://www.shuduokeji.com/ <br>
引迈信息 软件开发平台 - https://www.jnpfsoft.com/index.html?from=plus-doc <br>
<font color="red">**启山商城系统 多租户商城源码可免费商用可二次开发 - https://www.73app.cn/** </font><br>
Mall4J 高质量Java商城系统 - https://www.mall4j.com/cn/?statId=11 <br>
aizuda flowlong 工作流 - https://gitee.com/aizuda/flowlong <br>
Ruoyi-Plus-Uniapp - https://ruoyi.plus <br>
[如何成为赞助商 加群联系作者详谈 每日PV2500-3000 IP1700-2500](https://plus-doc.dromara.org/#/common/add_group)
# 本框架与RuoYi的功能差异
@ -48,22 +65,24 @@
| 数据加解密 | 采用 注解 + mybatis 拦截器 对存取数据期间自动加解密<br/>支持多种策略 如BASE64、AES、RSA、SM2、SM4等 | 无 |
| 接口传输加密 | 采用 动态 AES + RSA 加密请求 body 每一次请求秘钥都不同大幅度降低可破解性 | 无 |
| 数据翻译 | 采用 注解 + jackson 序列化期间动态修改数据 数据进行翻译<br/>支持多种模式: `映射翻译` `直接翻译` `其他扩展条件翻译` 接口化两步即可完成自定义扩展 内置多种翻译实现 | 无 |
| 多数据源框架 | 采用 dynamic-datasource 支持面大部分数据库<br/>通过yml配置即可动态管理异构不同种类的数据库 也可通过前端页面添加数据源<br/>支持spel表达式从请求头参数等条件切换数据源 | 基于 druid 手动编写代码配置数据源 配置繁琐 支持性差 |
| 多数据源框架 | 采用 dynamic-datasource 支持面大部分数据库<br/>通过yml配置即可动态管理异构不同种类的数据库 也可通过前端页面添加数据源<br/>支持spel表达式从请求头参数等条件切换数据源 | 基于 druid 手动编写代码配置数据源 配置繁琐 支持性差 |
| 多数据源事务 | 采用 dynamic-datasource 支持多数据源不同种类的数据库事务回滚 | 不支持 |
| 数据库连接池 | 采用 HikariCP Spring官方内置连接池 配置简单 以性能与稳定性闻名天下 | 采用 druid bug众多 社区维护差 活跃度低 配置众多繁琐性能一般 |
| 数据库主键 | 采用 雪花ID 基于时间戳的 有序增长 唯一ID 再也不用为分库分表 数据合并主键冲突重复而发愁 | 采用 数据库自增ID 支持数据量有限 不支持多数据源主键唯一 |
| WebSocket协议 | 基于 Spring 封装的 WebSocket 协议 扩展了Token鉴权与分布式会话同步 不再只是基于单机的废物 | 无 |
| SSE推送 | 采用 Spring SSE 实现 扩展了Token鉴权与分布式会话同步 | 无 |
| 序列化 | 采用 Jackson Spring官方内置序列化 靠谱!!! | 采用 fastjson bugjson 远近闻名 |
| 分布式幂等 | 参考美团GTIS防重系统简化实现(细节可看文档) | 手动编写注解基于aop实现 |
| 分布式锁 | 采用 Lock4j 底层基于 Redisson | 无 |
| 分布式任务调度 | 采用 PowerJob 天生支持分布式 统一的管理中心 | 采用 Quartz 基于数据库锁性能差 集群需要做很多配置与改造 |
| 分布式任务调度 | 采用 SnailJob 天生支持分布式 统一的管理中心 支持多种数据库 支持分片重试DAG任务流等 | 采用 Quartz 基于数据库锁性能差 集群需要做很多配置与改造 |
| 文件存储 | 采用 Minio 分布式文件存储 天生支持多机、多硬盘、多分片、多副本存储<br/>支持权限管理 安全可靠 文件可加密存储 | 采用 本机文件存储 文件裸漏 易丢失泄漏 不支持集群有单点效应 |
| 云存储 | 采用 AWS S3 协议客户端 支持 七牛、阿里、腾讯 等一切支持S3协议的厂家 | 不支持 |
| 短信 | 采用 sms4j 短信融合包 支持数十种短信厂家 只需在yml配置好厂家密钥即可使用 可多厂家共用 | 不支持 |
| 邮件 | 采用 mail-api 通用协议支持大部分邮件厂商 | 不支持 |
| 接口文档 | 采用 SpringDoc、javadoc 无注解零入侵基于java注释<br/>只需把注释写好 无需再写一大堆的文档注解了 | 采用 Springfox 已停止维护 需要编写大量的注解来支持文档生成 |
| 校验框架 | 采用 Validation 支持注解与工具类校验 注解支持国际化 | 仅支持注解 且注解不支持国际化 |
| Excel框架 | 采用 Alibaba EasyExcel 基于插件化<br/>框架对其增加了很多功能 例如 自动合并相同内容 自动排列布局 字典翻译等 | 基于 POI 手写实现 功能有限 复杂 扩展性差 |
| Excel框架 | 采用 FastExcel(原Alibaba EasyExcel) 基于插件化<br/>框架对其增加了很多功能 例如 自动合并相同内容 自动排列布局 字典翻译等 | 基于 POI 手写实现 功能有限 复杂 扩展性差 |
| 工作流支持 | 支持各种复杂审批 转办 委派 加减签 会签 或签 票签 等功能 | 无 |
| 工具类框架 | 采用 Hutool、Lombok 上百种工具覆盖90%的使用需求 基于注解自动生成 get set 等简化框架大量代码 | 手写工具稳定性差易出问题 工具数量有限 代码臃肿需自己手写 get set 等 |
| 监控框架 | 采用 SpringBoot-Admin 基于SpringBoot官方 actuator 探针机制<br/>实时监控服务状态 框架还为其扩展了在线日志查看监控 | 无 |
| 链路追踪 | 采用 Apache SkyWalking 还在为请求不知道去哪了 到哪出了问题而烦恼吗<br/>用了它即可实时查看请求经过的每一处每一个节点 | 无 |
@ -100,7 +119,6 @@
| 系统接口 | 根据业务代码自动生成相关的api接口文档 | 支持 | 支持 |
| 服务监控 | 监视集群系统CPU、内存、磁盘、堆栈、在线日志、Spring相关配置等 | 支持 | 仅支持单机CPU、内存、磁盘监控 |
| 缓存监控 | 对系统的缓存信息查询,命令统计等。 | 支持 | 支持 |
| 在线构建器 | 拖动表单元素生成相应的HTML代码。 | 支持 | 支持 |
| 使用案例 | 系统的一些功能案例 | 支持 | 不支持 |
## 参考文档
@ -115,13 +133,12 @@
>
>[部署项目 必看](https://plus-doc.dromara.org/#/ruoyi-vue-plus/quickstart/deploy)
>>[https://plus-doc.dromara.org/#/ruoyi-vue-plus/quickstart/deploy](https://plus-doc.dromara.org/#/ruoyi-vue-plus/quickstart/deploy)
>
>
>[如何加群](https://plus-doc.dromara.org/#/common/add_group)
>>[https://plus-doc.dromara.org/#/common/add_group](https://plus-doc.dromara.org/#/common/add_group)
>
>[参考文档 Wiki](https://plus-doc.dromara.org)
>>[https://plus-doc.dromara.org](https://plus-doc.dromara.org)
>
>[参考文档(国内备份)](https://dromara.gitee.io/plus-doc)
>>[https://dromara.gitee.io/plus-doc](https://dromara.gitee.io/plus-doc)
## 软件架构图
@ -131,18 +148,6 @@
[参与贡献的方式 https://plus-doc.dromara.org/#/common/contribution](https://plus-doc.dromara.org/#/common/contribution)
### 其他
* 定期同步升级 RuoYi-Vue 有用的更新
* GitHub 地址 [RuoYi-Vue-Plus](https://github.com/dromara/RuoYi-Vue-Plus)
* 微服务 分支 [RuoYi-Cloud-Plus](https://gitee.com/JavaLionLi/RuoYi-Cloud-Plus)
* 前端项目 地址 [plus-ui](https://gitee.com/JavaLionLi/plus-ui)
* 用户扩展项目 [扩展项目列表](https://plus-doc.dromara.org/#/ruoyi-vue-plus/extend-project/list)
## 加群与捐献
>[加群与捐献](https://plus-doc.dromara.org/#/ruoyi-vue-plus/other/group_chat)
>>[https://plus-doc.dromara.org/#/ruoyi-vue-plus/other/group_chat](https://plus-doc.dromara.org/#/ruoyi-vue-plus/other/group_chat)
## 捐献作者
作者为兼职做开源,平时还需要工作,如果帮到了您可以请作者吃个盒饭
<img src="https://foruda.gitee.com/images/1678975784848381069/d8661ed9_1766278.png" width="300px" height="450px" />
@ -168,8 +173,8 @@
| ![输入图片说明](https://foruda.gitee.com/images/1680078779416197879/75e3ed02_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078802329118061/77e10915_1766278.png "屏幕截图") |
| ![输入图片说明](https://foruda.gitee.com/images/1680078893627848351/34a1c342_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078928175016986/f126ec4a_1766278.png "屏幕截图") |
| ![输入图片说明](https://foruda.gitee.com/images/1680078941718318363/b68a0f72_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680078963175518631/3bb769a1_1766278.png "屏幕截图") |
| ![输入图片说明](https://foruda.gitee.com/images/1680078982294090567/b31c343d_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680079000642440444/77ca82a9_1766278.png "屏幕截图") |
| ![输入图片说明](https://foruda.gitee.com/images/1680079020995074177/03b7d52e_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680079039367822173/76811806_1766278.png "屏幕截图") |
| ![输入图片说明](https://foruda.gitee.com/images/1735829153637063344/3c21fd4c_1419627.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1735829181303499815/4522cefa_1419627.png "屏幕截图") |
| ![输入图片说明](https://foruda.gitee.com/images/1735829377205259767/76a705d7_1419627.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1722959592856812900/e2d0d342_1419627.png "屏幕截图") |
| ![输入图片说明](https://foruda.gitee.com/images/1680079274333484664/4dfdc7c0_1766278.png "屏幕截图") | ![输入图片说明](https://foruda.gitee.com/images/1680079290467458224/d6715fcf_1766278.png "屏幕截图") |

177
pom.xml
View File

@ -10,52 +10,54 @@
<name>RuoYi-Vue-Plus</name>
<url>https://gitee.com/dromara/RuoYi-Vue-Plus</url>
<description>RuoYi-Vue-Plus多租户管理系统</description>
<description>Dromara RuoYi-Vue-Plus多租户管理系统</description>
<properties>
<revision>5.1.2</revision>
<spring-boot.version>3.1.7</spring-boot.version>
<revision>5.4.1</revision>
<spring-boot.version>3.5.4</spring-boot.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>17</java.version>
<spring-boot.mybatis>3.0.3</spring-boot.mybatis>
<springdoc.version>2.2.0</springdoc.version>
<mybatis.version>3.5.16</mybatis.version>
<springdoc.version>2.8.11</springdoc.version>
<therapi-javadoc.version>0.15.0</therapi-javadoc.version>
<poi.version>5.2.3</poi.version>
<easyexcel.version>3.3.3</easyexcel.version>
<fastexcel.version>1.3.0</fastexcel.version>
<velocity.version>2.3</velocity.version>
<satoken.version>1.37.0</satoken.version>
<mybatis-plus.version>3.5.4</mybatis-plus.version>
<satoken.version>1.44.0</satoken.version>
<mybatis-plus.version>3.5.12</mybatis-plus.version>
<p6spy.version>3.9.1</p6spy.version>
<hutool.version>5.8.22</hutool.version>
<okhttp.version>4.10.0</okhttp.version>
<spring-boot-admin.version>3.1.8</spring-boot-admin.version>
<redisson.version>3.24.3</redisson.version>
<lock4j.version>2.2.5</lock4j.version>
<dynamic-ds.version>4.2.0</dynamic-ds.version>
<alibaba-ttl.version>2.14.4</alibaba-ttl.version>
<powerjob.version>4.3.6</powerjob.version>
<mapstruct-plus.version>1.3.5</mapstruct-plus.version>
<hutool.version>5.8.40</hutool.version>
<spring-boot-admin.version>3.5.1</spring-boot-admin.version>
<redisson.version>3.51.0</redisson.version>
<lock4j.version>2.2.7</lock4j.version>
<dynamic-ds.version>4.3.1</dynamic-ds.version>
<snailjob.version>1.7.2</snailjob.version>
<mapstruct-plus.version>1.4.8</mapstruct-plus.version>
<mapstruct-plus.lombok.version>0.2.0</mapstruct-plus.lombok.version>
<lombok.version>1.18.30</lombok.version>
<bouncycastle.version>1.76</bouncycastle.version>
<justauth.version>1.16.6</justauth.version>
<lombok.version>1.18.38</lombok.version>
<bouncycastle.version>1.80</bouncycastle.version>
<justauth.version>1.16.7</justauth.version>
<!-- 离线IP地址定位库 -->
<ip2region.version>2.7.0</ip2region.version>
<!-- OSS 配置 -->
<aws-java-sdk-s3.version>1.12.600</aws-java-sdk-s3.version>
<aws.sdk.version>2.28.22</aws.sdk.version>
<!-- SMS 配置 -->
<sms4j.version>2.2.0</sms4j.version>
<sms4j.version>3.3.4</sms4j.version>
<!-- 限制框架中的fastjson版本 -->
<fastjson.version>1.2.83</fastjson.version>
<!-- 面向运行时的D-ORM依赖 -->
<anyline.version>8.7.2-20250603</anyline.version>
<!-- 工作流配置 -->
<warm-flow.version>1.8.1</warm-flow.version>
<!-- 插件版本 -->
<maven-jar-plugin.version>3.2.2</maven-jar-plugin.version>
<maven-war-plugin.version>3.2.2</maven-war-plugin.version>
<maven-compiler-plugin.verison>3.11.0</maven-compiler-plugin.verison>
<maven-surefire-plugin.version>3.1.2</maven-surefire-plugin.version>
<maven-jar-plugin.version>3.4.2</maven-jar-plugin.version>
<maven-war-plugin.version>3.4.0</maven-war-plugin.version>
<maven-compiler-plugin.version>3.14.0</maven-compiler-plugin.version>
<maven-surefire-plugin.version>3.5.3</maven-surefire-plugin.version>
<flatten-maven-plugin.version>1.3.0</flatten-maven-plugin.version>
<!-- 打包默认跳过测试 -->
<skipTests>true</skipTests>
</properties>
<profiles>
@ -65,6 +67,8 @@
<!-- 环境标识,需要与配置文件的名称相对应 -->
<profiles.active>local</profiles.active>
<logging.level>info</logging.level>
<monitor.username>ruoyi</monitor.username>
<monitor.password>123456</monitor.password>
</properties>
</profile>
<profile>
@ -73,6 +77,8 @@
<!-- 环境标识,需要与配置文件的名称相对应 -->
<profiles.active>dev</profiles.active>
<logging.level>info</logging.level>
<monitor.username>ruoyi</monitor.username>
<monitor.password>123456</monitor.password>
</properties>
<activation>
<!-- 默认环境 -->
@ -84,6 +90,8 @@
<properties>
<profiles.active>prod</profiles.active>
<logging.level>warn</logging.level>
<monitor.username>ruoyi</monitor.username>
<monitor.password>123456</monitor.password>
</properties>
</profile>
</profiles>
@ -110,13 +118,6 @@
<scope>import</scope>
</dependency>
<!-- JustAuth 的依赖配置-->
<dependency>
<groupId>me.zhyd.oauth</groupId>
<artifactId>JustAuth</artifactId>
<version>${justauth.version}</version>
</dependency>
<!-- common 的依赖配置-->
<dependency>
<groupId>org.dromara</groupId>
@ -145,25 +146,9 @@
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>${poi.version}</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>${poi.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>${easyexcel.version}</version>
<exclusions>
<exclusion>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
</exclusion>
</exclusions>
<groupId>cn.idev.excel</groupId>
<artifactId>fastexcel</artifactId>
<version>${fastexcel.version}</version>
</dependency>
<!-- velocity代码生成使用模板 -->
@ -205,14 +190,20 @@
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${spring-boot.mybatis}</version>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-jsqlparser</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
@ -229,16 +220,23 @@
<version>${p6spy.version}</version>
</dependency>
<!-- AWS SDK for Java 2.x -->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>${okhttp.version}</version>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3</artifactId>
<version>${aws.sdk.version}</version>
</dependency>
<!-- 基于 AWS CRT 的 S3 客户端的性能增强的 S3 传输管理器 -->
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-s3</artifactId>
<version>${aws-java-sdk-s3.version}</version>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3-transfer-manager</artifactId>
<version>${aws.sdk.version}</version>
</dependency>
<!-- 将基于 Netty 的 HTTP 客户端从类路径中移除 -->
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>netty-nio-client</artifactId>
<version>${aws.sdk.version}</version>
</dependency>
<!--短信sms4j-->
<dependency>
@ -271,22 +269,16 @@
<version>${lock4j.version}</version>
</dependency>
<!-- PowerJob -->
<!-- SnailJob Client -->
<dependency>
<groupId>tech.powerjob</groupId>
<artifactId>powerjob-worker-spring-boot-starter</artifactId>
<version>${powerjob.version}</version>
<groupId>com.aizuda</groupId>
<artifactId>snail-job-client-starter</artifactId>
<version>${snailjob.version}</version>
</dependency>
<dependency>
<groupId>tech.powerjob</groupId>
<artifactId>powerjob-official-processors</artifactId>
<version>${powerjob.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>transmittable-thread-local</artifactId>
<version>${alibaba-ttl.version}</version>
<groupId>com.aizuda</groupId>
<artifactId>snail-job-client-job-core</artifactId>
<version>${snailjob.version}</version>
</dependency>
<!-- 加密包引入 -->
@ -302,6 +294,25 @@
<version>${mapstruct-plus.version}</version>
</dependency>
<!-- Warm-Flow国产工作流引擎, 在线文档http://warm-flow.cn/ -->
<dependency>
<groupId>org.dromara.warm</groupId>
<artifactId>warm-flow-mybatis-plus-sb3-starter</artifactId>
<version>${warm-flow.version}</version>
</dependency>
<dependency>
<groupId>org.dromara.warm</groupId>
<artifactId>warm-flow-plugin-ui-sb-web</artifactId>
<version>${warm-flow.version}</version>
</dependency>
<!-- JustAuth 的依赖配置-->
<dependency>
<groupId>me.zhyd.oauth</groupId>
<artifactId>JustAuth</artifactId>
<version>${justauth.version}</version>
</dependency>
<!-- 离线IP地址定位库 ip2region -->
<dependency>
<groupId>org.lionsoul</groupId>
@ -339,6 +350,13 @@
<version>${revision}</version>
</dependency>
<!-- 工作流模块 -->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-workflow</artifactId>
<version>${revision}</version>
</dependency>
</dependencies>
</dependencyManagement>
@ -355,7 +373,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-compiler-plugin.verison}</version>
<version>${maven-compiler-plugin.version}</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
@ -398,6 +416,7 @@
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven-surefire-plugin.version}</version>
<configuration>
<argLine>-Dfile.encoding=UTF-8</argLine>
<!-- 根据打包环境执行对应的@Tag测试方法 -->
<groups>${profiles.active}</groups>
<!-- 排除标签 -->

View File

@ -1,7 +1,9 @@
# 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/
FROM bellsoft/liberica-openjdk-rocky:17.0.16-cds
#FROM bellsoft/liberica-openjdk-rocky:21.0.8-cds
#FROM findepi/graalvm:java17-native
FROM openjdk:17.0.2-oraclelinux8
MAINTAINER Lion Li
LABEL maintainer="Lion Li"
RUN mkdir -p /ruoyi/server/logs \
/ruoyi/server/temp \
@ -9,16 +11,21 @@ RUN mkdir -p /ruoyi/server/logs \
WORKDIR /ruoyi/server
ENV SERVER_PORT=8080 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS=""
ENV SERVER_PORT=8080 SNAIL_PORT=28080 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS=""
EXPOSE ${SERVER_PORT}
# 暴露 snail job 客户端端口 用于定时任务调度中心通信
EXPOSE ${SNAIL_PORT}
ADD ./target/ruoyi-admin.jar ./app.jar
SHELL ["/bin/bash", "-c"]
ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -Dserver.port=${SERVER_PORT} \
-Dsnail-job.port=${SNAIL_PORT} \
# 应用名称 如果想区分集群节点监控 改成不同的名称即可
#-Dskywalking.agent.service_name=ruoyi-server \
#-javaagent:/ruoyi/skywalking/agent/skywalking-agent.jar \
-jar app.jar \
-XX:+HeapDumpOnOutOfMemoryError -Xlog:gc*,:time,tags,level -XX:+UseZGC ${JAVA_OPTS}
-XX:+HeapDumpOnOutOfMemoryError -XX:+UseZGC ${JAVA_OPTS} \
-jar app.jar

View File

@ -22,21 +22,28 @@
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
</dependency>
<!-- Oracle -->
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
</dependency>
<!-- PostgreSql -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
<!-- SqlServer -->
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
</dependency>
<!-- &lt;!&ndash; mp支持的数据库均支持 只需要增加对应的jdbc依赖即可 &ndash;&gt;-->
<!-- &lt;!&ndash; Oracle &ndash;&gt;-->
<!-- <dependency>-->
<!-- <groupId>com.oracle.database.jdbc</groupId>-->
<!-- <artifactId>ojdbc8</artifactId>-->
<!-- </dependency>-->
<!-- &lt;!&ndash; 兼容oracle低版本 &ndash;&gt;-->
<!-- <dependency>-->
<!-- <groupId>com.oracle.database.nls</groupId>-->
<!-- <artifactId>orai18n</artifactId>-->
<!-- </dependency>-->
<!-- &lt;!&ndash; PostgreSql &ndash;&gt;-->
<!-- <dependency>-->
<!-- <groupId>org.postgresql</groupId>-->
<!-- <artifactId>postgresql</artifactId>-->
<!-- </dependency>-->
<!-- &lt;!&ndash; SqlServer &ndash;&gt;-->
<!-- <dependency>-->
<!-- <groupId>com.microsoft.sqlserver</groupId>-->
<!-- <artifactId>mssql-jdbc</artifactId>-->
<!-- </dependency>-->
<dependency>
<groupId>org.dromara</groupId>
@ -53,6 +60,11 @@
<artifactId>ruoyi-common-ratelimiter</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-mail</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-system</artifactId>
@ -75,6 +87,12 @@
<artifactId>ruoyi-demo</artifactId>
</dependency>
<!-- 工作流模块 -->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-workflow</artifactId>
</dependency>
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
@ -86,11 +104,6 @@
<scope>test</scope>
</dependency>
<dependency>
<groupId>me.zhyd.oauth</groupId>
<artifactId>JustAuth</artifactId>
</dependency>
<!-- skywalking 整合 logback -->
<!-- <dependency>-->
<!-- <groupId>org.apache.skywalking</groupId>-->

View File

@ -1,6 +1,9 @@
package org.dromara.web.controller;
import cn.dev33.satoken.annotation.SaIgnore;
import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.codec.Base64;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import jakarta.servlet.http.HttpServletRequest;
@ -10,7 +13,7 @@ import me.zhyd.oauth.model.AuthResponse;
import me.zhyd.oauth.model.AuthUser;
import me.zhyd.oauth.request.AuthRequest;
import me.zhyd.oauth.utils.AuthStateUtils;
import org.dromara.common.core.constant.UserConstants;
import org.dromara.common.core.constant.SystemConstants;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.domain.model.LoginBody;
import org.dromara.common.core.domain.model.RegisterBody;
@ -18,14 +21,17 @@ import org.dromara.common.core.domain.model.SocialLoginBody;
import org.dromara.common.core.utils.*;
import org.dromara.common.encrypt.annotation.ApiEncrypt;
import org.dromara.common.json.utils.JsonUtils;
import org.dromara.common.ratelimiter.annotation.RateLimiter;
import org.dromara.common.ratelimiter.enums.LimitType;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.social.config.properties.SocialLoginConfigProperties;
import org.dromara.common.social.config.properties.SocialProperties;
import org.dromara.common.social.utils.SocialUtils;
import org.dromara.common.sse.dto.SseMessageDto;
import org.dromara.common.sse.utils.SseMessageUtils;
import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.common.websocket.utils.WebSocketUtils;
import org.dromara.system.domain.SysClient;
import org.dromara.system.domain.bo.SysTenantBo;
import org.dromara.system.domain.vo.SysClientVo;
import org.dromara.system.domain.vo.SysTenantVo;
import org.dromara.system.service.ISysClientService;
import org.dromara.system.service.ISysConfigService;
@ -41,7 +47,10 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
@ -81,12 +90,12 @@ public class AuthController {
// 授权类型和客户端id
String clientId = loginBody.getClientId();
String grantType = loginBody.getGrantType();
SysClient client = clientService.queryByClientId(clientId);
SysClientVo client = clientService.queryByClientId(clientId);
// 查询不到 client 或 client 内不包含 grantType
if (ObjectUtil.isNull(client) || !StringUtils.contains(client.getGrantType(), grantType)) {
log.info("客户端id: {} 认证类型:{} 异常!.", clientId, grantType);
return R.fail(MessageUtils.message("auth.grant.type.error"));
} else if (!UserConstants.NORMAL.equals(client.getStatus())) {
} else if (!SystemConstants.NORMAL.equals(client.getStatus())) {
return R.fail(MessageUtils.message("auth.grant.type.blocked"));
}
// 校验租户
@ -96,36 +105,46 @@ public class AuthController {
Long userId = LoginHelper.getUserId();
scheduledExecutorService.schedule(() -> {
WebSocketUtils.sendMessage(userId, "欢迎登录RuoYi-Vue-Plus后台管理系统");
}, 3, TimeUnit.SECONDS);
SseMessageDto dto = new SseMessageDto();
dto.setMessage("欢迎登录RuoYi-Vue-Plus后台管理系统");
dto.setUserIds(List.of(userId));
SseMessageUtils.publishMessage(dto);
}, 5, TimeUnit.SECONDS);
return R.ok(loginVo);
}
/**
* 第三方登录请求
* 获取跳转URL
*
* @param source 登录来源
* @return 结果
*/
@GetMapping("/binding/{source}")
public R<String> authBinding(@PathVariable("source") String source) {
public R<String> authBinding(@PathVariable("source") String source,
@RequestParam String tenantId, @RequestParam String domain) {
SocialLoginConfigProperties obj = socialProperties.getType().get(source);
if (ObjectUtil.isNull(obj)) {
return R.fail(source + "平台账号暂不支持");
}
AuthRequest authRequest = SocialUtils.getAuthRequest(source, socialProperties);
String authorizeUrl = authRequest.authorize(AuthStateUtils.createState());
Map<String, String> map = new HashMap<>();
map.put("tenantId", tenantId);
map.put("domain", domain);
map.put("state", AuthStateUtils.createState());
String authorizeUrl = authRequest.authorize(Base64.encode(JsonUtils.toJsonString(map), StandardCharsets.UTF_8));
return R.ok("操作成功", authorizeUrl);
}
/**
* 第三方登录回调业务处理 绑定授权
* 前端回调绑定授权(需要token)
*
* @param loginBody 请求体
* @return 结果
*/
@PostMapping("/social/callback")
public R<Void> socialCallback(@RequestBody SocialLoginBody loginBody) {
// 校验token
StpUtil.checkLogin();
// 获取第三方登录信息
AuthResponse<AuthUser> response = SocialUtils.loginAuth(
loginBody.getSource(), loginBody.getSocialCode(),
@ -141,12 +160,14 @@ public class AuthController {
/**
* 取消授权
* 取消授权(需要token)
*
* @param socialId socialId
*/
@DeleteMapping(value = "/unlock/{socialId}")
public R<Void> unlockSocial(@PathVariable Long socialId) {
// 校验token
StpUtil.checkLogin();
Boolean rows = socialUserService.deleteWithValidById(socialId);
return rows ? R.ok() : R.fail("取消授权失败");
}
@ -179,10 +200,29 @@ public class AuthController {
*
* @return 租户列表
*/
@RateLimiter(time = 60, count = 20, limitType = LimitType.IP)
@GetMapping("/tenant/list")
public R<LoginTenantVo> tenantList(HttpServletRequest request) throws Exception {
// 返回对象
LoginTenantVo result = new LoginTenantVo();
boolean enable = TenantHelper.isEnable();
result.setTenantEnabled(enable);
// 如果未开启租户这直接返回
if (!enable) {
return R.ok(result);
}
List<SysTenantVo> tenantList = tenantService.queryList(new SysTenantBo());
List<TenantListVo> voList = MapstructUtils.convert(tenantList, TenantListVo.class);
try {
// 如果只超管返回所有租户
if (LoginHelper.isSuperAdmin()) {
result.setVoList(voList);
return R.ok(result);
}
} catch (NotLoginException ignored) {
}
// 获取域名
String host;
String referer = request.getHeader("referer");
@ -194,12 +234,9 @@ public class AuthController {
}
// 根据域名进行筛选
List<TenantListVo> list = StreamUtils.filter(voList, vo ->
StringUtils.equals(vo.getDomain(), host));
// 返回对象
LoginTenantVo vo = new LoginTenantVo();
vo.setVoList(CollUtil.isNotEmpty(list) ? list : voList);
vo.setTenantEnabled(TenantHelper.isEnable());
return R.ok(vo);
StringUtils.equalsIgnoreCase(vo.getDomain(), host));
result.setVoList(CollUtil.isNotEmpty(list) ? list : voList);
return R.ok(result);
}
}

View File

@ -5,9 +5,13 @@ import cn.hutool.captcha.AbstractCaptcha;
import cn.hutool.captcha.generator.CodeGenerator;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.RandomUtil;
import jakarta.validation.constraints.NotBlank;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.constant.Constants;
import org.dromara.common.core.constant.GlobalConstants;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.core.utils.reflect.ReflectUtils;
@ -21,11 +25,7 @@ import org.dromara.common.web.enums.CaptchaType;
import org.dromara.sms4j.api.SmsBlend;
import org.dromara.sms4j.api.entity.SmsResponse;
import org.dromara.sms4j.core.factory.SmsFactory;
import org.dromara.sms4j.provider.enumerate.SupplierType;
import org.dromara.web.domain.vo.CaptchaVo;
import jakarta.validation.constraints.NotBlank;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
@ -66,11 +66,11 @@ public class CaptchaController {
String templateId = "";
LinkedHashMap<String, String> map = new LinkedHashMap<>(1);
map.put("code", code);
SmsBlend smsBlend = SmsFactory.createSmsBlend(SupplierType.ALIBABA);
SmsBlend smsBlend = SmsFactory.getSmsBlend("config1");
SmsResponse smsResponse = smsBlend.sendMessage(phonenumber, templateId, map);
if (!"OK".equals(smsResponse.getCode())) {
if (!smsResponse.isSuccess()) {
log.error("验证码短信发送异常 => {}", smsResponse);
return R.fail(smsResponse.getMessage());
return R.fail(smsResponse.getData().toString());
}
return R.ok();
}
@ -80,12 +80,21 @@ public class CaptchaController {
*
* @param email 邮箱
*/
@RateLimiter(key = "#email", time = 60, count = 1)
@GetMapping("/resource/email/code")
public R<Void> emailCode(@NotBlank(message = "{user.email.not.blank}") String email) {
if (!mailProperties.getEnabled()) {
return R.fail("当前系统没有开启邮箱功能!");
}
SpringUtils.getAopProxy(this).emailCodeImpl(email);
return R.ok();
}
/**
* 邮箱验证码
* 独立方法避免验证码关闭之后仍然走限流
*/
@RateLimiter(key = "#email", time = 60, count = 1)
public void emailCodeImpl(String email) {
String key = GlobalConstants.CAPTCHA_CODE_KEY + email;
String code = RandomUtil.randomNumbers(4);
RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION));
@ -93,44 +102,56 @@ public class CaptchaController {
MailUtils.sendText(email, "登录验证码", "您本次验证码为:" + code + ",有效性为" + Constants.CAPTCHA_EXPIRATION + "分钟,请尽快填写。");
} catch (Exception e) {
log.error("验证码短信发送异常 => {}", e.getMessage());
return R.fail(e.getMessage());
throw new ServiceException(e.getMessage());
}
return R.ok();
}
/**
* 生成验证码
*/
@RateLimiter(time = 60, count = 10, limitType = LimitType.IP)
@GetMapping("/auth/code")
public R<CaptchaVo> getCode() {
CaptchaVo captchaVo = new CaptchaVo();
boolean captchaEnabled = captchaProperties.getEnable();
if (!captchaEnabled) {
CaptchaVo captchaVo = new CaptchaVo();
captchaVo.setCaptchaEnabled(false);
return R.ok(captchaVo);
}
return R.ok(SpringUtils.getAopProxy(this).getCodeImpl());
}
/**
* 生成验证码
* 独立方法避免验证码关闭之后仍然走限流
*/
@RateLimiter(time = 60, count = 10, limitType = LimitType.IP)
public CaptchaVo getCodeImpl() {
// 保存验证码信息
String uuid = IdUtil.simpleUUID();
String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + uuid;
// 生成验证码
CaptchaType captchaType = captchaProperties.getType();
boolean isMath = CaptchaType.MATH == captchaType;
Integer length = isMath ? captchaProperties.getNumberLength() : captchaProperties.getCharLength();
CodeGenerator codeGenerator = ReflectUtils.newInstance(captchaType.getClazz(), length);
CodeGenerator codeGenerator;
if (CaptchaType.MATH == captchaType) {
codeGenerator = ReflectUtils.newInstance(captchaType.getClazz(), captchaProperties.getNumberLength(), false);
} else {
codeGenerator = ReflectUtils.newInstance(captchaType.getClazz(), captchaProperties.getCharLength());
}
AbstractCaptcha captcha = SpringUtils.getBean(captchaProperties.getCategory().getClazz());
captcha.setGenerator(codeGenerator);
captcha.createCode();
// 如果是数学验证码使用SpEL表达式处理验证码结果
String code = captcha.getCode();
if (isMath) {
if (CaptchaType.MATH == captchaType) {
ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression(StringUtils.remove(code, "="));
code = exp.getValue(String.class);
}
RedisUtils.setCacheObject(verifyKey, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION));
CaptchaVo captchaVo = new CaptchaVo();
captchaVo.setUuid(uuid);
captchaVo.setImg(captcha.getImageBase64());
return R.ok(captchaVo);
return captchaVo;
}
}

View File

@ -1,9 +1,9 @@
package org.dromara.web.controller;
import cn.dev33.satoken.annotation.SaIgnore;
import org.dromara.common.core.config.RuoYiConfig;
import org.dromara.common.core.utils.StringUtils;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.core.utils.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@ -17,16 +17,12 @@ import org.springframework.web.bind.annotation.RestController;
@RestController
public class IndexController {
/**
* 系统基础配置
*/
private final RuoYiConfig ruoyiConfig;
/**
* 访问首页,提示语
*/
@GetMapping("/")
public String index() {
return StringUtils.format("欢迎使用{}后台管理框架,当前版本v{}请通过前端地址访问。", ruoyiConfig.getName(), ruoyiConfig.getVersion());
return StringUtils.format("欢迎使用{}后台管理框架,请通过前端地址访问。", SpringUtils.getApplicationName());
}
}

View File

@ -13,10 +13,19 @@ import lombok.Data;
@AutoMapper(target = SysTenantVo.class)
public class TenantListVo {
/**
* 租户编号
*/
private String tenantId;
/**
* 企业名称
*/
private String companyName;
/**
* 域名
*/
private String domain;
}

View File

@ -1,8 +1,9 @@
package org.dromara.web.listener;
import cn.dev33.satoken.config.SaTokenConfig;
import cn.dev33.satoken.listener.SaTokenListener;
import cn.dev33.satoken.stp.SaLoginModel;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.stp.parameter.SaLoginParameter;
import cn.hutool.core.convert.Convert;
import cn.hutool.http.useragent.UserAgent;
import cn.hutool.http.useragent.UserAgentUtil;
import lombok.RequiredArgsConstructor;
@ -10,7 +11,6 @@ import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.constant.CacheConstants;
import org.dromara.common.core.constant.Constants;
import org.dromara.common.core.domain.dto.UserOnlineDTO;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.utils.MessageUtils;
import org.dromara.common.core.utils.ServletUtils;
import org.dromara.common.core.utils.SpringUtils;
@ -18,6 +18,7 @@ import org.dromara.common.core.utils.ip.AddressUtils;
import org.dromara.common.log.event.LogininforEvent;
import org.dromara.common.redis.utils.RedisUtils;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.web.service.SysLoginService;
import org.springframework.stereotype.Component;
@ -33,17 +34,15 @@ import java.time.Duration;
@Slf4j
public class UserActionListener implements SaTokenListener {
private final SaTokenConfig tokenConfig;
private final SysLoginService loginService;
/**
* 每次登录时触发
*/
@Override
public void doLogin(String loginType, Object loginId, String tokenValue, SaLoginModel loginModel) {
public void doLogin(String loginType, Object loginId, String tokenValue, SaLoginParameter loginParameter) {
UserAgent userAgent = UserAgentUtil.parse(ServletUtils.getRequest().getHeader("User-Agent"));
String ip = ServletUtils.getClientIP();
LoginUser user = LoginHelper.getLoginUser();
UserOnlineDTO dto = new UserOnlineDTO();
dto.setIpaddr(ip);
dto.setLoginLocation(AddressUtils.getRealAddressByIP(ip));
@ -51,25 +50,29 @@ public class UserActionListener implements SaTokenListener {
dto.setOs(userAgent.getOs().getName());
dto.setLoginTime(System.currentTimeMillis());
dto.setTokenId(tokenValue);
dto.setUserName(user.getUsername());
dto.setClientKey(user.getClientKey());
dto.setDeviceType(user.getDeviceType());
dto.setDeptName(user.getDeptName());
if(tokenConfig.getTimeout() == -1) {
RedisUtils.setCacheObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue, dto);
} else {
RedisUtils.setCacheObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue, dto, Duration.ofSeconds(tokenConfig.getTimeout()));
}
String username = (String) loginParameter.getExtra(LoginHelper.USER_NAME_KEY);
String tenantId = (String) loginParameter.getExtra(LoginHelper.TENANT_KEY);
dto.setUserName(username);
dto.setClientKey((String) loginParameter.getExtra(LoginHelper.CLIENT_KEY));
dto.setDeviceType(loginParameter.getDeviceType());
dto.setDeptName((String) loginParameter.getExtra(LoginHelper.DEPT_NAME_KEY));
TenantHelper.dynamic(tenantId, () -> {
if(loginParameter.getTimeout() == -1) {
RedisUtils.setCacheObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue, dto);
} else {
RedisUtils.setCacheObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue, dto, Duration.ofSeconds(loginParameter.getTimeout()));
}
});
// 记录登录日志
LogininforEvent logininforEvent = new LogininforEvent();
logininforEvent.setTenantId(user.getTenantId());
logininforEvent.setUsername(user.getUsername());
logininforEvent.setTenantId(tenantId);
logininforEvent.setUsername(username);
logininforEvent.setStatus(Constants.LOGIN_SUCCESS);
logininforEvent.setMessage(MessageUtils.message("user.login.success"));
logininforEvent.setRequest(ServletUtils.getRequest());
SpringUtils.context().publishEvent(logininforEvent);
// 更新登录信息
loginService.recordLoginInfo(user.getUserId(), ip);
loginService.recordLoginInfo((Long) loginParameter.getExtra(LoginHelper.USER_KEY), ip);
log.info("user doLogin, userId:{}, token:{}", loginId, tokenValue);
}
@ -78,7 +81,10 @@ public class UserActionListener implements SaTokenListener {
*/
@Override
public void doLogout(String loginType, Object loginId, String tokenValue) {
RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue);
String tenantId = Convert.toStr(StpUtil.getExtra(tokenValue, LoginHelper.TENANT_KEY));
TenantHelper.dynamic(tenantId, () -> {
RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue);
});
log.info("user doLogout, userId:{}, token:{}", loginId, tokenValue);
}
@ -87,7 +93,10 @@ public class UserActionListener implements SaTokenListener {
*/
@Override
public void doKickout(String loginType, Object loginId, String tokenValue) {
RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue);
String tenantId = Convert.toStr(StpUtil.getExtra(tokenValue, LoginHelper.TENANT_KEY));
TenantHelper.dynamic(tenantId, () -> {
RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue);
});
log.info("user doKickout, userId:{}, token:{}", loginId, tokenValue);
}
@ -96,7 +105,10 @@ public class UserActionListener implements SaTokenListener {
*/
@Override
public void doReplaced(String loginType, Object loginId, String tokenValue) {
RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue);
String tenantId = Convert.toStr(StpUtil.getExtra(tokenValue, LoginHelper.TENANT_KEY));
TenantHelper.dynamic(tenantId, () -> {
RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue);
});
log.info("user doReplaced, userId:{}, token:{}", loginId, tokenValue);
}
@ -146,6 +158,6 @@ public class UserActionListener implements SaTokenListener {
* 每次Token续期时触发
*/
@Override
public void doRenewTimeout(String tokenValue, Object loginId, long timeout) {
public void doRenewTimeout(String loginType, Object loginId, String tokenValue, long timeout) {
}
}

View File

@ -4,6 +4,7 @@ package org.dromara.web.service;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.SpringUtils;
import org.dromara.system.domain.SysClient;
import org.dromara.system.domain.vo.SysClientVo;
import org.dromara.web.domain.vo.LoginVo;
/**
@ -17,8 +18,13 @@ public interface IAuthStrategy {
/**
* 登录
*
* @param body 登录对象
* @param client 授权管理视图对象
* @param grantType 授权类型
* @return 登录验证信息
*/
static LoginVo login(String body, SysClient client, String grantType) {
static LoginVo login(String body, SysClientVo client, String grantType) {
// 授权类型和客户端id
String beanName = grantType + BASE_NAME;
if (!SpringUtils.containsBean(beanName)) {
@ -30,7 +36,11 @@ public interface IAuthStrategy {
/**
* 登录
*
* @param body 登录对象
* @param client 授权管理视图对象
* @return 登录验证信息
*/
LoginVo login(String body, SysClient client);
LoginVo login(String body, SysClientVo client);
}

View File

@ -4,17 +4,21 @@ import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Opt;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.lock.annotation.Lock4j;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import me.zhyd.oauth.model.AuthUser;
import org.dromara.common.core.constant.CacheConstants;
import org.dromara.common.core.constant.Constants;
import org.dromara.common.core.constant.GlobalConstants;
import org.dromara.common.core.constant.SystemConstants;
import org.dromara.common.core.constant.TenantConstants;
import org.dromara.common.core.domain.dto.PostDTO;
import org.dromara.common.core.domain.dto.RoleDTO;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.enums.LoginType;
import org.dromara.common.core.enums.TenantStatus;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.exception.user.UserException;
import org.dromara.common.core.utils.*;
import org.dromara.common.log.event.LogininforEvent;
@ -25,13 +29,9 @@ import org.dromara.common.tenant.exception.TenantException;
import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.system.domain.SysUser;
import org.dromara.system.domain.bo.SysSocialBo;
import org.dromara.system.domain.vo.SysSocialVo;
import org.dromara.system.domain.vo.SysTenantVo;
import org.dromara.system.domain.vo.SysUserVo;
import org.dromara.system.domain.vo.*;
import org.dromara.system.mapper.SysUserMapper;
import org.dromara.system.service.ISysPermissionService;
import org.dromara.system.service.ISysSocialService;
import org.dromara.system.service.ISysTenantService;
import org.dromara.system.service.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
@ -59,6 +59,9 @@ public class SysLoginService {
private final ISysTenantService tenantService;
private final ISysPermissionService permissionService;
private final ISysSocialService sysSocialService;
private final ISysRoleService roleService;
private final ISysDeptService deptService;
private final ISysPostService postService;
private final SysUserMapper userMapper;
@ -66,20 +69,28 @@ public class SysLoginService {
* 绑定第三方用户
*
* @param authUserData 授权响应实体
* @return 统一响应实体
*/
@Lock4j
public void socialRegister(AuthUser authUserData) {
String authId = authUserData.getSource() + authUserData.getUuid();
// 第三方用户信息
SysSocialBo bo = BeanUtil.toBean(authUserData, SysSocialBo.class);
BeanUtil.copyProperties(authUserData.getToken(), bo);
bo.setUserId(LoginHelper.getUserId());
Long userId = LoginHelper.getUserId();
bo.setUserId(userId);
bo.setAuthId(authId);
bo.setOpenId(authUserData.getUuid());
bo.setUserName(authUserData.getUsername());
bo.setNickName(authUserData.getNickname());
List<SysSocialVo> checkList = sysSocialService.selectByAuthId(authId);
if (CollUtil.isNotEmpty(checkList)) {
throw new ServiceException("此三方账号已经被绑定!");
}
// 查询是否已经绑定用户
List<SysSocialVo> list = sysSocialService.selectByAuthId(authId);
SysSocialBo params = new SysSocialBo();
params.setUserId(userId);
params.setSource(bo.getSource());
List<SysSocialVo> list = sysSocialService.queryList(params);
if (CollUtil.isEmpty(list)) {
// 没有绑定用户, 新增用户信息
sysSocialService.insertByBo(bo);
@ -87,6 +98,8 @@ public class SysLoginService {
// 更新用户信息
bo.setId(list.get(0).getId());
sysSocialService.updateByBo(bo);
// 如果要绑定的平台账号已经被绑定过了 是否抛异常自行决断
// throw new ServiceException("此平台账号已经被绑定!");
}
}
@ -132,23 +145,29 @@ public class SysLoginService {
SpringUtils.context().publishEvent(logininforEvent);
}
/**
* 构建登录用户
*/
public LoginUser buildLoginUser(SysUserVo user) {
LoginUser loginUser = new LoginUser();
Long userId = user.getUserId();
loginUser.setTenantId(user.getTenantId());
loginUser.setUserId(user.getUserId());
loginUser.setUserId(userId);
loginUser.setDeptId(user.getDeptId());
loginUser.setUsername(user.getUserName());
loginUser.setNickname(user.getNickName());
loginUser.setUserType(user.getUserType());
loginUser.setMenuPermission(permissionService.getMenuPermission(user.getUserId()));
loginUser.setRolePermission(permissionService.getRolePermission(user.getUserId()));
loginUser.setDeptName(ObjectUtil.isNull(user.getDept()) ? "" : user.getDept().getDeptName());
List<RoleDTO> roles = BeanUtil.copyToList(user.getRoles(), RoleDTO.class);
loginUser.setRoles(roles);
loginUser.setMenuPermission(permissionService.getMenuPermission(userId));
loginUser.setRolePermission(permissionService.getRolePermission(userId));
if (ObjectUtil.isNotNull(user.getDeptId())) {
Opt<SysDeptVo> deptOpt = Opt.of(user.getDeptId()).map(deptService::selectDeptById);
loginUser.setDeptName(deptOpt.map(SysDeptVo::getDeptName).orElse(StringUtils.EMPTY));
loginUser.setDeptCategory(deptOpt.map(SysDeptVo::getDeptCategory).orElse(StringUtils.EMPTY));
}
List<SysRoleVo> roles = roleService.selectRolesByUserId(userId);
List<SysPostVo> posts = postService.selectPostsByUserId(userId);
loginUser.setRoles(BeanUtil.copyToList(roles, RoleDTO.class));
loginUser.setPosts(BeanUtil.copyToList(posts, PostDTO.class));
return loginUser;
}
@ -170,7 +189,7 @@ public class SysLoginService {
* 登录校验
*/
public void checkLogin(LoginType loginType, String tenantId, String username, Supplier<Boolean> supplier) {
String errorKey = GlobalConstants.PWD_ERR_CNT_KEY + username;
String errorKey = CacheConstants.PWD_ERR_CNT_KEY + username;
String loginFail = Constants.LOGIN_FAIL;
// 获取用户登录错误次数默认为0 (可自定义限制策略 例如: key + username + ip)
@ -209,17 +228,17 @@ public class SysLoginService {
if (!TenantHelper.isEnable()) {
return;
}
if (TenantConstants.DEFAULT_TENANT_ID.equals(tenantId)) {
return;
}
if (StringUtils.isBlank(tenantId)) {
throw new TenantException("tenant.number.not.blank");
}
if (TenantConstants.DEFAULT_TENANT_ID.equals(tenantId)) {
return;
}
SysTenantVo tenant = tenantService.queryByTenantId(tenantId);
if (ObjectUtil.isNull(tenant)) {
log.info("登录租户:{} 不存在.", tenantId);
throw new TenantException("tenant.not.exists");
} else if (TenantStatus.DISABLE.getCode().equals(tenant.getStatus())) {
} else if (SystemConstants.DISABLE.equals(tenant.getStatus())) {
log.info("登录租户:{} 已被停用.", tenantId);
throw new TenantException("tenant.blocked");
} else if (ObjectUtil.isNotNull(tenant.getExpireTime())

View File

@ -1,7 +1,6 @@
package org.dromara.web.service;
import cn.dev33.satoken.secure.BCrypt;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.crypto.digest.BCrypt;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.constant.Constants;
@ -61,8 +60,7 @@ public class SysRegisterService {
boolean exist = TenantHelper.dynamic(tenantId, () -> {
return userMapper.exists(new LambdaQueryWrapper<SysUser>()
.eq(SysUser::getUserName, sysUser.getUserName())
.ne(ObjectUtil.isNotNull(sysUser.getUserId()), SysUser::getUserId, sysUser.getUserId()));
.eq(SysUser::getUserName, sysUser.getUserName()));
});
if (exist) {
throw new UserException("user.register.save.error", username);
@ -82,15 +80,15 @@ public class SysRegisterService {
* @param uuid 唯一标识
*/
public void validateCaptcha(String tenantId, String username, String code, String uuid) {
String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + StringUtils.defaultString(uuid, "");
String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + StringUtils.blankToDefault(uuid, "");
String captcha = RedisUtils.getCacheObject(verifyKey);
RedisUtils.deleteObject(verifyKey);
if (captcha == null) {
recordLogininfor(tenantId, username, Constants.REGISTER, MessageUtils.message("user.jcaptcha.expire"));
recordLogininfor(tenantId, username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"));
throw new CaptchaExpireException();
}
if (!code.equalsIgnoreCase(captcha)) {
recordLogininfor(tenantId, username, Constants.REGISTER, MessageUtils.message("user.jcaptcha.error"));
if (!StringUtils.equalsIgnoreCase(code, captcha)) {
recordLogininfor(tenantId, username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error"));
throw new CaptchaException();
}
}

View File

@ -1,17 +1,17 @@
package org.dromara.web.service.impl;
import cn.dev33.satoken.stp.SaLoginModel;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.stp.parameter.SaLoginParameter;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.constant.Constants;
import org.dromara.common.core.constant.GlobalConstants;
import org.dromara.common.core.constant.SystemConstants;
import org.dromara.common.core.domain.model.EmailLoginBody;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.enums.LoginType;
import org.dromara.common.core.enums.UserStatus;
import org.dromara.common.core.exception.user.CaptchaExpireException;
import org.dromara.common.core.exception.user.UserException;
import org.dromara.common.core.utils.MessageUtils;
@ -21,8 +21,8 @@ import org.dromara.common.json.utils.JsonUtils;
import org.dromara.common.redis.utils.RedisUtils;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.system.domain.SysClient;
import org.dromara.system.domain.SysUser;
import org.dromara.system.domain.vo.SysClientVo;
import org.dromara.system.domain.vo.SysUserVo;
import org.dromara.system.mapper.SysUserMapper;
import org.dromara.web.domain.vo.LoginVo;
@ -44,23 +44,22 @@ public class EmailAuthStrategy implements IAuthStrategy {
private final SysUserMapper userMapper;
@Override
public LoginVo login(String body, SysClient client) {
public LoginVo login(String body, SysClientVo client) {
EmailLoginBody loginBody = JsonUtils.parseObject(body, EmailLoginBody.class);
ValidatorUtils.validate(loginBody);
String tenantId = loginBody.getTenantId();
String email = loginBody.getEmail();
String emailCode = loginBody.getEmailCode();
// 通过邮箱查找用户
SysUserVo user = loadUserByEmail(tenantId, email);
loginService.checkLogin(LoginType.EMAIL, tenantId, user.getUserName(), () -> !validateEmailCode(tenantId, email, emailCode));
// 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了
LoginUser loginUser = loginService.buildLoginUser(user);
LoginUser loginUser = TenantHelper.dynamic(tenantId, () -> {
SysUserVo user = loadUserByEmail(email);
loginService.checkLogin(LoginType.EMAIL, tenantId, user.getUserName(), () -> !validateEmailCode(tenantId, email, emailCode));
// 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了
return loginService.buildLoginUser(user);
});
loginUser.setClientKey(client.getClientKey());
loginUser.setDeviceType(client.getDeviceType());
SaLoginModel model = new SaLoginModel();
model.setDevice(client.getDeviceType());
SaLoginParameter model = new SaLoginParameter();
model.setDeviceType(client.getDeviceType());
// 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置
// 例如: 后台用户30分钟过期 app用户1天过期
model.setTimeout(client.getTimeout());
@ -88,20 +87,16 @@ public class EmailAuthStrategy implements IAuthStrategy {
return code.equals(emailCode);
}
private SysUserVo loadUserByEmail(String tenantId, String email) {
return TenantHelper.dynamic(tenantId, () -> {
SysUser user = userMapper.selectOne(new LambdaQueryWrapper<SysUser>()
.select(SysUser::getEmail, SysUser::getStatus)
.eq(SysUser::getEmail, email));
if (ObjectUtil.isNull(user)) {
log.info("登录用户:{} 不存在.", email);
throw new UserException("user.not.exists", email);
} else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) {
log.info("登录用户:{} 已被停用.", email);
throw new UserException("user.blocked", email);
}
return userMapper.selectUserByEmail(email);
});
private SysUserVo loadUserByEmail(String email) {
SysUserVo user = userMapper.selectVoOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getEmail, email));
if (ObjectUtil.isNull(user)) {
log.info("登录用户:{} 不存在.", email);
throw new UserException("user.not.exists", email);
} else if (SystemConstants.DISABLE.equals(user.getStatus())) {
log.info("登录用户:{} 已被停用.", email);
throw new UserException("user.blocked", email);
}
return user;
}
}

View File

@ -1,18 +1,18 @@
package org.dromara.web.service.impl;
import cn.dev33.satoken.secure.BCrypt;
import cn.dev33.satoken.stp.SaLoginModel;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.stp.parameter.SaLoginParameter;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.crypto.digest.BCrypt;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.constant.Constants;
import org.dromara.common.core.constant.GlobalConstants;
import org.dromara.common.core.constant.SystemConstants;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.domain.model.PasswordLoginBody;
import org.dromara.common.core.enums.LoginType;
import org.dromara.common.core.enums.UserStatus;
import org.dromara.common.core.exception.user.CaptchaException;
import org.dromara.common.core.exception.user.CaptchaExpireException;
import org.dromara.common.core.exception.user.UserException;
@ -24,8 +24,8 @@ import org.dromara.common.redis.utils.RedisUtils;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.common.web.config.properties.CaptchaProperties;
import org.dromara.system.domain.SysClient;
import org.dromara.system.domain.SysUser;
import org.dromara.system.domain.vo.SysClientVo;
import org.dromara.system.domain.vo.SysUserVo;
import org.dromara.system.mapper.SysUserMapper;
import org.dromara.web.domain.vo.LoginVo;
@ -48,7 +48,7 @@ public class PasswordAuthStrategy implements IAuthStrategy {
private final SysUserMapper userMapper;
@Override
public LoginVo login(String body, SysClient client) {
public LoginVo login(String body, SysClientVo client) {
PasswordLoginBody loginBody = JsonUtils.parseObject(body, PasswordLoginBody.class);
ValidatorUtils.validate(loginBody);
String tenantId = loginBody.getTenantId();
@ -62,15 +62,16 @@ public class PasswordAuthStrategy implements IAuthStrategy {
if (captchaEnabled) {
validateCaptcha(tenantId, username, code, uuid);
}
SysUserVo user = loadUserByUsername(tenantId, username);
loginService.checkLogin(LoginType.PASSWORD, tenantId, username, () -> !BCrypt.checkpw(password, user.getPassword()));
// 此处可根据登录用户的数据不同 自行创建 loginUser
LoginUser loginUser = loginService.buildLoginUser(user);
LoginUser loginUser = TenantHelper.dynamic(tenantId, () -> {
SysUserVo user = loadUserByUsername(username);
loginService.checkLogin(LoginType.PASSWORD, tenantId, username, () -> !BCrypt.checkpw(password, user.getPassword()));
// 此处可根据登录用户的数据不同 自行创建 loginUser
return loginService.buildLoginUser(user);
});
loginUser.setClientKey(client.getClientKey());
loginUser.setDeviceType(client.getDeviceType());
SaLoginModel model = new SaLoginModel();
model.setDevice(client.getDeviceType());
SaLoginParameter model = new SaLoginParameter();
model.setDeviceType(client.getDeviceType());
// 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置
// 例如: 后台用户30分钟过期 app用户1天过期
model.setTimeout(client.getTimeout());
@ -94,33 +95,29 @@ public class PasswordAuthStrategy implements IAuthStrategy {
* @param uuid 唯一标识
*/
private void validateCaptcha(String tenantId, String username, String code, String uuid) {
String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + StringUtils.defaultString(uuid, "");
String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + StringUtils.blankToDefault(uuid, "");
String captcha = RedisUtils.getCacheObject(verifyKey);
RedisUtils.deleteObject(verifyKey);
if (captcha == null) {
loginService.recordLogininfor(tenantId, username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"));
throw new CaptchaExpireException();
}
if (!code.equalsIgnoreCase(captcha)) {
if (!StringUtils.equalsIgnoreCase(code, captcha)) {
loginService.recordLogininfor(tenantId, username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error"));
throw new CaptchaException();
}
}
private SysUserVo loadUserByUsername(String tenantId, String username) {
return TenantHelper.dynamic(tenantId, () -> {
SysUser user = userMapper.selectOne(new LambdaQueryWrapper<SysUser>()
.select(SysUser::getUserName, SysUser::getStatus)
.eq(SysUser::getUserName, username));
if (ObjectUtil.isNull(user)) {
log.info("登录用户:{} 不存在.", username);
throw new UserException("user.not.exists", username);
} else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) {
log.info("登录用户:{} 已被停用.", username);
throw new UserException("user.blocked", username);
}
return userMapper.selectUserByUserName(username);
});
private SysUserVo loadUserByUsername(String username) {
SysUserVo user = userMapper.selectVoOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getUserName, username));
if (ObjectUtil.isNull(user)) {
log.info("登录用户:{} 不存在.", username);
throw new UserException("user.not.exists", username);
} else if (SystemConstants.DISABLE.equals(user.getStatus())) {
log.info("登录用户:{} 已被停用.", username);
throw new UserException("user.blocked", username);
}
return user;
}
}

View File

@ -1,17 +1,17 @@
package org.dromara.web.service.impl;
import cn.dev33.satoken.stp.SaLoginModel;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.stp.parameter.SaLoginParameter;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.constant.Constants;
import org.dromara.common.core.constant.GlobalConstants;
import org.dromara.common.core.constant.SystemConstants;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.domain.model.SmsLoginBody;
import org.dromara.common.core.enums.LoginType;
import org.dromara.common.core.enums.UserStatus;
import org.dromara.common.core.exception.user.CaptchaExpireException;
import org.dromara.common.core.exception.user.UserException;
import org.dromara.common.core.utils.MessageUtils;
@ -21,8 +21,8 @@ import org.dromara.common.json.utils.JsonUtils;
import org.dromara.common.redis.utils.RedisUtils;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.system.domain.SysClient;
import org.dromara.system.domain.SysUser;
import org.dromara.system.domain.vo.SysClientVo;
import org.dromara.system.domain.vo.SysUserVo;
import org.dromara.system.mapper.SysUserMapper;
import org.dromara.web.domain.vo.LoginVo;
@ -44,23 +44,22 @@ public class SmsAuthStrategy implements IAuthStrategy {
private final SysUserMapper userMapper;
@Override
public LoginVo login(String body, SysClient client) {
public LoginVo login(String body, SysClientVo client) {
SmsLoginBody loginBody = JsonUtils.parseObject(body, SmsLoginBody.class);
ValidatorUtils.validate(loginBody);
String tenantId = loginBody.getTenantId();
String phonenumber = loginBody.getPhonenumber();
String smsCode = loginBody.getSmsCode();
// 通过手机号查找用户
SysUserVo user = loadUserByPhonenumber(tenantId, phonenumber);
loginService.checkLogin(LoginType.SMS, tenantId, user.getUserName(), () -> !validateSmsCode(tenantId, phonenumber, smsCode));
// 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了
LoginUser loginUser = loginService.buildLoginUser(user);
LoginUser loginUser = TenantHelper.dynamic(tenantId, () -> {
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.setDeviceType(client.getDeviceType());
SaLoginModel model = new SaLoginModel();
model.setDevice(client.getDeviceType());
SaLoginParameter model = new SaLoginParameter();
model.setDeviceType(client.getDeviceType());
// 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置
// 例如: 后台用户30分钟过期 app用户1天过期
model.setTimeout(client.getTimeout());
@ -88,20 +87,16 @@ public class SmsAuthStrategy implements IAuthStrategy {
return code.equals(smsCode);
}
private SysUserVo loadUserByPhonenumber(String tenantId, String phonenumber) {
return TenantHelper.dynamic(tenantId, () -> {
SysUser user = userMapper.selectOne(new LambdaQueryWrapper<SysUser>()
.select(SysUser::getPhonenumber, SysUser::getStatus)
.eq(SysUser::getPhonenumber, phonenumber));
if (ObjectUtil.isNull(user)) {
log.info("登录用户:{} 不存在.", phonenumber);
throw new UserException("user.not.exists", phonenumber);
} else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) {
log.info("登录用户:{} 已被停用.", phonenumber);
throw new UserException("user.blocked", phonenumber);
}
return userMapper.selectUserByPhonenumber(phonenumber);
});
private SysUserVo loadUserByPhonenumber(String phonenumber) {
SysUserVo user = userMapper.selectVoOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getPhonenumber, phonenumber));
if (ObjectUtil.isNull(user)) {
log.info("登录用户:{} 不存在.", phonenumber);
throw new UserException("user.not.exists", phonenumber);
} else if (SystemConstants.DISABLE.equals(user.getStatus())) {
log.info("登录用户:{} 已被停用.", phonenumber);
throw new UserException("user.blocked", phonenumber);
}
return user;
}
}

View File

@ -1,30 +1,26 @@
package org.dromara.web.service.impl;
import cn.dev33.satoken.stp.SaLoginModel;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.stp.parameter.SaLoginParameter;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.http.Method;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import me.zhyd.oauth.model.AuthResponse;
import me.zhyd.oauth.model.AuthUser;
import org.dromara.common.core.constant.SystemConstants;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.domain.model.SocialLoginBody;
import org.dromara.common.core.enums.UserStatus;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.exception.user.UserException;
import org.dromara.common.core.utils.StreamUtils;
import org.dromara.common.core.utils.ValidatorUtils;
import org.dromara.common.json.utils.JsonUtils;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.social.config.properties.SocialProperties;
import org.dromara.common.social.utils.SocialUtils;
import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.system.domain.SysClient;
import org.dromara.system.domain.SysUser;
import org.dromara.system.domain.vo.SysClientVo;
import org.dromara.system.domain.vo.SysSocialVo;
import org.dromara.system.domain.vo.SysUserVo;
import org.dromara.system.mapper.SysUserMapper;
@ -59,7 +55,7 @@ public class SocialAuthStrategy implements IAuthStrategy {
* @param client 客户端信息
*/
@Override
public LoginVo login(String body, SysClient client) {
public LoginVo login(String body, SysClientVo client) {
SocialLoginBody loginBody = JsonUtils.parseObject(body, SocialLoginBody.class);
ValidatorUtils.validate(loginBody);
AuthResponse<AuthUser> response = SocialUtils.loginAuth(
@ -69,34 +65,30 @@ public class SocialAuthStrategy implements IAuthStrategy {
throw new ServiceException(response.getMsg());
}
AuthUser authUserData = response.getData();
if ("GITEE".equals(authUserData.getSource())) {
// 如用户使用 gitee 登录顺手 star 给作者一点支持 拒绝白嫖
HttpUtil.createRequest(Method.PUT, "https://gitee.com/api/v5/user/starred/dromara/RuoYi-Vue-Plus")
.formStr(MapUtil.of("access_token", authUserData.getToken().getAccessToken()))
.executeAsync();
HttpUtil.createRequest(Method.PUT, "https://gitee.com/api/v5/user/starred/dromara/RuoYi-Cloud-Plus")
.formStr(MapUtil.of("access_token", authUserData.getToken().getAccessToken()))
.executeAsync();
}
List<SysSocialVo> list = sysSocialService.selectByAuthId(authUserData.getSource() + authUserData.getUuid());
if (CollUtil.isEmpty(list)) {
throw new ServiceException("你还没有绑定第三方账号,绑定后才可以登录!");
}
Optional<SysSocialVo> opt = list.stream().filter(x -> x.getTenantId().equals(loginBody.getTenantId())).findAny();
if (opt.isEmpty()) {
throw new ServiceException("对不起,你没有权限登录当前租户!");
SysSocialVo social;
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);
}
SysSocialVo social = opt.get();
// 查找用户
SysUserVo user = loadUser(social.getTenantId(), social.getUserId());
// 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了
LoginUser loginUser = loginService.buildLoginUser(user);
LoginUser loginUser = TenantHelper.dynamic(social.getTenantId(), () -> {
SysUserVo user = loadUser(social.getUserId());
// 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了
return loginService.buildLoginUser(user);
});
loginUser.setClientKey(client.getClientKey());
loginUser.setDeviceType(client.getDeviceType());
SaLoginModel model = new SaLoginModel();
model.setDevice(client.getDeviceType());
SaLoginParameter model = new SaLoginParameter();
model.setDeviceType(client.getDeviceType());
// 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置
// 例如: 后台用户30分钟过期 app用户1天过期
model.setTimeout(client.getTimeout());
@ -112,20 +104,16 @@ public class SocialAuthStrategy implements IAuthStrategy {
return loginVo;
}
private SysUserVo loadUser(String tenantId, Long userId) {
return TenantHelper.dynamic(tenantId, () -> {
SysUser user = userMapper.selectOne(new LambdaQueryWrapper<SysUser>()
.select(SysUser::getUserName, SysUser::getStatus)
.eq(SysUser::getUserId, userId));
if (ObjectUtil.isNull(user)) {
log.info("登录用户:{} 不存在.", "");
throw new UserException("user.not.exists", "");
} else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) {
log.info("登录用户:{} 已被停用.", "");
throw new UserException("user.blocked", "");
}
return userMapper.selectUserByUserName(user.getUserName());
});
private SysUserVo loadUser(Long userId) {
SysUserVo user = userMapper.selectVoById(userId);
if (ObjectUtil.isNull(user)) {
log.info("登录用户:{} 不存在.", "");
throw new UserException("user.not.exists", "");
} else if (SystemConstants.DISABLE.equals(user.getStatus())) {
log.info("登录用户:{} 已被停用.", "");
throw new UserException("user.blocked", "");
}
return user;
}
}

View File

@ -1,17 +1,25 @@
package org.dromara.web.service.impl;
import cn.dev33.satoken.stp.SaLoginModel;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.stp.parameter.SaLoginParameter;
import cn.hutool.core.util.ObjectUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import me.zhyd.oauth.config.AuthConfig;
import me.zhyd.oauth.model.AuthCallback;
import me.zhyd.oauth.model.AuthResponse;
import me.zhyd.oauth.model.AuthToken;
import me.zhyd.oauth.model.AuthUser;
import me.zhyd.oauth.request.AuthRequest;
import me.zhyd.oauth.request.AuthWechatMiniProgramRequest;
import org.dromara.common.core.constant.SystemConstants;
import org.dromara.common.core.domain.model.XcxLoginBody;
import org.dromara.common.core.domain.model.XcxLoginUser;
import org.dromara.common.core.enums.UserStatus;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.ValidatorUtils;
import org.dromara.common.json.utils.JsonUtils;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.system.domain.SysClient;
import org.dromara.system.domain.vo.SysClientVo;
import org.dromara.system.domain.vo.SysUserVo;
import org.dromara.web.domain.vo.LoginVo;
import org.dromara.web.service.IAuthStrategy;
@ -19,7 +27,7 @@ import org.dromara.web.service.SysLoginService;
import org.springframework.stereotype.Service;
/**
* 邮件认证策略
* 小程序认证策略
*
* @author Michelle.Chung
*/
@ -31,7 +39,7 @@ public class XcxAuthStrategy implements IAuthStrategy {
private final SysLoginService loginService;
@Override
public LoginVo login(String body, SysClient client) {
public LoginVo login(String body, SysClientVo client) {
XcxLoginBody loginBody = JsonUtils.parseObject(body, XcxLoginBody.class);
ValidatorUtils.validate(loginBody);
// xcxCode 为 小程序调用 wx.login 授权后获取
@ -39,12 +47,24 @@ public class XcxAuthStrategy implements IAuthStrategy {
// 多个小程序识别使用
String appid = loginBody.getAppid();
// todo 以下自行实现
// 校验 appid + appsrcret + xcxCode 调用登录凭证校验接口 获取 session_key 与 openid
String openid = "";
AuthRequest authRequest = new AuthWechatMiniProgramRequest(AuthConfig.builder()
.clientId(appid).clientSecret("自行填写密钥 可根据不同appid填入不同密钥")
.ignoreCheckRedirectUri(true).ignoreCheckState(true).build());
AuthCallback authCallback = new AuthCallback();
authCallback.setCode(xcxCode);
AuthResponse<AuthUser> resp = authRequest.login(authCallback);
String openid, unionId;
if (resp.ok()) {
AuthToken token = resp.getData().getToken();
openid = token.getOpenId();
// 微信小程序只有关联到微信开放平台下之后才能获取到 unionId因此unionId不一定能返回。
unionId = token.getUnionId();
} else {
throw new ServiceException(resp.getMsg());
}
// 框架登录不限制从什么表查询 只要最终构建出 LoginUser 即可
SysUserVo user = loadUserByOpenid(openid);
// 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了
XcxLoginUser loginUser = new XcxLoginUser();
loginUser.setTenantId(user.getTenantId());
@ -56,8 +76,8 @@ public class XcxAuthStrategy implements IAuthStrategy {
loginUser.setDeviceType(client.getDeviceType());
loginUser.setOpenid(openid);
SaLoginModel model = new SaLoginModel();
model.setDevice(client.getDeviceType());
SaLoginParameter model = new SaLoginParameter();
model.setDeviceType(client.getDeviceType());
// 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置
// 例如: 后台用户30分钟过期 app用户1天过期
model.setTimeout(client.getTimeout());
@ -81,7 +101,7 @@ public class XcxAuthStrategy implements IAuthStrategy {
if (ObjectUtil.isNull(user)) {
log.info("登录用户:{} 不存在.", openid);
// todo 用户不存在 业务逻辑自行实现
} else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) {
} else if (SystemConstants.DISABLE.equals(user.getStatus())) {
log.info("登录用户:{} 已被停用.", openid);
// todo 用户已被停用 业务逻辑自行实现
}

View File

@ -5,24 +5,28 @@ spring.boot.admin.client:
url: http://localhost:9090/admin
instance:
service-host-type: IP
username: ruoyi
password: 123456
metadata:
username: ${spring.boot.admin.client.username}
userpassword: ${spring.boot.admin.client.password}
username: @monitor.username@
password: @monitor.password@
--- # powerjob 配置
powerjob:
worker:
# 如何开启调度中心请查看文档教程
enabled: false
# 需要先在 powerjob 登录页执行应用注册后才能使用
app-name: ruoyi-worker
allow-lazy-connect-server: false
max-appended-wf-context-length: 4096
max-result-length: 4096
# 28080 端口 随着主应用端口飘逸 避免集群冲突
port: 2${server.port}
protocol: http
server-address: 127.0.0.1:7700
store-strategy: disk
--- # snail-job 配置
snail-job:
enabled: true
# 需要在 SnailJob 后台组管理创建对应名称的组,然后创建任务的时候选择对应的组,才能正确分派任务
group: "ruoyi_group"
# SnailJob 接入验证令牌 详见 script/sql/ry_job.sql `sj_group_config` 表
token: "SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT"
server:
host: 127.0.0.1
port: 17888
# 命名空间UUID 详见 script/sql/ry_job.sql `sj_namespace`表`unique_id`字段
namespace: ${spring.profiles.active}
# 随主应用端口漂移
port: 2${server.port}
# 客户端ip指定
host:
--- # 数据源配置
spring:
@ -43,17 +47,17 @@ spring:
driverClassName: com.mysql.cj.jdbc.Driver
# jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562
# 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
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: root
password: root
# 从库数据源
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
username:
password:
# # 从库数据源
# 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
@ -97,13 +101,14 @@ spring.data:
port: 6379
# 数据库索引
database: 0
# 密码(如没有密码请注释掉)
# password:
# redis 密码必须配置
password: ruoyi123
# 连接超时时间
timeout: 10s
# 是否开启ssl
ssl.enabled: false
# redisson 配置
redisson:
# redis key前缀
keyPrefix:
@ -113,8 +118,8 @@ redisson:
nettyThreads: 8
# 单节点配置
singleServerConfig:
# 客户端名称
clientName: ${ruoyi.name}
# 客户端名称 不能用中文
clientName: RuoYi-Vue-Plus
# 最小空闲连接数
connectionMinimumIdleSize: 8
# 连接池大小
@ -149,36 +154,40 @@ mail:
connectionTimeout: 0
--- # sms 短信 支持 阿里云 腾讯云 云片 等等各式各样的短信服务商
# https://wind.kim/doc/start 文档地址 各个厂商可同时使用
# https://sms4j.com/doc3/ 差异配置文档地址 支持单厂商多配置,可以配置多个同时使用
sms:
# 阿里云 dysmsapi.aliyuncs.com
alibaba:
#请求地址 默认为 dysmsapi.aliyuncs.com 如无特殊改变可以不用设置
requestUrl: dysmsapi.aliyuncs.com
#阿里云的accessKey
accessKeyId: xxxxxxx
#阿里云的accessKeySecret
accessKeySecret: xxxxxxx
#短信签名
signature: 测试
tencent:
#请求地址默认为 sms.tencentcloudapi.com 如无特殊改变可不用设置
requestUrl: sms.tencentcloudapi.com
#腾讯云的accessKey
accessKeyId: xxxxxxx
#腾讯云的accessKeySecret
accessKeySecret: xxxxxxx
#短信签名
signature: 测试
#短信sdkAppId
sdkAppId: appid
#地域信息默认为 ap-guangzhou 如无特殊改变可不用设置
territory: ap-guangzhou
# 配置源类型用于标定配置来源(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: 您的accessKey
access-key-secret: 您的accessKeySecret
signature: 您的短信签名
sdk-app-id: 您的sdkAppId
--- # 三方授权
justauth:
enabled: true
# 前端外网访问地址
address: http://localhost:80
type:
@ -189,6 +198,13 @@ justauth:
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
@ -245,3 +261,10 @@ justauth:
client-id: 10**********6
client-secret: 1f7d08**********5b7**********29e
redirect-uri: ${justauth.address}/social-callback?source=gitlab
gitea:
# 前端改动 https://gitee.com/JavaLionLi/plus-ui/pulls/204
# gitea 服务器地址
server-url: https://demo.gitea.com
client-id: 10**********6
client-secret: 1f7d08**********5b7**********29e
redirect-uri: ${justauth.address}/social-callback?source=gitea

View File

@ -8,24 +8,28 @@ spring.boot.admin.client:
url: http://localhost:9090/admin
instance:
service-host-type: IP
username: ruoyi
password: 123456
metadata:
username: ${spring.boot.admin.client.username}
userpassword: ${spring.boot.admin.client.password}
username: @monitor.username@
password: @monitor.password@
--- # powerjob 配置
powerjob:
worker:
# 如何开启调度中心请查看文档教程
enabled: false
# 需要先在 powerjob 登录页执行应用注册后才能使用
app-name: ruoyi-worker
allow-lazy-connect-server: false
max-appended-wf-context-length: 4096
max-result-length: 4096
# 28080 端口 随着主应用端口飘逸 避免集群冲突
port: 2${server.port}
protocol: http
server-address: 127.0.0.1:7700
store-strategy: disk
--- # snail-job 配置
snail-job:
enabled: true
# 需要在 SnailJob 后台组管理创建对应名称的组,然后创建任务的时候选择对应的组,才能正确分派任务
group: "ruoyi_group"
# SnailJob 接入验证令牌 详见 script/sql/ry_job.sql `sj_group_config`表
token: "SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT"
server:
host: 127.0.0.1
port: 17888
# 命名空间UUID 详见 script/sql/ry_job.sql `sj_namespace`表`unique_id`字段
namespace: ${spring.profiles.active}
# 随主应用端口漂移
port: 2${server.port}
# 客户端ip指定
host:
--- # 数据源配置
spring:
@ -46,17 +50,17 @@ spring:
driverClassName: com.mysql.cj.jdbc.Driver
# jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562
# 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
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: root
password: root
# 从库数据源
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
username:
password:
# # 从库数据源
# 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
@ -100,13 +104,14 @@ spring.data:
port: 6379
# 数据库索引
database: 0
# 密码(如没有密码请注释掉)
# password:
# redis 密码必须配置
password: ruoyi123
# 连接超时时间
timeout: 10s
# 是否开启ssl
ssl.enabled: false
# redisson 配置
redisson:
# redis key前缀
keyPrefix:
@ -116,8 +121,8 @@ redisson:
nettyThreads: 32
# 单节点配置
singleServerConfig:
# 客户端名称
clientName: ${ruoyi.name}
# 客户端名称 不能用中文
clientName: RuoYi-Vue-Plus
# 最小空闲连接数
connectionMinimumIdleSize: 32
# 连接池大小
@ -152,35 +157,39 @@ mail:
connectionTimeout: 0
--- # sms 短信 支持 阿里云 腾讯云 云片 等等各式各样的短信服务商
# https://wind.kim/doc/start 文档地址 各个厂商可同时使用
# https://sms4j.com/doc3/ 差异配置文档地址 支持单厂商多配置,可以配置多个同时使用
sms:
# 阿里云 dysmsapi.aliyuncs.com
alibaba:
#请求地址 默认为 dysmsapi.aliyuncs.com 如无特殊改变可以不用设置
requestUrl: dysmsapi.aliyuncs.com
#阿里云的accessKey
accessKeyId: xxxxxxx
#阿里云的accessKeySecret
accessKeySecret: xxxxxxx
#短信签名
signature: 测试
tencent:
#请求地址默认为 sms.tencentcloudapi.com 如无特殊改变可不用设置
requestUrl: sms.tencentcloudapi.com
#腾讯云的accessKey
accessKeyId: xxxxxxx
#腾讯云的accessKeySecret
accessKeySecret: xxxxxxx
#短信签名
signature: 测试
#短信sdkAppId
sdkAppId: appid
#地域信息默认为 ap-guangzhou 如无特殊改变可不用设置
territory: ap-guangzhou
# 配置源类型用于标定配置来源(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: 您的accessKey
access-key-secret: 您的accessKeySecret
signature: 您的短信签名
sdk-app-id: 您的sdkAppId
--- # 三方授权
justauth:
enabled: true
# 前端外网访问地址
address: http://localhost:80
type:
@ -191,6 +200,13 @@ justauth:
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
@ -247,3 +263,10 @@ justauth:
client-id: 10**********6
client-secret: 1f7d08**********5b7**********29e
redirect-uri: ${justauth.address}/social-callback?source=gitlab
gitea:
# 前端改动 https://gitee.com/JavaLionLi/plus-ui/pulls/204
# gitea 服务器地址
server-url: https://demo.gitea.com
client-id: 10**********6
client-secret: 1f7d08**********5b7**********29e
redirect-uri: ${justauth.address}/social-callback?source=gitea

View File

@ -1,24 +1,3 @@
# 项目相关配置
ruoyi:
# 名称
name: RuoYi-Vue-Plus
# 版本
version: ${revision}
# 版权年份
copyrightYear: 2023
captcha:
enable: true
# 页面 <参数设置> 可开启关闭 验证码校验
# 验证码类型 math 数组计算 char 字符验证
type: MATH
# line 线段干扰 circle 圆圈干扰 shear 扭曲干扰
category: CIRCLE
# 数字验证码位数
numberLength: 1
# 字符验证码长度
charLength: 4
# 开发环境配置
server:
# 服务器的HTTP端口默认为8080
@ -41,12 +20,25 @@ server:
# 阻塞任务线程池, 当执行类似servlet请求阻塞操作, undertow会从这个线程池中取得线程,它的值设置取决于系统的负载
worker: 256
captcha:
# 是否启用验证码校验
enable: true
# 验证码类型 math 数组计算 char 字符验证
type: MATH
# line 线段干扰 circle 圆圈干扰 shear 扭曲干扰
category: CIRCLE
# 数字验证码位数
numberLength: 1
# 字符验证码长度
charLength: 4
# 日志配置
logging:
level:
org.dromara: @logging.level@
org.springframework: warn
tech.powerjob.worker.background: warn
org.mybatis.spring.mapper: error
org.apache.fury: warn
config: classpath:logback-plus.xml
# 用户配置
@ -60,7 +52,18 @@ user:
# Spring配置
spring:
application:
name: ${ruoyi.name}
name: RuoYi-Vue-Plus
threads:
# 开启虚拟线程 仅jdk21可用
virtual:
enabled: false
task:
execution:
# 从 springboot 3.5 开始 spring自带线程池
# 不再需要 AsyncConfig与ThreadPoolConfig 可直接注入线程池使用
thread-name-prefix: async-
# 由spring自己初始化线程池
mode: force
# 资源信息
messages:
# 国际化资源文件路径
@ -75,6 +78,8 @@ spring:
# 设置总上传的文件大小
max-request-size: 20MB
mvc:
# 设置静态资源路径 防止所有请求都去查静态资源
static-path-pattern: /static/**
format:
date-time: yyyy-MM-dd HH:mm:ss
jackson:
@ -104,20 +109,15 @@ sa-token:
security:
# 排除路径
excludes:
# 静态资源
- /*.html
- /**/*.html
- /**/*.css
- /**/*.js
# 公共路径
- /favicon.ico
- /error
# swagger 文档配置
- /*/api-docs
- /*/api-docs/**
# actuator 监控配置
- /actuator
- /actuator/**
- /warm-flow-ui/config
# 多租户配置
tenant:
@ -134,12 +134,14 @@ tenant:
- sys_user_role
- sys_client
- sys_oss_config
- flow_spel
# MyBatisPlus配置
# https://baomidou.com/config/
mybatis-plus:
# 不支持多包, 如有需要可在注解配置 或 提升扫包等级
# 例如 com.**.**.mapper
# 自定义配置 是否全局开启逻辑删除 关闭后 所有逻辑删除功能将失效
enableLogicDelete: true
# 多包名使用 例如 org.dromara.**.mapper,org.xxx.**.mapper
mapperPackage: org.dromara.**.mapper
# 对应的 XML 文件位置
mapperLocations: classpath*:mapper/**/*Mapper.xml
@ -183,28 +185,18 @@ springdoc:
api-docs:
# 是否开启接口文档
enabled: true
# swagger-ui:
# # 持久化认证数据
# persistAuthorization: true
info:
# 标题
title: '标题:${ruoyi.name}多租户管理系统_接口文档'
title: '标题:RuoYi-Vue-Plus多租户管理系统_接口文档'
# 描述
description: '描述:用于管理集团旗下公司的人员信息,具体包括XXX,XXX模块...'
# 版本
version: '版本号: ${ruoyi.version}'
version: '版本号: ${project.version}'
# 作者信息
contact:
name: Lion Li
email: crazylionli@163.com
url: https://gitee.com/dromara/RuoYi-Vue-Plus
components:
# 鉴权方式配置
security-schemes:
apiKey:
type: APIKEY
in: HEADER
name: ${sa-token.token-name}
#这里定义了两个分组,可定义多个,也可以不定义
group-configs:
- group: 1.演示模块
@ -215,24 +207,16 @@ springdoc:
packages-to-scan: org.dromara.system
- group: 4.代码生成模块
packages-to-scan: org.dromara.generator
- group: 5.工作流模块
packages-to-scan: org.dromara.workflow
# 防止XSS攻击
xss:
# 过滤开关
enabled: true
# 排除链接(多个用逗号分隔)
excludes: /system/notice
# 匹配链接
urlPatterns: /system/*,/monitor/*,/tool/*
# 全局线程池相关配置
thread-pool:
# 是否开启线程池
enabled: false
# 队列最大长度
queueCapacity: 128
# 线程池维护线程所允许的空闲时间
keepAliveSeconds: 300
# 排除链接
excludeUrls:
- /system/notice
--- # 分布式锁 lock4j 全局配置
lock4j:
@ -253,11 +237,27 @@ management:
logfile:
external-file: ./logs/sys-console.log
--- # 默认/推荐使用sse推送
sse:
enabled: true
path: /resource/sse
--- # websocket
websocket:
# 如果关闭 需要和前端开关一起关闭
enabled: true
enabled: false
# 路径
path: /resource/websocket
# 设置访问源地址
allowedOrigins: '*'
--- # warm-flow工作流配置
warm-flow:
# 是否开启工作流默认true
enabled: true
# 是否开启设计器ui
ui: true
# 是否显示流程图顶部文字
top-text-show: true
# 默认Authorization如果有多个token用逗号分隔
token-name: ${sa-token.token-name},clientid

View File

@ -17,6 +17,7 @@ user.username.length.valid=账户长度必须在{min}到{max}个字符之间
user.password.not.blank=用户密码不能为空
user.password.length.valid=用户密码长度必须在{min}到{max}个字符之间
user.password.not.valid=* 5-50个字符
user.password.format.valid=密码必须包含大写字母、小写字母、数字和特殊字符
user.email.not.valid=邮箱格式错误
user.email.not.blank=邮箱不能为空
user.phonenumber.not.blank=用户手机号不能为空

View File

@ -17,6 +17,7 @@ user.username.length.valid=Account length must be between {min} and {max} charac
user.password.not.blank=Password cannot be empty
user.password.length.valid=Password length must be between {min} and {max} characters
user.password.not.valid=* 5-50 characters
user.password.format.valid=Password must contain uppercase, lowercase, digit, and special character
user.email.not.valid=Mailbox format error
user.email.not.blank=Mailbox cannot be blank
user.phonenumber.not.blank=Phone number cannot be blank

View File

@ -17,6 +17,7 @@ user.username.length.valid=账户长度必须在{min}到{max}个字符之间
user.password.not.blank=用户密码不能为空
user.password.length.valid=用户密码长度必须在{min}到{max}个字符之间
user.password.not.valid=* 5-50个字符
user.password.format.valid=密码必须包含大写字母、小写字母、数字和特殊字符
user.email.not.valid=邮箱格式错误
user.email.not.blank=邮箱不能为空
user.phonenumber.not.blank=用户手机号不能为空

View File

@ -2,7 +2,7 @@
<configuration>
<property name="log.path" value="./logs"/>
<property name="console.log.pattern"
value="%red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}%n) - %msg%n"/>
value="%cyan(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}%n) - %msg%n"/>
<property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"/>
<!-- 控制台输出 -->

View File

@ -1,6 +1,6 @@
package org.dromara.test;
import org.dromara.common.core.config.RuoYiConfig;
import org.dromara.common.web.config.properties.CaptchaProperties;
import org.junit.jupiter.api.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@ -17,19 +17,19 @@ import java.util.concurrent.TimeUnit;
public class DemoUnitTest {
@Autowired
private RuoYiConfig ruoYiConfig;
private CaptchaProperties captchaProperties;
@DisplayName("测试 @SpringBootTest @Test @DisplayName 注解")
@Test
public void testTest() {
System.out.println(ruoYiConfig);
System.out.println(captchaProperties);
}
@Disabled
@DisplayName("测试 @Disabled 注解")
@Test
public void testDisabled() {
System.out.println(ruoYiConfig);
System.out.println(captchaProperties);
}
@Timeout(value = 2L, unit = TimeUnit.SECONDS)
@ -37,7 +37,7 @@ public class DemoUnitTest {
@Test
public void testTimeout() throws InterruptedException {
Thread.sleep(3000);
System.out.println(ruoYiConfig);
System.out.println(captchaProperties);
}

View File

@ -33,6 +33,7 @@
<module>ruoyi-common-encrypt</module>
<module>ruoyi-common-tenant</module>
<module>ruoyi-common-websocket</module>
<module>ruoyi-common-sse</module>
</modules>
<artifactId>ruoyi-common</artifactId>

View File

@ -14,7 +14,7 @@
</description>
<properties>
<revision>5.1.2</revision>
<revision>5.4.1</revision>
</properties>
<dependencyManagement>
@ -172,6 +172,13 @@
<version>${revision}</version>
</dependency>
<!-- SSE模块 -->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-sse</artifactId>
<version>${revision}</version>
</dependency>
</dependencies>
</dependencyManagement>

View File

@ -2,6 +2,7 @@ package org.dromara.common.core.config;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.scheduling.annotation.EnableAsync;
/**
* 程序注解配置
@ -9,8 +10,8 @@ import org.springframework.context.annotation.EnableAspectJAutoProxy;
* @author Lion Li
*/
@AutoConfiguration
// 表示通过aop框架暴露该代理对象,AopContext能够访问
@EnableAspectJAutoProxy(exposeProxy = true)
@EnableAspectJAutoProxy
@EnableAsync(proxyTargetClass = true)
public class ApplicationConfig {
}

View File

@ -1,48 +0,0 @@
package org.dromara.common.core.config;
import cn.hutool.core.util.ArrayUtil;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.SpringUtils;
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import java.util.Arrays;
import java.util.concurrent.Executor;
/**
* 异步配置
*
* @author Lion Li
*/
@EnableAsync(proxyTargetClass = true)
@AutoConfiguration
public class AsyncConfig implements AsyncConfigurer {
/**
* 自定义 @Async 注解使用系统线程池
*/
@Override
public Executor getAsyncExecutor() {
return SpringUtils.getBean("scheduledExecutorService");
}
/**
* 异步执行异常处理
*/
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return (throwable, method, objects) -> {
throwable.printStackTrace();
StringBuilder sb = new StringBuilder();
sb.append("Exception message - ").append(throwable.getMessage())
.append(", Method name - ").append(method.getName());
if (ArrayUtil.isNotEmpty(objects)) {
sb.append(", Parameter value - ").append(Arrays.toString(objects));
}
throw new ServiceException(sb.toString());
};
}
}

View File

@ -1,33 +0,0 @@
package org.dromara.common.core.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* 读取项目相关配置
*
* @author Lion Li
*/
@Data
@Component
@ConfigurationProperties(prefix = "ruoyi")
public class RuoYiConfig {
/**
* 项目名称
*/
private String name;
/**
* 版本
*/
private String version;
/**
* 版权年份
*/
private String copyrightYear;
}

View File

@ -4,12 +4,12 @@ import jakarta.annotation.PreDestroy;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.concurrent.BasicThreadFactory;
import org.dromara.common.core.config.properties.ThreadPoolProperties;
import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.core.utils.Threads;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.core.task.VirtualThreadTaskExecutor;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
@ -32,25 +32,20 @@ public class ThreadPoolConfig {
private ScheduledExecutorService scheduledExecutorService;
@Bean(name = "threadPoolTaskExecutor")
@ConditionalOnProperty(prefix = "thread-pool", name = "enabled", havingValue = "true")
public ThreadPoolTaskExecutor threadPoolTaskExecutor(ThreadPoolProperties threadPoolProperties) {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(core);
executor.setMaxPoolSize(core * 2);
executor.setQueueCapacity(threadPoolProperties.getQueueCapacity());
executor.setKeepAliveSeconds(threadPoolProperties.getKeepAliveSeconds());
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
return executor;
}
/**
* 执行周期性或定时任务
*/
@Bean(name = "scheduledExecutorService")
protected ScheduledExecutorService scheduledExecutorService() {
// daemon 必须为 true
BasicThreadFactory.Builder builder = new BasicThreadFactory.Builder().daemon(true);
if (SpringUtils.isVirtual()) {
builder.namingPattern("virtual-schedule-pool-%d").wrappedFactory(new VirtualThreadTaskExecutor().getVirtualThreadFactory());
} else {
builder.namingPattern("schedule-pool-%d");
}
ScheduledThreadPoolExecutor scheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(core,
new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build(),
builder.build(),
new ThreadPoolExecutor.CallerRunsPolicy()) {
@Override
protected void afterExecute(Runnable r, Throwable t) {

View File

@ -3,6 +3,7 @@ package org.dromara.common.core.config;
import jakarta.validation.Validator;
import org.hibernate.validator.HibernateValidator;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
@ -14,11 +15,11 @@ import java.util.Properties;
*
* @author Lion Li
*/
@AutoConfiguration
@AutoConfiguration(before = ValidationAutoConfiguration.class)
public class ValidatorConfig {
/**
* 配置校验框架 快速返回模式
* 配置校验框架 快速失败模式
*/
@Bean
public Validator validator(MessageSource messageSource) {
@ -28,7 +29,7 @@ public class ValidatorConfig {
// 设置使用 HibernateValidator 校验器
factoryBean.setProviderClass(HibernateValidator.class);
Properties properties = new Properties();
// 设置 快速异常返回
// 设置快速失败模式fail-fast即校验过程中一旦遇到失败立即停止并返回错误
properties.setProperty("hibernate.validator.fail_fast", "true");
factoryBean.setValidationProperties(properties);
// 加载配置

View File

@ -22,4 +22,9 @@ public interface CacheConstants {
*/
String SYS_DICT_KEY = "sys_dict:";
/**
* 登录账户密码错误次数 redis key
*/
String PWD_ERR_CNT_KEY = "pwd_err_cnt:";
}

View File

@ -3,13 +3,14 @@ package org.dromara.common.core.constant;
/**
* 缓存组名称常量
* <p>
* key 格式为 cacheNames#ttl#maxIdleTime#maxSize
* key 格式为 cacheNames#ttl#maxIdleTime#maxSize#local
* <p>
* ttl 过期时间 如果设置为0则不过期 默认为0
* maxIdleTime 最大空闲时间 根据LRU算法清理空闲数据 如果设置为0则不检测 默认为0
* maxSize 组最大长度 根据LRU算法清理溢出数据 如果设置为0则无限长 默认为0
* local 默认开启本地缓存为1 关闭本地缓存为0
* <p>
* 例子: test#60s、test#0#60s、test#0#1m#1000、test#1h#0#500
* 例子: test#60s、test#0#60s、test#0#1m#1000、test#1h#0#500、test#1h#0#500#0
*
* @author Lion Li
*/
@ -30,11 +31,21 @@ public interface CacheNames {
*/
String SYS_DICT = "sys_dict";
/**
* 数据字典类型
*/
String SYS_DICT_TYPE = "sys_dict_type";
/**
* 租户
*/
String SYS_TENANT = GlobalConstants.GLOBAL_REDIS_KEY + "sys_tenant#30d";
/**
* 客户端
*/
String SYS_CLIENT = GlobalConstants.GLOBAL_REDIS_KEY + "sys_client#30d";
/**
* 用户账户
*/
@ -55,6 +66,16 @@ public interface CacheNames {
*/
String SYS_OSS = "sys_oss#30d";
/**
* 角色自定义权限
*/
String SYS_ROLE_CUSTOM = "sys_role_custom#30d";
/**
* 部门及以下权限
*/
String SYS_DEPT_AND_CHILD = "sys_dept_and_child#30d";
/**
* OSS配置
*/

View File

@ -68,12 +68,7 @@ public interface Constants {
Integer CAPTCHA_EXPIRATION = 2;
/**
* 令牌
*/
String TOKEN = "token";
/**
* 顶级部门id
* 顶级父级id
*/
Long TOP_PARENT_ID = 0L;

View File

@ -27,11 +27,6 @@ public interface GlobalConstants {
*/
String RATE_LIMIT_KEY = GLOBAL_REDIS_KEY + "rate_limit:";
/**
* 登录账户密码错误次数 redis key
*/
String PWD_ERR_CNT_KEY = GLOBAL_REDIS_KEY + "pwd_err_cnt:";
/**
* 三方认证 redis key
*/

View File

@ -0,0 +1,59 @@
package org.dromara.common.core.constant;
import cn.hutool.core.lang.RegexPool;
/**
* 常用正则表达式字符串
* <p>
* 常用正则表达式集合,更多正则见: https://any86.github.io/any-rule/
*
* @author Feng
*/
public interface RegexConstants extends RegexPool {
/**
* 字典类型必须以字母开头,且只能为(小写字母,数字,下滑线)
*/
String DICTIONARY_TYPE = "^[a-z][a-z0-9_]*$";
/**
* 权限标识必须符合以下格式:
* 1. 标准格式xxx:yyy:zzz
* - 第一部分xxx只能包含字母、数字和下划线_不能使用 `*`
* - 第二部分yyy可以包含字母、数字、下划线_和 `*`
* - 第三部分zzz可以包含字母、数字、下划线_和 `*`
* 2. 允许空字符串(""),表示没有权限标识
*/
String PERMISSION_STRING = "^$|^[a-zA-Z0-9_]+:[a-zA-Z0-9_*]+:[a-zA-Z0-9_*]+$";
/**
* 身份证号码后6位
*/
String ID_CARD_LAST_6 = "^(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$";
/**
* QQ号码
*/
String QQ_NUMBER = "^[1-9][0-9]\\d{4,9}$";
/**
* 邮政编码
*/
String POSTAL_CODE = "^[1-9]\\d{5}$";
/**
* 注册账号
*/
String ACCOUNT = "^[a-zA-Z][a-zA-Z0-9_]{4,15}$";
/**
* 密码包含至少8个字符包括大写字母、小写字母、数字和特殊字符
*/
String PASSWORD = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[@$!%*?&])[A-Za-z\\d@$!%*?&]{8,}$";
/**
* 通用状态0表示正常1表示停用
*/
String STATUS = "^[01]$";
}

View File

@ -0,0 +1,85 @@
package org.dromara.common.core.constant;
/**
* 系统常量信息
*
* @author Lion Li
*/
public interface SystemConstants {
/**
* 正常状态
*/
String NORMAL = "0";
/**
* 异常状态
*/
String DISABLE = "1";
/**
* 是否为系统默认(是)
*/
String YES = "Y";
/**
* 是否为系统默认(否)
*/
String NO = "N";
/**
* 是否菜单外链(是)
*/
String YES_FRAME = "0";
/**
* 是否菜单外链(否)
*/
String NO_FRAME = "1";
/**
* 菜单类型(目录)
*/
String TYPE_DIR = "M";
/**
* 菜单类型(菜单)
*/
String TYPE_MENU = "C";
/**
* 菜单类型(按钮)
*/
String TYPE_BUTTON = "F";
/**
* Layout组件标识
*/
String LAYOUT = "Layout";
/**
* ParentView组件标识
*/
String PARENT_VIEW = "ParentView";
/**
* InnerLink组件标识
*/
String INNER_LINK = "InnerLink";
/**
* 超级管理员ID
*/
Long SUPER_ADMIN_ID = 1L;
/**
* 根部门祖级列表
*/
String ROOT_DEPT_ANCESTORS = "0";
/**
* 默认部门 ID
*/
Long DEFAULT_DEPT_ID = 100L;
}

View File

@ -7,16 +7,6 @@ package org.dromara.common.core.constant;
*/
public interface TenantConstants {
/**
* 租户正常状态
*/
String NORMAL = "0";
/**
* 租户封禁状态
*/
String DISABLE = "1";
/**
* 超级管理员ID
*/

View File

@ -1,142 +0,0 @@
package org.dromara.common.core.constant;
/**
* 用户常量信息
*
* @author ruoyi
*/
public interface UserConstants {
/**
* 平台内系统用户的唯一标志
*/
String SYS_USER = "SYS_USER";
/**
* 正常状态
*/
String NORMAL = "0";
/**
* 异常状态
*/
String EXCEPTION = "1";
/**
* 用户正常状态
*/
String USER_NORMAL = "0";
/**
* 用户封禁状态
*/
String USER_DISABLE = "1";
/**
* 角色正常状态
*/
String ROLE_NORMAL = "0";
/**
* 角色封禁状态
*/
String ROLE_DISABLE = "1";
/**
* 部门正常状态
*/
String DEPT_NORMAL = "0";
/**
* 部门停用状态
*/
String DEPT_DISABLE = "1";
/**
* 岗位正常状态
*/
String POST_NORMAL = "0";
/**
* 岗位停用状态
*/
String POST_DISABLE = "1";
/**
* 字典正常状态
*/
String DICT_NORMAL = "0";
/**
* 是否为系统默认(是)
*/
String YES = "Y";
/**
* 是否菜单外链(是)
*/
String YES_FRAME = "0";
/**
* 是否菜单外链(否)
*/
String NO_FRAME = "1";
/**
* 菜单正常状态
*/
String MENU_NORMAL = "0";
/**
* 菜单停用状态
*/
String MENU_DISABLE = "1";
/**
* 菜单类型(目录)
*/
String TYPE_DIR = "M";
/**
* 菜单类型(菜单)
*/
String TYPE_MENU = "C";
/**
* 菜单类型(按钮)
*/
String TYPE_BUTTON = "F";
/**
* Layout组件标识
*/
String LAYOUT = "Layout";
/**
* ParentView组件标识
*/
String PARENT_VIEW = "ParentView";
/**
* InnerLink组件标识
*/
String INNER_LINK = "InnerLink";
/**
* 用户名长度限制
*/
int USERNAME_MIN_LENGTH = 2;
int USERNAME_MAX_LENGTH = 20;
/**
* 密码长度限制
*/
int PASSWORD_MIN_LENGTH = 5;
int PASSWORD_MAX_LENGTH = 20;
/**
* 超级管理员ID
*/
Long SUPER_ADMIN_ID = 1L;
}

View File

@ -0,0 +1,76 @@
package org.dromara.common.core.domain.dto;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
* 办理任务请求对象
*
* @author may
*/
@Data
public class CompleteTaskDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 任务id
*/
private Long taskId;
/**
* 附件id
*/
private String fileId;
/**
* 抄送人员
*/
private List<FlowCopyDTO> flowCopyList;
/**
* 消息类型
*/
private List<String> messageType;
/**
* 办理意见
*/
private String message;
/**
* 消息通知
*/
private String notice;
/**
* 办理人(可不填 用于覆盖当前节点办理人)
*/
private String handler;
/**
* 流程变量
*/
private Map<String, Object> variables;
/**
* 扩展变量(此处为逗号分隔的ossId)
*/
private String ext;
public Map<String, Object> getVariables() {
if (variables == null) {
return new HashMap<>(16);
}
variables.entrySet().removeIf(entry -> Objects.isNull(entry.getValue()));
return variables;
}
}

View File

@ -0,0 +1,36 @@
package org.dromara.common.core.domain.dto;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serial;
import java.io.Serializable;
/**
* 部门
*
* @author AprilWind
*/
@Data
@NoArgsConstructor
public class DeptDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 部门ID
*/
private Long deptId;
/**
* 父部门ID
*/
private Long parentId;
/**
* 部门名称
*/
private String deptName;
}

View File

@ -0,0 +1,41 @@
package org.dromara.common.core.domain.dto;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serial;
import java.io.Serializable;
/**
* 字典数据DTO
*
* @author AprilWind
*/
@Data
@NoArgsConstructor
public class DictDataDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 字典标签
*/
private String dictLabel;
/**
* 字典键值
*/
private String dictValue;
/**
* 是否默认Y是 N否
*/
private String isDefault;
/**
* 备注
*/
private String remark;
}

View File

@ -0,0 +1,41 @@
package org.dromara.common.core.domain.dto;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serial;
import java.io.Serializable;
/**
* 字典类型DTO
*
* @author AprilWind
*/
@Data
@NoArgsConstructor
public class DictTypeDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 字典主键
*/
private Long dictId;
/**
* 字典名称
*/
private String dictName;
/**
* 字典类型
*/
private String dictType;
/**
* 备注
*/
private String remark;
}

View File

@ -0,0 +1,30 @@
package org.dromara.common.core.domain.dto;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 抄送
*
* @author may
*/
@Data
public class FlowCopyDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 用户id
*/
private Long userId;
/**
* 用户名称
*/
private String userName;
}

View File

@ -0,0 +1,46 @@
package org.dromara.common.core.domain.dto;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serial;
import java.io.Serializable;
/**
* OSS对象
*
* @author Lion Li
*/
@Data
@NoArgsConstructor
public class OssDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 对象存储主键
*/
private Long ossId;
/**
* 文件名
*/
private String fileName;
/**
* 原名
*/
private String originalName;
/**
* 文件后缀名
*/
private String fileSuffix;
/**
* URL地址
*/
private String url;
}

View File

@ -0,0 +1,46 @@
package org.dromara.common.core.domain.dto;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serial;
import java.io.Serializable;
/**
* 岗位
*
* @author AprilWind
*/
@Data
@NoArgsConstructor
public class PostDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 岗位ID
*/
private Long postId;
/**
* 部门id
*/
private Long deptId;
/**
* 岗位编码
*/
private String postCode;
/**
* 岗位名称
*/
private String postName;
/**
* 岗位类别编码
*/
private String postCategory;
}

View File

@ -3,6 +3,7 @@ package org.dromara.common.core.domain.dto;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serial;
import java.io.Serializable;
/**
@ -15,6 +16,9 @@ import java.io.Serializable;
@NoArgsConstructor
public class RoleDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 角色ID
*/
@ -31,7 +35,7 @@ public class RoleDTO implements Serializable {
private String roleKey;
/**
* 数据范围1所有数据权限2自定数据权限3本部门数据权限4本部门及以下数据权限5仅本人数据权限
* 数据范围1全部数据权限 2自定数据权限 3本部门数据权限 4本部门及以下数据权限 5仅本人数据权限 6部门及以下或本人数据权限
*/
private String dataScope;

View File

@ -0,0 +1,50 @@
package org.dromara.common.core.domain.dto;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
/**
* 启动流程对象
*
* @author may
*/
@Data
public class StartProcessDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 业务唯一值id
*/
private String businessId;
/**
* 流程定义编码
*/
private String flowCode;
/**
* 办理人(可不填 用于覆盖当前节点办理人)
*/
private String handler;
/**
* 流程变量,前端会提交一个元素{'entity': {业务详情数据对象}}
*/
private Map<String, Object> variables;
public Map<String, Object> getVariables() {
if (variables == null) {
return new HashMap<>(16);
}
variables.entrySet().removeIf(entry -> Objects.isNull(entry.getValue()));
return variables;
}
}

View File

@ -0,0 +1,30 @@
package org.dromara.common.core.domain.dto;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 启动流程返回对象
*
* @author Lion Li
*/
@Data
public class StartProcessReturnDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 流程实例id
*/
private Long processInstanceId;
/**
* 任务id
*/
private Long taskId;
}

View File

@ -0,0 +1,101 @@
package org.dromara.common.core.domain.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* 任务受让人
*
* @author AprilWind
*/
@Data
@NoArgsConstructor
public class TaskAssigneeDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 总大小
*/
private Long total = 0L;
/**
*
*/
private List<TaskHandler> list;
public TaskAssigneeDTO(Long total, List<TaskHandler> list) {
this.total = total;
this.list = list;
}
/**
* 将源列表转换为 TaskHandler 列表
*
* @param <T> 通用类型
* @param sourceList 待转换的源列表
* @param storageId 提取 storageId 的函数
* @param handlerCode 提取 handlerCode 的函数
* @param handlerName 提取 handlerName 的函数
* @param groupName 提取 groupName 的函数
* @param createTimeMapper 提取 createTime 的函数
* @return 转换后的 TaskHandler 列表
*/
public static <T> List<TaskHandler> convertToHandlerList(
List<T> sourceList,
Function<T, String> storageId,
Function<T, String> handlerCode,
Function<T, String> handlerName,
Function<T, String> groupName,
Function<T, Date> createTimeMapper) {
return sourceList.stream()
.map(item -> new TaskHandler(
storageId.apply(item),
handlerCode.apply(item),
handlerName.apply(item),
groupName.apply(item),
createTimeMapper.apply(item)
)).collect(Collectors.toList());
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class TaskHandler {
/**
* 主键
*/
private String storageId;
/**
* 权限编码
*/
private String handlerCode;
/**
* 权限名称
*/
private String handlerName;
/**
* 权限分组
*/
private String groupName;
/**
* 创建时间
*/
private Date createTime;
}
}

View File

@ -0,0 +1,73 @@
package org.dromara.common.core.domain.dto;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 用户
*
* @author Michelle.Chung
*/
@Data
@NoArgsConstructor
public class UserDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 用户ID
*/
private Long userId;
/**
* 部门ID
*/
private Long deptId;
/**
* 用户账号
*/
private String userName;
/**
* 用户昵称
*/
private String nickName;
/**
* 用户类型sys_user系统用户
*/
private String userType;
/**
* 用户邮箱
*/
private String email;
/**
* 手机号码
*/
private String phonenumber;
/**
* 用户性别0男 1女 2未知
*/
private String sex;
/**
* 帐号状态0正常 1停用
*/
private String status;
/**
* 创建时间
*/
private Date createTime;
}

View File

@ -0,0 +1,34 @@
package org.dromara.common.core.domain.event;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 删除流程监听
*
* @author AprilWind
*/
@Data
public class ProcessDeleteEvent implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 租户ID
*/
private String tenantId;
/**
* 流程定义编码
*/
private String flowCode;
/**
* 业务id
*/
private String businessId;
}

View File

@ -0,0 +1,70 @@
package org.dromara.common.core.domain.event;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Map;
/**
* 总体流程监听
*
* @author may
*/
@Data
public class ProcessEvent implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 租户ID
*/
private String tenantId;
/**
* 流程定义编码
*/
private String flowCode;
/**
* 实例id
*/
private Long instanceId;
/**
* 业务id
*/
private String businessId;
/**
* 节点类型0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关
*/
private Integer nodeType;
/**
* 流程节点编码
*/
private String nodeCode;
/**
* 流程节点名称
*/
private String nodeName;
/**
* 流程状态
*/
private String status;
/**
* 办理参数
*/
private Map<String, Object> params;
/**
* 当为true时为申请人节点办理
*/
private Boolean submit;
}

View File

@ -0,0 +1,70 @@
package org.dromara.common.core.domain.event;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Map;
/**
* 流程任务监听
*
* @author may
*/
@Data
public class ProcessTaskEvent implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 租户ID
*/
private String tenantId;
/**
* 流程定义编码
*/
private String flowCode;
/**
* 节点类型0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关
*/
private Integer nodeType;
/**
* 流程节点编码
*/
private String nodeCode;
/**
* 流程节点名称
*/
private String nodeName;
/**
* 任务id
*/
private Long taskId;
/**
* 实例id
*/
private Long instanceId;
/**
* 业务id
*/
private String businessId;
/**
* 流程状态
*/
private String status;
/**
* 办理参数
*/
private Map<String, Object> params;
}

View File

@ -1,8 +1,9 @@
package org.dromara.common.core.domain.model;
import org.dromara.common.core.domain.dto.RoleDTO;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.dromara.common.core.domain.dto.PostDTO;
import org.dromara.common.core.domain.dto.RoleDTO;
import java.io.Serial;
import java.io.Serializable;
@ -14,7 +15,6 @@ import java.util.Set;
*
* @author Lion Li
*/
@Data
@NoArgsConstructor
public class LoginUser implements Serializable {
@ -37,6 +37,11 @@ public class LoginUser implements Serializable {
*/
private Long deptId;
/**
* 部门类别编码
*/
private String deptCategory;
/**
* 部门名
*/
@ -107,6 +112,11 @@ public class LoginUser implements Serializable {
*/
private List<RoleDTO> roles;
/**
* 岗位对象
*/
private List<PostDTO> posts;
/**
* 数据权限 当前角色ID
*/

View File

@ -5,8 +5,6 @@ import lombok.Data;
import lombok.EqualsAndHashCode;
import org.hibernate.validator.constraints.Length;
import static org.dromara.common.core.constant.UserConstants.*;
/**
* 密码登录对象
*
@ -20,14 +18,15 @@ public class PasswordLoginBody extends LoginBody {
* 用户名
*/
@NotBlank(message = "{user.username.not.blank}")
@Length(min = USERNAME_MIN_LENGTH, max = USERNAME_MAX_LENGTH, message = "{user.username.length.valid}")
@Length(min = 2, max = 30, message = "{user.username.length.valid}")
private String username;
/**
* 用户密码
*/
@NotBlank(message = "{user.password.not.blank}")
@Length(min = PASSWORD_MIN_LENGTH, max = PASSWORD_MAX_LENGTH, message = "{user.password.length.valid}")
@Length(min = 5, max = 30, message = "{user.password.length.valid}")
// @Pattern(regexp = RegexConstants.PASSWORD, message = "{user.password.format.valid}")
private String password;
}

View File

@ -5,8 +5,6 @@ import lombok.Data;
import lombok.EqualsAndHashCode;
import org.hibernate.validator.constraints.Length;
import static org.dromara.common.core.constant.UserConstants.*;
/**
* 用户注册对象
*
@ -20,16 +18,20 @@ public class RegisterBody extends LoginBody {
* 用户名
*/
@NotBlank(message = "{user.username.not.blank}")
@Length(min = USERNAME_MIN_LENGTH, max = USERNAME_MAX_LENGTH, message = "{user.username.length.valid}")
@Length(min = 2, max = 30, message = "{user.username.length.valid}")
private String username;
/**
* 用户密码
*/
@NotBlank(message = "{user.password.not.blank}")
@Length(min = PASSWORD_MIN_LENGTH, max = PASSWORD_MAX_LENGTH, message = "{user.password.length.valid}")
@Length(min = 5, max = 30, message = "{user.password.length.valid}")
// @Pattern(regexp = RegexConstants.PASSWORD, message = "{user.password.format.valid}")
private String password;
/**
* 用户类型
*/
private String userType;
}

View File

@ -0,0 +1,56 @@
package org.dromara.common.core.domain.model;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serial;
import java.io.Serializable;
/**
* 任务受让人
*
* @author AprilWind
*/
@Data
@NoArgsConstructor
public class TaskAssigneeBody implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 权限编码
*/
private String handlerCode;
/**
* 权限名称
*/
private String handlerName;
/**
* 权限分组
*/
private String groupId;
/**
* 开始时间
*/
private String beginTime;
/**
* 结束时间
*/
private String endTime;
/**
* 当前页
*/
private Integer pageNum = 1;
/**
* 每页显示条数
*/
private Integer pageSize = 10;
}

View File

@ -0,0 +1,215 @@
package org.dromara.common.core.enums;
import cn.hutool.core.util.StrUtil;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.StringUtils;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* 业务状态枚举
*
* @author may
*/
@Getter
@AllArgsConstructor
public enum BusinessStatusEnum {
/**
* 已撤销
*/
CANCEL("cancel", "已撤销"),
/**
* 草稿
*/
DRAFT("draft", "草稿"),
/**
* 待审核
*/
WAITING("waiting", "待审核"),
/**
* 已完成
*/
FINISH("finish", "已完成"),
/**
* 已作废
*/
INVALID("invalid", "已作废"),
/**
* 已退回
*/
BACK("back", "已退回"),
/**
* 已终止
*/
TERMINATION("termination", "已终止");
/**
* 状态
*/
private final String status;
/**
* 描述
*/
private final String desc;
private static final Map<String, BusinessStatusEnum> STATUS_MAP = Arrays.stream(BusinessStatusEnum.values())
.collect(Collectors.toConcurrentMap(BusinessStatusEnum::getStatus, Function.identity()));
/**
* 根据状态获取对应的 BusinessStatusEnum 枚举
*
* @param status 业务状态码
* @return 对应的 BusinessStatusEnum 枚举,如果找不到则返回 null
*/
public static BusinessStatusEnum getByStatus(String status) {
// 使用 STATUS_MAP 获取对应的枚举,若找不到则返回 null
return STATUS_MAP.get(status);
}
/**
* 根据状态获取对应的业务状态描述信息
*
* @param status 业务状态码
* @return 返回业务状态描述,若状态码为空或未找到对应的枚举,返回空字符串
*/
public static String findByStatus(String status) {
if (StringUtils.isBlank(status)) {
return StrUtil.EMPTY;
}
BusinessStatusEnum statusEnum = STATUS_MAP.get(status);
return (statusEnum != null) ? statusEnum.getDesc() : StrUtil.EMPTY;
}
/**
* 判断是否为指定的状态之一:草稿、已撤销或已退回
*
* @param status 要检查的状态
* @return 如果状态为草稿、已撤销或已退回之一,则返回 true否则返回 false
*/
public static boolean isDraftOrCancelOrBack(String status) {
return DRAFT.status.equals(status) || CANCEL.status.equals(status) || BACK.status.equals(status);
}
/**
* 判断是否为撤销,退回,作废,终止
*
* @param status status
* @return 结果
*/
public static boolean initialState(String status) {
return CANCEL.status.equals(status) || BACK.status.equals(status) || INVALID.status.equals(status) || TERMINATION.status.equals(status);
}
/**
* 获取运行中的实例状态列表
*
* @return 包含运行中实例状态的不可变列表
* (包含 DRAFT、WAITING、BACK 和 CANCEL 状态)
*/
public static List<String> runningStatus() {
return Arrays.asList(DRAFT.status, WAITING.status, BACK.status, CANCEL.status);
}
/**
* 获取结束实例的状态列表
*
* @return 包含结束实例状态的不可变列表
* (包含 FINISH、INVALID 和 TERMINATION 状态)
*/
public static List<String> finishStatus() {
return Arrays.asList(FINISH.status, INVALID.status, TERMINATION.status);
}
/**
* 启动流程校验
*
* @param status 状态
*/
public static void checkStartStatus(String status) {
if (WAITING.getStatus().equals(status)) {
throw new ServiceException("该单据已提交过申请,正在审批中!");
} else if (FINISH.getStatus().equals(status)) {
throw new ServiceException("该单据已完成申请!");
} else if (INVALID.getStatus().equals(status)) {
throw new ServiceException("该单据已作废!");
} else if (TERMINATION.getStatus().equals(status)) {
throw new ServiceException("该单据已终止!");
} else if (StringUtils.isBlank(status)) {
throw new ServiceException("流程状态为空!");
}
}
/**
* 撤销流程校验
*
* @param status 状态
*/
public static void checkCancelStatus(String status) {
if (CANCEL.getStatus().equals(status)) {
throw new ServiceException("该单据已撤销!");
} else if (FINISH.getStatus().equals(status)) {
throw new ServiceException("该单据已完成申请!");
} else if (INVALID.getStatus().equals(status)) {
throw new ServiceException("该单据已作废!");
} else if (TERMINATION.getStatus().equals(status)) {
throw new ServiceException("该单据已终止!");
} else if (BACK.getStatus().equals(status)) {
throw new ServiceException("该单据已退回!");
} else if (StringUtils.isBlank(status)) {
throw new ServiceException("流程状态为空!");
}
}
/**
* 驳回流程校验
*
* @param status 状态
*/
public static void checkBackStatus(String status) {
if (BACK.getStatus().equals(status)) {
throw new ServiceException("该单据已退回!");
} else if (FINISH.getStatus().equals(status)) {
throw new ServiceException("该单据已完成申请!");
} else if (INVALID.getStatus().equals(status)) {
throw new ServiceException("该单据已作废!");
} else if (TERMINATION.getStatus().equals(status)) {
throw new ServiceException("该单据已终止!");
} else if (CANCEL.getStatus().equals(status)) {
throw new ServiceException("该单据已撤销!");
} else if (StringUtils.isBlank(status)) {
throw new ServiceException("流程状态为空!");
}
}
/**
* 作废,终止流程校验
*
* @param status 状态
*/
public static void checkInvalidStatus(String status) {
if (FINISH.getStatus().equals(status)) {
throw new ServiceException("该单据已完成申请!");
} else if (INVALID.getStatus().equals(status)) {
throw new ServiceException("该单据已作废!");
} else if (TERMINATION.getStatus().equals(status)) {
throw new ServiceException("该单据已终止!");
} else if (StringUtils.isBlank(status)) {
throw new ServiceException("流程状态为空!");
}
}
}

View File

@ -5,7 +5,6 @@ import lombok.Getter;
/**
* 设备类型
* 针对一套 用户体系
*
* @author Lion Li
*/
@ -29,9 +28,12 @@ public enum DeviceType {
XCX("xcx"),
/**
* social第三方端
* 第三方社交登录平台
*/
SOCIAL("social");
/**
* 设备标识
*/
private final String device;
}

View File

@ -0,0 +1,146 @@
package org.dromara.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.dromara.common.core.utils.StringUtils;
/*
* 日期格式
* "yyyy"4位数的年份例如2023年表示为"2023"。
* "yy"2位数的年份例如2023年表示为"23"。
* "MM"2位数的月份取值范围为01到12例如7月表示为"07"。
* "M"不带前导零的月份取值范围为1到12例如7月表示为"7"。
* "dd"2位数的日期取值范围为01到31例如22日表示为"22"。
* "d"不带前导零的日期取值范围为1到31例如22日表示为"22"。
* "EEEE":星期的全名,例如:星期三表示为"Wednesday"。
* "E":星期的缩写,例如:星期三表示为"Wed"。
* "DDD" 或 "D"一年中的第几天取值范围为001到366例如第200天表示为"200"。
* 时间格式
* "HH"24小时制的小时数取值范围为00到23例如下午5点表示为"17"。
* "hh"12小时制的小时数取值范围为01到12例如下午5点表示为"05"。
* "mm"分钟数取值范围为00到59例如30分钟表示为"30"。
* "ss"秒数取值范围为00到59例如45秒表示为"45"。
* "SSS"毫秒数取值范围为000到999例如123毫秒表示为"123"。
*/
/**
* 日期格式与时间格式枚举
*/
@Getter
@AllArgsConstructor
public enum FormatsType {
/**
* 例如2023年表示为"23"
*/
YY("yy"),
/**
* 例如2023年表示为"2023"
*/
YYYY("yyyy"),
/**
* 例例如2023年7月可以表示为 "2023-07"
*/
YYYY_MM("yyyy-MM"),
/**
* 例如,日期 "2023年7月22日" 可以表示为 "2023-07-22"
*/
YYYY_MM_DD("yyyy-MM-dd"),
/**
* 例如,当前时间如果是 "2023年7月22日下午3点30分",则可以表示为 "2023-07-22 15:30"
*/
YYYY_MM_DD_HH_MM("yyyy-MM-dd HH:mm"),
/**
* 例如,当前时间如果是 "2023年7月22日下午3点30分45秒",则可以表示为 "2023-07-22 15:30:45"
*/
YYYY_MM_DD_HH_MM_SS("yyyy-MM-dd HH:mm:ss"),
/**
* 例如下午3点30分45秒表示为 "15:30:45"
*/
HH_MM_SS("HH:mm:ss"),
/**
* 例例如2023年7月可以表示为 "2023/07"
*/
YYYY_MM_SLASH("yyyy/MM"),
/**
* 例如,日期 "2023年7月22日" 可以表示为 "2023/07/22"
*/
YYYY_MM_DD_SLASH("yyyy/MM/dd"),
/**
* 例如,当前时间如果是 "2023年7月22日下午3点30分45秒",则可以表示为 "2023/07/22 15:30:45"
*/
YYYY_MM_DD_HH_MM_SLASH("yyyy/MM/dd HH:mm"),
/**
* 例如,当前时间如果是 "2023年7月22日下午3点30分45秒",则可以表示为 "2023/07/22 15:30:45"
*/
YYYY_MM_DD_HH_MM_SS_SLASH("yyyy/MM/dd HH:mm:ss"),
/**
* 例例如2023年7月可以表示为 "2023.07"
*/
YYYY_MM_DOT("yyyy.MM"),
/**
* 例如,日期 "2023年7月22日" 可以表示为 "2023.07.22"
*/
YYYY_MM_DD_DOT("yyyy.MM.dd"),
/**
* 例如,当前时间如果是 "2023年7月22日下午3点30分",则可以表示为 "2023.07.22 15:30"
*/
YYYY_MM_DD_HH_MM_DOT("yyyy.MM.dd HH:mm"),
/**
* 例如,当前时间如果是 "2023年7月22日下午3点30分45秒",则可以表示为 "2023.07.22 15:30:45"
*/
YYYY_MM_DD_HH_MM_SS_DOT("yyyy.MM.dd HH:mm:ss"),
/**
* 例如2023年7月可以表示为 "202307"
*/
YYYYMM("yyyyMM"),
/**
* 例如2023年7月22日可以表示为 "20230722"
*/
YYYYMMDD("yyyyMMdd"),
/**
* 例如2023年7月22日下午3点可以表示为 "2023072215"
*/
YYYYMMDDHH("yyyyMMddHH"),
/**
* 例如2023年7月22日下午3点30分可以表示为 "202307221530"
*/
YYYYMMDDHHMM("yyyyMMddHHmm"),
/**
* 例如2023年7月22日下午3点30分45秒可以表示为 "20230722153045"
*/
YYYYMMDDHHMMSS("yyyyMMddHHmmss");
/**
* 时间格式
*/
private final String timeFormat;
public static FormatsType getFormatsType(String str) {
for (FormatsType value : values()) {
if (StringUtils.contains(str, value.getTimeFormat())) {
return value;
}
}
throw new RuntimeException("'FormatsType' not found By " + str);
}
}

View File

@ -1,30 +0,0 @@
package org.dromara.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 用户状态
*
* @author LionLi
*/
@Getter
@AllArgsConstructor
public enum TenantStatus {
/**
* 正常
*/
OK("0", "正常"),
/**
* 停用
*/
DISABLE("1", "停用"),
/**
* 删除
*/
DELETED("2", "删除");
private final String code;
private final String info;
}

View File

@ -1,12 +1,11 @@
package org.dromara.common.core.enums;
import org.dromara.common.core.utils.StringUtils;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.dromara.common.core.utils.StringUtils;
/**
* 设备类型
* 针对多套 用户体系
* 用户类型
*
* @author Lion Li
*/
@ -15,15 +14,18 @@ import lombok.Getter;
public enum UserType {
/**
* pc端
* 后台系统用户
*/
SYS_USER("sys_user"),
/**
* app端
* 移动客户端用户
*/
APP_USER("app_user");
/**
* 用户类型标识(用于 token、权限识别等
*/
private final String userType;
public static UserType getUserType(String str) {

View File

@ -1,5 +1,6 @@
package org.dromara.common.core.exception;
import cn.hutool.core.text.StrFormatter;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -8,7 +9,7 @@ import lombok.NoArgsConstructor;
import java.io.Serial;
/**
* 业务异常
* 业务异常(支持占位符 {}
*
* @author ruoyi
*/
@ -45,8 +46,8 @@ public final class ServiceException extends RuntimeException {
this.code = code;
}
public String getDetailMessage() {
return detailMessage;
public ServiceException(String message, Object... args) {
this.message = StrFormatter.format(message, args);
}
@Override
@ -54,10 +55,6 @@ public final class ServiceException extends RuntimeException {
return message;
}
public Integer getCode() {
return code;
}
public ServiceException setMessage(String message) {
this.message = message;
return this;

View File

@ -0,0 +1,62 @@
package org.dromara.common.core.exception;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import java.io.Serial;
/**
* sse 特制异常
*
* @author LionLi
*/
@Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
public final class SseException extends RuntimeException {
@Serial
private static final long serialVersionUID = 1L;
/**
* 错误码
*/
private Integer code;
/**
* 错误提示
*/
private String message;
/**
* 错误明细,内部调试错误
*/
private String detailMessage;
public SseException(String message) {
this.message = message;
}
public SseException(String message, Integer code) {
this.message = message;
this.code = code;
}
@Override
public String getMessage() {
return message;
}
public SseException setMessage(String message) {
this.message = message;
return this;
}
public SseException setDetailMessage(String detailMessage) {
this.detailMessage = detailMessage;
return this;
}
}

View File

@ -0,0 +1,52 @@
package org.dromara.common.core.factory;
import cn.hutool.core.lang.PatternPool;
import org.dromara.common.core.constant.RegexConstants;
import java.util.regex.Pattern;
/**
* 正则表达式模式池工厂
* <p>初始化的时候将正则表达式加入缓存池当中</p>
* <p>提高正则表达式的性能,避免重复编译相同的正则表达式</p>
*
* @author 21001
*/
public class RegexPatternPoolFactory extends PatternPool {
/**
* 字典类型必须以字母开头,且只能为(小写字母,数字,下滑线)
*/
public static final Pattern DICTIONARY_TYPE = get(RegexConstants.DICTIONARY_TYPE);
/**
* 身份证号码后6位
*/
public static final Pattern ID_CARD_LAST_6 = get(RegexConstants.ID_CARD_LAST_6);
/**
* QQ号码
*/
public static final Pattern QQ_NUMBER = get(RegexConstants.QQ_NUMBER);
/**
* 邮政编码
*/
public static final Pattern POSTAL_CODE = get(RegexConstants.POSTAL_CODE);
/**
* 注册账号
*/
public static final Pattern ACCOUNT = get(RegexConstants.ACCOUNT);
/**
* 密码包含至少8个字符包括大写字母、小写字母、数字和特殊字符
*/
public static final Pattern PASSWORD = get(RegexConstants.PASSWORD);
/**
* 通用状态0表示正常1表示停用
*/
public static final Pattern STATUS = get(RegexConstants.STATUS);
}

View File

@ -1,5 +1,10 @@
package org.dromara.common.core.service;
import org.dromara.common.core.domain.dto.DeptDTO;
import java.util.List;
import java.util.Map;
/**
* 通用 部门服务
*
@ -15,4 +20,27 @@ public interface DeptService {
*/
String selectDeptNameByIds(String deptIds);
/**
* 根据部门ID查询部门负责人
*
* @param deptId 部门ID用于指定需要查询的部门
* @return 返回该部门的负责人ID
*/
Long selectDeptLeaderById(Long deptId);
/**
* 查询部门
*
* @return 部门列表
*/
List<DeptDTO> selectDeptsByList();
/**
* 根据部门 ID 列表查询部门名称映射关系
*
* @param deptIds 部门 ID 列表
* @return Map其中 key 为部门 IDvalue 为对应的部门名称
*/
Map<Long, String> selectDeptNamesByIds(List<Long> deptIds);
}

View File

@ -1,5 +1,9 @@
package org.dromara.common.core.service;
import org.dromara.common.core.domain.dto.DictDataDTO;
import org.dromara.common.core.domain.dto.DictTypeDTO;
import java.util.List;
import java.util.Map;
/**
@ -64,4 +68,20 @@ public interface DictService {
*/
Map<String, String> getAllDictByDictType(String dictType);
/**
* 根据字典类型查询详细信息
*
* @param dictType 字典类型
* @return 字典类型详细信息
*/
DictTypeDTO getDictType(String dictType);
/**
* 根据字典类型查询字典数据列表
*
* @param dictType 字典类型
* @return 字典数据列表
*/
List<DictDataDTO> getDictData(String dictType);
}

View File

@ -1,5 +1,9 @@
package org.dromara.common.core.service;
import org.dromara.common.core.domain.dto.OssDTO;
import java.util.List;
/**
* 通用 OSS服务
*
@ -15,4 +19,11 @@ public interface OssService {
*/
String selectUrlByIds(String ossIds);
/**
* 通过ossId查询列表
*
* @param ossIds ossId串逗号分隔
* @return 列表
*/
List<OssDTO> selectByIds(String ossIds);
}

View File

@ -0,0 +1,28 @@
package org.dromara.common.core.service;
import java.util.Set;
/**
* 用户权限处理
*
* @author Lion Li
*/
public interface PermissionService {
/**
* 获取角色数据权限
*
* @param userId 用户id
* @return 角色权限信息
*/
Set<String> getRolePermission(Long userId);
/**
* 获取菜单数据权限
*
* @param userId 用户id
* @return 菜单权限信息
*/
Set<String> getMenuPermission(Long userId);
}

View File

@ -0,0 +1,21 @@
package org.dromara.common.core.service;
import java.util.List;
import java.util.Map;
/**
* 通用 岗位服务
*
* @author AprilWind
*/
public interface PostService {
/**
* 根据岗位 ID 列表查询岗位名称映射关系
*
* @param postIds 岗位 ID 列表
* @return Map其中 key 为岗位 IDvalue 为对应的岗位名称
*/
Map<Long, String> selectPostNamesByIds(List<Long> postIds);
}

View File

@ -0,0 +1,21 @@
package org.dromara.common.core.service;
import java.util.List;
import java.util.Map;
/**
* 通用 角色服务
*
* @author AprilWind
*/
public interface RoleService {
/**
* 根据角色 ID 列表查询角色名称映射关系
*
* @param roleIds 角色 ID 列表
* @return Map其中 key 为角色 IDvalue 为对应的角色名称
*/
Map<Long, String> selectRoleNamesByIds(List<Long> roleIds);
}

View File

@ -0,0 +1,45 @@
package org.dromara.common.core.service;
import org.dromara.common.core.domain.dto.TaskAssigneeDTO;
import org.dromara.common.core.domain.model.TaskAssigneeBody;
/**
* 工作流设计器获取任务执行人
*
* @author Lion Li
*/
public interface TaskAssigneeService {
/**
* 查询角色并返回任务指派的列表,支持分页
*
* @param taskQuery 查询条件
* @return 办理人
*/
TaskAssigneeDTO selectRolesByTaskAssigneeList(TaskAssigneeBody taskQuery);
/**
* 查询岗位并返回任务指派的列表,支持分页
*
* @param taskQuery 查询条件
* @return 办理人
*/
TaskAssigneeDTO selectPostsByTaskAssigneeList(TaskAssigneeBody taskQuery);
/**
* 查询部门并返回任务指派的列表,支持分页
*
* @param taskQuery 查询条件
* @return 办理人
*/
TaskAssigneeDTO selectDeptsByTaskAssigneeList(TaskAssigneeBody taskQuery);
/**
* 查询用户并返回任务指派的列表,支持分页
*
* @param taskQuery 查询条件
* @return 办理人
*/
TaskAssigneeDTO selectUsersByTaskAssigneeList(TaskAssigneeBody taskQuery);
}

View File

@ -1,5 +1,10 @@
package org.dromara.common.core.service;
import org.dromara.common.core.domain.dto.UserDTO;
import java.util.List;
import java.util.Map;
/**
* 通用 用户服务
*
@ -19,8 +24,80 @@ public interface UserService {
* 通过用户ID查询用户账户
*
* @param userId 用户ID
* @return 用户账户
* @return 用户名称
*/
String selectNicknameById(Long userId);
/**
* 通过用户ID查询用户账户
*
* @param userIds 用户ID 多个用逗号隔开
* @return 用户名称
*/
String selectNicknameByIds(String userIds);
/**
* 通过用户ID查询用户手机号
*
* @param userId 用户id
* @return 用户手机号
*/
String selectPhonenumberById(Long userId);
/**
* 通过用户ID查询用户邮箱
*
* @param userId 用户id
* @return 用户邮箱
*/
String selectEmailById(Long userId);
/**
* 通过用户ID查询用户列表
*
* @param userIds 用户ids
* @return 用户列表
*/
List<UserDTO> selectListByIds(List<Long> userIds);
/**
* 通过角色ID查询用户ID
*
* @param roleIds 角色ids
* @return 用户ids
*/
List<Long> selectUserIdsByRoleIds(List<Long> roleIds);
/**
* 通过角色ID查询用户
*
* @param roleIds 角色ids
* @return 用户
*/
List<UserDTO> selectUsersByRoleIds(List<Long> roleIds);
/**
* 通过部门ID查询用户
*
* @param deptIds 部门ids
* @return 用户
*/
List<UserDTO> selectUsersByDeptIds(List<Long> deptIds);
/**
* 通过岗位ID查询用户
*
* @param postIds 岗位ids
* @return 用户
*/
List<UserDTO> selectUsersByPostIds(List<Long> postIds);
/**
* 根据用户 ID 列表查询用户名称映射关系
*
* @param userIds 用户 ID 列表
* @return Map其中 key 为用户 IDvalue 为对应的用户名称
*/
Map<Long, String> selectUserNamesByIds(List<Long> userIds);
}

View File

@ -0,0 +1,105 @@
package org.dromara.common.core.service;
import org.dromara.common.core.domain.dto.CompleteTaskDTO;
import org.dromara.common.core.domain.dto.StartProcessDTO;
import org.dromara.common.core.domain.dto.StartProcessReturnDTO;
import java.util.List;
import java.util.Map;
/**
* 通用 工作流服务
*
* @author may
*/
public interface WorkflowService {
/**
* 运行中的实例 删除程实例,删除历史记录,删除业务与流程关联信息
*
* @param businessIds 业务id
* @return 结果
*/
boolean deleteInstance(List<Long> businessIds);
/**
* 获取当前流程状态
*
* @param taskId 任务id
* @return 状态
*/
String getBusinessStatusByTaskId(Long taskId);
/**
* 获取当前流程状态
*
* @param businessId 业务id
* @return 状态
*/
String getBusinessStatus(String businessId);
/**
* 设置流程变量
*
* @param instanceId 流程实例id
* @param variable 流程变量
*/
void setVariable(Long instanceId, Map<String, Object> variable);
/**
* 获取流程变量
*
* @param instanceId 流程实例id
*/
Map<String, Object> instanceVariable(Long instanceId);
/**
* 按照业务id查询流程实例id
*
* @param businessId 业务id
* @return 结果
*/
Long getInstanceIdByBusinessId(String businessId);
/**
* 新增租户流程定义
*
* @param tenantId 租户id
*/
void syncDef(String tenantId);
/**
* 启动流程
*
* @param startProcess 参数
* @return 结果
*/
StartProcessReturnDTO startWorkFlow(StartProcessDTO startProcess);
/**
* 办理任务
* 系统后台发起审批 无用户信息 需要忽略权限
* completeTask.getVariables().put("ignore", true);
*
* @param completeTask 参数
* @return 结果
*/
boolean completeTask(CompleteTaskDTO completeTask);
/**
* 办理任务
*
* @param taskId 任务ID
* @param message 办理意见
* @return 结果
*/
boolean completeTask(Long taskId, String message);
/**
* 启动流程并办理第一个任务
*
* @param startProcess 参数
* @return 结果
*/
boolean startCompleteTask(StartProcessDTO startProcess);
}

View File

@ -1,106 +1,157 @@
package org.dromara.common.core.utils;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.dromara.common.core.enums.FormatsType;
import org.dromara.common.core.exception.ServiceException;
import java.lang.management.ManagementFactory;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.*;
import java.util.Date;
import java.util.concurrent.TimeUnit;
/**
* 时间工具类
*
* @author ruoyi
*/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
public static final String YYYY = "yyyy";
public static final String YYYY_MM = "yyyy-MM";
public static final String YYYY_MM_DD = "yyyy-MM-dd";
public static final String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
private static final String[] PARSE_PATTERNS = {
"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM",
"yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
"yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
@Deprecated
private DateUtils() {
}
/**
* 获取当前Date型日期
* 获取当前日期和时间
*
* @return Date() 当前日期
* @return 当前日期和时间的 Date 对象表示
*/
public static Date getNowDate() {
return new Date();
}
/**
* 获取当前日期, 默认格式为yyyy-MM-dd
* 获取当前日期的字符串表示格式为YYYY-MM-DD
*
* @return String
* @return 当前日期的字符串表示
*/
public static String getDate() {
return dateTimeNow(YYYY_MM_DD);
return dateTimeNow(FormatsType.YYYY_MM_DD);
}
/**
* 获取当前日期的字符串表示格式为yyyyMMdd
*
* @return 当前日期的字符串表示
*/
public static String getCurrentDate() {
return DateFormatUtils.format(new Date(), FormatsType.YYYYMMDD.getTimeFormat());
}
/**
* 获取当前日期的路径格式字符串,格式为"yyyy/MM/dd"
*
* @return 当前日期的路径格式字符串
*/
public static String datePath() {
Date now = new Date();
return DateFormatUtils.format(now, FormatsType.YYYY_MM_DD_SLASH.getTimeFormat());
}
/**
* 获取当前时间的字符串表示格式为YYYY-MM-DD HH:MM:SS
*
* @return 当前时间的字符串表示
*/
public static String getTime() {
return dateTimeNow(YYYY_MM_DD_HH_MM_SS);
return dateTimeNow(FormatsType.YYYY_MM_DD_HH_MM_SS);
}
/**
* 获取当前时间的字符串表示,格式为 "HH:MM:SS"
*
* @return 当前时间的字符串表示,格式为 "HH:MM:SS"
*/
public static String getTimeWithHourMinuteSecond() {
return dateTimeNow(FormatsType.HH_MM_SS);
}
/**
* 获取当前日期和时间的字符串表示格式为YYYYMMDDHHMMSS
*
* @return 当前日期和时间的字符串表示
*/
public static String dateTimeNow() {
return dateTimeNow(YYYYMMDDHHMMSS);
return dateTimeNow(FormatsType.YYYYMMDDHHMMSS);
}
public static String dateTimeNow(final String format) {
/**
* 获取当前日期和时间的指定格式的字符串表示
*
* @param format 日期时间格式,例如"YYYY-MM-DD HH:MM:SS"
* @return 当前日期和时间的字符串表示
*/
public static String dateTimeNow(final FormatsType format) {
return parseDateToStr(format, new Date());
}
public static String dateTime(final Date date) {
return parseDateToStr(YYYY_MM_DD, date);
/**
* 将指定日期格式化为 YYYY-MM-DD 格式的字符串
*
* @param date 要格式化的日期对象
* @return 格式化后的日期字符串
*/
public static String formatDate(final Date date) {
return parseDateToStr(FormatsType.YYYY_MM_DD, date);
}
public static String parseDateToStr(final String format, final Date date) {
return new SimpleDateFormat(format).format(date);
/**
* 将指定日期格式化为 YYYY-MM-DD HH:MM:SS 格式的字符串
*
* @param date 要格式化的日期对象
* @return 格式化后的日期时间字符串
*/
public static String formatDateTime(final Date date) {
return parseDateToStr(FormatsType.YYYY_MM_DD_HH_MM_SS, date);
}
public static Date dateTime(final String format, final String ts) {
/**
* 将指定日期按照指定格式进行格式化
*
* @param format 要使用的日期时间格式,例如"YYYY-MM-DD HH:MM:SS"
* @param date 要格式化的日期对象
* @return 格式化后的日期时间字符串
*/
public static String parseDateToStr(final FormatsType format, final Date date) {
return new SimpleDateFormat(format.getTimeFormat()).format(date);
}
/**
* 将指定格式的日期时间字符串转换为 Date 对象
*
* @param format 要解析的日期时间格式,例如"YYYY-MM-DD HH:MM:SS"
* @param ts 要解析的日期时间字符串
* @return 解析后的 Date 对象
* @throws RuntimeException 如果解析过程中发生异常
*/
public static Date parseDateTime(final FormatsType format, final String ts) {
try {
return new SimpleDateFormat(format).parse(ts);
return new SimpleDateFormat(format.getTimeFormat()).parse(ts);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
/**
* 日期路径 即年/月/日 如2018/08/08
*/
public static String datePath() {
Date now = new Date();
return DateFormatUtils.format(now, "yyyy/MM/dd");
}
/**
* 日期路径 即年/月/日 如20180808
*/
public static String dateTime() {
Date now = new Date();
return DateFormatUtils.format(now, "yyyyMMdd");
}
/**
* 日期型字符串转化为日期 格式
* 将对象转换为日期对象
*
* @param str 要转换的对象,通常是字符串
* @return 转换后的日期对象如果转换失败或输入为null则返回null
*/
public static Date parseDate(Object str) {
if (str == null) {
@ -115,6 +166,8 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
/**
* 获取服务器启动时间
*
* @return 服务器启动时间的 Date 对象表示
*/
public static Date getServerStartDate() {
long time = ManagementFactory.getRuntimeMXBean().getStartTime();
@ -122,35 +175,79 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
}
/**
* 计算相差天数
* 计算两个时间之间的时间差,并以指定单位返回(绝对值)
*
* @param start 起始时间
* @param end 结束时间
* @param unit 所需返回的时间单位DAYS、HOURS、MINUTES、SECONDS、MILLISECONDS、MICROSECONDS、NANOSECONDS
* @return 时间差的绝对值,以指定单位表示
*/
public static int differentDaysByMillisecond(Date date1, Date date2) {
return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24)));
public static long difference(Date start, Date end, TimeUnit unit) {
// 计算时间差,单位为毫秒,取绝对值避免负数
long diffInMillis = Math.abs(end.getTime() - start.getTime());
// 根据目标单位转换时间差
return switch (unit) {
case DAYS -> diffInMillis / TimeUnit.DAYS.toMillis(1);
case HOURS -> diffInMillis / TimeUnit.HOURS.toMillis(1);
case MINUTES -> diffInMillis / TimeUnit.MINUTES.toMillis(1);
case SECONDS -> diffInMillis / TimeUnit.SECONDS.toMillis(1);
case MILLISECONDS -> diffInMillis;
case MICROSECONDS -> TimeUnit.MILLISECONDS.toMicros(diffInMillis);
case NANOSECONDS -> TimeUnit.MILLISECONDS.toNanos(diffInMillis);
};
}
/**
* 计算两个时间差
* 计算两个日期之间的时间差,并以天、小时和分钟的格式返回
*
* @param endDate 结束日期
* @param nowDate 当前日期
* @return 表示时间差的字符串,格式为"天 小时 分钟"
*/
public static String getDatePoor(Date endDate, Date nowDate) {
long nd = 1000 * 24 * 60 * 60;
long nh = 1000 * 60 * 60;
long nm = 1000 * 60;
// long ns = 1000;
// 获得两个时间的毫秒时间差异
long diff = endDate.getTime() - nowDate.getTime();
// 计算差多少天
long day = diff / nd;
// 计算差多少小时
long hour = diff % nd / nh;
// 计算差多少分钟
long min = diff % nd % nh / nm;
// 计算差多少秒//输出结果
// long sec = diff % nd % nh % nm / ns;
return day + "" + hour + "小时" + min + "分钟";
long diffInMillis = endDate.getTime() - nowDate.getTime();
long day = TimeUnit.MILLISECONDS.toDays(diffInMillis);
long hour = TimeUnit.MILLISECONDS.toHours(diffInMillis) % 24;
long min = TimeUnit.MILLISECONDS.toMinutes(diffInMillis) % 60;
return String.format("%d天 %d小时 %d分钟", day, hour, min);
}
/**
* 增加 LocalDateTime ==> Date
* 计算两个时间点的差值天、小时、分钟、秒当值为0时不显示该单位
*
* @param endDate 结束时间
* @param nowDate 当前时间
* @return 时间差字符串,格式为 "x天 x小时 x分钟 x秒",若为 0 则不显示
*/
public static String getTimeDifference(Date endDate, Date nowDate) {
long diffInMillis = endDate.getTime() - nowDate.getTime();
long day = TimeUnit.MILLISECONDS.toDays(diffInMillis);
long hour = TimeUnit.MILLISECONDS.toHours(diffInMillis) % 24;
long min = TimeUnit.MILLISECONDS.toMinutes(diffInMillis) % 60;
long sec = TimeUnit.MILLISECONDS.toSeconds(diffInMillis) % 60;
// 构建时间差字符串条件是值不为0才显示
StringBuilder result = new StringBuilder();
if (day > 0) {
result.append(String.format("%d天 ", day));
}
if (hour > 0) {
result.append(String.format("%d小时 ", hour));
}
if (min > 0) {
result.append(String.format("%d分钟 ", min));
}
if (sec > 0) {
result.append(String.format("%d秒", sec));
}
return result.length() > 0 ? result.toString().trim() : "0秒";
}
/**
* 将 LocalDateTime 对象转换为 Date 对象
*
* @param temporalAccessor 要转换的 LocalDateTime 对象
* @return 转换后的 Date 对象
*/
public static Date toDate(LocalDateTime temporalAccessor) {
ZonedDateTime zdt = temporalAccessor.atZone(ZoneId.systemDefault());
@ -158,11 +255,46 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
}
/**
* 增加 LocalDate ==> Date
* LocalDate 对象转换为 Date 对象
*
* @param temporalAccessor 要转换的 LocalDate 对象
* @return 转换后的 Date 对象
*/
public static Date toDate(LocalDate temporalAccessor) {
LocalDateTime localDateTime = LocalDateTime.of(temporalAccessor, LocalTime.of(0, 0, 0));
ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault());
return Date.from(zdt.toInstant());
}
/**
* 校验日期范围
*
* @param startDate 开始日期
* @param endDate 结束日期
* @param maxValue 最大时间跨度的限制值
* @param unit 时间跨度的单位,可选择 "DAYS"、"HOURS" 或 "MINUTES"
*/
public static void validateDateRange(Date startDate, Date endDate, int maxValue, TimeUnit unit) {
// 校验结束日期不能早于开始日期
if (endDate.before(startDate)) {
throw new ServiceException("结束日期不能早于开始日期");
}
// 计算时间跨度
long diffInMillis = endDate.getTime() - startDate.getTime();
// 根据单位转换时间跨度
long diff = switch (unit) {
case DAYS -> TimeUnit.MILLISECONDS.toDays(diffInMillis);
case HOURS -> TimeUnit.MILLISECONDS.toHours(diffInMillis);
case MINUTES -> TimeUnit.MILLISECONDS.toMinutes(diffInMillis);
default -> throw new IllegalArgumentException("不支持的时间单位");
};
// 校验时间跨度不超过最大限制
if (diff > maxValue) {
throw new ServiceException("最大时间跨度为 {} {}", maxValue, unit.toString().toLowerCase());
}
}
}

View File

@ -0,0 +1,84 @@
package org.dromara.common.core.utils;
import cn.hutool.core.lang.PatternPool;
import cn.hutool.core.net.NetUtil;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.utils.regex.RegexUtils;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.UnknownHostException;
/**
* 增强网络相关工具类
*
* @author 秋辞未寒
*/
@Slf4j
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class NetUtils extends NetUtil {
/**
* 判断是否为IPv6地址
*
* @param ip IP地址
* @return 是否为IPv6地址
*/
public static boolean isIPv6(String ip) {
try {
// 判断是否为IPv6地址
return InetAddress.getByName(ip) instanceof Inet6Address;
} catch (UnknownHostException e) {
return false;
}
}
/**
* 判断IPv6地址是否为内网地址
* <br><br>
* 以下地址将归类为本地地址,如有业务场景有需要,请根据需求自行处理:
* <pre>
* 通配符地址 0:0:0:0:0:0:0:0
* 链路本地地址 fe80::/10
* 唯一本地地址 fec0::/10
* 环回地址 ::1
* </pre>
*
* @param ip IP地址
* @return 是否为内网地址
*/
public static boolean isInnerIPv6(String ip) {
try {
// 判断是否为IPv6地址
if (InetAddress.getByName(ip) instanceof Inet6Address inet6Address) {
// isAnyLocalAddress 判断是否为通配符地址,通常不会将其视为内网地址,根据业务场景自行处理判断
// isLinkLocalAddress 判断是否为链路本地地址,通常不算内网地址,是否划分归属于内网需要根据业务场景自行处理判断
// isLoopbackAddress 判断是否为环回地址与IPv4的 127.0.0.1 同理,用于表示本机
// isSiteLocalAddress 判断是否为本地站点地址IPv6唯一本地地址Unique Local Addresses简称ULA
if (inet6Address.isAnyLocalAddress()
|| inet6Address.isLinkLocalAddress()
|| inet6Address.isLoopbackAddress()
|| inet6Address.isSiteLocalAddress()) {
return true;
}
}
} catch (UnknownHostException e) {
// 注意isInnerIPv6方法和isIPv6方法的适用范围不同所以此处不能忽略其异常信息。
throw new IllegalArgumentException("Invalid IPv6 address!", e);
}
return false;
}
/**
* 判断是否为IPv4地址
*
* @param ip IP地址
* @return 是否为IPv4地址
*/
public static boolean isIPv4(String ip) {
return RegexUtils.isMatch(PatternPool.IPV4, ip);
}
}

View File

@ -0,0 +1,60 @@
package org.dromara.common.core.utils;
import cn.hutool.core.util.ObjectUtil;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import java.util.function.Function;
/**
* 对象工具类
*
* @author 秋辞未寒
*/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class ObjectUtils extends ObjectUtil {
/**
* 如果对象不为空,则获取对象中的某个字段 ObjectUtils.notNullGetter(user, User::getName);
*
* @param obj 对象
* @param func 获取方法
* @return 对象字段
*/
public static <T, E> E notNullGetter(T obj, Function<T, E> func) {
if (isNotNull(obj) && isNotNull(func)) {
return func.apply(obj);
}
return null;
}
/**
* 如果对象不为空,则获取对象中的某个字段,否则返回默认值
*
* @param obj 对象
* @param func 获取方法
* @param defaultValue 默认值
* @return 对象字段
*/
public static <T, E> E notNullGetter(T obj, Function<T, E> func, E defaultValue) {
if (isNotNull(obj) && isNotNull(func)) {
return func.apply(obj);
}
return defaultValue;
}
/**
* 如果值不为空,则返回值,否则返回默认值
*
* @param obj 对象
* @param defaultValue 默认值
* @return 对象字段
*/
public static <T> T notNull(T obj, T defaultValue) {
if (isNotNull(obj)) {
return obj;
}
return defaultValue;
}
}

View File

@ -25,7 +25,7 @@ import java.util.HashMap;
import java.util.Map;
/**
* 客户端工具类
* 客户端工具类,提供获取请求参数、响应处理、头部信息等常用操作
*
* @author ruoyi
*/
@ -33,52 +33,73 @@ import java.util.Map;
public class ServletUtils extends JakartaServletUtil {
/**
* 获取String参数
* 获取指定名称的 String 类型的请求参数
*
* @param name 参数名
* @return 参数值
*/
public static String getParameter(String name) {
return getRequest().getParameter(name);
}
/**
* 获取String参数
* 获取指定名称的 String 类型的请求参数,若参数不存在,则返回默认值
*
* @param name 参数名
* @param defaultValue 默认值
* @return 参数值或默认值
*/
public static String getParameter(String name, String defaultValue) {
return Convert.toStr(getRequest().getParameter(name), defaultValue);
}
/**
* 获取Integer参数
* 获取指定名称的 Integer 类型的请求参数
*
* @param name 参数名
* @return 参数值
*/
public static Integer getParameterToInt(String name) {
return Convert.toInt(getRequest().getParameter(name));
}
/**
* 获取Integer参数
* 获取指定名称的 Integer 类型的请求参数,若参数不存在,则返回默认值
*
* @param name 参数名
* @param defaultValue 默认值
* @return 参数值或默认值
*/
public static Integer getParameterToInt(String name, Integer defaultValue) {
return Convert.toInt(getRequest().getParameter(name), defaultValue);
}
/**
* 获取Boolean参数
* 获取指定名称的 Boolean 类型的请求参数
*
* @param name 参数名
* @return 参数值
*/
public static Boolean getParameterToBool(String name) {
return Convert.toBool(getRequest().getParameter(name));
}
/**
* 获取Boolean参数
* 获取指定名称的 Boolean 类型的请求参数,若参数不存在,则返回默认值
*
* @param name 参数名
* @param defaultValue 默认值
* @return 参数值或默认值
*/
public static Boolean getParameterToBool(String name, Boolean defaultValue) {
return Convert.toBool(getRequest().getParameter(name), defaultValue);
}
/**
* 获所有请求参数
* 获所有请求参数(以 Map 的形式返回)
*
* @param request 请求对象{@link ServletRequest}
* @return Map
* @return 请求参数的 Map键为参数名值为参数值数组
*/
public static Map<String, String[]> getParams(ServletRequest request) {
final Map<String, String[]> map = request.getParameterMap();
@ -86,21 +107,23 @@ public class ServletUtils extends JakartaServletUtil {
}
/**
* 获所有请求参数
* 获所有请求参数(以 Map 的形式返回,值为字符串形式的拼接)
*
* @param request 请求对象{@link ServletRequest}
* @return Map
* @return 请求参数的 Map键为参数名值为拼接后的字符串
*/
public static Map<String, String> getParamMap(ServletRequest request) {
Map<String, String> params = new HashMap<>();
for (Map.Entry<String, String[]> entry : getParams(request).entrySet()) {
params.put(entry.getKey(), StringUtils.join(entry.getValue(), StringUtils.SEPARATOR));
params.put(entry.getKey(), StringUtils.joinComma(entry.getValue()));
}
return params;
}
/**
* 获取request
* 获取当前 HTTP 请求对象
*
* @return 当前 HTTP 请求对象
*/
public static HttpServletRequest getRequest() {
try {
@ -111,7 +134,9 @@ public class ServletUtils extends JakartaServletUtil {
}
/**
* 获取response
* 获取当前 HTTP 响应对象
*
* @return 当前 HTTP 响应对象
*/
public static HttpServletResponse getResponse() {
try {
@ -122,12 +147,25 @@ public class ServletUtils extends JakartaServletUtil {
}
/**
* 获取session
* 获取当前请求的 HttpSession 对象
* <p>
* 如果当前请求已经关联了一个会话(即已经存在有效的 session ID
* 则返回该会话对象;如果没有关联会话,则会创建一个新的会话对象并返回。
* <p>
* HttpSession 用于存储会话级别的数据,如用户登录信息、购物车内容等,
* 可以在多个请求之间共享会话数据
*
* @return 当前请求的 HttpSession 对象
*/
public static HttpSession getSession() {
return getRequest().getSession();
}
/**
* 获取当前请求的请求属性
*
* @return {@link ServletRequestAttributes} 请求属性对象
*/
public static ServletRequestAttributes getRequestAttributes() {
try {
RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
@ -137,6 +175,13 @@ public class ServletUtils extends JakartaServletUtil {
}
}
/**
* 获取指定请求头的值,如果头部为空则返回空字符串
*
* @param request 请求对象
* @param name 头部名称
* @return 头部值
*/
public static String getHeader(HttpServletRequest request, String name) {
String value = request.getHeader(name);
if (StringUtils.isEmpty(value)) {
@ -145,6 +190,12 @@ public class ServletUtils extends JakartaServletUtil {
return urlDecode(value);
}
/**
* 获取所有请求头的 Map键为头部名称值为头部值
*
* @param request 请求对象
* @return 请求头的 Map
*/
public static Map<String, String> getHeaders(HttpServletRequest request) {
Map<String, String> map = new LinkedCaseInsensitiveMap<>();
Enumeration<String> enumeration = request.getHeaderNames();
@ -159,7 +210,7 @@ public class ServletUtils extends JakartaServletUtil {
}
/**
* 将字符串渲染到客户端
* 将字符串渲染到客户端(以 JSON 格式返回)
*
* @param response 渲染对象
* @param string 待渲染的字符串
@ -176,37 +227,47 @@ public class ServletUtils extends JakartaServletUtil {
}
/**
* 是否是Ajax异步请求
* 判断当前请求是否为 Ajax 异步请求
*
* @param request
* @param request 请求对象
* @return 是否为 Ajax 请求
*/
public static boolean isAjaxRequest(HttpServletRequest request) {
// 判断 Accept 头部是否包含 application/json
String accept = request.getHeader("accept");
if (accept != null && accept.contains(MediaType.APPLICATION_JSON_VALUE)) {
return true;
}
// 判断 X-Requested-With 头部是否包含 XMLHttpRequest
String xRequestedWith = request.getHeader("X-Requested-With");
if (xRequestedWith != null && xRequestedWith.contains("XMLHttpRequest")) {
return true;
}
// 判断 URI 后缀是否为 .json 或 .xml
String uri = request.getRequestURI();
if (StringUtils.equalsAnyIgnoreCase(uri, ".json", ".xml")) {
return true;
}
// 判断请求参数 __ajax 是否为 json 或 xml
String ajax = request.getParameter("__ajax");
return StringUtils.equalsAnyIgnoreCase(ajax, "json", "xml");
}
/**
* 获取客户端 IP 地址
*
* @return 客户端 IP 地址
*/
public static String getClientIP() {
return getClientIP(getRequest());
}
/**
* 内容编码
* 内容进行 URL 编码
*
* @param str 内容
* @return 编码后的内容
@ -216,7 +277,7 @@ public class ServletUtils extends JakartaServletUtil {
}
/**
* 内容解码
* 内容进行 URL 解码
*
* @param str 内容
* @return 解码后的内容

View File

@ -1,9 +1,10 @@
package org.dromara.common.core.utils;
import cn.hutool.extra.spring.SpringUtil;
import org.springframework.aop.framework.AopContext;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.boot.autoconfigure.thread.Threading;
import org.springframework.context.ApplicationContext;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
/**
@ -48,7 +49,7 @@ public final class SpringUtils extends SpringUtil {
*/
@SuppressWarnings("unchecked")
public static <T> T getAopProxy(T invoker) {
return (T) AopContext.currentProxy();
return (T) getBean(invoker.getClass());
}
@ -59,4 +60,8 @@ public final class SpringUtils extends SpringUtil {
return getApplicationContext();
}
public static boolean isVirtual() {
return Threading.VIRTUAL.isActive(getBean(Environment.class));
}
}

View File

@ -30,8 +30,64 @@ public class StreamUtils {
if (CollUtil.isEmpty(collection)) {
return CollUtil.newArrayList();
}
// 注意此处不要使用 .toList() 新语法 因为返回的是不可变List 会导致序列化问题
return collection.stream().filter(function).collect(Collectors.toList());
return collection.stream()
.filter(function)
// 注意此处不要使用 .toList() 新语法 因为返回的是不可变List 会导致序列化问题
.collect(Collectors.toList());
}
/**
* 找到流中满足条件的第一个元素
*
* @param collection 需要查询的集合
* @param function 过滤方法
* @return 找到符合条件的第一个元素,没有则返回 Optional.empty()
*/
public static <E> Optional<E> findFirst(Collection<E> collection, Predicate<E> function) {
if (CollUtil.isEmpty(collection)) {
return Optional.empty();
}
return collection.stream()
.filter(function)
.findFirst();
}
/**
* 找到流中满足条件的第一个元素值
*
* @param collection 需要查询的集合
* @param function 过滤方法
* @return 找到符合条件的第一个元素,没有则返回 null
*/
public static <E> E findFirstValue(Collection<E> collection, Predicate<E> function) {
return findFirst(collection,function).orElse(null);
}
/**
* 找到流中任意一个满足条件的元素
*
* @param collection 需要查询的集合
* @param function 过滤方法
* @return 找到符合条件的任意一个元素,没有则返回 Optional.empty()
*/
public static <E> Optional<E> findAny(Collection<E> collection, Predicate<E> function) {
if (CollUtil.isEmpty(collection)) {
return Optional.empty();
}
return collection.stream()
.filter(function)
.findAny();
}
/**
* 找到流中任意一个满足条件的元素值
*
* @param collection 需要查询的集合
* @param function 过滤方法
* @return 找到符合条件的任意一个元素没有则返回null
*/
public static <E> E findAnyValue(Collection<E> collection, Predicate<E> function) {
return findAny(collection,function).orElse(null);
}
/**
@ -57,7 +113,10 @@ public class StreamUtils {
if (CollUtil.isEmpty(collection)) {
return StringUtils.EMPTY;
}
return collection.stream().map(function).filter(Objects::nonNull).collect(Collectors.joining(delimiter));
return collection.stream()
.map(function)
.filter(Objects::nonNull)
.collect(Collectors.joining(delimiter));
}
/**
@ -71,8 +130,11 @@ public class StreamUtils {
if (CollUtil.isEmpty(collection)) {
return CollUtil.newArrayList();
}
// 注意此处不要使用 .toList() 新语法 因为返回的是不可变List 会导致序列化问题
return collection.stream().filter(Objects::nonNull).sorted(comparing).collect(Collectors.toList());
return collection.stream()
.filter(Objects::nonNull)
.sorted(comparing)
// 注意此处不要使用 .toList() 新语法 因为返回的是不可变List 会导致序列化问题
.collect(Collectors.toList());
}
/**
@ -89,7 +151,9 @@ public class StreamUtils {
if (CollUtil.isEmpty(collection)) {
return MapUtil.newHashMap();
}
return collection.stream().filter(Objects::nonNull).collect(Collectors.toMap(key, Function.identity(), (l, r) -> l));
return collection.stream()
.filter(Objects::nonNull)
.collect(Collectors.toMap(key, Function.identity(), (l, r) -> l));
}
/**
@ -108,7 +172,25 @@ public class StreamUtils {
if (CollUtil.isEmpty(collection)) {
return MapUtil.newHashMap();
}
return collection.stream().filter(Objects::nonNull).collect(Collectors.toMap(key, value, (l, r) -> l));
return collection.stream()
.filter(Objects::nonNull)
.collect(Collectors.toMap(key, value, (l, r) -> l));
}
/**
* 获取 map 中的数据作为新 Map 的 value key 不变
* @param map 需要处理的map
* @param take 取值函数
* @param <K> map中的key类型
* @param <E> map中的value类型
* @param <V> 新map中的value类型
* @return 新的map
*/
public static <K, E, V> Map<K, V> toMap(Map<K, E> map, BiFunction<K, E, V> take) {
if (CollUtil.isEmpty(map)) {
return MapUtil.newHashMap();
}
return toMap(map.entrySet(), Map.Entry::getKey, entry -> take.apply(entry.getKey(), entry.getValue()));
}
/**
@ -125,8 +207,8 @@ public class StreamUtils {
if (CollUtil.isEmpty(collection)) {
return MapUtil.newHashMap();
}
return collection
.stream().filter(Objects::nonNull)
return collection.stream()
.filter(Objects::nonNull)
.collect(Collectors.groupingBy(key, LinkedHashMap::new, Collectors.toList()));
}
@ -146,8 +228,8 @@ public class StreamUtils {
if (CollUtil.isEmpty(collection)) {
return MapUtil.newHashMap();
}
return collection
.stream().filter(Objects::nonNull)
return collection.stream()
.filter(Objects::nonNull)
.collect(Collectors.groupingBy(key1, LinkedHashMap::new, Collectors.groupingBy(key2, LinkedHashMap::new, Collectors.toList())));
}
@ -164,11 +246,11 @@ public class StreamUtils {
* @return 分类后的map
*/
public static <E, T, U> Map<T, Map<U, E>> group2Map(Collection<E> collection, Function<E, T> key1, Function<E, U> key2) {
if (CollUtil.isEmpty(collection) || key1 == null || key2 == null) {
if (CollUtil.isEmpty(collection)) {
return MapUtil.newHashMap();
}
return collection
.stream().filter(Objects::nonNull)
return collection.stream()
.filter(Objects::nonNull)
.collect(Collectors.groupingBy(key1, LinkedHashMap::new, Collectors.toMap(key2, Function.identity(), (l, r) -> l)));
}
@ -186,8 +268,7 @@ public class StreamUtils {
if (CollUtil.isEmpty(collection)) {
return CollUtil.newArrayList();
}
return collection
.stream()
return collection.stream()
.map(function)
.filter(Objects::nonNull)
// 注意此处不要使用 .toList() 新语法 因为返回的是不可变List 会导致序列化问题
@ -205,11 +286,10 @@ public class StreamUtils {
* @return 转化后的Set
*/
public static <E, T> Set<T> toSet(Collection<E> collection, Function<E, T> function) {
if (CollUtil.isEmpty(collection) || function == null) {
if (CollUtil.isEmpty(collection)) {
return CollUtil.newHashSet();
}
return collection
.stream()
return collection.stream()
.map(function)
.filter(Objects::nonNull)
.collect(Collectors.toSet());
@ -229,26 +309,20 @@ public class StreamUtils {
* @return 合并后的map
*/
public static <K, X, Y, V> Map<K, V> merge(Map<K, X> map1, Map<K, Y> map2, BiFunction<X, Y, V> merge) {
if (MapUtil.isEmpty(map1) && MapUtil.isEmpty(map2)) {
if (CollUtil.isEmpty(map1) && CollUtil.isEmpty(map2)) {
// 如果两个 map 都为空,则直接返回空的 map
return MapUtil.newHashMap();
} else if (MapUtil.isEmpty(map1)) {
map1 = MapUtil.newHashMap();
} else if (MapUtil.isEmpty(map2)) {
map2 = MapUtil.newHashMap();
} else if (CollUtil.isEmpty(map1)) {
// 如果 map1 为空,则直接处理返回 map2
return toMap(map2.entrySet(), Map.Entry::getKey, entry -> merge.apply(null, entry.getValue()));
} else if (CollUtil.isEmpty(map2)) {
// 如果 map2 为空,则直接处理返回 map1
return toMap(map1.entrySet(), Map.Entry::getKey, entry -> merge.apply(entry.getValue(), null));
}
Set<K> key = new HashSet<>();
key.addAll(map1.keySet());
key.addAll(map2.keySet());
Map<K, V> map = new HashMap<>();
for (K t : key) {
X x = map1.get(t);
Y y = map2.get(t);
V z = merge.apply(x, y);
if (z != null) {
map.put(t, z);
}
}
return map;
Set<K> keySet = new HashSet<>();
keySet.addAll(map1.keySet());
keySet.addAll(map2.keySet());
return toMap(keySet, key -> key, key -> merge.apply(map1.get(key), map2.get(key)));
}
}

View File

@ -4,10 +4,9 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.lang.Validator;
import cn.hutool.core.util.StrUtil;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.springframework.util.AntPathMatcher;
import java.nio.charset.Charset;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
@ -17,11 +16,16 @@ import java.util.stream.Collectors;
*
* @author Lion Li
*/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class StringUtils extends org.apache.commons.lang3.StringUtils {
public static final String SEPARATOR = ",";
public static final String SLASH = "/";
@Deprecated
private StringUtils() {
}
/**
* 获取参数不为空值
*
@ -256,13 +260,13 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils {
if (s != null) {
final int len = s.length();
if (s.length() <= size) {
sb.append(String.valueOf(c).repeat(size - len));
sb.append(Convert.toStr(c).repeat(size - len));
sb.append(s);
} else {
return s.substring(len - size, len);
}
} else {
sb.append(String.valueOf(c).repeat(Math.max(0, size)));
sb.append(Convert.toStr(c).repeat(Math.max(0, size)));
}
return sb.toString();
}
@ -315,7 +319,66 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils {
.stream()
.filter(Objects::nonNull)
.map(mapper)
.filter(Objects::nonNull)
.collect(Collectors.toList());
}
/**
* 不区分大小写检查 CharSequence 是否以指定的前缀开头。
*
* @param str 要检查的 CharSequence 可能为 null
* @param prefixs 要查找的前缀可能为 null
* @return 是否包含
*/
public static boolean startWithAnyIgnoreCase(CharSequence str, CharSequence... prefixs) {
// 判断是否是以指定字符串开头
for (CharSequence prefix : prefixs) {
if (StringUtils.startsWithIgnoreCase(str, prefix)) {
return true;
}
}
return false;
}
/**
* 将字符串从源字符集转换为目标字符集
*
* @param input 原始字符串
* @param fromCharset 源字符集
* @param toCharset 目标字符集
* @return 转换后的字符串
*/
public static String convert(String input, Charset fromCharset, Charset toCharset) {
if (isBlank(input)) {
return input;
}
try {
// 从源字符集获取字节
byte[] bytes = input.getBytes(fromCharset);
// 使用目标字符集解码
return new String(bytes, toCharset);
} catch (Exception e) {
return input;
}
}
/**
* 将可迭代对象中的元素使用逗号拼接成字符串
*
* @param iterable 可迭代对象,如 List、Set 等
* @return 拼接后的字符串
*/
public static String joinComma(Iterable<?> iterable) {
return StringUtils.join(iterable, SEPARATOR);
}
/**
* 将数组中的元素使用逗号拼接成字符串
*
* @param array 任意类型的数组
* @return 拼接后的字符串
*/
public static String joinComma(Object[] array) {
return StringUtils.join(array, SEPARATOR);
}
}

View File

@ -14,18 +14,6 @@ import java.util.concurrent.*;
@Slf4j
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class Threads {
/**
* sleep等待,单位为毫秒
*/
public static void sleep(long milliseconds) {
try {
Thread.sleep(milliseconds);
} catch (InterruptedException e) {
return;
}
}
/**
* 停止线程池
* 先使用shutdown, 停止接收新任务并尝试完成所有已存在任务.

View File

@ -5,11 +5,15 @@ import cn.hutool.core.lang.tree.Tree;
import cn.hutool.core.lang.tree.TreeNodeConfig;
import cn.hutool.core.lang.tree.TreeUtil;
import cn.hutool.core.lang.tree.parser.NodeParser;
import org.dromara.common.core.utils.reflect.ReflectUtils;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.dromara.common.core.utils.reflect.ReflectUtils;
import java.util.List;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* 扩展 hutool TreeUtil 封装系统树构建
@ -24,12 +28,96 @@ public class TreeBuildUtils extends TreeUtil {
*/
public static final TreeNodeConfig DEFAULT_CONFIG = TreeNodeConfig.DEFAULT_CONFIG.setNameKey("label");
/**
* 构建树形结构
*
* @param <T> 输入节点的类型
* @param <K> 节点ID的类型
* @param list 节点列表,其中包含了要构建树形结构的所有节点
* @param nodeParser 解析器,用于将输入节点转换为树节点
* @return 构建好的树形结构列表
*/
public static <T, K> List<Tree<K>> build(List<T> list, NodeParser<T, K> nodeParser) {
if (CollUtil.isEmpty(list)) {
return null;
return CollUtil.newArrayList();
}
K k = ReflectUtils.invokeGetter(list.get(0), "parentId");
return TreeUtil.build(list, k, DEFAULT_CONFIG, nodeParser);
}
/**
* 构建树形结构
*
* @param <T> 输入节点的类型
* @param <K> 节点ID的类型
* @param parentId 顶级节点
* @param list 节点列表,其中包含了要构建树形结构的所有节点
* @param nodeParser 解析器,用于将输入节点转换为树节点
* @return 构建好的树形结构列表
*/
public static <T, K> List<Tree<K>> build(List<T> list, K parentId, NodeParser<T, K> nodeParser) {
if (CollUtil.isEmpty(list)) {
return CollUtil.newArrayList();
}
return TreeUtil.build(list, parentId, DEFAULT_CONFIG, nodeParser);
}
/**
* 构建多根节点的树结构(支持多个顶级节点)
*
* @param list 原始数据列表
* @param getId 获取节点 ID 的方法引用例如node -> node.getId()
* @param getParentId 获取节点父级 ID 的方法引用例如node -> node.getParentId()
* @param parser 树节点属性映射器,用于将原始节点 T 转为 Tree 节点
* @param <T> 原始数据类型如实体类、DTO 等)
* @param <K> 节点 ID 类型(如 Long、String
* @return 构建完成的树形结构(可能包含多个顶级根节点)
*/
public static <T, K> List<Tree<K>> buildMultiRoot(List<T> list, Function<T, K> getId, Function<T, K> getParentId, NodeParser<T, K> parser) {
if (CollUtil.isEmpty(list)) {
return CollUtil.newArrayList();
}
Set<K> rootParentIds = StreamUtils.toSet(list, getParentId);
rootParentIds.removeAll(StreamUtils.toSet(list, getId));
// 构建每一个根 parentId 下的树,并合并成最终结果列表
return rootParentIds.stream()
.flatMap(rootParentId -> TreeUtil.build(list, rootParentId, parser).stream())
.collect(Collectors.toList());
}
/**
* 获取节点列表中所有节点的叶子节点
*
* @param <K> 节点ID的类型
* @param nodes 节点列表
* @return 包含所有叶子节点的列表
*/
public static <K> List<Tree<K>> getLeafNodes(List<Tree<K>> nodes) {
if (CollUtil.isEmpty(nodes)) {
return CollUtil.newArrayList();
}
return nodes.stream()
.flatMap(TreeBuildUtils::extractLeafNodes)
.collect(Collectors.toList());
}
/**
* 获取指定节点下的所有叶子节点
*
* @param <K> 节点ID的类型
* @param node 要查找叶子节点的根节点
* @return 包含所有叶子节点的列表
*/
private static <K> Stream<Tree<K>> extractLeafNodes(Tree<K> node) {
if (!node.hasChild()) {
return Stream.of(node);
} else {
// 递归调用,获取所有子节点的叶子节点
return node.getChildren().stream()
.flatMap(TreeBuildUtils::extractLeafNodes);
}
}
}

View File

@ -1,11 +1,11 @@
package org.dromara.common.core.utils;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import jakarta.validation.ConstraintViolation;
import jakarta.validation.ConstraintViolationException;
import jakarta.validation.Validator;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import java.util.Set;
/**
@ -18,6 +18,13 @@ public class ValidatorUtils {
private static final Validator VALID = SpringUtils.getBean(Validator.class);
/**
* 对给定对象进行参数校验,并根据指定的校验组进行校验
*
* @param object 要进行校验的对象
* @param groups 校验组
* @throws ConstraintViolationException 如果校验不通过,则抛出参数校验异常
*/
public static <T> void validate(T object, Class<?>... groups) {
Set<ConstraintViolation<T>> validate = VALID.validate(object, groups);
if (!validate.isEmpty()) {

View File

@ -1,11 +1,11 @@
package org.dromara.common.core.utils.ip;
import cn.hutool.core.net.NetUtil;
import cn.hutool.http.HtmlUtil;
import org.dromara.common.core.utils.StringUtils;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.utils.NetUtils;
import org.dromara.common.core.utils.StringUtils;
/**
* 获取地址类
@ -16,18 +16,55 @@ import lombok.extern.slf4j.Slf4j;
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class AddressUtils {
// 未知IP
public static final String UNKNOWN_IP = "XX XX";
// 内网地址
public static final String LOCAL_ADDRESS = "内网IP";
// 未知地址
public static final String UNKNOWN = "XX XX";
public static final String UNKNOWN_ADDRESS = "未知";
public static String getRealAddressByIP(String ip) {
if (StringUtils.isBlank(ip)) {
return UNKNOWN;
// 处理空串并过滤HTML标签
ip = HtmlUtil.cleanHtmlTag(StringUtils.blankToDefault(ip,""));
// 判断是否为IPv4
if (NetUtils.isIPv4(ip)) {
return resolverIPv4Region(ip);
}
// 判断是否为IPv6
if (NetUtils.isIPv6(ip)) {
return resolverIPv6Region(ip);
}
// 如果不是IPv4或IPv6则返回未知IP
return UNKNOWN_IP;
}
/**
* 根据IPv4地址查询IP归属行政区域
* @param ip ipv4地址
* @return 归属行政区域
*/
private static String resolverIPv4Region(String ip){
// 内网不查询
ip = StringUtils.contains(ip, "0:0:0:0:0:0:0:1") ? "127.0.0.1" : HtmlUtil.cleanHtmlTag(ip);
if (NetUtil.isInnerIP(ip)) {
return "内网IP";
if (NetUtils.isInnerIP(ip)) {
return LOCAL_ADDRESS;
}
return RegionUtils.getCityInfo(ip);
}
/**
* 根据IPv6地址查询IP归属行政区域
* @param ip ipv6地址
* @return 归属行政区域
*/
private static String resolverIPv6Region(String ip){
// 内网不查询
if (NetUtils.isInnerIPv6(ip)) {
return LOCAL_ADDRESS;
}
log.warn("ip2region不支持IPV6地址解析{}", ip);
// 不支持IPv6不再进行没有必要的IP地址信息的解析直接返回
// 如有需要可自行实现IPv6地址信息解析逻辑并在这里返回
return UNKNOWN_ADDRESS;
}
}

View File

@ -1,15 +1,12 @@
package org.dromara.common.core.utils.ip;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.resource.ClassPathResource;
import cn.hutool.core.util.ObjectUtil;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.file.FileUtils;
import cn.hutool.core.io.resource.NoResourceException;
import cn.hutool.core.io.resource.ResourceUtil;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.StringUtils;
import org.lionsoul.ip2region.xdb.Searcher;
import java.io.File;
/**
* 根据ip地址定位工具类离线方式
* 参考地址:<a href="https://gitee.com/lionsoul/ip2region/tree/master/binding/java">集成 ip2region 实现离线IP地址定位库</a>
@ -19,31 +16,19 @@ import java.io.File;
@Slf4j
public class RegionUtils {
// IP地址库文件名称
public static final String IP_XDB_FILENAME = "ip2region.xdb";
private static final Searcher SEARCHER;
static {
String fileName = "/ip2region.xdb";
File existFile = FileUtils.file(FileUtil.getTmpDir() + FileUtil.FILE_SEPARATOR + fileName);
if (!FileUtils.exist(existFile)) {
ClassPathResource fileStream = new ClassPathResource(fileName);
if (ObjectUtil.isEmpty(fileStream.getStream())) {
throw new ServiceException("RegionUtils初始化失败原因IP地址库数据不存在");
}
FileUtils.writeFromStream(fileStream.getStream(), existFile);
}
String dbPath = existFile.getPath();
// 1、从 dbPath 加载整个 xdb 到内存。
byte[] cBuff;
try {
cBuff = Searcher.loadContentFromFile(dbPath);
} catch (Exception e) {
throw new ServiceException("RegionUtils初始化失败原因从ip2region.xdb文件加载内容失败" + e.getMessage());
}
// 2、使用上述的 cBuff 创建一个完全基于内存的查询对象。
try {
SEARCHER = Searcher.newWithBuffer(cBuff);
// 1、将 ip2region 数据库文件 xdb 从 ClassPath 加载到内存。
// 2、基于加载到内存的 xdb 数据创建一个 Searcher 查询对象。
SEARCHER = Searcher.newWithBuffer(ResourceUtil.readBytes(IP_XDB_FILENAME));
log.info("RegionUtils初始化成功加载IP地址库数据成功");
} catch (NoResourceException e) {
throw new ServiceException("RegionUtils初始化失败原因IP地址库数据不存在");
} catch (Exception e) {
throw new ServiceException("RegionUtils初始化失败原因" + e.getMessage());
}
@ -54,9 +39,8 @@ public class RegionUtils {
*/
public static String getCityInfo(String ip) {
try {
ip = ip.trim();
// 3、执行查询
String region = SEARCHER.search(ip);
String region = SEARCHER.search(StringUtils.trim(ip));
return region.replace("0|", "").replace("|0", "");
} catch (Exception e) {
log.error("IP地址离线获取城市异常 {}", ip);

View File

@ -0,0 +1,31 @@
package org.dromara.common.core.utils.regex;
import cn.hutool.core.util.ReUtil;
import org.dromara.common.core.constant.RegexConstants;
/**
* 正则相关工具类
*
* @author Feng
*/
public final class RegexUtils extends ReUtil {
/**
* 从输入字符串中提取匹配的部分,如果没有匹配则返回默认值
*
* @param input 要提取的输入字符串
* @param regex 用于匹配的正则表达式,可以使用 {@link RegexConstants} 中定义的常量
* @param defaultInput 如果没有匹配时返回的默认值
* @return 如果找到匹配的部分,则返回匹配的部分,否则返回默认值
*/
public static String extractFromString(String input, String regex, String defaultInput) {
try {
String str = ReUtil.get(regex, input, 1);
return str == null ? defaultInput : str;
} catch (Exception e) {
return defaultInput;
}
}
}

View File

@ -0,0 +1,105 @@
package org.dromara.common.core.utils.regex;
import cn.hutool.core.exceptions.ValidateException;
import cn.hutool.core.lang.Validator;
import org.dromara.common.core.factory.RegexPatternPoolFactory;
import java.util.regex.Pattern;
/**
* 正则字段校验器
* 主要验证字段非空、是否为满足指定格式等
*
* @author Feng
*/
public class RegexValidator extends Validator {
/**
* 字典类型必须以字母开头,且只能为(小写字母,数字,下滑线)
*/
public static final Pattern DICTIONARY_TYPE = RegexPatternPoolFactory.DICTIONARY_TYPE;
/**
* 身份证号码后6位
*/
public static final Pattern ID_CARD_LAST_6 = RegexPatternPoolFactory.ID_CARD_LAST_6;
/**
* QQ号码
*/
public static final Pattern QQ_NUMBER = RegexPatternPoolFactory.QQ_NUMBER;
/**
* 邮政编码
*/
public static final Pattern POSTAL_CODE = RegexPatternPoolFactory.POSTAL_CODE;
/**
* 注册账号
*/
public static final Pattern ACCOUNT = RegexPatternPoolFactory.ACCOUNT;
/**
* 密码包含至少8个字符包括大写字母、小写字母、数字和特殊字符
*/
public static final Pattern PASSWORD = RegexPatternPoolFactory.PASSWORD;
/**
* 通用状态0表示正常1表示停用
*/
public static final Pattern STATUS = RegexPatternPoolFactory.STATUS;
/**
* 检查输入的账号是否匹配预定义的规则
*
* @param value 要验证的账号
* @return 如果账号符合规则,返回 true否则返回 false。
*/
public static boolean isAccount(CharSequence value) {
return isMatchRegex(ACCOUNT, value);
}
/**
* 验证输入的账号是否符合规则,如果不符合,则抛出 ValidateException 异常
*
* @param value 要验证的账号
* @param errorMsg 验证失败时抛出的异常消息
* @param <T> CharSequence 的子类型
* @return 如果验证通过,返回输入的账号
* @throws ValidateException 如果验证失败
*/
public static <T extends CharSequence> T validateAccount(T value, String errorMsg) throws ValidateException {
if (!isAccount(value)) {
throw new ValidateException(errorMsg);
}
return value;
}
/**
* 检查输入的状态是否匹配预定义的规则
*
* @param value 要验证的状态
* @return 如果状态符合规则,返回 true否则返回 false。
*/
public static boolean isStatus(CharSequence value) {
return isMatchRegex(STATUS, value);
}
/**
* 验证输入的状态是否符合规则,如果不符合,则抛出 ValidateException 异常
*
* @param value 要验证的状态
* @param errorMsg 验证失败时抛出的异常消息
* @param <T> CharSequence 的子类型
* @return 如果验证通过,返回输入的状态
* @throws ValidateException 如果验证失败
*/
public static <T extends CharSequence> T validateStatus(T value, String errorMsg) throws ValidateException {
if (!isStatus(value)) {
throw new ValidateException(errorMsg);
}
return value;
}
}

View File

@ -15,7 +15,7 @@ public class SqlUtil {
/**
* 定义常用的 sql关键字
*/
public static final String SQL_REGEX = "select |insert |delete |update |drop |count |exec |chr |mid |master |truncate |char |and |declare ";
public static String SQL_REGEX = "\u000B|and |extractvalue|updatexml|sleep|exec |insert |select |delete |update |drop |count |chr |mid |master |truncate |char |declare |or |union |like |+|/*|user()";
/**
* 仅支持字母、数字、下划线、空格、逗号、小数点(支持多个字段排序)

View File

@ -0,0 +1,40 @@
package org.dromara.common.core.validate.dicts;
import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 字典项校验注解
*
* @author AprilWind
*/
@Constraint(validatedBy = DictPatternValidator.class)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface DictPattern {
/**
* 字典类型,如 "sys_user_sex"
*/
String dictType();
/**
* 分隔符
*/
String separator();
/**
* 默认校验失败提示信息
*/
String message() default "字典值无效";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}

View File

@ -0,0 +1,55 @@
package org.dromara.common.core.validate.dicts;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
import org.dromara.common.core.service.DictService;
import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.core.utils.StringUtils;
/**
* 自定义字典值校验器
*
* @author AprilWind
*/
public class DictPatternValidator implements ConstraintValidator<DictPattern, String> {
/**
* 字典类型
*/
private String dictType;
/**
* 分隔符
*/
private String separator = ",";
/**
* 初始化校验器,提取注解上的字典类型
*
* @param annotation 注解实例
*/
@Override
public void initialize(DictPattern annotation) {
this.dictType = annotation.dictType();
if (StringUtils.isNotBlank(annotation.separator())) {
this.separator = annotation.separator();
}
}
/**
* 校验字段值是否为指定字典类型中的合法值
*
* @param value 被校验的字段值
* @param context 校验上下文(可用于构建错误信息)
* @return true 表示校验通过合法字典值false 表示不通过
*/
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (StringUtils.isBlank(dictType) || StringUtils.isBlank(value)) {
return false;
}
String dictLabel = SpringUtils.getBean(DictService.class).getDictLabel(dictType, value, separator);
return StringUtils.isNotBlank(dictLabel);
}
}

View File

@ -0,0 +1,48 @@
package org.dromara.common.core.validate.enumd;
import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
/**
* 自定义枚举校验
*
* @author 秋辞未寒
* @date 2024-12-09
*/
@Documented
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Retention(RUNTIME)
@Repeatable(EnumPattern.List.class) // 允许在同一元素上多次使用该注解
@Constraint(validatedBy = {EnumPatternValidator.class})
public @interface EnumPattern {
/**
* 需要校验的枚举类型
*/
Class<? extends Enum<?>> type();
/**
* 枚举类型校验值字段名称
* 需确保该字段实现了 getter 方法
*/
String fieldName();
String message() default "输入值不在枚举范围内";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
@Documented
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Retention(RUNTIME)
@interface List {
EnumPattern[] value();
}
}

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