Compare commits

...

873 Commits

Author SHA1 Message Date
bdf579a20b 将 yudao-module-system-api 模块的 auth 包,重构成 oauth2 包 2022-06-05 16:44:50 +08:00
421afab7b9 fix oauth2 swagger 用户信息的接口信息不全,因为 swagger @ApiModel 带 . 会导致跳转存在问题 2022-06-03 18:55:03 +08:00
a1a01cd117 fix swagger 的基础扫描路径不正确 2022-06-03 16:53:53 +08:00
47753467ee 将 yudao-module-system-api 模块的 auth 包,重构成 oauth2 包 2022-06-03 09:53:13 +08:00
c21e953114 升级 mybatis-plus from 3.4.3.4 to 3.5.2 2022-06-03 09:44:48 +08:00
6fd14b30c2 1. 升级 spring boot 到 2.6.8
2. 修复 Spring Fox 在 2.6.X 版本的兼容性
2022-06-01 22:18:02 +08:00
b9f1eacf5c Merge branch 'master' of https://github.com/YunaiV/ruoyi-vue-pro 2022-06-01 21:35:57 +08:00
1c89d3ba84 !179 fastjson漏洞处理
Merge pull request !179 from October/master
2022-06-01 13:34:33 +00:00
b76fd25cc6 !142 【支付宝通知回调BUG修复】 【微信支付 小程序支付功能添加】 【微信支付回调】
Merge pull request !142 from zwy/feature/1.6.2-pay
2022-05-30 01:41:02 +00:00
156a591070 code review 支付的提交,补充相关的注释 2022-05-30 09:39:00 +08:00
17483e8b36 Merge branch 'master' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into feature/1.6.2-pay 2022-05-30 01:36:17 +08:00
87a45795a4 Merge pull request #151 from longtai-cn/fix_20220522_docs
修复注释错别字
2022-05-28 23:25:51 +08:00
add9317d89 !184 一键改包增加新项目目录检测,若新目录存在则退出程序。
Merge pull request !184 from muyi/master
2022-05-28 01:24:58 +00:00
yjb
22e231ffdb 一键改包增加新项目目录检测,若新目录存在则退出程序。 2022-05-28 09:18:26 +08:00
yjb
e613652e67 一键改包增加新项目目录检测,若新目录存在则退出程序。 2022-05-28 09:11:12 +08:00
86bb6f0b80 优化上传文件的类型识别,增加基于 filename 的读取 2022-05-27 20:16:25 +08:00
30fbfb6143 新建的用户未分配角色时,操作自己信息回报错的问题 2022-05-27 20:10:24 +08:00
abe6828d0c 增加 纠正删除刷新临牌时,调用mapper错误 的单元测试 2022-05-27 19:55:38 +08:00
68a0b381c1 !180 纠正删除刷新临牌时,调用mapper错误。
Merge pull request !180 from jinbb/N/A
2022-05-27 11:53:16 +00:00
1ec5621559 !183 【轻量级 PR】:修复参数不一致导致接口文档无法访问问题
Merge pull request !183 from SinceJuly/master
2022-05-27 09:51:30 +00:00
957a7090e7 修复参数不一致导致接口文档无法访问问题 2022-05-27 14:24:28 +08:00
8f333562af Merge branch 'master' of https://github.com/YunaiV/ruoyi-vue-pro 2022-05-26 19:35:13 +08:00
80fb97d9fe 完善 issue 规范,提升社区效率。 2022-05-26 19:34:33 +08:00
83bfb6073b 纠正删除刷新临牌时,调用mapper错误。
纠正删除刷新临牌时,调用mapper错误。
2022-05-26 02:48:18 +00:00
0e601d9d30 ݹϢȫϢͨļ֣ⷢͰ͹˾ԴJavafastjsonڷл©fastjsonڶjavaΪɣ㷺javaӦõķ˴С߿©ʵʩļд롢αȹΪɷȨޱȡϢй©Ӱ졣˴¼Ӱfastjson 1.2.80֮ǰа汾ĿǰͰ͹˾ѷfastjson°汾1.2.83޸©ַΪhttps://github.com/alibaba/fastjson/releases/tag/1.2.83 λ߶ӣѸͨԤϽϵͳλʱŲӰȷȫǰ޸©ϵͳȫϷ繥¼ͬʱǿȫ⣬Ӧ׼ͻҪѸٴòһʱ䱨档
Signed-off-by: October <githubgit@163.com>
2022-05-26 10:04:10 +08:00
82cf4e1775 !176 基于 OAuth2.0 实现 SSO 单点登录
Merge pull request !176 from 芋道源码/feature/1.6.2
2022-05-25 17:06:44 +00:00
2105950321 同步 SSO 相关的 Oracle、PostgreSQL 的脚本 2022-05-26 01:03:57 +08:00
6566605da3 同步 SSO 相关的 MySQL、SQL Server 的脚本 2022-05-26 00:13:06 +08:00
495f121463 完善 OAuth2OpenControllerTest 单元测试 2022-05-25 23:22:48 +08:00
f87c4f75e8 完善 OAuth2GrantServiceImplTest 单元测试 2022-05-25 01:44:23 +08:00
4ffe7b9c3b 完善 OAuth2CodeServiceImplTest 单元测试 2022-05-25 01:14:04 +08:00
522d70a29b 完善 OAuth2TokenServiceImplTest 单元测试 2022-05-25 00:19:46 +08:00
65d2dffe1a 完善 OAuth2ApproveServiceImplTest 单元测试 2022-05-24 22:24:13 +08:00
b3ab1d9285 完善 OAuth2ClientServiceImplTest 单元测试 2022-05-24 10:13:05 +08:00
668551350f 完成 SSO 登录的功能 2022-05-24 00:48:35 +08:00
d18463866e 新增 sso 页面 2022-05-24 00:01:30 +08:00
ed847ac2ee Merge branch 'master' of https://github.com/YunaiV/ruoyi-vue-pro into feature/1.6.2 2022-05-23 20:17:28 +08:00
14d4d8ca29 修复用户导入的 URL 不正确,导致报用户未登录的错误 2022-05-23 02:11:12 +08:00
c410240ed5 修复 form generator 组件上传文件、图片报错的问题 2022-05-23 02:03:42 +08:00
ed97284c0f 修复注释错别字 2022-05-22 22:23:59 +08:00
2b4ff2ae28 修复社交登录的图床挂掉的问题 2022-05-22 20:19:03 +08:00
d322e78199 前端 Token、账号、密码等信息,统一使用 LocalStorage 替代 Cookie 存储 2022-05-22 20:09:48 +08:00
7926ea9896 修复 refresh token 过期时,不会自动跳转到首页的问题 2022-05-22 17:33:39 +08:00
c738b2c84d 增加 github 提交 issue 的模板 2022-05-22 14:07:21 +08:00
915b6b27e3 Update issue templates 2022-05-22 14:01:51 +08:00
63012d1537 Merge remote-tracking branch 'origin/master' 2022-05-22 13:35:57 +08:00
7c5b27916d 增加 gitee 提交 issue 的模板 2022-05-22 13:35:51 +08:00
138290326e !174 字典管理、通知管理、岗位管理、角色管理界面的列表改成初始按id倒序显示。错误码管理改为初始按code倒序显示。
Merge pull request !174 from 枫叶/master
2022-05-22 01:34:46 +00:00
7e09b406ab 字典管理、通知管理、岗位管理、角色管理界面的列表改成初始按id倒序显示。错误码管理改为初始按code倒序显示。 2022-05-21 20:53:33 +08:00
f72597c434 字典管理、通知管理、职位管理角色管理界面的列表改成初始按id倒序显示。错误码管理改为初始按code倒序显示。 2022-05-21 19:23:31 +08:00
cdb79bcb39 用户管理页面改变用户列表默认排序方式为用户id倒序 2022-05-21 18:00:00 +08:00
c09b070812 调整接口文档的地址 2022-05-21 10:15:49 +08:00
b9bf0f9a4d !173 fix ui-admin warning
Merge pull request !173 from supine-win/master
2022-05-20 14:54:37 +00:00
d7b19327ab fix ui-admin warning 2022-05-20 21:40:11 +08:00
24d46ad23a 去除 mybatis plus 的 type handler 配置系项,避免全局生效 2022-05-20 10:14:55 +08:00
e81ac9c1d0 增加 MyBatis Plus 的字段加密时,查询的示例 2022-05-19 23:01:35 +08:00
0ae9af0492 增加 MyBatis Plus 的 EncryptTypeHandler 类型处理器,实现字段的加密解密 2022-05-19 02:17:44 +08:00
3cc7a35ccc 项目启动时,打印相关文档 2022-05-18 20:22:42 +08:00
0b80081083 !172 路由地址转首字母大写驼峰,作为路由名称,适配keepAlive
Merge pull request !172 from caiti/master
2022-05-18 04:55:20 +00:00
960b1eb250 fix: 路由地址转首字母大写驼峰,作为路由名称,适配keepAlive 2022-05-18 11:44:54 +08:00
9ee2fe5eb3 !171 创建用户不分配角色的情况会存在空指针
Merge pull request !171 from caiti/master
2022-05-17 14:01:30 +00:00
92d7a701b5 fix: 使用CollUtil.isEmpty判空 2022-05-17 22:00:06 +08:00
3eb2f3447f fix: 新增用户不分配角色的情况会空指针 2022-05-17 21:54:04 +08:00
f87e1d822c v3.8.0 新增tab对象简化页签操作 2022-05-17 13:00:47 +08:00
19f6207862 修复新增租户时,数据权限的校验导致报错的问题 2022-05-17 10:09:06 +08:00
1f1970e6c8 提供最新的内嵌模式 2022-05-17 09:55:21 +08:00
b88b6904bf !163 处理问题 https://gitee.com/zhijiantianya/ruoyi-vue-pro/issues/I560LX
Merge pull request !163 from not_null/N/A
2022-05-17 01:49:09 +00:00
0b9755e182 !170 配置指定默认的npm镜像源
Merge pull request !170 from caiti/master
2022-05-16 12:44:55 +00:00
b9636bcf6a perf: 增加.npmrc文件,默认使用新的淘宝镜像源 2022-05-16 20:11:57 +08:00
c7a2916748 完成 system_oauth2_approve 相关的批准逻辑 2022-05-16 00:00:36 +08:00
60bb8dd29c 增加 oauth2 的 code 的生成与消费的逻辑 2022-05-15 22:23:28 +08:00
feff5aba07 增加 oauth2 的 scope 的校验方法,与使用示例 2022-05-15 21:30:12 +08:00
65ee56c811 完成 oauth2 check-token 校验 token 的实现 2022-05-15 18:32:34 +08:00
0900b9e111 完成 oauth2 password 密码模式的实现
完成 oauth2 revokeToken 的实现
2022-05-15 17:36:22 +08:00
99ba7ccee8 完成 oauth2 code 授权码模式的实现 2022-05-15 15:59:49 +08:00
66034d26c0 完成 oauth2 code 授权码模式的实现 2022-05-15 00:20:52 +08:00
6ca88277d8 完成 oauth2 implicit 简化模式的实现 2022-05-14 23:47:34 +08:00
7d1deab48b 调整包结构,oauth2 独立 2022-05-14 21:56:28 +08:00
aa8fb4acf0 搭建 oauth/authorize 的初步逻辑 2022-05-14 20:10:06 +08:00
ce60ec0815 修改 OAuth2ClientDO 实体,支持自动授权的范围的设置 2022-05-14 15:11:58 +08:00
6c5f5e1ad4 完善 refresh token 失效时,无法自动跳转回首页的问题,同时优化相关的提示 2022-05-13 20:28:56 +08:00
09c8a91b6a 修复 MySQL 文件的编码错误 2022-05-13 19:24:07 +08:00
766ccbf962 !168 fixed: 在特定情况下,flowable数据库表自动创建不了,导致无法启动
Merge pull request !168 from hezhenhui/#I57A80
2022-05-13 10:19:14 +00:00
cd4df24933 !167 DO生成模板,当主键是String类型,模板有误
Merge pull request !167 from hezhenhui/#I578CG
2022-05-13 10:18:41 +00:00
0fd1435e94 fixed: 在特定情况下,flowable数据库表自动创建不了。 2022-05-13 14:17:03 +08:00
67afd82150 Merge branch 'master' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into feature/1.6.2 2022-05-13 12:31:36 +08:00
9e10e0fd5d Merge branch 'master' of https://github.com/YunaiV/ruoyi-vue-pro into feature/1.6.2 2022-05-13 12:31:26 +08:00
db0fbcf3d9 同步最新的 MySQL、Oracle、PostgreSQL、SQLServer 的数据文件 2022-05-13 12:31:06 +08:00
93f6d4eaf1 fixed:DO生成模板,当主键是String类型,模板有误 2022-05-13 09:59:35 +08:00
190150d1f4 !166 用户 Token 采用 OAuth2 的 Access Token + Refresh Token,提升安全性
Merge pull request !166 from 芋道源码/feature/1.6.2
2022-05-12 17:56:24 +00:00
e1daeba5d3 同步最新的 SQL 脚本 2022-05-13 01:52:10 +08:00
5794780c4e 调整 SecurityPermissionFrameworkService 的实现,完善 PermissionServiceTest 的单元测试 2022-05-13 00:24:10 +08:00
49b4eedfc0 增加 UserRole 的缓存,完善权限相关的单元测试 2022-05-12 22:57:58 +08:00
97db4586a8 完成 OAuth2 的客户端模块 2022-05-12 01:09:16 +08:00
3294442121 !165 代码优化
Merge pull request !165 from Justubborn/master
2022-05-11 15:46:27 +00:00
41d049c35c pref: 代码优化 2022-05-11 15:13:20 +00:00
1f36af8e6a 文件上传组件 FileUpload 上传报错的问题 2022-05-11 12:40:54 +08:00
b6cb6469f1 富文本编辑器的 Editor 的图片上传报错的问题 2022-05-11 12:35:42 +08:00
4f7cd65e95 !164 fix:使用一键改包之后,可能导致的自定义lock4j失败策略bean与lock4j提供的默认失败策略bean冲突问题
Merge pull request !164 from baihongbin/master
2022-05-11 03:13:40 +00:00
9d5d192175 fix:使用一键改包之后,可能导致的自定义lock4j失败策略bean与lock4j提供的默认失败策略bean冲突问题
解决方法:
使用@AutoConfigureBefore注解,指定自定义bean在LockAutoConfiguration之前进行加载,使得LockAutoConfiguration中的失败策略bean上的@ConditionalOnMissingBean注解生效
2022-05-11 02:51:29 +00:00
63e632ceb7 图片上传组件 ImageUpload 上传报错的问题 2022-05-11 01:20:07 +08:00
f46d81dab5 增加 OAuth2 客户端 2022-05-11 00:43:03 +08:00
5cf68961e1 1. 修改在线会话的实现
2. 接入到会员管理 OAuth2.0
2022-05-10 23:20:15 +08:00
8ebac3e445 处理问题 https://gitee.com/zhijiantianya/ruoyi-vue-pro/issues/I560LX
处理问题 https://gitee.com/zhijiantianya/ruoyi-vue-pro/issues/I560LX
2022-05-10 10:20:41 +00:00
6ed624861d 增加 refresh token 接口,并接入到前端项目 2022-05-09 22:49:42 +08:00
a3687132b6 增加 refresh token 接口,并接入到前端项目 2022-05-09 22:46:52 +08:00
86e6c04e07 登录后,返回 OAuth2 的 access token + refresh token 2022-05-09 19:40:10 +08:00
8505873e1b 解决 UserController 冲突问题 2022-05-09 13:31:39 +08:00
5ea9cc3cd7 实现管理后台登出时,删除 oauth 令牌 2022-05-09 13:29:23 +08:00
4f52d1367b 实现管理后台登录时,使用 OAuth2 的 access token 2022-05-08 23:52:31 +08:00
b30c39764d 用户信息 2022-05-08 21:20:47 +08:00
ebee4ddb7c 制定 OAuth2 协议的表结构与 API 设计 2022-05-08 17:43:24 +08:00
5e8648508e 去除 Spring Security 的 Member 的 loadUsername,使用自己定义的 login0 实现 2022-05-08 02:33:34 +08:00
3bd7e8e682 去除 Spring Security 的 Admin 的 loadUsername,使用自己定义的 login0 实现 2022-05-08 02:09:22 +08:00
3351ebbbb4 去除 Spring Security 的 logout handler,使用自己定义的 logout 接口 2022-05-08 00:38:55 +08:00
baadb5a937 简化 mock login 模拟登录的实现,由 TokenAuthenticationFilter 直接实现 2022-05-08 00:17:48 +08:00
73bf0b6f4f 去除 LoginUser 的 updateTime、username、password、status 字段,简化 2022-05-07 01:30:37 +08:00
8737674d74 去除 LoginUser 的 roleIds、deptId 字段,简化 2022-05-07 00:39:39 +08:00
d8a242629b Merge branch 'feature/1.6.2' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into feature/1.6.2 2022-05-06 23:47:37 +08:00
7f5788aed1 YudaoServerApplication 中,增加启动项目的文档地址 2022-05-06 10:07:12 +08:00
a9cedfa7f2 Spring Cloud 开始迭代:https://gitee.com/zhijiantianya/yudao-cloud 2022-05-06 01:00:27 +08:00
7240478270 !161 ftp的在操作之前添加一个判断超时的重试。
Merge pull request !161 from emaisi/N/A
2022-05-05 13:24:53 +00:00
52010d5535 完善单元测试 2022-05-05 19:29:53 +08:00
12ede349fa ftp的在操作之前添加一个判断超时的重试。 2022-05-05 07:31:56 +00:00
247b893131 !156 解决在windows下ftp上传和ftp下载的
Merge pull request !156 from emaisi/feature/1.6.2
2022-05-04 15:56:47 +00:00
b5f97f69d3 注释标点符号和汉字空格 2022-05-04 22:56:27 +08:00
bddd193185 调整注释 2022-05-04 22:47:39 +08:00
472da026de 调整注释 2022-05-04 22:46:29 +08:00
735228fcb1 修复ftp上传和下载的 2022-05-04 13:20:34 +08:00
4b90792bf1 !155 增加手机验证码登录
Merge pull request !155 from 酱包/feature/1.6.2-smsLogin
2022-05-03 09:12:21 +00:00
04f9f97162 调整社交登录界面,和登录界面保持统一 2022-05-03 17:04:20 +08:00
d0cd440380 压缩登录时的图片大小 2022-05-03 16:57:44 +08:00
4c4e37fd42 登录面板增加钉钉、企业微信支付按钮 2022-05-03 14:31:37 +08:00
4b09dfe855 !154 修复代码生成UpdateReqVO时import多一个括号问题
Merge pull request !154 from 岁月无声/feat_chow5945
2022-05-03 04:43:25 +00:00
da2426c80d 修复代码生成VO多一个括号问题
(cherry picked from commit 974cef3a534ae575422c75ab5a04b272d18a6b14)
2022-05-03 12:30:21 +08:00
9848a95eb0 【升级】mysql-connector-java from 5.1.46 to 8.0.28 :提升 MySQL 客户端的性能 2022-05-02 23:36:49 +08:00
3c2de45067 update yudao-server/src/main/resources/application-local.yaml.
修改默认使用 MySQL 连接的示例
2022-05-02 15:06:47 +00:00
7753bd4c44 1. code review 后台的短信验证码登陆
2. 解决 SQL Server LIMIT 1 存在报错的问题
2022-05-02 22:57:45 +08:00
4453ac27ff Merge branch 'master' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into feature/1.6.2-smsLogin
 Conflicts:
	sql/ruoyi-vue-pro.sql
	yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/auth/AuthConvert.java
	yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/security/config/SecurityConfiguration.java
	yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthService.java
	yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java
	yudao-ui-admin/src/api/login.js
	yudao-ui-admin/src/store/modules/user.js
2022-05-02 21:36:51 +08:00
ccdf0e4151 增加多数据库的适配说明 2022-05-02 18:17:44 +08:00
4c2e8c92d1 增加多数据库的适配说明 2022-05-02 18:11:26 +08:00
272e7dd206 Merge branch 'master' of https://github.com/YunaiV/ruoyi-vue-pro 2022-05-02 18:07:12 +08:00
e750e15b96 !153 增加 SQLServer 的适配~
Merge pull request !153 from 芋道源码/feature/1.6.2
2022-05-02 10:05:29 +00:00
60f918da84 增加 SQLServer 的适配~ 2022-05-02 18:04:34 +08:00
1f5e168e79 默认注释 Redis 的账号密码 2022-05-02 16:03:06 +08:00
fd0c07c1f8 Merge branch 'master' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into feature/1.6.2-postgresql 2022-05-02 16:01:48 +08:00
6f312f9466 !147 增加redis密码
Merge pull request !147 from Hermit/fork
2022-05-02 08:01:34 +00:00
cf3cfdd2d6 补全用户与岗位的关联的单元测试,简化相关的实现代码 2022-05-02 15:59:38 +08:00
c845f3f012 Merge branch 'master' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into feature/1.6.2-postgresql 2022-05-02 15:24:24 +08:00
7d87be8b7d !113 新建一个关联表,维护用户和岗位的关系
Merge pull request !113 from anzhen-tech/master
2022-05-02 07:20:53 +00:00
1ebfb20d08 !135 【修复】代码生成对话框的日期选择器,在编辑情况下不能回显
Merge pull request !135 from dearliuliu0522/dev
2022-05-02 04:35:34 +00:00
8606f5c605 优化 UserSession 的实现,将 id 变成自增,额外增加 token 字段 2022-05-02 12:33:37 +08:00
501aea226a Merge pull request #137 from KLSOBIG/修复代码生成器biz路径问题
修复代码生成器biz路径问题
2022-05-02 11:57:36 +08:00
1a3e0b08c4 !108 update yudao-ui-admin/src/views/bpm/model/modelEditor.vue.
Merge pull request !108 from 四叶草/N/A
2022-05-02 03:55:47 +00:00
18a3f4d3eb Merge branch 'upstream/master'
# Conflicts:
#	sql/ruoyi-vue-pro.sql
2022-05-02 11:50:35 +08:00
256405761b !152 对 Oracle 数据库的支持
Merge pull request !152 from 芋道源码/feature/1.6.2
2022-05-01 15:20:06 +00:00
0f21b55e6d 解决 Oracle 关键字冲突的问题
导出最新的 SQL 脚本
2022-05-01 23:18:50 +08:00
2bd2313434 适配 Oracle 数据库
1. 适配表名是大写的情况
2. 优化代码生成器的校验逻辑
2022-05-01 19:47:30 +08:00
6f18adb54a 适配 Oracle 数据库
1. 修复配置中心的 DAO 查询报错
2. 适配 LIMIT 1 的查询
2022-05-01 17:55:13 +08:00
7db1a58bfc 适配 Oracle 数据库
1. 去除关键字,避免数据库的查询冲突
2022-05-01 13:33:02 +08:00
1bd86d6ffd 适配 Oracle 数据库
1. 解决 Menu 的 permission 为空,导致缓存初始化报错
2. 多租户拦截时,过滤掉 DUAL 表,避免 TENANT_ID 字段不存在的报错
3. BaseDO 增加 creator、updator 字段的 jdbcType,避免解析 null 值报错
2022-05-01 01:12:27 +08:00
ef9dfda300 Merge branch 'master' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into feature/1.6.2-postgresql 2022-04-30 23:27:14 +08:00
72ad12344b 调整 Flowable、Activiti 提供的脚本,通过 db 自动生成 2022-04-30 23:26:43 +08:00
20840a3ac0 !151 增加 PostgreSQL 数据库的支持
Merge pull request !151 from 芋道源码/feature/1.6.2
2022-04-30 15:17:31 +00:00
adfe2926da 1. 同步 MySQL、PostgreSQL 最新的脚本
2. 修复单元测试的报错
2022-04-30 23:16:24 +08:00
b5a9434f83 !150 回退 'Pull Request !144 : 注释掉MenuServiceTest类测试代码,修复master分支的源码编译报错问题,方便其他童鞋下载后直接运行。'
Merge pull request !150 from 芋道源码/revert-merge-144-master
2022-04-30 15:15:16 +00:00
b47264c037 回退 'Pull Request !144 : 注释掉MenuServiceTest类测试代码,修复master分支的源码编译报错问题,方便其他童鞋下载后直接运行。' 2022-04-30 15:14:58 +00:00
d1a46cf652 Merge branch 'master' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into feature/1.6.2-postgresql 2022-04-30 23:14:29 +08:00
e651d9c59d !144 注释掉MenuServiceTest类测试代码,修复master分支的源码编译报错问题,方便其他童鞋下载后直接运行。
Merge pull request !144 from Hermit/fork-pr1
2022-04-30 15:12:59 +00:00
45cbb56ea1 1. 同步 MySQL、PostgreSQL 最新的脚本
2. 修复单元测试的报错
2022-04-30 23:11:37 +08:00
30e886be6f 解决 PostgreSQL 集成 Quartz 时的报错 2022-04-30 22:52:55 +08:00
e24c8c3425 修改实体和 Mapper,解决 PostgreSQL 查询报错的问题 2022-04-30 20:09:36 +08:00
zwy
a30e3c655a 📝
添加微信支付回调注解
2022-04-30 18:44:50 +08:00
98c317f0e0 封装 IdTypeEnvironmentPostProcessor 组件,自动适配 id-type 策略,用于 Oracle、PostgreSQL 的自动适配 2022-04-30 11:38:21 +08:00
99137289e1 !149 代码生成器支持 MySQL、Oracle、PostgreSQL、SQLServer、DM 等数据库
Merge pull request !149 from 芋道源码/feature/1.6.2
2022-04-29 16:08:29 +00:00
2367280d83 1. 同步最新 SQL
2. 生成内嵌的页面
2022-04-30 00:06:49 +08:00
577109cd9c Merge branch 'master' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into feature/1.6.2 2022-04-30 00:03:15 +08:00
0f5477a4df 完善代码生成器的 h2 脚本 2022-04-29 23:54:10 +08:00
b34e2691f8 支持主流数据库的代码生成 2022-04-29 23:14:34 +08:00
f1069aa306 增加 PostgreSQL 的代码生成支持 2022-04-29 19:39:56 +08:00
zwy
a9acbca787 🐛
【微信支付回调】:
WXLitePayClient.java:   添加 v2和 v3的回调数据处理
WXNativePayClient.java: 添加 v2和 v3的回调数据处理
WXPubPayClient.java:    添加 v2和 v3的回调数据处理
2022-04-29 16:17:31 +08:00
49b54f1bae 增加redis密码 2022-04-29 11:34:06 +08:00
023eb08fd1 注释掉MenuServiceTest类测试代码,修复master分支的源码编译报错问题 2022-04-29 10:58:49 +08:00
zwy
7b17e3bc2f Merge branch 'master' into feature/1.6.2-pay 2022-04-29 09:55:07 +08:00
3e869a07fd 1. 将 column_type 调整成 data_type 字段
2. 完善 Oracle 的字段映射
2022-04-29 00:51:43 +08:00
6b68aa95fe 增加 DatabaseTableOracleDAOImpl 实现 2022-04-29 00:31:06 +08:00
3950c58c18 增加 Oracle Driver 2022-04-28 20:42:13 +08:00
d79549b48a 优化代码生成器实现,增加 DatabaseTableDAO 抽象,支持多 db 类型 2022-04-28 19:27:59 +08:00
93718f9167 修复代码生成器biz路径问题 2022-04-28 09:16:57 +08:00
a1ff34b388 !138 新增数据源配置
Merge pull request !138 from 芋道源码/feature/1.6.2
2022-04-27 15:26:59 +00:00
d04271b965 增加数据源管理 SQL 2022-04-27 23:26:03 +08:00
d406bd37ce Merge branch 'master' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into feature/1.6.2 2022-04-27 23:25:30 +08:00
7ce7baa2d2 增加数据源管理 2022-04-27 23:15:43 +08:00
1cd4338857 Merge branch 'upstream/master'
# Conflicts:
#	yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dept/UserPostDO.java
#	yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dept/UserPostMapper.java
2022-04-27 22:17:43 +08:00
zwy
d099ad2a8b 🐛
【微信支付】:
WXLitePayClient.java 微信小程序支付模块:
!!前端必须传openid
PayClientFactoryImpl.java 支付客户端的工厂实现类:
添加 小程序支付模块
2022-04-27 14:15:20 +08:00
5139117b13 更新登录模板
支持短信验证码登录
2022-04-27 11:31:18 +08:00
zwy
03ad548aa2 🐛
【支付宝通知回调】:
 AbstractAlipayClient.java :
添加支付宝回调参数str转map
通知回调:
Map<String, String> params = notifyData.getParams();
Map<String, String> params = strToMap(notifyData.getBody());
2022-04-27 10:18:47 +08:00
zwy
daca7c98f6 Merge branch 'master' into feature/1.6.2-pay
# Conflicts:
#	yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/alipay/AbstractAlipayClient.java
2022-04-27 10:17:26 +08:00
zwy
58c3afee08 🐛
【支付宝通知回调】:
AbstractAlipayClient.java :
支付宝统一回调参数  str转map
通知回调参数
Map<String, String> params = notifyData.getParams();
Map<String, String> params = strToMap(notifyData.getBody());
2022-04-27 10:10:39 +08:00
2d797ef3e8 同步最新社交登录的 SQL 脚本 2022-04-27 01:53:26 +08:00
99c8d766b7 Merge branch 'master' of https://github.com/YunaiV/ruoyi-vue-pro 2022-04-27 00:38:52 +08:00
0bf5b20fd7 !137 简化三方登录的实现,降低理解成本
Merge pull request !137 from 芋道源码/feature/1.6.2
2022-04-26 16:37:49 +00:00
c402077961 进一步重构社交登陆的实现 2022-04-27 00:35:59 +08:00
7227664f77 进一步重构社交登陆的实现 2022-04-26 23:36:26 +08:00
78275a165a !131 【支付模块】微信native支付【BUG修复】 微信支付 修改时间 格式 yyyyMMddHHmmss 修改为 yyyy-MM-dd'T'HH:mm:ssXXX
Merge pull request !131 from zwy/master
2022-04-26 11:22:05 +00:00
zwy
6505906565 🐛
【支付模块BUG】
修改时间 格式 yyyyMMddHHmmss 为 yyyy-MM-dd'T'HH:mm:ssXXX

支付宝 获取支付回调对象
2022-04-26 18:03:19 +08:00
zwy
802a7b0a30
【支付模块】
修改时间 格式 yyyyMMddHHmmss 为 yyyy-MM-dd'T'HH:mm:ssXXX
2022-04-26 16:47:06 +08:00
878445a238 重构社交登录,完善单元测试 2022-04-26 02:17:38 +08:00
89df5b3cf6 临时提交,暂时不考虑 unionId,简化模型 2022-04-26 01:15:24 +08:00
705a5ff645 重构社交登录的时候,增加独立的社交绑定表 2022-04-25 01:36:29 +08:00
0eecff675d Merge pull request #133 from Hobo-clh/master
fix: 修复代码生成器的vue模板中,导出文件【xxx.xls】时,文件名不正确问题
2022-04-24 17:40:48 +08:00
182fc9f277 Merge branch 'upStreamMaster' 2022-04-24 09:43:24 +08:00
c51bbb81b5 【修复】代码生成对话框的日期选择器,在编辑情况下不能回显的问题 2022-04-23 18:15:37 +08:00
6e40469735 【修复】菜单无法使用外链的问题 2022-04-23 01:30:15 +08:00
bbb5bed7da 1. 新增《接口文档》《菜单路由》等 2022-04-22 22:47:45 +08:00
033b37eec5 !134 修复敏感词表格的”创建时间“列内容错误,以及在”标签“列的标签之间增加空格
Merge pull request !134 from dearliuliu0522/dev
2022-04-22 11:04:30 +00:00
d06ed39155 fix: 修复代码生成器的vue模板中,导出文件【xxx.xls】时,文件名不正确问题 2022-04-22 16:49:58 +08:00
c348fc2a19 【优化】编辑字典类型时设置字典类型元素为不可编辑状态 2022-04-22 16:34:52 +08:00
4f6984b021 取消编辑字典类型时设置字典类型元素为不可编辑状态 2022-04-22 16:28:52 +08:00
80629da1bd 【优化】编辑字典类型表单时,字典类型设置为不可编辑 2022-04-22 16:13:04 +08:00
08cb9955c7 修复敏感词表格创建时间列内容错误,标签列标签之间增加空格 2022-04-22 15:10:46 +08:00
9ee501d845 Merge remote-tracking branch 'origin/master' 2022-04-22 00:08:00 +08:00
09103f310b 1. 【修复】单元测试报错
2. 【优化】yudao-module-xx-impl 调整成 yudao-module-xx-biz,更加符合定位
2022-04-22 00:07:54 +08:00
6d36c7a6f7 !133 【新增】菜单新增是否缓存、是否隐藏的字段
Merge pull request !133 from 芋道源码/feature/1.6.2
2022-04-20 17:48:16 +00:00
c703628940 【新增】菜单新增是否缓存、是否隐藏的字段 2022-04-21 01:47:34 +08:00
b5821b4bef !132 优化一键改包的实现,增强对 win 的兼容性
Merge pull request !132 from 芋道源码/feature/project-reactor
2022-04-20 12:58:56 +00:00
946735ac24 优化一键改码的实现,解决 win 和 mac 的兼容性问题,修复 png、jpg 等文件的编码问题 2022-04-20 20:56:33 +08:00
ceb76e7190 优化注释,修复 mac 的兼容性问题 2022-04-20 12:52:13 +08:00
zwy
29a384989b
【支付模块】
添加 微信native支付
2022-04-19 17:38:43 +08:00
zwy
4a91dcb3bf
【支付模块】
添加 微信native支付
2022-04-19 15:23:11 +08:00
d285fc146e Merge branch 'master' of https://gitee.com/zhijiantianya/ruoyi-vue-pro 2022-04-18 21:15:11 +08:00
4944f65905 优化 vue2 的前端,登出系统时,拼接 BASE PATH 2022-04-18 21:15:01 +08:00
338ac14c19 公告类型名称错误 2022-04-18 07:24:15 +00:00
d9a129d317 关联更多《开发指南》的文档,方便大家快速获取到文档。 2022-04-17 13:58:01 +08:00
360525558a 调整 SkyWalking 对应的菜单 2022-04-17 13:24:03 +08:00
3e77061c40 Merge branch 'feature/project-reactor' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into feature/project-reactor 2022-04-16 12:39:26 +08:00
a2f405f8bd * 【升级】spring-boot from 2.5.10 to 2.5.12 :修复 RCE 漏洞
* 【升级】redisson from 3.16.6 to 3.17.0 :提升 Redisson 客户端的稳定性
2022-04-16 12:28:01 +08:00
9b687ff6c9 🐛 修复忽略租户的 URL,未带租户会报错的问题 2022-04-16 00:33:34 +08:00
6471c8d586 修复管理后台的社交登录时,传入的用户类型不正确 2022-04-16 00:19:54 +08:00
1737714a22 修复敏感词的 Swagger 注解错误,导致 Knife4j 无法使用 2022-04-15 20:36:39 +08:00
17167c24d1 code review 编码规范统一 2022-04-15 15:56:47 +08:00
5d98ccdff1 复旦核博士说,建议使用 CMD 替换 ENTRYPOINT,方便替换命令 2022-04-14 20:52:51 +08:00
84ca797b1a 增加 yudao-server 的 Dockerfile 文件,编写《Docker 部署》文档 2022-04-14 00:54:20 +08:00
2d5601be92 调整前端和环境的环境配置 2022-04-13 12:24:08 +08:00
9afc297388 统一配置文件的环境名 2022-04-11 22:46:38 +08:00
f38c783152 Merge remote-tracking branch 'origin/master' 2022-04-11 01:21:40 +08:00
076c7a4e3e 优化短信模块的代码 2022-04-11 01:21:33 +08:00
1a30deb28c update README.md. 2022-04-10 03:43:33 +00:00
7198aa36b9 修改 README 文档,进一步声明个人和企业 100% 使用,项目 100% 开源 2022-04-10 03:42:18 +00:00
5260df6e87 !122 去除 system、infra 模块,对 member 模块的依赖
Merge pull request !122 from 芋道源码/feature/1.6.2
2022-04-10 03:31:58 +00:00
ae85fe8aaf 去除 system、infra 模块,对 member 模块的依赖 2022-04-10 11:31:08 +08:00
e33b2f0dd3 解决 framework 的库,存在循环依赖的问题 2022-04-09 17:26:11 +08:00
eb6d430ef9 解决 framework 的库,存在循环依赖的问题 2022-04-09 09:07:15 +00:00
cc376378ab !118 [feature]接入腾讯云短信
Merge pull request !118 from swpthebest/feature/1.6.2-qcloud
2022-04-09 03:29:00 +00:00
9bed141201 简单调整下腾讯云短信的排版 2022-04-09 11:28:21 +08:00
65a86e8d75 Merge branch 'master' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into feature/1.6.2-qcloud
 Conflicts:
	yudao-ui-admin/yarn.lock
2022-04-09 11:27:47 +08:00
c9d3913544 !121 新增敏感词功能
Merge pull request !121 from 芋道源码/feature/1.6.2-sensitive-word2
2022-04-09 03:19:17 +00:00
9d9836dea2 完善敏感词的单元测试 2022-04-09 11:18:07 +08:00
696756b3c8 实现 SensitiveWord API 实现类 2022-04-09 10:48:47 +08:00
3f7d7c3bfa 同步 SensitiveWord 敏感词代码,原分支未正确关联仓库 2022-04-09 01:00:20 +08:00
eb147a92ff magic 参数处理&AbstractSmsClient模版优化 2022-04-08 11:10:39 +08:00
bae4502eb9 !119 流程模型的几个问题
Merge pull request !119 from @C/master
2022-04-08 01:32:02 +00:00
cks
bdfea0c5da [fix]
1. 精准匹配,限制条件添加在service中
2. 空格问题
2022-04-08 08:59:58 +08:00
2e66845584 code review 腾讯短信的实现,基本没啥问题了 2022-04-07 23:53:19 +08:00
91f758c295 根据 code review 对腾讯云短信实现优化 2022-04-07 00:08:29 +08:00
47447ded6b code review 编码规范统一 2022-04-06 13:58:08 +08:00
cks
00d9645673 [fix]
流程模型删除错误问题
无流程模型查询报错问题
2022-04-06 11:40:45 +08:00
9726560318 code review 腾讯短信的实现 2022-04-06 01:05:52 +08:00
d60be0bb53 优化 test 组件的封装,内置 Redis、DB 等多种快速测试的基类 2022-04-04 20:28:59 +08:00
6fd52dfbb6 接入腾讯云短信 2022-04-04 17:30:58 +08:00
0547671c9e 修复 API 访问日志不记录的问题 2022-04-04 00:09:47 +08:00
a426384d41 增加 Spring Cache 框架 2022-04-03 13:53:12 +08:00
1cfc0bc9ea Merge remote-tracking branch 'gitee/master' 2022-04-03 13:23:08 +08:00
49b906bbfe 增加 Spring Cache 框架 2022-04-03 13:23:00 +08:00
4b358a9723 !116 [hotfix] convert 参数错误,导致 usedIp 参数没有复制的问题
Merge pull request !116 from 与或非/hotfix/20200403_convert
2022-04-03 03:50:08 +00:00
abb4756a33 fix 转换 ip 无效的问题 2022-04-03 09:51:09 +08:00
3263b0ab5b !114 1. 优化分配菜单的逻辑,使用批量插入 2. 修复 CodegenEngine 生成代码时,Mapper.XML 地址不对
Merge pull request !114 from 芋道源码/feature/1.6.2
2022-04-01 14:43:57 +00:00
1bb204adb5 1. 优化分配菜单的逻辑,使用批量插入
2. 修复 CodegenEngine 生成代码时,Mapper.XML 地址不对
2022-04-01 22:40:19 +08:00
78c132e68d fix user id is null 2022-03-31 13:18:37 +08:00
5fc1101900 1、关联表删除额外的service。
2、service中删除mybatis plus 的操作,技术和业务解耦。
2022-03-31 09:11:02 +08:00
1b496d91e1 兼容mac 2022-03-31 08:13:32 +08:00
5ac7c3bd5d code review ProjectReactor 的代码实现 2022-03-30 21:54:45 +08:00
d9afb0e6c6 添加html.gz文件的过滤 2022-03-30 18:09:51 +08:00
3cd135850e 新建一个关联表维护用户岗位关系 2022-03-30 17:21:24 +08:00
c729570328 修改title 2022-03-30 16:41:40 +08:00
50b6a4cb5e 更改 文件过滤方法,适应windows 2022-03-30 16:22:57 +08:00
f651b86d53 更改 文件过滤方法,适应windows 2022-03-30 16:15:08 +08:00
1f6bf1621a 更改耗时预计 2022-03-30 14:35:05 +08:00
37900a7394 修改一键改包的bug 2022-03-30 10:08:55 +08:00
56ea65e53d 优化登录逻辑的实现,封装统一的登录成功方法,创建 Session + 记录登录日志 2022-03-30 00:02:55 +08:00
b9693c3e06 !111 [异常提示语错误] 文件上传异常提示语错误
Merge pull request !111 from 与或非/hotfix/20220327_msg
2022-03-28 01:09:32 +00:00
172b227f90 !112 修复代码生成器遇到无符号类型数据库类型时无法匹配到 javaType
Merge pull request !112 from wanwan/fix-codegen-unsigned-20220327
2022-03-28 01:09:03 +00:00
f2b30625f1 fix: 修复代码生成器遇到无符号类型数据库类型时无法匹配到 javaType 2022-03-27 22:59:03 +08:00
f533a2e7c5 fix 提示语错误 2022-03-27 21:31:23 +08:00
e3ddb29c18 !110 优化 ProjectReactor 一键改包程序
Merge pull request !110 from 芋道源码/feature/1.6.2
2022-03-27 05:10:27 +00:00
0bbc03493d 优化 ProjectReactor 一键改包程序 2022-03-27 13:09:12 +08:00
6880fc0c19 update yudao-ui-admin/src/views/bpm/model/modelEditor.vue.
默认流程引擎flowable
2022-03-24 09:45:27 +00:00
20548da999 !107 【修改】角色菜单集合复选框回显不正确
Merge pull request !107 from @C/master
2022-03-23 07:50:11 +00:00
cks
2e97442187 【修改】角色菜单集合复选框回显不正确 2022-03-23 15:21:34 +08:00
cefcff6524 !104 fix #I4VZCZ canvas自适应
Merge pull request !104 from 感觉/master
2022-03-22 09:45:47 +00:00
1f0535d055 !106 fix #I4Z1AN 修复字典类型常量类 错误问题,操作人id取值错误
Merge pull request !106 from 感觉/master
2022-03-22 09:44:27 +00:00
5614a8495f fix 用户id翻译成名称时id取错得bug 2022-03-22 17:34:14 +08:00
6dbb1248a8 fix 修复字典类型常量类 错误问题,导致导出部分字段无法从字典缓存匹配正确值 2022-03-22 17:17:25 +08:00
4037cc0425 fix #I4VZCZ canvas自适应 2022-03-21 06:22:44 +00:00
000263e092 !103 update yudao-ui-admin/src/views/pay/app/index.vue.
Merge pull request !103 from 北酒鱼/N/A
2022-03-21 03:50:46 +00:00
8223efafe1 update yudao-ui-admin/src/views/pay/app/index.vue.
修复支付配置支付枚举
2022-03-21 03:09:32 +00:00
69d736c3c6 修复 RoleServiceImpl 单元测试失败的问题 2022-03-21 00:30:39 +08:00
3526353cdf 构建最新的 admin-ui,准备 v1.6.1 版本的发布 2022-03-21 00:24:14 +08:00
f8fffcea1b 修复 Breadcrumb dump key 的问题 2022-03-20 23:20:00 +08:00
1a2c03bc7e v3.8.2 开启TopNav没有子菜单情况隐藏侧边栏 2022-03-20 22:58:13 +08:00
82a3a8387c v3.8.2 修复表单清除元素位置未垂直居中问题(I4V27B) 2022-03-20 22:46:22 +08:00
1c0d2e1e51 v3.8.2 组件fileUpload支持多文件同时选择上传 2022-03-20 22:07:17 +08:00
582fead405 v3.8.2 组件ImageUpload支持多图同时选择上传 2022-03-20 22:04:51 +08:00
20bf581acf v3.8.2 优化个人中心页面email字段的表单验证多余的单引号 2022-03-20 22:02:05 +08:00
2c38430124 v3.8.2 修复分页组件请求两次问题 2022-03-20 22:01:15 +08:00
fb1648ecba v3.8.2 修改登录超时刷新页面跳转登录页面还提示重新登录问题 2022-03-20 21:59:02 +08:00
e923bc661d !102 少量 bug 快速 fix
Merge pull request !102 from 芋道源码/feature/1.6.1
2022-03-19 18:33:20 +00:00
315be160a8 同步最新 SQL,准备发布 1.6.1 版本 2022-03-20 02:32:18 +08:00
d1517cddb7 * 【升级】apollo-client from 1.7.0 to 1.9.2
* 【升级】guide from 4.1.0 to 5.1.0 :解决 Apollo 在 JDK 17 无法启动的问题
2022-03-20 02:31:27 +08:00
00269fd911 修复已办任务,审批结果展示不正确的问题 2022-03-20 01:21:09 +08:00
efe4200181 开发环境下,管理后台每个菜单展示对应的《开发文档》的说明 2022-03-19 19:29:35 +08:00
5266c6b1d5 去除表单构建页面的【运行】功能,暂不支持 2022-03-19 18:35:13 +08:00
db06292ea3 登录界面输入不存在的租户时,导致后续请求报错的问题 2022-03-19 18:24:51 +08:00
9209e8da1c 修复菜单、角色删除时,缓存未刷新的问题 2022-03-19 18:13:56 +08:00
3583109f90 优化文件配置,去掉 region 的配置,通过自动识别 2022-03-19 18:05:08 +08:00
e5f7b010e2 Merge branch 'master' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into feature/1.6.1 2022-03-19 18:04:52 +08:00
813069abf4 优化文件配置,去掉 region 的配置,通过自动识别 2022-03-19 18:02:20 +08:00
34a7399a65 使用 minio client 替代 amazon 客户端,进行 S3 的对接 2022-03-19 17:27:35 +08:00
62f7d34952 修复代码生成导入的异常 2022-03-19 16:11:25 +08:00
63398bf3d0 !99 修复-多租户-租户套餐未及时生效的bug
Merge pull request !99 from 清溪先生/master
2022-03-18 07:42:33 +00:00
a0c41623f2 修复多租户-租户套餐未及时生效的bug见https://gitee.com/zhijiantianya/ruoyi-vue-pro/issues/I4WARM#git-comment-divider 2022-03-18 10:20:36 +08:00
bf7c6db58c 优先 File 的前端页面 2022-03-17 20:58:50 +08:00
d2075d5c18 !98 文件存储的功能,支持将文件存储到 S3(MinIO、阿里云、腾讯云、七牛云)、本地、FTP、FTP、数据库等
Merge pull request !98 from 芋道源码/feature/1.6.1
2022-03-16 16:03:50 +00:00
d23232aab0 完成新 File 的功能 2022-03-17 00:02:57 +08:00
87670d18fd 完成新 File 的功能 2022-03-16 23:31:26 +08:00
cdcecd0d4a 完善 FileConfig 的单元测试 2022-03-16 20:47:17 +08:00
659023bb35 完成 FileConfig 的前端模块 2022-03-16 00:21:49 +08:00
18a5c46284 完成 FileConfig 的后端模块 2022-03-15 22:30:52 +08:00
05d4aae65d 完成 yudao-spring-boot-starter-file 组件,支持 S3 对接云存储、local、ftp、sftp、db 等协议 2022-03-14 23:07:37 +08:00
3d40fc81dd 完善 yudao-spring-boot-starter-file 组件,支持 S3 对接云存储、local、ftp、sftp 等协议 2022-03-14 22:09:41 +08:00
ed53ca3de9 封装 yudao-spring-boot-starter-file 组件,初步实现 S3 对接云存储的能力 2022-03-13 21:23:03 +08:00
e958657373 !97 修复仅本人数据权限时,个人中心会报错的问题
Merge pull request !97 from 芋道源码/feature/1.6.1
2022-03-12 10:03:21 +00:00
446f601c8a 修复仅本人数据权限时,个人中心会报错的问题 2022-03-12 18:02:28 +08:00
dae1f79e5e 修改 serviceTest.vm 单元测试的模板,增加 @Disabled 方便快速通过 2022-03-12 16:00:06 +08:00
5c0e695f34 修复代码生成时,tenant_id 默认需要传递的问题 2022-03-12 15:02:53 +08:00
c11a14b9da 代码生成时,如果是管理后台,必须设置菜单 2022-03-12 01:31:26 +08:00
6f8baa3110 代码生成时,如果是管理后台,必须设置菜单 2022-03-12 01:29:50 +08:00
d7308aa9eb !96 代码生成时,额外生成 MyBatis Mapper XML 文件
Merge pull request !96 from 芋道源码/feature/1.6.1
2022-03-11 15:31:17 +00:00
b62722598a 新增 MyBatis XML 文件的生成 2022-03-11 23:21:00 +08:00
ce12cbf7d1 !94 将 tool 模块合并到 infra 模块
Merge pull request !94 from 芋道源码/feature/1.6.1
2022-03-10 16:42:42 +00:00
5a2169b688 将 tool 合并到 infra 模块 2022-03-11 00:39:34 +08:00
61a00b8437 !93 增加 ProjectReactor 脚本,实现一键修改包名
Merge pull request !93 from 芋道源码/feature/1.6.1
2022-03-10 14:20:32 +00:00
716bbb9813 Merge branch 'master' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into feature/1.6.1 2022-03-10 21:19:50 +08:00
c9780d5952 !92 fix #I4W8TA
Merge pull request !92 from 感觉/N/A
2022-03-10 05:52:00 +00:00
3e96bb498b fix #I4W8TA 2022-03-10 05:48:37 +00:00
15ba083de2 删除更新日志,统一合并到 https://doc.iocoder.cn 开发手册 2022-03-10 13:06:26 +08:00
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
2980c6e3eb 修复正常租户登陆后退出切换到过期租户时造成的tenant.ignore-urls配置失效的问题,比如无法获取验证码图片等造成无法登录。 2022-03-09 14:55:54 +08:00
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
d6333fc353 增加 ProjectReactor 程序,实现一键改包名 2022-03-09 00:27:26 +08:00
d1b6534886 !90 fix #I4WXMQ 请求地址url错误
Merge pull request !90 from xingyu/master
2022-03-08 15:37:54 +00:00
972b386d93 URL错误 2022-03-08 22:01:48 +08:00
fc4b677b00 增加一些多租户相关的注释,更加清晰一些~ 2022-03-08 10:09:27 +08:00
5c03b97775 增加一些多租户相关的注释,更加清晰一些~ 2022-03-08 00:23:53 +08:00
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
120cbc9123 修改版本号为 1.6.0,准备 Flowable 工作流发版! 2022-03-06 15:04:53 +08:00
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
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
cd919daf64 调整 yudao-module-system 的枚举包 2022-03-04 00:19:19 +08:00
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
3201288036 review flowable 的代码实现,测试通过 2022-02-28 00:58:11 +08:00
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
bf37095259 v.1.5.1 发布,优化多租户功能,支持自动创建用户、角色等信息 2022-02-27 16:31:56 +08:00
5d90760c39 v.1.5.1 发布,优化多租户功能,支持自动创建用户、角色等信息 2022-02-27 16:28:43 +08:00
882660a3a7 Merge branch 'master' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into feature/flowable 2022-02-27 13:47:34 +08:00
e90fc607f0 v.1.5.1 发布,优化多租户功能,支持自动创建用户、角色等信息 2022-02-27 13:45:21 +08:00
ec8b356ba6 v.1.5.1 发布,优化多租户功能,支持自动创建用户、角色等信息 2022-02-27 13:40:10 +08:00
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
f63d4e20b9 同步最新版本的 SQL 脚本 2022-02-27 02:43:25 +08:00
2505d61b08 Swagger 增加 tenant-id 头 2022-02-27 02:40:24 +08:00
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
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
c58eb12896 修复所有单元测试 2022-02-27 01:38:28 +08:00
81d89ba350 增加租户、租户套餐的单元测试 2022-02-27 00:15:13 +08:00
0cbf35f7f0 Revert "core-js: ^3.21.1"
This reverts commit 4a86bd23d8.
2022-02-26 17:40:15 +08:00
4a86bd23d8 core-js: ^3.21.1 2022-02-26 17:10:17 +08:00
41cdc951e1 [Github Action]修复项目CI脚本构建失败问题
1.更改构建包管理工具为yarn
2.由于缓存的需要添加yarn.lock文件
3.删除没有用到的依赖javax.xml.bind.Element

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

Closes https://gitee.com/zhijiantianya/ruoyi-vue-pro/issues/I4U1XU
2022-02-17 14:38:59 +08:00
cfd8cd57cf v3.8.0 新增认证对象简化权限验证 2022-02-17 14:33:52 +08:00
fad3a030e9 v3.8.0 修复五级以上菜单404问题 2022-02-17 14:31:09 +08:00
02a0ab6d6d v3.8.0 新增通用方法简化下载使用 2022-02-17 14:28:43 +08:00
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
b72aa7b268 v3.8.0 新增通用方法简化模态/缓存使用 2022-02-17 13:16:26 +08:00
38ac5270d6 v3.8.0 新增通用方法简化模态/缓存使用 2022-02-17 13:11:21 +08:00
433056d5ea v3.8.0 Cron表达式生成器关闭时销毁,避免再次打开时存在上一次修改的数据 2022-02-17 11:44:22 +08:00
250c56f90c v3.8.0 禁用DictTag中el-tag渐变动画 2022-02-17 11:41:04 +08:00
c0380aaf6a v3.7.0 复多图组件验证失败被删除问题 2022-02-17 11:35:52 +08:00
eda8418797 v3.7.0 优化提示 2022-02-17 11:34:58 +08:00
69dba93ae5 v3.7.0 页签新增关闭左侧 2022-02-17 11:32:32 +08:00
3d09088029 v3.7.0 页签右键按钮添加图标 2022-02-17 11:31:25 +08:00
1b2dc570de v3.7.0 菜单&部门新增展开/折叠功能 2022-02-17 11:30:31 +08:00
f564137f05 v3.7.0 新增暗色菜单风格主题 2022-02-17 09:48:39 +08:00
63900da8c2 v3.7.0 修复保存配置主题颜色失效问题 2022-02-17 09:39:37 +08:00
170c0dbcfc v3.7.0 自定义弹层溢出滚动样式 2022-02-17 09:37:37 +08:00
9626b5e971 v3.7.0 定时任务支持在线生成cron表达式 2022-02-17 09:34:55 +08:00
e1e749d8a4 v3.7.0 验证码默认20s超时(请求) 2022-02-17 09:23:08 +08:00
5856c93035 v3.7.0 修复带utc日期格式 yyyy-MM-dd'T'HH:mm:ss.SSS 在safari浏览器中无法正确格式化的问题 2022-02-17 09:21:32 +08:00
f749b9db06 v3.7.0 自定义可拖动弹窗高度指令 2022-02-17 09:20:22 +08:00
5e959d310a v3.7.0 自定义可拖动弹窗宽度指令 2022-02-17 09:19:13 +08:00
c414e0eb62 v3.7.0 删掉此处代码,使右边栏动画生效。现在是没有动画的 2022-02-17 01:39:14 +08:00
2ce2287146 v3.7.0 更新到【默认首页使用keep-alive缓存】后报错 2022-02-17 01:36:32 +08:00
9edf88b37a v3.7.0 默认首页使用keep-alive缓存 2022-02-17 01:34:38 +08:00
7e31efcfe2 v3.7.0 防止错误token导致的解析异常 2022-02-17 01:30:08 +08:00
ab420e4120 v3.7.0 跳转路由高亮相对应的菜单栏 2022-02-17 01:28:52 +08:00
7b7f285034 v3.7.0 升级element-ui到最新版本2.15.3 2022-02-17 01:13:48 +08:00
46056a16b4 v3.7.0 密码框新增显示切换密码图标 2022-02-17 00:58:31 +08:00
f34f28f576 v3.7.0 导入用户样式调整 2022-02-17 00:56:50 +08:00
f1f602c131 v3.7.0 顶部菜单样式调整 2022-02-17 00:53:44 +08:00
f736e0a1c4 v3.7.0 更多操作按钮添加权限控制 2022-02-17 00:53:03 +08:00
969f9d0327 v3.7.0 富文本新增上传文件大小限制 2022-02-17 00:50:22 +08:00
2579e8549e v3.7.0 顶部菜单排除隐藏的默认路由 2022-02-17 00:49:46 +08:00
ba74c587b7 v3.7.0 code=401时request方法没有返回Promise.reject 修复 2022-02-17 00:48:24 +08:00
fc3aa2047c v3.7.0 定时任务新增更多操作 2022-02-17 00:46:18 +08:00
ec378d75de v3.7.0 参数管理支持配置验证码开关 2022-02-17 00:20:08 +08:00
e03a1a8bb3 v3.7.0 图片上传 - 多图时无法删除相应图片修复 2022-02-16 22:10:15 +08:00
78fe38d687 v3.6.0 完成~ 2022-02-16 22:05:13 +08:00
a6b70491e3 v3.6.0 富文本默认上传返回url类型 2022-02-16 22:02:21 +08:00
8b31b65ac1 v3.6.0 自定义弹窗拖拽指令 2022-02-16 22:01:37 +08:00
bc400cf646 v3.6.0 ImageUpload组件支持多图片上传 2022-02-16 21:41:08 +08:00
4f5964f287 v3.6.0 文件上传组件添加数量限制属性 2022-02-16 21:38:04 +08:00
3cb7aba37e v3.6.0 富文本编辑组件添加类型属性 2022-02-16 21:35:07 +08:00
c844c7ef19 v3.6.0 FileUpload组件支持多文件上传 2022-02-16 21:34:17 +08:00
b267b2c347 v3.6.0 增加字典标签样式回显 2022-02-16 19:42:21 +08:00
08a35704e9 v3.6.0 增加字典标签样式回显 2022-02-16 13:27:17 +08:00
986d1328e0 v3.6.0 增加字典标签样式回显 2022-02-16 01:31:14 +08:00
4a8129bffa v3.6.0 封装iframe组件 2022-02-15 22:24:48 +08:00
833ac54a2f v3.6.0 分页组件新增pagerCount属性 2022-02-15 22:11:58 +08:00
7bf9a85263 v3.5.0 系统布局配置支持动态标题开关 2022-02-15 22:08:40 +08:00
7df42db2e2 v3.5.0 富文本工具栏配置视频 2022-02-15 21:53:12 +08:00
e3c31c353a v3.5.0 修复关闭confirm提示框控制台报错问题 2022-02-15 21:51:24 +08:00
c06a96b768 v3.5.0 新增IE浏览器版本过低提示页面 2022-02-15 21:32:14 +08:00
e7d0024eb0 v3.5.0 导出按钮点击之后添加遮罩 2022-02-15 21:28:11 +08:00
d44d4da428 v3.5.0 update ruoyi-ui/src/assets/styles/element-ui.scss. 2022-02-15 20:58:26 +08:00
471175b406 v3.5.0 修复开启TopNav后,左侧打开外链问题 2022-02-15 20:50:28 +08:00
62cc1206f7 v3.5.0 主题颜色保存配置 2022-02-15 20:47:15 +08:00
a7a98d153c v3.5.0 过滤BindingResult对象,防止异常 2022-02-15 20:43:53 +08:00
41c6aa9147 v3.5.0 兼容顶部栏一级菜单内部跳转 2022-02-15 20:42:41 +08:00
63b7ee096a v3.5.0 固定顶部导航栏&窗口大小改变实时更新栏数 2022-02-15 20:40:59 +08:00
cff4391f2d v3.5.0 布局设置支持保存&重置配置 2022-02-15 20:39:21 +08:00
a7feb9279f v3.5.0 富文本编辑器支持自定义上传地址 2022-02-15 20:32:31 +08:00
4bf5b04d54 v3.5.0 新增菜单导航显示风格TopNav(false为左侧导航菜单,true为顶部导航菜单) 2022-02-15 20:27:53 +08:00
c5fad966d2 v3.5.0 页签新增关闭右侧 2022-02-15 20:11:10 +08:00
1cc2e09185 v3.5.0 富文本编辑器自定义上传地址 2022-02-15 20:08:20 +08:00
1467ab6530 v3.5.0 修改主题后mini类型按钮无效问题 2022-02-15 20:06:50 +08:00
3ac2b9973c v3.5.0 fix:RepeatedlyRequestWrapper.ServletInputStream 实现available方法 2022-02-15 20:03:34 +08:00
053007ef9e v3.5.0 显隐列初始默认隐藏列 2022-02-15 20:00:34 +08:00
33d8dbef45 v3.5.0 update ruoyi-ui/src/views/system/user/profile/userAvatar.vue. 修改头像,截图支持取消 2022-02-15 19:59:01 +08:00
30f160446e v3.5.0 删除多余的代码 2022-02-15 19:53:44 +08:00
4f770b24a4 v3.5.0 富文本编辑组件支持只读 2022-02-15 19:50:07 +08:00
bc41aa70d1 v3.4.0 修复四级菜单无法显示问题 2022-02-15 19:44:15 +08:00
f540c8a37c v3.4.0 用户显隐列添加不同key防止被复用 2022-02-15 19:31:33 +08:00
20e34e35a3 v3.4.0 表格右侧工具栏组件支持显隐列 2022-02-15 19:28:04 +08:00
cfcc2c6762 v3.4.0 修复IE11浏览器报错问题 2022-02-15 19:08:39 +08:00
fe0886d122 v3.4.0 Update copyright 2022-02-15 19:01:26 +08:00
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
878a0ef638 ## 修复 根据角色查询用户id的bug 2022-02-15 08:49:01 +00:00
c0bebb7755 Merge branch 'master' of https://github.com/YunaiV/ruoyi-vue-pro 2022-02-15 12:50:31 +08:00
32ccb8bd84 优化 README 说明 2022-02-15 12:50:05 +08:00
4c169cbc58 【新增】兼容 Node 16 版本,通过升级 BPMN-JS 相关库 2022-02-12 17:55:28 +08:00
0d1a8c627b Merge remote-tracking branch 'origin/master' 2022-02-12 00:28:27 +08:00
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
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
5e43efc555 fix:修复 Maven 构建一些提示 2022-02-10 11:16:17 +08:00
67df00264a 修复部门更新后本地缓存不更新问题
https://gitee.com/zhijiantianya/ruoyi-vue-pro/issues/I4T22A
2022-02-10 09:48:07 +08:00
424ddb23e4 * 【修复】自定义 DefaultStreamMessageListenerContainerX 实现,解决 Redisson Stream 读取不到数据返回 null 导致 NPE 问题 2022-02-10 08:20:55 +08:00
2cef84bdc8 * 【修复】自定义 DefaultStreamMessageListenerContainerX 实现,解决 Redisson Stream 读取不到数据返回 null 导致 NPE 问题 2022-02-10 08:20:06 +08:00
152453106a 完善更新日志 2022-02-10 00:08:26 +08:00
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
855bb214be 使用 lombok 优化工具类
1。添加 @UtilityClass, 作用私有空参构造函数
2。使用 @SneakyThrows 替代手动转换为 RuntimeException
2022-02-09 09:36:15 +08:00
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
37ec560687 流程发起异常,忽略id 2022-02-09 08:53:11 +08:00
f966fae060 【修复】Knife4j 接口文档 404 的问题,原因是 spring.mvc.static-path-pattern 配置项,影响了基础路径 2022-02-09 00:25:27 +08:00
fd4adf2cea 使用 lombok 优化工具类
1。添加 @UtilityClass, 作用私有空参构造函数
2。使用 @SneakyThrows 替代手动转换为 RuntimeException
2022-02-08 19:25:34 +08:00
2bc45ad467 fix: 修复 avatar 配置 2022-02-08 01:03:15 +08:00
c671c23e87 [build]github Action CI
添加Action CI
2022-02-07 19:57:59 +08:00
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
0bac283864 解决 Spring 定时任务下,无租户编号的问题,导致查询报错 2022-02-06 20:10:22 +08:00
251bd08508 修复 infra_config 表名错误 2022-02-06 17:32:45 +08:00
2dd4450302 修复用户 APP 发送短信验证码报错 2022-02-06 17:31:22 +08:00
448aa21e33 1. 修复用户 APP 发送短信验证码报错 2022-02-05 21:20:54 +08:00
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
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
cb3b172ecc * 【新增】每次发布大版本时,将 yudao-ui-admin 编译后,放到 yudao-server 项目中,可以快速体验,无需搭建前端开发环境 2022-02-04 22:56:00 +08:00
470d1a3a35 * 【升级】Spring Boot Admin from 2.3.2 to 2.6.2,提供更好的监控能力 2022-02-04 18:26:02 +08:00
9f65c46c82 【修复】管理后台 UI 超时登录后,返回登陆界面时,由于未登陆加载不到信息,导致报错的问题 2022-02-04 18:13:31 +08:00
ae9186f4b4 多模块重构 14:MEMBER 用户,过滤掉操作日志的记录~ 2022-02-04 17:51:15 +08:00
6441883855 【升级】spring-boot from 2.4.12 to 2.5.9,最新的 Spring Boot 2.6.X 在等更流行一些,稳定第一 2022-02-04 14:26:05 +08:00
1e2bcf9aca 多模块重构 13:修复各种单元测试的报错 2022-02-04 13:35:26 +08:00
61672e0180 多模块重构 13:迁移集成测试~ 2022-02-04 12:28:48 +08:00
eb2ab3cc4d 清理多余文件与配置 2022-02-04 01:56:41 +08:00
c2ccfa3bd6 多模块重构 12:【新增】Spring Security 新增 AuthorizeRequestsCustomizer 抽象类, 自定义每个 Maven Module 的 URL 的安全配置 2022-02-04 01:36:27 +08:00
4890cf05de 修复 swagger 接口文档不展示的问题 2022-02-04 00:07:35 +08:00
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
b85b33c373 公用层描述修改。 2022-02-03 10:36:24 +08:00
db9bae05b0 多模块重构 11:代码生成器,优化展示 2022-02-03 10:18:07 +08:00
8e3d7663bb 多模块重构 11:代码生成器,支持多租户 2022-02-03 00:44:07 +08:00
24e083b3ae 多模块重构 11:新增 H2 SQL 脚本的生成 2022-02-02 23:38:18 +08:00
0773a4c4d7 多模块重构 12:修改项目名字,按照新的规则 2022-02-02 22:33:39 +08:00
352a67c530 多模块重构 11:修改代码生成器的实现 2022-02-02 22:10:24 +08:00
b0c25ea9f4 多模块重构 11:修改代码生成器的实现 2022-02-02 13:57:25 +08:00
8d59384904 多模块重构 10:去除 Freemarker 依赖,修改字典的前缀,从 sys=》system、inf=》infra 见名知意 2022-02-02 01:27:04 +08:00
2b630ef3f2 多模块重构 9:调整的请求 URL 2022-02-01 22:59:43 +08:00
bdcf00d8a0 多模块重构 8:bom 模块,基本完成重构 2022-02-01 21:58:36 +08:00
f39bfdab89 多模块重构 8:bom 模块,尝试公用部分逻辑 2022-02-01 20:33:03 +08:00
fe1271a6f7 多模块重构 8:bom 模块,尝试公用部分逻辑 2022-01-31 23:29:25 +08:00
510917c5ed 多模块重构 8:bom 模块的调整 2022-01-31 22:55:48 +08:00
d45213fe2a 多模块重构 7:pay 模块的重构完成 2022-01-31 22:14:35 +08:00
b757e1fccb 多模块重构 7:pay 模块的初始化 2022-01-31 21:51:23 +08:00
e7e3b18704 多模块重构 6:tool 模块的迁移完成 2022-01-31 19:26:39 +08:00
fffd023d31 多模块重构 5:infra 模块的迁移完成 2022-01-31 18:05:19 +08:00
9bc9b2ac6b 多模块重构 5:infra 模块的修改~~~ 2022-01-31 17:57:45 +08:00
dc11dfc215 多模块重构 5:infra 模块的初始化 2022-01-31 13:51:40 +08:00
4bc8dc65b4 多模块重构 4:infra 模块的初始化 2022-01-31 10:27:35 +08:00
638b8b1dd4 多模块重构 4:system 模块的调整,完成 social 的复用 2022-01-31 10:07:27 +08:00
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
fd53bf3296 多模块重构 4:system 模块的调整,解决单元测试报错的问题 2022-01-31 00:33:55 +08:00
16c2590483 多模块重构 4:system 模块的调整,实现 sms API~~ 2022-01-30 22:27:54 +08:00
add08b1ecd 多模块重构 4:system 模块的调整,实现 social API~~ 2022-01-30 21:23:45 +08:00
ab6ec2f0ed 多模块重构 4:system 模块的创建,去除 Sys 2022-01-30 00:49:31 +08:00
933bb7c6a6 修改合并后的编译报错 2022-01-29 23:15:57 +08:00
c5e2df943c Bpm 动态表单。移到bpm-core-service 模块 2022-01-29 22:42:09 +08:00
117914d92b 多模块重构 4:system 模块的创建,去除 Sys 2022-01-29 21:29:54 +08:00
06887bff16 多模块重构 4:system 模块的创建,以及将相关的代码先进行迁移 2022-01-29 16:05:32 +08:00
cee7e50720 1.【修复】定时任务刷新本地缓存时,无租户上线文,导致查询报错
2. member 模块,统一使用 member 前缀
3. 修改 Spring Security logout 配置,支持多用户类型的退出
2022-01-29 14:05:06 +08:00
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
36d01371bb 增加 bpm 模块的修改建议 2022-01-29 10:01:35 +08:00
e9efff7076 多模块重构 3:security 实现多用户的认证支持 2022-01-29 00:44:03 +08:00
928b7dbe23 多模块重构 2:在 yudao-admin-server 中,引入 yudao-module-member 模块 2022-01-28 20:21:01 +08:00
afa0d623db 增加 bpm-core-service 多模块 2022-01-27 22:08:34 +08:00
1c266988c5 遗漏了测试类 2022-01-27 15:14:00 +08:00
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
4ba064d8b3 抽取 activiti 到module-bpm-activiti, 为接入flowable 准备 2022-01-26 15:57:38 +08:00
cb2ba6da2f fix 冲突 2022-01-24 14:16:17 +08:00
9d6a046939 修复 Redis 监控,消耗 CPU 秒数超过 Integer 范围 2022-01-24 07:55:06 +08:00
7d0b381dff 优化 README 说明,准备发布新版本 2022-01-23 14:14:49 +08:00
a25dd9370c 优化 README 说明,准备发布新版本 2022-01-23 14:09:48 +08:00
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
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
eeb665739a 优化 Activiti 的依赖管理 2022-01-23 13:02:31 +08:00
ec876d54a4 修复 activiti 事务的一致性 2022-01-23 12:52:33 +08:00
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
c6a6ad4965 修复支付的单元测试 2022-01-23 04:29:53 +08:00
2a6566d8d6 合并 master 最新代码 2022-01-23 04:27:57 +08:00
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
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
2678ff0a8b 修改 bpmn 前端组件,注释掉 UserTask 的表单、候选人的选型,替换成自己的【流程表单】【任务分配规则】! 2022-01-23 03:35:50 +08:00
6edfd5ac76 更新最新日志 2022-01-23 03:19:41 +08:00
e487e31961 同步最新的 SQL 2022-01-23 01:43:35 +08:00
6f0c2943c7 完善 bpm 的权限~ 2022-01-23 00:43:17 +08:00
e6142b5308 实现 OA 请假的取消申请 2022-01-23 00:10:06 +08:00
5437775172 增加 BpmProcessInstanceResultEvent 实现,实现自定义的流程实例的状态的监听 2022-01-22 23:56:15 +08:00
7c62b1a211 修改 bpm 流程不通过的 Listener 的逻辑 2022-01-22 22:44:42 +08:00
54e7c10a06 完成 bpm oa 请假的 create 和 detail 前端 2022-01-22 21:49:50 +08:00
991ce2105b 优化 bpm 高亮流程图的排它节点~~~ 2022-01-22 21:10:53 +08:00
e12c17360a bpm 的实例详情界面,接入 businessKey 2022-01-22 20:54:23 +08:00
cc9a2199b1 bpm 的 OA 请假的列表的接入 2022-01-22 19:20:00 +08:00
ec978c4441 bpm 的 OA 请假的示例后端优化~ 2022-01-22 18:27:07 +08:00
531629634b Merge branch 'master' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into feature/activiti 2022-01-22 02:15:19 +08:00
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
c2db893fb8 bpm 增加流程被通过、不通过时,发送短信通知 2022-01-22 00:35:33 +08:00
e3b86b3d7a bpm 增加任务分配到指定人时,发送短信通知 2022-01-21 22:53:43 +08:00
43ae3c8124 feat 新建LambdaQueryWrapperX,改成使用lambda的方式选择字段 2022-01-21 14:32:52 +08:00
d839adedff 基本算完成第一个版本的流程图高亮,基于前端实现 2022-01-21 01:18:04 +08:00
34a0f0ea9d 增加 bpmn 流程图的高亮 2022-01-21 01:12:44 +08:00
21376c80a8 解决 bpm 用户任务的 outgoing 为空的情况~ 2022-01-20 23:52:52 +08:00
72c465be86 优化 bpm 高亮流程图的前端 2022-01-20 13:13:16 +08:00
5332e543d2 优化 bpm 高亮流程图的前端 2022-01-20 01:14:10 +08:00
348762ae6a 1. 修复 ProcessViewer 找不到 taskList 报错,= = 变量名改了。
2. 增加事件监听器,悬浮可以展示部分信息
2022-01-19 13:39:12 +08:00
1425f7dfcc 优化 ProcessViewer.vue 展示流程图的效果,增加红色、绿色、灰色、橙色 2022-01-19 12:45:12 +08:00
8e18a63d34 修改流程图的高亮实现,采用 activity 替代 task 作为数据源 2022-01-19 08:54:54 +08:00
676e4f29d9 重新实现后端的 bpm 流程图的高亮接口 2022-01-19 01:00:59 +08:00
adc6076deb 重命名历史任务的接口 2022-01-18 23:48:44 +08:00
2de81e438a 流程详情页 100% - 完成流程图的高亮功能 2022-01-18 08:15:43 +08:00
5a4392dc4e 临时提交,尝试实现流程图的高亮 2022-01-18 01:41:22 +08:00
0765f481ff 流程详情页 95% - 接入任务的转派 2022-01-17 23:53:19 +08:00
c9b9eced07 流程详情页 90% - 接入审批通过、审批不通过的功能 2022-01-17 12:53:43 +08:00
cf7a434f0c 流程详情页 80% - 接入审批通过、审批不通过的功能 2022-01-17 00:59:05 +08:00
519a4a16fc 流程详情页 70% - 审批表单 2022-01-17 00:04:20 +08:00
5022ed2533 流程详情页 60% - 审批记录 2022-01-16 23:36:47 +08:00
f0963c3941 流程详情页 30% - 表单信息的展示 2022-01-16 22:16:49 +08:00
f049bd7530 流程发起界面,支持业务表单 2022-01-16 17:55:29 +08:00
93e02b36dd 新增 bpm 基于流程实例的详情 API 接口 2022-01-16 17:31:44 +08:00
23eda6b1a9 新增 bpm 基于流程实例查询任务列表 2022-01-16 13:47:23 +08:00
a4d31f9c45 新增 bpm 基于流程实例查询任务列表 2022-01-16 13:27:09 +08:00
f9b6eef4d2 优化的 bpm 任务的 todo、done 的 vo 2022-01-16 11:42:25 +08:00
0b4a4793d9 禁用 bpm 检测 /processes 目录,部署 BPMN 流程 2022-01-16 02:59:52 +08:00
94c115a142 优化 activiti 的配置,简单 Mapper XML 的配置,且减少 Mapper 的 SQL 日志的输出~ 2022-01-16 02:55:25 +08:00
db3c713122 1. 修改流程的表单定义,支持业务表单。
2. 流程提交时,记录表单值
2022-01-16 02:26:37 +08:00
aac6cc7bf8 1. 完善 bpm task rule 的注解和校验 2022-01-16 00:51:08 +08:00
3acb56f880 1. 流程定义列表,增加任务分配规则的展示
2. 流程定义列表,按照 version 倒序
2022-01-16 00:36:04 +08:00
a3d8e8726a 【修复】codegen 生成代码时,delete 接口补充 dataTypeClass 属性,避免 Swagger 打印 WARN 日志 2022-01-16 00:08:43 +08:00
9b26c3e98a 1. 实现空的 bpm UserGroupManager
2. 去除任务分配时,candidateUsers 协调者
2022-01-15 23:55:00 +08:00
bacf741f77 临时备份一些想法;主要和任务分配的策略相关 2022-01-15 23:37:42 +08:00
9922e2fcf2 1. 调整 activiti 配置,使用 SQL 初始化 activi 表;
2. 实现内置的几个 Bpm 自定义分配 Script
2022-01-15 21:34:29 +08:00
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
e01b33bc78 同步最新的表结构 2022-01-15 13:07:19 +08:00
1781e76e19 BPM 模型重构 7:任务分配规则的后端的单元测试 2022-01-15 11:51:09 +08:00
902f2ecbad BPM 模型重构 7:任务分配规则的后端,全部实现完成 2022-01-15 01:39:30 +08:00
f46090243f BPM 模型重构 7:任务分配规则的前端,增加指定用户、自定义脚本等 2022-01-15 00:31:56 +08:00
842cb6bd6b BPM 模型重构 7:将任务分配规则,分装成前端组件 2022-01-14 22:26:03 +08:00
5efb4c26cd 【新增】工作组,用于支持指定工作组进行任务的审批 2022-01-14 14:01:46 +08:00
33ab2e9633 【修改】修改部门负责人,从 String 字符串,调整成和后台用户的用户编号绑定 2022-01-14 01:04:44 +08:00
2809254a07 BPM 模型重构 7:增加任务分配规则的列表 UI 界面(增加部门的规则配置) 2022-01-14 00:21:34 +08:00
fe651b42ec BPM 模型重构 8:修改部 model 部署逻辑,支付任务规则的复制 2022-01-13 23:28:14 +08:00
8e9cb110c7 BPM 模型重构 7:增加任务分配规则的列表 UI 界面(增加角色的规则配置) 2022-01-13 21:23:00 +08:00
9f0cd04fa6 BPM 模型重构 7:增加任务分配规则的列表 UI 界面(增加角色的规则配置) 2022-01-13 13:21:54 +08:00
3f6a5f06fa BPM 模型重构 7:增加任务分配规则的列表 UI 界面 2022-01-13 10:16:28 +08:00
64a1d1f0f6 BPM 模型重构 7:增加任务分配规则的列表 UI 界面 2022-01-13 00:56:57 +08:00
4e7f5489a5 BPM 模型重构 6:增加任务分配规则的列表 API 接口 2022-01-12 21:16:57 +08:00
95ce628cce BPM 模型重构 5:将 form 和 model 模块,合并到 definition 模块下 2022-01-12 01:05:54 +08:00
7d620d1679 BPM 模型重构 4:修改模型,修改成单独的弹窗 2022-01-12 00:38:57 +08:00
8c7db2af70 BPM 模型重构 4:修改模型,修改成单独的弹窗 2022-01-12 00:33:50 +08:00
24c03cf176 BPM 模型重构 3:设置流程时,去掉 formId、description 等的传递,专注设计本身 2022-01-11 22:15:48 +08:00
d2a8f3f253 BPM 模型重构 2:导入流程时,只填写 name、description、key 2022-01-11 21:20:13 +08:00
62b720a5d0 BPM 模型重构 2:导入流程时,只填写 name、description、key 2022-01-11 21:06:54 +08:00
c4950e1b13 BPM 模型重构 1:新建流程时,只填写 name、description、key 2022-01-11 20:17:01 +08:00
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
8999b7db3b 新增流程任务的规则 BpmTaskRuleDO 表的设计 2022-01-11 01:10:52 +08:00
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
9734eacf01 完成 bpm 已办任务列表 2022-01-09 22:47:18 +08:00
4d37e9f8f0 完成 bpm 已办任务列表 2022-01-09 22:31:40 +08:00
abe161669c 修复 BPM Task 的 category 设置问题 2022-01-09 21:23:59 +08:00
9860a7d552 1. 基于 BpmTaskEventListener 实现 Task 拓展表的同步
2. 基于 BpmProcessInstanceEventListener 实现 ProcessInstance 拓展表的同步
2022-01-09 18:40:13 +08:00
a5b8b9b67e 1. 修复已办任务的 API 接口的 NPE
2. 实现已办任务的 UI 界面
2022-01-09 09:46:34 +08:00
fc6a768058 调整流程任务的审批结果,拆成 approve 和 reject 接口 2022-01-09 09:08:14 +08:00
e931414b55 实现流程任务的审批功能的 API 接口 2022-01-09 00:53:39 +08:00
8a10568b24 1. 修改 Parser.vue 组件,实现 submit 传递 conf 和 values 参数
2. 完成流程创建的前端 UI 界面
2022-01-09 00:17:52 +08:00
749cb5d762 1. 新增流程定义的列表 API
2. 新增流程创建的界面,暂未实现完全
2022-01-08 23:11:09 +08:00
2630ad8eaa 完成流程实例的取消 2022-01-08 22:11:39 +08:00
2017b03169 实现 bpm 已办任务的后端接口 2022-01-08 20:49:11 +08:00
77f06e79c4 实现 bpm 待办任务的前端界面 2022-01-08 16:59:51 +08:00
b083795ad6 实现 bpm 待办任务的后端接口 2022-01-08 16:19:41 +08:00
1ab15dd1f9 bpm 我的流程,增加 task 的展示 2022-01-08 09:56:56 +08:00
14a7d637b3 修改 bpmn 的 ElementBaseInfo.vue ,解决基础元素的表单问题 2022-01-08 08:28:18 +08:00
5415a85cc0 引入新版本的 bpmn-js 2022-01-08 08:02:16 +08:00
bb11acb15f 实现我的流程的前端 UI 界面 2022-01-08 01:14:54 +08:00
55a6ec78e4 实现我的流程的后端 API 接口 2022-01-07 23:34:12 +08:00
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
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
19b574fd4b code review 退款逻辑 2022-01-04 23:47:31 +08:00
e43039b0c6 待办列表 2022-01-04 09:46:39 +08:00
2607f13abe 1. 新增流程新建的接口 2022-01-04 08:27:22 +08:00
5bf3045544 优化退款逻辑 2022-01-03 22:32:39 +08:00
bcdc117e59 调整 definition =》processDefinition,主要考虑更加明确一些 2022-01-03 22:13:12 +08:00
5eef27da6e 将流程模型的权限接入 2022-01-03 19:03:54 +08:00
cfbef058b5 完成流程图上传的功能 2022-01-03 18:46:00 +08:00
ed33ff9f04 优化 bpmnProcessDesigner 在编辑流程图时,自动延迟赋值 key 和 name,保证一致性 2022-01-03 18:45:38 +08:00
db54147697 流程的挂起与激活 2022-01-03 12:26:04 +08:00
f8b34d5b6d 完成流程定义的列表的实现 2022-01-03 11:08:47 +08:00
509e11a7b0 流程定义在创建时,增加 key 和 name 的校验,进一步保证 Model、Deployment、ProcessDefinition 的匹配性 2022-01-03 09:49:53 +08:00
066f57e5c5 优化 bpmnProcessDesigner 的 id 赋值,必须满足 NCName 规则,避免绘制报错的问题 2022-01-03 09:38:57 +08:00
72c8b24604 修复 bpmnProcessDesigner 由于改造,导致 key 和 name 未同步到 bpmn xml 的问题 2022-01-03 08:55:06 +08:00
513c23efbb 优化流程定义的分页接口 2022-01-03 05:41:05 +08:00
7833aa5d0e 完善 model 列表 2022-01-03 04:31:48 +08:00
7bc36a09fb 增加流程图的预览界面 2022-01-03 02:41:24 +08:00
38221a3e2e bpmnProcessDesigner 修改 xml、json 预览,使用老版本的 highlight 2022-01-03 01:36:39 +08:00
490f907ada 完善 bpmnProcessDesigner 流程设计器的使用,基本可用了! 2022-01-03 01:12:36 +08:00
c4003396a5 1. 同步最新的 SQL
2. 同步最新的配置到 dev 文件
2022-01-02 19:31:36 +08:00
a031c1d564 去除 modelEditor.vue 冗余代码 2022-01-02 16:27:43 +08:00
9804e781f4 去除 jeeplus-bpmn 的工作流编辑器,原因:功能相对不完善。使用 bpmnProcessDesigner 替代 2022-01-02 16:06:40 +08:00
d1c95c4d8a 1. 清理旧版本的 form generator
2. 接入表单详情
2022-01-02 12:56:34 +08:00
f45224f224 1. 清理旧版本的 form generator
2. 接入表单详情
2022-01-02 12:36:37 +08:00
863ab6f33a 流程表单,接入新的 form generator 版本 2022-01-02 12:28:34 +08:00
d574a99dfc 使用最新的 form generator 编辑器 2022-01-02 11:22:13 +08:00
dffd175ccf 初始化 form 动态表单的详情,暂未接入数据 2022-01-02 09:59:47 +08:00
430f1369be 完善 BPM Model 的搜索功能 2022-01-02 08:49:35 +08:00
d8bbc71543 乱改下 bpmnProcessDesigner 的样式 2022-01-01 23:12:07 +08:00
167692b04d 引入 bpmnProcessDesigner 组件 2022-01-01 22:46:54 +08:00
c84a9dd67e 优化流程 Model 的部署代码 2022-01-01 22:03:17 +08:00
1294506a95 优化流程 Model 的更新逻辑 2022-01-01 19:31:16 +08:00
df91c3ceff 将 Model exportBpmnXml 去除,替换成 getModel 接口 2022-01-01 18:13:00 +08:00
e47d5afcfa 完善工作流 model 的接口 2022-01-01 17:16:01 +08:00
dc7a434380 增加流程定义的 VO 2022-01-01 08:54:37 +08:00
a0c7692c3c 调整流程定义模块的代码 2022-01-01 00:26:33 +08:00
ff7b9d9d26 增加 Bpm Field 的 vModel 重复的问题 2021-12-31 23:19:11 +08:00
930c5ec490 BPM Form 表单的完善 2021-12-31 22:12:08 +08:00
69a6aa251b Form 动态表单的清理,去除无用的代码 2021-12-31 09:17:59 +08:00
2d40e4bc14 Form 动态表单的清理,去除无用的代码 2021-12-31 08:55:38 +08:00
4c56a07c4e Form 动态表单,增加基础表单 2021-12-30 22:06:07 +08:00
d2420212a6 增加 Form 编辑框 2021-12-30 21:11:53 +08:00
00f968657c 重新初始化 BPM Form 模块 2021-12-30 20:46:06 +08:00
7ef86c14c0 WfForm =》BpmForm 2021-12-30 20:23:50 +08:00
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
9a5f085369 code review 支付问题 2021-12-30 09:32:04 +08:00
67aaf28832 code review 退款逻辑 2021-12-30 09:08:11 +08:00
d556eae556 优化 支付配置校验方式,优化业务层异常抛出类型,优化支付应用渲染逻辑,添加删除支付商户 支付应用的校验,退款订单去除reqNo字段,支付订单去除 channelExtras 参数展示 2021-12-29 19:49:29 +08:00
08103685f1 重构退款逻辑,去掉退款后处理 2021-12-28 17:10:25 +08:00
054c237b1f 支付 app、商户,删除时,需要校验关联数据 2021-12-27 11:40:07 +08:00
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
bcc2ff0f5b code review 退款逻辑 2021-12-25 20:40:49 +08:00
d49ce4c81f 同步最新 SQL 2021-12-25 19:32:59 +08:00
cea1589e79 code review 支付渠道的逻辑 2021-12-25 19:09:39 +08:00
f1424aa61e code review 支付应用的逻辑 2021-12-25 18:53:47 +08:00
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
ff21fdc5df 回滚 .gitignore 错误提交 2021-12-22 11:07:41 +08:00
d0290b88ad 紧急修复 支付退款订单 service 单元测试bug 2021-12-21 17:23:26 +08:00
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
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
be0b47ecb7 合并 master 最新的代码 2021-12-16 09:53:02 +08:00
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
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
a92acff99b 1. 升级 1.3.0-snapshot 版本
2.【修复】biz-data-permission 组件的缓存机制,导致部分 SQL 未进行数据过滤
2021-12-16 07:19:52 +08:00
abf61bfdea 修复引入多租户后,前端 <img /> 读取图片报错的问题 2021-12-15 13:08:15 +08:00
b99f364d92 修复前端获取租户方法缺失 2021-12-15 12:27:45 +08:00
98dfa48ced 1:优化商户管理页面BUG
2:优化应用关闭页面
3:完成支付订单CURD 以及单元测试
4:将 Element UI 从 2.15.0 升级至 2.15.6
2021-12-08 19:21:24 +08:00
3f412f26fc Merge branch 'master' into feature/user-register 2021-11-26 21:26:21 +08:00
f108d478a8 调整渠道支付通知地址为统一的地址 2021-11-24 23:54:16 +08:00
1c5544fc9d 优化渠道 config 校验和逻辑转换问题 2021-11-24 11:51:06 +08:00
dfde260ebb 支付宝退款申请通知 2021-11-22 16:22:46 +08:00
444ba79822 修改code review 2021-11-21 22:33:42 +08:00
f0fcf4798e code review 支付的逻辑 2021-11-21 21:11:07 +08:00
6069a387ea 优化完善支付应用和支付渠道代码逻辑,完善单元测试,基于validator完成手动校验config 2021-11-21 19:37:16 +08:00
b32ac09ddf code review 工作机的流程 2021-11-21 12:59:52 +08:00
b18cd457c8 code review 支付相关的代码实现 2021-11-21 12:24:08 +08:00
7d6f205dc0 支付退款申请,支付宝手机wap 相应实现 2021-11-21 11:12:32 +08:00
f958137dd1 完善工作流模型。工作流定义 2021-11-19 16:08:01 +08:00
bab046f10c 增加BPMN数据校验 2021-11-18 18:29:09 +08:00
a829e8d083 初步完善模型发布流程 2021-11-18 18:23:56 +08:00
3f90e79d8a fix: 增加流程图前端代码 2021-11-18 12:06:24 +08:00
00f59fdc75 fix: 完善 bpm 模型流程 2021-11-18 10:55:43 +08:00
480b17507f #完善流程model设计 2021-11-17 23:01:56 +08:00
cfdf04981a fix: 新增工作流模型 2021-11-17 18:48:40 +08:00
89f51fe568 修改code review 2021-11-16 22:43:30 +08:00
19f554176c tina提交支付宝扫码单元测试 2021-11-15 16:51:38 +08:00
9dc7d2d197 工作流的 code review 2021-11-15 06:25:25 +08:00
91c0c423c0 修改 code review 2021-11-12 20:37:27 +08:00
3368a995ca 支付模块的 code review 2021-11-10 09:40:09 +08:00
e969dbe8b7 工作流的 code review 2021-11-10 09:11:29 +08:00
e46a27b937 完成支付模块支付应用信息和微信类型的支付渠道配置。 2021-11-09 16:36:07 +08:00
848913bf2f fix: 代码 review 修改 2021-11-08 14:24:31 +08:00
0ff7f2ef74 fix: 代码 review 修改 2021-11-08 11:19:10 +08:00
fef0562523 修改code review 2021-11-07 22:21:55 +08:00
1bc4bdac0c 工作流的 code review 2021-11-07 20:25:31 +08:00
baab642d28 更改请假流程的更新日志 2021-11-07 17:39:40 +08:00
b784bf3e12 修改请假流程 2021-11-07 17:38:00 +08:00
d0a59f7ef1 #人事审批流程图获取 2021-11-06 10:59:48 +08:00
f0b7583404 包名从activiti 改成 bpm 2021-11-06 10:22:45 +08:00
30732428f1 !54 返回高亮任务流图片
Merge pull request !54 from 云扬四海/feature/activiti
2021-11-05 13:31:57 +00:00
e9e73c402b #返显高亮工作流 2021-11-05 20:54:26 +08:00
9bbeb93b2e fix:[工作流] 返回对应实例的流程图 2021-11-05 18:14:56 +08:00
3c3f46ee4e fix:[工作流] 返回对应实例的流程图 2021-11-05 17:13:55 +08:00
6265e4a736 支付的 code review 2021-11-05 08:10:07 +08:00
abf2f697fb 修改 wl =》bpm 2021-11-05 07:50:14 +08:00
6f8e8acae0 Merge branch 'master' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into feature/activiti 2021-11-05 07:47:19 +08:00
26798a8816 修改code review 2021-11-05 00:10:32 +08:00
87d8b55b41 Merge branch 'pay_extension' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into pay_extension 2021-11-04 14:32:42 +08:00
461c6a0007 tina提交支付宝扫码支付 2021-11-04 14:27:36 +08:00
38f1d6428f Merge remote-tracking branch 'origin/pay_extension' into pay_extension 2021-11-04 09:35:56 +08:00
6cadafb3f1 code review 支付宝 wap 的逻辑 2021-11-04 08:47:41 +08:00
a1105ffdc7 调整表 pay_order_extension,字段 channel_notify_data,长度 2021-11-04 00:46:27 +08:00
2c60a3aafa 支付宝手机网站支付 2021-11-04 00:46:24 +08:00
1a721ceb5f 完成支付模块的商户管理开发以及单元测试 2021-11-03 19:14:44 +08:00
aa77eb029f 增加支付宝 QR 支付的回调 2021-11-03 09:05:04 +08:00
696e94a1a3 解决 pay 参数校验报错的问题 2021-11-03 08:42:38 +08:00
396f3a6dff Revert "akarta.validation-api =》jakarta.el 依赖,保证 EL 不报错"
This reverts commit 1b336c7df6.
2021-11-03 08:38:45 +08:00
56864db484 修改 文件重命名问题 2021-11-02 20:47:26 +08:00
1b336c7df6 akarta.validation-api =》jakarta.el 依赖,保证 EL 不报错 2021-11-02 08:23:15 +08:00
c186d279ba code review 工作流的相关代码 2021-11-02 07:56:05 +08:00
cc56a66332 修改code review 2021-10-31 22:27:35 +08:00
1b835e058f 修改code review 2021-10-31 22:26:35 +08:00
0d2ae6be56 修改code review 2021-10-31 22:13:51 +08:00
f26c17cff0 修改code review 2021-10-31 22:11:55 +08:00
722eaf3513 调整下工作流的包名 2021-10-31 09:55:12 +08:00
3564 changed files with 187835 additions and 61580 deletions

View File

@ -0,0 +1,25 @@
碰到问题,请在 <https://gitee.com/zhijiantianya/ruoyi-vue-pro/issues> 搜索是否存在相似的 issue。
不按照模板提交的 issue会被系统自动删除。
### 基本信息
- ruoyi-vue-pro 版本:
- 操作系统:
- 数据库:
### 你猜测可能的原因
(必填)我花费了 2-4 小时自查发现可能的原因是xxxxxx
### 复现步骤
第一步,
第二步,
第三步,
### 报错信息
带上必要的截图

34
.github/ISSUE_TEMPLATE/question.md vendored Normal file
View File

@ -0,0 +1,34 @@
---
name: 问题反馈
about: 请详细描述,以便更高快的获得到解决
title: ''
labels: ''
assignees: ''
---
碰到问题,请在 <https://github.com/YunaiV/ruoyi-vue-pro/issues> 搜索是否存在相似的 issue。
不按照模板提交的 issue会被系统自动删除。
### 基本信息
- ruoyi-vue-pro 版本:
- 操作系统:
- 数据库:
### 你猜测可能的原因
(必填)我花费了 2-4 小时自查发现可能的原因是xxxxxx
### 复现步骤
第一步,
第二步,
第三步,
### 报错信息
带上必要的截图

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

4
Jenkinsfile vendored
View File

@ -21,7 +21,7 @@ pipeline {
// GitHub 账号名
GITHUB_ACCOUNT = 'https://gitee.com/zhijiantianya/ruoyi-vue-pro'
// 应用名称
APP_NAME = 'yudao-admin-server'
APP_NAME = 'yudao-server'
// 应用部署路径
APP_DEPLOY_BASE_DIR = '/media/pi/KINGTON/data/work/projects/'
}
@ -57,4 +57,4 @@ pipeline {
}
}
}
}
}

341
README.md
View File

@ -1,158 +1,233 @@
## 平台简介
**严肃声明:现在、未来都不会有商业版本,所有功能全部开源!**
**芋道**,一套**全部开源**的**企业级**的快速开发平台,毫无保留给个人及企业免费使用。
**拒绝虚假开源,售卖商业版,程序员不骗程序员!!**
**「我喜欢写代码,乐此不疲」**
**「我喜欢做开源,以此为乐」**
我 🐶 在上海艰苦奋斗,早中晚在 top3 大厂认真搬砖,夜里为开源做贡献。
如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。
## 🐯 平台简介
**芋道**,以开发者为中心,打造中国第一流的快速开发平台,全部开源,个人与企业可 100% 免费使用。
> 有任何问题,或者想要的功能,可以在 _Issues_ 中提给艿艿。
>
> 😜 给项目点点 Star 吧,这对我们真的很重要!
* 前端采用 [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
* 数据库可使用 MySQL、Oracle、PostgreSQL、SQL Server、MariaDB、国产达梦 DM、TiDB 等
* 权限认证使用 Spring Security & Token & Redis支持多终端、多种用户的认证系统
* 支持加载动态权限菜单,按钮级别权限控制,本地缓存提升性能
* 支持 SaaS 多租户系统,可自定义每个租户的权限,提供透明化的多租户底层封装。
* 工作流使用 Activiti + Flowable支持动态表单、在线设计流程、多种任务分配方式。
* 高效率开发,使用代码生成器可以一键生成前后端代码 + 单元测试 + Swagger 接口文档 + Validator 参数校验。
* 集成微信小程序、微信公众号、企业微信、钉钉等三方登陆,集成支付宝、微信等支付与退款。
* 集成阿里云、腾讯云、云片等短信渠道,集成 MinIO、阿里云、腾讯云、七牛云等云存储服务。
## 内置功能
| 项目名 | 说明 | 传说门 |
|--------------------|------------------------|-------------------------------------------------------------------------------------------------------------------------------------|
| `ruoyi-vue-pro` | Spring Boot 多模块 | **[Gitee](https://gitee.com/zhijiantianya/ruoyi-vue-pro)** &nbsp;&nbsp;&nbsp; [Github](https://github.com/YunaiV/ruoyi-vue-pro) |
| `yudao-cloud` | Spring Cloud 微服务 | **[Gitee](https://gitee.com/zhijiantianya/yudao-cloud)** &nbsp;&nbsp;&nbsp; [Github](https://github.com/YunaiV/yudao-cloud) |
| `Spring-Boot-Labs` | Spring Boot & Cloud 入门 | **[Gitee](https://gitee.com/zhijiantianya/SpringBoot-Labs)** &nbsp;&nbsp;&nbsp; [Github](https://github.com/YunaiV/SpringBoot-Labs) |
分成三种内置功能:
* 系统功能
* 基础设施
* 研发工具
> 友情提示:本项目基于 RuoYi-Vue 修改,**重构优化**后端的代码,**美化**前端的界面。
>
> 额外新增的功能,我们使用 🚀 标记。
🙂 所有功能,都通过 **单元测试** 保证高质量。
### 系统功能
| | 功能 | 描述 |
| --- | --- | --- |
| | 用户管理 | 用户是系统操作者,该功能主要完成系统用户配置 |
| | 在线用户 | 当前系统中活跃用户状态监控,支持手动踢下线 |
| | 角色管理 | 角色菜单权限分配、设置角色按机构进行数据范围权限划分 |
| | 菜单管理 | 配置系统菜单,操作权限,按钮权限标识等 |
| | 部门管理 | 配置系统组织机构(公司、部门、小组),树结构展现支持数据权限 |
| | 岗位管理 | 配置系统用户所属担任职务 |
| | 租户管理 | 配置系统租户,支持 SaaS 场景下的多租户功能 |
| | 字典管理 | 对系统中经常使用的一些较为固定的数据进行维护 |
| 🚀 | 短信管理 | 短信渠道、短息模板、短信日志,对接阿里云、云片等主流短信平台 |
| 🚀 | 操作日志 | 系统正常操作日志记录和查询,集成 Swagger 生成日志内容 |
| | 登录日志 | 系统登录日志记录查询,包含登录异常 |
| 🚀 | 错误码管理 | 系统所有错误码的管理,可在线修改错误提示,无需重启服务 |
| | 通知公告 | 系统通知公告信息发布维护 |
### 基础设施
| | 功能 | 描述 |
| --- | --- | --- |
| 🚀 | 配置管理 | 对系统动态配置常用参数,支持 SpringBoot 加载 |
| | 定时任务 | 在线(添加、修改、删除)任务调度包含执行结果日志 |
| 🚀 | 文件服务 | 支持本地文件存储,同时支持兼容 Amazon S3 协议的云服务、开源组件 |
| 🚀 | API 日志 | 包括 RESTful API 访问日志、异常日志两部分,方便排查 API 相关的问题 |
| | MySQL 监控 | 监视当前系统数据库连接池状态可进行分析SQL找出系统性能瓶颈 |
| | Redis 监控 |监控 Redis 数据库的使用情况,使用的 Redis Key 管理 |
| 🚀 |Java 监控 | 基于 Spring Boot Admin 实现 Java 应用的监控 |
| 🚀 | 链路追踪 | 接入 SkyWalking 组件,实现链路追踪 |
| 🚀 | 日志中心 | 接入 SkyWalking 组件,实现日志中心 |
| 🚀 | 分布式锁 | 基于 Redis 实现分布式锁,满足并发场景 |
| 🚀 | 幂等组件 | 基于 Redis 实现幂等组件,解决重复请求问题 |
| 🚀 | 服务保障 | 基于 Resilience4j 实现服务的稳定性,包括限流、熔断等功能 |
| 🚀 | 日志服务 | 轻量级日志中心,查看远程服务器的日志 |
| 🚀 | 单元测试 |基于 JUnit + Mockito 实现单元测试,保证功能的正确性、代码的质量等 |
### 研发工具
| | 功能 | 描述 |
| --- | --- | --- |
| 🚀 | 代码生成 |前后端代码的生成Java、Vue、SQL、单元测试支持 CRUD 下载 |
| 🚀 | 系统接口 | 基于 Swagger 自动生成相关的 RESTful API 接口文档 |
| 🚀 | 数据库文档 | 基于 Screw 自动生成数据库文档,支持导出 Word、HTML、MD 格式 |
| | 表单构建 | 拖动表单元素生成相应的 HTML 代码 |
## 在线体验
## 🐶 在线体验
演示地址:<http://dashboard.yudao.iocoder.cn>
* 账号密码admin/admin123
* 账号密码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` 实现
> 友情提示:本项目基于 RuoYi-Vue 修改,**重构优化**后端的代码,**美化**前端的界面
>
> * 额外新增的功能,我们使用 🚀 标记。
> * 重新实现的功能,我们使用 ⭐️ 标记。
### 后端
| 框架 | 说明 | 版本 | 学习指南 |
| --- | --- | --- | --- |
| [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 | - |
### 前端
| 框架 | 说明 | 版本 |
| --- | --- | --- |
| [Vue](https://cn.vuejs.org/index.html) | JavaScript 框架 | 2.6.12 |
| [Vue Element Admin](https://ant.design/docs/react/introduce-cn) | 后台前端解决方案 | - |
## 演示图
🙂 所有功能,都通过 **单元测试** 保证高质量。
### 系统功能
| 模块 | 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) | - |
| 短信 | ![短信渠道](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) | - |
| | 功能 | 描述 |
|-----|-------|---------------------------------|
| | 用户管理 | 用户是系统操作者,该功能主要完成系统用户配置 |
| ⭐️ | 在线用户 | 当前系统中活跃用户状态监控,支持手动踢下线 |
| | 角色管理 | 角色菜单权限分配、设置角色按机构进行数据范围权限划分 |
| | 菜单管理 | 配置系统菜单、操作权限、按钮权限标识等,本地缓存提供性能 |
| | 部门管理 | 配置系统组织机构(公司、部门、小组),树结构展现支持数据权限 |
| | 岗位管理 | 配置系统用户所属担任职务 |
| 🚀 | 租户管理 | 配置系统租户,支持 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> 的迁移
### 基础设施
| 模块 | 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) | - |
| API 日志 | ![访问日志](https://static.iocoder.cn/images/ruoyi-vue-pro/访问日志.jpg) | ![错误日志](https://static.iocoder.cn/images/ruoyi-vue-pro/错误日志.jpg) | - |
| MySQL & Redis | ![MySQL](https://static.iocoder.cn/images/ruoyi-vue-pro/MySQL.jpg) | ![Redis](https://static.iocoder.cn/images/ruoyi-vue-pro/Redis.jpg) | - |
| 监控平台 | ![Java监控](https://static.iocoder.cn/images/ruoyi-vue-pro/Java监控.jpg) | ![链路追踪](https://static.iocoder.cn/images/ruoyi-vue-pro/链路追踪.jpg) | ![日志中心](https://static.iocoder.cn/images/ruoyi-vue-pro/日志中心.jpg) |
| | 功能 | 描述 |
|-----|----------|----------------------------------------------|
| 🚀 | 代码生成 | 前后端代码的生成Java、Vue、SQL、单元测试支持 CRUD 下载 |
| 🚀 | 系统接口 | 基于 Swagger 自动生成相关的 RESTful API 接口文档 |
| 🚀 | 数据库文档 | 基于 Screw 自动生成数据库文档,支持导出 Word、HTML、MD 格式 |
| | 表单构建 | 拖动表单元素生成相应的 HTML 代码,支持导出 JSON、Vue 文件 |
| 🚀 | 配置管理 | 对系统动态配置常用参数,支持 SpringBoot 加载 |
| ⭐️ | 定时任务 | 在线(添加、修改、删除)任务调度包含执行结果日志 |
| 🚀 | 文件服务 | 支持将文件存储到 S3MinIO、阿里云、腾讯云、七牛云、本地、FTP、数据库等 |
| 🚀 | API 日志 | 包括 RESTful API 访问日志、异常日志两部分,方便排查 API 相关的问题 |
| | MySQL 监控 | 监视当前系统数据库连接池状态可进行分析SQL找出系统性能瓶颈 |
| | Redis 监控 | 监控 Redis 数据库的使用情况,使用的 Redis Key 管理 |
| 🚀 | 消息队列 | 基于 Redis 实现消息队列Stream 提供集群消费Pub/Sub 提供广播消费 |
| 🚀 | Java 监控 | 基于 Spring Boot Admin 实现 Java 应用的监控 |
| 🚀 | 链路追踪 | 接入 SkyWalking 组件,实现链路追踪 |
| 🚀 | 日志中心 | 接入 SkyWalking 组件,实现日志中心 |
| 🚀 | 分布式锁 | 基于 Redis 实现分布式锁,满足并发场景 |
| 🚀 | 幂等组件 | 基于 Redis 实现幂等组件,解决重复请求问题 |
| 🚀 | 服务保障 | 基于 Resilience4j 实现服务的稳定性,包括限流、熔断等功能 |
| 🚀 | 日志服务 | 轻量级日志中心,查看远程服务器的日志 |
| 🚀 | 单元测试 | 基于 JUnit + Mockito 实现单元测试,保证功能的正确性、代码的质量等 |
### 研发工具
## 🐨 技术栈
| 项目 | 说明 |
|-----------------------|--------------------|
| `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.6.8 | [文档](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.2 | [文档](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.17.3 | [文档](http://www.iocoder.cn/Spring-Boot/Redis/?yudao) |
| [Spring MVC](https://github.com/spring-projects/spring-framework/tree/master/spring-webmvc) | MVC 框架 | 5.3.20 | [文档](http://www.iocoder.cn/SpringMVC/MVC/?yudao) |
| [Spring Security](https://github.com/spring-projects/spring-security) | Spring 安全框架 | 5.6.5 | [文档](http://www.iocoder.cn/Spring-Boot/Spring-Security/?yudao) |
| [Hibernate Validator](https://github.com/hibernate/hibernate-validator) | 参数校验组件 | 6.2.3 | [文档](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.3 | [文档](http://www.iocoder.cn/Spring-Boot/Swagger/?yudao) |
| [Resilience4j](https://github.com/resilience4j/resilience4j) | 服务保障组件 | 1.7.1 | [文档](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.6.7 | [文档](http://www.iocoder.cn/Spring-Boot/Admin/?yudao) |
| [Jackson](https://github.com/FasterXML/jackson) | JSON 工具库 | 2.13.3 | |
| [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.8.2 | - |
| [Mockito](https://github.com/mockito/mockito) | Java Mock 框架 | 4.0.0 | - |
### 前端
| 框架 | 说明 | 版本 |
|------------------------------------------------------------------------------|---------------|--------|
| [Vue](https://cn.vuejs.org/index.html) | JavaScript 框架 | 2.6.12 |
| [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) |
| 用户 | ![用户管理](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) | - |
| 短信 | ![短信渠道](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) | - |
### 工作流程
| 模块 | 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 |
|---------------|----------------------------------------------------------------------|--------------------------------------------------------------------|------------------------------------------------------------------|
| 代码生成 | ![代码生成](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/文件管理2.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) | - |
| API 日志 | ![访问日志](https://static.iocoder.cn/images/ruoyi-vue-pro/访问日志.jpg) | ![错误日志](https://static.iocoder.cn/images/ruoyi-vue-pro/错误日志.jpg) | - |
| MySQL & Redis | ![MySQL](https://static.iocoder.cn/images/ruoyi-vue-pro/MySQL.jpg) | ![Redis](https://static.iocoder.cn/images/ruoyi-vue-pro/Redis.jpg) | - |
| 监控平台 | ![Java监控](https://static.iocoder.cn/images/ruoyi-vue-pro/Java监控.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) | - |

View File

@ -1,20 +1,15 @@
#!/bin/bash
set -e
# 基础
# export JAVA_HOME=/work/programs/jdk/jdk1.8.0_181
# export PATH=PATH=$PATH:$JAVA_HOME/bin
# export CLASSPATH=$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
DATE=$(date +%Y%m%d%H%M)
# 基础路径
BASE_PATH=/media/pi/KINGTON/data/work/projects/yudao-admin-server
BASE_PATH=/work/projects/yudao-server
# 编译后 jar 的地址。部署时Jenkins 会上传 jar 包到该目录下
SOURCE_PATH=$BASE_PATH/build
# 服务名称。同时约定部署服务的 jar 包名字也为它。
SERVER_NAME=yudao-admin-server
SERVER_NAME=yudao-server
# 环境
PROFILES_ACTIVE=dev
PROFILES_ACTIVE=development
# 健康检查 URL
HEALTH_CHECK_URL=http://127.0.0.1:48080/actuator/health/
@ -62,7 +57,7 @@ function transfer() {
echo "[transfer] 转移 $SERVER_NAME.jar 完成"
}
# 停止
# 停止:优雅关闭之前已经启动的服务
function stop() {
echo "[stop] 开始停止 $BASE_PATH/$SERVER_NAME"
PID=$(ps -ef | grep $BASE_PATH/$SERVER_NAME | grep -v "grep" | awk '{print $2}')
@ -71,8 +66,8 @@ function stop() {
# 正常关闭
echo "[stop] $BASE_PATH/$SERVER_NAME 运行中,开始 kill [$PID]"
kill -15 $PID
# 等待最大 60 秒,直到关闭完成。
for ((i = 0; i < 60; i++))
# 等待最大 120 秒,直到关闭完成。
for ((i = 0; i < 120; i++))
do
sleep 1
PID=$(ps -ef | grep $BASE_PATH/$SERVER_NAME | grep -v "grep" | awk '{print $2}')
@ -95,7 +90,7 @@ function stop() {
fi
}
# 启动
# 启动:启动后端项目
function start() {
# 开启启动前,打印启动参数
echo "[start] 开始启动 $BASE_PATH/$SERVER_NAME"
@ -108,13 +103,13 @@ function start() {
echo "[start] 启动 $BASE_PATH/$SERVER_NAME 完成"
}
# 健康检查
# 健康检查:自动判断后端项目是否正常启动
function healthCheck() {
# 如果配置健康检查,则进行健康检查
if [ -n "$HEALTH_CHECK_URL" ]; then
# 健康检查最大 60 秒,直到健康检查通过
# 健康检查最大 120 秒,直到健康检查通过
echo "[healthCheck] 开始通过 $HEALTH_CHECK_URL 地址,进行健康检查";
for ((i = 0; i < 60; i++))
for ((i = 0; i < 120; i++))
do
# 请求健康检查地址,只获取状态码。
result=`curl -I -m 10 -o /dev/null -s -w %{http_code} $HEALTH_CHECK_URL || echo "000"`
@ -138,11 +133,11 @@ function healthCheck() {
else
tail -n 10 nohup.out
fi
# 如果未配置健康检查,则 slepp 60 秒,人工看日志是否部署成功。
# 如果未配置健康检查,则 sleep 120 秒,人工看日志是否部署成功。
else
echo "[healthCheck] HEALTH_CHECK_URL 未配置,开始 sleep 60 秒";
sleep 60
echo "[healthCheck] sleep 60 秒完成,查看日志,自行判断是否启动成功";
echo "[healthCheck] HEALTH_CHECK_URL 未配置,开始 sleep 120 秒";
sleep 120
echo "[healthCheck] sleep 120 秒完成,查看日志,自行判断是否启动成功";
tail -n 50 nohup.out
fi
}
@ -159,7 +154,7 @@ function deploy() {
# 启动 Java 服务
start
# 健康检查
# healthCheck
healthCheck
}
deploy

View File

@ -1,7 +1,20 @@
{
"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"
},
"gateway": {
"baseUrl": "http://127.0.0.1:8888/admin-api",
"token": "test1",
"adminTenentId": "1",
"appApi": "http://127.0.0.1:8888/app-api",
"appToken": "test1",
"appTenentId": "1"
}
}

BIN
img.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 189 KiB

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

43
pom.xml
View File

@ -10,22 +10,31 @@
<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-pay</module>
</modules>
<name>${artifactId}</name>
<name>${project.artifactId}</name>
<description>芋道项目基础脚手架</description>
<url>https://github.com/YunaiV/ruoyi-vue-pro</url>
<properties>
<revision>1.2.0-snapshot</revision>
<revision>1.6.2-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 +60,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 +87,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>

3
sql/db2/README.md Normal file
View File

@ -0,0 +1,3 @@
暂未适配 IBM DB2 数据库,如果你有需要,可以微信联系 wangwenbin-server 一起建设。
你需要把表结构与数据导入到 DM 数据库,我来测试与适配代码。

3
sql/dm/README.md Normal file
View File

@ -0,0 +1,3 @@
暂未适配国产 DM 数据库,如果你有需要,可以微信联系 wangwenbin-server 一起建设。
你需要把表结构与数据导入到 DM 数据库,我来测试与适配代码。

2649
sql/mysql/ruoyi-vue-pro.sql Normal file

File diff suppressed because it is too large Load Diff

6208
sql/oracle/ruoyi-vue-pro.sql Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,288 +0,0 @@
/*
Navicat Premium Data Transfer
Source Server : 127.0.0.1
Source Server Type : MySQL
Source Server Version : 80026
Source Host : localhost:3306
Source Schema : ruoyi-vue-pro
Target Server Type : MySQL
Target Server Version : 80026
File Encoding : 65001
Date: 30/10/2021 13:46:03
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for QRTZ_BLOB_TRIGGERS
-- ----------------------------
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,
`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 COLLATE=utf8mb4_0900_ai_ci;
-- ----------------------------
-- Records of QRTZ_BLOB_TRIGGERS
-- ----------------------------
BEGIN;
COMMIT;
-- ----------------------------
-- Table structure for QRTZ_CALENDARS
-- ----------------------------
DROP TABLE IF EXISTS `QRTZ_CALENDARS`;
CREATE TABLE `QRTZ_CALENDARS` (
`SCHED_NAME` varchar(120) NOT NULL,
`CALENDAR_NAME` varchar(190) NOT NULL,
`CALENDAR` blob NOT NULL,
PRIMARY KEY (`SCHED_NAME`,`CALENDAR_NAME`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- ----------------------------
-- Records of QRTZ_CALENDARS
-- ----------------------------
BEGIN;
COMMIT;
-- ----------------------------
-- Table structure for QRTZ_CRON_TRIGGERS
-- ----------------------------
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,
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 COLLATE=utf8mb4_0900_ai_ci;
-- ----------------------------
-- Records of QRTZ_CRON_TRIGGERS
-- ----------------------------
BEGIN;
INSERT INTO `QRTZ_CRON_TRIGGERS` VALUES ('schedulerName', 'payNotifyJob', 'DEFAULT', '* * * * * ?', 'Asia/Shanghai');
INSERT INTO `QRTZ_CRON_TRIGGERS` VALUES ('schedulerName', 'sysUserSessionTimeoutJob', 'DEFAULT', '0 * * * * ? *', 'Asia/Shanghai');
COMMIT;
-- ----------------------------
-- Table structure for QRTZ_FIRED_TRIGGERS
-- ----------------------------
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 NOT NULL,
`SCHED_TIME` bigint NOT NULL,
`PRIORITY` int 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,
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`),
KEY `IDX_QRTZ_FT_J_G` (`SCHED_NAME`,`JOB_NAME`,`JOB_GROUP`),
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 COLLATE=utf8mb4_0900_ai_ci;
-- ----------------------------
-- Records of QRTZ_FIRED_TRIGGERS
-- ----------------------------
BEGIN;
COMMIT;
-- ----------------------------
-- Table structure for QRTZ_JOB_DETAILS
-- ----------------------------
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,
`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 COLLATE=utf8mb4_0900_ai_ci;
-- ----------------------------
-- Records of QRTZ_JOB_DETAILS
-- ----------------------------
BEGIN;
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', 'sysUserSessionTimeoutJob', 'DEFAULT', NULL, 'cn.iocoder.yudao.framework.quartz.core.handler.JobHandlerInvoker', '0', '1', '1', '0', 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C770800000010000000027400064A4F425F49447372000E6A6176612E6C616E672E4C6F6E673B8BE490CC8F23DF0200014A000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B020000787000000000000000037400104A4F425F48414E444C45525F4E414D457400187379735573657253657373696F6E54696D656F75744A6F627800);
COMMIT;
-- ----------------------------
-- Table structure for QRTZ_LOCKS
-- ----------------------------
DROP TABLE IF EXISTS `QRTZ_LOCKS`;
CREATE TABLE `QRTZ_LOCKS` (
`SCHED_NAME` varchar(120) NOT NULL,
`LOCK_NAME` varchar(40) NOT NULL,
PRIMARY KEY (`SCHED_NAME`,`LOCK_NAME`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- ----------------------------
-- Records of QRTZ_LOCKS
-- ----------------------------
BEGIN;
INSERT INTO `QRTZ_LOCKS` VALUES ('schedulerName', 'STATE_ACCESS');
INSERT INTO `QRTZ_LOCKS` VALUES ('schedulerName', 'TRIGGER_ACCESS');
COMMIT;
-- ----------------------------
-- Table structure for QRTZ_PAUSED_TRIGGER_GRPS
-- ----------------------------
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,
PRIMARY KEY (`SCHED_NAME`,`TRIGGER_GROUP`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- ----------------------------
-- Records of QRTZ_PAUSED_TRIGGER_GRPS
-- ----------------------------
BEGIN;
COMMIT;
-- ----------------------------
-- Table structure for QRTZ_SCHEDULER_STATE
-- ----------------------------
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 NOT NULL,
`CHECKIN_INTERVAL` bigint NOT NULL,
PRIMARY KEY (`SCHED_NAME`,`INSTANCE_NAME`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- ----------------------------
-- Records of QRTZ_SCHEDULER_STATE
-- ----------------------------
BEGIN;
INSERT INTO `QRTZ_SCHEDULER_STATE` VALUES ('schedulerName', 'Yunai.local1635571630493', 1635572537879, 15000);
COMMIT;
-- ----------------------------
-- Table structure for QRTZ_SIMPLE_TRIGGERS
-- ----------------------------
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 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 COLLATE=utf8mb4_0900_ai_ci;
-- ----------------------------
-- Records of QRTZ_SIMPLE_TRIGGERS
-- ----------------------------
BEGIN;
COMMIT;
-- ----------------------------
-- Table structure for QRTZ_SIMPROP_TRIGGERS
-- ----------------------------
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 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,
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 COLLATE=utf8mb4_0900_ai_ci;
-- ----------------------------
-- Records of QRTZ_SIMPROP_TRIGGERS
-- ----------------------------
BEGIN;
COMMIT;
-- ----------------------------
-- Table structure for QRTZ_TRIGGERS
-- ----------------------------
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 DEFAULT NULL,
`PREV_FIRE_TIME` bigint DEFAULT NULL,
`PRIORITY` int DEFAULT NULL,
`TRIGGER_STATE` varchar(16) NOT NULL,
`TRIGGER_TYPE` varchar(8) NOT NULL,
`START_TIME` bigint NOT NULL,
`END_TIME` bigint DEFAULT NULL,
`CALENDAR_NAME` varchar(190) 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`),
KEY `IDX_QRTZ_T_JG` (`SCHED_NAME`,`JOB_GROUP`),
KEY `IDX_QRTZ_T_C` (`SCHED_NAME`,`CALENDAR_NAME`),
KEY `IDX_QRTZ_T_G` (`SCHED_NAME`,`TRIGGER_GROUP`),
KEY `IDX_QRTZ_T_STATE` (`SCHED_NAME`,`TRIGGER_STATE`),
KEY `IDX_QRTZ_T_N_STATE` (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`,`TRIGGER_STATE`),
KEY `IDX_QRTZ_T_N_G_STATE` (`SCHED_NAME`,`TRIGGER_GROUP`,`TRIGGER_STATE`),
KEY `IDX_QRTZ_T_NEXT_FIRE_TIME` (`SCHED_NAME`,`NEXT_FIRE_TIME`),
KEY `IDX_QRTZ_T_NFT_ST` (`SCHED_NAME`,`TRIGGER_STATE`,`NEXT_FIRE_TIME`),
KEY `IDX_QRTZ_T_NFT_MISFIRE` (`SCHED_NAME`,`MISFIRE_INSTR`,`NEXT_FIRE_TIME`),
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 COLLATE=utf8mb4_0900_ai_ci;
-- ----------------------------
-- Records of QRTZ_TRIGGERS
-- ----------------------------
BEGIN;
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', 'sysUserSessionTimeoutJob', 'DEFAULT', 'sysUserSessionTimeoutJob', 'DEFAULT', NULL, 1635572580000, 1635572520000, 5, 'WAITING', 'CRON', 1613649236000, 0, NULL, 0, 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C770800000010000000037400114A4F425F48414E444C45525F504152414D707400124A4F425F52455452595F494E54455256414C737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000007D074000F4A4F425F52455452595F434F554E547371007E0009000000037800);
COMMIT;
SET FOREIGN_KEY_CHECKS = 1;

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -1,168 +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>
<dependency>
<groupId>cn.iocoder.boot</groupId>
<artifactId>yudao-spring-boot-starter-biz-tenant</artifactId>
</dependency>
<dependency>
<groupId>cn.iocoder.boot</groupId>
<artifactId>yudao-spring-boot-starter-biz-data-permission</artifactId>
</dependency>
<dependency>
<groupId>cn.iocoder.boot</groupId>
<artifactId>yudao-spring-boot-starter-activiti</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>
<!-- 三方云服务相关 -->
<dependency>
<groupId>com.xkcoding.justauth</groupId>
<artifactId>justauth-spring-boot-starter</artifactId>
</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,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,41 +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 -> {
// 验证码的接口
registry.antMatchers(api("/system/captcha/**")).anonymous();
// 获得租户编号的接口
registry.antMatchers(api("/system/tenant/get-id-by-name")).anonymous();
// Spring Boot Admin Server 的安全配置
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,100 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.activiti.controller.form;
import cn.iocoder.yudao.adminserver.modules.activiti.controller.form.vo.*;
import cn.iocoder.yudao.adminserver.modules.activiti.convert.form.WfFormConvert;
import cn.iocoder.yudao.adminserver.modules.activiti.dal.dataobject.form.WfForm;
import cn.iocoder.yudao.adminserver.modules.activiti.service.form.WfFormService;
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 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.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;
// TODO @风里雾里: Os=》Wf/os 改成 /wl 开头。目前这个模块,咱先定位成给工作流用的
@Api(tags = "动态表单")
@RestController
@RequestMapping("/wl/form")
@Validated
public class WlFormController {
@Resource
private WfFormService formService;
@PostMapping("/create")
@ApiOperation("创建动态表单")
@PreAuthorize("@ss.hasPermission('os:form:create')")
public CommonResult<Long> createForm(@Valid @RequestBody WfFormCreateReqVO createReqVO) {
return success(formService.createForm(createReqVO));
}
@PutMapping("/update")
@ApiOperation("更新动态表单")
@PreAuthorize("@ss.hasPermission('os:form:update')")
public CommonResult<Boolean> updateForm(@Valid @RequestBody WfFormUpdateReqVO updateReqVO) {
formService.updateForm(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@ApiOperation("删除动态表单")
@ApiImplicitParam(name = "id", value = "编号", required = true)
@PreAuthorize("@ss.hasPermission('os:form:delete')")
public CommonResult<Boolean> deleteForm(@RequestParam("id") Long id) {
formService.deleteForm(id);
return success(true);
}
@GetMapping("/get")
@ApiOperation("获得动态表单")
@ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
@PreAuthorize("@ss.hasPermission('os:form:query')")
public CommonResult<WfFormRespVO> getForm(@RequestParam("id") Long id) {
WfForm form = formService.getForm(id);
return success(WfFormConvert.INSTANCE.convert(form));
}
@GetMapping("/list")
@ApiOperation("获得动态表单列表")
@ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class)
@PreAuthorize("@ss.hasPermission('os:form:query')")
public CommonResult<List<WfFormRespVO>> getFormList(@RequestParam("ids") Collection<Long> ids) {
List<WfForm> list = formService.getFormList(ids);
return success(WfFormConvert.INSTANCE.convertList(list));
}
@GetMapping("/page")
@ApiOperation("获得动态表单分页")
@PreAuthorize("@ss.hasPermission('os:form:query')")
public CommonResult<PageResult<WfFormRespVO>> getFormPage(@Valid WfFormPageReqVO pageVO) {
PageResult<WfForm> pageResult = formService.getFormPage(pageVO);
return success(WfFormConvert.INSTANCE.convertPage(pageResult));
}
@GetMapping("/export-excel")
@ApiOperation("导出动态表单 Excel")
@PreAuthorize("@ss.hasPermission('os:form:export')")
@OperateLog(type = EXPORT)
public void exportFormExcel(@Valid WfFormExportReqVO exportReqVO,
HttpServletResponse response) throws IOException {
List<WfForm> list = formService.getFormList(exportReqVO);
// 导出 Excel
List<WfFormExcelVO> datas = WfFormConvert.INSTANCE.convertList02(list);
ExcelUtils.write(response, "动态表单.xls", "数据", WfFormExcelVO.class, datas);
}
}

View File

@ -1,28 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.activiti.controller.form.vo;
import lombok.*;
import io.swagger.annotations.*;
import javax.validation.constraints.*;
/**
* 动态表单 Base VO提供给添加、修改、详细的子 VO 使用
* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
*/
@Data
public class WfFormBaseVO {
@ApiModelProperty(value = "表单名称", required = true)
@NotNull(message = "表单名称不能为空")
private String name;
@ApiModelProperty(value = "商户状态", required = true)
@NotNull(message = "商户状态不能为空")
private Integer status;
@ApiModelProperty(value = "表单JSON")
private String formJson;
@ApiModelProperty(value = "备注")
private String remark;
}

View File

@ -1,12 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.activiti.controller.form.vo;
import lombok.*;
import io.swagger.annotations.*;
@ApiModel("动态表单创建 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class WfFormCreateReqVO extends WfFormBaseVO {
}

View File

@ -1,34 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.activiti.controller.form.vo;
import lombok.*;
import java.util.*;
import com.alibaba.excel.annotation.ExcelProperty;
/**
* 动态表单 Excel VO
*
* @author 芋艿
*/
@Data
public class WfFormExcelVO {
@ExcelProperty("表单编号")
private Long id;
@ExcelProperty("表单名称")
private String name;
@ExcelProperty("商户状态")
private Integer status;
@ExcelProperty("表单JSON")
private String formJson;
@ExcelProperty("备注")
private String remark;
@ExcelProperty("创建时间")
private Date createTime;
}

View File

@ -1,33 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.activiti.controller.form.vo;
import lombok.*;
import java.util.*;
import io.swagger.annotations.*;
import org.springframework.format.annotation.DateTimeFormat;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@ApiModel(value = "动态表单 Excel 导出 Request VO", description = "参数和 OsFormPageReqVO 是一致的")
@Data
public class WfFormExportReqVO {
@ApiModelProperty(value = "表单名称")
private String name;
@ApiModelProperty(value = "商户状态")
private Integer status;
@ApiModelProperty(value = "表单JSON")
private String formJson;
@ApiModelProperty(value = "备注")
private String remark;
@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,36 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.activiti.controller.form.vo;
import lombok.*;
import java.util.*;
import io.swagger.annotations.*;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import org.springframework.format.annotation.DateTimeFormat;
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 WfFormPageReqVO extends PageParam {
@ApiModelProperty(value = "表单名称")
private String name;
@ApiModelProperty(value = "商户状态")
private Integer status;
@ApiModelProperty(value = "表单JSON")
private String formJson;
@ApiModelProperty(value = "备注")
private String remark;
@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,19 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.activiti.controller.form.vo;
import lombok.*;
import java.util.*;
import io.swagger.annotations.*;
@ApiModel("动态表单 Response VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class WfFormRespVO extends WfFormBaseVO {
@ApiModelProperty(value = "表单编号", required = true)
private Long id;
@ApiModelProperty(value = "创建时间", required = true)
private Date createTime;
}

View File

@ -1,17 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.activiti.controller.form.vo;
import lombok.*;
import io.swagger.annotations.*;
import javax.validation.constraints.*;
@ApiModel("动态表单更新 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class WfFormUpdateReqVO extends WfFormBaseVO {
@ApiModelProperty(value = "表单编号", required = true)
@NotNull(message = "表单编号不能为空")
private Long id;
}

View File

@ -1,114 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.activiti.controller.oa;
import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.*;
import cn.iocoder.yudao.adminserver.modules.activiti.convert.oa.OaLeaveConvert;
import cn.iocoder.yudao.adminserver.modules.activiti.dal.dataobject.oa.OaLeaveDO;
import cn.iocoder.yudao.adminserver.modules.activiti.service.oa.OaLeaveService;
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.security.core.util.SecurityFrameworkUtils;
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.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;
// TODO @jasonOa=》OA 会不会好点,名词缩写哈
@Api(tags = "请假申请")
@RestController
@RequestMapping("/oa/leave")
@Validated
public class OaLeaveController {
@Resource
private OaLeaveService leaveService;
@PostMapping("/create")
@ApiOperation("创建请假申请")
@PreAuthorize("@ss.hasPermission('oa:leave:create')")
public CommonResult<Long> createLeave(@Valid @RequestBody OaLeaveCreateReqVO createReqVO) {
// TODO @芋艿processKey 自己去理解下。不过得把 leave 变成枚举
createReqVO.setProcessKey("leave");
return success(leaveService.createLeave(createReqVO));
}
@PostMapping("/form-key/create")
@ApiOperation("创建外置请假申请")
public CommonResult<Long> createFormKeyLeave(@Valid @RequestBody OaLeaveCreateReqVO createReqVO) {
// TODO @芋艿processKey 自己去理解下。不过得把 formkey 变成枚举
createReqVO.setProcessKey("leave-formkey");
return success(leaveService.createLeave(createReqVO));
}
@PutMapping("/update")
@ApiOperation("更新请假申请")
@PreAuthorize("@ss.hasPermission('oa:leave:update')")
public CommonResult<Boolean> updateLeave(@Valid @RequestBody OaLeaveUpdateReqVO updateReqVO) {
leaveService.updateLeave(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@ApiOperation("删除请假申请")
@ApiImplicitParam(name = "id", value = "编号", required = true)
@PreAuthorize("@ss.hasPermission('oa:leave:delete')")
public CommonResult<Boolean> deleteLeave(@RequestParam("id") Long id) {
leaveService.deleteLeave(id);
return success(true);
}
@GetMapping("/get")
@ApiOperation("获得请假申请")
@ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
@PreAuthorize("@ss.hasPermission('oa:leave:query')")
public CommonResult<OaLeaveRespVO> getLeave(@RequestParam("id") Long id) {
OaLeaveDO leave = leaveService.getLeave(id);
return success(OaLeaveConvert.INSTANCE.convert(leave));
}
@GetMapping("/list")
@ApiOperation("获得请假申请列表")
@ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class)
@PreAuthorize("@ss.hasPermission('oa:leave:query')")
public CommonResult<List<OaLeaveRespVO>> getLeaveList(@RequestParam("ids") Collection<Long> ids) {
List<OaLeaveDO> list = leaveService.getLeaveList(ids);
return success(OaLeaveConvert.INSTANCE.convertList(list));
}
@GetMapping("/page")
@ApiOperation("获得请假申请分页")
@PreAuthorize("@ss.hasPermission('oa:leave:query')")
public CommonResult<PageResult<OaLeaveRespVO>> getLeavePage(@Valid OaLeavePageReqVO pageVO) {
//值查询自己申请请假
// TODO @芋艿:这里的传值,到底前端搞,还是后端搞。
pageVO.setUserId(SecurityFrameworkUtils.getLoginUser().getUsername());
PageResult<OaLeaveDO> pageResult = leaveService.getLeavePage(pageVO);
return success(OaLeaveConvert.INSTANCE.convertPage(pageResult));
}
@GetMapping("/export-excel")
@ApiOperation("导出请假申请 Excel")
@PreAuthorize("@ss.hasPermission('oa:leave:export')")
@OperateLog(type = EXPORT)
public void exportLeaveExcel(@Valid OaLeaveExportReqVO exportReqVO,
HttpServletResponse response) throws IOException {
List<OaLeaveDO> list = leaveService.getLeaveList(exportReqVO);
// 导出 Excel
List<OaLeaveExcelVO> datas = OaLeaveConvert.INSTANCE.convertList02(list);
ExcelUtils.write(response, "请假申请.xls", "数据", OaLeaveExcelVO.class, datas);
}
}

View File

@ -1,48 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo;
import lombok.*;
import java.util.*;
import io.swagger.annotations.*;
import javax.validation.constraints.*;
import org.springframework.format.annotation.DateTimeFormat;
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 OaLeaveBaseVO {
@ApiModelProperty(value = "流程id")
private String processInstanceId;
@ApiModelProperty(value = "状态", required = true)
private Integer status;
@ApiModelProperty(value = "申请人id", required = true)
private String userId;
@ApiModelProperty(value = "开始时间", required = true)
@NotNull(message = "开始时间不能为空")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private Date startTime;
@ApiModelProperty(value = "结束时间", required = true)
@NotNull(message = "结束时间不能为空")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private Date endTime;
@ApiModelProperty(value = "请假类型")
private String leaveType;
@ApiModelProperty(value = "原因")
private String reason;
@ApiModelProperty(value = "申请时间", required = true)
@NotNull(message = "申请时间不能为空")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private Date applyTime;
}

View File

@ -1,15 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo;
import lombok.*;
import java.util.*;
import io.swagger.annotations.*;
import javax.validation.constraints.*;
@ApiModel("请假申请创建 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class OaLeaveCreateReqVO extends OaLeaveBaseVO {
private String processKey;
}

View File

@ -1,44 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo;
import lombok.*;
import java.util.*;
import io.swagger.annotations.*;
import com.alibaba.excel.annotation.ExcelProperty;
/**
* 请假申请 Excel VO
*
* @author 芋艿
*/
@Data
public class OaLeaveExcelVO {
@ExcelProperty("请假表单主键")
private Long id;
@ExcelProperty("流程id")
private String processInstanceId;
@ExcelProperty("状态")
private Integer status;
@ExcelProperty("申请人id")
private String userId;
@ExcelProperty("开始时间")
private Date startTime;
@ExcelProperty("结束时间")
private Date endTime;
@ExcelProperty("请假类型")
private String leaveType;
@ExcelProperty("原因")
private String reason;
@ExcelProperty("申请时间")
private Date applyTime;
}

View File

@ -1,54 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo;
import lombok.*;
import java.util.*;
import io.swagger.annotations.*;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import org.springframework.format.annotation.DateTimeFormat;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@ApiModel(value = "请假申请 Excel 导出 Request VO", description = "参数和 OaLeavePageReqVO 是一致的")
@Data
public class OaLeaveExportReqVO {
@ApiModelProperty(value = "流程id")
private String processInstanceId;
@ApiModelProperty(value = "状态")
private Integer status;
@ApiModelProperty(value = "申请人id")
private String userId;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "开始开始时间")
private Date beginStartTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "结束开始时间")
private Date endStartTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "开始结束时间")
private Date beginEndTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "结束结束时间")
private Date endEndTime;
@ApiModelProperty(value = "请假类型")
private String leaveType;
@ApiModelProperty(value = "原因")
private String reason;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "开始申请时间")
private Date beginApplyTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "结束申请时间")
private Date endApplyTime;
}

View File

@ -1,56 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo;
import lombok.*;
import java.util.*;
import io.swagger.annotations.*;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import org.springframework.format.annotation.DateTimeFormat;
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 OaLeavePageReqVO extends PageParam {
@ApiModelProperty(value = "流程id")
private String processInstanceId;
@ApiModelProperty(value = "状态")
private Integer status;
@ApiModelProperty(value = "申请人id")
private String userId;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "开始开始时间")
private Date beginStartTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "结束开始时间")
private Date endStartTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "开始结束时间")
private Date beginEndTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "结束结束时间")
private Date endEndTime;
@ApiModelProperty(value = "请假类型")
private String leaveType;
@ApiModelProperty(value = "原因")
private String reason;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "开始申请时间")
private Date beginApplyTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "结束申请时间")
private Date endApplyTime;
}

View File

@ -1,16 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo;
import lombok.*;
import java.util.*;
import io.swagger.annotations.*;
@ApiModel("请假申请 Response VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class OaLeaveRespVO extends OaLeaveBaseVO {
@ApiModelProperty(value = "请假表单主键", required = true)
private Long id;
}

View File

@ -1,32 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.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;
import java.util.Map;
@ApiModel("请假申请更新 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class OaLeaveUpdateReqVO extends OaLeaveBaseVO {
@ApiModelProperty(value = "请假表单主键", required = true)
@NotNull(message = "请假表单主键不能为空")
private Long id;
// TODO @jsonswagger 和 validator 的注解要加哈。
private String taskId;
private String comment;
private Map<String,Object> variables;
// TODO @芋艿variables 的作用是啥。
}

View File

@ -1,34 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.activiti.controller.workflow;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import org.activiti.api.process.runtime.ProcessRuntime;
import org.activiti.engine.RepositoryService;
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;
// TODO @jsonswagger 和 validation 的注解,后续要补全下哈。可以等 workflow 基本写的差不多之后
@RestController
@RequestMapping("/workflow/process/definition")
public class ProcessDefinitionController {
@Resource
private RepositoryService repositoryService;
@Resource
private ProcessRuntime processRuntime;
@GetMapping(value = "/getStartForm")
public CommonResult<String> getStartForm(@RequestParam("processKey") String processKey){
//这样查似乎有问题??, 暂时写死
// final ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().
// processDefinitionKey(processKey).latestVersion().singleResult();
// processRuntime.processDefinition(processDefinition.getId()).getFormKey();
return CommonResult.success("/flow/leave/apply");
}
}

View File

@ -1,60 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.activiti.controller.workflow;
import cn.iocoder.yudao.adminserver.modules.activiti.controller.workflow.vo.*;
import cn.iocoder.yudao.adminserver.modules.activiti.service.workflow.TaskService;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.List;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
// TODO @jsonswagger 和 validation 的注解,后续要补全下哈。可以等 workflow 基本写的差不多之后
@Api(tags = "工作流待办任务")
@RestController
@RequestMapping("/workflow/task")
public class TaskController {
@Resource
private TaskService taskService;
@GetMapping("/todo/page")
@ApiOperation("获取待办任务分页")
public CommonResult<PageResult<TodoTaskRespVO>> getTodoTaskPage(@Valid TodoTaskPageReqVO pageVO) {
return success(taskService.getTodoTaskPage(pageVO));
}
@GetMapping("/claim")
@ApiOperation("签收任务")
public CommonResult<Boolean> claimTask(@RequestParam("id") String taskId) {
taskService.claimTask(taskId);
return success(true);
}
@PostMapping("/task-steps")
public CommonResult<TaskHandleVO> getTaskSteps(@RequestBody TaskQueryReqVO taskQuery) {
return success(taskService.getTaskSteps(taskQuery));
}
@PostMapping("/formKey")
public CommonResult<TodoTaskRespVO> getTaskFormKey(@RequestBody TaskQueryReqVO taskQuery) {
return success(taskService.getTaskFormKey(taskQuery));
}
@PostMapping("/complete")
public CommonResult<Boolean> complete(@RequestBody TaskReqVO taskReq) {
taskService.completeTask(taskReq);
return success(true);
}
@GetMapping("/process/history-steps")
public CommonResult<List<TaskStepVO>> getHistorySteps(@RequestParam("id") String processInstanceId) {
return success(taskService.getHistorySteps(processInstanceId));
}
}

View File

@ -1,19 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.activiti.controller.workflow.vo;
import lombok.Data;
import lombok.ToString;
import java.util.List;
@Data
@ToString
public class TaskHandleVO {
private Object formObject;
private List<TaskStepVO> historyTask;
private String taskVariable;
}

View File

@ -1,15 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.activiti.controller.workflow.vo;
import lombok.Data;
import lombok.ToString;
@Data
@ToString
public class TaskQueryReqVO {
private String processKey;
private String taskId;
private String businessKey;
}

View File

@ -1,17 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.activiti.controller.workflow.vo;
import lombok.Data;
import lombok.ToString;
import java.util.Map;
@Data
@ToString
public class TaskReqVO {
private String taskId;
private Map<String,Object> variables;
private String comment;
}

View File

@ -1,24 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.activiti.controller.workflow.vo;
import lombok.Data;
import lombok.ToString;
import java.util.Date;
@Data
@ToString
public class TaskStepVO {
private String stepName;
private Date startTime;
private Date endTime;
private String assignee;
private String comment;
private Integer status;
}

View File

@ -1,16 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.activiti.controller.workflow.vo;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@ApiModel("待办任务申请分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class TodoTaskPageReqVO extends PageParam {
private String assignee;
}

View File

@ -1,33 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.activiti.controller.workflow.vo;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@ApiModel("待办任务 Response VO")
@Data
@ToString
public class TodoTaskRespVO {
private String id;
/**
* 1:未签收
* 2:已签收
*/
private Integer status;
private String processName;
private String processKey;
private String businessKey;
private String formKey;
}

View File

@ -1,36 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.activiti.convert.form;
import cn.iocoder.yudao.adminserver.modules.activiti.controller.form.vo.WfFormCreateReqVO;
import cn.iocoder.yudao.adminserver.modules.activiti.controller.form.vo.WfFormExcelVO;
import cn.iocoder.yudao.adminserver.modules.activiti.controller.form.vo.WfFormRespVO;
import cn.iocoder.yudao.adminserver.modules.activiti.controller.form.vo.WfFormUpdateReqVO;
import cn.iocoder.yudao.adminserver.modules.activiti.dal.dataobject.form.WfForm;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.util.List;
/**
* 动态表单 Convert
*
* @author 芋艿
*/
@Mapper
public interface WfFormConvert {
WfFormConvert INSTANCE = Mappers.getMapper(WfFormConvert.class);
WfForm convert(WfFormCreateReqVO bean);
WfForm convert(WfFormUpdateReqVO bean);
WfFormRespVO convert(WfForm bean);
List<WfFormRespVO> convertList(List<WfForm> list);
PageResult<WfFormRespVO> convertPage(PageResult<WfForm> page);
List<WfFormExcelVO> convertList02(List<WfForm> list);
}

View File

@ -1,34 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.activiti.convert.oa;
import java.util.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.*;
import cn.iocoder.yudao.adminserver.modules.activiti.dal.dataobject.oa.OaLeaveDO;
/**
* 请假申请 Convert
*
* @author 芋艿
*/
@Mapper
public interface OaLeaveConvert {
OaLeaveConvert INSTANCE = Mappers.getMapper(OaLeaveConvert.class);
OaLeaveDO convert(OaLeaveCreateReqVO bean);
OaLeaveDO convert(OaLeaveUpdateReqVO bean);
OaLeaveRespVO convert(OaLeaveDO bean);
List<OaLeaveRespVO> convertList(List<OaLeaveDO> list);
PageResult<OaLeaveRespVO> convertPage(PageResult<OaLeaveDO> page);
List<OaLeaveExcelVO> convertList02(List<OaLeaveDO> list);
}

View File

@ -1,9 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.activiti.convert.workflow;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@Mapper
public interface TodoTaskConvert {
TodoTaskConvert INSTANCE = Mappers.getMapper(TodoTaskConvert.class);
}

View File

@ -1,57 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.activiti.dal.dataobject.form;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import lombok.*;
import java.util.List;
/**
* 工作流的表单定义
* 用于工作流的申请表单,需要动态配置的场景
*
* @author 芋道源码
*/
@TableName(value = "wf_form", autoResultMap = true)
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class WfForm extends BaseDO {
/**
* 编号
*/
@TableId
private Long id;
/**
* 表单名
*/
private String name;
/**
* 状态
*/
private Integer status;
/**
* 表单JSON
*/
private String formJson;
/**
* 表单配置
*
* 目前直接将 https://github.com/JakHuang/form-generator 生成的 JSON 串,直接保存
* 定义https://github.com/JakHuang/form-generator/issues/46
*/
@TableField(typeHandler = JacksonTypeHandler.class)
private List<String> fields;
/**
* 备注
*/
private String remark;
}

View File

@ -1,55 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.activiti.dal.dataobject.form;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import lombok.*;
import java.util.List;
import java.util.Map;
/**
* 工作流的表单结果
* 用户每次填写工作流的申请表单时,会保存一条记录到该表】
*
* @author 芋道源码
*/
@TableName(value = "wf_form", autoResultMap = true)
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class WfFormData extends BaseDO {
/**
* 编号
*/
private Long id;
/**
* 表单编号
*
* 关联 {@link WfForm#getId()}
*/
private Long formId;
/**
* 状态
*/
private Integer status;
/**
* 表单配置
*
* 冗余 {@link WfForm#getFields()}
* 主要考虑,表单是可以修改的
*/
@TableField(typeHandler = JacksonTypeHandler.class)
private List<String> fields;
/**
* 表单值
*/
@TableField(typeHandler = JacksonTypeHandler.class)
private Map<String, Object> values;
}

View File

@ -1,60 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.activiti.dal.dataobject.oa;
import lombok.*;
import java.util.*;
import com.baomidou.mybatisplus.annotation.*;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
/**
* 请假申请 DO
*
* @author 芋艿
*/
@TableName("oa_leave")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class OaLeaveDO extends BaseDO {
/**
* 请假表单主键
*/
@TableId
private Long id;
/**
* 流程id
*/
private String processInstanceId;
/**
* 状态
*/
private Integer status;
/**
* 申请人id
*/
private String userId;
/**
* 开始时间
*/
private Date startTime;
/**
* 结束时间
*/
private Date endTime;
/**
* 请假类型
*/
private String leaveType;
/**
* 原因
*/
private String reason;
/**
* 申请时间
*/
private Date applyTime;
}

View File

@ -1,29 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.activiti.dal.dataobject.process;
/**
* 流程模型实体类 映射 activiti ProcessDefinition接口
*
* @author ZJQ
* @date 2021/9/7 23:23
*/
public class ProcessDefinitionDO {
private String id;
private String category;
private String key;
private String name;
private String version;
private String resourceName;
private String deploymentId;
private String diagramResourceName;
private boolean suspended;
}

View File

@ -1,43 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.activiti.dal.mysql.form;
import cn.iocoder.yudao.adminserver.modules.activiti.controller.form.vo.WfFormExportReqVO;
import cn.iocoder.yudao.adminserver.modules.activiti.controller.form.vo.WfFormPageReqVO;
import cn.iocoder.yudao.adminserver.modules.activiti.dal.dataobject.form.WfForm;
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;
/**
* 动态表单 Mapper
*
* @author 风里雾里
*/
@Mapper
public interface WfFormMapper extends BaseMapperX<WfForm> {
default PageResult<WfForm> selectPage(WfFormPageReqVO reqVO) {
return selectPage(reqVO, new QueryWrapperX<WfForm>()
.likeIfPresent("name", reqVO.getName())
.eqIfPresent("status", reqVO.getStatus())
.eqIfPresent("form_json", reqVO.getFormJson())
.eqIfPresent("remark", reqVO.getRemark())
.betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())
.orderByDesc("id") );
}
default List<WfForm> selectList(WfFormExportReqVO reqVO) {
return selectList(new QueryWrapperX<WfForm>()
.likeIfPresent("name", reqVO.getName())
.eqIfPresent("status", reqVO.getStatus())
.eqIfPresent("form_json", reqVO.getFormJson())
.eqIfPresent("remark", reqVO.getRemark())
.betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())
.orderByDesc("id") );
}
}

View File

@ -1,46 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.activiti.dal.mysql.oa;
import java.util.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.adminserver.modules.activiti.dal.dataobject.oa.OaLeaveDO;
import org.apache.ibatis.annotations.Mapper;
import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.*;
/**
* 请假申请 Mapper
*
* @author 芋艿
*/
@Mapper
public interface OaLeaveMapper extends BaseMapperX<OaLeaveDO> {
default PageResult<OaLeaveDO> selectPage(OaLeavePageReqVO reqVO) {
return selectPage(reqVO, new QueryWrapperX<OaLeaveDO>()
.eqIfPresent("process_instance_id", reqVO.getProcessInstanceId())
.eqIfPresent("status", reqVO.getStatus())
.eqIfPresent("user_id", reqVO.getUserId())
.betweenIfPresent("start_time", reqVO.getBeginStartTime(), reqVO.getEndStartTime())
.betweenIfPresent("end_time", reqVO.getBeginEndTime(), reqVO.getEndEndTime())
.eqIfPresent("leave_type", reqVO.getLeaveType())
.eqIfPresent("reason", reqVO.getReason())
.betweenIfPresent("apply_time", reqVO.getBeginApplyTime(), reqVO.getEndApplyTime())
.orderByDesc("id") );
}
default List<OaLeaveDO> selectList(OaLeaveExportReqVO reqVO) {
return selectList(new QueryWrapperX<OaLeaveDO>()
.eqIfPresent("process_instance_id", reqVO.getProcessInstanceId())
.eqIfPresent("status", reqVO.getStatus())
.eqIfPresent("user_id", reqVO.getUserId())
.betweenIfPresent("start_time", reqVO.getBeginStartTime(), reqVO.getEndStartTime())
.betweenIfPresent("end_time", reqVO.getBeginEndTime(), reqVO.getEndEndTime())
.eqIfPresent("leave_type", reqVO.getLeaveType())
.eqIfPresent("reason", reqVO.getReason())
.betweenIfPresent("apply_time", reqVO.getBeginApplyTime(), reqVO.getEndApplyTime())
.orderByDesc("id") );
}
}

View File

@ -1,13 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.activiti.enums;
import cn.iocoder.yudao.framework.common.exception.ErrorCode;
/**
* activiti 系统 错误码枚举类
*
* 003 activiti
* 001 oa
* activiti 系统,使用 1-003-000-000 段
*/
public interface OaErrorCodeConstants {
ErrorCode LEAVE_NOT_EXISTS = new ErrorCode(1003001001, "请假申请不存在");
}

View File

@ -1,14 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.activiti.enums.form;
import cn.iocoder.yudao.framework.common.exception.ErrorCode;
/**
* activiti 系统 错误码枚举类
*
* 003 activiti
* 001 oa
* activiti 系统,使用 1-003-000-000 段
*/
public interface WfFormErrorCodeConstants {
ErrorCode FORM_NOT_EXISTS = new ErrorCode(1003001002, "动态表单不存在");
}

View File

@ -1,2 +0,0 @@
// TODO @芋艿:思考下 activiti、oa 的定位,边界,模块的拆分
package cn.iocoder.yudao.adminserver.modules.activiti;

View File

@ -1,62 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.activiti.service.config;
import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysPostService;
import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService;
import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.security.core.LoginUser;
import org.activiti.api.runtime.shared.identity.UserGroupManager;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
import static java.util.Collections.singleton;
@Service
public class UserGroupManagerService implements UserGroupManager {
@Resource
private UserDetailsService userDetailsService;
@Resource
private SysUserService userService;
@Resource
private SysPostService sysPostService;
/**
* 暂时使用岗位来代替
* @param userId
* @return
*/
@Override
public List<String> getUserGroups(String userId) {
// final LoginUser loginUser = (LoginUser) userDetailsService.loadUserByUsername(userId);
// final Long id = loginUser.getId();
final SysUserDO user = userService.getUserByUsername(userId);
return sysPostService.getPosts(user.getPostIds()).stream().map(post -> post.getCode()).collect(Collectors.toList());
}
@Override
public List<String> getUserRoles(String userId) {
return Arrays.asList("ROLE_ACTIVITI_USER");
}
@Override
public List<String> getGroups() {
throw new UnsupportedOperationException("getGroups is now un supported");
}
@Override
public List<String> getUsers() {
throw new UnsupportedOperationException("getGroups is now un supported");
}
}

View File

@ -1,31 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.activiti.service.config;
import cn.iocoder.yudao.framework.security.core.LoginUser;
import org.activiti.api.runtime.shared.security.PrincipalGroupsProvider;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Service;
import java.security.Principal;
import java.util.Collections;
import java.util.List;
@Service
public class UserGroupsProvider implements PrincipalGroupsProvider {
@Override
public List<String> getGroups(Principal principal) {
if(principal instanceof Authentication){
Authentication authentication = (Authentication) principal;
final Object user = authentication.getPrincipal();
if( user instanceof LoginUser){
return ((LoginUser) user).getGroups();
}else{
return Collections.emptyList();
}
}else{
return Collections.emptyList();
}
}
}

View File

@ -1,75 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.activiti.service.form;
import cn.iocoder.yudao.adminserver.modules.activiti.controller.form.vo.WfFormCreateReqVO;
import cn.iocoder.yudao.adminserver.modules.activiti.controller.form.vo.WfFormExportReqVO;
import cn.iocoder.yudao.adminserver.modules.activiti.controller.form.vo.WfFormPageReqVO;
import cn.iocoder.yudao.adminserver.modules.activiti.controller.form.vo.WfFormUpdateReqVO;
import cn.iocoder.yudao.adminserver.modules.activiti.dal.dataobject.form.WfForm;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import java.util.*;
import javax.validation.*;
/**
* 动态表单 Service 接口
*
* TODO @风里雾里
*/
public interface WfFormService {
/**
* 创建动态表单
*
* @param createReqVO 创建信息
* @return 编号
*/
Long createForm(@Valid WfFormCreateReqVO createReqVO);
/**
* 更新动态表单
*
* @param updateReqVO 更新信息
*/
void updateForm(@Valid WfFormUpdateReqVO updateReqVO);
/**
* 删除动态表单
*
* @param id 编号
*/
void deleteForm(Long id);
/**
* 获得动态表单
*
* @param id 编号
* @return 动态表单
*/
WfForm getForm(Long id);
/**
* 获得动态表单列表
*
* @param ids 编号
* @return 动态表单列表
*/
List<WfForm> getFormList(Collection<Long> ids);
/**
* 获得动态表单分页
*
* @param pageReqVO 分页查询
* @return 动态表单分页
*/
PageResult<WfForm> getFormPage(WfFormPageReqVO pageReqVO);
/**
* 获得动态表单列表, 用于 Excel 导出
*
* @param exportReqVO 查询条件
* @return 动态表单列表
*/
List<WfForm> getFormList(WfFormExportReqVO exportReqVO);
}

View File

@ -1,86 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.activiti.service.form.impl;
import cn.iocoder.yudao.adminserver.modules.activiti.controller.form.vo.WfFormCreateReqVO;
import cn.iocoder.yudao.adminserver.modules.activiti.controller.form.vo.WfFormExportReqVO;
import cn.iocoder.yudao.adminserver.modules.activiti.controller.form.vo.WfFormPageReqVO;
import cn.iocoder.yudao.adminserver.modules.activiti.controller.form.vo.WfFormUpdateReqVO;
import cn.iocoder.yudao.adminserver.modules.activiti.convert.form.WfFormConvert;
import cn.iocoder.yudao.adminserver.modules.activiti.dal.dataobject.form.WfForm;
import cn.iocoder.yudao.adminserver.modules.activiti.dal.mysql.form.WfFormMapper;
import cn.iocoder.yudao.adminserver.modules.activiti.service.form.WfFormService;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.util.Collection;
import java.util.List;
import static cn.iocoder.yudao.adminserver.modules.activiti.enums.form.WfFormErrorCodeConstants.FORM_NOT_EXISTS;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
/**
* 动态表单 Service 实现类
*
* TODO @风里雾里
*/
@Service
@Validated
public class WfFormServiceImpl implements WfFormService {
@Resource
private WfFormMapper formMapper;
@Override
public Long createForm(WfFormCreateReqVO createReqVO) {
// 插入
WfForm form = WfFormConvert.INSTANCE.convert(createReqVO);
formMapper.insert(form);
// 返回
return form.getId();
}
@Override
public void updateForm(WfFormUpdateReqVO updateReqVO) {
// 校验存在
this.validateFormExists(updateReqVO.getId());
// 更新
WfForm updateObj = WfFormConvert.INSTANCE.convert(updateReqVO);
formMapper.updateById(updateObj);
}
@Override
public void deleteForm(Long id) {
// 校验存在
this.validateFormExists(id);
// 删除
formMapper.deleteById(id);
}
private void validateFormExists(Long id) {
if (formMapper.selectById(id) == null) {
throw exception(FORM_NOT_EXISTS);
}
}
@Override
public WfForm getForm(Long id) {
return formMapper.selectById(id);
}
@Override
public List<WfForm> getFormList(Collection<Long> ids) {
return formMapper.selectBatchIds(ids);
}
@Override
public PageResult<WfForm> getFormPage(WfFormPageReqVO pageReqVO) {
return formMapper.selectPage(pageReqVO);
}
@Override
public List<WfForm> getFormList(WfFormExportReqVO exportReqVO) {
return formMapper.selectList(exportReqVO);
}
}

View File

@ -1,76 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.activiti.service.oa;
import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.OaLeaveCreateReqVO;
import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.OaLeaveExportReqVO;
import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.OaLeavePageReqVO;
import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.OaLeaveUpdateReqVO;
import cn.iocoder.yudao.adminserver.modules.activiti.dal.dataobject.oa.OaLeaveDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import javax.validation.Valid;
import java.util.Collection;
import java.util.List;
/**
* 请假申请 Service 接口
*
* @author 芋艿
*/
public interface OaLeaveService {
/**
* 创建请假申请
*
* @param createReqVO 创建信息
* @return 编号
*/
Long createLeave(@Valid OaLeaveCreateReqVO createReqVO);
/**
* 更新请假申请
*
* @param updateReqVO 更新信息
*/
void updateLeave(@Valid OaLeaveUpdateReqVO updateReqVO);
/**
* 删除请假申请
*
* @param id 编号
*/
void deleteLeave(Long id);
/**
* 获得请假申请
*
* @param id 编号
* @return 请假申请
*/
OaLeaveDO getLeave(Long id);
/**
* 获得请假申请列表
*
* @param ids 编号
* @return 请假申请列表
*/
List<OaLeaveDO> getLeaveList(Collection<Long> ids);
/**
* 获得请假申请分页
*
* @param pageReqVO 分页查询
* @return 请假申请分页
*/
PageResult<OaLeaveDO> getLeavePage(OaLeavePageReqVO pageReqVO);
/**
* 获得请假申请列表, 用于 Excel 导出
*
* @param exportReqVO 查询条件
* @return 请假申请列表
*/
List<OaLeaveDO> getLeaveList(OaLeaveExportReqVO exportReqVO);
}

View File

@ -1,43 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.activiti.service.oa;
import cn.iocoder.yudao.adminserver.modules.activiti.dal.dataobject.oa.OaLeaveDO;
import cn.iocoder.yudao.adminserver.modules.activiti.dal.mysql.oa.OaLeaveMapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.ExecutionListener;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
@Component
public class ReportBackEndProcessor implements ExecutionListener {
@Resource
private OaLeaveMapper leaveMapper;
// @Override
// @Transactional(rollbackFor = Exception.class)
// public void notify(DelegateTask delegateTask) {
// final String businessKey = delegateTask.getExecution().getProcessInstanceBusinessKey();
// UpdateWrapper<OaLeaveDO> updateWrapper = new UpdateWrapper<>();
// updateWrapper.eq("id", Long.valueOf(businessKey));
// OaLeaveDO updateDo = new OaLeaveDO();
// updateDo.setStatus(2);
// leaveMapper.update(updateDo, updateWrapper);
// }
@Override
@Transactional(rollbackFor = Exception.class)
public void notify(DelegateExecution delegateExecution) {
final String businessKey = delegateExecution.getProcessInstanceBusinessKey();
// TODO @jsonservice 不要出现 dao 的元素,例如说 UpdateWrapper。这里我们可以调用 updateById 方法
UpdateWrapper<OaLeaveDO> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("id", Long.valueOf(businessKey));
OaLeaveDO updateDo = new OaLeaveDO();
updateDo.setStatus(2); // TODO @jsonstatus 要枚举起来,不要出现 magic number
leaveMapper.update(updateDo, updateWrapper);
}
}

View File

@ -1,141 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.activiti.service.oa.impl;
import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.OaLeaveCreateReqVO;
import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.OaLeaveExportReqVO;
import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.OaLeavePageReqVO;
import cn.iocoder.yudao.adminserver.modules.activiti.controller.oa.vo.OaLeaveUpdateReqVO;
import cn.iocoder.yudao.adminserver.modules.activiti.convert.oa.OaLeaveConvert;
import cn.iocoder.yudao.adminserver.modules.activiti.dal.dataobject.oa.OaLeaveDO;
import cn.iocoder.yudao.adminserver.modules.activiti.dal.mysql.oa.OaLeaveMapper;
import cn.iocoder.yudao.adminserver.modules.activiti.service.oa.OaLeaveService;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import org.activiti.api.task.model.Task;
import org.activiti.api.task.model.builders.TaskPayloadBuilder;
import org.activiti.api.task.runtime.TaskRuntime;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.runtime.ProcessInstance;
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.HashMap;
import java.util.List;
import java.util.Map;
import static cn.iocoder.yudao.adminserver.modules.activiti.enums.OaErrorCodeConstants.LEAVE_NOT_EXISTS;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
/**
* 请假申请 Service 实现类
*
* @author 芋艿
*/
@Service
@Validated
public class OaLeaveServiceImpl implements OaLeaveService {
@Resource
private OaLeaveMapper leaveMapper;
@Resource
private RuntimeService runtimeService;
@Resource
private org.activiti.engine.TaskService activitiTaskService;
@Resource
private TaskRuntime taskRuntime;
@Override
@Transactional(rollbackFor = Exception.class)
public Long createLeave(OaLeaveCreateReqVO createReqVO) {
// 插入 OA 请假单
OaLeaveDO leave = OaLeaveConvert.INSTANCE.convert(createReqVO);
leave.setStatus(1);
leave.setUserId(SecurityFrameworkUtils.getLoginUser().getUsername());
leaveMapper.insert(leave);
// 创建工作流
Map<String, Object> variables = new HashMap<>();
// 如何得到部门领导人,暂时写死
variables.put("deptLeader", "admin"); // TODO @芋艿:需要部门的负责人
Long id = leave.getId();
String businessKey = String.valueOf(id);
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(createReqVO.getProcessKey(), businessKey, variables);
String processInstanceId = processInstance.getProcessInstanceId();
// TODO @jsonservice 不要出现 dao 的元素,例如说 UpdateWrapper。这里我们可以调用 updateById 方法
// 将工作流的编号,更新到 OA 请假单中
UpdateWrapper<OaLeaveDO> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("id", id);
OaLeaveDO updateDo = new OaLeaveDO();
updateDo.setProcessInstanceId(processInstanceId);
leaveMapper.update(updateDo, updateWrapper);
return id;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void updateLeave(OaLeaveUpdateReqVO updateReqVO) {
// 校验存在
this.validateLeaveExists(updateReqVO.getId());
final Task task = taskRuntime.task(updateReqVO.getTaskId());
activitiTaskService.addComment(task.getId(), task.getProcessInstanceId(), updateReqVO.getComment());
Map<String, Object> variables = updateReqVO.getVariables();
//如何得到部门领导人, 暂时写死
variables.put("deptLeader", "admin");
taskRuntime.complete(TaskPayloadBuilder.complete().withTaskId(task.getId())
.withVariables(variables)
.build());
// TODO @jason不需要加 final 哈。虽然是不变,但是代码比较少这么去写
final Object reApply = variables.get("reApply");
// TODO @jason直接使用 Objects.equals(reApply, true) 就可以
if((reApply instanceof Boolean) && (Boolean)reApply){
// 更新 表单
OaLeaveDO updateObj = OaLeaveConvert.INSTANCE.convert(updateReqVO);
leaveMapper.updateById(updateObj);
}
}
@Override
public void deleteLeave(Long id) {
// 校验存在
this.validateLeaveExists(id);
// 删除
leaveMapper.deleteById(id);
// TODO @jason需要调用 runtimeService 的 delete 方法,删除???
}
private void validateLeaveExists(Long id) {
if (leaveMapper.selectById(id) == null) {
throw exception(LEAVE_NOT_EXISTS);
}
}
@Override
public OaLeaveDO getLeave(Long id) {
return leaveMapper.selectById(id);
}
@Override
public List<OaLeaveDO> getLeaveList(Collection<Long> ids) {
return leaveMapper.selectBatchIds(ids);
}
@Override
public PageResult<OaLeaveDO> getLeavePage(OaLeavePageReqVO pageReqVO) {
return leaveMapper.selectPage(pageReqVO);
}
@Override
public List<OaLeaveDO> getLeaveList(OaLeaveExportReqVO exportReqVO) {
return leaveMapper.selectList(exportReqVO);
}
}

View File

@ -1,29 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.activiti.service.process;
import org.springframework.web.multipart.MultipartFile;
/**
* 流程基础管理
*
* @author ZJQ
* @date 2021/9/5 21:00
*/
public interface ProcessService {
/**
* 上传流程文件,进行流程模型部署
* @param multipartFile 上传文件
*/
void deployProcess(MultipartFile multipartFile);
/**
* 激活或者挂起流程模型实体
* @param processDefinitionId 流程模型实体id
* @param type 类型
* @return 状态
*/
String setActivOrHang(String processDefinitionId,String type);
}

View File

@ -1,109 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.activiti.service.process.impl;
import cn.iocoder.yudao.adminserver.modules.activiti.service.process.ProcessService;
import lombok.extern.slf4j.Slf4j;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.apache.commons.io.FilenameUtils;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.zip.ZipInputStream;
import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.FILE_UPLOAD_FAILED;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
/**
* 流程基础管理
*
* @author ZJQ
* @date 2021/9/5 21:04
*/
@Service
@Slf4j
public class ProcessServiceImpl implements ProcessService {
private static final String BPMN20_XML = "bpmn20.xml";
@Resource
private RepositoryService repositoryService;
/**
* 上传流程文件,进行流程部署
* @param multipartFile 上传文件
*/
@Override
public void deployProcess(MultipartFile multipartFile) {
String fileName = multipartFile.getOriginalFilename();
try (InputStream inputStream = multipartFile.getInputStream()){
Deployment deployment = getDeplymentByType(inputStream,fileName);
//获取部署成功的流程模型
List<ProcessDefinition> processDefinitions = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).list();
processDefinitions.forEach((processDefinition)->{
//设置线上部署流程模型名字
String proDefId = processDefinition.getId();
repositoryService.setProcessDefinitionCategory(proDefId,fileName);
log.info("流程文件部署成功流程ID="+proDefId);
});
} catch (IOException e) {
log.error("流程部署出现异常"+e);
}
}
/**
* 激活或者挂起流程模型实体
* @param processDefinitionId 流程模型实体id
* @param type 类型
* @return 提示
*/
@Override
public String setActivOrHang(String processDefinitionId, String type) {
String result = "无操作";
switch (type){
case "active":
repositoryService.activateProcessDefinitionById(processDefinitionId,true,null);
result = "已激活ID为【"+processDefinitionId+"】的流程模型实例";
break;
case "suspend":
repositoryService.suspendProcessDefinitionById(processDefinitionId,true,null);
result = "已挂起ID为【"+processDefinitionId+"】的流程模型实例";
break;
default:
break;
}
return result;
}
/**
* 根据上传文件类型对应实现不同方式的流程部署
* @param inputStream 文件输入流
* @param fileName 文件名
* @return 文件部署流程
*/
public Deployment getDeplymentByType(InputStream inputStream,String fileName){
Deployment deployment;
String type = FilenameUtils.getExtension(fileName);
switch (type){
case "bpmn":
String baseName = FilenameUtils.getBaseName(fileName);
deployment = repositoryService.createDeployment().addInputStream(baseName+"."+BPMN20_XML,inputStream).deploy();
break;
case "png":
deployment = repositoryService.createDeployment().addInputStream(fileName,inputStream).deploy();
break;
case "zip":
case "bar":
ZipInputStream zipInputStream = new ZipInputStream(inputStream);
deployment = repositoryService.createDeployment().addZipInputStream(zipInputStream).deploy();
break;
default:
throw exception(FILE_UPLOAD_FAILED);
}
return deployment;
}
}

View File

@ -1,26 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.activiti.service.workflow;
import cn.iocoder.yudao.adminserver.modules.activiti.controller.workflow.vo.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import java.util.List;
// TODO @芋艿:前缀,注释
public interface TaskService {
PageResult<TodoTaskRespVO> getTodoTaskPage(TodoTaskPageReqVO pageReqVO);
void claimTask(String taskId);
void getTaskHistory(String taskId);
void completeTask(TaskReqVO taskReq);
// void flowImage(String taskId, HttpServletResponse response);
TaskHandleVO getTaskSteps(TaskQueryReqVO taskQuery);
List<TaskStepVO> getHistorySteps(String processInstanceId);
TodoTaskRespVO getTaskFormKey(TaskQueryReqVO taskQuery);
}

View File

@ -1,266 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.activiti.service.workflow.impl;
import cn.iocoder.yudao.adminserver.modules.activiti.controller.workflow.vo.*;
import cn.iocoder.yudao.adminserver.modules.activiti.dal.mysql.oa.OaLeaveMapper;
import cn.iocoder.yudao.adminserver.modules.activiti.service.workflow.TaskService;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.security.core.LoginUser;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import com.google.common.collect.ImmutableMap;
import org.activiti.api.runtime.shared.query.Page;
import org.activiti.api.runtime.shared.query.Pageable;
import org.activiti.api.task.model.Task;
import org.activiti.api.task.model.builders.ClaimTaskPayloadBuilder;
import org.activiti.api.task.model.builders.TaskPayloadBuilder;
import org.activiti.api.task.runtime.TaskRuntime;
import org.activiti.engine.HistoryService;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.task.Comment;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
@Service
public class TaskServiceImpl implements TaskService {
@Resource
private TaskRuntime taskRuntime;
@Resource
private org.activiti.engine.TaskService activitiTaskService;
@Resource
private HistoryService historyService;
@Resource
private RepositoryService repositoryService;
@Resource
private OaLeaveMapper leaveMapper;
private static Map<String,String> taskVariable = ImmutableMap.<String,String>builder()
.put("deptLeaderVerify","deptLeaderApproved")
.put("hrVerify","hrApproved")
.build();
public TaskServiceImpl() {
}
@Override
public PageResult<TodoTaskRespVO> getTodoTaskPage(TodoTaskPageReqVO pageReqVO) {
final LoginUser loginUser = SecurityFrameworkUtils.getLoginUser();
// TODO @jason封装一个方法用于转换成 activiti 的分页对象
final Pageable pageable = Pageable.of((pageReqVO.getPageNo() - 1) * pageReqVO.getPageSize(), pageReqVO.getPageSize());
Page<Task> pageTasks = taskRuntime.tasks(pageable);
// TODO @jasonconvert 里转换
List<Task> tasks = pageTasks.getContent();
int totalItems = pageTasks.getTotalItems();
final List<TodoTaskRespVO> respVOList = tasks.stream().map(task -> {
TodoTaskRespVO respVO = new TodoTaskRespVO();
respVO.setId(task.getId());
final ProcessDefinition definition = repositoryService.getProcessDefinition(task.getProcessDefinitionId());
respVO.setProcessName(definition.getName());
respVO.setProcessKey(definition.getKey());
respVO.setBusinessKey(task.getBusinessKey());
respVO.setStatus(task.getAssignee() == null ? 1 : 2);
return respVO;
}).collect(Collectors.toList());
// TODO @jason要注意泛型哈。
return new PageResult(respVOList, Long.valueOf(totalItems)); // TODO @jason(long) 转换即可
}
@Override
public void claimTask(String taskId) {
taskRuntime.claim(new ClaimTaskPayloadBuilder()
.withTaskId(taskId)
.withAssignee(SecurityFrameworkUtils.getLoginUser().getUsername())
.build());
}
@Override
public void getTaskHistory(String taskId) {
final List<HistoricProcessInstance> list = historyService.createHistoricProcessInstanceQuery().
processInstanceId("8e2801fc-1a38-11ec-98ce-74867a13730f").list();
}
// TODO @jason一个方法里会有多个方法的调用最好写下对应的注释。这样容易理解
@Override
@Transactional
public void completeTask(TaskReqVO taskReq) {
final Task task = taskRuntime.task(taskReq.getTaskId());
final Map<String, Object> variables = taskReq.getVariables();
activitiTaskService.addComment(taskReq.getTaskId(), task.getProcessInstanceId(), taskReq.getComment());
taskRuntime.complete(TaskPayloadBuilder.complete().withTaskId(taskReq.getTaskId())
.withVariables(taskReq.getVariables())
.build());
// if(variables.containsValue(Boolean.FALSE)){
// final String businessKey = task.getBusinessKey();
// UpdateWrapper<OaLeaveDO> updateWrapper = new UpdateWrapper<>();
// updateWrapper.eq("id", Long.valueOf(businessKey));
// OaLeaveDO updateDo = new OaLeaveDO();
// updateDo.setStatus(2);
// leaveMapper.update(updateDo, updateWrapper);
// }
}
// @Override
// public void flowImage(String taskId, HttpServletResponse response) {
//
// final Task task = taskRuntime.task(taskId);
// BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId());
// final Process process = bpmnModel.getMainProcess();
// ProcessDefinitionEntity processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(task.getProcessDefinitionId()).singleResult();
// List<String> activeActivityIds = runtimeService.getActiveActivityIds(executionId);
// List<String> highLightedFlows = getHighLightedFlows(processDefinition, processInstance.getId());
// ProcessDiagramGenerator diagramGenerator = processEngineConfiguration.getProcessDiagramGenerator();
// InputStream imageStream =diagramGenerator.generateDiagram(bpmnModel, "png", activeActivityIds, highLightedFlows);
//
// // 输出资源内容到相应对象
// byte[] b = new byte[1024];
// int len;
// while ((len = imageStream.read(b, 0, 1024)) != -1) {
// response.getOutputStream().write(b, 0, len);
// }
// }
@Override
public TaskHandleVO getTaskSteps(TaskQueryReqVO taskQuery) {
TaskHandleVO handleVO = new TaskHandleVO();
// String processKey = taskQuery.getProcessKey();
// if ("leave".equals(processKey)) {
// String businessKey = taskQuery.getBusinessKey();
// final OaLeaveDO leave = leaveMapper.selectById(Long.valueOf(businessKey));
// handleVO.setFormObject( OaLeaveConvert.INSTANCE.convert(leave));
// }
//
// final String taskDefKey = task.getTaskDefinitionKey();
// final String variableName = Optional.ofNullable(taskVariable.get(taskDefKey)).orElse("");
// handleVO.setTaskVariable(variableName);
final Task task = taskRuntime.task(taskQuery.getTaskId());
List<TaskStepVO> steps = getTaskSteps(task.getProcessInstanceId());
handleVO.setHistoryTask(steps);
return handleVO;
}
private List<TaskStepVO> getTaskSteps(String processInstanceId) {
// 获得已完成的活动
List<HistoricActivityInstance> finished = historyService.createHistoricActivityInstanceQuery()
.processInstanceId(processInstanceId)
.activityType("userTask")
.finished()
.orderByHistoricActivityInstanceStartTime().asc().list();
// 获得对应的步骤
List<TaskStepVO> steps = new ArrayList<>();
finished.forEach(instance -> {
// TODO @jason放到 convert 里
TaskStepVO step = new TaskStepVO();
step.setStepName(instance.getActivityName());
step.setStartTime(instance.getStartTime());
step.setEndTime(instance.getEndTime());
step.setAssignee(instance.getAssignee());
step.setStatus(1);
// TODO @jason一般判数组为空使用 CollUtil.isEmpty 会好点哈。另外null 时候,不用填写 "" 的哈
List<Comment> comments = activitiTaskService.getTaskComments(instance.getTaskId());
if (comments.size() > 0) {
step.setComment(comments.get(0).getFullMessage());
} else {
step.setComment("");
}
steps.add(step);
});
// 获得未完成的活动
List<HistoricActivityInstance> unfinished = historyService
.createHistoricActivityInstanceQuery()
.processInstanceId(processInstanceId)
.activityType("userTask")
.unfinished().list();
// 获得对应的步骤
// TODO @json其实已完成和未完成它们的 convert 的逻辑,是一致的
for (HistoricActivityInstance instance : unfinished) {
TaskStepVO step = new TaskStepVO();
step.setStepName(instance.getActivityName());
step.setStartTime(instance.getStartTime());
step.setEndTime(instance.getEndTime());
step.setAssignee(Optional.ofNullable(instance.getAssignee()).orElse(""));
step.setComment("");
step.setStatus(0);
steps.add(step);
}
return steps;
}
@Override
public List<TaskStepVO> getHistorySteps(String processInstanceId) {
return getTaskSteps(processInstanceId);
}
@Override
public TodoTaskRespVO getTaskFormKey(TaskQueryReqVO taskQuery) {
final Task task = taskRuntime.task(taskQuery.getTaskId());
// 转换结果
TodoTaskRespVO respVO = new TodoTaskRespVO();
respVO.setFormKey(task.getFormKey());
respVO.setBusinessKey(task.getBusinessKey());
respVO.setId(task.getId());
return respVO;
}
// private List<String> getHighLightedFlows(ProcessDefinitionEntity processDefinition, String processInstanceId) {
//
// List<String> highLightedFlows = new ArrayList<String>();
// List<HistoricActivityInstance> historicActivityInstances = historyService
// .createHistoricActivityInstanceQuery()
// .processInstanceId(processInstanceId)
// .orderByHistoricActivityInstanceStartTime().asc().list();
//
// List<String> historicActivityInstanceList = new ArrayList<String>();
// for (HistoricActivityInstance hai : historicActivityInstances) {
// historicActivityInstanceList.add(hai.getActivityId());
// }
// // add current activities to list
// List<String> highLightedActivities = runtimeService.getActiveActivityIds(processInstanceId);
// historicActivityInstanceList.addAll(highLightedActivities);
// activities and their sequence-flows
// for (ActivityImpl activity : processDefinition.getActivities()) {
// int index = historicActivityInstanceList.indexOf(activity.getId());
//
// if (index >= 0 && index + 1 < historicActivityInstanceList.size()) {
// List<PvmTransition> pvmTransitionList = activity
// .getOutgoingTransitions();
// for (PvmTransition pvmTransition : pvmTransitionList) {
// String destinationFlowId = pvmTransition.getDestination().getId();
// if (destinationFlowId.equals(historicActivityInstanceList.get(index + 1))) {
// highLightedFlows.add(pvmTransition.getId());
// }
// }
// }
// }
// return highLightedFlows;
// }
}

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,84 +0,0 @@
package cn.iocoder.yudao.adminserver.modules.infra.controller.file;
import cn.hutool.core.io.IoUtil;
import cn.iocoder.yudao.adminserver.modules.infra.service.file.InfFileService;
import cn.iocoder.yudao.adminserver.modules.infra.controller.file.vo.InfFilePageReqVO;
import cn.iocoder.yudao.coreservice.modules.infra.controller.file.vo.InfFileRespVO;
import cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.file.InfFileDO;
import cn.iocoder.yudao.coreservice.modules.infra.service.file.InfFileCoreService;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.adminserver.modules.infra.convert.file.InfFileConvert;
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;
@Resource
private InfFileCoreService fileCoreService;
@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(fileCoreService.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) {
fileCoreService.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 = fileCoreService.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,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;
}

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