Compare commits

..

652 Commits

Author SHA1 Message Date
YunaiV
15ba083de2 删除更新日志,统一合并到 https://doc.iocoder.cn 开发手册 2022-03-10 13:06:26 +08:00
YunaiV
9a9dbf0e97 移除 Security 无用的 secret 配置项 2022-03-10 00:39:43 +08:00
芋道源码
3c3919545a !91 修复正常租户登陆后退出切换到过期租户时造成的tenant.ignore-urls配置失效的问题,比如无法获取验证码图片造成无法登录。
Merge pull request !91 from 清溪先生/master
2022-03-09 10:27:15 +00:00
Awen
2980c6e3eb 修复正常租户登陆后退出切换到过期租户时造成的tenant.ignore-urls配置失效的问题,比如无法获取验证码图片等造成无法登录。 2022-03-09 14:55:54 +08:00
YunaiV
09cb5b6433 Merge remote-tracking branch 'origin/master' 2022-03-09 08:26:25 +08:00
芋道源码
90390dfdfa Merge pull request #103 from HFwas/hfwas
fix://修复导入数据报错
2022-03-09 08:23:48 +08:00
芋道源码
d1b6534886 !90 fix #I4WXMQ 请求地址url错误
Merge pull request !90 from xingyu/master
2022-03-08 15:37:54 +00:00
xingyu4j
972b386d93 URL错误 2022-03-08 22:01:48 +08:00
YunaiV
fc4b677b00 增加一些多租户相关的注释,更加清晰一些~ 2022-03-08 10:09:27 +08:00
YunaiV
5c03b97775 增加一些多租户相关的注释,更加清晰一些~ 2022-03-08 00:23:53 +08:00
HFwas
500f0a72ce fix://修复导入数据报错 2022-03-07 23:59:21 +08:00
芋道源码
73e30a4f37 !87 fix #I4W3DK fix #I4VUR0
Merge pull request !87 from 感觉/N/A
2022-03-06 15:03:10 +00:00
YunaiV
120cbc9123 修改版本号为 1.6.0,准备 Flowable 工作流发版! 2022-03-06 15:04:53 +08:00
YunaiV
e5b711409c 修改版本号为 1.6.0,准备 Flowable 工作流发版! 2022-03-06 09:46:24 +08:00
芋道源码
69b93ca75a !88 工作流新增 Flowable 实现
Merge pull request !88 from 芋道源码/feature/flowable
2022-03-05 09:02:45 +00:00
YunaiV
6489047a7d Merge branch 'master' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into feature/flowable 2022-03-05 17:01:31 +08:00
感觉
1c6a77806b fix #I4W3DK fix #I4VUR0 2022-03-04 01:00:06 +00:00
YunaiV
cd919daf64 调整 yudao-module-system 的枚举包 2022-03-04 00:19:19 +08:00
YunaiV
d2636a7787 调整 DataScopeEnum 到 yudao-module-system-api 包下,合理~ 2022-03-03 13:12:52 +08:00
芋道源码
f3e0ca27d9 !85 修改vue-element-admin错误链接
Merge pull request !85 from 感觉/N/A
2022-03-01 05:52:43 +00:00
感觉
e2a9b2d3e5 修改错误链接 2022-03-01 05:42:47 +00:00
YunaiV
3201288036 review flowable 的代码实现,测试通过 2022-02-28 00:58:11 +08:00
YunaiV
b845d62e8b Merge branch 'master' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into feature/flowable
 Conflicts:
	sql/ruoyi-vue-pro.sql
2022-02-27 23:56:23 +08:00
YunaiV
bf37095259 v.1.5.1 发布,优化多租户功能,支持自动创建用户、角色等信息 2022-02-27 16:31:56 +08:00
YunaiV
5d90760c39 v.1.5.1 发布,优化多租户功能,支持自动创建用户、角色等信息 2022-02-27 16:28:43 +08:00
YunaiV
882660a3a7 Merge branch 'master' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into feature/flowable 2022-02-27 13:47:34 +08:00
YunaiV
e90fc607f0 v.1.5.1 发布,优化多租户功能,支持自动创建用户、角色等信息 2022-02-27 13:45:21 +08:00
YunaiV
ec8b356ba6 v.1.5.1 发布,优化多租户功能,支持自动创建用户、角色等信息 2022-02-27 13:40:10 +08:00
YunaiV
c61811a622 【修复】角色的数据范围为仅本人时,登陆后获取权限列表报错的问题 2022-02-27 12:24:21 +08:00
芋道源码
a49b1431e5 Merge pull request #91 from zzc7211/master
[Github Action]修复项目CI脚本构建失败问题
2022-02-27 03:04:23 +08:00
芋道源码
2af0e40fe7 !84 租户优化
Merge pull request !84 from 芋道源码/feature/tenant_op
2022-02-26 18:44:39 +00:00
YunaiV
f63d4e20b9 同步最新版本的 SQL 脚本 2022-02-27 02:43:25 +08:00
YunaiV
2505d61b08 Swagger 增加 tenant-id 头 2022-02-27 02:40:24 +08:00
YunaiV
fc509837a1 Merge branch 'master' of https://github.com/YunaiV/ruoyi-vue-pro into feature/tenant_op
 Conflicts:
	yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/mapper/BaseMapperX.java
2022-02-27 02:13:06 +08:00
YunaiV
66d6825657 * 【升级】spring-boot from 2.5.9 to 2.5.10
* 【升级】mybatis-plus from 3.4.3.4 to 3.5.1
2022-02-27 01:48:13 +08:00
YunaiV
c58eb12896 修复所有单元测试 2022-02-27 01:38:28 +08:00
YunaiV
81d89ba350 增加租户、租户套餐的单元测试 2022-02-27 00:15:13 +08:00
zhouzichun
0cbf35f7f0 Revert "core-js: ^3.21.1"
This reverts commit 4a86bd23d8.
2022-02-26 17:40:15 +08:00
zhouzichun
4a86bd23d8 core-js: ^3.21.1 2022-02-26 17:10:17 +08:00
zhouzichun
41cdc951e1 [Github Action]修复项目CI脚本构建失败问题
1.更改构建包管理工具为yarn
2.由于缓存的需要添加yarn.lock文件
3.删除没有用到的依赖javax.xml.bind.Element

更新core-js版本至最新后,前后端都能编译成功
2022-02-26 17:07:27 +08:00
YunaiV
66ebb71b8a Redis 最低版本 5.0.0 检测,解决搭建环境过程中无法理解 XREADGROUP 指令的报错 2022-02-26 00:41:27 +08:00
YunaiV
c64bb81cae 解决 spring.sql.init.schema-locations 不自动初始化,通过自定义的 SqlInitializationTestConfiguration 实现 2022-02-26 00:03:41 +08:00
芋道源码
e52d7d33be Merge pull request #82 from leosanqing/optimize-baseMapper
修改 baseMapper selectCount int -> long
2022-02-25 13:51:50 +08:00
芋道源码
19cb2b69f1 !83 更新core-js版本至最新,解决yudao-ui-admin启动时报错问题
Merge pull request !83 from tmjAccount/master
2022-02-24 16:08:26 +00:00
佟明键
80cdfbf36e 1. 更新core-js版本至最新,解决yudao-ui-admin启动时报错问题 2022-02-25 00:01:03 +08:00
YunaiV
10ba70e107 错误码存在重复的问题 2022-02-24 01:14:39 +08:00
YunaiV
75928525ca 1. 增加【默认】的系统租户的概念,禁止修改与删除等操作
2. 修复定时任务在刷新本地缓存时,会过滤租户的问题
3. 调整短信的回调地址,并进行租户的白名单
2022-02-24 00:53:28 +08:00
YunaiV
fa62ace6af 【修复】修复不支持根部门的问题 2022-02-23 22:36:45 +08:00
YunaiV
95bb9744c1 新建角色的时候,不允许创建 ADMIN 标识的角色 2022-02-23 19:28:59 +08:00
YunaiV
848fcdf329 租户创建人数的限制 2022-02-23 19:08:45 +08:00
YunaiV
d10b4595a2 租户修改角色的权限时,增加租户套餐的过滤,避免越权! 2022-02-23 13:19:08 +08:00
YunaiV
e4be51b14a 1. 新建租户、修改租户、修改租户套餐时,自动修改角色的权限
2. 租户的本地缓存,提升访问性能
3. 精简本地缓存的实现逻辑
2022-02-23 00:38:49 +08:00
YunaiV
4d53944771 【新增】新增 @TenantIgnore 注解,标记指定方法,忽略多租户的自动过滤,适合实现跨租户的逻辑 2022-02-22 19:53:40 +08:00
芋道源码
124576005a update README.md. 2022-02-21 04:53:00 +00:00
芋道源码
7c42632a50 update README.md. 2022-02-21 04:52:25 +00:00
芋道源码
40e52c3856 update README.md. 2022-02-21 04:52:00 +00:00
芋道源码
feeaac729c update README.md. 2022-02-21 04:50:45 +00:00
YunaiV
2598c033a9 【新增】【优化】新建租户时,自动创建对应的管理员账号、角色等基础信息 2022-02-20 23:59:23 +08:00
YunaiV
6b6d676a6b 【新增】租户套餐的管理,可配置每个租户的可使用的功能 2022-02-20 12:24:47 +08:00
YunaiV
79311ecc71 * 【新增】后端 yudao.tenant.enable 配置项,前端 VUE_APP_TENANT_ENABLE 配置项,用于开关租户功能
* 【优化】调整默认所有表开启多租户的特性,可通过 `yudao.tenant.ignore-tables` 配置项进行忽略,替代原本默认不开启的策略
* 【新增】通过 `yudao.tenant.ignore-urls` 配置忽略多租户的请求,例如说 ,例如说短信回调、支付回调等 Open API
2022-02-20 00:33:12 +08:00
YunaiV
27c30279a1 增加严肃声明:现在、未来都不会有商业版本! 2022-02-19 12:35:28 +08:00
jason
d8d81e835f 合并 master 分支, 修改导入流程bug 2022-02-18 12:03:45 +08:00
leosanqing
72d18b056b 修改 baseMapper selectCount int -> long
Mybatis Plus 在3.4 版本之后将 selectCount 从Integer 改为Long
2022-02-18 11:27:42 +08:00
jason
1f08a2725e 工作流 Flowable 分配leader 审批脚本 数据权限问题 2022-02-18 09:35:59 +08:00
jason
e01acfb18e 工作流 Flowable 任务自定义 Script 脚本 相关实现 2022-02-18 09:35:57 +08:00
jason
41e4283f99 工作流 Flowable 转办任务的实现 2022-02-18 09:35:54 +08:00
jason
c1884c3196 工作流 Flowable 通过任务,拒绝任务 实现 2022-02-18 09:35:49 +08:00
jason
d30bf0601c 工作流 Flowable 取消流程实例实现 2022-02-18 09:35:48 +08:00
jason
075dd83b5f 工作流 Flowable 流程实例, 用户任务相关实现 2022-02-18 09:35:47 +08:00
jason
d6775a5619 工作流 Flowable 发起流程, 用户任务相关实现 2022-02-18 09:35:44 +08:00
jason
073d860a78 工作流 Flowable 发起流程 相关实现 2022-02-18 09:35:40 +08:00
jason
c761f5258a 工作流 Flowable 流程实例 相关实现 2022-02-18 09:35:35 +08:00
jason
d64555697f 工作流 Flowable 流程模型, 流程定义 优化 2022-02-18 09:35:33 +08:00
jason
b1d6baaad8 工作流 Flowable 发布流程, 删除模型 的实现 2022-02-18 09:35:26 +08:00
jason
d6a6a01252 工作流 Flowable 发布流程的部分实现 2022-02-18 09:35:23 +08:00
jason
a207412e8c 工作流 Flowable 流程模型接口 部分实现 2022-02-18 09:34:58 +08:00
jason
9c452ee612 工作流 Flowable 流程模型 接口 2022-02-18 09:34:49 +08:00
YunaiV
167baed952 1.5.0 版本准备发布,修改更新日志 2022-02-17 21:09:11 +08:00
YunaiV
8dc40224cc Merge remote-tracking branch 'origin/master' 2022-02-17 20:59:31 +08:00
YunaiV
252b218c42 修复在线用户分页错误 2022-02-17 20:55:59 +08:00
芋道源码
9be08aae63 !80 bug-fix(用户管理)
Merge pull request !80 from fengdan/fengdan-feature-usermanage:add-fix
2022-02-17 12:51:55 +00:00
YunaiV
121fd0652d 1.5.0 版本准备发布,同步最新的 SQL 2022-02-17 20:18:40 +08:00
YunaiV
9882142a46 修复 yudao-module-system-impl 的单元测试 2022-02-17 19:52:11 +08:00
YunaiV
822f4e8192 v3.8.2 修复分页组件请求两次问题(I4SQOR) 2022-02-17 19:23:50 +08:00
YunaiV
4efb6c0847 v3.8.2 修复自定义组件file-upload无法显示第一个文件,列表显示的文件比实际文件少一个的问题 2022-02-17 19:19:29 +08:00
YunaiV
8eba07c736 v3.8.2 update .gitignore. 2022-02-17 19:18:23 +08:00
YunaiV
9a9f7058ae v3.8.2 fix css class name 2022-02-17 19:17:32 +08:00
YunaiV
bcceac5df2 v3.8.1 预览组件支持多图显示 2022-02-17 19:10:16 +08:00
YunaiV
38614abe76 v3.8.1 代码生成新增Java类型Boolean 2022-02-17 19:08:11 +08:00
YunaiV
f56450c6b7 v3.8.1 修复登录失效后多次请求提示多次弹窗问题 2022-02-17 19:05:06 +08:00
YunaiV
f7268e7ce4 v3.8.1 新增使用Gzip解压缩静态文件地址 2022-02-17 18:34:59 +08:00
YunaiV
fe552aedcd v3.8.1 集成compression-webpack-plugin插件实现打包Gzip压缩 2022-02-17 18:33:39 +08:00
YunaiV
a3e8ee2b41 v3.8.1 新增图片预览组件 2022-02-17 18:19:52 +08:00
YunaiV
7d367c367c v3.8.1 修复打包后字体图标偶现的乱码问题 2022-02-17 18:18:42 +08:00
YunaiV
9724a522e9 v3.8.0 代码生成预览支持复制内容 2022-02-17 18:13:27 +08:00
YunaiV
ca4290204c v3.8.0 自定义文字复制剪贴指令 2022-02-17 15:32:36 +08:00
YunaiV
fff6fedcfa v3.8.0 升级clipboard到最新版本2.0.8 2022-02-17 15:31:24 +08:00
YunaiV
1bebd5ef8e v3.8.0 升级js-cookie到最新版本3.0.1 2022-02-17 15:26:22 +08:00
YunaiV
8e0415a8fe v3.8.0 新增tab对象简化页签操作 2022-02-17 15:21:46 +08:00
YunaiV
5036971f55 v3.8.0 升级axios到最新版本0.24.0 2022-02-17 15:09:05 +08:00
fengdan
d3c5906cfa fix(用户管理): 新增用户数据校验问题
新增用户:用户账号参数校验

Closes https://gitee.com/zhijiantianya/ruoyi-vue-pro/issues/I4U1XU
2022-02-17 14:38:59 +08:00
YunaiV
cfd8cd57cf v3.8.0 新增认证对象简化权限验证 2022-02-17 14:33:52 +08:00
YunaiV
fad3a030e9 v3.8.0 修复五级以上菜单404问题 2022-02-17 14:31:09 +08:00
YunaiV
02a0ab6d6d v3.8.0 新增通用方法简化下载使用 2022-02-17 14:28:43 +08:00
YunaiV
fee6d00ecf v3.8.0 升级dart-sass到版本1.32.13、升级file-saver到最新版本2.0.5、升级sass-loader到最新版本10.1.1 2022-02-17 13:44:57 +08:00
YunaiV
b72aa7b268 v3.8.0 新增通用方法简化模态/缓存使用 2022-02-17 13:16:26 +08:00
YunaiV
38ac5270d6 v3.8.0 新增通用方法简化模态/缓存使用 2022-02-17 13:11:21 +08:00
YunaiV
433056d5ea v3.8.0 Cron表达式生成器关闭时销毁,避免再次打开时存在上一次修改的数据 2022-02-17 11:44:22 +08:00
YunaiV
250c56f90c v3.8.0 禁用DictTag中el-tag渐变动画 2022-02-17 11:41:04 +08:00
YunaiV
c0380aaf6a v3.7.0 复多图组件验证失败被删除问题 2022-02-17 11:35:52 +08:00
YunaiV
eda8418797 v3.7.0 优化提示 2022-02-17 11:34:58 +08:00
YunaiV
69dba93ae5 v3.7.0 页签新增关闭左侧 2022-02-17 11:32:32 +08:00
YunaiV
3d09088029 v3.7.0 页签右键按钮添加图标 2022-02-17 11:31:25 +08:00
YunaiV
1b2dc570de v3.7.0 菜单&部门新增展开/折叠功能 2022-02-17 11:30:31 +08:00
YunaiV
f564137f05 v3.7.0 新增暗色菜单风格主题 2022-02-17 09:48:39 +08:00
YunaiV
63900da8c2 v3.7.0 修复保存配置主题颜色失效问题 2022-02-17 09:39:37 +08:00
YunaiV
170c0dbcfc v3.7.0 自定义弹层溢出滚动样式 2022-02-17 09:37:37 +08:00
YunaiV
9626b5e971 v3.7.0 定时任务支持在线生成cron表达式 2022-02-17 09:34:55 +08:00
YunaiV
e1e749d8a4 v3.7.0 验证码默认20s超时(请求) 2022-02-17 09:23:08 +08:00
YunaiV
5856c93035 v3.7.0 修复带utc日期格式 yyyy-MM-dd'T'HH:mm:ss.SSS 在safari浏览器中无法正确格式化的问题 2022-02-17 09:21:32 +08:00
YunaiV
f749b9db06 v3.7.0 自定义可拖动弹窗高度指令 2022-02-17 09:20:22 +08:00
YunaiV
5e959d310a v3.7.0 自定义可拖动弹窗宽度指令 2022-02-17 09:19:13 +08:00
YunaiV
c414e0eb62 v3.7.0 删掉此处代码,使右边栏动画生效。现在是没有动画的 2022-02-17 01:39:14 +08:00
YunaiV
2ce2287146 v3.7.0 更新到【默认首页使用keep-alive缓存】后报错 2022-02-17 01:36:32 +08:00
YunaiV
9edf88b37a v3.7.0 默认首页使用keep-alive缓存 2022-02-17 01:34:38 +08:00
YunaiV
7e31efcfe2 v3.7.0 防止错误token导致的解析异常 2022-02-17 01:30:08 +08:00
YunaiV
ab420e4120 v3.7.0 跳转路由高亮相对应的菜单栏 2022-02-17 01:28:52 +08:00
YunaiV
7b7f285034 v3.7.0 升级element-ui到最新版本2.15.3 2022-02-17 01:13:48 +08:00
YunaiV
46056a16b4 v3.7.0 密码框新增显示切换密码图标 2022-02-17 00:58:31 +08:00
YunaiV
f34f28f576 v3.7.0 导入用户样式调整 2022-02-17 00:56:50 +08:00
YunaiV
f1f602c131 v3.7.0 顶部菜单样式调整 2022-02-17 00:53:44 +08:00
YunaiV
f736e0a1c4 v3.7.0 更多操作按钮添加权限控制 2022-02-17 00:53:03 +08:00
YunaiV
969f9d0327 v3.7.0 富文本新增上传文件大小限制 2022-02-17 00:50:22 +08:00
YunaiV
2579e8549e v3.7.0 顶部菜单排除隐藏的默认路由 2022-02-17 00:49:46 +08:00
YunaiV
ba74c587b7 v3.7.0 code=401时request方法没有返回Promise.reject 修复 2022-02-17 00:48:24 +08:00
YunaiV
fc3aa2047c v3.7.0 定时任务新增更多操作 2022-02-17 00:46:18 +08:00
YunaiV
ec378d75de v3.7.0 参数管理支持配置验证码开关 2022-02-17 00:20:08 +08:00
YunaiV
e03a1a8bb3 v3.7.0 图片上传 - 多图时无法删除相应图片修复 2022-02-16 22:10:15 +08:00
YunaiV
78fe38d687 v3.6.0 完成~ 2022-02-16 22:05:13 +08:00
YunaiV
a6b70491e3 v3.6.0 富文本默认上传返回url类型 2022-02-16 22:02:21 +08:00
YunaiV
8b31b65ac1 v3.6.0 自定义弹窗拖拽指令 2022-02-16 22:01:37 +08:00
YunaiV
bc400cf646 v3.6.0 ImageUpload组件支持多图片上传 2022-02-16 21:41:08 +08:00
YunaiV
4f5964f287 v3.6.0 文件上传组件添加数量限制属性 2022-02-16 21:38:04 +08:00
YunaiV
3cb7aba37e v3.6.0 富文本编辑组件添加类型属性 2022-02-16 21:35:07 +08:00
YunaiV
c844c7ef19 v3.6.0 FileUpload组件支持多文件上传 2022-02-16 21:34:17 +08:00
YunaiV
b267b2c347 v3.6.0 增加字典标签样式回显 2022-02-16 19:42:21 +08:00
YunaiV
08a35704e9 v3.6.0 增加字典标签样式回显 2022-02-16 13:27:17 +08:00
YunaiV
986d1328e0 v3.6.0 增加字典标签样式回显 2022-02-16 01:31:14 +08:00
YunaiV
4a8129bffa v3.6.0 封装iframe组件 2022-02-15 22:24:48 +08:00
YunaiV
833ac54a2f v3.6.0 分页组件新增pagerCount属性 2022-02-15 22:11:58 +08:00
YunaiV
7bf9a85263 v3.5.0 系统布局配置支持动态标题开关 2022-02-15 22:08:40 +08:00
YunaiV
7df42db2e2 v3.5.0 富文本工具栏配置视频 2022-02-15 21:53:12 +08:00
YunaiV
e3c31c353a v3.5.0 修复关闭confirm提示框控制台报错问题 2022-02-15 21:51:24 +08:00
YunaiV
c06a96b768 v3.5.0 新增IE浏览器版本过低提示页面 2022-02-15 21:32:14 +08:00
YunaiV
e7d0024eb0 v3.5.0 导出按钮点击之后添加遮罩 2022-02-15 21:28:11 +08:00
YunaiV
d44d4da428 v3.5.0 update ruoyi-ui/src/assets/styles/element-ui.scss. 2022-02-15 20:58:26 +08:00
YunaiV
471175b406 v3.5.0 修复开启TopNav后,左侧打开外链问题 2022-02-15 20:50:28 +08:00
YunaiV
62cc1206f7 v3.5.0 主题颜色保存配置 2022-02-15 20:47:15 +08:00
YunaiV
a7a98d153c v3.5.0 过滤BindingResult对象,防止异常 2022-02-15 20:43:53 +08:00
YunaiV
41c6aa9147 v3.5.0 兼容顶部栏一级菜单内部跳转 2022-02-15 20:42:41 +08:00
YunaiV
63b7ee096a v3.5.0 固定顶部导航栏&窗口大小改变实时更新栏数 2022-02-15 20:40:59 +08:00
YunaiV
cff4391f2d v3.5.0 布局设置支持保存&重置配置 2022-02-15 20:39:21 +08:00
YunaiV
a7feb9279f v3.5.0 富文本编辑器支持自定义上传地址 2022-02-15 20:32:31 +08:00
YunaiV
4bf5b04d54 v3.5.0 新增菜单导航显示风格TopNav(false为左侧导航菜单,true为顶部导航菜单) 2022-02-15 20:27:53 +08:00
YunaiV
c5fad966d2 v3.5.0 页签新增关闭右侧 2022-02-15 20:11:10 +08:00
YunaiV
1cc2e09185 v3.5.0 富文本编辑器自定义上传地址 2022-02-15 20:08:20 +08:00
YunaiV
1467ab6530 v3.5.0 修改主题后mini类型按钮无效问题 2022-02-15 20:06:50 +08:00
YunaiV
3ac2b9973c v3.5.0 fix:RepeatedlyRequestWrapper.ServletInputStream 实现available方法 2022-02-15 20:03:34 +08:00
YunaiV
053007ef9e v3.5.0 显隐列初始默认隐藏列 2022-02-15 20:00:34 +08:00
YunaiV
33d8dbef45 v3.5.0 update ruoyi-ui/src/views/system/user/profile/userAvatar.vue. 修改头像,截图支持取消 2022-02-15 19:59:01 +08:00
YunaiV
30f160446e v3.5.0 删除多余的代码 2022-02-15 19:53:44 +08:00
YunaiV
4f770b24a4 v3.5.0 富文本编辑组件支持只读 2022-02-15 19:50:07 +08:00
YunaiV
bc41aa70d1 v3.4.0 修复四级菜单无法显示问题 2022-02-15 19:44:15 +08:00
YunaiV
f540c8a37c v3.4.0 用户显隐列添加不同key防止被复用 2022-02-15 19:31:33 +08:00
YunaiV
20e34e35a3 v3.4.0 表格右侧工具栏组件支持显隐列 2022-02-15 19:28:04 +08:00
YunaiV
cfcc2c6762 v3.4.0 修复IE11浏览器报错问题 2022-02-15 19:08:39 +08:00
YunaiV
fe0886d122 v3.4.0 Update copyright 2022-02-15 19:01:26 +08:00
YunaiV
de4df784ea v3.4.0 操作按钮组调整为朴素按钮样式 2022-02-15 18:59:22 +08:00
芋道源码
b1d42becc3 !79 修复 根据角色id查询用户id的bug
Merge pull request !79 from zyk492322922/master
2022-02-15 10:38:35 +00:00
zyk492322922
878a0ef638 ## 修复 根据角色查询用户id的bug 2022-02-15 08:49:01 +00:00
YunaiV
c0bebb7755 Merge branch 'master' of https://github.com/YunaiV/ruoyi-vue-pro 2022-02-15 12:50:31 +08:00
YunaiV
32ccb8bd84 优化 README 说明 2022-02-15 12:50:05 +08:00
YunaiV
4c169cbc58 【新增】兼容 Node 16 版本,通过升级 BPMN-JS 相关库 2022-02-12 17:55:28 +08:00
YunaiV
0d1a8c627b Merge remote-tracking branch 'origin/master' 2022-02-12 00:28:27 +08:00
YunaiV
5dcf763f08 修复缺少 user_type 导致的单元测试错误 2022-02-12 00:28:21 +08:00
芋道源码
fcbb99941c Merge pull request #67 from zzc7211/master
[build]github Action CI
2022-02-11 13:24:23 +08:00
sam
efcff7333e fix typo: 上窜 -> 上传 2022-02-11 09:16:04 +08:00
YunaiV
128ee67925 更新日志,更新~ 2022-02-11 01:18:30 +08:00
芋道源码
28cb66b971 !77 修复部门更新后本地缓存不更新问题
Merge pull request !77 from C_VS/master
2022-02-10 17:17:27 +00:00
芋道源码
bfe7cf01eb !78 fix: 修复 Maven 构建一些提示
Merge pull request !78 from 滑头一条咸鱼/lc
2022-02-10 17:09:20 +00:00
Jelly
5e43efc555 fix:修复 Maven 构建一些提示 2022-02-10 11:16:17 +08:00
chenyongsheng712
67df00264a 修复部门更新后本地缓存不更新问题
https://gitee.com/zhijiantianya/ruoyi-vue-pro/issues/I4T22A
2022-02-10 09:48:07 +08:00
YunaiV
424ddb23e4 * 【修复】自定义 DefaultStreamMessageListenerContainerX 实现,解决 Redisson Stream 读取不到数据返回 null 导致 NPE 问题 2022-02-10 08:20:55 +08:00
YunaiV
2cef84bdc8 * 【修复】自定义 DefaultStreamMessageListenerContainerX 实现,解决 Redisson Stream 读取不到数据返回 null 导致 NPE 问题 2022-02-10 08:20:06 +08:00
YunaiV
152453106a 完善更新日志 2022-02-10 00:08:26 +08:00
YunaiV
55d8977108 Merge branch 'master' of https://github.com/YunaiV/ruoyi-vue-pro 2022-02-10 00:08:04 +08:00
芋道源码
3f19760678 Merge pull request #73 from leosanqing/optimize-json-utils
使用 lombok 优化JsonUtils
2022-02-10 00:07:12 +08:00
芋道源码
cd42846bec !73 工作流程发起以及审批异常,NotEmpty校验Long类型异常
Merge pull request !73 from zhuqi7/master
2022-02-09 16:03:23 +00:00
leosanqing
855bb214be 使用 lombok 优化工具类
1。添加 @UtilityClass, 作用私有空参构造函数
2。使用 @SneakyThrows 替代手动转换为 RuntimeException
2022-02-09 09:36:15 +08:00
zhuqi
f0395c450f 校验Long类型NotEmpty改为NotNull 2022-02-09 08:57:05 +08:00
芋道源码
5151112912 Merge pull request #68 from crimson-gao/fix/avatar
fix: 修复 avatar 配置
2022-02-09 08:53:20 +08:00
zhuqi
37ec560687 流程发起异常,忽略id 2022-02-09 08:53:11 +08:00
YunaiV
f966fae060 【修复】Knife4j 接口文档 404 的问题,原因是 spring.mvc.static-path-pattern 配置项,影响了基础路径 2022-02-09 00:25:27 +08:00
leosanqing
fd4adf2cea 使用 lombok 优化工具类
1。添加 @UtilityClass, 作用私有空参构造函数
2。使用 @SneakyThrows 替代手动转换为 RuntimeException
2022-02-08 19:25:34 +08:00
crimson
2bc45ad467 fix: 修复 avatar 配置 2022-02-08 01:03:15 +08:00
zhouzichun
c671c23e87 [build]github Action CI
添加Action CI
2022-02-07 19:57:59 +08:00
YunaiV
d5c35c23dc 初始化 1.5.0-snapshot 版本 2022-02-07 16:12:37 +08:00
芋道源码
09d0634694 !72 数据权限-部门及以下权限问题
Merge pull request !72 from @C/master
2022-02-07 08:03:00 +00:00
cks
1044e1ac72 修改角色中部门及以下权限问题 2022-02-07 16:00:07 +08:00
YunaiV
0bac283864 解决 Spring 定时任务下,无租户编号的问题,导致查询报错 2022-02-06 20:10:22 +08:00
YunaiV
251bd08508 修复 infra_config 表名错误 2022-02-06 17:32:45 +08:00
YunaiV
2dd4450302 修复用户 APP 发送短信验证码报错 2022-02-06 17:31:22 +08:00
YunaiV
448aa21e33 1. 修复用户 APP 发送短信验证码报错 2022-02-05 21:20:54 +08:00
YunaiV
d649b93017 1. 同步最新的 SQL
2. 修复多租户的定时 Task 无法获取租户编号的问题
2022-02-05 00:54:31 +08:00
芋道源码
bb02c8eccc !71 基于 Maven Module 的方式拆分多模块
Merge pull request !71 from 芋道源码/feature/multi-module
2022-02-04 14:57:35 +00:00
YunaiV
40d5eb4a07 Merge branch 'master' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into feature/multi-module
 Conflicts:
	yudao-core-service/pom.xml
2022-02-04 22:56:39 +08:00
YunaiV
cb3b172ecc * 【新增】每次发布大版本时,将 yudao-ui-admin 编译后,放到 yudao-server 项目中,可以快速体验,无需搭建前端开发环境 2022-02-04 22:56:00 +08:00
YunaiV
470d1a3a35 * 【升级】Spring Boot Admin from 2.3.2 to 2.6.2,提供更好的监控能力 2022-02-04 18:26:02 +08:00
YunaiV
9f65c46c82 【修复】管理后台 UI 超时登录后,返回登陆界面时,由于未登陆加载不到信息,导致报错的问题 2022-02-04 18:13:31 +08:00
YunaiV
ae9186f4b4 多模块重构 14:MEMBER 用户,过滤掉操作日志的记录~ 2022-02-04 17:51:15 +08:00
YunaiV
6441883855 【升级】spring-boot from 2.4.12 to 2.5.9,最新的 Spring Boot 2.6.X 在等更流行一些,稳定第一 2022-02-04 14:26:05 +08:00
YunaiV
1e2bcf9aca 多模块重构 13:修复各种单元测试的报错 2022-02-04 13:35:26 +08:00
YunaiV
61672e0180 多模块重构 13:迁移集成测试~ 2022-02-04 12:28:48 +08:00
YunaiV
eb2ab3cc4d 清理多余文件与配置 2022-02-04 01:56:41 +08:00
YunaiV
c2ccfa3bd6 多模块重构 12:【新增】Spring Security 新增 AuthorizeRequestsCustomizer 抽象类, 自定义每个 Maven Module 的 URL 的安全配置 2022-02-04 01:36:27 +08:00
YunaiV
4890cf05de 修复 swagger 接口文档不展示的问题 2022-02-04 00:07:35 +08:00
YunaiV
f2f36bd617 多模块重构 11:修复代码生成的 BaseDO 模板不正确 2022-02-03 11:30:19 +08:00
芋道源码
2177aea2bd !70 公用层pom描述修改。
Merge pull request !70 from zxucooly/master
2022-02-03 02:50:53 +00:00
zxucooly
b85b33c373 公用层描述修改。 2022-02-03 10:36:24 +08:00
YunaiV
db9bae05b0 多模块重构 11:代码生成器,优化展示 2022-02-03 10:18:07 +08:00
YunaiV
8e3d7663bb 多模块重构 11:代码生成器,支持多租户 2022-02-03 00:44:07 +08:00
YunaiV
24e083b3ae 多模块重构 11:新增 H2 SQL 脚本的生成 2022-02-02 23:38:18 +08:00
YunaiV
0773a4c4d7 多模块重构 12:修改项目名字,按照新的规则 2022-02-02 22:33:39 +08:00
YunaiV
352a67c530 多模块重构 11:修改代码生成器的实现 2022-02-02 22:10:24 +08:00
YunaiV
b0c25ea9f4 多模块重构 11:修改代码生成器的实现 2022-02-02 13:57:25 +08:00
YunaiV
8d59384904 多模块重构 10:去除 Freemarker 依赖,修改字典的前缀,从 sys=》system、inf=》infra 见名知意 2022-02-02 01:27:04 +08:00
YunaiV
2b630ef3f2 多模块重构 9:调整的请求 URL 2022-02-01 22:59:43 +08:00
YunaiV
bdcf00d8a0 多模块重构 8:bom 模块,基本完成重构 2022-02-01 21:58:36 +08:00
YunaiV
f39bfdab89 多模块重构 8:bom 模块,尝试公用部分逻辑 2022-02-01 20:33:03 +08:00
YunaiV
fe1271a6f7 多模块重构 8:bom 模块,尝试公用部分逻辑 2022-01-31 23:29:25 +08:00
YunaiV
510917c5ed 多模块重构 8:bom 模块的调整 2022-01-31 22:55:48 +08:00
YunaiV
d45213fe2a 多模块重构 7:pay 模块的重构完成 2022-01-31 22:14:35 +08:00
YunaiV
b757e1fccb 多模块重构 7:pay 模块的初始化 2022-01-31 21:51:23 +08:00
YunaiV
e7e3b18704 多模块重构 6:tool 模块的迁移完成 2022-01-31 19:26:39 +08:00
YunaiV
fffd023d31 多模块重构 5:infra 模块的迁移完成 2022-01-31 18:05:19 +08:00
YunaiV
9bc9b2ac6b 多模块重构 5:infra 模块的修改~~~ 2022-01-31 17:57:45 +08:00
YunaiV
dc11dfc215 多模块重构 5:infra 模块的初始化 2022-01-31 13:51:40 +08:00
YunaiV
4bc8dc65b4 多模块重构 4:infra 模块的初始化 2022-01-31 10:27:35 +08:00
YunaiV
638b8b1dd4 多模块重构 4:system 模块的调整,完成 social 的复用 2022-01-31 10:07:27 +08:00
YunaiV
14097b4120 Merge branch 'feature/flowable' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into feature/multi-module
 Conflicts:
	yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java
2022-01-31 00:34:25 +08:00
YunaiV
fd53bf3296 多模块重构 4:system 模块的调整,解决单元测试报错的问题 2022-01-31 00:33:55 +08:00
YunaiV
16c2590483 多模块重构 4:system 模块的调整,实现 sms API~~ 2022-01-30 22:27:54 +08:00
YunaiV
add08b1ecd 多模块重构 4:system 模块的调整,实现 social API~~ 2022-01-30 21:23:45 +08:00
YunaiV
ab6ec2f0ed 多模块重构 4:system 模块的创建,去除 Sys 2022-01-30 00:49:31 +08:00
jason
933bb7c6a6 修改合并后的编译报错 2022-01-29 23:15:57 +08:00
jason
c5e2df943c Bpm 动态表单。移到bpm-core-service 模块 2022-01-29 22:42:09 +08:00
YunaiV
117914d92b 多模块重构 4:system 模块的创建,去除 Sys 2022-01-29 21:29:54 +08:00
YunaiV
06887bff16 多模块重构 4:system 模块的创建,以及将相关的代码先进行迁移 2022-01-29 16:05:32 +08:00
YunaiV
cee7e50720 1.【修复】定时任务刷新本地缓存时,无租户上线文,导致查询报错
2. member 模块,统一使用 member 前缀
3. 修改 Spring Security logout 配置,支持多用户类型的退出
2022-01-29 14:05:06 +08:00
YunaiV
6aca4ae9fd Merge branch 'feature/multi-module' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into feature/flowable
 Conflicts:
	pom.xml
	yudao-module-bpm/yudao-module-bpm-activiti/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java
2022-01-29 10:06:00 +08:00
YunaiV
36d01371bb 增加 bpm 模块的修改建议 2022-01-29 10:01:35 +08:00
YunaiV
e9efff7076 多模块重构 3:security 实现多用户的认证支持 2022-01-29 00:44:03 +08:00
YunaiV
928b7dbe23 多模块重构 2:在 yudao-admin-server 中,引入 yudao-module-member 模块 2022-01-28 20:21:01 +08:00
jason
afa0d623db 增加 bpm-core-service 多模块 2022-01-27 22:08:34 +08:00
jason
1c266988c5 遗漏了测试类 2022-01-27 15:14:00 +08:00
YunaiV
06fa85a353 多模块重构 1:将 yudao-user-server 涉及到 member 模块的逻辑,都迁移到 yudao-module-member 中 2022-01-27 13:34:25 +08:00
芋道源码
f8a0d1778a !69 fix 认证错误码
感谢,非常细致!
2022-01-27 04:38:22 +00:00
lzp
8bcdb8600c fix 认证错误码 2022-01-27 10:33:52 +08:00
芋道源码
678e2def97 !60 用户中心修改密码,修改手机功能重做,发送短信 拓展设置对应模板编号
Merge pull request !60 from 宋天/feature/user-register
2022-01-26 10:51:54 +00:00
jason
4ba064d8b3 抽取 activiti 到module-bpm-activiti, 为接入flowable 准备 2022-01-26 15:57:38 +08:00
宋天
cb2ba6da2f fix 冲突 2022-01-24 14:16:17 +08:00
YunaiV
9d6a046939 修复 Redis 监控,消耗 CPU 秒数超过 Integer 范围 2022-01-24 07:55:06 +08:00
YunaiV
7d0b381dff 优化 README 说明,准备发布新版本 2022-01-23 14:14:49 +08:00
YunaiV
a25dd9370c 优化 README 说明,准备发布新版本 2022-01-23 14:09:48 +08:00
YunaiV
4e8092653c 修复 dev 环境的配置文件 2022-01-23 13:53:35 +08:00
芋道源码
a6fbbc7172 !68 新增支付后台相关的 README 的更新
Merge pull request !68 from 芋道源码/pay_extension
2022-01-23 05:44:18 +00:00
YunaiV
0f2031d0db 更新 Pay 相关的 README.md 2022-01-23 13:43:14 +08:00
芋道源码
cd8277cf16 !67 优化 Activiti 的事务、依赖、单元测试等
Merge pull request !67 from 芋道源码/feature/activiti
2022-01-23 05:07:45 +00:00
YunaiV
eeb665739a 优化 Activiti 的依赖管理 2022-01-23 13:02:31 +08:00
YunaiV
ec876d54a4 修复 activiti 事务的一致性 2022-01-23 12:52:33 +08:00
YunaiV
fcd44d8b0d 修复工作流的单元测试 2022-01-23 12:27:27 +08:00
芋道源码
4be5b73dbc !66 新增支付管理的管理后台:商户信息、应用信息、支付订单、退款订单等功能
Merge pull request !66 from 芋道源码/pay_extension
2022-01-22 20:31:25 +00:00
YunaiV
c6a6ad4965 修复支付的单元测试 2022-01-23 04:29:53 +08:00
YunaiV
2a6566d8d6 合并 master 最新代码 2022-01-23 04:27:57 +08:00
YunaiV
2860108a7d Merge branch 'master' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into pay_extension
 Conflicts:
	sql/ruoyi-vue-pro.sql
	yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/SysDictTypeConstants.java
	yudao-admin-server/src/main/resources/application-local.yaml
	yudao-admin-server/src/main/resources/application.yaml
	yudao-admin-server/src/test/resources/sql/clean.sql
	yudao-admin-server/src/test/resources/sql/create_tables.sql
	yudao-admin-ui/src/utils/dict.js
2022-01-23 04:12:34 +08:00
YunaiV
c612133f22 修改 README 文档 2022-01-23 04:09:54 +08:00
芋道源码
9c32ba400c !65 完成流程图的高亮、OA 请假的接入
Merge pull request !65 from 芋道源码/feature/activiti
2022-01-22 19:36:30 +00:00
YunaiV
2678ff0a8b 修改 bpmn 前端组件,注释掉 UserTask 的表单、候选人的选型,替换成自己的【流程表单】【任务分配规则】! 2022-01-23 03:35:50 +08:00
YunaiV
6edfd5ac76 更新最新日志 2022-01-23 03:19:41 +08:00
YunaiV
e487e31961 同步最新的 SQL 2022-01-23 01:43:35 +08:00
YunaiV
6f0c2943c7 完善 bpm 的权限~ 2022-01-23 00:43:17 +08:00
YunaiV
e6142b5308 实现 OA 请假的取消申请 2022-01-23 00:10:06 +08:00
YunaiV
5437775172 增加 BpmProcessInstanceResultEvent 实现,实现自定义的流程实例的状态的监听 2022-01-22 23:56:15 +08:00
YunaiV
7c62b1a211 修改 bpm 流程不通过的 Listener 的逻辑 2022-01-22 22:44:42 +08:00
YunaiV
54e7c10a06 完成 bpm oa 请假的 create 和 detail 前端 2022-01-22 21:49:50 +08:00
YunaiV
991ce2105b 优化 bpm 高亮流程图的排它节点~~~ 2022-01-22 21:10:53 +08:00
YunaiV
e12c17360a bpm 的实例详情界面,接入 businessKey 2022-01-22 20:54:23 +08:00
YunaiV
cc9a2199b1 bpm 的 OA 请假的列表的接入 2022-01-22 19:20:00 +08:00
YunaiV
ec978c4441 bpm 的 OA 请假的示例后端优化~ 2022-01-22 18:27:07 +08:00
YunaiV
531629634b Merge branch 'master' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into feature/activiti 2022-01-22 02:15:19 +08:00
YunaiV
fe7a68c41e bpm 增加流程定义的信息未发生变化时,部署不生效 2022-01-22 02:15:04 +08:00
芋道源码
fcf13bb67c !64 新建LambdaQueryWrapperX,改成使用lambda的方式选择字段
Merge pull request !64 from keep/style/use_lambda_query_wapper
2022-01-21 18:12:25 +00:00
YunaiV
c2db893fb8 bpm 增加流程被通过、不通过时,发送短信通知 2022-01-22 00:35:33 +08:00
YunaiV
e3b86b3d7a bpm 增加任务分配到指定人时,发送短信通知 2022-01-21 22:53:43 +08:00
zefeng.zeng
43ae3c8124 feat 新建LambdaQueryWrapperX,改成使用lambda的方式选择字段 2022-01-21 14:32:52 +08:00
YunaiV
d839adedff 基本算完成第一个版本的流程图高亮,基于前端实现 2022-01-21 01:18:04 +08:00
YunaiV
34a0f0ea9d 增加 bpmn 流程图的高亮 2022-01-21 01:12:44 +08:00
YunaiV
21376c80a8 解决 bpm 用户任务的 outgoing 为空的情况~ 2022-01-20 23:52:52 +08:00
YunaiV
72c465be86 优化 bpm 高亮流程图的前端 2022-01-20 13:13:16 +08:00
YunaiV
5332e543d2 优化 bpm 高亮流程图的前端 2022-01-20 01:14:10 +08:00
YunaiV
348762ae6a 1. 修复 ProcessViewer 找不到 taskList 报错,= = 变量名改了。
2. 增加事件监听器,悬浮可以展示部分信息
2022-01-19 13:39:12 +08:00
YunaiV
1425f7dfcc 优化 ProcessViewer.vue 展示流程图的效果,增加红色、绿色、灰色、橙色 2022-01-19 12:45:12 +08:00
YunaiV
8e18a63d34 修改流程图的高亮实现,采用 activity 替代 task 作为数据源 2022-01-19 08:54:54 +08:00
YunaiV
676e4f29d9 重新实现后端的 bpm 流程图的高亮接口 2022-01-19 01:00:59 +08:00
YunaiV
adc6076deb 重命名历史任务的接口 2022-01-18 23:48:44 +08:00
YunaiV
2de81e438a 流程详情页 100% - 完成流程图的高亮功能 2022-01-18 08:15:43 +08:00
YunaiV
5a4392dc4e 临时提交,尝试实现流程图的高亮 2022-01-18 01:41:22 +08:00
YunaiV
0765f481ff 流程详情页 95% - 接入任务的转派 2022-01-17 23:53:19 +08:00
YunaiV
c9b9eced07 流程详情页 90% - 接入审批通过、审批不通过的功能 2022-01-17 12:53:43 +08:00
YunaiV
cf7a434f0c 流程详情页 80% - 接入审批通过、审批不通过的功能 2022-01-17 00:59:05 +08:00
YunaiV
519a4a16fc 流程详情页 70% - 审批表单 2022-01-17 00:04:20 +08:00
YunaiV
5022ed2533 流程详情页 60% - 审批记录 2022-01-16 23:36:47 +08:00
YunaiV
f0963c3941 流程详情页 30% - 表单信息的展示 2022-01-16 22:16:49 +08:00
YunaiV
f049bd7530 流程发起界面,支持业务表单 2022-01-16 17:55:29 +08:00
YunaiV
93e02b36dd 新增 bpm 基于流程实例的详情 API 接口 2022-01-16 17:31:44 +08:00
YunaiV
23eda6b1a9 新增 bpm 基于流程实例查询任务列表 2022-01-16 13:47:23 +08:00
YunaiV
a4d31f9c45 新增 bpm 基于流程实例查询任务列表 2022-01-16 13:27:09 +08:00
YunaiV
f9b6eef4d2 优化的 bpm 任务的 todo、done 的 vo 2022-01-16 11:42:25 +08:00
YunaiV
0b4a4793d9 禁用 bpm 检测 /processes 目录,部署 BPMN 流程 2022-01-16 02:59:52 +08:00
YunaiV
94c115a142 优化 activiti 的配置,简单 Mapper XML 的配置,且减少 Mapper 的 SQL 日志的输出~ 2022-01-16 02:55:25 +08:00
YunaiV
db3c713122 1. 修改流程的表单定义,支持业务表单。
2. 流程提交时,记录表单值
2022-01-16 02:26:37 +08:00
YunaiV
aac6cc7bf8 1. 完善 bpm task rule 的注解和校验 2022-01-16 00:51:08 +08:00
YunaiV
3acb56f880 1. 流程定义列表,增加任务分配规则的展示
2. 流程定义列表,按照 version 倒序
2022-01-16 00:36:04 +08:00
YunaiV
a3d8e8726a 【修复】codegen 生成代码时,delete 接口补充 dataTypeClass 属性,避免 Swagger 打印 WARN 日志 2022-01-16 00:08:43 +08:00
YunaiV
9b26c3e98a 1. 实现空的 bpm UserGroupManager
2. 去除任务分配时,candidateUsers 协调者
2022-01-15 23:55:00 +08:00
YunaiV
bacf741f77 临时备份一些想法;主要和任务分配的策略相关 2022-01-15 23:37:42 +08:00
YunaiV
9922e2fcf2 1. 调整 activiti 配置,使用 SQL 初始化 activi 表;
2. 实现内置的几个 Bpm 自定义分配 Script
2022-01-15 21:34:29 +08:00
YunaiV
6cdcde692b Merge branch 'master' of https://github.com/YunaiV/ruoyi-vue-pro into feature/activiti 2022-01-15 17:08:18 +08:00
芋道源码
70fe3d31bd !63 工作流的任务分配规则的实现
Merge pull request !63 from 芋道源码/feature/activiti
2022-01-15 05:08:27 +00:00
YunaiV
e01b33bc78 同步最新的表结构 2022-01-15 13:07:19 +08:00
YunaiV
1781e76e19 BPM 模型重构 7:任务分配规则的后端的单元测试 2022-01-15 11:51:09 +08:00
YunaiV
902f2ecbad BPM 模型重构 7:任务分配规则的后端,全部实现完成 2022-01-15 01:39:30 +08:00
YunaiV
f46090243f BPM 模型重构 7:任务分配规则的前端,增加指定用户、自定义脚本等 2022-01-15 00:31:56 +08:00
YunaiV
842cb6bd6b BPM 模型重构 7:将任务分配规则,分装成前端组件 2022-01-14 22:26:03 +08:00
YunaiV
5efb4c26cd 【新增】工作组,用于支持指定工作组进行任务的审批 2022-01-14 14:01:46 +08:00
YunaiV
33ab2e9633 【修改】修改部门负责人,从 String 字符串,调整成和后台用户的用户编号绑定 2022-01-14 01:04:44 +08:00
YunaiV
2809254a07 BPM 模型重构 7:增加任务分配规则的列表 UI 界面(增加部门的规则配置) 2022-01-14 00:21:34 +08:00
YunaiV
fe651b42ec BPM 模型重构 8:修改部 model 部署逻辑,支付任务规则的复制 2022-01-13 23:28:14 +08:00
YunaiV
8e9cb110c7 BPM 模型重构 7:增加任务分配规则的列表 UI 界面(增加角色的规则配置) 2022-01-13 21:23:00 +08:00
YunaiV
9f0cd04fa6 BPM 模型重构 7:增加任务分配规则的列表 UI 界面(增加角色的规则配置) 2022-01-13 13:21:54 +08:00
YunaiV
3f6a5f06fa BPM 模型重构 7:增加任务分配规则的列表 UI 界面 2022-01-13 10:16:28 +08:00
YunaiV
64a1d1f0f6 BPM 模型重构 7:增加任务分配规则的列表 UI 界面 2022-01-13 00:56:57 +08:00
YunaiV
4e7f5489a5 BPM 模型重构 6:增加任务分配规则的列表 API 接口 2022-01-12 21:16:57 +08:00
YunaiV
95ce628cce BPM 模型重构 5:将 form 和 model 模块,合并到 definition 模块下 2022-01-12 01:05:54 +08:00
YunaiV
7d620d1679 BPM 模型重构 4:修改模型,修改成单独的弹窗 2022-01-12 00:38:57 +08:00
YunaiV
8c7db2af70 BPM 模型重构 4:修改模型,修改成单独的弹窗 2022-01-12 00:33:50 +08:00
YunaiV
24c03cf176 BPM 模型重构 3:设置流程时,去掉 formId、description 等的传递,专注设计本身 2022-01-11 22:15:48 +08:00
YunaiV
d2a8f3f253 BPM 模型重构 2:导入流程时,只填写 name、description、key 2022-01-11 21:20:13 +08:00
YunaiV
62b720a5d0 BPM 模型重构 2:导入流程时,只填写 name、description、key 2022-01-11 21:06:54 +08:00
YunaiV
c4950e1b13 BPM 模型重构 1:新建流程时,只填写 name、description、key 2022-01-11 20:17:01 +08:00
YunaiV
e863b60300 初步实现 BpmUserTaskActivitiBehavior 的规则 2022-01-11 13:24:57 +08:00
芋道源码
8d27d1146b Merge pull request #57 from cksspk/btn-perm
修改后台管理admin-ui 用户更新按钮权限标识
2022-01-11 10:25:43 +08:00
YunaiV
8999b7db3b 新增流程任务的规则 BpmTaskRuleDO 表的设计 2022-01-11 01:10:52 +08:00
YunaiV
645fd7624b 增加 BpmUserTaskActivitiBehavior 自定义实现,为后续做自定义的任务分配机制做准备 2022-01-10 21:02:13 +08:00
芋道源码
8a3488f3d1 !62 工作流的流程任务相关
Merge pull request !62 from 芋道源码/feature/activiti
2022-01-09 14:48:39 +00:00
YunaiV
9734eacf01 完成 bpm 已办任务列表 2022-01-09 22:47:18 +08:00
YunaiV
4d37e9f8f0 完成 bpm 已办任务列表 2022-01-09 22:31:40 +08:00
YunaiV
abe161669c 修复 BPM Task 的 category 设置问题 2022-01-09 21:23:59 +08:00
YunaiV
9860a7d552 1. 基于 BpmTaskEventListener 实现 Task 拓展表的同步
2. 基于 BpmProcessInstanceEventListener 实现 ProcessInstance 拓展表的同步
2022-01-09 18:40:13 +08:00
YunaiV
a5b8b9b67e 1. 修复已办任务的 API 接口的 NPE
2. 实现已办任务的 UI 界面
2022-01-09 09:46:34 +08:00
YunaiV
fc6a768058 调整流程任务的审批结果,拆成 approve 和 reject 接口 2022-01-09 09:08:14 +08:00
YunaiV
e931414b55 实现流程任务的审批功能的 API 接口 2022-01-09 00:53:39 +08:00
YunaiV
8a10568b24 1. 修改 Parser.vue 组件,实现 submit 传递 conf 和 values 参数
2. 完成流程创建的前端 UI 界面
2022-01-09 00:17:52 +08:00
YunaiV
749cb5d762 1. 新增流程定义的列表 API
2. 新增流程创建的界面,暂未实现完全
2022-01-08 23:11:09 +08:00
YunaiV
2630ad8eaa 完成流程实例的取消 2022-01-08 22:11:39 +08:00
YunaiV
2017b03169 实现 bpm 已办任务的后端接口 2022-01-08 20:49:11 +08:00
YunaiV
77f06e79c4 实现 bpm 待办任务的前端界面 2022-01-08 16:59:51 +08:00
YunaiV
b083795ad6 实现 bpm 待办任务的后端接口 2022-01-08 16:19:41 +08:00
YunaiV
1ab15dd1f9 bpm 我的流程,增加 task 的展示 2022-01-08 09:56:56 +08:00
YunaiV
14a7d637b3 修改 bpmn 的 ElementBaseInfo.vue ,解决基础元素的表单问题 2022-01-08 08:28:18 +08:00
YunaiV
5415a85cc0 引入新版本的 bpmn-js 2022-01-08 08:02:16 +08:00
YunaiV
bb11acb15f 实现我的流程的前端 UI 界面 2022-01-08 01:14:54 +08:00
YunaiV
55a6ec78e4 实现我的流程的后端 API 接口 2022-01-07 23:34:12 +08:00
YunaiV
1031b78f64 1. 创建流程实例时,同时也插入流程
2. 修改 Activiti 使用 TTL 上下文
2022-01-07 21:50:27 +08:00
cks
b93ce4d1b2 修改后台管理admin-ui 用户更新按钮权限标识 2022-01-07 16:46:51 +08:00
YunaiV
4d7ee1769f 1. 新增流程实例的拓展表
2. 将 Activiti 的 userId,统一使用 ActivitiUtils 进行设置
2022-01-07 00:35:12 +08:00
芋道源码
2a90038080 !61 工作流的动态表单、流程模型、流程定义的提交
Merge pull request !61 from 芋道源码/feature/activiti
2022-01-04 23:51:34 +00:00
YunaiV
19b574fd4b code review 退款逻辑 2022-01-04 23:47:31 +08:00
YunaiV
e43039b0c6 待办列表 2022-01-04 09:46:39 +08:00
YunaiV
2607f13abe 1. 新增流程新建的接口 2022-01-04 08:27:22 +08:00
jason
5bf3045544 优化退款逻辑 2022-01-03 22:32:39 +08:00
YunaiV
bcdc117e59 调整 definition =》processDefinition,主要考虑更加明确一些 2022-01-03 22:13:12 +08:00
YunaiV
5eef27da6e 将流程模型的权限接入 2022-01-03 19:03:54 +08:00
YunaiV
cfbef058b5 完成流程图上传的功能 2022-01-03 18:46:00 +08:00
YunaiV
ed33ff9f04 优化 bpmnProcessDesigner 在编辑流程图时,自动延迟赋值 key 和 name,保证一致性 2022-01-03 18:45:38 +08:00
YunaiV
db54147697 流程的挂起与激活 2022-01-03 12:26:04 +08:00
YunaiV
f8b34d5b6d 完成流程定义的列表的实现 2022-01-03 11:08:47 +08:00
YunaiV
509e11a7b0 流程定义在创建时,增加 key 和 name 的校验,进一步保证 Model、Deployment、ProcessDefinition 的匹配性 2022-01-03 09:49:53 +08:00
YunaiV
066f57e5c5 优化 bpmnProcessDesigner 的 id 赋值,必须满足 NCName 规则,避免绘制报错的问题 2022-01-03 09:38:57 +08:00
YunaiV
72c8b24604 修复 bpmnProcessDesigner 由于改造,导致 key 和 name 未同步到 bpmn xml 的问题 2022-01-03 08:55:06 +08:00
YunaiV
513c23efbb 优化流程定义的分页接口 2022-01-03 05:41:05 +08:00
YunaiV
7833aa5d0e 完善 model 列表 2022-01-03 04:31:48 +08:00
YunaiV
7bc36a09fb 增加流程图的预览界面 2022-01-03 02:41:24 +08:00
YunaiV
38221a3e2e bpmnProcessDesigner 修改 xml、json 预览,使用老版本的 highlight 2022-01-03 01:36:39 +08:00
YunaiV
490f907ada 完善 bpmnProcessDesigner 流程设计器的使用,基本可用了! 2022-01-03 01:12:36 +08:00
YunaiV
c4003396a5 1. 同步最新的 SQL
2. 同步最新的配置到 dev 文件
2022-01-02 19:31:36 +08:00
YunaiV
a031c1d564 去除 modelEditor.vue 冗余代码 2022-01-02 16:27:43 +08:00
YunaiV
9804e781f4 去除 jeeplus-bpmn 的工作流编辑器,原因:功能相对不完善。使用 bpmnProcessDesigner 替代 2022-01-02 16:06:40 +08:00
YunaiV
d1c95c4d8a 1. 清理旧版本的 form generator
2. 接入表单详情
2022-01-02 12:56:34 +08:00
YunaiV
f45224f224 1. 清理旧版本的 form generator
2. 接入表单详情
2022-01-02 12:36:37 +08:00
YunaiV
863ab6f33a 流程表单,接入新的 form generator 版本 2022-01-02 12:28:34 +08:00
YunaiV
d574a99dfc 使用最新的 form generator 编辑器 2022-01-02 11:22:13 +08:00
YunaiV
dffd175ccf 初始化 form 动态表单的详情,暂未接入数据 2022-01-02 09:59:47 +08:00
YunaiV
430f1369be 完善 BPM Model 的搜索功能 2022-01-02 08:49:35 +08:00
YunaiV
d8bbc71543 乱改下 bpmnProcessDesigner 的样式 2022-01-01 23:12:07 +08:00
YunaiV
167692b04d 引入 bpmnProcessDesigner 组件 2022-01-01 22:46:54 +08:00
YunaiV
c84a9dd67e 优化流程 Model 的部署代码 2022-01-01 22:03:17 +08:00
YunaiV
1294506a95 优化流程 Model 的更新逻辑 2022-01-01 19:31:16 +08:00
YunaiV
df91c3ceff 将 Model exportBpmnXml 去除,替换成 getModel 接口 2022-01-01 18:13:00 +08:00
YunaiV
e47d5afcfa 完善工作流 model 的接口 2022-01-01 17:16:01 +08:00
YunaiV
dc7a434380 增加流程定义的 VO 2022-01-01 08:54:37 +08:00
YunaiV
a0c7692c3c 调整流程定义模块的代码 2022-01-01 00:26:33 +08:00
YunaiV
ff7b9d9d26 增加 Bpm Field 的 vModel 重复的问题 2021-12-31 23:19:11 +08:00
YunaiV
930c5ec490 BPM Form 表单的完善 2021-12-31 22:12:08 +08:00
YunaiV
69a6aa251b Form 动态表单的清理,去除无用的代码 2021-12-31 09:17:59 +08:00
YunaiV
2d40e4bc14 Form 动态表单的清理,去除无用的代码 2021-12-31 08:55:38 +08:00
YunaiV
4c56a07c4e Form 动态表单,增加基础表单 2021-12-30 22:06:07 +08:00
YunaiV
d2420212a6 增加 Form 编辑框 2021-12-30 21:11:53 +08:00
YunaiV
00f968657c 重新初始化 BPM Form 模块 2021-12-30 20:46:06 +08:00
YunaiV
7ef86c14c0 WfForm =》BpmForm 2021-12-30 20:23:50 +08:00
YunaiV
4b2af44ee3 Merge branch 'master' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into feature/activiti
 Conflicts:
	sql/ruoyi-vue-pro.sql
	yudao-admin-server/src/main/resources/application.yaml
	yudao-admin-server/src/main/resources/mybatis-config/mybatis-config.xml
	yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/LoginUser.java
	yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/util/SecurityFrameworkUtils.java
2021-12-30 19:58:31 +08:00
YunaiV
9a5f085369 code review 支付问题 2021-12-30 09:32:04 +08:00
YunaiV
67aaf28832 code review 退款逻辑 2021-12-30 09:08:11 +08:00
chen quan
d556eae556 优化 支付配置校验方式,优化业务层异常抛出类型,优化支付应用渲染逻辑,添加删除支付商户 支付应用的校验,退款订单去除reqNo字段,支付订单去除 channelExtras 参数展示 2021-12-29 19:49:29 +08:00
jason
08103685f1 重构退款逻辑,去掉退款后处理 2021-12-28 17:10:25 +08:00
zhijiantianya@gmail.com
054c237b1f 支付 app、商户,删除时,需要校验关联数据 2021-12-27 11:40:07 +08:00
jason
e8368bb7fd 修改退款逻辑code review 2021-12-26 21:52:42 +08:00
宋天
df141f2982 update 发送短信 拓展设置对应模板编号 2021-12-26 15:21:14 +08:00
宋天
671c41bf82 fix 修复yml文件误提交 2021-12-26 12:51:49 +08:00
YunaiV
bcc2ff0f5b code review 退款逻辑 2021-12-25 20:40:49 +08:00
YunaiV
d49ce4c81f 同步最新 SQL 2021-12-25 19:32:59 +08:00
YunaiV
cea1589e79 code review 支付渠道的逻辑 2021-12-25 19:09:39 +08:00
YunaiV
f1424aa61e code review 支付应用的逻辑 2021-12-25 18:53:47 +08:00
YunaiV
4b5c185608 code review 支付商户逻辑 2021-12-25 17:53:18 +08:00
宋天
21fbe91e39 update 用户中心密码操作修改逻辑 2021-12-25 00:05:21 +08:00
宋天
5376ed69b1 解决冲突 2021-12-24 23:32:00 +08:00
aquan
ff21fdc5df 回滚 .gitignore 错误提交 2021-12-22 11:07:41 +08:00
chen quan
d0290b88ad 紧急修复 支付退款订单 service 单元测试bug 2021-12-21 17:23:26 +08:00
chen quan
aad85337ce Merge remote-tracking branch 'origin/pay_extension' into pay_extension
# Conflicts:
#	yudao-admin-server/src/test/resources/sql/create_tables.sql
2021-12-21 17:02:15 +08:00
chen quan
d1a20bf259 1、完成代付订单后台模块
2、将pay模块的 PayRefundMapper 更名为 PayRefundCoreMapper 避免冲突
3、将支付订单 UI 界面进行调整优化
2021-12-21 16:55:58 +08:00
宋天
5430cc292e Merge remote-tracking branch 'origin/feature/user-register' into feature/user-register 2021-12-19 19:30:06 +08:00
宋天
08cfe71646 优化重置手机逻辑 2021-12-19 19:28:01 +08:00
YunaiV
be0b47ecb7 合并 master 最新的代码 2021-12-16 09:53:02 +08:00
YunaiV
c916b30fa1 Merge branch 'master' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into pay_extension
 Conflicts:
	sql/ruoyi-vue-pro.sql
	yudao-admin-server/src/main/resources/application.yaml
	yudao-admin-server/src/test/resources/sql/clean.sql
	yudao-admin-server/src/test/resources/sql/create_tables.sql
	yudao-admin-ui/src/utils/dict.js
	yudao-user-server/src/main/resources/application-local.yaml
2021-12-16 09:45:50 +08:00
YunaiV
f94435d592 * 【升级】redisson from 3.16.3 to 3.16.6,解决 Stream 在调试场景下会存在 NPE 的问题
* 【升级】spring-boot from 2.4.5 to 2.4.12,最新的 Spring Boot 2.6.X 在等更流行一些,稳定第一
* 【升级】druid from 1.2.4 to 1.2.8,提升数据库连接池的稳定性
* 【升级】dynamic-datasource from 3.3.2 to 3.5.0,修复动态数据源切换的问题
2021-12-16 09:08:05 +08:00
YunaiV
a92acff99b 1. 升级 1.3.0-snapshot 版本
2.【修复】biz-data-permission 组件的缓存机制,导致部分 SQL 未进行数据过滤
2021-12-16 07:19:52 +08:00
YunaiV
abf61bfdea 修复引入多租户后,前端 <img /> 读取图片报错的问题 2021-12-15 13:08:15 +08:00
YunaiV
b99f364d92 修复前端获取租户方法缺失 2021-12-15 12:27:45 +08:00
YunaiV
1801250516 yudao-spring-boot-starter-data-permission 和 yudao-spring-boot-starter-tenant 调整为 biz 组件 2021-12-15 10:18:29 +08:00
YunaiV
a55c0cfca5 Merge branch 'master' of https://gitee.com/zhijiantianya/ruoyi-vue-pro
 Conflicts:
	yudao-core-service/pom.xml
	yudao-dependencies/pom.xml
	yudao-framework/pom.xml
2021-12-15 10:07:21 +08:00
YunaiV
9d97c0ccb4 yudao-spring-boot-starter-data-permission 和 yudao-spring-boot-starter-tenant 调整为 biz 组件 2021-12-15 10:06:02 +08:00
芋道源码
a7254e0f05 !59 新增用户的社交登陆 API
Merge pull request !59 from 芋道源码/feature/user-social
2021-12-15 01:46:50 +00:00
YunaiV
52631a0af8 合并 master 代码
修复单测报错的问题
2021-12-15 09:45:37 +08:00
YunaiV
712067979c Merge branch 'master' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into feature/user-social
 Conflicts:
	yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl/SysAuthServiceImpl.java
	yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysAuthServiceImplTest.java
	yudao-dependencies/pom.xml
	yudao-framework/pom.xml
	yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/service/auth/impl/SysAuthServiceImpl.java
2021-12-15 09:26:47 +08:00
YunaiV
91e98a5e62 code review 用户社交登陆的逻辑
增加测试页面的 README.md
2021-12-15 09:21:37 +08:00
YunaiV
b365b40273 code review 用户社交登陆的逻辑
增加测试页面的 README.md
2021-12-15 09:18:15 +08:00
YunaiV
62ca36dede Merge branch 'master' of https://gitee.com/zhijiantianya/ruoyi-vue-pro 2021-12-14 23:14:25 +08:00
YunaiV
72dc28a639 同步最新的 SQL 脚本 2021-12-14 23:04:36 +08:00
芋道源码
ac1ced7459 !58 新增多租户、数据权限
Merge pull request !58 from 芋道源码/feature/user-register
2021-12-14 14:57:47 +00:00
YunaiV
098c5b4723 1. 管理后台,增加租户管理
2. 修复大量因为租户报错的单元测试
2021-12-14 22:39:43 +08:00
YunaiV
a582a6e726 Merge branch 'master' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into feature/user-register
 Conflicts:
	更新日志.md
2021-12-14 09:58:41 +08:00
YunaiV
fba230c2b2 完善 SysPermissionServiceImpl 数据权限相关的单元测试 2021-12-14 09:36:54 +08:00
YunaiV
619a7b73c3 增加 DeptDataPermissionRuleTest 单元测试 2021-12-14 00:34:42 +08:00
YunaiV
8278b65777 重构 Dept 数据权限逻辑,统一收到 yudao-spring-boot-starter-data-permission 包下 2021-12-13 09:27:46 +08:00
YunaiV
986cb72421 基于部门的数据权限 2021-12-13 00:28:20 +08:00
YunaiV
b0855cc626 实现 DataPermissionRuleFactoryImpl,并增加相关单测 2021-12-12 11:55:30 +08:00
YunaiV
f9b15fe70d 1. 增加数据权限的自动配置 DataPermissionAutoConfiguration
2. 增加数据权限的 AOP DataPermissionAnnotationInterceptor
3. 重命名 DataPermissionDatabaseInterceptor
2021-12-12 00:56:16 +08:00
YunaiV
2334e177c5 1. 引入 mockito-inline
2. 优化【数据权限】的单元测试
2021-12-11 15:38:20 +08:00
YunaiV
3fbd394653 完善数据权限的单元测试 2021-12-11 13:17:02 +08:00
YunaiV
0f792c64e7 通过 MyBatis Plus 数据权限的单测 2021-12-11 11:16:45 +08:00
YunaiV
e9385219c2 数据权限的逻辑处理,暂未测试 2021-12-11 08:54:49 +08:00
YunaiV
eda2b11dad 增加数据权限的 SQL 重写的上下文 2021-12-10 10:08:29 +08:00
chen quan
98dfa48ced 1:优化商户管理页面BUG
2:优化应用关闭页面
3:完成支付订单CURD 以及单元测试
4:将 Element UI 从 2.15.0 升级至 2.15.6
2021-12-08 19:21:24 +08:00
YunaiV
e9ba4ac705 初始化 DataPermission 的模型 2021-12-08 10:15:48 +08:00
timfruit
450ca8f907 完成剩下的公众号登录功能修改 2021-12-08 00:17:01 +08:00
YunaiV
c99115abe7 初始化数据权限模块 2021-12-07 21:28:16 +08:00
YunaiV
814c2db65c 初始化数据权限模块 2021-12-07 21:19:23 +08:00
YunaiV
4b95146c98 设置实体继承多租户的 DO 2021-12-07 13:31:59 +08:00
YunaiV
8795a4cdeb 增加 Tenant Security 的实现 2021-12-06 13:25:33 +08:00
YunaiV
df9b06843f 增加 Tenant Redis 的实现 2021-12-06 10:18:36 +08:00
YunaiV
1ce2c09f47 增加 Tenant MQ 的支持 2021-12-06 01:32:41 +08:00
YunaiV
a231582637 增强 mq starter 组件,支持 interceptor 拦截器机制 2021-12-05 23:50:17 +08:00
YunaiV
d29b0beb9b 优化 mq starter 组件,增加 RedisMQTemplate 模板类 2021-12-05 23:00:41 +08:00
YunaiV
ade55d89a4 多租户,接入 Spring Async 机制 2021-12-05 17:59:58 +08:00
YunaiV
cc78025f80 修改本地不开 Job,dev 开启 Job 2021-12-05 17:35:53 +08:00
YunaiV
6cd9b3bf7e 1. 增加 Job 的多租户的能力 2021-12-05 10:44:17 +08:00
YunaiV
535d3c9c01 登陆界面,优化成输入租户名 2021-12-05 00:12:54 +08:00
YunaiV
0cb4823b5b 1. 前端登陆界面,接入租户 2021-12-04 23:27:39 +08:00
YunaiV
7c8fe2fc50 1. 增加 yudao-spring-boot-starter-tenant 租户的组件
2. 改造 UserDO,接入多租户
2021-12-04 21:09:49 +08:00
YunaiV
ccb56b3b99 使用 uview 重构实际登陆 2021-11-28 20:48:41 +08:00
YunaiV
0d8f10cf1f 使用 uview 重构实际登陆 2021-11-27 23:45:09 +08:00
YunaiV
002aea34ae 引入 uview 组件 2021-11-27 20:09:13 +08:00
宋天
3f412f26fc Merge branch 'master' into feature/user-register 2021-11-26 21:26:21 +08:00
芋道源码
e8a65d45c6 update 更新日志.md. 2021-11-26 01:51:15 +00:00
芋道源码
e9b93ffe80 !57 代码生成工具问题修复
Merge pull request !57 from chaocloud/master
2021-11-26 01:50:25 +00:00
YunaiV
2da6a746e4 增加个人信息的加载 2021-11-26 09:47:23 +08:00
YunaiV
86ef156de4 调整 request 的封装 2021-11-26 07:21:47 +08:00
YunaiV
11936dee44 封装 request 请求 2021-11-25 22:33:28 +08:00
YunaiV
07fe12483a 优化登陆界面,增加手机密码的登陆方式 2021-11-25 09:58:14 +08:00
YunaiV
55ee2fcad7 增加登陆界面 2021-11-25 07:57:23 +08:00
YunaiV
d12912080e 提交个人中心页面 2021-11-25 06:57:32 +08:00
jason
f108d478a8 调整渠道支付通知地址为统一的地址 2021-11-24 23:54:16 +08:00
YunaiV
6c4908e70e 初始化 uniapp 小程序 2021-11-24 23:33:06 +08:00
chaocloud
b66d845354 代码自动生成工具,当表注释为空时,根据SQL导入失败问题修复 2021-11-24 15:08:01 +08:00
chaocloud
7991d68586 代码自动生成工具java文件路径修复 2021-11-24 15:05:04 +08:00
aquan
1c5544fc9d 优化渠道 config 校验和逻辑转换问题 2021-11-24 11:51:06 +08:00
jason
dfde260ebb 支付宝退款申请通知 2021-11-22 16:22:46 +08:00
jason
444ba79822 修改code review 2021-11-21 22:33:42 +08:00
YunaiV
f0fcf4798e code review 支付的逻辑 2021-11-21 21:11:07 +08:00
aquan
6069a387ea 优化完善支付应用和支付渠道代码逻辑,完善单元测试,基于validator完成手动校验config 2021-11-21 19:37:16 +08:00
YunaiV
b32ac09ddf code review 工作机的流程 2021-11-21 12:59:52 +08:00
YunaiV
b18cd457c8 code review 支付相关的代码实现 2021-11-21 12:24:08 +08:00
YunaiV
e2b76ee0e5 code review 修改密码等的单元测试 2021-11-21 12:05:34 +08:00
YunaiV
42ce5c75fd Merge branch 'master' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into feature/user-register 2021-11-21 11:18:41 +08:00
YunaiV
d405f4df25 修复单元测试报错的问题 2021-11-21 11:12:47 +08:00
jason
7d6f205dc0 支付退款申请,支付宝手机wap 相应实现 2021-11-21 11:12:32 +08:00
yunlong.li
f958137dd1 完善工作流模型。工作流定义 2021-11-19 16:08:01 +08:00
yunlong.li
bab046f10c 增加BPMN数据校验 2021-11-18 18:29:09 +08:00
yunlong.li
a829e8d083 初步完善模型发布流程 2021-11-18 18:23:56 +08:00
yunlong.li
3f90e79d8a fix: 增加流程图前端代码 2021-11-18 12:06:24 +08:00
yunlong.li
00f59fdc75 fix: 完善 bpm 模型流程 2021-11-18 10:55:43 +08:00
yunlongn
480b17507f #完善流程model设计 2021-11-17 23:01:56 +08:00
yunlong.li
cfdf04981a fix: 新增工作流模型 2021-11-17 18:48:40 +08:00
宋天
6a7761313e [updaate] 拆分修改密码与重置密码请求实体 2021-11-17 15:12:59 +08:00
宋天
8e0569ee54 update 新增接口:修改手机,修改密码,忘记密码 2021-11-17 10:15:22 +08:00
jason
89f51fe568 修改code review 2021-11-16 22:43:30 +08:00
ouyang
19f554176c tina提交支付宝扫码单元测试 2021-11-15 16:51:38 +08:00
YunaiV
9dc7d2d197 工作流的 code review 2021-11-15 06:25:25 +08:00
jason
91c0c423c0 修改 code review 2021-11-12 20:37:27 +08:00
YunaiV
3368a995ca 支付模块的 code review 2021-11-10 09:40:09 +08:00
YunaiV
e969dbe8b7 工作流的 code review 2021-11-10 09:11:29 +08:00
aquan
e46a27b937 完成支付模块支付应用信息和微信类型的支付渠道配置。 2021-11-09 16:36:07 +08:00
芋道源码
c84e19e14e !55 修复基于建表SQL生成代码 列名没有COMMENT注释报错的问题
Merge pull request !55 from 夜丶点缀了一个人的落寞/hotfix-tool-codegen
2021-11-08 08:33:49 +00:00
yunlong.li
848913bf2f fix: 代码 review 修改 2021-11-08 14:24:31 +08:00
liu xm
2fc1ef519d 修复基于建表SQL生成代码 列名没有COMMENT注释报错的问题 2021-11-08 13:27:34 +08:00
yunlong.li
0ff7f2ef74 fix: 代码 review 修改 2021-11-08 11:19:10 +08:00
jason
fef0562523 修改code review 2021-11-07 22:21:55 +08:00
YunaiV
1bc4bdac0c 工作流的 code review 2021-11-07 20:25:31 +08:00
jason
baab642d28 更改请假流程的更新日志 2021-11-07 17:39:40 +08:00
jason
b784bf3e12 修改请假流程 2021-11-07 17:38:00 +08:00
Roland
d0a59f7ef1 #人事审批流程图获取 2021-11-06 10:59:48 +08:00
jason
f0b7583404 包名从activiti 改成 bpm 2021-11-06 10:22:45 +08:00
timfruit
13a9405082 增加注释,优化代码 2021-11-05 23:14:51 +08:00
芋道源码
30732428f1 !54 返回高亮任务流图片
Merge pull request !54 from 云扬四海/feature/activiti
2021-11-05 13:31:57 +00:00
Roland
e9e73c402b #返显高亮工作流 2021-11-05 20:54:26 +08:00
yunlong.li
9bbeb93b2e fix:[工作流] 返回对应实例的流程图 2021-11-05 18:14:56 +08:00
yunlong.li
3c3f46ee4e fix:[工作流] 返回对应实例的流程图 2021-11-05 17:13:55 +08:00
YunaiV
6265e4a736 支付的 code review 2021-11-05 08:10:07 +08:00
YunaiV
abf2f697fb 修改 wl =》bpm 2021-11-05 07:50:14 +08:00
YunaiV
6f8e8acae0 Merge branch 'master' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into feature/activiti 2021-11-05 07:47:19 +08:00
jason
26798a8816 修改code review 2021-11-05 00:10:32 +08:00
樊宇
b369b363b6 动态表单 命名规范 2021-11-04 17:35:01 +08:00
ouyang
87d8b55b41 Merge branch 'pay_extension' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into pay_extension 2021-11-04 14:32:42 +08:00
ouyang
461c6a0007 tina提交支付宝扫码支付 2021-11-04 14:27:36 +08:00
aquan
38f1d6428f Merge remote-tracking branch 'origin/pay_extension' into pay_extension 2021-11-04 09:35:56 +08:00
YunaiV
b7a90c2c12 code review 动态表单 2021-11-04 09:03:05 +08:00
樊宇
08d72fe9ca Merge remote-tracking branch 'origin/master' into master 2021-11-04 08:56:13 +08:00
芋道源码
592f706cd8 update 更新日志.md. 2021-11-04 00:54:27 +00:00
YunaiV
6cadafb3f1 code review 支付宝 wap 的逻辑 2021-11-04 08:47:41 +08:00
芋道源码
bba5ea7a42 !53 修复字典查询和通知查询权限问题
Merge pull request !53 from classyex/master
2021-11-04 00:29:02 +00:00
jason
a1105ffdc7 调整表 pay_order_extension,字段 channel_notify_data,长度 2021-11-04 00:46:27 +08:00
jason
2c60a3aafa 支付宝手机网站支付 2021-11-04 00:46:24 +08:00
aquan
1a721ceb5f 完成支付模块的商户管理开发以及单元测试 2021-11-03 19:14:44 +08:00
樊宇
9d8cdb2670 动态表单 后端代码 2021-11-03 10:26:01 +08:00
YunaiV
aa77eb029f 增加支付宝 QR 支付的回调 2021-11-03 09:05:04 +08:00
YunaiV
696e94a1a3 解决 pay 参数校验报错的问题 2021-11-03 08:42:38 +08:00
YunaiV
396f3a6dff Revert "akarta.validation-api =》jakarta.el 依赖,保证 EL 不报错"
This reverts commit 1b336c7df6.
2021-11-03 08:38:45 +08:00
jason
56864db484 修改 文件重命名问题 2021-11-02 20:47:26 +08:00
yex
4cfa959d98 fix: 修复通知和字典查询权限bug 2021-11-02 12:25:41 +08:00
YunaiV
1b336c7df6 akarta.validation-api =》jakarta.el 依赖,保证 EL 不报错 2021-11-02 08:23:15 +08:00
YunaiV
65abc667b0 code review 社交登陆相关的代码 2021-11-02 08:12:37 +08:00
YunaiV
c186d279ba code review 工作流的相关代码 2021-11-02 07:56:05 +08:00
芋道源码
a4948d27d2 update yudao-admin-server/src/main/resources/application-local.yaml. 2021-11-01 02:04:26 +00:00
jason
cc56a66332 修改code review 2021-10-31 22:27:35 +08:00
jason
1b835e058f 修改code review 2021-10-31 22:26:35 +08:00
jason
0d2ae6be56 修改code review 2021-10-31 22:13:51 +08:00
jason
f26c17cff0 修改code review 2021-10-31 22:11:55 +08:00
timfruit
8aa45406fd 拓展授权登录抽取成单独的starter,拓展配置和默认配置齐平 2021-10-31 13:09:55 +08:00
YunaiV
ae9e9b3de0 Merge remote-tracking branch 'origin/master' 2021-10-31 11:06:35 +08:00
YunaiV
83ce39f700 增加 .gitattributes 文件,避免识别项目类型出错 2021-10-31 11:06:27 +08:00
YunaiV
722eaf3513 调整下工作流的包名 2021-10-31 09:55:12 +08:00
芋道源码
e82c37f2c5 !52 工作流的部分实现
Merge pull request !52 from 芋道源码/feature/activiti
2021-10-30 05:51:21 +00:00
YunaiV
742125ed99 code review 工作流的代码
合并最新的 SQL
2021-10-30 13:46:39 +08:00
YunaiV
31c4a52858 Merge branch 'feature/activiti' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into feature/activiti 2021-10-30 11:07:13 +08:00
YunaiV
0050b1e46d Merge branch 'master' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into feature/activiti
 Conflicts:
	yudao-dependencies/pom.xml
	yudao-framework/pom.xml
2021-10-30 10:24:58 +08:00
芋道源码
8cead0869e !51 用户前台的社交登陆的部分实现
Merge pull request !51 from 芋道源码/feature/user-social
2021-10-30 02:17:55 +00:00
YunaiV
8dbd6143bf 增加微信小程序的登陆的测试代码 2021-10-30 10:09:31 +08:00
YunaiV
038c0b87b9 增加微信登陆的测试页 2021-10-30 09:43:26 +08:00
YunaiV
c3aa2acddf Merge branch 'master' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into feature/user-social
 Conflicts:
	yudao-admin-server/pom.xml
	yudao-dependencies/pom.xml
	yudao-user-server/src/main/resources/application-dev.yaml
	yudao-user-server/src/main/resources/application-local.yaml
2021-10-30 09:30:18 +08:00
芋道源码
b336655a51 !50 支付系统的部分实现
Merge pull request !50 from 芋道源码/pay_extension
2021-10-30 01:27:08 +00:00
YunaiV
cba9c609d7 code review 社交登陆的代码 2021-10-30 09:12:17 +08:00
timfruit
de21034186 增加小程序授权登录 2021-10-29 23:48:06 +08:00
YunaiV
0e209d9cfc 同步最新的表结构 2021-10-29 08:22:13 +08:00
YunaiV
68c98db147 code review 用户前台的社交登陆 2021-10-28 08:50:50 +08:00
YunaiV
55e5ca4644 code review 用户前台的社交登陆 2021-10-28 08:46:51 +08:00
YunaiV
30ad7c43b8 Merge branch 'master' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into feature/user-social
 Conflicts:
	yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/SysErrorCodeConstants.java
2021-10-28 08:30:24 +08:00
jason
d16185f87d 修改表单为外置表单 2021-10-28 00:51:57 +08:00
YunaiV
7da46d1cfb Merge branch 'master' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into pay_extension 2021-10-28 00:03:42 +08:00
YunaiV
93351e1716 1. 修复 File 单元测试报错
2. 修复 mvn package 报错问题
2021-10-28 00:01:21 +08:00
YunaiV
c89accbf06 完成支付通知的逻辑 2021-10-27 13:22:49 +08:00
YunaiV
2df46a7c2d Merge branch 'master' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into pay_extension
 Conflicts:
	更新日志.md
2021-10-27 12:32:57 +08:00
YunaiV
65843d55a0 修改版本号为 1.2.0-snapshot 2021-10-27 10:17:42 +08:00
YunaiV
dd2d8a2ba9 优化支付通知的逻辑,解决并发的问题。
同时,收到支付结果时,立马回调业务,避免延迟
2021-10-27 10:06:49 +08:00
芋道源码
a19f92ff2c !49 [update] 新增修改昵称,修改头像,查询昵称与头像接口
Merge pull request !49 from 宋天/user-register
2021-10-27 01:38:31 +00:00
timfruit
1a9440824c 添加注释 2021-10-26 22:26:33 +08:00
timfruit
fcf1c228c5 初步完成微信公众号登录 2021-10-26 21:35:06 +08:00
YunaiV
72b64dc526 同步最新的支付表结构 2021-10-26 09:53:17 +08:00
YunaiV
4acada62d3 完成支付回调的逻辑 2021-10-26 09:50:18 +08:00
YunaiV
75633aa84b 增加微信公众号的支付回调接口 2021-10-25 23:29:42 +08:00
YunaiV
bac30d47b7 增加支付回调地址的配置 2021-10-25 10:04:11 +08:00
YunaiV
20628987c9 增加支付回调地址的配置 2021-10-25 09:56:49 +08:00
YunaiV
1b0aaec9ab 完成微信支付的支付流程,美滋滋 2021-10-25 08:58:30 +08:00
YunaiV
72438ed5f6 增加 pay.html 前端,对接微信 JS SDK 2021-10-24 23:46:53 +08:00
YunaiV
60f5898c9a 增加 pay.html 前端,对接微信 JS SDK 2021-10-24 23:02:34 +08:00
宋天
f4a5a139b5 [update]user server模块新增测试,修改部分接口规范问题 2021-10-24 22:33:32 +08:00
YunaiV
44f357cea4 接入 weixin-mp-java ,编写相关示例。 2021-10-24 11:53:42 +08:00
YunaiV
3a77cc239b yudao-user-server 接入支付模块 2021-10-24 00:34:40 +08:00
YunaiV
ab19228ca6 完成支付的下单和提交订单的逻辑 2021-10-23 20:14:13 +08:00
jason
436781507e merge master change 2021-10-23 19:16:00 +08:00
YunaiV
6dc65234ef 增加支付相关表的 SQL,调整相关的实体 2021-10-23 17:47:27 +08:00
YunaiV
6e3aa8a752 完善 PayClientFactoryImpl 的实现,增加创建 PayClient 的方法 2021-10-23 14:00:02 +08:00
YunaiV
1ed6656bbb 完成对微信公众号支付的封装 2021-10-23 11:00:36 +08:00
宋天
5193de7c56 [fix]修复错误内容 2021-10-20 18:51:51 +08:00
宋天
79da36ac04 [update]更新代码规范 2021-10-20 16:59:47 +08:00
YunaiV
23d8da7479 完善 AbstractPayClient 的实现 2021-10-20 13:20:09 +08:00
YunaiV
6690b9b120 完善支付宝的 AlipayPayClient 的实现 2021-10-20 08:27:44 +08:00
宋天
c06d6e53f6 [update] 新增修改昵称,修改头像,查询昵称与头像接口 2021-10-19 22:16:42 +08:00
YunaiV
7ca756a234 引入支付宝的支付功能 2021-10-19 09:26:49 +08:00
YunaiV
24f4fd4fee 完成支付单的单体轮廓 2021-10-19 07:41:45 +08:00
YunaiV
81126b2b4b 1. 引入 IJPay 组件
2. 增加创建支付单的 Service 实现
2021-10-18 09:41:38 +08:00
niudehua
d194e14780 修改maven模块名称 2021-10-15 21:16:10 +08:00
YunaiV
711a074059 支付系统的实体的初始化 2021-10-14 09:05:09 +08:00
jason
ee8dcd0888 1.实现了工作流引擎 中 请假流程demo(定义在 resources/leave.bpmn)
2.增加一个一级菜单 OA 办公 下面两个菜单: 请假申请,待办任务
3.暂时不知如何找部门领导, 暂时写死为 admin
4.activity 用户组使用 用户岗位来代替。
5.新增一个用户 hradmin, 密码 123456  岗位是 人力资源
6.演示流程。
  a. admin 登陆 申请请假
  b. admin 待办任务(审批)
  c. hradmin 登陆 待办任务(审批)
  d. admin 登陆 待办任务 (确认)
2021-10-13 23:43:03 +08:00
YunaiV
5133cd0fdf Merge branch 'master' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into pay_extension 2021-10-12 21:25:03 +08:00
QingChen
0effbc513c 支付表结构 2021-10-12 14:57:40 +08:00
QingChen
60b528e80e 支付核心 2021-10-12 10:42:17 +08:00
QingChen
8070afc807 支付核心 2021-10-12 10:41:34 +08:00
zhujiqian
1bb10d007e 增加流程模型实体激活或挂起后端逻辑 2021-09-07 23:40:18 +08:00
zhujiqian
e8b3f355e6 增加配置参数注释 2021-09-05 23:12:32 +08:00
zhujiqian
b8ff47e832 增加配置参数注释 2021-09-05 22:57:38 +08:00
zhujiqian
00e15a5c2c 1、集成Activiti7版本,yudao-dependencies模块新增activiti依赖包;
2、流程文件上传部署API后端逻辑实现;
2021-09-05 22:46:01 +08:00
QingChen
df3cd34b30 扩展组件 2021-08-31 19:39:09 +08:00
3316 changed files with 216455 additions and 49909 deletions

1
.gitattributes vendored Normal file
View File

@@ -0,0 +1 @@
*.sql linguist-language=java

30
.github/workflows/maven.yml vendored Normal file
View File

@@ -0,0 +1,30 @@
# This workflow will build a Java project with Maven, and cache/restore any dependencies to improve the workflow execution time
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven
name: Java CI with Maven
on:
push:
branches: [ master ]
# pull_request:
# branches: [ master ]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
java: [ '8', '11', '17' ]
steps:
- uses: actions/checkout@v2
- name: Set up JDK ${{ matrix.Java }}
uses: actions/setup-java@v2
with:
java-version: ${{ matrix.java }}
distribution: 'temurin'
cache: maven
- name: Build with Maven
run: mvn -B package --file pom.xml -Dmaven.test.skip=true

51
.github/workflows/yudao-ui-admin.yml vendored Normal file
View File

@@ -0,0 +1,51 @@
name: yudao-ui-admin CI
# 在master分支发生push事件时触发。
on:
push:
branches: [ master ]
# pull_request:
# branches: [ master ]
env: # 设置环境变量
TZ: Asia/Shanghai # 时区(设置时区可使页面中的`最近更新时间`使用时区时间)
WORK_DIR: yudao-ui-admin #工作目录
defaults:
run:
shell: bash
working-directory: yudao-ui-admin
jobs:
build: # 自定义名称
runs-on: ubuntu-latest # 运行在虚拟机环境ubuntu-latest
strategy:
matrix:
node-version: [14.x, 16.x]
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
steps:
- name: Checkout # 步骤1
uses: actions/checkout@v2 # 使用的动作。格式userName/repoName。作用检出仓库获取源码。 官方actions库https://github.com/actions
- name: Install pnpm
uses: pnpm/action-setup@v2.0.1
with:
version: 6.15.1
- name: Set node version to ${{ matrix.node_version }}
uses: actions/setup-node@v2
with:
node-version: ${{ matrix.node_version }}
cache: "yarn"
cache-dependency-path: yudao-ui-admin/yarn.lock
- name: Install deps
run: node --version && yarn --version && yarn install
- name: Build
run: yarn build:prod
# 查看 workflow 的文档来获取更多信息
# @see https://github.com/crazy-max/ghaction-github-pages

3
.gitignore vendored
View File

@@ -42,3 +42,6 @@ nbdist/
!*/build/*.java
!*/build/*.html
!*/build/*.xml
### JRebel ###
rebel.xml

211
README.md
View File

@@ -1,25 +1,56 @@
## 平台简介
**严肃声明:现在、未来都不会有商业版本,所有功能全部开源!**
**拒绝虚假开源,售卖商业版,程序员不骗程序员!!**
**「我喜欢写代码,乐此不疲」**
**「我喜欢做开源,以此为乐」**
## 🐯 平台简介
**芋道**,一套**全部开源**的**企业级**的快速开发平台,毫无保留给个人及企业免费使用。
> 有任何问题,或者想要的功能,可以在 _Issues_ 中提给艿艿。
* 前端采用 [vue-element-admin](https://github.com/PanJiaChen/vue-element-admin)。
* 后端采用 Spring Boot、MySQL、Redis
* 权限认证使用 Spring Security & Token,支持多终端认证系统。
* 支持加载动态权限菜单,多方式轻松权限控制
* 高效率开发,使用代码生成器可以一键生成前后端代码
* 前端采用 [vue-element-admin](https://github.com/PanJiaChen/vue-element-admin) ,正在支持 Vue 3 + ElementUI Plus 最新方案
* 后端采用 Spring Boot、MySQL + MyBatis Plus、Redis + Redisson
* 权限认证使用 Spring Security & Token & Redis支持多终端、多种用户的认证系统。
* 支持加载动态权限菜单,按钮级别权限控制,本地缓存提升性能
* 支持 SaaS 多租户系统,可自定义每个租户的权限,提供透明化的多租户底层封装
* 工作流使用 Activiti ,支持动态表单、在线设计流程、多种任务分配方式。
* 高效率开发,使用代码生成器可以一键生成前后端代码 + 单元测试 + Swagger 接口文档 + Validator 参数校验。
* 集成微信小程序、微信公众号、企业微信、钉钉等三方登陆,集成支付宝、微信等支付与退款。
* 集成阿里云、腾讯云、云片等短信渠道,集成阿里云、腾讯云、七牛云等云存储服务。
## 内置功能
| 项目名 | 说明 | 传说门 |
| ---- |------------------------| ---- |
| `ruoyi-vue-pro` | Spring Boot 多模块 | **[Gitee](https://gitee.com/zhijiantianya/ruoyi-vue-pro)** &nbsp;&nbsp;&nbsp; [Github](https://github.com/YunaiV/ruoyi-vue-pro) |
| `ruoyi-vue-cloud` | Spring Cloud 微服务 | **[Gitee](https://gitee.com/zhijiantianya/ruoyi-vue-cloud)** &nbsp;&nbsp;&nbsp; [Github](https://github.com/YunaiV/onemall) |
| `Spring-Boot-Labs` | Spring Boot & Cloud 入门 | **[Gitee](https://gitee.com/zhijiantianya/SpringBoot-Labs)** &nbsp;&nbsp;&nbsp; [Github](https://github.com/YunaiV/SpringBoot-Labs) |
分成三种内置功能:
## 🐶 在线体验
演示地址:<http://dashboard.yudao.iocoder.cn>
* 账号密码admin/admin123
文档地址:<http://www.iocoder.cn/categories/Yudao/>
* [《如何搭建环境》](http://www.iocoder.cn/categories/Yudao/?yudao)
> 未来会补充文档和视频,方便胖友冲冲冲!
## 🐼 内置功能
分成多种内置功能:
* 系统功能
* 工作流程
* 支付系统
* 商城系统
* 基础设施
* 研发工具
> 友情提示:本项目基于 RuoYi-Vue 修改,**重构优化**后端的代码,**美化**前端的界面。
>
> 额外新增的功能,我们使用 🚀 标记。
>
> * 额外新增的功能,我们使用 🚀 标记。
> * 重新实现的功能,我们使用 ⭐️ 标记。
🙂 所有功能,都通过 **单元测试** 保证高质量。
@@ -28,28 +59,65 @@
| | 功能 | 描述 |
| --- | --- | --- |
| | 用户管理 | 用户是系统操作者,该功能主要完成系统用户配置 |
| | 在线用户 | 当前系统中活跃用户状态监控,支持手动踢下线 |
| ⭐️ | 在线用户 | 当前系统中活跃用户状态监控,支持手动踢下线 |
| | 角色管理 | 角色菜单权限分配、设置角色按机构进行数据范围权限划分 |
| | 菜单管理 | 配置系统菜单操作权限按钮权限标识等 |
| | 菜单管理 | 配置系统菜单操作权限按钮权限标识等,本地缓存提供性能 |
| | 部门管理 | 配置系统组织机构(公司、部门、小组),树结构展现支持数据权限 |
| | 岗位管理 | 配置系统用户所属担任职务 |
| 🚀 | 租户管理 | 配置系统租户,支持 SaaS 场景下的多租户功能 |
| 🚀 | 租户套餐 | 配置租户套餐,自定每个租户的菜单、操作、按钮的权限 |
| | 字典管理 | 对系统中经常使用的一些较为固定的数据进行维护 |
| 🚀 | 短信管理 | 短信渠道、短息模板、短信日志,对接阿里云、云片等主流短信平台 |
| 🚀 | 操作日志 | 系统正常操作日志记录和查询,集成 Swagger 生成日志内容 |
| | 登录日志 | 系统登录日志记录查询,包含登录异常 |
| ⭐️ | 登录日志 | 系统登录日志记录查询,包含登录异常 |
| 🚀 | 错误码管理 | 系统所有错误码的管理,可在线修改错误提示,无需重启服务 |
| | 通知公告 | 系统通知公告信息发布维护 |
### 工作流程
| | 功能 | 描述 |
| --- | --- | --- |
| 🚀 | 流程模型 | 配置工作流的流程模型,支持文件导入与在线设计流程图,提供 7 种任务分配规则 |
| 🚀 | 流程表单 | 拖动表单元素生成相应的工作流表单,覆盖 Element UI 所有的表单组件 |
| 🚀 | 用户分组 | 自定义用户分组,可用于工作流的审批分组 |
| 🚀 | 我的流程 | 查看我发起的工作流程,支持新建、取消流程等操作,高亮流程图、审批时间线 |
| 🚀 | 待办任务 | 查看自己【未】审批的工作任务,支持通过、不通过、转发、委派、退回等操作 |
| 🚀 | 已办任务 | 查看自己【已】审批的工作任务,未来会支持回退操作 |
| 🚀 | OA 请假 | 作为业务自定义接入工作流的使用示例,只需创建请求对应的工作流程,即可进行审批 |
### 支付系统
| | 功能 | 描述 |
| --- | --- | --- |
| 🚀 | 商户信息 | 管理商户信息,支持 Saas 场景下的多商户功能 |
| 🚀 | 应用信息 | 配置商户的应用信息,对接支付宝、微信等多个支付渠道 |
| 🚀 | 支付订单 | 查看用户发起的支付宝、微信等的【支付】订单 |
| 🚀 | 退款订单 | 查看用户发起的支付宝、微信等的【退款】订单 |
ps核心功能已经实现正在对接微信小程序中...
### 商城系统
正在开发中,大体计划如下:
* 2022 Q2 => 完成对 <https://github.com/YunaiV/onemall> 的迁移,作为 onemall 的 Spring Boot 单体版本。
* 2022 Q4 => 完成对 <https://github.com/YunaiV/onemall>> 的重构,作为 onemall 的 Spring Cloud 微服务版本。
### 会员中心
正在开发中,大体计划如下:
* 2021 Q1 =》完成对 <https://github.com/YunaiV/onemall> 的迁移
### 基础设施
| | 功能 | 描述 |
| --- | --- | --- |
| 🚀 | 配置管理 | 对系统动态配置常用参数,支持 SpringBoot 加载 |
| | 定时任务 | 在线(添加、修改、删除)任务调度包含执行结果日志 |
| ⭐️ | 定时任务 | 在线(添加、修改、删除)任务调度包含执行结果日志 |
| 🚀 | 文件服务 | 支持本地文件存储,同时支持兼容 Amazon S3 协议的云服务、开源组件 |
| 🚀 | API 日志 | 包括 RESTful API 访问日志、异常日志两部分,方便排查 API 相关的问题 |
| | MySQL 监控 | 监视当前系统数据库连接池状态可进行分析SQL找出系统性能瓶颈 |
| | Redis 监控 |监控 Redis 数据库的使用情况,使用的 Redis Key 管理 |
| | Redis 监控 | 监控 Redis 数据库的使用情况,使用的 Redis Key 管理 |
| 🚀 | 消息队列 | 基于 Redis 实现消息队列Stream 提供集群消费Pub/Sub 提供广播消费 |
| 🚀 |Java 监控 | 基于 Spring Boot Admin 实现 Java 应用的监控 |
| 🚀 | 链路追踪 | 接入 SkyWalking 组件,实现链路追踪 |
| 🚀 | 日志中心 | 接入 SkyWalking 组件,实现日志中心 |
@@ -66,72 +134,66 @@
| 🚀 | 代码生成 |前后端代码的生成Java、Vue、SQL、单元测试支持 CRUD 下载 |
| 🚀 | 系统接口 | 基于 Swagger 自动生成相关的 RESTful API 接口文档 |
| 🚀 | 数据库文档 | 基于 Screw 自动生成数据库文档,支持导出 Word、HTML、MD 格式 |
| | 表单构建 | 拖动表单元素生成相应的 HTML 代码 |
| | 表单构建 | 拖动表单元素生成相应的 HTML 代码,支持导出 JSON、Vue 文件 |
## 在线体验
## 🐨 技术栈
演示地址:<http://dashboard.yudao.iocoder.cn>
* 账号密码admin/admin123
文档地址:<http://www.iocoder.cn/categories/Yudao/>
* [《如何搭建环境》](http://www.iocoder.cn/categories/Yudao/?yudao)
> 未来会补充文档和视频,方便胖友冲冲冲!
## 技术栈
| 项目 | 说明 |
| --- | --- |
| `yudao-dependencies` | Maven 依赖版本管理 |
| `yudao-framework` | Java 框架拓展 |
| `yudao-admin-server` | 管理后台的服务端 |
| `yudao-admin-ui` | 管理后台的 UI 界面 |
| `yudao-user-server` | 用户前台的服务端 |
| `yudao-user-ui` | 用户前台的 UI 界面 |
| `yudao-core-service` | 公共服务,提供共享逻辑 |
> 友情提示:`yudao-admin-server` 和 `yudao-user-server` 会存在需要复用的逻辑,通过 `yudao-core-service` 实现。
| 项目 | 说明 |
|-----------------------|--------------------|
| `yudao-dependencies` | Maven 依赖版本管理 |
| `yudao-framework` | Java 框架拓展 |
| `yudao-server` | 管理后台 + 用户 APP 的服务端 |
| `yudao-admin-ui` | 管理后台的 UI 界面 |
| `yudao-user-ui` | 用户 APP 的 UI 界面 |
| `yudao-module-system` | 系统功能的 Module 模块 |
| `yudao-module-member` | 会员中心的 Module 模块 |
| `yudao-module-infra` | 基础设施的 Module 模块 |
| `yudao-module-tool` | 研发工具的 Module 模块 |
| `yudao-module-bpm` | 工作流程的 Module 模块 |
| `yudao-module-pay` | 支付系统的 Module 模块 |
### 后端
| 框架 | 说明 | 版本 | 学习指南 |
| --- | --- | --- | --- |
| [Spring Boot](https://spring.io/projects/spring-boot) | 应用开发框架 | 2.4.5 | [文档](https://github.com/YunaiV/SpringBoot-Labs) |
| [MySQL](https://www.mysql.com/cn/) | 数据库服务器 | 5.7 | |
| [Druid](https://github.com/alibaba/druid) | JDBC 连接池、监控组件 | 1.2.4 | [文档](http://www.iocoder.cn/Spring-Boot/datasource-pool/?yudao) |
| [MyBatis Plus](https://mp.baomidou.com/) | MyBatis 增强工具包 | 3.4.1 | [文档](http://www.iocoder.cn/Spring-Boot/MyBatis/?yudao) |
| [Dynamic Datasource](https://dynamic-datasource.com/) | 动态数据源 | 3.3.2 | [文档](http://www.iocoder.cn/Spring-Boot/datasource-pool/?yudao) |
| [Redis](https://redis.io/) | key-value 数据库 | 5.0 | |
| [Redisson](https://github.com/redisson/redisson) | Redis 客户端 | 3.1.46 | [文档](http://www.iocoder.cn/Spring-Boot/Redis/?yudao) |
| [Spring MVC](https://github.com/spring-projects/spring-framework/tree/master/spring-webmvc) | MVC 框架 | 5.4.6 | [文档](http://www.iocoder.cn/SpringMVC/MVC/?yudao) |
| [Spring Security](https://github.com/spring-projects/spring-security) | Spring 安全框架 | 5.4.6 | [文档](http://www.iocoder.cn/Spring-Boot/Spring-Security/?yudao) |
| [Hibernate Validator](https://github.com/hibernate/hibernate-validator) | 参数校验组件 | 6.1.7 | [文档](http://www.iocoder.cn/Spring-Boot/Validation/?yudao) |
| [Quartz](https://github.com/quartz-scheduler) | 任务调度组件 | 2.3.2 | [文档](http://www.iocoder.cn/Spring-Boot/Job/?yudao) |
| [Knife4j](https://gitee.com/xiaoym/knife4j) | Swagger 增强 UI 实现 | 3.0.2 | [文档](http://www.iocoder.cn/Spring-Boot/Swagger/?yudao) |
| [Resilience4j](https://github.com/resilience4j/resilience4j) | 服务保障组件 | 1.7.0 | [文档](http://www.iocoder.cn/Spring-Boot/Resilience4j/?yudao) |
| [SkyWalking](https://skywalking.apache.org/) | 分布式应用追踪系统 | 8.5.0 | [文档](http://www.iocoder.cn/Spring-Boot/SkyWalking/?yudao) |
| [Spring Boot Admin](https://github.com/codecentric/spring-boot-admin) | Spring Boot 监控平台 | 2.3.1 | [文档](http://www.iocoder.cn/Spring-Boot/Admin/?yudao) |
| [Jackson](https://github.com/FasterXML/jackson) | JSON 工具库 | 2.11.4 | |
| [MapStruct](https://mapstruct.org/) | Java Bean 转换 | 1.4.1 | [文档](http://www.iocoder.cn/Spring-Boot/MapStruct/?yudao) |
| [Lombok](https://projectlombok.org/) | 消除冗长的 Java 代码 | 1.16.14 | [文档](http://www.iocoder.cn/Spring-Boot/Lombok/?yudao) |
| [JUnit](https://junit.org/junit5/) | Java 单元测试框架 | 5.7.1 | - |
| [Mockito](https://github.com/mockito/mockito) | Java Mock 框架 | 3.6.28 | - |
| 框架 | 说明 | 版本 | 学习指南 |
| --- | --- |----------| --- |
| [Spring Boot](https://spring.io/projects/spring-boot) | 应用开发框架 | 2.5.10 | [文档](https://github.com/YunaiV/SpringBoot-Labs) |
| [MySQL](https://www.mysql.com/cn/) | 数据库服务器 | 5.7 | |
| [Druid](https://github.com/alibaba/druid) | JDBC 连接池、监控组件 | 1.2.8 | [文档](http://www.iocoder.cn/Spring-Boot/datasource-pool/?yudao) |
| [MyBatis Plus](https://mp.baomidou.com/) | MyBatis 增强工具包 | 3.5.1 | [文档](http://www.iocoder.cn/Spring-Boot/MyBatis/?yudao) |
| [Dynamic Datasource](https://dynamic-datasource.com/) | 动态数据源 | 3.5.0 | [文档](http://www.iocoder.cn/Spring-Boot/datasource-pool/?yudao) |
| [Redis](https://redis.io/) | key-value 数据库 | 5.0 | |
| [Redisson](https://github.com/redisson/redisson) | Redis 客户端 | 3.16.8 | [文档](http://www.iocoder.cn/Spring-Boot/Redis/?yudao) |
| [Spring MVC](https://github.com/spring-projects/spring-framework/tree/master/spring-webmvc) | MVC 框架 | 5.3.16 | [文档](http://www.iocoder.cn/SpringMVC/MVC/?yudao) |
| [Spring Security](https://github.com/spring-projects/spring-security) | Spring 安全框架 | 5.5.5 | [文档](http://www.iocoder.cn/Spring-Boot/Spring-Security/?yudao) |
| [Hibernate Validator](https://github.com/hibernate/hibernate-validator) | 参数校验组件 | 6.2.2 | [文档](http://www.iocoder.cn/Spring-Boot/Validation/?yudao) |
| [Activiti](https://github.com/Activiti/Activiti) | 工作流引擎 | 7.1.0.M6 | [文档](TODO) |
| [Quartz](https://github.com/quartz-scheduler) | 任务调度组件 | 2.3.2 | [文档](http://www.iocoder.cn/Spring-Boot/Job/?yudao) |
| [Knife4j](https://gitee.com/xiaoym/knife4j) | Swagger 增强 UI 实现 | 3.0.2 | [文档](http://www.iocoder.cn/Spring-Boot/Swagger/?yudao) |
| [Resilience4j](https://github.com/resilience4j/resilience4j) | 服务保障组件 | 1.7.0 | [文档](http://www.iocoder.cn/Spring-Boot/Resilience4j/?yudao) |
| [SkyWalking](https://skywalking.apache.org/) | 分布式应用追踪系统 | 8.5.0 | [文档](http://www.iocoder.cn/Spring-Boot/SkyWalking/?yudao) |
| [Spring Boot Admin](https://github.com/codecentric/spring-boot-admin) | Spring Boot 监控平台 | 2.4.2 | [文档](http://www.iocoder.cn/Spring-Boot/Admin/?yudao) |
| [Jackson](https://github.com/FasterXML/jackson) | JSON 工具库 | 2.12.6 | |
| [MapStruct](https://mapstruct.org/) | Java Bean 转换 | 1.4.1 | [文档](http://www.iocoder.cn/Spring-Boot/MapStruct/?yudao) |
| [Lombok](https://projectlombok.org/) | 消除冗长的 Java 代码 | 1.16.14 | [文档](http://www.iocoder.cn/Spring-Boot/Lombok/?yudao) |
| [JUnit](https://junit.org/junit5/) | Java 单元测试框架 | 5.7.2 | - |
| [Mockito](https://github.com/mockito/mockito) | Java Mock 框架 | 3.9.0 | - |
### 前端
| 框架 | 说明 | 版本 |
| --- | --- | --- |
| [Vue](https://cn.vuejs.org/index.html) | JavaScript 框架 | 2.6.12 |
| [Vue Element Admin](https://ant.design/docs/react/introduce-cn) | 后台前端解决方案 | - |
| [Vue Element Admin](https://panjiachen.github.io/vue-element-admin-site/zh/) | 后台前端解决方案 | - |
## 演示图
## 🐷 演示图
### 系统功能
| 模块 | biu | biu | biu |
| --- | --- | --- | --- |
| 登录 & 首页 | ![登录](https://static.iocoder.cn/images/ruoyi-vue-pro/登录.jpg) | ![首页](https://static.iocoder.cn/images/ruoyi-vue-pro/首页.jpg) | ![个人中心](https://static.iocoder.cn/images/ruoyi-vue-pro/个人中心.jpg) |
| 模块 | biu | biu | biu |
| --- | --- |------------------------------------------------------------------| --- |
| 登录 & 首页 | ![登录](https://static.iocoder.cn/images/ruoyi-vue-pro/登录.jpg) | ![首页](https://static.iocoder.cn/images/ruoyi-vue-pro/首页.jpg) | ![个人中心](https://static.iocoder.cn/images/ruoyi-vue-pro/个人中心.jpg) |
| 用户 | ![用户管理](https://static.iocoder.cn/images/ruoyi-vue-pro/用户管理.jpg) | ![在线用户](https://static.iocoder.cn/images/ruoyi-vue-pro/在线用户.jpg) | - |
| 租户 & 套餐 | ![租户管理](https://static.iocoder.cn/images/ruoyi-vue-pro/租户管理.jpg) | ![租户套餐](https://static.iocoder.cn/images/ruoyi-vue-pro/租户套餐.png) | - |
| 部门 & 岗位 | ![部门管理](https://static.iocoder.cn/images/ruoyi-vue-pro/部门管理.jpg) | ![岗位管理](https://static.iocoder.cn/images/ruoyi-vue-pro/岗位管理.jpg) | - |
| 菜单 & 角色 | ![菜单管理](https://static.iocoder.cn/images/ruoyi-vue-pro/菜单管理.jpg) | ![角色管理](https://static.iocoder.cn/images/ruoyi-vue-pro/角色管理.jpg) | - |
| 审计日志 | ![操作日志](https://static.iocoder.cn/images/ruoyi-vue-pro/操作日志.jpg) | ![登录日志](https://static.iocoder.cn/images/ruoyi-vue-pro/登录日志.jpg) | - |
@@ -139,6 +201,23 @@
| 字典 | ![字典类型](https://static.iocoder.cn/images/ruoyi-vue-pro/字典类型.jpg) | ![字典数据](https://static.iocoder.cn/images/ruoyi-vue-pro/字典数据.jpg) | - |
| 错误码 & 通知 | ![错误码管理](https://static.iocoder.cn/images/ruoyi-vue-pro/错误码管理.jpg) | ![通知公告](https://static.iocoder.cn/images/ruoyi-vue-pro/通知公告.jpg) | - |
### 工作流程
| 模块 | biu | biu | biu |
| --- | --- | --- | --- |
| 流程模型 | ![流程模型-列表](https://static.iocoder.cn/images/ruoyi-vue-pro/流程模型-列表.jpg) | ![流程模型-设计](https://static.iocoder.cn/images/ruoyi-vue-pro/流程模型-设计.jpg) | ![流程模型-定义](https://static.iocoder.cn/images/ruoyi-vue-pro/流程模型-定义.jpg) |
| 表单 & 分组 | ![流程表单](https://static.iocoder.cn/images/ruoyi-vue-pro/流程表单.jpg) | ![用户分组](https://static.iocoder.cn/images/ruoyi-vue-pro/用户分组.jpg) | - |
| 我的流程 | ![我的流程-列表](https://static.iocoder.cn/images/ruoyi-vue-pro/我的流程-列表.jpg) | ![我的流程-发起](https://static.iocoder.cn/images/ruoyi-vue-pro/我的流程-发起.jpg) | ![我的流程-详情](https://static.iocoder.cn/images/ruoyi-vue-pro/我的流程-详情.jpg) |
| 待办 & 已办 | ![任务列表-审批](https://static.iocoder.cn/images/ruoyi-vue-pro/任务列表-审批.jpg) | ![任务列表-待办](https://static.iocoder.cn/images/ruoyi-vue-pro/任务列表-待办.jpg) | ![任务列表-已办](https://static.iocoder.cn/images/ruoyi-vue-pro/任务列表-已办.jpg) |
| OA 请假 | ![OA请假-列表](https://static.iocoder.cn/images/ruoyi-vue-pro/OA请假-列表.jpg) | ![OA请假-发起](https://static.iocoder.cn/images/ruoyi-vue-pro/OA请假-发起.jpg) | ![OA请假-详情](https://static.iocoder.cn/images/ruoyi-vue-pro/OA请假-详情.jpg) |
### 支付系统
| 模块 | biu | biu | biu |
| --- | --- | --- | --- |
| 商家 & 应用 | ![商户信息](https://static.iocoder.cn/images/ruoyi-vue-pro/商户信息.jpg) | ![应用信息-列表](https://static.iocoder.cn/images/ruoyi-vue-pro/应用信息-列表.jpg) | ![应用信息-编辑](https://static.iocoder.cn/images/ruoyi-vue-pro/应用信息-编辑.jpg) |
| 支付 & 退款 | ![支付订单](https://static.iocoder.cn/images/ruoyi-vue-pro/支付订单.jpg) | ![退款订单](https://static.iocoder.cn/images/ruoyi-vue-pro/退款订单.jpg) | --- |
### 基础设施
| 模块 | biu | biu | biu |
@@ -153,5 +232,5 @@
| 模块 | biu | biu | biu |
| --- | --- | --- | --- |
| 代码生成 | ![代码生成](https://static.iocoder.cn/images/ruoyi-vue-pro/代码生成.jpg) | ![生成效果](https://static.iocoder.cn/images/ruoyi-vue-pro/生成效果.jpg) | ![表单构建](https://static.iocoder.cn/images/ruoyi-vue-pro/表单构建.jpg) |
| 代码生成 | ![代码生成](https://static.iocoder.cn/images/ruoyi-vue-pro/代码生成.jpg) | ![生成效果](https://static.iocoder.cn/images/ruoyi-vue-pro/生成效果.jpg) | - |
| 文档 | ![系统接口](https://static.iocoder.cn/images/ruoyi-vue-pro/系统接口.jpg) | ![数据库文档](https://static.iocoder.cn/images/ruoyi-vue-pro/数据库文档.jpg) | - |

View File

@@ -1,7 +1,11 @@
{
"local": {
"baseUrl": "http://127.0.0.1:48080/api",
"userServerUrl": "http://127.0.0.1:28080/api",
"token": "test1"
"baseUrl": "http://127.0.0.1:48080/admin-api",
"token": "test1",
"adminTenentId": "1",
"appApi": "http://127.0.0.1:48080/app-api",
"appToken": "test1",
"appTenentId": "1"
}
}

View File

@@ -1,4 +1,4 @@
config.stopBubbling = true
lombok.tostring.callsuper=true
lombok.equalsandhashcode.callsuper=true
lombok.tostring.callsuper=CALL
lombok.equalsandhashcode.callsuper=CALL
lombok.accessors.chain=true

44
pom.xml
View File

@@ -10,22 +10,32 @@
<modules>
<module>yudao-dependencies</module>
<module>yudao-framework</module>
<module>yudao-admin-server</module>
<module>yudao-user-server</module>
<module>yudao-core-service</module>
<!-- Server 主项目 -->
<module>yudao-server</module>
<!-- 各种 module 拓展 -->
<module>yudao-module-member</module>
<module>yudao-module-bpm</module>
<module>yudao-module-system</module>
<module>yudao-module-infra</module>
<module>yudao-module-tool</module>
<module>yudao-module-pay</module>
</modules>
<name>${artifactId}</name>
<name>${project.artifactId}</name>
<description>芋道项目基础脚手架</description>
<url>https://github.com/YunaiV/ruoyi-vue-pro</url>
<properties>
<revision>1.1.0-snapshot</revision>
<revision>1.6.0-snapshot</revision>
<!-- Maven 相关 -->
<java.version>1.8</java.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
<maven-surefire-plugin.version>3.0.0-M5</maven-surefire-plugin.version>
<maven-compiler-plugin.version>3.8.0</maven-compiler-plugin.version>
<!-- 看看咋放到 bom 里 -->
<lombok.version>1.18.20</lombok.version>
<mapstruct.version>1.4.1.Final</mapstruct.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
@@ -51,6 +61,26 @@
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven-surefire-plugin.version}</version>
</plugin>
<!-- maven-compiler-plugin 插件,解决 Lombok + MapStruct 组合 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-compiler-plugin.version}</version>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
@@ -58,9 +88,9 @@
<!-- 使用 aliyun 的 Maven 源,提升下载速度 -->
<repositories>
<repository>
<id>aliyun</id>
<id>aliyunmaven</id>
<name>aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
<url>https://maven.aliyun.com/repository/public</url>
</repository>
</repositories>

4380
sql/bpm-activiti.sql Normal file

File diff suppressed because one or more lines are too long

1517
sql/bpm-flowable.sql Normal file

File diff suppressed because one or more lines are too long

View File

@@ -1,17 +1,17 @@
/*
Navicat Premium Data Transfer
Source Server : local-mysql001
Source Server : 127.0.0.1
Source Server Type : MySQL
Source Server Version : 50718
Source Server Version : 80026
Source Host : localhost:3306
Source Schema : ruoyi-vue-pro
Target Server Type : MySQL
Target Server Version : 50718
Target Server Version : 80026
File Encoding : 65001
Date: 03/05/2021 12:01:37
Date: 05/02/2022 00:50:30
*/
SET NAMES utf8mb4;
@@ -22,14 +22,14 @@ SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
DROP TABLE IF EXISTS `QRTZ_BLOB_TRIGGERS`;
CREATE TABLE `QRTZ_BLOB_TRIGGERS` (
`SCHED_NAME` varchar(120) NOT NULL,
`TRIGGER_NAME` varchar(190) NOT NULL,
`TRIGGER_GROUP` varchar(190) NOT NULL,
`SCHED_NAME` varchar(120) COLLATE utf8mb4_unicode_ci NOT NULL,
`TRIGGER_NAME` varchar(190) COLLATE utf8mb4_unicode_ci NOT NULL,
`TRIGGER_GROUP` varchar(190) COLLATE utf8mb4_unicode_ci NOT NULL,
`BLOB_DATA` blob,
PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),
KEY `SCHED_NAME` (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),
CONSTRAINT `qrtz_blob_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `QRTZ_TRIGGERS` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- ----------------------------
-- Records of QRTZ_BLOB_TRIGGERS
@@ -42,11 +42,11 @@ COMMIT;
-- ----------------------------
DROP TABLE IF EXISTS `QRTZ_CALENDARS`;
CREATE TABLE `QRTZ_CALENDARS` (
`SCHED_NAME` varchar(120) NOT NULL,
`CALENDAR_NAME` varchar(190) NOT NULL,
`SCHED_NAME` varchar(120) COLLATE utf8mb4_unicode_ci NOT NULL,
`CALENDAR_NAME` varchar(190) COLLATE utf8mb4_unicode_ci NOT NULL,
`CALENDAR` blob NOT NULL,
PRIMARY KEY (`SCHED_NAME`,`CALENDAR_NAME`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- ----------------------------
-- Records of QRTZ_CALENDARS
@@ -59,20 +59,21 @@ COMMIT;
-- ----------------------------
DROP TABLE IF EXISTS `QRTZ_CRON_TRIGGERS`;
CREATE TABLE `QRTZ_CRON_TRIGGERS` (
`SCHED_NAME` varchar(120) NOT NULL,
`TRIGGER_NAME` varchar(190) NOT NULL,
`TRIGGER_GROUP` varchar(190) NOT NULL,
`CRON_EXPRESSION` varchar(120) NOT NULL,
`TIME_ZONE_ID` varchar(80) DEFAULT NULL,
`SCHED_NAME` varchar(120) COLLATE utf8mb4_unicode_ci NOT NULL,
`TRIGGER_NAME` varchar(190) COLLATE utf8mb4_unicode_ci NOT NULL,
`TRIGGER_GROUP` varchar(190) COLLATE utf8mb4_unicode_ci NOT NULL,
`CRON_EXPRESSION` varchar(120) COLLATE utf8mb4_unicode_ci NOT NULL,
`TIME_ZONE_ID` varchar(80) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),
CONSTRAINT `qrtz_cron_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `QRTZ_TRIGGERS` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- ----------------------------
-- Records of QRTZ_CRON_TRIGGERS
-- ----------------------------
BEGIN;
INSERT INTO `QRTZ_CRON_TRIGGERS` VALUES ('schedulerName', 'sysUserSessionTimeoutJob', 'DEFAULT', '0 * * * * ? *', 'Asia/Shanghai');
INSERT INTO `QRTZ_CRON_TRIGGERS` VALUES ('schedulerName', 'payNotifyJob', 'DEFAULT', '* * * * * ?', 'Asia/Shanghai');
INSERT INTO `QRTZ_CRON_TRIGGERS` VALUES ('schedulerName', 'userSessionTimeoutJob', 'DEFAULT', '0 * * * * ? *', 'Asia/Shanghai');
COMMIT;
-- ----------------------------
@@ -80,19 +81,19 @@ COMMIT;
-- ----------------------------
DROP TABLE IF EXISTS `QRTZ_FIRED_TRIGGERS`;
CREATE TABLE `QRTZ_FIRED_TRIGGERS` (
`SCHED_NAME` varchar(120) NOT NULL,
`ENTRY_ID` varchar(95) NOT NULL,
`TRIGGER_NAME` varchar(190) NOT NULL,
`TRIGGER_GROUP` varchar(190) NOT NULL,
`INSTANCE_NAME` varchar(190) NOT NULL,
`FIRED_TIME` bigint(13) NOT NULL,
`SCHED_TIME` bigint(13) NOT NULL,
`PRIORITY` int(11) NOT NULL,
`STATE` varchar(16) NOT NULL,
`JOB_NAME` varchar(190) DEFAULT NULL,
`JOB_GROUP` varchar(190) DEFAULT NULL,
`IS_NONCONCURRENT` varchar(1) DEFAULT NULL,
`REQUESTS_RECOVERY` varchar(1) DEFAULT NULL,
`SCHED_NAME` varchar(120) COLLATE utf8mb4_unicode_ci NOT NULL,
`ENTRY_ID` varchar(95) COLLATE utf8mb4_unicode_ci NOT NULL,
`TRIGGER_NAME` varchar(190) COLLATE utf8mb4_unicode_ci NOT NULL,
`TRIGGER_GROUP` varchar(190) COLLATE utf8mb4_unicode_ci NOT NULL,
`INSTANCE_NAME` varchar(190) COLLATE utf8mb4_unicode_ci NOT NULL,
`FIRED_TIME` bigint NOT NULL,
`SCHED_TIME` bigint NOT NULL,
`PRIORITY` int NOT NULL,
`STATE` varchar(16) COLLATE utf8mb4_unicode_ci NOT NULL,
`JOB_NAME` varchar(190) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`JOB_GROUP` varchar(190) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`IS_NONCONCURRENT` varchar(1) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`REQUESTS_RECOVERY` varchar(1) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
PRIMARY KEY (`SCHED_NAME`,`ENTRY_ID`),
KEY `IDX_QRTZ_FT_TRIG_INST_NAME` (`SCHED_NAME`,`INSTANCE_NAME`),
KEY `IDX_QRTZ_FT_INST_JOB_REQ_RCVRY` (`SCHED_NAME`,`INSTANCE_NAME`,`REQUESTS_RECOVERY`),
@@ -100,7 +101,7 @@ CREATE TABLE `QRTZ_FIRED_TRIGGERS` (
KEY `IDX_QRTZ_FT_JG` (`SCHED_NAME`,`JOB_GROUP`),
KEY `IDX_QRTZ_FT_T_G` (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),
KEY `IDX_QRTZ_FT_TG` (`SCHED_NAME`,`TRIGGER_GROUP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- ----------------------------
-- Records of QRTZ_FIRED_TRIGGERS
@@ -113,26 +114,27 @@ COMMIT;
-- ----------------------------
DROP TABLE IF EXISTS `QRTZ_JOB_DETAILS`;
CREATE TABLE `QRTZ_JOB_DETAILS` (
`SCHED_NAME` varchar(120) NOT NULL,
`JOB_NAME` varchar(190) NOT NULL,
`JOB_GROUP` varchar(190) NOT NULL,
`DESCRIPTION` varchar(250) DEFAULT NULL,
`JOB_CLASS_NAME` varchar(250) NOT NULL,
`IS_DURABLE` varchar(1) NOT NULL,
`IS_NONCONCURRENT` varchar(1) NOT NULL,
`IS_UPDATE_DATA` varchar(1) NOT NULL,
`REQUESTS_RECOVERY` varchar(1) NOT NULL,
`SCHED_NAME` varchar(120) COLLATE utf8mb4_unicode_ci NOT NULL,
`JOB_NAME` varchar(190) COLLATE utf8mb4_unicode_ci NOT NULL,
`JOB_GROUP` varchar(190) COLLATE utf8mb4_unicode_ci NOT NULL,
`DESCRIPTION` varchar(250) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`JOB_CLASS_NAME` varchar(250) COLLATE utf8mb4_unicode_ci NOT NULL,
`IS_DURABLE` varchar(1) COLLATE utf8mb4_unicode_ci NOT NULL,
`IS_NONCONCURRENT` varchar(1) COLLATE utf8mb4_unicode_ci NOT NULL,
`IS_UPDATE_DATA` varchar(1) COLLATE utf8mb4_unicode_ci NOT NULL,
`REQUESTS_RECOVERY` varchar(1) COLLATE utf8mb4_unicode_ci NOT NULL,
`JOB_DATA` blob,
PRIMARY KEY (`SCHED_NAME`,`JOB_NAME`,`JOB_GROUP`),
KEY `IDX_QRTZ_J_REQ_RECOVERY` (`SCHED_NAME`,`REQUESTS_RECOVERY`),
KEY `IDX_QRTZ_J_GRP` (`SCHED_NAME`,`JOB_GROUP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- ----------------------------
-- Records of QRTZ_JOB_DETAILS
-- ----------------------------
BEGIN;
INSERT INTO `QRTZ_JOB_DETAILS` VALUES ('schedulerName', 'sysUserSessionTimeoutJob', 'DEFAULT', NULL, 'cn.iocoder.yudao.framework.quartz.core.handler.JobHandlerInvoker', '0', '1', '1', '0', 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C770800000010000000027400064A4F425F49447372000E6A6176612E6C616E672E4C6F6E673B8BE490CC8F23DF0200014A000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B020000787000000000000000037400104A4F425F48414E444C45525F4E414D457400187379735573657253657373696F6E54696D656F75744A6F627800);
INSERT INTO `QRTZ_JOB_DETAILS` VALUES ('schedulerName', 'payNotifyJob', 'DEFAULT', NULL, 'cn.iocoder.yudao.framework.quartz.core.handler.JobHandlerInvoker', '0', '1', '1', '0', 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C770800000010000000027400064A4F425F49447372000E6A6176612E6C616E672E4C6F6E673B8BE490CC8F23DF0200014A000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B020000787000000000000000057400104A4F425F48414E444C45525F4E414D4574000C7061794E6F746966794A6F627800);
INSERT INTO `QRTZ_JOB_DETAILS` VALUES ('schedulerName', 'userSessionTimeoutJob', 'DEFAULT', NULL, 'cn.iocoder.yudao.framework.quartz.core.handler.JobHandlerInvoker', '0', '1', '1', '0', 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C770800000010000000027400064A4F425F49447372000E6A6176612E6C616E672E4C6F6E673B8BE490CC8F23DF0200014A000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000000000000D7400104A4F425F48414E444C45525F4E414D457400157573657253657373696F6E54696D656F75744A6F627800);
COMMIT;
-- ----------------------------
@@ -140,10 +142,10 @@ COMMIT;
-- ----------------------------
DROP TABLE IF EXISTS `QRTZ_LOCKS`;
CREATE TABLE `QRTZ_LOCKS` (
`SCHED_NAME` varchar(120) NOT NULL,
`LOCK_NAME` varchar(40) NOT NULL,
`SCHED_NAME` varchar(120) COLLATE utf8mb4_unicode_ci NOT NULL,
`LOCK_NAME` varchar(40) COLLATE utf8mb4_unicode_ci NOT NULL,
PRIMARY KEY (`SCHED_NAME`,`LOCK_NAME`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- ----------------------------
-- Records of QRTZ_LOCKS
@@ -158,10 +160,10 @@ COMMIT;
-- ----------------------------
DROP TABLE IF EXISTS `QRTZ_PAUSED_TRIGGER_GRPS`;
CREATE TABLE `QRTZ_PAUSED_TRIGGER_GRPS` (
`SCHED_NAME` varchar(120) NOT NULL,
`TRIGGER_GROUP` varchar(190) NOT NULL,
`SCHED_NAME` varchar(120) COLLATE utf8mb4_unicode_ci NOT NULL,
`TRIGGER_GROUP` varchar(190) COLLATE utf8mb4_unicode_ci NOT NULL,
PRIMARY KEY (`SCHED_NAME`,`TRIGGER_GROUP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- ----------------------------
-- Records of QRTZ_PAUSED_TRIGGER_GRPS
@@ -174,18 +176,18 @@ COMMIT;
-- ----------------------------
DROP TABLE IF EXISTS `QRTZ_SCHEDULER_STATE`;
CREATE TABLE `QRTZ_SCHEDULER_STATE` (
`SCHED_NAME` varchar(120) NOT NULL,
`INSTANCE_NAME` varchar(190) NOT NULL,
`LAST_CHECKIN_TIME` bigint(13) NOT NULL,
`CHECKIN_INTERVAL` bigint(13) NOT NULL,
`SCHED_NAME` varchar(120) COLLATE utf8mb4_unicode_ci NOT NULL,
`INSTANCE_NAME` varchar(190) COLLATE utf8mb4_unicode_ci NOT NULL,
`LAST_CHECKIN_TIME` bigint NOT NULL,
`CHECKIN_INTERVAL` bigint NOT NULL,
PRIMARY KEY (`SCHED_NAME`,`INSTANCE_NAME`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- ----------------------------
-- Records of QRTZ_SCHEDULER_STATE
-- ----------------------------
BEGIN;
INSERT INTO `QRTZ_SCHEDULER_STATE` VALUES ('schedulerName', 'Yunai1620010117445', 1620010210071, 15000);
INSERT INTO `QRTZ_SCHEDULER_STATE` VALUES ('schedulerName', 'Yunai.local1635571630493', 1635572537879, 15000);
COMMIT;
-- ----------------------------
@@ -193,15 +195,15 @@ COMMIT;
-- ----------------------------
DROP TABLE IF EXISTS `QRTZ_SIMPLE_TRIGGERS`;
CREATE TABLE `QRTZ_SIMPLE_TRIGGERS` (
`SCHED_NAME` varchar(120) NOT NULL,
`TRIGGER_NAME` varchar(190) NOT NULL,
`TRIGGER_GROUP` varchar(190) NOT NULL,
`REPEAT_COUNT` bigint(7) NOT NULL,
`REPEAT_INTERVAL` bigint(12) NOT NULL,
`TIMES_TRIGGERED` bigint(10) NOT NULL,
`SCHED_NAME` varchar(120) COLLATE utf8mb4_unicode_ci NOT NULL,
`TRIGGER_NAME` varchar(190) COLLATE utf8mb4_unicode_ci NOT NULL,
`TRIGGER_GROUP` varchar(190) COLLATE utf8mb4_unicode_ci NOT NULL,
`REPEAT_COUNT` bigint NOT NULL,
`REPEAT_INTERVAL` bigint NOT NULL,
`TIMES_TRIGGERED` bigint NOT NULL,
PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),
CONSTRAINT `qrtz_simple_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `QRTZ_TRIGGERS` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- ----------------------------
-- Records of QRTZ_SIMPLE_TRIGGERS
@@ -214,23 +216,23 @@ COMMIT;
-- ----------------------------
DROP TABLE IF EXISTS `QRTZ_SIMPROP_TRIGGERS`;
CREATE TABLE `QRTZ_SIMPROP_TRIGGERS` (
`SCHED_NAME` varchar(120) NOT NULL,
`TRIGGER_NAME` varchar(190) NOT NULL,
`TRIGGER_GROUP` varchar(190) NOT NULL,
`STR_PROP_1` varchar(512) DEFAULT NULL,
`STR_PROP_2` varchar(512) DEFAULT NULL,
`STR_PROP_3` varchar(512) DEFAULT NULL,
`INT_PROP_1` int(11) DEFAULT NULL,
`INT_PROP_2` int(11) DEFAULT NULL,
`LONG_PROP_1` bigint(20) DEFAULT NULL,
`LONG_PROP_2` bigint(20) DEFAULT NULL,
`SCHED_NAME` varchar(120) COLLATE utf8mb4_unicode_ci NOT NULL,
`TRIGGER_NAME` varchar(190) COLLATE utf8mb4_unicode_ci NOT NULL,
`TRIGGER_GROUP` varchar(190) COLLATE utf8mb4_unicode_ci NOT NULL,
`STR_PROP_1` varchar(512) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`STR_PROP_2` varchar(512) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`STR_PROP_3` varchar(512) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`INT_PROP_1` int DEFAULT NULL,
`INT_PROP_2` int DEFAULT NULL,
`LONG_PROP_1` bigint DEFAULT NULL,
`LONG_PROP_2` bigint DEFAULT NULL,
`DEC_PROP_1` decimal(13,4) DEFAULT NULL,
`DEC_PROP_2` decimal(13,4) DEFAULT NULL,
`BOOL_PROP_1` varchar(1) DEFAULT NULL,
`BOOL_PROP_2` varchar(1) DEFAULT NULL,
`BOOL_PROP_1` varchar(1) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`BOOL_PROP_2` varchar(1) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),
CONSTRAINT `qrtz_simprop_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `QRTZ_TRIGGERS` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- ----------------------------
-- Records of QRTZ_SIMPROP_TRIGGERS
@@ -243,21 +245,21 @@ COMMIT;
-- ----------------------------
DROP TABLE IF EXISTS `QRTZ_TRIGGERS`;
CREATE TABLE `QRTZ_TRIGGERS` (
`SCHED_NAME` varchar(120) NOT NULL,
`TRIGGER_NAME` varchar(190) NOT NULL,
`TRIGGER_GROUP` varchar(190) NOT NULL,
`JOB_NAME` varchar(190) NOT NULL,
`JOB_GROUP` varchar(190) NOT NULL,
`DESCRIPTION` varchar(250) DEFAULT NULL,
`NEXT_FIRE_TIME` bigint(13) DEFAULT NULL,
`PREV_FIRE_TIME` bigint(13) DEFAULT NULL,
`PRIORITY` int(11) DEFAULT NULL,
`TRIGGER_STATE` varchar(16) NOT NULL,
`TRIGGER_TYPE` varchar(8) NOT NULL,
`START_TIME` bigint(13) NOT NULL,
`END_TIME` bigint(13) DEFAULT NULL,
`CALENDAR_NAME` varchar(190) DEFAULT NULL,
`MISFIRE_INSTR` smallint(2) DEFAULT NULL,
`SCHED_NAME` varchar(120) COLLATE utf8mb4_unicode_ci NOT NULL,
`TRIGGER_NAME` varchar(190) COLLATE utf8mb4_unicode_ci NOT NULL,
`TRIGGER_GROUP` varchar(190) COLLATE utf8mb4_unicode_ci NOT NULL,
`JOB_NAME` varchar(190) COLLATE utf8mb4_unicode_ci NOT NULL,
`JOB_GROUP` varchar(190) COLLATE utf8mb4_unicode_ci NOT NULL,
`DESCRIPTION` varchar(250) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`NEXT_FIRE_TIME` bigint DEFAULT NULL,
`PREV_FIRE_TIME` bigint DEFAULT NULL,
`PRIORITY` int DEFAULT NULL,
`TRIGGER_STATE` varchar(16) COLLATE utf8mb4_unicode_ci NOT NULL,
`TRIGGER_TYPE` varchar(8) COLLATE utf8mb4_unicode_ci NOT NULL,
`START_TIME` bigint NOT NULL,
`END_TIME` bigint DEFAULT NULL,
`CALENDAR_NAME` varchar(190) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`MISFIRE_INSTR` smallint DEFAULT NULL,
`JOB_DATA` blob,
PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),
KEY `IDX_QRTZ_T_J` (`SCHED_NAME`,`JOB_NAME`,`JOB_GROUP`),
@@ -273,13 +275,14 @@ CREATE TABLE `QRTZ_TRIGGERS` (
KEY `IDX_QRTZ_T_NFT_ST_MISFIRE` (`SCHED_NAME`,`MISFIRE_INSTR`,`NEXT_FIRE_TIME`,`TRIGGER_STATE`),
KEY `IDX_QRTZ_T_NFT_ST_MISFIRE_GRP` (`SCHED_NAME`,`MISFIRE_INSTR`,`NEXT_FIRE_TIME`,`TRIGGER_GROUP`,`TRIGGER_STATE`),
CONSTRAINT `qrtz_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) REFERENCES `QRTZ_JOB_DETAILS` (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- ----------------------------
-- Records of QRTZ_TRIGGERS
-- ----------------------------
BEGIN;
INSERT INTO `QRTZ_TRIGGERS` VALUES ('schedulerName', 'sysUserSessionTimeoutJob', 'DEFAULT', 'sysUserSessionTimeoutJob', 'DEFAULT', NULL, 1620010260000, 1620010200000, 5, 'WAITING', 'CRON', 1613649236000, 0, NULL, 0, 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C770800000010000000037400114A4F425F48414E444C45525F504152414D707400124A4F425F52455452595F494E54455256414C737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000007D074000F4A4F425F52455452595F434F554E547371007E0009000000037800);
INSERT INTO `QRTZ_TRIGGERS` VALUES ('schedulerName', 'payNotifyJob', 'DEFAULT', 'payNotifyJob', 'DEFAULT', NULL, 1635572540000, 1635572539000, 5, 'WAITING', 'CRON', 1635294882000, 0, NULL, 0, 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C770800000010000000037400114A4F425F48414E444C45525F504152414D707400124A4F425F52455452595F494E54455256414C737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B02000078700000000074000F4A4F425F52455452595F434F554E5471007E000B7800);
INSERT INTO `QRTZ_TRIGGERS` VALUES ('schedulerName', 'userSessionTimeoutJob', 'DEFAULT', 'userSessionTimeoutJob', 'DEFAULT', NULL, 1643993400000, -1, 5, 'WAITING', 'CRON', 1643993386000, 0, NULL, 0, 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C770800000010000000037400114A4F425F48414E444C45525F504152414D707400124A4F425F52455452595F494E54455256414C737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000007D074000F4A4F425F52455452595F434F554E547371007E0009000000037800);
COMMIT;
SET FOREIGN_KEY_CHECKS = 1;

File diff suppressed because one or more lines are too long

View File

@@ -1,155 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>cn.iocoder.boot</groupId>
<artifactId>yudao</artifactId>
<version>${revision}</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>yudao-admin-server</artifactId>
<packaging>jar</packaging>
<name>yudao-admin-server</name>
<description>管理后台 Server提供其 API 接口</description>
<url>https://github.com/YunaiV/ruoyi-vue-pro</url>
<dependencies>
<!-- 业务组件 -->
<dependency>
<groupId>cn.iocoder.boot</groupId>
<artifactId>yudao-core-service</artifactId>
</dependency>
<dependency>
<groupId>cn.iocoder.boot</groupId>
<artifactId>yudao-spring-boot-starter-biz-operatelog</artifactId>
</dependency>
<dependency>
<groupId>cn.iocoder.boot</groupId>
<artifactId>yudao-spring-boot-starter-biz-dict</artifactId>
</dependency>
<dependency>
<groupId>cn.iocoder.boot</groupId>
<artifactId>yudao-spring-boot-starter-biz-sms</artifactId>
</dependency>
<!-- Web 相关 -->
<dependency>
<groupId>cn.iocoder.boot</groupId>
<artifactId>yudao-spring-boot-starter-web</artifactId>
</dependency>
<!-- spring boot 配置所需依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>cn.iocoder.boot</groupId>
<artifactId>yudao-spring-boot-starter-security</artifactId>
</dependency>
<!-- DB 相关 -->
<dependency>
<groupId>cn.iocoder.boot</groupId>
<artifactId>yudao-spring-boot-starter-mybatis</artifactId>
</dependency>
<dependency>
<groupId>cn.iocoder.boot</groupId>
<artifactId>yudao-spring-boot-starter-redis</artifactId>
</dependency>
<!-- Config 配置中心相关 -->
<dependency>
<groupId>cn.iocoder.boot</groupId>
<artifactId>yudao-spring-boot-starter-config</artifactId>
</dependency>
<!-- Job 定时任务相关 -->
<dependency>
<groupId>cn.iocoder.boot</groupId>
<artifactId>yudao-spring-boot-starter-job</artifactId>
</dependency>
<!-- 消息队列相关 -->
<dependency>
<groupId>cn.iocoder.boot</groupId>
<artifactId>yudao-spring-boot-starter-mq</artifactId>
</dependency>
<!-- 服务保障相关 -->
<dependency>
<groupId>cn.iocoder.boot</groupId>
<artifactId>yudao-spring-boot-starter-protection</artifactId>
</dependency>
<!-- 监控相关 -->
<dependency>
<groupId>cn.iocoder.boot</groupId>
<artifactId>yudao-spring-boot-starter-monitor</artifactId>
</dependency>
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId> <!-- 实现 Spring Boot Admin Server 服务端 -->
</dependency>
<!-- Test 测试相关 -->
<dependency>
<groupId>cn.iocoder.boot</groupId>
<artifactId>yudao-spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 工具类相关 -->
<dependency>
<groupId>cn.iocoder.boot</groupId>
<artifactId>yudao-spring-boot-starter-excel</artifactId>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
</dependency>
<dependency>
<groupId>cn.smallbun.screw</groupId>
<artifactId>screw-core</artifactId> <!-- 实现数据库文档 -->
</dependency>
<!-- TODO 后续看情况,进行调整 -->
<dependency>
<groupId>com.xkcoding.justauth</groupId>
<artifactId>justauth-spring-boot-starter</artifactId>
<version>1.4.0</version>
</dependency>
</dependencies>
<build>
<!-- 设置构建的 jar 包名 -->
<finalName>${artifactId}</finalName>
<plugins>
<!-- 打包 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal> <!-- 将引入的 jar 打入其中 -->
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

View File

@@ -1,14 +0,0 @@
package cn.iocoder.yudao.adminserver;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SuppressWarnings("SpringComponentScan") // 忽略 IDEA 无法识别 ${yudao.info.base-package} 和 ${yudao.core-service.base-package}
@SpringBootApplication(scanBasePackages = {"${yudao.info.base-package}", "${yudao.core-service.base-package}"})
public class AdminServerApplication {
public static void main(String[] args) {
SpringApplication.run(AdminServerApplication.class, args);
}
}

View File

@@ -1,9 +0,0 @@
package cn.iocoder.yudao.adminserver.framework.async.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
@Configuration
@EnableAsync
public class AsyncConfiguration {
}

View File

@@ -1,4 +0,0 @@
/**
* 异步执行,基于 Spring @Async 实现
*/
package cn.iocoder.yudao.adminserver.framework.async;

View File

@@ -1,4 +0,0 @@
/**
* 使用 Spring Boot Admin 实现简单的监控平台
*/
package cn.iocoder.yudao.adminserver.framework.monitor;

View File

@@ -1,6 +0,0 @@
/**
* 属于整个 yudao-admin-server 的 framework 封装
*
* @author 芋道源码
*/
package cn.iocoder.yudao.adminserver.framework;

View File

@@ -1,39 +0,0 @@
package cn.iocoder.yudao.adminserver.framework.security;
import cn.iocoder.yudao.framework.web.config.WebProperties;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.Customizer;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer;
import javax.annotation.Resource;
@Configuration
public class SecurityConfiguration {
@Resource
private WebProperties webProperties;
@Value("${spring.boot.admin.context-path:''}")
private String adminSeverContextPath;
@Bean
public Customizer<ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry> authorizeRequestsCustomizer() {
return registry -> {
// 通用的接口,可匿名访问 TODO 芋艿:需要抽象出去
registry.antMatchers(api("/system/captcha/**")).anonymous();
// Spring Boot Admin Server 的安全配置 TODO 芋艿:需要抽象出去
registry.antMatchers(adminSeverContextPath).anonymous()
.antMatchers(adminSeverContextPath + "/**").anonymous();
// 短信回调 API
registry.antMatchers(api("/system/sms/callback/**")).anonymous();
};
}
private String api(String url) {
return webProperties.getApiPrefix() + url;
}
}

View File

@@ -1,105 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.controller.config;
import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.config.InfConfigDO;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.*;
import cn.iocoder.yudao.adminserver.modules.infra.convert.config.InfConfigConvert;
import cn.iocoder.yudao.adminserver.modules.infra.service.config.InfConfigService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import java.util.List;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
import static cn.iocoder.yudao.adminserver.modules.infra.enums.InfErrorCodeConstants.CONFIG_GET_VALUE_ERROR_IF_SENSITIVE;
@Api(tags = "参数配置")
@RestController
@RequestMapping("/infra/config")
@Validated
public class InfConfigController {
@Resource
private InfConfigService configService;
@PostMapping("/create")
@ApiOperation("创建参数配置")
@PreAuthorize("@ss.hasPermission('infra:config:create')")
public CommonResult<Long> createConfig(@Valid @RequestBody InfConfigCreateReqVO reqVO) {
return success(configService.createConfig(reqVO));
}
@PutMapping("/update")
@ApiOperation("修改参数配置")
@PreAuthorize("@ss.hasPermission('infra:config:update')")
public CommonResult<Boolean> updateConfig(@Valid @RequestBody InfConfigUpdateReqVO reqVO) {
configService.updateConfig(reqVO);
return success(true);
}
@DeleteMapping("/delete")
@ApiOperation("删除参数配置")
@ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
@PreAuthorize("@ss.hasPermission('infra:config:delete')")
public CommonResult<Boolean> deleteConfig(@RequestParam("id") Long id) {
configService.deleteConfig(id);
return success(true);
}
@GetMapping(value = "/get")
@ApiOperation("获得参数配置")
@ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
@PreAuthorize("@ss.hasPermission('infra:config:query')")
public CommonResult<InfConfigRespVO> getConfig(@RequestParam("id") Long id) {
return success(InfConfigConvert.INSTANCE.convert(configService.getConfig(id)));
}
@GetMapping(value = "/get-value-by-key")
@ApiOperation(value = "根据参数键名查询参数值", notes = "敏感配置,不允许返回给前端")
@ApiImplicitParam(name = "key", value = "参数键", required = true, example = "yunai.biz.username", dataTypeClass = String.class)
public CommonResult<String> getConfigKey(@RequestParam("key") String key) {
InfConfigDO config = configService.getConfigByKey(key);
if (config == null) {
return null;
}
if (config.getSensitive()) {
throw exception(CONFIG_GET_VALUE_ERROR_IF_SENSITIVE);
}
return success(config.getValue());
}
@GetMapping("/page")
@ApiOperation("获取参数配置分页")
@PreAuthorize("@ss.hasPermission('infra:config:query')")
public CommonResult<PageResult<InfConfigRespVO>> getConfigPage(@Valid InfConfigPageReqVO reqVO) {
PageResult<InfConfigDO> page = configService.getConfigPage(reqVO);
return success(InfConfigConvert.INSTANCE.convertPage(page));
}
@GetMapping("/export")
@ApiOperation("导出参数配置")
@PreAuthorize("@ss.hasPermission('infra:config:export')")
@OperateLog(type = EXPORT)
public void exportSysConfig(@Valid InfConfigExportReqVO reqVO,
HttpServletResponse response) throws IOException {
List<InfConfigDO> list = configService.getConfigList(reqVO);
// 拼接数据
List<InfConfigExcelVO> datas = InfConfigConvert.INSTANCE.convertList(list);
// 输出
ExcelUtils.write(response, "参数配置.xls", "数据", InfConfigExcelVO.class, datas);
}
}

View File

@@ -1,40 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
/**
* 参数配置 Base VO提供给添加、修改、详细的子 VO 使用
* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
*/
@Data
public class InfConfigBaseVO {
@ApiModelProperty(value = "参数分组", required = true, example = "biz")
@NotEmpty(message = "参数分组不能为空")
@Size(max = 50, message = "参数名称不能超过50个字符")
private String group;
@ApiModelProperty(value = "参数名称", required = true, example = "数据库名")
@NotBlank(message = "参数名称不能为空")
@Size(max = 100, message = "参数名称不能超过100个字符")
private String name;
@ApiModelProperty(value = "参数键值", required = true, example = "1024")
@NotBlank(message = "参数键值不能为空")
@Size(max = 500, message = "参数键值长度不能超过500个字符")
private String value;
@ApiModelProperty(value = "是否敏感", required = true, example = "true")
@NotNull(message = "是否敏感不能为空")
private Boolean sensitive;
@ApiModelProperty(value = "备注", example = "备注一下很帅气!")
private String remark;
}

View File

@@ -1,21 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
@ApiModel("参数配置创建 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
public class InfConfigCreateReqVO extends InfConfigBaseVO {
@ApiModelProperty(value = "参数键名", required = true, example = "yunai.db.username")
@NotBlank(message = "参数键名长度不能为空")
@Size(max = 100, message = "参数键名长度不能超过100个字符")
private String key;
}

View File

@@ -1,46 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo;
import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
import cn.iocoder.yudao.adminserver.modules.system.enums.SysDictTypeConstants;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import java.util.Date;
/**
* 参数配置 Excel 导出响应 VO
*/
@Data
public class InfConfigExcelVO {
@ExcelProperty("参数配置序号")
private Long id;
@ExcelProperty("参数键名")
private String key;
@ExcelProperty("参数分组")
private String group;
@ExcelProperty("参数名称")
private String name;
@ExcelProperty("参数键值")
private String value;
@ExcelProperty(value = "参数类型", converter = DictConvert.class)
@DictFormat(SysDictTypeConstants.CONFIG_TYPE)
private Integer type;
@ExcelProperty(value = "是否敏感", converter = DictConvert.class)
@DictFormat(SysDictTypeConstants.BOOLEAN_STRING)
private Boolean sensitive;
@ExcelProperty("备注")
private String remark;
@ExcelProperty("创建时间")
private Date createTime;
}

View File

@@ -1,33 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@ApiModel("参数配置导出 Request VO")
@Data
public class InfConfigExportReqVO {
@ApiModelProperty(value = "参数名称", example = "模糊匹配")
private String name;
@ApiModelProperty(value = "参数键名", example = "yunai.db.username", notes = "模糊匹配")
private String key;
@ApiModelProperty(value = "参数类型", example = "1", notes = "参见 SysConfigTypeEnum 枚举")
private Integer type;
@ApiModelProperty(value = "开始时间", example = "2020-10-24 00:00:00")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private Date beginTime;
@ApiModelProperty(value = "结束时间", example = "2020-10-24 23:59:59")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private Date endTime;
}

View File

@@ -1,38 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@ApiModel("参数配置分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class InfConfigPageReqVO extends PageParam {
@ApiModelProperty(value = "参数名称", example = "模糊匹配")
private String name;
@ApiModelProperty(value = "参数键名", example = "yunai.db.username", notes = "模糊匹配")
private String key;
@ApiModelProperty(value = "参数类型", example = "1", notes = "参见 SysConfigTypeEnum 枚举")
private Integer type;
@ApiModelProperty(value = "开始时间", example = "2020-10-24 00:00:00")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private Date beginTime;
@ApiModelProperty(value = "结束时间", example = "2020-10-24 23:59:59")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private Date endTime;
}

View File

@@ -1,31 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import java.util.Date;
@ApiModel("参数配置信息 Response VO")
@Data
@EqualsAndHashCode(callSuper = true)
public class InfConfigRespVO extends InfConfigBaseVO {
@ApiModelProperty(value = "参数配置序号", required = true, example = "1024")
private Long id;
@ApiModelProperty(value = "参数键名", required = true, example = "yunai.db.username")
@NotBlank(message = "参数键名长度不能为空")
@Size(max = 100, message = "参数键名长度不能超过100个字符")
private String key;
@ApiModelProperty(value = "参数类型", required = true, example = "1", notes = "参见 SysConfigTypeEnum 枚举")
private Integer type;
@ApiModelProperty(value = "创建时间", required = true, example = "时间戳格式")
private Date createTime;
}

View File

@@ -1,21 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import javax.validation.constraints.NotNull;
@ApiModel("参数配置创建 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class InfConfigUpdateReqVO extends InfConfigBaseVO {
@ApiModelProperty(value = "参数配置序号", required = true, example = "1024")
@NotNull(message = "参数配置编号不能为空")
private Long id;
}

View File

@@ -1,155 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.controller.doc;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
import cn.smallbun.screw.core.Configuration;
import cn.smallbun.screw.core.engine.EngineConfig;
import cn.smallbun.screw.core.engine.EngineFileType;
import cn.smallbun.screw.core.engine.EngineTemplateType;
import cn.smallbun.screw.core.execute.DocumentationExecute;
import cn.smallbun.screw.core.process.ProcessConfig;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.Collections;
@Api(tags = "数据库文档")
@RestController
@RequestMapping("/infra/db-doc")
public class InfDbDocController {
@Resource
private DynamicDataSourceProperties dynamicDataSourceProperties;
private static final String FILE_OUTPUT_DIR = System.getProperty("java.io.tmpdir") + File.separator
+ "db-doc";
private static final String DOC_FILE_NAME = "数据库文档";
private static final String DOC_VERSION = "1.0.0";
private static final String DOC_DESCRIPTION = "文档描述";
@GetMapping("/export-html")
@ApiOperation("导出 html 格式的数据文档")
@ApiImplicitParam(name = "deleteFile", value = "是否删除在服务器本地生成的数据库文档", example = "true", dataTypeClass = Boolean.class)
public void exportHtml(@RequestParam(defaultValue = "true") Boolean deleteFile,
HttpServletResponse response) throws IOException {
doExportFile(EngineFileType.HTML, deleteFile, response);
}
@GetMapping("/export-word")
@ApiOperation("导出 word 格式的数据文档")
@ApiImplicitParam(name = "deleteFile", value = "是否删除在服务器本地生成的数据库文档", example = "true", dataTypeClass = Boolean.class)
public void exportWord(@RequestParam(defaultValue = "true") Boolean deleteFile,
HttpServletResponse response) throws IOException {
doExportFile(EngineFileType.WORD, deleteFile, response);
}
@GetMapping("/export-markdown")
@ApiOperation("导出 markdown 格式的数据文档")
@ApiImplicitParam(name = "deleteFile", value = "是否删除在服务器本地生成的数据库文档", example = "true", dataTypeClass = Boolean.class)
public void exportMarkdown(@RequestParam(defaultValue = "true") Boolean deleteFile,
HttpServletResponse response) throws IOException {
doExportFile(EngineFileType.MD, deleteFile, response);
}
private void doExportFile(EngineFileType fileOutputType, Boolean deleteFile,
HttpServletResponse response) throws IOException {
String docFileName = DOC_FILE_NAME + "_" + IdUtil.fastSimpleUUID();
String filePath = doExportFile(fileOutputType, docFileName);
String downloadFileName = DOC_FILE_NAME + fileOutputType.getFileSuffix(); //下载后的文件名
try {
// 读取,返回
ServletUtils.writeAttachment(response, downloadFileName, FileUtil.readBytes(filePath));
} finally {
handleDeleteFile(deleteFile, filePath);
}
}
/**
* 输出文件,返回文件路径
*
* @param fileOutputType 文件类型
* @param fileName 文件名, 无需 ".docx" 等文件后缀
* @return 生成的文件所在路径
*/
private String doExportFile(EngineFileType fileOutputType, String fileName) {
try (HikariDataSource dataSource = buildDataSource()) {
// 创建 screw 的配置
Configuration config = Configuration.builder()
.version(DOC_VERSION) // 版本
.description(DOC_DESCRIPTION) // 描述
.dataSource(dataSource) // 数据源
.engineConfig(buildEngineConfig(fileOutputType, fileName)) // 引擎配置
.produceConfig(buildProcessConfig()) // 处理配置
.build();
// 执行 screw生成数据库文档
new DocumentationExecute(config).execute();
return FILE_OUTPUT_DIR + File.separator + fileName + fileOutputType.getFileSuffix();
}
}
private void handleDeleteFile(Boolean deleteFile, String filePath) {
if (!deleteFile) {
return;
}
FileUtil.del(filePath);
}
/**
* 创建数据源
*/
// TODO 芋艿screw 暂时不支持 druid尴尬
private HikariDataSource buildDataSource() {
// 获得 DataSource 数据源,目前只支持首个
String primary = dynamicDataSourceProperties.getPrimary();
DataSourceProperty dataSourceProperty = dynamicDataSourceProperties.getDatasource().get(primary);
// 创建 HikariConfig 配置类
HikariConfig hikariConfig = new HikariConfig();
hikariConfig.setJdbcUrl(dataSourceProperty.getUrl());
hikariConfig.setUsername(dataSourceProperty.getUsername());
hikariConfig.setPassword(dataSourceProperty.getPassword());
hikariConfig.addDataSourceProperty("useInformationSchema", "true"); // 设置可以获取 tables remarks 信息
// 创建数据源
return new HikariDataSource(hikariConfig);
}
/**
* 创建 screw 的引擎配置
*/
private static EngineConfig buildEngineConfig(EngineFileType fileOutputType, String docFileName) {
return EngineConfig.builder()
.fileOutputDir(FILE_OUTPUT_DIR) // 生成文件路径
.openOutputDir(false) // 打开目录
.fileType(fileOutputType) // 文件类型
.produceType(EngineTemplateType.freemarker) // 文件类型
.fileName(docFileName) // 自定义文件名称
.build();
}
/**
* 创建 screw 的处理配置,一般可忽略
* 指定生成逻辑、当存在指定表、指定表前缀、指定表后缀时,将生成指定表,其余表不生成、并跳过忽略表配置
*/
private static ProcessConfig buildProcessConfig() {
return ProcessConfig.builder()
.ignoreTablePrefix(Collections.singletonList("QRTZ_")) // 忽略表前缀
.build();
}
}

View File

@@ -1,81 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.controller.file;
import cn.hutool.core.io.IoUtil;
import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.file.InfFileDO;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.adminserver.modules.infra.controller.file.vo.InfFilePageReqVO;
import cn.iocoder.yudao.adminserver.modules.infra.controller.file.vo.InfFileRespVO;
import cn.iocoder.yudao.adminserver.modules.infra.convert.file.InfFileConvert;
import cn.iocoder.yudao.adminserver.modules.infra.service.file.InfFileService;
import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@Api(tags = "文件存储")
@RestController
@RequestMapping("/infra/file")
@Validated
@Slf4j
public class InfFileController {
@Resource
private InfFileService fileService;
@PostMapping("/upload")
@ApiOperation("上传文件")
@ApiImplicitParams({
@ApiImplicitParam(name = "file", value = "文件附件", required = true, dataTypeClass = MultipartFile.class),
@ApiImplicitParam(name = "path", value = "文件路径", example = "yudaoyuanma.png", dataTypeClass = String.class)
})
public CommonResult<String> uploadFile(@RequestParam("file") MultipartFile file,
@RequestParam("path") String path) throws IOException {
return success(fileService.createFile(path, IoUtil.readBytes(file.getInputStream())));
}
@DeleteMapping("/delete")
@ApiOperation("删除文件")
@ApiImplicitParam(name = "id", value = "编号", required = true)
@PreAuthorize("@ss.hasPermission('infra:file:delete')")
public CommonResult<Boolean> deleteFile(@RequestParam("id") String id) {
fileService.deleteFile(id);
return success(true);
}
@GetMapping("/get/{path}")
@ApiOperation("下载文件")
@ApiImplicitParam(name = "path", value = "文件附件", required = true, dataTypeClass = MultipartFile.class)
public void getFile(HttpServletResponse response, @PathVariable("path") String path) throws IOException {
InfFileDO file = fileService.getFile(path);
if (file == null) {
log.warn("[getFile][path({}) 文件不存在]", path);
response.setStatus(HttpStatus.NOT_FOUND.value());
return;
}
ServletUtils.writeAttachment(response, path, file.getContent());
}
@GetMapping("/page")
@ApiOperation("获得文件分页")
@PreAuthorize("@ss.hasPermission('infra:file:query')")
public CommonResult<PageResult<InfFileRespVO>> getFilePage(@Valid InfFilePageReqVO pageVO) {
PageResult<InfFileDO> pageResult = fileService.getFilePage(pageVO);
return success(InfFileConvert.INSTANCE.convertPage(pageResult));
}
}

View File

@@ -1,35 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.controller.file.vo;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@ApiModel("文件分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class InfFilePageReqVO extends PageParam {
@ApiModelProperty(value = "文件路径", example = "yudao", notes = "模糊匹配")
private String id;
@ApiModelProperty(value = "文件类型", example = "jpg", notes = "模糊匹配")
private String type;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "开始创建时间")
private Date beginCreateTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "结束创建时间")
private Date endCreateTime;
}

View File

@@ -1,22 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.controller.file.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
@ApiModel(value = "文件 Response VO", description = "不返回 content 字段,太大")
@Data
public class InfFileRespVO {
@ApiModelProperty(value = "文件路径", required = true, example = "yudao.jpg")
private String id;
@ApiModelProperty(value = "文件类型", required = true, example = "jpg")
private String type;
@ApiModelProperty(value = "创建时间", required = true)
private Date createTime;
}

View File

@@ -1,145 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.controller.job;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
import cn.iocoder.yudao.framework.quartz.core.util.CronUtils;
import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.*;
import cn.iocoder.yudao.adminserver.modules.infra.convert.job.InfJobConvert;
import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.job.InfJobDO;
import cn.iocoder.yudao.adminserver.modules.infra.service.job.InfJobService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.quartz.SchedulerException;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
@Api(tags = "定时任务")
@RestController
@RequestMapping("/infra/job")
@Validated
public class InfJobController {
@Resource
private InfJobService jobService;
@PostMapping("/create")
@ApiOperation("创建定时任务")
@PreAuthorize("@ss.hasPermission('infra:job:create')")
public CommonResult<Long> createJob(@Valid @RequestBody InfJobCreateReqVO createReqVO)
throws SchedulerException {
return success(jobService.createJob(createReqVO));
}
@PutMapping("/update")
@ApiOperation("更新定时任务")
@PreAuthorize("@ss.hasPermission('infra:job:update')")
public CommonResult<Boolean> updateJob(@Valid @RequestBody InfJobUpdateReqVO updateReqVO)
throws SchedulerException {
jobService.updateJob(updateReqVO);
return success(true);
}
@PutMapping("/update-status")
@ApiOperation("更新定时任务的状态")
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class),
@ApiImplicitParam(name = "status", value = "状态", required = true, example = "1", dataTypeClass = Integer.class),
})
@PreAuthorize("@ss.hasPermission('infra:job:update')")
public CommonResult<Boolean> updateJobStatus(@RequestParam(value = "id") Long id, @RequestParam("status") Integer status)
throws SchedulerException {
jobService.updateJobStatus(id, status);
return success(true);
}
@DeleteMapping("/delete")
@ApiOperation("删除定时任务")
@ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
@PreAuthorize("@ss.hasPermission('infra:job:delete')")
public CommonResult<Boolean> deleteJob(@RequestParam("id") Long id)
throws SchedulerException {
jobService.deleteJob(id);
return success(true);
}
@PutMapping("/trigger")
@ApiOperation("触发定时任务")
@ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
@PreAuthorize("@ss.hasPermission('infra:job:trigger')")
public CommonResult<Boolean> triggerJob(@RequestParam("id") Long id) throws SchedulerException {
jobService.triggerJob(id);
return success(true);
}
@GetMapping("/get")
@ApiOperation("获得定时任务")
@ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
@PreAuthorize("@ss.hasPermission('infra:job:query')")
public CommonResult<InfJobRespVO> getJob(@RequestParam("id") Long id) {
InfJobDO job = jobService.getJob(id);
return success(InfJobConvert.INSTANCE.convert(job));
}
@GetMapping("/list")
@ApiOperation("获得定时任务列表")
@ApiImplicitParam(name = "ids", value = "编号列表", required = true, dataTypeClass = List.class)
@PreAuthorize("@ss.hasPermission('infra:job:query')")
public CommonResult<List<InfJobRespVO>> getJobList(@RequestParam("ids") Collection<Long> ids) {
List<InfJobDO> list = jobService.getJobList(ids);
return success(InfJobConvert.INSTANCE.convertList(list));
}
@GetMapping("/page")
@ApiOperation("获得定时任务分页")
@PreAuthorize("@ss.hasPermission('infra:job:query')")
public CommonResult<PageResult<InfJobRespVO>> getJobPage(@Valid InfJobPageReqVO pageVO) {
PageResult<InfJobDO> pageResult = jobService.getJobPage(pageVO);
return success(InfJobConvert.INSTANCE.convertPage(pageResult));
}
@GetMapping("/export-excel")
@ApiOperation("导出定时任务 Excel")
@PreAuthorize("@ss.hasPermission('infra:job:export')")
@OperateLog(type = EXPORT)
public void exportJobExcel(@Valid InfJobExportReqVO exportReqVO,
HttpServletResponse response) throws IOException {
List<InfJobDO> list = jobService.getJobList(exportReqVO);
// 导出 Excel
List<InfJobExcelVO> datas = InfJobConvert.INSTANCE.convertList02(list);
ExcelUtils.write(response, "定时任务.xls", "数据", InfJobExcelVO.class, datas);
}
@GetMapping("/get_next_times")
@ApiOperation("获得定时任务的下 n 次执行时间")
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class),
@ApiImplicitParam(name = "count", value = "数量", example = "5", dataTypeClass = Long.class)
})
@PreAuthorize("@ss.hasPermission('infra:job:query')")
public CommonResult<List<Date>> getJobNextTimes(@RequestParam("id") Long id,
@RequestParam(value = "count", required = false, defaultValue = "5") Integer count) {
InfJobDO job = jobService.getJob(id);
if (job == null) {
return success(Collections.emptyList());
}
return success(CronUtils.getNextTimes(job.getCronExpression(), count));
}
}

View File

@@ -1,81 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.controller.job;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log.InfJobLogExcelVO;
import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log.InfJobLogExportReqVO;
import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log.InfJobLogPageReqVO;
import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log.InfJobLogRespVO;
import cn.iocoder.yudao.adminserver.modules.infra.convert.job.InfJobLogConvert;
import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.job.InfJobLogDO;
import cn.iocoder.yudao.adminserver.modules.infra.service.job.InfJobLogService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
@Api(tags = "定时任务日志")
@RestController
@RequestMapping("/infra/job-log")
@Validated
public class InfJobLogController {
@Resource
private InfJobLogService jobLogService;
@GetMapping("/get")
@ApiOperation("获得定时任务日志")
@ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
@PreAuthorize("@ss.hasPermission('infra:job:query')")
public CommonResult<InfJobLogRespVO> getJobLog(@RequestParam("id") Long id) {
InfJobLogDO jobLog = jobLogService.getJobLog(id);
return success(InfJobLogConvert.INSTANCE.convert(jobLog));
}
@GetMapping("/list")
@ApiOperation("获得定时任务日志列表")
@ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class)
@PreAuthorize("@ss.hasPermission('infra:job:query')")
public CommonResult<List<InfJobLogRespVO>> getJobLogList(@RequestParam("ids") Collection<Long> ids) {
List<InfJobLogDO> list = jobLogService.getJobLogList(ids);
return success(InfJobLogConvert.INSTANCE.convertList(list));
}
@GetMapping("/page")
@ApiOperation("获得定时任务日志分页")
@PreAuthorize("@ss.hasPermission('infra:job:query')")
public CommonResult<PageResult<InfJobLogRespVO>> getJobLogPage(@Valid InfJobLogPageReqVO pageVO) {
PageResult<InfJobLogDO> pageResult = jobLogService.getJobLogPage(pageVO);
return success(InfJobLogConvert.INSTANCE.convertPage(pageResult));
}
@GetMapping("/export-excel")
@ApiOperation("导出定时任务日志 Excel")
@PreAuthorize("@ss.hasPermission('infra:job:export')")
@OperateLog(type = EXPORT)
public void exportJobLogExcel(@Valid InfJobLogExportReqVO exportReqVO,
HttpServletResponse response) throws IOException {
List<InfJobLogDO> list = jobLogService.getJobLogList(exportReqVO);
// 导出 Excel
List<InfJobLogExcelVO> datas = InfJobLogConvert.INSTANCE.convertList02(list);
ExcelUtils.write(response, "任务日志.xls", "数据", InfJobLogExcelVO.class, datas);
}
}

View File

@@ -1,37 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
* 定时任务 Base VO提供给添加、修改、详细的子 VO 使用
* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
*/
@Data
public class InfJobBaseVO {
@ApiModelProperty(value = "任务名称", required = true, example = "测试任务")
@NotNull(message = "任务名称不能为空")
private String name;
@ApiModelProperty(value = "处理器的参数", example = "yudao")
private String handlerParam;
@ApiModelProperty(value = "CRON 表达式", required = true, example = "0/10 * * * * ? *")
@NotNull(message = "CRON 表达式不能为空")
private String cronExpression;
@ApiModelProperty(value = "重试次数", required = true, example = "3")
@NotNull(message = "重试次数不能为空")
private Integer retryCount;
@ApiModelProperty(value = "重试间隔", required = true, example = "1000")
@NotNull(message = "重试间隔不能为空")
private Integer retryInterval;
@ApiModelProperty(value = "监控超时时间", example = "1000")
private Integer monitorTimeout;
}

View File

@@ -1,21 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import javax.validation.constraints.NotNull;
@ApiModel("定时任务创建 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class InfJobCreateReqVO extends InfJobBaseVO {
@ApiModelProperty(value = "处理器的名字", required = true, example = "sysUserSessionTimeoutJob")
@NotNull(message = "处理器的名字不能为空")
private String handlerName;
}

View File

@@ -1,56 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job;
import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
import cn.iocoder.yudao.adminserver.modules.infra.enums.InfDictTypeConstants;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import java.util.Date;
/**
* 定时任务 Excel VO
*
* @author 芋道源码
*/
@Data
public class InfJobExcelVO {
@ExcelProperty("任务编号")
private Long id;
@ExcelProperty("任务名称")
private String name;
@ExcelProperty(value = "任务状态", converter = DictConvert.class)
@DictFormat(InfDictTypeConstants.JOB_STATUS)
private Integer status;
@ExcelProperty("处理器的名字")
private String handlerName;
@ExcelProperty("处理器的参数")
private String handlerParam;
@ExcelProperty("CRON 表达式")
private String cronExpression;
@ExcelProperty("最后一次执行的开始时间")
private Date executeBeginTime;
@ExcelProperty("最后一次执行的结束时间")
private Date executeEndTime;
@ExcelProperty("上一次触发时间")
private Date firePrevTime;
@ExcelProperty("下一次触发时间")
private Date fireNextTime;
@ExcelProperty("监控超时时间")
private Integer monitorTimeout;
@ExcelProperty("创建时间")
private Date createTime;
}

View File

@@ -1,20 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ApiModel(value = "定时任务 Excel 导出 Request VO", description = "参数和 InfJobPageReqVO 是一致的")
@Data
public class InfJobExportReqVO {
@ApiModelProperty(value = "任务名称", example = "测试任务", notes = "模糊匹配")
private String name;
@ApiModelProperty(value = "任务状态", example = "1", notes = "参见 InfJobStatusEnum 枚举")
private Integer status;
@ApiModelProperty(value = "处理器的名字", example = "sysUserSessionTimeoutJob", notes = "模糊匹配")
private String handlerName;
}

View File

@@ -1,25 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@ApiModel("定时任务分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class InfJobPageReqVO extends PageParam {
@ApiModelProperty(value = "任务名称", example = "测试任务", notes = "模糊匹配")
private String name;
@ApiModelProperty(value = "任务状态", example = "1", notes = "参见 InfJobStatusEnum 枚举")
private Integer status;
@ApiModelProperty(value = "处理器的名字", example = "sysUserSessionTimeoutJob", notes = "模糊匹配")
private String handlerName;
}

View File

@@ -1,31 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import javax.validation.constraints.NotNull;
import java.util.Date;
@ApiModel("定时任务 Response VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class InfJobRespVO extends InfJobBaseVO {
@ApiModelProperty(value = "任务编号", required = true, example = "1024")
private Long id;
@ApiModelProperty(value = "任务状态", required = true, example = "1")
private Integer status;
@ApiModelProperty(value = "处理器的名字", required = true, example = "sysUserSessionTimeoutJob")
@NotNull(message = "处理器的名字不能为空")
private String handlerName;
@ApiModelProperty(value = "创建时间", required = true)
private Date createTime;
}

View File

@@ -1,21 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import javax.validation.constraints.NotNull;
@ApiModel("定时任务更新 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class InfJobUpdateReqVO extends InfJobBaseVO {
@ApiModelProperty(value = "任务编号", required = true, example = "1024")
@NotNull(message = "任务编号不能为空")
private Long id;
}

View File

@@ -1,53 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.NotNull;
import java.util.Date;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
/**
* 定时任务日志 Base VO提供给添加、修改、详细的子 VO 使用
* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
*/
@Data
public class InfJobLogBaseVO {
@ApiModelProperty(value = "任务编号", required = true, example = "1024")
@NotNull(message = "任务编号不能为空")
private Long jobId;
@ApiModelProperty(value = "处理器的名字", required = true, example = "sysUserSessionTimeoutJob")
@NotNull(message = "处理器的名字不能为空")
private String handlerName;
@ApiModelProperty(value = "处理器的参数", example = "yudao")
private String handlerParam;
@ApiModelProperty(value = "第几次执行", required = true, example = "1")
@NotNull(message = "第几次执行不能为空")
private Integer executeIndex;
@ApiModelProperty(value = "开始执行时间", required = true)
@NotNull(message = "开始执行时间不能为空")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private Date beginTime;
@ApiModelProperty(value = "结束执行时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private Date endTime;
@ApiModelProperty(value = "执行时长", example = "123")
private Integer duration;
@ApiModelProperty(value = "任务状态", required = true, example = "1", notes = "参见 InfJobLogStatusEnum 枚举")
@NotNull(message = "任务状态不能为空")
private Integer status;
@ApiModelProperty(value = "结果数据", example = "执行成功")
private String result;
}

View File

@@ -1,53 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log;
import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
import cn.iocoder.yudao.adminserver.modules.infra.enums.InfDictTypeConstants;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import java.util.Date;
/**
* 定时任务 Excel VO
*
* @author 芋艿
*/
@Data
public class InfJobLogExcelVO {
@ExcelProperty("日志编号")
private Long id;
@ExcelProperty("任务编号")
private Long jobId;
@ExcelProperty("处理器的名字")
private String handlerName;
@ExcelProperty("处理器的参数")
private String handlerParam;
@ExcelProperty("第几次执行")
private Integer executeIndex;
@ExcelProperty("开始执行时间")
private Date beginTime;
@ExcelProperty("结束执行时间")
private Date endTime;
@ExcelProperty("执行时长")
private Integer duration;
@ExcelProperty(value = "任务状态", converter = DictConvert.class)
@DictFormat(InfDictTypeConstants.JOB_STATUS)
private Integer status;
@ExcelProperty("结果数据")
private String result;
@ExcelProperty("创建时间")
private Date createTime;
}

View File

@@ -1,33 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@ApiModel(value = "定时任务 Excel 导出 Request VO", description = "参数和 InfJobLogPageReqVO 是一致的")
@Data
public class InfJobLogExportReqVO {
@ApiModelProperty(value = "任务编号", example = "10")
private Long jobId;
@ApiModelProperty(value = "处理器的名字", notes = "模糊匹配")
private String handlerName;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "开始执行时间")
private Date beginTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "结束执行时间")
private Date endTime;
@ApiModelProperty(value = "任务状态", notes = "参见 InfJobLogStatusEnum 枚举")
private Integer status;
}

View File

@@ -1,38 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@ApiModel("定时任务日志分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class InfJobLogPageReqVO extends PageParam {
@ApiModelProperty(value = "任务编号", example = "10")
private Long jobId;
@ApiModelProperty(value = "处理器的名字", notes = "模糊匹配")
private String handlerName;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "开始执行时间")
private Date beginTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "结束执行时间")
private Date endTime;
@ApiModelProperty(value = "任务状态", notes = "参见 InfJobLogStatusEnum 枚举")
private Integer status;
}

View File

@@ -1,23 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import java.util.Date;
@ApiModel("定时任务日志 Response VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class InfJobLogRespVO extends InfJobLogBaseVO {
@ApiModelProperty(value = "日志编号", required = true, example = "1024")
private Long id;
@ApiModelProperty(value = "创建时间", required = true)
private Date createTime;
}

View File

@@ -1,60 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.controller.logger;
import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiAccessLogDO;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogExcelVO;
import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogExportReqVO;
import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogPageReqVO;
import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogRespVO;
import cn.iocoder.yudao.adminserver.modules.infra.convert.logger.InfApiAccessLogConvert;
import cn.iocoder.yudao.adminserver.modules.infra.service.logger.InfApiAccessLogService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import java.util.List;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
@Api(tags = "API 访问日志")
@RestController
@RequestMapping("/infra/api-access-log")
@Validated
public class InfApiAccessLogController {
@Resource
private InfApiAccessLogService apiAccessLogService;
@GetMapping("/page")
@ApiOperation("获得API 访问日志分页")
@PreAuthorize("@ss.hasPermission('infra:api-access-log:query')")
public CommonResult<PageResult<InfApiAccessLogRespVO>> getApiAccessLogPage(@Valid InfApiAccessLogPageReqVO pageVO) {
PageResult<InfApiAccessLogDO> pageResult = apiAccessLogService.getApiAccessLogPage(pageVO);
return success(InfApiAccessLogConvert.INSTANCE.convertPage(pageResult));
}
@GetMapping("/export-excel")
@ApiOperation("导出API 访问日志 Excel")
@PreAuthorize("@ss.hasPermission('infra:api-access-log:export')")
@OperateLog(type = EXPORT)
public void exportApiAccessLogExcel(@Valid InfApiAccessLogExportReqVO exportReqVO,
HttpServletResponse response) throws IOException {
List<InfApiAccessLogDO> list = apiAccessLogService.getApiAccessLogList(exportReqVO);
// 导出 Excel
List<InfApiAccessLogExcelVO> datas = InfApiAccessLogConvert.INSTANCE.convertList02(list);
ExcelUtils.write(response, "API 访问日志.xls", "数据", InfApiAccessLogExcelVO.class, datas);
}
}

View File

@@ -1,74 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.controller.logger;
import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiErrorLogDO;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogExcelVO;
import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogExportReqVO;
import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogPageReqVO;
import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogRespVO;
import cn.iocoder.yudao.adminserver.modules.infra.convert.logger.InfApiErrorLogConvert;
import cn.iocoder.yudao.adminserver.modules.infra.service.logger.InfApiErrorLogService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import java.util.List;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
@Api(tags = "API 错误日志")
@RestController
@RequestMapping("/infra/api-error-log")
@Validated
public class InfApiErrorLogController {
@Resource
private InfApiErrorLogService apiErrorLogService;
@PutMapping("/update-status")
@ApiOperation("更新 API 错误日志的状态")
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class),
@ApiImplicitParam(name = "processStatus", value = "处理状态", required = true, example = "1", dataTypeClass = Integer.class)
})
@PreAuthorize("@ss.hasPermission('infra:api-error-log:update-status')")
public CommonResult<Boolean> updateApiErrorLogProcess(@RequestParam("id") Long id,
@RequestParam("processStatus") Integer processStatus) {
apiErrorLogService.updateApiErrorLogProcess(id, processStatus, getLoginUserId());
return success(true);
}
@GetMapping("/page")
@ApiOperation("获得 API 错误日志分页")
@PreAuthorize("@ss.hasPermission('infra:api-error-log:query')")
public CommonResult<PageResult<InfApiErrorLogRespVO>> getApiErrorLogPage(@Valid InfApiErrorLogPageReqVO pageVO) {
PageResult<InfApiErrorLogDO> pageResult = apiErrorLogService.getApiErrorLogPage(pageVO);
return success(InfApiErrorLogConvert.INSTANCE.convertPage(pageResult));
}
@GetMapping("/export-excel")
@ApiOperation("导出 API 错误日志 Excel")
@PreAuthorize("@ss.hasPermission('infra:api-error-log:export')")
@OperateLog(type = EXPORT)
public void exportApiErrorLogExcel(@Valid InfApiErrorLogExportReqVO exportReqVO,
HttpServletResponse response) throws IOException {
List<InfApiErrorLogDO> list = apiErrorLogService.getApiErrorLogList(exportReqVO);
// 导出 Excel
List<InfApiErrorLogExcelVO> datas = InfApiErrorLogConvert.INSTANCE.convertList02(list);
ExcelUtils.write(response, "API 错误日志.xls", "数据", InfApiErrorLogExcelVO.class, datas);
}
}

View File

@@ -1,75 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.NotNull;
import java.util.Date;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
/**
* API 访问日志 Base VO提供给添加、修改、详细的子 VO 使用
* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
*/
@Data
public class InfApiAccessLogBaseVO {
@ApiModelProperty(value = "链路追踪编号", required = true, example = "66600cb6-7852-11eb-9439-0242ac130002")
@NotNull(message = "链路追踪编号不能为空")
private String traceId;
@ApiModelProperty(value = "用户编号", required = true, example = "666")
@NotNull(message = "用户编号不能为空")
private Long userId;
@ApiModelProperty(value = "用户类型", required = true, example = "2", notes = "参见 UserTypeEnum 枚举")
@NotNull(message = "用户类型不能为空")
private Integer userType;
@ApiModelProperty(value = "应用名", required = true, example = "dashboard")
@NotNull(message = "应用名不能为空")
private String applicationName;
@ApiModelProperty(value = "请求方法名", required = true, example = "GET")
@NotNull(message = "请求方法名不能为空")
private String requestMethod;
@ApiModelProperty(value = "请求地址", required = true, example = "/xxx/yyy")
@NotNull(message = "请求地址不能为空")
private String requestUrl;
@ApiModelProperty(value = "请求参数")
private String requestParams;
@ApiModelProperty(value = "用户 IP", required = true, example = "127.0.0.1")
@NotNull(message = "用户 IP不能为空")
private String userIp;
@ApiModelProperty(value = "浏览器 UA", required = true, example = "Mozilla/5.0")
@NotNull(message = "浏览器 UA不能为空")
private String userAgent;
@ApiModelProperty(value = "开始请求时间", required = true)
@NotNull(message = "开始请求时间不能为空")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private Date beginTime;
@ApiModelProperty(value = "结束请求时间", required = true)
@NotNull(message = "结束请求时间不能为空")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private Date endTime;
@ApiModelProperty(value = "执行时长", required = true, example = "100")
@NotNull(message = "执行时长不能为空")
private Integer duration;
@ApiModelProperty(value = "结果码", required = true, example = "0")
@NotNull(message = "结果码不能为空")
private Integer resultCode;
@ApiModelProperty(value = "结果提示", example = "芋道源码,牛逼!")
private String resultMsg;
}

View File

@@ -1,65 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog;
import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
import cn.iocoder.yudao.adminserver.modules.system.enums.SysDictTypeConstants;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import java.util.Date;
/**
* API 访问日志 Excel VO
*
* @author 芋道源码
*/
@Data
public class InfApiAccessLogExcelVO {
@ExcelProperty("日志主键")
private Long id;
@ExcelProperty("链路追踪编号")
private String traceId;
@ExcelProperty("用户编号")
private Long userId;
@ExcelProperty(value = "用户类型", converter = DictConvert.class)
@DictFormat(SysDictTypeConstants.USER_TYPE)
private Integer userType;
@ExcelProperty("应用名")
private String applicationName;
@ExcelProperty("请求方法名")
private String requestMethod;
@ExcelProperty("请求地址")
private String requestUrl;
@ExcelProperty("请求参数")
private String requestParams;
@ExcelProperty("用户 IP")
private String userIp;
@ExcelProperty("浏览器 UA")
private String userAgent;
@ExcelProperty("开始请求时间")
private Date beginTime;
@ExcelProperty("结束请求时间")
private Date endTime;
@ExcelProperty("执行时长")
private Integer duration;
@ExcelProperty("结果码")
private Integer resultCode;
@ExcelProperty("结果提示")
private String resultMsg;
}

View File

@@ -1,42 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@ApiModel(value = "API 访问日志 Excel 导出 Request VO", description = "参数和 InfApiAccessLogPageReqVO 是一致的")
@Data
public class InfApiAccessLogExportReqVO {
@ApiModelProperty(value = "用户编号", example = "666")
private Long userId;
@ApiModelProperty(value = "用户类型", example = "2")
private Integer userType;
@ApiModelProperty(value = "应用名", example = "dashboard")
private String applicationName;
@ApiModelProperty(value = "请求地址", example = "/xxx/yyy", notes = "模糊匹配")
private String requestUrl;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "开始开始请求时间")
private Date beginBeginTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "结束开始请求时间")
private Date endBeginTime;
@ApiModelProperty(value = "执行时长", example = "100", notes = "大于等于,单位:毫秒")
private Integer duration;
@ApiModelProperty(value = "结果码", example = "0")
private Integer resultCode;
}

View File

@@ -1,47 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@ApiModel("API 访问日志分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class InfApiAccessLogPageReqVO extends PageParam {
@ApiModelProperty(value = "用户编号", example = "666")
private Long userId;
@ApiModelProperty(value = "用户类型", example = "2")
private Integer userType;
@ApiModelProperty(value = "应用名", example = "dashboard")
private String applicationName;
@ApiModelProperty(value = "请求地址", example = "/xxx/yyy", notes = "模糊匹配")
private String requestUrl;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "开始开始请求时间")
private Date beginBeginTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "结束开始请求时间")
private Date endBeginTime;
@ApiModelProperty(value = "执行时长", example = "100", notes = "大于等于,单位:毫秒")
private Integer duration;
@ApiModelProperty(value = "结果码", example = "0")
private Integer resultCode;
}

View File

@@ -1,23 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import java.util.Date;
@ApiModel("API 访问日志 Response VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class InfApiAccessLogRespVO extends InfApiAccessLogBaseVO {
@ApiModelProperty(value = "日志主键", required = true, example = "1024")
private Long id;
@ApiModelProperty(value = "创建时间", required = true)
private Date createTime;
}

View File

@@ -1,96 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.NotNull;
import java.util.Date;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
/**
* API 错误日志 Base VO提供给添加、修改、详细的子 VO 使用
* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
*/
@Data
public class InfApiErrorLogBaseVO {
@ApiModelProperty(value = "链路追踪编号", required = true, example = "66600cb6-7852-11eb-9439-0242ac130002")
@NotNull(message = "链路追踪编号不能为空")
private String traceId;
@ApiModelProperty(value = "用户编号", required = true, example = "666")
@NotNull(message = "用户编号不能为空")
private Integer userId;
@ApiModelProperty(value = "用户类型", required = true, example = "1")
@NotNull(message = "用户类型不能为空")
private Integer userType;
@ApiModelProperty(value = "应用名", required = true, example = "dashboard")
@NotNull(message = "应用名不能为空")
private String applicationName;
@ApiModelProperty(value = "请求方法名", required = true, example = "GET")
@NotNull(message = "请求方法名不能为空")
private String requestMethod;
@ApiModelProperty(value = "请求地址", required = true, example = "/xx/yy")
@NotNull(message = "请求地址不能为空")
private String requestUrl;
@ApiModelProperty(value = "请求参数", required = true)
@NotNull(message = "请求参数不能为空")
private String requestParams;
@ApiModelProperty(value = "用户 IP", required = true, example = "127.0.0.1")
@NotNull(message = "用户 IP不能为空")
private String userIp;
@ApiModelProperty(value = "浏览器 UA", required = true, example = "Mozilla/5.0")
@NotNull(message = "浏览器 UA不能为空")
private String userAgent;
@ApiModelProperty(value = "异常发生时间", required = true)
@NotNull(message = "异常发生时间不能为空")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private Date exceptionTime;
@ApiModelProperty(value = "异常名", required = true)
@NotNull(message = "异常名不能为空")
private String exceptionName;
@ApiModelProperty(value = "异常导致的消息", required = true)
@NotNull(message = "异常导致的消息不能为空")
private String exceptionMessage;
@ApiModelProperty(value = "异常导致的根消息", required = true)
@NotNull(message = "异常导致的根消息不能为空")
private String exceptionRootCauseMessage;
@ApiModelProperty(value = "异常的栈轨迹", required = true)
@NotNull(message = "异常的栈轨迹不能为空")
private String exceptionStackTrace;
@ApiModelProperty(value = "异常发生的类全名", required = true)
@NotNull(message = "异常发生的类全名不能为空")
private String exceptionClassName;
@ApiModelProperty(value = "异常发生的类文件", required = true)
@NotNull(message = "异常发生的类文件不能为空")
private String exceptionFileName;
@ApiModelProperty(value = "异常发生的方法名", required = true)
@NotNull(message = "异常发生的方法名不能为空")
private String exceptionMethodName;
@ApiModelProperty(value = "异常发生的方法所在行", required = true)
@NotNull(message = "异常发生的方法所在行不能为空")
private Integer exceptionLineNumber;
@ApiModelProperty(value = "处理状态", required = true, example = "0")
@NotNull(message = "处理状态不能为空")
private Integer processStatus;
}

View File

@@ -1,91 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog;
import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
import cn.iocoder.yudao.adminserver.modules.infra.enums.InfDictTypeConstants;
import cn.iocoder.yudao.adminserver.modules.system.enums.SysDictTypeConstants;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import java.util.Date;
/**
* API 错误日志 Excel VO
*
* @author 芋道源码
*/
@Data
public class InfApiErrorLogExcelVO {
@ExcelProperty("编号")
private Integer id;
@ExcelProperty("链路追踪编号")
private String traceId;
@ExcelProperty("用户编号")
private Integer userId;
@ExcelProperty(value = "用户类型", converter = DictConvert.class)
@DictFormat(SysDictTypeConstants.USER_TYPE)
private Integer userType;
@ExcelProperty("应用名")
private String applicationName;
@ExcelProperty("请求方法名")
private String requestMethod;
@ExcelProperty("请求地址")
private String requestUrl;
@ExcelProperty("请求参数")
private String requestParams;
@ExcelProperty("用户 IP")
private String userIp;
@ExcelProperty("浏览器 UA")
private String userAgent;
@ExcelProperty("异常发生时间")
private Date exceptionTime;
@ExcelProperty("异常名")
private String exceptionName;
@ExcelProperty("异常导致的消息")
private String exceptionMessage;
@ExcelProperty("异常导致的根消息")
private String exceptionRootCauseMessage;
@ExcelProperty("异常的栈轨迹")
private String exceptionStackTrace;
@ExcelProperty("异常发生的类全名")
private String exceptionClassName;
@ExcelProperty("异常发生的类文件")
private String exceptionFileName;
@ExcelProperty("异常发生的方法名")
private String exceptionMethodName;
@ExcelProperty("异常发生的方法所在行")
private Integer exceptionLineNumber;
@ExcelProperty("创建时间")
private Date createTime;
@ExcelProperty(value = "处理状态", converter = DictConvert.class)
@DictFormat(InfDictTypeConstants.API_ERROR_LOG_PROCESS_STATUS)
private Integer processStatus;
@ExcelProperty("处理时间")
private Date processTime;
@ExcelProperty("处理用户编号")
private Integer processUserId;
}

View File

@@ -1,39 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@ApiModel(value = "API 错误日志 Excel 导出 Request VO", description = "参数和 InfApiErrorLogPageReqVO 是一致的")
@Data
public class InfApiErrorLogExportReqVO {
@ApiModelProperty(value = "用户编号", example = "666")
private Long userId;
@ApiModelProperty(value = "用户类型", example = "1")
private Integer userType;
@ApiModelProperty(value = "应用名", example = "dashboard")
private String applicationName;
@ApiModelProperty(value = "请求地址", example = "/xx/yy")
private String requestUrl;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "开始异常发生时间")
private Date beginExceptionTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "结束异常发生时间")
private Date endExceptionTime;
@ApiModelProperty(value = "处理状态", example = "0")
private Integer processStatus;
}

View File

@@ -1,44 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@ApiModel("API 错误日志分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class InfApiErrorLogPageReqVO extends PageParam {
@ApiModelProperty(value = "用户编号", example = "666")
private Long userId;
@ApiModelProperty(value = "用户类型", example = "1")
private Integer userType;
@ApiModelProperty(value = "应用名", example = "dashboard")
private String applicationName;
@ApiModelProperty(value = "请求地址", example = "/xx/yy")
private String requestUrl;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "开始异常发生时间")
private Date beginExceptionTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "结束异常发生时间")
private Date endExceptionTime;
@ApiModelProperty(value = "处理状态", example = "0")
private Integer processStatus;
}

View File

@@ -1,29 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import java.util.Date;
@ApiModel("API 错误日志 Response VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class InfApiErrorLogRespVO extends InfApiErrorLogBaseVO {
@ApiModelProperty(value = "编号", required = true, example = "1024")
private Integer id;
@ApiModelProperty(value = "创建时间", required = true)
private Date createTime;
@ApiModelProperty(value = "处理时间", required = true)
private Date processTime;
@ApiModelProperty(value = "处理用户编号", example = "233")
private Integer processUserId;
}

View File

@@ -1,36 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.controller.redis.vo;
import cn.iocoder.yudao.framework.redis.core.RedisKeyDefine;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import java.time.Duration;
@ApiModel("Redis Key 信息 Response VO")
@Data
@Builder
@AllArgsConstructor
public class InfRedisKeyRespVO {
@ApiModelProperty(value = "login_user:%s", required = true, example = "String")
private String keyTemplate;
@ApiModelProperty(value = "Key 类型的枚举", required = true, example = "String")
private RedisKeyDefine.KeyTypeEnum keyType;
@ApiModelProperty(value = "Value 类型", required = true, example = "java.lang.String")
private Class valueType;
@ApiModelProperty(value = "超时类型", required = true, example = "1")
private RedisKeyDefine.TimeoutTypeEnum timeoutType;
@ApiModelProperty(value = "过期时间,单位:毫秒", required = true, example = "1024")
private Duration timeout;
@ApiModelProperty(value = "备注", required = true, example = "啦啦啦啦~")
private String memo;
}

View File

@@ -1,44 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.controller.redis.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import java.util.List;
import java.util.Properties;
@ApiModel("Redis 监控信息 Response VO")
@Data
@Builder
@AllArgsConstructor
public class InfRedisMonitorRespVO {
@ApiModelProperty(value = "Redis info 指令结果", required = true, notes = "具体字段,查看 Redis 文档")
private Properties info;
@ApiModelProperty(value = "Redis key 数量", required = true, example = "1024")
private Long dbSize;
@ApiModelProperty(value = "CommandStat 数组", required = true)
private List<CommandStat> commandStats;
@ApiModel("Redis 命令统计结果")
@Data
@Builder
@AllArgsConstructor
public static class CommandStat {
@ApiModelProperty(value = "Redis 命令", required = true, example = "get")
private String command;
@ApiModelProperty(value = "调用次数", required = true, example = "1024")
private Integer calls;
@ApiModelProperty(value = "消耗 CPU 秒数", required = true, example = "666")
private Integer usec;
}
}

View File

@@ -1,29 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.convert.config;
import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.config.InfConfigDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigCreateReqVO;
import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigExcelVO;
import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigRespVO;
import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigUpdateReqVO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.util.List;
@Mapper
public interface InfConfigConvert {
InfConfigConvert INSTANCE = Mappers.getMapper(InfConfigConvert.class);
PageResult<InfConfigRespVO> convertPage(PageResult<InfConfigDO> page);
InfConfigRespVO convert(InfConfigDO bean);
InfConfigDO convert(InfConfigCreateReqVO bean);
InfConfigDO convert(InfConfigUpdateReqVO bean);
List<InfConfigExcelVO> convertList(List<InfConfigDO> list);
}

View File

@@ -1,18 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.convert.file;
import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.file.InfFileDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.adminserver.modules.infra.controller.file.vo.InfFileRespVO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@Mapper
public interface InfFileConvert {
InfFileConvert INSTANCE = Mappers.getMapper(InfFileConvert.class);
InfFileRespVO convert(InfFileDO bean);
PageResult<InfFileRespVO> convertPage(PageResult<InfFileDO> page);
}

View File

@@ -1,36 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.convert.job;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobCreateReqVO;
import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobExcelVO;
import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobRespVO;
import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobUpdateReqVO;
import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.job.InfJobDO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.util.List;
/**
* 定时任务 Convert
*
* @author 芋道源码
*/
@Mapper
public interface InfJobConvert {
InfJobConvert INSTANCE = Mappers.getMapper(InfJobConvert.class);
InfJobDO convert(InfJobCreateReqVO bean);
InfJobDO convert(InfJobUpdateReqVO bean);
InfJobRespVO convert(InfJobDO bean);
List<InfJobRespVO> convertList(List<InfJobDO> list);
PageResult<InfJobRespVO> convertPage(PageResult<InfJobDO> page);
List<InfJobExcelVO> convertList02(List<InfJobDO> list);
}

View File

@@ -1,30 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.convert.job;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log.InfJobLogExcelVO;
import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log.InfJobLogRespVO;
import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.job.InfJobLogDO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.util.List;
/**
* 定时任务日志 Convert
*
* @author 芋艿
*/
@Mapper
public interface InfJobLogConvert {
InfJobLogConvert INSTANCE = Mappers.getMapper(InfJobLogConvert.class);
InfJobLogRespVO convert(InfJobLogDO bean);
List<InfJobLogRespVO> convertList(List<InfJobLogDO> list);
PageResult<InfJobLogRespVO> convertPage(PageResult<InfJobLogDO> page);
List<InfJobLogExcelVO> convertList02(List<InfJobLogDO> list);
}

View File

@@ -1,31 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.convert.logger;
import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiAccessLogDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.apilog.core.service.dto.ApiAccessLogCreateDTO;
import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogExcelVO;
import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogRespVO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.util.List;
/**
* API 访问日志 Convert
*
* @author 芋道源码
*/
@Mapper
public interface InfApiAccessLogConvert {
InfApiAccessLogConvert INSTANCE = Mappers.getMapper(InfApiAccessLogConvert.class);
InfApiAccessLogRespVO convert(InfApiAccessLogDO bean);
List<InfApiAccessLogRespVO> convertList(List<InfApiAccessLogDO> list);
PageResult<InfApiAccessLogRespVO> convertPage(PageResult<InfApiAccessLogDO> page);
List<InfApiAccessLogExcelVO> convertList02(List<InfApiAccessLogDO> list);
}

View File

@@ -1,28 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.convert.logger;
import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiErrorLogDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogExcelVO;
import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogRespVO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.util.List;
/**
* API 错误日志 Convert
*
* @author 芋道源码
*/
@Mapper
public interface InfApiErrorLogConvert {
InfApiErrorLogConvert INSTANCE = Mappers.getMapper(InfApiErrorLogConvert.class);
InfApiErrorLogRespVO convert(InfApiErrorLogDO bean);
PageResult<InfApiErrorLogRespVO> convertPage(PageResult<InfApiErrorLogDO> page);
List<InfApiErrorLogExcelVO> convertList02(List<InfApiErrorLogDO> list);
}

View File

@@ -1,6 +0,0 @@
/**
* 提供 POJO 类的实体转换
*
* 目前使用 MapStruct 框架
*/
package cn.iocoder.yudao.adminserver.modules.infra.convert;

View File

@@ -1,34 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.convert.redis;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.redis.core.RedisKeyDefine;
import cn.iocoder.yudao.adminserver.modules.infra.controller.redis.vo.InfRedisKeyRespVO;
import cn.iocoder.yudao.adminserver.modules.infra.controller.redis.vo.InfRedisMonitorRespVO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
@Mapper
public interface RedisConvert {
RedisConvert INSTANCE = Mappers.getMapper(RedisConvert.class);
default InfRedisMonitorRespVO build(Properties info, Long dbSize, Properties commandStats) {
InfRedisMonitorRespVO respVO = InfRedisMonitorRespVO.builder().info(info).dbSize(dbSize)
.commandStats(new ArrayList<>(commandStats.size())).build();
commandStats.forEach((key, value) -> {
respVO.getCommandStats().add(InfRedisMonitorRespVO.CommandStat.builder()
.command(StrUtil.subAfter((String) key, "cmdstat_", false))
.calls(Integer.valueOf(StrUtil.subBetween((String) value, "calls=", ",")))
.usec(Integer.valueOf(StrUtil.subBetween((String) value, "usec=", ",")))
.build());
});
return respVO;
}
List<InfRedisKeyRespVO> convertList(List<RedisKeyDefine> list);
}

View File

@@ -1,72 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.job;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import cn.iocoder.yudao.adminserver.modules.infra.enums.job.InfJobStatusEnum;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
/**
* 定时任务 DO
*
* @author 芋道源码
*/
@TableName("inf_job")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class InfJobDO extends BaseDO {
/**
* 任务编号
*/
@TableId
private Long id;
/**
* 任务名称
*/
private String name;
/**
* 任务状态
*
* 枚举 {@link InfJobStatusEnum}
*/
private Integer status;
/**
* 处理器的名字
*/
private String handlerName;
/**
* 处理器的参数
*/
private String handlerParam;
/**
* CRON 表达式
*/
private String cronExpression;
// ========== 重试相关字段 ==========
/**
* 重试次数
* 如果不重试,则设置为 0
*/
private Integer retryCount;
/**
* 重试间隔,单位:毫秒
* 如果没有间隔,则设置为 0
*/
private Integer retryInterval;
// ========== 监控相关字段 ==========
/**
* 监控超时时间,单位:毫秒
* 为空时,表示不监控
*
* 注意,这里的超时的目的,不是进行任务的取消,而是告警任务的执行时间过长
*/
private Integer monitorTimeout;
}

View File

@@ -1,80 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.job;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler;
import cn.iocoder.yudao.adminserver.modules.infra.enums.job.InfJobLogStatusEnum;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
import java.util.Date;
/**
* 定时任务的执行日志
*
* @author 芋道源码
*/
@TableName("inf_job_log")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class InfJobLogDO extends BaseDO {
/**
* 日志编号
*/
private Long id;
/**
* 任务编号
*
* 关联 {@link InfJobDO#getId()}
*/
private Long jobId;
/**
* 处理器的名字
*
* 冗余字段 {@link InfJobDO#getHandlerName()}
*/
private String handlerName;
/**
* 处理器的参数
*
* 冗余字段 {@link InfJobDO#getHandlerParam()}
*/
private String handlerParam;
/**
* 第几次执行
*
* 用于区分是不是重试执行。如果是重试执行,则 index 大于 1
*/
private Integer executeIndex;
/**
* 开始执行时间
*/
private Date beginTime;
/**
* 结束执行时间
*/
private Date endTime;
/**
* 执行时长,单位:毫秒
*/
private Integer duration;
/**
* 状态
*
* 枚举 {@link InfJobLogStatusEnum}
*/
private Integer status;
/**
* 结果数据
*
* 成功时,使用 {@link JobHandler#execute(String)} 的结果
* 失败时,使用 {@link JobHandler#execute(String)} 的异常堆栈
*/
private String result;
}

View File

@@ -1,37 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.config;
import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.config.InfConfigDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigExportReqVO;
import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigPageReqVO;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface InfConfigMapper extends BaseMapperX<InfConfigDO> {
default InfConfigDO selectByKey(String key) {
return selectOne(new QueryWrapper<InfConfigDO>().eq("`key`", key));
}
default PageResult<InfConfigDO> selectPage(InfConfigPageReqVO reqVO) {
return selectPage(reqVO, new QueryWrapperX<InfConfigDO>()
.likeIfPresent("name", reqVO.getName())
.likeIfPresent("`key`", reqVO.getKey())
.eqIfPresent("`type`", reqVO.getType())
.betweenIfPresent("create_time", reqVO.getBeginTime(), reqVO.getEndTime()));
}
default List<InfConfigDO> selectList(InfConfigExportReqVO reqVO) {
return selectList(new QueryWrapperX<InfConfigDO>()
.likeIfPresent("name", reqVO.getName())
.likeIfPresent("`key`", reqVO.getKey())
.eqIfPresent("`type`", reqVO.getType())
.betweenIfPresent("create_time", reqVO.getBeginTime(), reqVO.getEndTime()));
}
}

View File

@@ -1,25 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.file;
import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.file.InfFileDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
import cn.iocoder.yudao.adminserver.modules.infra.controller.file.vo.InfFilePageReqVO;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface InfFileMapper extends BaseMapperX<InfFileDO> {
default Integer selectCountById(String id) {
return selectCount("id", id);
}
default PageResult<InfFileDO> selectPage(InfFilePageReqVO reqVO) {
return selectPage(reqVO, new QueryWrapperX<InfFileDO>()
.likeIfPresent("id", reqVO.getId())
.likeIfPresent("type", reqVO.getType())
.betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())
.orderByDesc("create_time"));
}
}

View File

@@ -1,43 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.job;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log.InfJobLogExportReqVO;
import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log.InfJobLogPageReqVO;
import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.job.InfJobLogDO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* 任务日志 Mapper
*
* @author 芋道源码
*/
@Mapper
public interface InfJobLogMapper extends BaseMapperX<InfJobLogDO> {
default PageResult<InfJobLogDO> selectPage(InfJobLogPageReqVO reqVO) {
return selectPage(reqVO, new QueryWrapperX<InfJobLogDO>()
.eqIfPresent("job_id", reqVO.getJobId())
.likeIfPresent("handler_name", reqVO.getHandlerName())
.geIfPresent("begin_time", reqVO.getBeginTime())
.leIfPresent("end_time", reqVO.getEndTime())
.eqIfPresent("status", reqVO.getStatus())
.orderByDesc("id") // ID 倒序
);
}
default List<InfJobLogDO> selectList(InfJobLogExportReqVO reqVO) {
return selectList(new QueryWrapperX<InfJobLogDO>()
.eqIfPresent("job_id", reqVO.getJobId())
.likeIfPresent("handler_name", reqVO.getHandlerName())
.geIfPresent("begin_time", reqVO.getBeginTime())
.leIfPresent("end_time", reqVO.getEndTime())
.eqIfPresent("status", reqVO.getStatus())
.orderByDesc("id") // ID 倒序
);
}
}

View File

@@ -1,41 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.job;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobExportReqVO;
import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobPageReqVO;
import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.job.InfJobDO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* 定时任务 Mapper
*
* @author 芋道源码
*/
@Mapper
public interface InfJobMapper extends BaseMapperX<InfJobDO> {
default InfJobDO selectByHandlerName(String handlerName) {
return selectOne("handler_name", handlerName);
}
default PageResult<InfJobDO> selectPage(InfJobPageReqVO reqVO) {
return selectPage(reqVO, new QueryWrapperX<InfJobDO>()
.likeIfPresent("name", reqVO.getName())
.eqIfPresent("status", reqVO.getStatus())
.likeIfPresent("handler_name", reqVO.getHandlerName())
);
}
default List<InfJobDO> selectList(InfJobExportReqVO reqVO) {
return selectList(new QueryWrapperX<InfJobDO>()
.likeIfPresent("name", reqVO.getName())
.eqIfPresent("status", reqVO.getStatus())
.likeIfPresent("handler_name", reqVO.getHandlerName())
);
}
}

View File

@@ -1,47 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.logger;
import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogExportReqVO;
import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogPageReqVO;
import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiAccessLogDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* API 访问日志 Mapper
*
* @author 芋道源码
*/
@Mapper
public interface InfApiAccessLogMapper extends BaseMapperX<InfApiAccessLogDO> {
default PageResult<InfApiAccessLogDO> selectPage(InfApiAccessLogPageReqVO reqVO) {
return selectPage(reqVO, new QueryWrapperX<InfApiAccessLogDO>()
.eqIfPresent("user_id", reqVO.getUserId())
.eqIfPresent("user_type", reqVO.getUserType())
.eqIfPresent("application_name", reqVO.getApplicationName())
.likeIfPresent("request_url", reqVO.getRequestUrl())
.betweenIfPresent("begin_time", reqVO.getBeginBeginTime(), reqVO.getEndBeginTime())
.geIfPresent("duration", reqVO.getDuration())
.eqIfPresent("result_code", reqVO.getResultCode())
.orderByDesc("id")
);
}
default List<InfApiAccessLogDO> selectList(InfApiAccessLogExportReqVO reqVO) {
return selectList(new QueryWrapperX<InfApiAccessLogDO>()
.eqIfPresent("user_id", reqVO.getUserId())
.eqIfPresent("user_type", reqVO.getUserType())
.eqIfPresent("application_name", reqVO.getApplicationName())
.likeIfPresent("request_url", reqVO.getRequestUrl())
.betweenIfPresent("begin_time", reqVO.getBeginBeginTime(), reqVO.getEndBeginTime())
.geIfPresent("duration", reqVO.getDuration())
.eqIfPresent("result_code", reqVO.getResultCode())
.orderByDesc("id")
);
}
}

View File

@@ -1,45 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.logger;
import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiErrorLogDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogExportReqVO;
import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogPageReqVO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* API 错误日志 Mapper
*
* @author 芋道源码
*/
@Mapper
public interface InfApiErrorLogMapper extends BaseMapperX<InfApiErrorLogDO> {
default PageResult<InfApiErrorLogDO> selectPage(InfApiErrorLogPageReqVO reqVO) {
return selectPage(reqVO, new QueryWrapperX<InfApiErrorLogDO>()
.eqIfPresent("user_id", reqVO.getUserId())
.eqIfPresent("user_type", reqVO.getUserType())
.eqIfPresent("application_name", reqVO.getApplicationName())
.likeIfPresent("request_url", reqVO.getRequestUrl())
.betweenIfPresent("exception_time", reqVO.getBeginExceptionTime(), reqVO.getEndExceptionTime())
.eqIfPresent("process_status", reqVO.getProcessStatus())
.orderByDesc("id")
);
}
default List<InfApiErrorLogDO> selectList(InfApiErrorLogExportReqVO reqVO) {
return selectList(new QueryWrapperX<InfApiErrorLogDO>()
.eqIfPresent("user_id", reqVO.getUserId())
.eqIfPresent("user_type", reqVO.getUserType())
.eqIfPresent("application_name", reqVO.getApplicationName())
.likeIfPresent("request_url", reqVO.getRequestUrl())
.betweenIfPresent("exception_time", reqVO.getBeginExceptionTime(), reqVO.getEndExceptionTime())
.eqIfPresent("process_status", reqVO.getProcessStatus())
.orderByDesc("id")
);
}
}

View File

@@ -1,19 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.enums;
/**
* Infra 字典类型的枚举类
*
* @author 芋道源码
*/
public interface InfDictTypeConstants {
String REDIS_TIMEOUT_TYPE = "inf_redis_timeout_type"; // Redis 超时类型
String JOB_STATUS = "inf_job_status"; // 定时任务状态的枚举
String JOB_LOG_STATUS = "inf_job_log_status"; // 定时任务日志状态的枚举
String API_ERROR_LOG_PROCESS_STATUS = "inf_api_error_log_process_status"; // API 错误日志的处理状态的枚举
String ERROR_CODE_TYPE = "inf_error_code_type"; // 错误码的类型枚举
}

View File

@@ -1,33 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.enums;
import cn.iocoder.yudao.framework.common.exception.ErrorCode;
/**
* Infra 错误码枚举类
*
* infra 系统,使用 1-001-000-000 段
*/
public interface InfErrorCodeConstants {
// ========== 参数配置 1001000000 ==========
ErrorCode CONFIG_NOT_EXISTS = new ErrorCode(1001000001, "参数配置不存在");
ErrorCode CONFIG_KEY_DUPLICATE = new ErrorCode(1001000002, "参数配置 key 重复");
ErrorCode CONFIG_CAN_NOT_DELETE_SYSTEM_TYPE = new ErrorCode(1001000003, "不能删除类型为系统内置的参数配置");
ErrorCode CONFIG_GET_VALUE_ERROR_IF_SENSITIVE = new ErrorCode(1001000004, "不允许获取敏感配置到前端");
// ========== 定时任务 1001001000 ==========
ErrorCode JOB_NOT_EXISTS = new ErrorCode(1001001000, "定时任务不存在");
ErrorCode JOB_HANDLER_EXISTS = new ErrorCode(1001001001, "定时任务的处理器已经存在");
ErrorCode JOB_CHANGE_STATUS_INVALID = new ErrorCode(1001001002, "只允许修改为开启或者关闭状态");
ErrorCode JOB_CHANGE_STATUS_EQUALS = new ErrorCode(1001001003, "定时任务已经处于该状态,无需修改");
ErrorCode JOB_UPDATE_ONLY_NORMAL_STATUS = new ErrorCode(1001001004, "只有开启状态的任务,才可以修改");
ErrorCode JOB_CRON_EXPRESSION_VALID = new ErrorCode(1001001005, "CRON 表达式不正确");
// ========== API 错误日志 1001002000 ==========
ErrorCode API_ERROR_LOG_NOT_FOUND = new ErrorCode(1001002000, "API 错误日志不存在");
ErrorCode API_ERROR_LOG_PROCESSED = new ErrorCode(1001002001, "API 错误日志已处理");
// ========== 文件 1001003000 ==========
ErrorCode FILE_NOT_EXISTS = new ErrorCode(1001003000, "文件不存在");
}

View File

@@ -1,21 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.enums.config;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum InfConfigTypeEnum {
/**
* 系统配置
*/
SYSTEM(1),
/**
* 自定义配置
*/
CUSTOM(2);
private final Integer type;
}

View File

@@ -1,24 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.enums.job;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 任务日志的状态枚举
*
* @author 芋道源码
*/
@Getter
@AllArgsConstructor
public enum InfJobLogStatusEnum {
RUNNING(0), // 运行中
SUCCESS(1), // 成功
FAILURE(2); // 失败
/**
* 状态
*/
private final Integer status;
}

View File

@@ -1,43 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.enums.job;
import com.google.common.collect.Sets;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Collections;
import java.util.Set;
import static org.quartz.impl.jdbcjobstore.Constants.*;
/**
* 任务状态的枚举
*
* @author 芋道源码
*/
@Getter
@AllArgsConstructor
public enum InfJobStatusEnum {
/**
* 初始化中
*/
INIT(0, Collections.emptySet()),
/**
* 开启
*/
NORMAL(1, Sets.newHashSet(STATE_WAITING, STATE_ACQUIRED, STATE_BLOCKED)),
/**
* 暂停
*/
STOP(2, Sets.newHashSet(STATE_PAUSED, STATE_PAUSED_BLOCKED));
/**
* 状态
*/
private final Integer status;
/**
* 对应的 Quartz 触发器的状态集合
*/
private final Set<String> quartzStates;
}

View File

@@ -1,28 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.enums.logger;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* API 异常数据的处理状态
*
* @author 芋道源码
*/
@AllArgsConstructor
@Getter
public enum InfApiErrorLogProcessStatusEnum {
INIT(0, "未处理"),
DONE(1, "已处理"),
IGNORE(2, "已忽略");
/**
* 状态
*/
private final Integer status;
/**
* 资源类型名
*/
private final String name;
}

View File

@@ -1,16 +0,0 @@
/**
* 文件的存储,推荐使用七牛、阿里云、华为云、腾讯云等文件服务
*
* 在不采用云服务的情况下,我们有几种技术选型:
* 方案 1. 使用自建的文件服务,例如说 minIO、FastDFS 等等
* 方案 2. 使用服务器的文件系统存储
* 方案 3. 使用数据库进行存储
*
* 如果考虑额外在搭建服务,推荐方案 1。
* 对于方案 2 来说,如果要实现文件存储的高可用,需要多台服务器之间做实时同步,可以基于 rsync + inotify 来做
* 对于方案 3 的话,实现起来最简单,但是数据库本身不适合存储海量的文件
*
* 综合考虑,暂时使用方案 3 的方式,比较适合这样一个 all in one 的项目。
* 随着文件的量级大了之后,还是推荐采用云服务。
*/
package cn.iocoder.yudao.adminserver.modules.infra.framework.file;

View File

@@ -1,6 +0,0 @@
/**
* 属于 infra 模块的 framework 封装
*
* @author 芋道源码
*/
package cn.iocoder.yudao.adminserver.modules.infra.framework;

View File

@@ -1,24 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.mq.consumer.config;
import cn.iocoder.yudao.framework.apollo.internals.DBConfigRepository;
import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessageListener;
import cn.iocoder.yudao.adminserver.modules.infra.mq.message.config.InfConfigRefreshMessage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* 针对 {@link InfConfigRefreshMessage} 的消费者
*
* @author 芋道源码
*/
@Component
@Slf4j
public class InfConfigRefreshConsumer extends AbstractChannelMessageListener<InfConfigRefreshMessage> {
@Override
public void onMessage(InfConfigRefreshMessage message) {
log.info("[onMessage][收到 Config 刷新消息]");
DBConfigRepository.noticeSync();
}
}

View File

@@ -1 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.mq.consumer;

View File

@@ -1,17 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.mq.message.config;
import cn.iocoder.yudao.framework.mq.core.pubsub.ChannelMessage;
import lombok.Data;
/**
* 配置数据刷新 Message
*/
@Data
public class InfConfigRefreshMessage implements ChannelMessage {
@Override
public String getChannel() {
return "infra.config.refresh";
}
}

View File

@@ -1 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.mq.message;

View File

@@ -1,27 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.mq.producer.config;
import cn.iocoder.yudao.adminserver.modules.infra.mq.message.config.InfConfigRefreshMessage;
import cn.iocoder.yudao.framework.mq.core.util.RedisMessageUtils;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* Config 配置相关消息的 Producer
*/
@Component
public class InfConfigProducer {
@Resource
private StringRedisTemplate stringRedisTemplate;
/**
* 发送 {@link InfConfigRefreshMessage} 消息
*/
public void sendConfigRefreshMessage() {
InfConfigRefreshMessage message = new InfConfigRefreshMessage();
RedisMessageUtils.sendChannelMessage(stringRedisTemplate, message);
}
}

View File

@@ -1 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.mq.producer;

View File

@@ -1,7 +0,0 @@
/**
* infra 包下,我们放基础设施的运维与管理,支撑上层的通用与核心业务。
* 例如说:定时任务的管理、服务器的信息等等
*
* 缩写inf
*/
package cn.iocoder.yudao.adminserver.modules.infra;

View File

@@ -1,75 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.service.config;
import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.config.InfConfigDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigCreateReqVO;
import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigExportReqVO;
import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigPageReqVO;
import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigUpdateReqVO;
import javax.validation.Valid;
import java.util.List;
/**
* 参数配置 Service 接口
*
* @author 芋道源码
*/
public interface InfConfigService {
/**
* 创建参数配置
*
* @param reqVO 创建信息
* @return 配置编号
*/
Long createConfig(@Valid InfConfigCreateReqVO reqVO);
/**
* 更新参数配置
*
* @param reqVO 更新信息
*/
void updateConfig(@Valid InfConfigUpdateReqVO reqVO);
/**
* 删除参数配置
*
* @param id 配置编号
*/
void deleteConfig(Long id);
/**
* 获得参数配置
*
* @param id 配置编号
* @return 参数配置
*/
InfConfigDO getConfig(Long id);
/**
* 根据参数键,获得参数配置
*
* @param key 配置键
* @return 参数配置
*/
InfConfigDO getConfigByKey(String key);
/**
* 获得参数配置分页列表
*
* @param reqVO 分页条件
* @return 分页列表
*/
PageResult<InfConfigDO> getConfigPage(@Valid InfConfigPageReqVO reqVO);
/**
* 获得参数配置列表
*
* @param reqVO 列表
* @return 列表
*/
List<InfConfigDO> getConfigList(@Valid InfConfigExportReqVO reqVO);
}

View File

@@ -1,132 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.service.config.impl;
import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.config.InfConfigDO;
import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigCreateReqVO;
import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigExportReqVO;
import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigPageReqVO;
import cn.iocoder.yudao.adminserver.modules.infra.controller.config.vo.InfConfigUpdateReqVO;
import cn.iocoder.yudao.adminserver.modules.infra.convert.config.InfConfigConvert;
import cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.config.InfConfigMapper;
import cn.iocoder.yudao.adminserver.modules.infra.enums.config.InfConfigTypeEnum;
import cn.iocoder.yudao.adminserver.modules.infra.mq.producer.config.InfConfigProducer;
import cn.iocoder.yudao.adminserver.modules.infra.service.config.InfConfigService;
import com.google.common.annotations.VisibleForTesting;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.util.List;
import static cn.iocoder.yudao.adminserver.modules.infra.enums.InfErrorCodeConstants.*;
/**
* 参数配置 Service 实现类
*/
@Service
@Slf4j
@Validated
public class InfConfigServiceImpl implements InfConfigService {
@Resource
private InfConfigMapper configMapper;
@Resource
private InfConfigProducer configProducer;
@Override
public Long createConfig(InfConfigCreateReqVO reqVO) {
// 校验正确性
checkCreateOrUpdate(null, reqVO.getKey());
// 插入参数配置
InfConfigDO config = InfConfigConvert.INSTANCE.convert(reqVO);
config.setType(InfConfigTypeEnum.CUSTOM.getType());
configMapper.insert(config);
// 发送刷新消息
configProducer.sendConfigRefreshMessage();
return config.getId();
}
@Override
public void updateConfig(InfConfigUpdateReqVO reqVO) {
// 校验正确性
checkCreateOrUpdate(reqVO.getId(), null); // 不允许更新 key
// 更新参数配置
InfConfigDO updateObj = InfConfigConvert.INSTANCE.convert(reqVO);
configMapper.updateById(updateObj);
// 发送刷新消息
configProducer.sendConfigRefreshMessage();
}
@Override
public void deleteConfig(Long id) {
// 校验配置存在
InfConfigDO config = checkConfigExists(id);
// 内置配置,不允许删除
if (InfConfigTypeEnum.SYSTEM.getType().equals(config.getType())) {
throw ServiceExceptionUtil.exception(CONFIG_CAN_NOT_DELETE_SYSTEM_TYPE);
}
// 删除
configMapper.deleteById(id);
// 发送刷新消息
configProducer.sendConfigRefreshMessage();
}
@Override
public InfConfigDO getConfig(Long id) {
return configMapper.selectById(id);
}
@Override
public InfConfigDO getConfigByKey(String key) {
return configMapper.selectByKey(key);
}
@Override
public PageResult<InfConfigDO> getConfigPage(InfConfigPageReqVO reqVO) {
return configMapper.selectPage(reqVO);
}
@Override
public List<InfConfigDO> getConfigList(InfConfigExportReqVO reqVO) {
return configMapper.selectList(reqVO);
}
private void checkCreateOrUpdate(Long id, String key) {
// 校验自己存在
checkConfigExists(id);
// 校验参数配置 key 的唯一性
checkConfigKeyUnique(id, key);
}
@VisibleForTesting
public InfConfigDO checkConfigExists(Long id) {
if (id == null) {
return null;
}
InfConfigDO config = configMapper.selectById(id);
if (config == null) {
throw ServiceExceptionUtil.exception(CONFIG_NOT_EXISTS);
}
return config;
}
@VisibleForTesting
public void checkConfigKeyUnique(Long id, String key) {
InfConfigDO config = configMapper.selectByKey(key);
if (config == null) {
return;
}
// 如果 id 为空,说明不用比较是否为相同 id 的参数配置
if (id == null) {
throw ServiceExceptionUtil.exception(CONFIG_KEY_DUPLICATE);
}
if (!config.getId().equals(id)) {
throw ServiceExceptionUtil.exception(CONFIG_KEY_DUPLICATE);
}
}
}

View File

@@ -1,46 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.service.file;
import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.file.InfFileDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.adminserver.modules.infra.controller.file.vo.InfFilePageReqVO;
/**
* 文件 Service 接口
*
* @author 芋道源码
*/
public interface InfFileService {
/**
* 保存文件,并返回文件的访问路径
*
* @param path 文件路径
* @param content 文件内容
* @return 文件路径
*/
String createFile(String path, byte[] content);
/**
* 删除文件
*
* @param id 编号
*/
void deleteFile(String id);
/**
* 获得文件
*
* @param path 文件路径
* @return 文件
*/
InfFileDO getFile(String path);
/**
* 获得文件分页
*
* @param pageReqVO 分页查询
* @return 文件分页
*/
PageResult<InfFileDO> getFilePage(InfFilePageReqVO pageReqVO);
}

View File

@@ -1,72 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.service.file.impl;
import cn.hutool.core.io.FileTypeUtil;
import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.file.InfFileDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.adminserver.modules.infra.framework.file.config.FileProperties;
import cn.iocoder.yudao.adminserver.modules.infra.controller.file.vo.InfFilePageReqVO;
import cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.file.InfFileMapper;
import cn.iocoder.yudao.adminserver.modules.infra.service.file.InfFileService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.io.ByteArrayInputStream;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.adminserver.modules.infra.enums.InfErrorCodeConstants.FILE_NOT_EXISTS;
import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.FILE_PATH_EXISTS;
/**
* 文件 Service 实现类
*
* @author 芋道源码
*/
@Service
public class InfFileServiceImpl implements InfFileService {
@Resource
private InfFileMapper fileMapper;
@Resource
private FileProperties fileProperties;
@Override
public String createFile(String path, byte[] content) {
if (fileMapper.selectCountById(path) > 0) {
throw exception(FILE_PATH_EXISTS);
}
// 保存到数据库
InfFileDO file = new InfFileDO();
file.setId(path);
file.setType(FileTypeUtil.getType(new ByteArrayInputStream(content)));
file.setContent(content);
fileMapper.insert(file);
// 拼接路径返回
return fileProperties.getBasePath() + path;
}
@Override
public void deleteFile(String id) {
// 校验存在
this.validateFileExists(id);
// 更新
fileMapper.deleteById(id);
}
private void validateFileExists(String id) {
if (fileMapper.selectById(id) == null) {
throw exception(FILE_NOT_EXISTS);
}
}
@Override
public InfFileDO getFile(String path) {
return fileMapper.selectById(path);
}
@Override
public PageResult<InfFileDO> getFilePage(InfFilePageReqVO pageReqVO) {
return fileMapper.selectPage(pageReqVO);
}
}

View File

@@ -1,51 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.service.job;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.quartz.core.service.JobLogFrameworkService;
import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log.InfJobLogExportReqVO;
import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log.InfJobLogPageReqVO;
import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.job.InfJobLogDO;
import java.util.Collection;
import java.util.List;
/**
* Job 日志 Service 接口
*
* @author 芋道源码
*/
public interface InfJobLogService extends JobLogFrameworkService {
/**
* 获得定时任务
*
* @param id 编号
* @return 定时任务
*/
InfJobLogDO getJobLog(Long id);
/**
* 获得定时任务列表
*
* @param ids 编号
* @return 定时任务列表
*/
List<InfJobLogDO> getJobLogList(Collection<Long> ids);
/**
* 获得定时任务分页
*
* @param pageReqVO 分页查询
* @return 定时任务分页
*/
PageResult<InfJobLogDO> getJobLogPage(InfJobLogPageReqVO pageReqVO);
/**
* 获得定时任务列表, 用于 Excel 导出
*
* @param exportReqVO 查询条件
* @return 定时任务分页
*/
List<InfJobLogDO> getJobLogList(InfJobLogExportReqVO exportReqVO);
}

View File

@@ -1,91 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.service.job;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobCreateReqVO;
import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobExportReqVO;
import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobPageReqVO;
import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobUpdateReqVO;
import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.job.InfJobDO;
import org.quartz.SchedulerException;
import javax.validation.Valid;
import java.util.Collection;
import java.util.List;
/**
* 定时任务 Service 接口
*
* @author 芋道源码
*/
public interface InfJobService {
/**
* 创建定时任务
*
* @param createReqVO 创建信息
* @return 编号
*/
Long createJob(@Valid InfJobCreateReqVO createReqVO) throws SchedulerException;
/**
* 更新定时任务
*
* @param updateReqVO 更新信息
*/
void updateJob(@Valid InfJobUpdateReqVO updateReqVO) throws SchedulerException;
/**
* 更新定时任务的状态
*
* @param id 任务编号
* @param status 状态
*/
void updateJobStatus(Long id, Integer status) throws SchedulerException;
/**
* 触发定时任务
*
* @param id 任务编号
*/
void triggerJob(Long id) throws SchedulerException;
/**
* 删除定时任务
*
* @param id 编号
*/
void deleteJob(Long id) throws SchedulerException;
/**
* 获得定时任务
*
* @param id 编号
* @return 定时任务
*/
InfJobDO getJob(Long id);
/**
* 获得定时任务列表
*
* @param ids 编号
* @return 定时任务列表
*/
List<InfJobDO> getJobList(Collection<Long> ids);
/**
* 获得定时任务分页
*
* @param pageReqVO 分页查询
* @return 定时任务分页
*/
PageResult<InfJobDO> getJobPage(InfJobPageReqVO pageReqVO);
/**
* 获得定时任务列表, 用于 Excel 导出
*
* @param exportReqVO 查询条件
* @return 定时任务分页
*/
List<InfJobDO> getJobList(InfJobExportReqVO exportReqVO);
}

View File

@@ -1,74 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.service.job.impl;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log.InfJobLogExportReqVO;
import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.log.InfJobLogPageReqVO;
import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.job.InfJobLogDO;
import cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.job.InfJobLogMapper;
import cn.iocoder.yudao.adminserver.modules.infra.enums.job.InfJobLogStatusEnum;
import cn.iocoder.yudao.adminserver.modules.infra.service.job.InfJobLogService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.util.Collection;
import java.util.Date;
import java.util.List;
/**
* Job 日志 Service 实现类
*
* @author 芋道源码
*/
@Service
@Validated
@Slf4j
public class InfJobLogServiceImpl implements InfJobLogService {
@Resource
private InfJobLogMapper jobLogMapper;
@Override
public Long createJobLog(Long jobId, Date beginTime, String jobHandlerName, String jobHandlerParam, Integer executeIndex) {
InfJobLogDO log = InfJobLogDO.builder().jobId(jobId).handlerName(jobHandlerName).handlerParam(jobHandlerParam).executeIndex(executeIndex)
.beginTime(beginTime).status(InfJobLogStatusEnum.RUNNING.getStatus()).build();
jobLogMapper.insert(log);
return log.getId();
}
@Override
@Async
public void updateJobLogResultAsync(Long logId, Date endTime, Integer duration, boolean success, String result) {
try {
InfJobLogDO updateObj = InfJobLogDO.builder().id(logId).endTime(endTime).duration(duration)
.status(success ? InfJobLogStatusEnum.SUCCESS.getStatus() : InfJobLogStatusEnum.FAILURE.getStatus()).result(result).build();
jobLogMapper.updateById(updateObj);
} catch (Exception ex) {
log.error("[updateJobLogResultAsync][logId({}) endTime({}) duration({}) success({}) result({})]",
logId, endTime, duration, success, result);
}
}
@Override
public InfJobLogDO getJobLog(Long id) {
return jobLogMapper.selectById(id);
}
@Override
public List<InfJobLogDO> getJobLogList(Collection<Long> ids) {
return jobLogMapper.selectBatchIds(ids);
}
@Override
public PageResult<InfJobLogDO> getJobLogPage(InfJobLogPageReqVO pageReqVO) {
return jobLogMapper.selectPage(pageReqVO);
}
@Override
public List<InfJobLogDO> getJobLogList(InfJobLogExportReqVO exportReqVO) {
return jobLogMapper.selectList(exportReqVO);
}
}

View File

@@ -1,174 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.service.job.impl;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.quartz.core.scheduler.SchedulerManager;
import cn.iocoder.yudao.framework.quartz.core.util.CronUtils;
import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobCreateReqVO;
import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobExportReqVO;
import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobPageReqVO;
import cn.iocoder.yudao.adminserver.modules.infra.controller.job.vo.job.InfJobUpdateReqVO;
import cn.iocoder.yudao.adminserver.modules.infra.convert.job.InfJobConvert;
import cn.iocoder.yudao.adminserver.modules.infra.dal.dataobject.job.InfJobDO;
import cn.iocoder.yudao.adminserver.modules.infra.dal.mysql.job.InfJobMapper;
import cn.iocoder.yudao.adminserver.modules.infra.enums.job.InfJobStatusEnum;
import cn.iocoder.yudao.adminserver.modules.infra.service.job.InfJobService;
import org.quartz.SchedulerException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.util.Collection;
import java.util.List;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.adminserver.modules.infra.enums.InfErrorCodeConstants.*;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.containsAny;
/**
* 定时任务 Service 实现类
*
* @author 芋道源码
*/
@Service
@Validated
public class InfJobServiceImpl implements InfJobService {
@Resource
private InfJobMapper jobMapper;
@Resource
private SchedulerManager schedulerManager;
@Override
@Transactional(rollbackFor = Exception.class)
public Long createJob(InfJobCreateReqVO createReqVO) throws SchedulerException {
validateCronExpression(createReqVO.getCronExpression());
// 校验唯一性
if (jobMapper.selectByHandlerName(createReqVO.getHandlerName()) != null) {
throw exception(JOB_HANDLER_EXISTS);
}
// 插入
InfJobDO job = InfJobConvert.INSTANCE.convert(createReqVO);
job.setStatus(InfJobStatusEnum.INIT.getStatus());
fillJobMonitorTimeoutEmpty(job);
jobMapper.insert(job);
// 添加 Job 到 Quartz 中
schedulerManager.addJob(job.getId(), job.getHandlerName(), job.getHandlerParam(), job.getCronExpression(),
createReqVO.getRetryCount(), createReqVO.getRetryInterval());
// 更新
InfJobDO updateObj = InfJobDO.builder().id(job.getId()).status(InfJobStatusEnum.NORMAL.getStatus()).build();
jobMapper.updateById(updateObj);
// 返回
return job.getId();
}
@Override
@Transactional(rollbackFor = Exception.class)
public void updateJob(InfJobUpdateReqVO updateReqVO) throws SchedulerException {
validateCronExpression(updateReqVO.getCronExpression());
// 校验存在
InfJobDO job = this.validateJobExists(updateReqVO.getId());
// 只有开启状态,才可以修改.原因是,如果出暂停状态,修改 Quartz Job 时,会导致任务又开始执行
if (!job.getStatus().equals(InfJobStatusEnum.NORMAL.getStatus())) {
throw exception(JOB_UPDATE_ONLY_NORMAL_STATUS);
}
// 更新
InfJobDO updateObj = InfJobConvert.INSTANCE.convert(updateReqVO);
fillJobMonitorTimeoutEmpty(updateObj);
jobMapper.updateById(updateObj);
// 更新 Job 到 Quartz 中
schedulerManager.updateJob(job.getHandlerName(), updateReqVO.getHandlerParam(), updateReqVO.getCronExpression(),
updateReqVO.getRetryCount(), updateReqVO.getRetryInterval());
}
@Override
@Transactional(rollbackFor = Exception.class)
public void updateJobStatus(Long id, Integer status) throws SchedulerException {
// 校验 status
if (!containsAny(status, InfJobStatusEnum.NORMAL.getStatus(), InfJobStatusEnum.STOP.getStatus())) {
throw exception(JOB_CHANGE_STATUS_INVALID);
}
// 校验存在
InfJobDO job = this.validateJobExists(id);
// 校验是否已经为当前状态
if (job.getStatus().equals(status)) {
throw exception(JOB_CHANGE_STATUS_EQUALS);
}
// 更新 Job 状态
InfJobDO updateObj = InfJobDO.builder().id(id).status(status).build();
jobMapper.updateById(updateObj);
// 更新状态 Job 到 Quartz 中
if (InfJobStatusEnum.NORMAL.getStatus().equals(status)) { // 开启
schedulerManager.resumeJob(job.getHandlerName());
} else { // 暂停
schedulerManager.pauseJob(job.getHandlerName());
}
}
@Override
public void triggerJob(Long id) throws SchedulerException {
// 校验存在
InfJobDO job = this.validateJobExists(id);
// 触发 Quartz 中的 Job
schedulerManager.triggerJob(job.getId(), job.getHandlerName(), job.getHandlerParam());
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteJob(Long id) throws SchedulerException {
// 校验存在
InfJobDO job = this.validateJobExists(id);
// 更新
jobMapper.deleteById(id);
// 删除 Job 到 Quartz 中
schedulerManager.deleteJob(job.getHandlerName());
}
private InfJobDO validateJobExists(Long id) {
InfJobDO job = jobMapper.selectById(id);
if (job == null) {
throw exception(JOB_NOT_EXISTS);
}
return job;
}
private void validateCronExpression(String cronExpression) {
if (!CronUtils.isValid(cronExpression)) {
throw exception(JOB_CRON_EXPRESSION_VALID);
}
}
@Override
public InfJobDO getJob(Long id) {
return jobMapper.selectById(id);
}
@Override
public List<InfJobDO> getJobList(Collection<Long> ids) {
return jobMapper.selectBatchIds(ids);
}
@Override
public PageResult<InfJobDO> getJobPage(InfJobPageReqVO pageReqVO) {
return jobMapper.selectPage(pageReqVO);
}
@Override
public List<InfJobDO> getJobList(InfJobExportReqVO exportReqVO) {
return jobMapper.selectList(exportReqVO);
}
private static void fillJobMonitorTimeoutEmpty(InfJobDO job) {
if (job.getMonitorTimeout() == null) {
job.setMonitorTimeout(0);
}
}
}

View File

@@ -1,33 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.service.logger;
import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogExportReqVO;
import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apiaccesslog.InfApiAccessLogPageReqVO;
import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiAccessLogDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import java.util.List;
/**
* API 访问日志 Service 接口
*
* @author 芋道源码
*/
public interface InfApiAccessLogService {
/**
* 获得 API 访问日志分页
*
* @param pageReqVO 分页查询
* @return API 访问日志分页
*/
PageResult<InfApiAccessLogDO> getApiAccessLogPage(InfApiAccessLogPageReqVO pageReqVO);
/**
* 获得 API 访问日志列表, 用于 Excel 导出
*
* @param exportReqVO 查询条件
* @return API 访问日志分页
*/
List<InfApiAccessLogDO> getApiAccessLogList(InfApiAccessLogExportReqVO exportReqVO);
}

View File

@@ -1,42 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.service.logger;
import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogExportReqVO;
import cn.iocoder.yudao.adminserver.modules.infra.controller.logger.vo.apierrorlog.InfApiErrorLogPageReqVO;
import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger.InfApiErrorLogDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import java.util.List;
/**
* API 错误日志 Service 接口
*
* @author 芋道源码
*/
public interface InfApiErrorLogService {
/**
* 获得 API 错误日志分页
*
* @param pageReqVO 分页查询
* @return API 错误日志分页
*/
PageResult<InfApiErrorLogDO> getApiErrorLogPage(InfApiErrorLogPageReqVO pageReqVO);
/**
* 获得 API 错误日志列表, 用于 Excel 导出
*
* @param exportReqVO 查询条件
* @return API 错误日志分页
*/
List<InfApiErrorLogDO> getApiErrorLogList(InfApiErrorLogExportReqVO exportReqVO);
/**
* 更新 API 错误日志已处理
*
* @param id API 日志编号
* @param processStatus 处理结果
* @param processUserId 处理人
*/
void updateApiErrorLogProcess(Long id, Integer processStatus, Long processUserId);
}

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