Compare commits

...

770 Commits
v3.0 ... master

Author SHA1 Message Date
18536819133
4af1c07029 修改配置 2023-10-20 16:25:34 +08:00
songjinsheng
8918116dbd 测试 2022-06-22 15:43:23 +08:00
qdxkrs
1c16fc1d4a 添加基类 2022-05-20 14:18:53 +08:00
songjinsheng
95542bf4c9 Merge branch 'master' into test 2022-05-20 09:00:37 +08:00
songjinsheng
3598fafe66 Merge branch 'master' of https://gitee.com/y_project/RuoYi-Vue 2022-05-20 08:59:45 +08:00
songjinsheng
de1dd3a808 功能迭代 2022-05-20 08:56:41 +08:00
RuoYi
9c3b53b701 用户管理左侧树型组件增加选中高亮保持 2022-05-13 15:02:16 +08:00
songjinsheng
f2cb431c90 Merge branch 'master' of https://gitea.star-rising.cn/Song/xkrs_ms
# Conflicts:
#	ruoyi-admin/src/main/resources/application-druid.yml
#	ruoyi-admin/src/main/resources/application.yml
2022-05-11 17:27:34 +08:00
songjinsheng
9facc1b682 Merge branch 'master' of https://gitee.com/y_project/RuoYi-Vue 2022-05-11 16:40:50 +08:00
qdxkrs
93835778ad 修改配置 2022-05-11 16:40:13 +08:00
songjinsheng
8020eabaa9 更新 2022-05-11 15:58:35 +08:00
RuoYi
5693bbe1f5 升级oshi到最新版本6.1.6 2022-05-11 09:58:25 +08:00
RuoYi
0055f479cb 修复字典数据显示不全问题(I55MR3) 2022-05-09 20:27:09 +08:00
RuoYi
1c41b701dd 优化excel创建表格样式 2022-05-09 17:37:33 +08:00
RuoYi
9476f7f616 升级spring-boot到最新版本2.5.13 2022-05-01 20:22:35 +08:00
RuoYi
cbe405f6ea ui code format 2022-05-01 20:22:25 +08:00
RuoYi
7414bc492e 修改代码生成树选择组件 2022-04-25 10:27:06 +08:00
RuoYi
6f14087a16 修改显示顺序orderNum类型为整型 2022-04-25 10:23:47 +08:00
RuoYi
328d4b916d Excel注解支持color字体颜色 2022-04-23 20:53:16 +08:00
RuoYi
b42a8176ca 设置分页参数默认值 2022-04-17 10:29:12 +08:00
RuoYi
2a9beec31d 检查定时任务bean所在包名是否为白名单配置 2022-04-16 22:06:25 +08:00
RuoYi
910fe6261b 新增获取不带后缀文件名称方法 2022-04-16 22:06:15 +08:00
若依
0c820b96d8
!471 新增一个取文件名而不带后缀的整合方法,干净又卫生啊兄弟们
Merge pull request !471 from XCSDN/N/A
2022-04-16 13:53:10 +00:00
XCSDN
c3c49a05c2
新增一个取文件名而不带后缀的整合方法,干净又卫生啊兄弟们 2022-04-16 06:02:07 +00:00
RuoYi
68a616d7c7 升级element-ui到最新版本2.15.8 2022-04-15 09:32:21 +08:00
RuoYi
a0447de061 字典类型必须以字母开头,且只能为(小写字母,数字,下滑线) 2022-04-15 09:31:51 +08:00
若依
46db06a22b
!465 update ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictType.java.
Merge pull request !465 from XCSDN/N/A
2022-04-15 01:17:21 +00:00
RuoYi
de5ae4a05e 添加页签openPage支持传递参数 2022-04-08 15:42:10 +08:00
XCSDN
c0d430f4e5
update ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictType.java.
字典类型必须以字母开头,且字典类型只能由小写字母或加下划线还有数字组成
防止由于字典类型不符合前端开发规范而报错
2022-04-07 04:57:56 +00:00
RuoYi
d910888181 代码生成树表新增(展开/折叠) 2022-04-07 10:56:40 +08:00
RuoYi
db2dfee6ae 用户缓存信息添加部门ancestors祖级列表 2022-04-07 09:50:42 +08:00
RuoYi
d311d56bbf 修复Excel注解prompt/combo同时使用不生效问题 2022-04-03 18:28:30 +08:00
RuoYi
3bc5ef38d3 升级spring-boot到最新版本2.5.12 防止RCE漏洞 2022-04-02 10:16:09 +08:00
RuoYi
bac3b3a0dc 降级jsencrypt版本兼容IE浏览器 2022-04-02 10:15:25 +08:00
RuoYi
07fded4da9 update readme 2022-04-02 10:13:58 +08:00
RuoYi
a854e0ca8e 若依 3.8.2 2022-04-01 08:30:48 +08:00
RuoYi
de1766abde 新增清理分页的线程变量方法 2022-03-31 11:48:27 +08:00
RuoYi
01a566c794 升级spring-boot到最新版本2.5.11 2022-03-30 10:40:07 +08:00
RuoYi
5362a633e6 升级fastjson到最新版1.2.80 2022-03-30 10:39:47 +08:00
RuoYi
b2c3f45141 update registry source 2022-03-30 10:39:09 +08:00
RuoYi
d5f9b5b74a topNav自定义隐藏侧边栏路由 2022-03-30 10:38:51 +08:00
RuoYi
2043d1f439 优化IP地址获取到多个的问题 2022-03-27 14:36:48 +08:00
RuoYi
61034d4dde 优化导出excel单元格验证,包含变更为开头.防止正常内容被替换 2022-03-27 14:36:31 +08:00
RuoYi
6605bf35a8 reset pr 452 2022-03-26 17:28:58 +08:00
若依
b2b93e5060
!457 修改RedisCache方法形参命名
Merge pull request !457 from lu_ming/master
2022-03-26 09:25:05 +00:00
“lumingsyc”
098286fcaf 修改RedisCache方法形参命名 2022-03-25 18:50:51 +08:00
RuoYi
eaa12de740 添加新群号:167385320 2022-03-22 16:47:56 +08:00
RuoYi
857054179c 优化固定Header后顶部导航栏样式问题(I4XDN5) 2022-03-17 09:42:39 +08:00
若依
0a3fcfd9f4
!453 update ruoyi-ui/src/store/modules/user.js.
Merge pull request !453 from guxin0123/N/A
2022-03-16 05:19:33 +00:00
guxin0123
0271aa5414
update ruoyi-ui/src/store/modules/user.js.
修复数据库用户表 头像列为 null 时不显示默认头像问题
2022-03-16 04:52:33 +00:00
RuoYi
a0364f0758 优化菜单名称过长悬停显示标题 2022-03-15 14:24:52 +08:00
若依
ed693e89c9
!452 跨域问题
Merge pull request !452 from younger007/master
2022-03-15 06:23:38 +00:00
若依
526957e0ac
!447 优化:解决导出数据时,LocalDateTime类型数据导出没数据问题
Merge pull request !447 from 黄严/dev
2022-03-15 06:23:24 +00:00
younger007
420a43cdd5
update ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java.
和文件下载那边一样,存在跨域问题
2022-03-14 02:52:29 +00:00
coolkidhay
5e8ccda522 日期转换错误,issue地址:https://gitee.com/y_project/RuoYi-Vue/issues/I4X0U7 2022-03-09 14:39:19 +08:00
RuoYi
62fc38078c 修复遗漏的拼写错误 2022-03-09 10:05:39 +08:00
若依
bc4f844cd8
!445 文件上传兼容Weblogic环境
Merge pull request !445 from yaoozu/master
2022-03-09 02:03:50 +00:00
王耀祖
f15f8e3295 文件上传兼容Weblogic环境 2022-03-07 10:44:01 +08:00
RuoYi
6130bebbb3 开启TopNav没有子菜单情况隐藏侧边栏 2022-03-06 09:03:44 +08:00
若依
9f944c043f
!444 修改提示
Merge pull request !444 from SG/N/A
2022-03-05 14:11:22 +00:00
若依
092b3214c5
!443 修复代码错误,其他文件也修改下
Merge pull request !443 from SG/N/A
2022-03-05 14:11:17 +00:00
SG
07dfef48be
修改提示 2022-03-05 12:28:44 +00:00
疯狂的狮子Li
e9571fc2e2
fix 2022-03-05 05:06:39 +00:00
RuoYi
22f7ccc11d 修复导入Excel时字典字段类型为Long转义为空问题 2022-03-05 08:39:52 +08:00
SG
4bd5009ec1
修复代码错误,其他文件也修改下 2022-03-04 14:38:57 +00:00
RuoYi
cb8f5de5af 修复表单清除元素位置未垂直居中问题(I4V27B) 2022-03-04 19:24:28 +08:00
RuoYi
ac030b7275 优化Excel格式化不同类型的日期对象 2022-02-26 09:54:52 +08:00
RuoYi
9370747479 升级spring-boot到最新版本2.5.10 2022-02-26 09:48:17 +08:00
若依
45efd9290e
!438 fix: 服务监控中运行参数显示条件错误
Merge pull request !438 from fuzui/fix_args_show_condition
2022-02-26 01:06:48 +00:00
fuzui
96edba7eec fix: 服务监控中运行参数显示条件错误 2022-02-26 03:20:50 +08:00
RuoYi
927b05713a 组件fileUpload支持多文件同时选择上传 2022-02-25 11:51:29 +08:00
若依
8f23ff7274
!437 解决通用下载接口跨域问题
Merge pull request !437 from 兮陌/master
2022-02-25 03:49:36 +00:00
xueye
158e883e47 fix: 修复文件下载跨域问题 2022-02-25 10:40:29 +08:00
RuoYi
e62e8e372c 组件ImageUpload支持多图同时选择上传 2022-02-25 09:08:56 +08:00
RuoYi
bb65cd1976 代码生成子表支持日期/字典配置 2022-02-24 09:28:51 +08:00
若依
1086c00929
!436 优化部门管理页面email字段的表单验证多余的单引号
Merge pull request !436 from lu_ming/master
2022-02-23 12:46:09 +00:00
“lumingsyc”
9aaa9ce8aa 优化部门管理页面email字段的表单验证多余的单引号 2022-02-23 20:00:47 +08:00
RuoYi
cb5a6d29e2 页面若未匹配到字典标签则返回原字典值 2022-02-23 16:55:09 +08:00
RuoYi
4d8bd8805b 优化个人中心页面email字段的表单验证多余的单引号 2022-02-23 16:54:59 +08:00
RuoYi
c8c57b545a 优化菜单关键字导致的插件报错问题 2022-02-22 19:10:34 +08:00
RuoYi
d0f7a317e4 定时任务默认保存到内存中执行 2022-02-22 19:10:21 +08:00
RuoYi
aa9ed2e863 修复分页组件请求两次问题 2022-02-21 15:21:16 +08:00
RuoYi
54c6c4e547 服务监控新增运行参数信息显示 2022-02-20 16:06:33 +08:00
RuoYi
986b48cf36 升级pagehelper到最新版1.4.1 2022-02-20 16:05:04 +08:00
RuoYi
3bb9b03add 升级spring-boot-mybatis到最新版2.2.2 2022-02-20 16:04:40 +08:00
RuoYi
f05aa674ab 升级oshi到最新版本6.1.2 2022-02-20 16:04:25 +08:00
若依
965bdc9986
!431 修改登录超时刷新页面跳转登录页面还提示重新登录问题
Merge pull request !431 from 也曾为你、像超人/master
2022-02-19 09:08:50 +00:00
积硅步,至千里
e793138031 修改登录超时刷新页面跳转登录页面还提示重新登录问题 2022-02-17 17:16:11 +08:00
RuoYi
d734bfc34f 修复分页组件请求两次问题(I4SQOR) 2022-02-17 11:56:11 +08:00
疯狂的狮子Li
84fe0737de
update 更新uuid去除默认值 漏改 2022-02-16 08:53:11 +00:00
RuoYi
81630a096f 代码生成同步保留必填/类型选项 2022-02-13 21:06:28 +08:00
RuoYi
21780d8106 优化代码 2022-02-13 21:06:18 +08:00
RuoYi
b7b4364db2 代码生成编辑修改打开新页签 2022-02-12 13:14:09 +08:00
RuoYi
d9859de756 代码优化 2022-02-12 13:13:04 +08:00
若依
5e6fd0d1e1
!429 修复自定义组件file-upload无法显示第一个文件,列表显示的文件比实际文件少一个的问题
Merge pull request !429 from hjk2008/master
2022-02-12 03:56:02 +00:00
若依
a91d7cdd72
!428 删除方法无返回值时,方法注释上的@return,StringBuilder append() 改为链式调用
Merge pull request !428 from 我的世界有我/master
2022-02-12 03:55:12 +00:00
若依
d00dc3b03a
!426 修正单词拼写错误
Merge pull request !426 from 稚屿/master
2022-02-12 03:54:13 +00:00
若依
f5c69bae30
!425 优化默认值的问题,Model中不建议有默认值的逻辑
Merge pull request !425 from Yancey/default_value_optimization
2022-02-12 03:53:29 +00:00
若依
89fe17f419
!424 update .gitignore.
Merge pull request !424 from oo0oo/N/A
2022-02-12 03:53:06 +00:00
sam
c491257359 修复自定义组件file-upload无法显示第一个文件,列表显示的文件比实际文件少一个的问题 2022-02-12 08:46:12 +08:00
caohong
dd5e514d92 StringBuilder append方法改为链式调用 2022-02-11 10:06:07 +08:00
caohong
2532e40f9c 删除方法无返回值时,方法注释上的@return 2022-02-11 10:05:01 +08:00
RuoYi
50236ae4e5 修复Xss注解字段值为空时的异常问题 2022-02-10 17:17:51 +08:00
稚屿
c99eb98001 代码优化 2022-02-09 09:10:50 +08:00
稚屿
a29201a248 修正单词拼写错误 2022-02-09 08:46:54 +08:00
Yancey
6f0c59d7be 优化默认值的问题,Model中不建议有默认值的逻辑。 2022-02-09 00:27:51 +08:00
oo0oo
a6ed5667ab
update .gitignore.
添加JRebel工具rebel.xml文件规则至gitignore
2022-02-01 02:24:49 +00:00
RuoYi
612c4293d1 用户访问控制时校验数据权限,防止越权 2022-01-27 12:05:04 +08:00
RuoYi
8007b22b85 导出Excel时屏蔽公式,防止CSV注入风险 2022-01-27 12:04:40 +08:00
RuoYi
35664d818d update ry.bat 2022-01-27 12:04:21 +08:00
RuoYi
1fe08f49c7 升级spring-boot到最新版本2.5.9 2022-01-23 10:56:41 +08:00
wind
48b007543a
fix css class name 2022-01-22 14:05:44 +00:00
RuoYi
dccb3ac6c6 修复选项卡点击右键刷新丢失参数问题 2022-01-18 11:29:31 +08:00
若依
89cd2106ed
!416 update ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobController.java.
Merge pull request !416 from SG/N/A
2022-01-18 03:25:31 +00:00
若依
74f991b8c5
!414 优化任务队列满时任务拒绝策略
Merge pull request !414 from root/master
2022-01-18 03:20:23 +00:00
SG
a966b95a5b
update ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobController.java.
修正文字
2022-01-14 09:24:15 +00:00
mingliangyang
15f05b602f fix ruoyi-vue3下点击编辑,取消修改报错问题 2022-01-14 16:26:03 +08:00
mingliangyang
9e51d3f250 优化任务队列满时任务拒绝策略 2022-01-14 11:54:46 +08:00
RuoYi
d7ca248bc8 update copyright 2022 2022-01-14 11:47:25 +08:00
RuoYi
3980b2f2ff 定时任务屏蔽违规的字符 2022-01-14 11:47:14 +08:00
RuoYi
bed9fcea46 优化加载字典缓存数据 2022-01-14 11:46:51 +08:00
RuoYi
b1b82857ba 优化字段更新未同步 2022-01-14 11:46:05 +08:00
RuoYi
869dcf73f8 Vue3前端代码生成模板同步到最新 2022-01-11 17:20:50 +08:00
若依
96a34d1ad7
!409 翻页组件多了一个 :p 导致生成代码无法翻页
Merge pull request !409 from guxin0123/master
2022-01-11 09:17:31 +00:00
guxin0123
766361ac83
update ruoyi-generator/src/main/resources/vm/vue/v3/index.vue.vm.
翻页组件多了一个 :p 导致生成代码无法翻页
2022-01-11 04:57:26 +00:00
RuoYi
9bd7509e87 添加新群号:264312783 2022-01-11 09:02:16 +08:00
RuoYi
9f7acd4cf9 优化部门修改缩放后出现的错位问题 2022-01-08 09:23:45 +08:00
RuoYi
eb11337f7d 添加遗漏的分页参数合理化属性 2022-01-07 13:09:58 +08:00
RuoYi
d2872539e3 修正文字错误 2022-01-07 13:08:51 +08:00
RuoYi
1a5b024df6 定时任务目标字符串验证包名白名单 2022-01-06 14:50:56 +08:00
RuoYi
578d65dfb4 定时任务目标字符串过滤特殊字符 2022-01-05 14:56:05 +08:00
RuoYi
db4c2d3dd5 代码生成列表图片支持预览 2022-01-04 20:27:08 +08:00
RuoYi
47842a1611 update donate 2022-01-04 20:26:49 +08:00
若依
f4f4cd9b1f
Create FUNDING.yml 2022-01-04 19:50:01 +08:00
RuoYi
b7452cc281 update README.md 2022-01-04 10:49:59 +08:00
RuoYi
8ba91fc9dd 优化查询用户详细信息 2022-01-04 09:10:49 +08:00
RuoYi
c8d9b3f8fc 前端支持设置是否需要防止数据重复提交 2022-01-02 10:37:09 +08:00
RuoYi
c9d19cbe56 空值不进行回显数据字典 2022-01-02 10:29:15 +08:00
RuoYi
10ae0bce65 用户修改减少一次角色列表关联查询 2022-01-01 09:50:35 +08:00
RuoYi
7bc15245aa 预览组件支持多图显示 2022-01-01 09:46:18 +08:00
RuoYi
cb6228800b 代码生成新增Java类型Boolean 2022-01-01 09:28:52 +08:00
RuoYi
6ef899d000 修复登录失效后多次请求提示多次弹窗问题 2021-12-31 10:03:54 +08:00
RuoYi
6353f4ff09 若依 3.8.1 2021-12-31 00:00:06 +08:00
RuoYi
bb1af390a7 升级log4j2到2.17.1,防止漏洞风险 2021-12-30 14:41:25 +08:00
RuoYi
f65cd6245d 防重复提交标识组合(key + url + header) 2021-12-30 14:14:40 +08:00
RuoYi
530b2a51d5 修改单词拼写错误 2021-12-30 14:13:38 +08:00
RuoYi
d51e7cbb51 用户管理部门查询选择节点后分页参数初始 2021-12-29 11:04:09 +08:00
若依
f244fe1855 !395 fix https://gitee.com/y_project/RuoYi-Vue/issues/I4O5WD
Merge pull request !395 from 马小法/master
2021-12-29 02:14:26 +00:00
马小法
1294f68265 fix https://gitee.com/y_project/RuoYi-Vue/issues/I4O5WD 2021-12-27 15:33:22 +08:00
RuoYi
0e771a6c1b 升级spring-boot到最新版本2.5.8 2021-12-27 12:38:59 +08:00
RuoYi
e4df0c6da1 优化代码生成字典组重复问题 2021-12-24 14:51:33 +08:00
RuoYi
7b23b6db6f 升级oshi到最新版本v5.8.6 2021-12-24 12:00:29 +08:00
RuoYi
be412faf6c 升级fastjson到最新版1.2.79 2021-12-21 13:32:40 +08:00
RuoYi
fd3a699ad8 SQL工具类新增检查关键字方法 2021-12-21 13:32:28 +08:00
RuoYi
c28aa299bd 新增使用Gzip解压缩静态文件地址 2021-12-20 14:25:52 +08:00
RuoYi
a028b566ed 集成compression-webpack-plugin插件实现打包Gzip压缩 2021-12-20 09:46:17 +08:00
RuoYi
ca2405c104 升级log4j2到安全版本,防止漏洞风险 2021-12-19 19:56:53 +08:00
RuoYi
e5647793ce 路由支持单独配置菜单或角色权限 2021-12-18 16:48:31 +08:00
RuoYi
903b5aebca 新增图片预览组件 2021-12-18 12:23:59 +08:00
RuoYi
7492dcc9e6 请求分页方法设置成通用方便灵活调用 2021-12-18 12:22:41 +08:00
RuoYi
8978012f9d 修复打包后字体图标偶现的乱码问题 2021-12-17 11:36:15 +08:00
若依
7cf4a5da87 !391 修改重置表单bug
Merge pull request !391 from 18297093310/jieoschina-master-patch-51652
2021-12-17 03:17:16 +00:00
18297093310
47b67331d4
修改重置表单bug 2021-12-17 03:06:25 +00:00
RuoYi
6e14601c7c 修复版本差异导致的懒加载报错问题 2021-12-16 16:34:20 +08:00
RuoYi
fef7ead0d5 新增Vue3前端代码生成模板 2021-12-16 09:51:11 +08:00
RuoYi
06aef0587a 用户导入提示溢出则显示滚动条 2021-12-16 09:50:26 +08:00
若依
bf7c259cdd !390 fix: cron组件中周回显bug
Merge pull request !390 from fuzui/fix_week_echo_in_cron_component
2021-12-16 01:45:14 +00:00
fuzui
43d76e5990 fix: cron组件中周回显bug 2021-12-16 02:18:48 +08:00
RuoYi
d365a52cd6 自定义xss校验注解实现 2021-12-15 10:50:10 +08:00
RuoYi
e1c7115d8c 升级log4j2到安全版本,防止漏洞风险 2021-12-14 12:09:57 +08:00
RuoYi
bb4d75aff0 升级log4j2到安全版本,防止漏洞风险 2021-12-14 10:33:25 +08:00
RuoYi
2743785aaf 修复多参数逗号分隔的问题 2021-12-13 10:11:34 +08:00
RuoYi
2a235917dc 优化下载解析blob异常提示 2021-12-10 10:03:25 +08:00
RuoYi
44ce6774dc 代码生成预览支持复制内容 2021-12-09 09:57:02 +08:00
RuoYi
b911d7f78f 自定义文字复制剪贴指令 2021-12-09 09:56:11 +08:00
RuoYi
4644176e26 升级clipboard到最新版本2.0.8 2021-12-09 09:52:44 +08:00
RuoYi
850b98337b 修正用户分配角色属性错误 2021-12-06 20:58:10 +08:00
若依
7f2921f26b !382 update 优化查询用户的角色组、岗位组代码
Merge pull request !382 from 疯狂的狮子Li/update
2021-12-06 12:35:59 +00:00
若依
836017f2b9 !381 fix 修复主键溢出问题 将查询返回类型改为 Long
Merge pull request !381 from 疯狂的狮子Li/fix
2021-12-06 12:34:52 +00:00
疯狂的狮子li
4de4763baf update 优化查询用户的角色组、岗位组代码 2021-12-06 18:32:51 +08:00
疯狂的狮子li
965ebd0f03 fix 修复主键溢出问题 将查询返回类型改为 Long 2021-12-03 11:11:43 +08:00
RuoYi
2c3f1c28e5 tomcat update 2021-12-02 16:31:51 +08:00
RuoYi
6bfae2652f 若依 3.8.0 2021-12-01 08:53:11 +08:00
RuoYi
9bc730866f 🎉 RuoYi-Vue3(Vue3 Element Plus Vite)版本 2021-11-30 11:15:33 +08:00
RuoYi
a2d3f987c0 优化代码 2021-11-30 11:15:17 +08:00
若依
bf4ac3ad7a !378 fix: crontab组件bug
Merge pull request !378 from fuzui/fix_cron_tool
2021-11-30 03:03:08 +00:00
fuzui
f28a91969a fix: crontab组件中规范数据范围、冗余代码去除以及部分通配符说明 2021-11-30 02:08:08 +08:00
fuzui
ca285f5e53 fix: crontab组件周显示及计算bug 2021-11-30 00:22:23 +08:00
fuzui
34f2552cad fix: crontab组件互斥bug 2021-11-30 00:17:12 +08:00
RuoYi
89e7cb19b9 注册成功提示类型success 2021-11-26 18:11:57 +08:00
若依
ea71c9b214 !376 camelCase中应该转换下划线,而不是横杠
Merge pull request !376 from khejing/master
2021-11-26 10:07:58 +00:00
khejing
e5fd1f76db camelCase中应该是下划线,而不是横杠 2021-11-26 08:26:45 +00:00
Ricky
664192da0b 升级velocity到最新版本2.3(语法升级) 2021-11-25 15:18:02 +08:00
Ricky
9fc3e220a7 防止修改用户个人信息接口修改用户名 2021-11-25 14:00:27 +08:00
Ricky
64f6a69d9a 修复代码生成复选框字典遗漏问题 2021-11-25 13:54:49 +08:00
RuoYi
16734b1d88 升级velocity到最新版本2.3 2021-11-24 15:03:04 +08:00
RuoYi
31106c91fb 修复使用 this.$options.data 报错问题 2021-11-24 15:00:51 +08:00
RuoYi
026a427103 优化前端代码 2021-11-24 14:47:24 +08:00
若依
bafb1372a7 !375 删除代码生成中冗余的导出方法
Merge pull request !375 from fuzui/delete_redundancy_gen_export_function
2021-11-24 00:39:07 +00:00
fuzui
b4f032fab4 删除代码生成中冗余的导出方法 2021-11-24 02:48:35 +08:00
RuoYi
4f194aa101 升级js-cookie到最新版本3.0.1 2021-11-22 18:07:33 +08:00
RuoYi
ef4bfde4a8 优化提示信息 2021-11-22 18:06:44 +08:00
RuoYi
421593c0ba 添加新群号:101539465 2021-11-20 12:09:53 +08:00
RuoYi
91ad85aec1 添加新群号:264312783 2021-11-19 15:20:54 +08:00
RuoYi
d1eacc1d1c 新增tab对象简化页签操作 2021-11-19 14:53:40 +08:00
若依
e41dd8a0f1 !370 fix 修复关闭 xss 功能导致可重复读 RepeatableFilter 失效
Merge pull request !370 from 疯狂的狮子Li/master
2021-11-19 06:53:16 +00:00
疯狂的狮子li
9a7bb81cd0 fix 修复关闭 xss 功能导致可重复读 RepeatableFilter 失效 2021-11-19 13:01:30 +08:00
RuoYi
fcf606acde 升级jsencrypt到最新版本3.2.1 2021-11-18 17:50:49 +08:00
若依
084907eeca !369 代码生成模板缺少事务
Merge pull request !369 from lihy2021/N/A
2021-11-18 09:47:35 +00:00
lihy2021
8de93d35ed 代码生成模板缺少事务 2021-11-17 07:56:24 +00:00
RuoYi
cedd2d1daf 优化导出数据操作 2021-11-17 11:57:17 +08:00
RuoYi
2ab96587ef 任务参数忽略双引号中的逗号 2021-11-16 16:05:15 +08:00
RuoYi
cb9c0e79eb 升级core-js到最新版本3.19.1 2021-11-16 14:15:17 +08:00
若依
96d2b2d6b8 !368 【轻量级 PR】: 统一全局配置文件
Merge pull request !368 from XTvLi/master
2021-11-16 05:43:07 +00:00
XTvLi
b00171366f 统一全局配置内容, 删除临时调用配置文件 2021-11-10 18:17:43 +08:00
RuoYi
4e817a1109 升级axios到最新版本0.24.0 2021-11-10 11:14:50 +08:00
RuoYi
d185d4e4cc 增加sendGet无参请求方法 2021-11-10 11:13:27 +08:00
RuoYi
bbbe83b737 添加新群号:101539465 2021-11-02 14:40:21 +08:00
RuoYi
cc4c52c998 任务屏蔽违规字符 2021-11-01 15:03:06 +08:00
RuoYi
bd09e5b11c 修复字符串无法被反转义问题 2021-11-01 15:02:47 +08:00
RuoYi
181f62c15e 回显数据字典键值修正 2021-11-01 14:40:00 +08:00
RuoYi
3ae5ec92a5 登录/验证码请求headers不设置token 2021-11-01 13:29:27 +08:00
若依
2fe919b6ce !361 优化一些布尔判断语法
Merge pull request !361 from 清溪先生/master
2021-11-01 05:28:59 +00:00
Awen
13c770b6be 优化一些布尔判断语法 2021-10-27 19:03:29 +08:00
RuoYi
2eb55528ec 升级spring-boot到最新版本2.5.6 2021-10-27 16:23:35 +08:00
RuoYi
839f631d6b 添加Jaxb依赖,防止jdk8以上出现的兼容错误 2021-10-27 16:22:57 +08:00
若依
8faae71157 !359 update ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java.
Merge pull request !359 from Remenber_Ray/N/A
2021-10-27 07:37:19 +00:00
若依
b87e0fa124 !358 update ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java.
Merge pull request !358 from 雪丛/N/A
2021-10-27 07:34:47 +00:00
Ricky
b6596d021b 替换自定义验证注解 2021-10-26 17:22:20 +08:00
Remenber_Ray
0628dc9b2f update ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java. 2021-10-26 08:02:48 +00:00
雪丛
790aa0d24b update ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java.
增加删除Hash中的数据
2021-10-26 01:42:12 +00:00
RuoYi
8a7dcf8a80 修正错别字 2021-10-25 10:26:00 +08:00
若依
0c30ffa11f !354 update ruoyi-common/src/main/java/com/ruoyi/common/utils/Threads.java.
Merge pull request !354 from Remenber_Ray/N/A
2021-10-25 01:55:51 +00:00
若依
0904bf6446 !355 fix 跨域访问之后 下载无法获取 download-filename
Merge pull request !355 from 疯狂的狮子Li/master
2021-10-25 01:55:23 +00:00
疯狂的狮子Li
4583787759 fix 跨域访问之后 下载无法获取 download-filename 2021-10-24 17:13:04 +08:00
Remenber_Ray
17550a5f4b update ruoyi-common/src/main/java/com/ruoyi/common/utils/Threads.java.
修复描述错误
2021-10-24 02:34:25 +00:00
RuoYi
a4558c32b2 解析blob响应是否登录失效 2021-10-23 10:23:32 +08:00
RuoYi
ef4fef3d56 update ry.sh. 2021-10-23 10:21:02 +08:00
RuoYi
3dbbc6a223 AjaxResult重写put方法,以方便链式调用 2021-10-22 16:23:08 +08:00
若依
d3696f5223 !347 update ruoyi-common/src/main/java/com/ruoyi/common/core/domain/AjaxResult.java.
Merge pull request !347 from abbfun/N/A
2021-10-22 08:19:00 +00:00
abbfun
2d7d137abd update ruoyi-common/src/main/java/com/ruoyi/common/core/domain/AjaxResult.java.
AjaxResult链式调用
2021-10-22 03:09:54 +00:00
RuoYi
c2a179e9dd 新增认证对象简化权限验证 2021-10-20 11:21:11 +08:00
RuoYi
519ea854d5 生产环境使用路由懒加载提升页面响应速度 2021-10-15 17:57:46 +08:00
RuoYi
e66d0e4f74 角色列表返回类型保持一致 2021-10-15 17:56:57 +08:00
RuoYi
e7afea4cb7 升级oshi到最新版本v5.8.2 2021-10-14 16:20:18 +08:00
RuoYi
6d6271d6c9 修复五级以上菜单404问题 2021-10-14 16:19:46 +08:00
RuoYi
eb4376b649 Excel导入支持@Excels注解 2021-10-10 14:30:08 +08:00
RuoYi
b1e5ebab8f 升级spring-boot-mybatis到最新版2.2.0 2021-10-10 11:26:50 +08:00
RuoYi
8bd6296721 升级pagehelper到最新版1.4.0 2021-10-10 11:25:37 +08:00
RuoYi
ae5c68368b 升级SpringBoot到最新版本2.5.5 2021-10-10 11:24:16 +08:00
RuoYi
4fdb0f48ec 同步element2.15.6表格样式 2021-10-10 11:23:04 +08:00
RuoYi
c4207f640b 使用JSONField忽略字段 2021-10-10 11:21:46 +08:00
RuoYi
f6e477b4f5 升级druid到最新版1.2.8 2021-10-10 09:44:14 +08:00
RuoYi
7ae47b50b8 导入模板添加默认参数 2021-10-09 12:22:55 +08:00
RuoYi
0b14155a75 增加 sendGet 无参判断 2021-10-09 12:22:54 +08:00
RuoYi
f1fed76273 升级element-ui到最新版本2.15.6 2021-10-09 12:22:48 +08:00
RuoYi
48813161f6 设置mybatis默认的执行器 2021-10-04 10:27:38 +08:00
疯狂的狮子Li
a006904724 fix 2021-09-30 03:18:41 +00:00
RuoYi
5477ce3c39 修正swagger没有指定dataTypeClass导致启动出现warn日志 2021-09-29 19:51:48 +08:00
RuoYi
25f50d74c5 升级sass-loader到最新版本10.1.1 2021-09-27 18:54:43 +08:00
RuoYi
266f4d6806 升级dart-sass到版本1.32.13 2021-09-27 18:54:10 +08:00
RuoYi
ded99502ae 新增通用方法简化下载使用 2021-09-27 10:38:29 +08:00
RuoYi
02b95f95a8 升级file-saver到最新版本2.0.5 2021-09-27 10:36:43 +08:00
RuoYi
2a6d2d733e 升级dart-sass到最新版本1.42.1 2021-09-27 10:32:03 +08:00
RuoYi
30c89b33fe Excel注解支持导入导出标题信息 2021-09-26 09:03:01 +08:00
RuoYi
7479ff4b06 修复xss过滤后格式出现的异常 2021-09-25 17:12:37 +08:00
若依
821f40882f !332 fix 自动生成代码漏掉 this.#[[$modal]]#.msgError
Merge pull request !332 from 疯狂的狮子Li/N/A
2021-09-24 06:50:50 +00:00
疯狂的狮子Li
02ce9868a7 fix 自动生成代码漏掉 this.#[[$modal]]#.msgError 2021-09-24 05:41:55 +00:00
若依
a8f2ff4531 !331 update 代码生成编辑页面 拼写错误修正
Merge pull request !331 from 疯狂的狮子Li/master
2021-09-24 02:07:44 +00:00
疯狂的狮子li
eaa3baab3c update 代码生成编辑页面 拼写错误修正 2021-09-24 10:06:23 +08:00
RuoYi
6480282826 升级fastjson到最新版1.2.78 2021-09-24 09:28:46 +08:00
若依
6197ad5090 !330 优化 记录登录信息,移除不必要的修改
Merge pull request !330 from lihy2021/N/A
2021-09-24 01:27:57 +00:00
lihy2021
b477e40d3c 优化 记录登录信息,移除不必要的修改 2021-09-24 00:41:43 +00:00
RuoYi
f8cc7ce328 限流返回类型转换数值型的格式 2021-09-23 19:15:33 +08:00
RuoYi
1a5881b1d0 修正服务监控磁盘变量 2021-09-23 19:09:22 +08:00
RuoYi
fa124aeb8b 新增通用方法简化模态/缓存使用 2021-09-23 09:57:29 +08:00
RuoYi
258335cc65 新增通用方法简化模态/缓存使用 2021-09-23 09:38:16 +08:00
RuoYi
3b42abef44 Excel注解支持自定义数据处理器 2021-09-22 09:03:01 +08:00
RuoYi
26f0737c60 防重提交注解支持配置间隔时间/提示消息 2021-09-20 19:09:25 +08:00
RuoYi
ac94242875 reset dataSourceAspect 2021-09-20 19:08:50 +08:00
RuoYi
54bfa627f0 防止Excel导入图片可能出现的异常 2021-09-20 19:04:57 +08:00
RuoYi
36c058188a 防止记录日志转换出现的异常 2021-09-20 19:04:40 +08:00
RuoYi
a292cccb63 代码生成点击预览重置激活tab 2021-09-18 18:58:03 +08:00
若依
5ccd9877b4 !325 update 优化aop语法 使用spring自动注入注解 基于注解拦截的aop注解不可能为空
Merge pull request !325 from 疯狂的狮子Li/master
2021-09-18 10:47:06 +00:00
若依
7108ec41b5 !322 Cron表达式生成器关闭时销毁,避免再次打开时存在上一次修改的数据
Merge pull request !322 from muyi/master
2021-09-18 10:43:59 +00:00
若依
5188d56b4a !321 修复 全局限流key会多出一个"-" 将其移动到IP后面 去除多余的空格
Merge pull request !321 from 疯狂的狮子Li/N/A
2021-09-18 10:41:03 +00:00
疯狂的狮子li
8f7ed66544 update 优化aop语法 使用spring自动注入注解 基于注解拦截的aop注解不可能为空 2021-09-18 18:20:21 +08:00
yjb
aaae404b2a Cron表达式生成器关闭时销毁,避免再次打开时存在上一次修改的数据 2021-09-17 19:14:41 +08:00
疯狂的狮子Li
f3a8b4625f 修复 全局限流key会多出一个"-" 将其移动到IP后面 去除多余的空格 2021-09-17 09:32:43 +00:00
RuoYi
12ab8b03d9 使用vue-data-dict,简化数据字典使用 2021-09-17 15:36:54 +08:00
RuoYi
23270c60bc 日志注解新增是否保存响应参数 2021-09-16 16:03:49 +08:00
若依
2cb6709323 !318 修复后端主子表代码模板方法名生成错误问题
Merge pull request !318 from 稚屿/N/A
2021-09-16 07:48:08 +00:00
若依
917bc03a43 !316 禁用DictTag中el-tag渐变动画
Merge pull request !316 from 马小法/master
2021-09-16 07:34:34 +00:00
稚屿
dbe3446b63 修复后端主子表代码模板方法名生成错误问题 2021-09-14 13:53:32 +00:00
马小法
b84e7013d2 禁用el-tag组件的渐变动画 2021-09-14 15:15:22 +08:00
RuoYi
db193a46e8 若依 3.7.0 2021-09-13 09:36:38 +08:00
RuoYi
04c340627d 修复多图组件验证失败被删除问题 2021-09-10 11:06:25 +08:00
RuoYi
15abd4d053 优化提示 2021-09-08 11:26:08 +08:00
若依
a7376b36f8 !312 修复代码生成页面数据编辑保存之后总是跳转第一页的问题
Merge pull request !312 from 稚屿/master
2021-09-08 03:19:59 +00:00
稚屿
d2b61762b7 修复代码生成页面数据编辑保存之后总是跳转第一页的问题 2021-09-08 11:18:35 +08:00
RuoYi
a5e38f6f99 菜单管理支持配置路由参数 2021-09-08 09:28:23 +08:00
若依
4988b585f8 !309 修正单词拼写错误
Merge pull request !309 from 稚屿/master
2021-09-07 08:16:58 +00:00
linzh
b35f708c07 修正单词拼写错误 2021-09-05 21:36:33 +08:00
RuoYi
0e6150720c 页签新增关闭左侧 2021-09-05 13:27:58 +08:00
RuoYi
44adf03d2c 页签右键按钮添加图标 2021-09-05 13:26:45 +08:00
RuoYi
9ae5edaa74 菜单&部门新增展开/折叠功能 2021-09-04 12:10:33 +08:00
RuoYi
14c6c796e8 新增暗色菜单风格主题 2021-09-04 12:09:55 +08:00
RuoYi
5d72f9d224 修复保存配置主题颜色失效问题 2021-09-03 16:50:48 +08:00
RuoYi
e49f0cebf1 自定义弹层溢出滚动样式 2021-09-03 13:27:03 +08:00
RuoYi
6361e4efdc 定时任务支持在线生成cron表达式 2021-09-03 09:54:07 +08:00
若依
cfa86bd4fe !308 代码生成: 导入表时查询 新创建表的优先排序在前面
Merge pull request !308 from xiaoshitou/N/A
2021-09-03 01:39:40 +00:00
xiaoshitou
a56bc47a81 代码生成: 导入表时查询 新创建表的优先排序在前面 2021-09-02 20:01:25 +00:00
RuoYi
a15bfdfb46 防止表格最后页最后项删除变成暂无数据 2021-09-02 10:55:10 +08:00
RuoYi
ee823b8326 防止表格最后页最后项删除变成暂无数据 2021-09-02 10:19:04 +08:00
若依
57178e72a4 !304 修改数据字典样式回显
Merge pull request !304 from 马小法/master
2021-09-01 01:20:59 +00:00
若依
b8317a562c !303 修改非管理员登录时,获取菜单报错sql
Merge pull request !303 from Gold_Fish/master
2021-08-30 08:59:55 +00:00
马小法
8040ad8c03 修改数据字典回显 2021-08-30 16:53:16 +08:00
马小法
c628aa5be8 修改代码生成字典回显样式 2021-08-30 16:49:30 +08:00
Gold_Fish
b036e78d85 修改根据userId获取菜单sql 2021-08-30 02:42:49 +00:00
RuoYi
4e8c6fb7c0 修复字典组件值为整形不显示问题 2021-08-29 15:57:01 +08:00
RuoYi
134835c870 验证码默认20s超时 2021-08-29 15:56:46 +08:00
若依
5ade90debf !299 XssHttpServletRequestWrapper中增加available方法
Merge pull request !299 from Ming/master
2021-08-29 07:36:57 +00:00
若依
bb0aeb39e3 !298 修复带utc日期格式 yyyy-MM-dd'T'HH:mm:ss.SSS 在safari浏览器中无法正确格式化的问题
Merge pull request !298 from wjtc8/N/A
2021-08-29 07:35:06 +00:00
Ming
098c650655 update ruoyi-common/src/main/java/com/ruoyi/common/filter/XssHttpServletRequestWrapper.java.
增加available方法于XssHttpServletRequestWrapper
2021-08-24 08:42:56 +00:00
RuoYi
e52092c6d4 修改时检查用户数据权限范围 2021-08-24 16:00:39 +08:00
wjtc8
89911e7caf 修复带utc日期格式 yyyy-MM-dd'T'HH:mm:ss.SSS 在safari浏览器中无法正确格式化的问题 2021-08-24 05:51:00 +00:00
RuoYi
0fc266fe80 定时任务对检查异常进行事务回滚 2021-08-24 11:12:11 +08:00
RuoYi
d1ef19f08a 自定义可拖动弹窗高度指令 2021-08-20 17:57:44 +08:00
RuoYi
e6e10308ff 自定义可拖动弹窗宽度指令 2021-08-20 17:45:25 +08:00
RuoYi
cb5ee9c8a1 补充定时任务表字段注释 2021-08-20 11:04:15 +08:00
RuoYi
1e37f0430b 定时任务屏蔽ldap远程调用 2021-08-19 15:26:22 +08:00
若依
295173258c !295 update 优化 使用权限工具 获取用户信息
Merge pull request !295 from 疯狂的狮子Li/update
2021-08-19 06:55:13 +00:00
若依
fec90d0487 !294 update ruoyi-ui/src/layout/index.vue.
Merge pull request !294 from aasdd/N/A
2021-08-19 06:49:06 +00:00
疯狂的狮子li
aead560227 update 优化 使用权限工具 获取用户信息 2021-08-19 11:13:59 +08:00
aasdd
8133c60ab3 update ruoyi-ui/src/layout/index.vue.
删掉此处代码,使右边栏动画生效。现在是没有动画的
2021-08-18 09:29:22 +00:00
RuoYi
5c155f5f11 支持自定义注解实现接口限流 2021-08-17 14:08:18 +08:00
RuoYi
03cf98d3c9 优化异常信息 2021-08-16 16:25:25 +08:00
若依
6f51f729ba !289 添加日期范围支持重复添加多组日期范围,请求参数中对象的属性为null、undefined不进行拼接
Merge pull request !289 from wangzhaoqiang/master
2021-08-16 08:23:27 +00:00
wangzhaoqiang
57b159eb98 添加日期范围支持重复添加多组日期范围,请求参数中对象的属性为null、undefined不进行拼接 2021-08-16 14:48:34 +08:00
若依
08da6834a5 !288 修正方法名单词拼写错误
Merge pull request !288 from 稚屿/N/A
2021-08-16 02:36:36 +00:00
若依
268468fb47 !287 更新到【默认首页使用keep-alive缓存】后报错
Merge pull request !287 from wangzhaoqiang/master
2021-08-16 02:36:29 +00:00
稚屿
333e19339c 修正方法名单词拼写错误 2021-08-15 10:26:05 +00:00
wangzhaoqiang
7b6ccd9b22 解决登录后浏览器后台Breadcrumb组件报错 2021-08-14 20:16:48 +08:00
RuoYi
5d6f134609 多图上传组件移除多余的api地址 2021-08-13 15:15:35 +08:00
RuoYi
f02743bde5 代码生成主子表多选行数据 2021-08-13 14:50:35 +08:00
RuoYi
3003bb0f50 Excel注解图片导入兼容xls 2021-08-13 10:56:35 +08:00
RuoYi
5139265d32 默认首页使用keep-alive缓存 2021-08-13 10:10:29 +08:00
若依
8a67af6c26 !285 修复角色分配用户页面接收参数与传递参数类型不一致导致的错误
Merge pull request !285 from 稚屿/N/A
2021-08-13 01:55:58 +00:00
若依
8e4802505e !284 添加SysConfigservice,SysDictTypeService的实现方法遗漏的@Override注解
Merge pull request !284 from Old丶x/master
2021-08-13 01:55:52 +00:00
稚屿
8ee641c1bc 修复角色分配用户页面接收参数与传递参数类型不一致导致的错误 2021-08-13 01:08:00 +00:00
mroldx
779508989f 添加加载字典数据,清空字典数据,重置字典数据方法上遗漏的@Override注解 2021-08-12 17:30:31 +08:00
mroldx
d9e805a6a5 添加获取验证码方法上遗漏的@Override注解 2021-08-12 17:19:56 +08:00
RuoYi
7be17ea89a Excel注解支持Image图片导入 2021-08-11 10:13:34 +08:00
RuoYi
1f07641d9b update bin 2021-08-11 10:11:13 +08:00
若依
c0f4f805d0 !281 补全注册用户方法上遗漏的@Override注解
Merge pull request !281 from 稚屿/N/A
2021-08-11 02:08:58 +00:00
稚屿
b84224d7ba 补全注册用户方法上遗漏的@Override注解 2021-08-08 14:08:52 +00:00
RuoYi
98a143f1fe 添加新群号:101456076 2021-08-08 19:50:50 +08:00
RuoYi
3243428009 优化用户不能删除自己 2021-08-08 19:12:52 +08:00
RuoYi
7736097f6b 提取通用方法到基类控制器 2021-08-08 19:12:12 +08:00
RuoYi
fc60c003c3 升级element-ui到最新版本2.15.5 2021-08-06 14:31:39 +08:00
RuoYi
68ae4df2dc 升级commons.io到最新版本v2.11.0 2021-07-31 17:52:06 +08:00
RuoYi
de33e6ecc8 优化代码生成模板 2021-07-30 22:18:20 +08:00
RuoYi
a1cc346aca 优化代码生成模板 2021-07-30 21:50:47 +08:00
RuoYi
5397e345ca 新增是否开启用户注册功能 2021-07-30 21:23:35 +08:00
RuoYi
8ed7916b61 定时任务屏蔽http(s)远程调用 2021-07-30 11:28:46 +08:00
RuoYi
2de5cc52d1 启用父部门状态排除顶级节点 2021-07-30 11:28:04 +08:00
RuoYi
f6bc28000e 防止错误token导致的解析异常 2021-07-29 17:32:55 +08:00
RuoYi
6b5dd4d2be 优化XSS跨站脚本过滤 2021-07-28 16:04:59 +08:00
RuoYi
e6becb9337 BLOB下载时清除URL对象引用 2021-07-28 13:13:28 +08:00
RuoYi
8da55fb72a 添加新群号:101456076 2021-07-28 09:51:19 +08:00
RuoYi
6a5c86541a 跳转路由高亮相对应的菜单栏 2021-07-27 11:54:20 +08:00
RuoYi
3803ac78e2 升级oshi到最新版本v5.8.0 2021-07-27 11:53:59 +08:00
Ricky
4095a1b6ee !275 fix Issue #I42GRW 任意账户越权漏洞
Merge pull request !275 from lagXkjy/master
2021-07-27 02:08:04 +00:00
江强
3347ca4d74 fix:Issue #I42GRW 修复任意账户越权漏洞 2021-07-27 09:33:12 +08:00
RuoYi
9b1883988b 升级element-ui到最新版本2.15.3 2021-07-26 09:50:58 +08:00
RuoYi
49c8a007cc 修复定时任务日志执行状态显示 2021-07-26 09:50:33 +08:00
RuoYi
64f6d28441 角色&菜单新增字段属性提示信息 2021-07-25 20:08:55 +08:00
RuoYi
c26d87c677 内链设置meta信息 2021-07-25 20:05:18 +08:00
RuoYi
97ae0eb7c7 密码框新增显示切换密码图标 2021-07-25 19:13:56 +08:00
RuoYi
6c1cccd031 导入用户样式调整 2021-07-25 19:08:00 +08:00
RuoYi
856d1ceba8 顶部菜单样式调整 2021-07-25 19:06:57 +08:00
RuoYi
60673b3b64 去除默认分页合理化参数 2021-07-25 10:35:37 +08:00
RuoYi
0a516e3001 更多操作按钮添加权限控制 2021-07-25 10:20:52 +08:00
RuoYi
bb87f35797 富文本新增上传文件大小限制 2021-07-25 08:57:01 +08:00
RuoYi
c43f9bc3c2 顶部菜单排除隐藏的默认路由 2021-07-24 18:20:55 +08:00
若依
46b43b1bd9 !269 code=401时request方法没有返回Promise.reject 修复
Merge pull request !269 from 严俊东/N/A
2021-07-24 02:48:01 +00:00
若依
8dbda47174 !268 修正方法名单词拼写错误
Merge pull request !268 from 稚屿/N/A
2021-07-23 11:34:30 +00:00
严俊东
cdace51197 code=401时request方法没有返回Promise.reject 修复 2021-07-20 04:49:22 +00:00
稚屿
c24fc4282c 修正方法名单词拼写错误 2021-07-20 00:54:50 +00:00
RuoYi
b616a2f2e7 定时任务新增更多操作 2021-07-15 17:35:33 +08:00
RuoYi
60abdf1dbc 升级oshi到最新版本v5.7.5 2021-07-14 09:53:26 +08:00
RuoYi
7b894da43c 参数管理支持配置验证码开关 2021-07-13 10:30:40 +08:00
RuoYi
c8b66f9b04 删除富文本video事件 2021-07-13 10:28:55 +08:00
若依
25d9edd5c9 !259 图片上传 - 多图时无法删除相应图片修复
Merge pull request !259 from 严俊东/N/A
2021-07-13 02:26:10 +00:00
严俊东
77a21d098f 图片上传 - 多图时无法删除相应图片修复 2021-07-12 03:01:50 +00:00
RuoYi
170cfb356c 若依 3.6.0 2021-07-12 08:42:11 +08:00
RuoYi
5879c2484a 菜单路由配置支持内链访问 2021-07-11 16:31:10 +08:00
RuoYi
c02dad2ca3 默认访问首页新增提示语 2021-07-11 15:28:11 +08:00
RuoYi
1bfa14e3c6 富文本默认上传返回url类型 2021-07-10 12:17:32 +08:00
RuoYi
5dec58e7f5 自定义弹窗拖拽指令 2021-07-09 17:12:29 +08:00
RuoYi
8321f92d2c 全局注册通用组件 2021-07-09 17:09:57 +08:00
RuoYi
da1095e298 授权用户添加访问权限 2021-07-09 17:08:30 +08:00
RuoYi
f56da498ab ImageUpload组件支持多图片上传 2021-07-08 19:17:09 +08:00
RuoYi
e259093e01 文件上传组件添加数量限制属性 2021-07-08 15:49:04 +08:00
RuoYi
e963a86b15 富文本编辑组件添加类型属性 2021-07-08 15:48:11 +08:00
RuoYi
e447fb806b FileUpload组件支持多文件上传 2021-07-08 12:36:02 +08:00
RuoYi
90c41d498c 角色管理新增分配用户功能 2021-07-05 14:54:09 +08:00
RuoYi
ce6bea4ba0 限制超级管理员不允许操作 2021-07-05 09:57:15 +08:00
RuoYi
9c7901f526 用户管理新增分配角色功能 2021-07-01 18:01:36 +08:00
RuoYi
04f5a93aa8 升级pagehelper到最新版1.3.1 2021-06-25 17:25:49 +08:00
若依
751ca90690 !251 修复日志列表取消字段排序时的报错问题
Merge pull request !251 from 稚屿/N/A
2021-06-25 09:23:45 +00:00
稚屿
1dfeae6a03 修复日志列表取消字段排序时的报错问题 2021-06-24 00:27:37 +00:00
RuoYi
1ed60c79c0 用户信息长度校验限制 2021-06-22 20:45:19 +08:00
RuoYi
aee1e53140 全局挂载字典标签组件 2021-06-22 20:44:40 +08:00
Ricky
253e2b2de1 增加字典标签样式回显 2021-06-22 14:24:26 +08:00
Ricky
b1413f021e 增加字典标签样式回显 2021-06-22 14:04:14 +08:00
RuoYi
60c22b6a43 update ry.sh. 2021-06-17 21:29:00 +08:00
RuoYi
3f05ed6ffa 封装iframe组件 2021-06-17 20:17:42 +08:00
RuoYi
090ad5323a 日志列表支持排序操作 2021-06-17 12:30:43 +08:00
RuoYi
3e90fd010d 升级commons.fileupload到最新版本v1.4 2021-06-16 09:53:00 +08:00
RuoYi
462862ba65 升级commons.io到最新版本v2.10.0 2021-06-16 09:52:38 +08:00
RuoYi
7601a72faf 升级element-ui到最新版本2.15.2 2021-06-15 10:26:19 +08:00
RuoYi
7ab14ff293 定时任务屏蔽rmi远程调用 2021-06-15 10:26:02 +08:00
RuoYi
200106df39 升级oshi到最新版本v5.7.4 2021-06-11 10:29:14 +08:00
RuoYi
ea66e20282 修复用户搜索分页变量错误 2021-06-10 22:36:22 +08:00
RuoYi
a209b39552 分页组件新增pagerCount属性 2021-06-10 22:29:13 +08:00
RuoYi
557672ba9f 系统布局配置支持动态标题开关 2021-06-10 18:05:27 +08:00
RuoYi
a3116cd27d 优化部门父级启用状态 2021-06-10 15:34:38 +08:00
RuoYi
2ace3257f9 升级swagger到最新版本v3.0.0 2021-06-09 20:07:36 +08:00
RuoYi
c16ee7fc2c 升级swagger到最新版本v3.0.0 2021-06-08 16:34:36 +08:00
RuoYi
fd33fe869d 修复导出角色数据范围翻译缺少仅本人 2021-06-08 16:27:24 +08:00
RuoYi
b7446f8d0f 富文本工具栏配置视频 2021-06-03 13:26:09 +08:00
RuoYi
19924cd184 修复关闭confirm提示框控制台报错问题 2021-06-03 13:24:29 +08:00
RuoYi
85470a1549 修复表单构建选择下拉选择控制台报错问题 2021-06-02 20:43:34 +08:00
若依
2a604c0548 !237 同步菜单新增、修改界面“功能权限”maxlength为100(保持与数据库字段长度一致),避免因超过50后不能录入问题
Merge pull request !237 from 老李/origin
2021-06-02 20:40:09 +08:00
RuoYi
b7f3c68eca 优化图片工具类读取文件 2021-06-02 11:45:40 +08:00
RuoYi
edd2981076 调整用户测试接口swagger注解 2021-06-02 11:45:30 +08:00
RuoYi
c105a63c8b 添加bat脚本执行应用 2021-05-31 12:16:27 +08:00
xx2yy
01fef0b9e1 同步菜单新增、修改界面“功能权限”maxlength为100(保持与数据库字段长度一致),避免因超过50后不能录入问题 2021-05-31 10:31:50 +08:00
RuoYi
af9cfb40a4 优化参数&字典缓存操作 2021-05-27 17:38:44 +08:00
RuoYi
6fa3bfe051 修复两处存在SQL注入漏洞问题 2021-05-27 17:38:27 +08:00
RuoYi
5e64a93d11 若依 3.5.0 2021-05-25 09:37:55 +08:00
RuoYi
4aabf5d8be Redis设置HashKey序列化 2021-05-24 15:10:55 +08:00
RuoYi
cf6254a8d5 用户登录后记录最后登录IP&时间 2021-05-24 14:21:29 +08:00
RuoYi
883cff5de9 新增IE浏览器版本过低提示页面 2021-05-24 14:15:41 +08:00
RuoYi
7e79c4f249 生成vue模板导出按钮点击后添加遮罩 2021-05-24 11:34:03 +08:00
若依
504638eb41 !234 【轻量级 PR】:删去两处冗余代码
Merge pull request !234 from xivLi/master
2021-05-24 11:30:21 +08:00
RuoYi
2adac4a899 升级fastjson到最新版1.2.76 2021-05-24 11:25:17 +08:00
RuoYi
56a943bf48 升级druid到最新版本v1.2.6 2021-05-24 11:24:54 +08:00
RuoYi
77ebca264a 修复请求形参未传值记录日志异常问题 2021-05-23 19:22:30 +08:00
RuoYi
7b94ae3a9a xss校验json条件优化 2021-05-23 19:20:36 +08:00
若依
bd1edc6dcc !233 修正方法名单词拼写错误
Merge pull request !233 from lyqwer/N/A
2021-05-23 17:15:18 +08:00
若依
09d166e97d !231 修正注释
Merge pull request !231 from 刘立伟/N/A
2021-05-23 17:14:52 +08:00
xivLi
f3e5d908d6 quartz模块下 domain包中的 SysJob类不需要实现Serializable接口 2021-05-22 16:05:12 +08:00
xivLi
9651a7d7fc 删去utils.uuid下 IdUtils类中 多余的import(同包下的UUID类) 2021-05-22 15:52:19 +08:00
lyqwer
b2914cbcb1 修正方法名单词拼写错误 2021-05-21 17:24:48 +08:00
刘立伟
d0a4d6b111 修正注释 2021-05-18 10:21:48 +08:00
RuoYi
b431703262 导出按钮点击之后添加遮罩 2021-05-17 15:37:58 +08:00
RuoYi
99726be9ac 修正导入表权限标识 2021-05-11 14:26:20 +08:00
RuoYi
32f333a00e 删除操作日志记录日志 2021-05-11 14:25:39 +08:00
RuoYi
be5c19b764 树级结构更新子节点使用replaceFirst 2021-05-11 14:25:25 +08:00
RuoYi
dd384e4a31 上传媒体类型添加视频格式 2021-05-11 14:25:08 +08:00
若依
bdde195e2b !225 【bug修复】文件上传时出现java.nio.file.FileAlreadyExistsException
Merge pull request !225 from CANYON/master
2021-05-11 14:19:53 +08:00
libin
14ea071306 修复文件上传时java.nio.file.FileAlreadyExistsException 2021-05-08 15:31:16 +08:00
RuoYi
50034301ac 添加新群号:201396349 2021-05-06 20:40:25 +08:00
若依
85ed712c50 !222 update ruoyi-ui/src/assets/styles/element-ui.scss.
Merge pull request !222 from leizhuogogo/N/A
2021-05-06 20:39:36 +08:00
若依
f67d682345 !221 update ruoyi-common/src/main/java/com/ruoyi/common/utils/Arith.java.
Merge pull request !221 from phper08/N/A
2021-05-06 20:39:26 +08:00
leizhuogogo
3f1427eef9 update ruoyi-ui/src/assets/styles/element-ui.scss. 2021-05-06 17:50:28 +08:00
phper08
7d0f5e94ef update ruoyi-common/src/main/java/com/ruoyi/common/utils/Arith.java. 2021-05-03 13:18:33 +08:00
RuoYi
62081aebb9 修复开启TopNav后,左侧打开外链问题 2021-04-21 16:34:44 +08:00
RuoYi
3f07632cd4 修复一级菜单包屑显示重复问题 2021-04-21 15:14:36 +08:00
Ricky
2c94587263 优化ExcelUtil空值处理 2021-04-21 09:53:14 +08:00
RuoYi
2575c17f47 主题颜色保存配置 2021-04-19 16:59:56 +08:00
RuoYi
b6f13c546b 过滤BindingResult对象,防止异常 2021-04-18 21:54:53 +08:00
RuoYi
e60a69b670 兼容顶部栏一级菜单内部跳转 2021-04-18 18:33:13 +08:00
RuoYi
cb18eec802 修正模板字符编码 2021-04-18 15:45:49 +08:00
RuoYi
bef080c60a 升级mybatis到最新版3.5.6 阻止远程代码执行漏洞 2021-04-18 15:45:37 +08:00
Ricky
de73cf300b 优化树表代码生成模板 2021-04-15 10:39:09 +08:00
Ricky
cbcee86d2c 优化树表代码生成模板 2021-04-15 10:37:22 +08:00
RuoYi
cc50224d90 固定顶部导航栏&窗口大小改变实时更新栏数 2021-04-14 11:01:16 +08:00
RuoYi
ff09e1cf55 数据监控默认地址修改 2021-04-13 18:15:11 +08:00
RuoYi
fe2ccbdc1b 优化代码生成导出模板名称 2021-04-13 14:49:42 +08:00
RuoYi
c8df1f5e1f 布局设置支持保存&重置配置 2021-04-13 09:47:28 +08:00
RuoYi
e71c00e6fa 富文本编辑器支持自定义上传地址 2021-04-13 09:38:32 +08:00
若依
dcb9839596 !209 导出 Excel 工作表的名称 由 ${businessName} 更改为 ${functionName}
Merge pull request !209 from lihy2021/N/A
2021-04-13 09:36:49 +08:00
若依
f13b6d92d2 !205 富文本编辑器自定义上传地址
Merge pull request !205 from hechieh/N/A
2021-04-13 09:36:42 +08:00
lihy2021
6595c68df1 导出 Excel 工作表的名称 由 ${businessName} 更改为 ${functionName} 2021-04-12 14:52:14 +08:00
Ricky
5a2a0c09b6 优化主子表代码生成 2021-04-12 13:26:54 +08:00
RuoYi
9aac65ff32 新增菜单导航显示风格TopNav(false为左侧导航菜单,true为顶部导航菜单) 2021-04-12 09:54:08 +08:00
RuoYi
5f2350569a 页签新增关闭右侧 2021-04-10 21:15:45 +08:00
hechieh
ccf05b697d 富文本编辑器自定义上传地址 2021-04-10 17:08:49 +08:00
RuoYi
6810243ab7 修复树表数据显示不全&加载慢问题 2021-04-09 08:31:13 +08:00
RuoYi
b56b8846d9 修改主题后mini类型按钮无效问题 2021-04-08 13:54:48 +08:00
RuoYi
8e1e4cd8fe 通用下载完成后删除节点 2021-04-08 13:46:22 +08:00
若依
9fa5c79713 !200 update ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java.
Merge pull request !200 from yvan7123/N/A
2021-04-08 13:42:30 +08:00
若依
40a72c2b7e !199 规范命名、用户角色单个逻辑删除、去除多余代码
Merge pull request !199 from fuzui/some_problems
2021-04-08 13:40:28 +08:00
yvan7123
6fe9a358b7 update ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java. 2021-04-06 11:47:27 +08:00
wangze
9f6bc13e64 🔥 去除多余代码 2021-04-02 23:06:48 +08:00
wangze
ba5ab4b091 用户、角色单条删除时,使其逻辑删除 2021-04-02 22:49:19 +08:00
wangze
17407d0127 调整cache_repeat_key为驼峰格式 2021-04-02 22:40:15 +08:00
RuoYi
30f330f4a0 修复firefox下表单构建拖拽会新打卡一个选项卡 2021-03-30 17:45:35 +08:00
RuoYi
6ca7870393 修正注释 2021-03-30 15:30:18 +08:00
若依
2a7342ec43 !195 读取excel增加非空判断
Merge pull request !195 from 叫我宏锅锅/yuhong
2021-03-30 15:23:04 +08:00
若依
fc57e91b80 !196 RepeatedlyRequestWrapper.ServletInputStream 实现available方法
Merge pull request !196 from wangyang/master
2021-03-30 15:17:34 +08:00
wangyuanyang
347f36ceff fix:RepeatedlyRequestWrapper.ServletInputStream 实现available方法 2021-03-29 10:17:31 +08:00
yuhong0206@sina.cn
9b9c1b999f 读取excel增加
if(row == null)
{
    continue;
}
判断。防止有时候Excel表中有空数据行,导致读取时出现空指针异常。
2021-03-29 09:00:44 +08:00
yuhong0206@sina.cn
ec627704b2 取消 2021-03-29 08:58:46 +08:00
yuhong0206@sina.cn
9e6b2a1265 读取excel增加
if(row == null)
{
    continue;
}
判断。防止有时候Excel表中有空数据行,导致读取时出现空指针异常。
2021-03-29 08:56:51 +08:00
若依
266a5e844f !193 修复request.getInputStream() 重复读取错误问题
Merge pull request !193 from MccRay/master
2021-03-27 13:22:01 +08:00
MccRay
0822680158 update ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatableFilter.java.
修复 getInputStream() has already been called for this request异常问题
2021-03-25 17:39:51 +08:00
RuoYi
090e258bf9 显隐列初始默认隐藏列 2021-03-24 15:46:37 +08:00
若依
505fa06dc3 !192 update ruoyi-ui/src/views/system/user/profile/userAvatar.vue.
Merge pull request !192 from 谢凯/N/A
2021-03-24 15:32:24 +08:00
若依
6cf53bfacb !191 update ruoyi-ui/src/views/system/user/profile/userAvatar.vue.
Merge pull request !191 from allworldg/N/A
2021-03-24 15:31:51 +08:00
谢凯
881dc3fcf0 update ruoyi-ui/src/views/system/user/profile/userAvatar.vue. 2021-03-22 17:52:34 +08:00
allworldg
b65c8d4512 update ruoyi-ui/src/views/system/user/profile/userAvatar.vue. 2021-03-21 21:20:23 +08:00
RuoYi
67371a9028 个人信息添加手机&邮箱重复验证 2021-03-21 08:53:11 +08:00
RuoYi
01b545e4ab 通用Controller添加响应返回消息 2021-03-16 14:43:55 +08:00
RuoYi
c2e9200626 数据监控默认账户密码防止越权访问 2021-03-14 16:37:34 +08:00
若依
9502203bbe !187 【漏洞修复】升级commons-collections版本,解决3.2.1版本的反序列化漏洞问题
Merge pull request !187 from Delusive/master
2021-03-14 16:32:07 +08:00
hh44h1144
c0f1569ad9 修复commons-collections引起的反序列化漏洞 2021-03-12 16:59:06 +08:00
RuoYi
61432480c8 删除多余的代码 2021-03-07 11:06:47 +08:00
若依
78deee063d !180 富文本编辑组件支持只读
Merge pull request !180 from JOSWAY/master
2021-03-07 10:44:04 +08:00
若依
4ad003649e !182 解决 Byte[] 类型 to string 死循环的问题
Merge pull request !182 from sproutcat/master
2021-03-07 10:39:41 +08:00
若依
616f5a6aca !185 update ruoyi-ui/src/views/monitor/logininfor/index.vue.
Merge pull request !185 from asher/N/A
2021-03-07 10:39:30 +08:00
若依
fea3ff7b2a !184 update ruoyi-ui/src/views/monitor/operlog/index.vue.
Merge pull request !184 from asher/N/A
2021-03-07 10:39:22 +08:00
asher
f938a24df0 update ruoyi-ui/src/views/monitor/logininfor/index.vue. 2021-03-04 17:00:07 +08:00
asher
45fa686a64 update ruoyi-ui/src/views/monitor/operlog/index.vue. 2021-03-04 16:58:18 +08:00
RuoYi
0d8c3b4940 升级oshi到最新版本v5.6.0 2021-03-03 13:53:03 +08:00
RuoYi
64e807f27b 添加新群号:186866453 2021-02-24 13:45:24 +08:00
tzg
9a384a2fc2 解决 Byte[] 类型 to string 死循环的问题 2021-02-23 16:30:14 +08:00
Josway
339b932a3d 富文本编辑组件支持只读 2021-02-22 17:49:17 +08:00
RuoYi
0b5c7f4c96 若依 3.4.0 2021-02-22 09:40:28 +08:00
RuoYi
265e3010aa 升级SpringBoot到最新版本2.2.13 2021-02-21 11:01:56 +08:00
RuoYi
b7a36bfe8a 修改ip字段长度防止ipv6地址长度不够 2021-02-10 12:48:52 +08:00
RuoYi
3a51c53823 角色非自定义权限范围清空选择值 2021-02-06 10:34:12 +08:00
RuoYi
df504c5c14 修复四级菜单无法显示问题 2021-02-06 09:29:50 +08:00
RuoYi
baeed2e8d3 修复角色管理-编辑角色-功能权限显示异常 2021-02-02 16:25:37 +08:00
RuoYi
2903de1561 升级element-ui到最新版本2.15.0 2021-01-24 12:06:19 +08:00
RuoYi
cca2f5c62d update README.md 2021-01-14 13:20:08 +08:00
RuoYi
ce54416e4f 升级fastjson到最新版1.2.75 2021-01-13 16:20:39 +08:00
RuoYi
bd19892aff 修复生成树表代码异常 2021-01-13 16:19:23 +08:00
RuoYi
14a859899c 代码生成模板支持主子表 2021-01-08 10:47:36 +08:00
若依
f3cb18c836 !161 修复导入数据为负浮点数时,导入结果会丢失精度问题
Merge pull request !161 from 嘿白熊/master
2021-01-08 10:46:36 +08:00
RuoYi
7d0eb3b8c7 用户显隐列添加不同key防止被复用 2021-01-07 13:28:16 +08:00
RuoYi
654aa6b30c 表格右侧工具栏组件支持显隐列 2021-01-06 17:30:39 +08:00
X.B-H
b7cdd10f9f 修复导入数据为负浮点数时丢失精度问题 2021-01-06 11:11:11 +08:00
RuoYi
9bd35cb7be 升级druid到最新版本v1.2.4 2021-01-06 11:00:20 +08:00
RuoYi
7a86c714fc 代码生成支持文件上传组件 2021-01-06 11:00:09 +08:00
RuoYi
edd090a098 代码生成支持文件上传组件 2021-01-05 20:59:14 +08:00
RuoYi
3cd886785b 图片组件添加预览功能 2021-01-05 20:33:41 +08:00
RuoYi
ae5a0f9774 新增文件上传组件 2021-01-05 20:11:09 +08:00
RuoYi
074b3c735d 设置单图上传控件 2021-01-05 16:17:41 +08:00
RuoYi
a118738d0f 单图上传组件添加移除 2021-01-05 16:13:22 +08:00
RuoYi
56fa3912ae 修复IE11浏览器报错问题 2021-01-05 09:44:08 +08:00
RuoYi
2116ee1822 Update copyright 2021-01-04 17:49:52 +08:00
RuoYi
57a2eb4217 操作按钮组调整为朴素按钮样式 2021-01-04 17:48:46 +08:00
RuoYi
647af5b485 菜单组件修改允许空字符串 2020-12-29 17:27:48 +08:00
若依
3f33219134 !156 修复 用户管理 -> 修改用户 手机号码 和 邮箱 不能清空
Merge pull request !156 from li_oxen/N/A
2020-12-29 17:14:31 +08:00
li_oxen
a04bb71777 修复 用户管理 -> 修改用户 手机号码 和 邮箱 不能清空 2020-12-29 13:51:15 +08:00
RuoYi
63992ac906 代码生成数据库文本类型生成表单文本域 2020-12-29 11:14:48 +08:00
RuoYi
0187344798 Excel注解支持Image图片导出 2020-12-27 10:04:45 +08:00
RuoYi
a9c6ba12e6 代码生成日期控件区分范围 2020-12-25 09:35:20 +08:00
RuoYi
ba068eae65 修正侧边栏静态路由丢失问题 2020-12-24 19:32:18 +08:00
若依
1a87ee7c19 防止get请求参数值为false或0等特殊值会导致无法正确的传参
Merge pull request !146 from wugh/hotfix/gitee-issue_I2A5FU
2020-12-22 16:19:51 +08:00
DokiYoloo
3c4b01ab83 权限工具类增加admin判断 2020-12-21 19:43:57 +08:00
wugh
886ce995af [bug修复] 解决get请求,如果参数值为false或0等特殊值会导致无法正确传参 2020-12-21 11:58:15 +08:00
RuoYi
52264b6e2a 优化多级菜单之间切换无法缓存的问题 2020-12-21 10:50:48 +08:00
RuoYi
fd7e88a518 配置文件新增redis数据库索引属性 2020-12-21 10:26:54 +08:00
若依
854a6f805f !145 redis 增加 database配置项,设置不同的库
Merge pull request !145 from li_oxen/N/A
2020-12-21 10:13:47 +08:00
li_oxen
1caec85f46 redis 增加 database配置项,设置不同的库 2020-12-19 10:08:09 +08:00
RuoYi
c86dc20743 移除path-to-regexp正则匹配插件 2020-12-17 12:05:29 +08:00
RuoYi
ecc7a8be46 优化多级菜单之间切换无法缓存的问题 2020-12-16 20:57:48 +08:00
RuoYi
e23ad20186 README 2020-12-16 10:20:02 +08:00
RuoYi
6cf2a8edeb 升级SpringBoot到最新版本2.2.12 提升启动速度 2020-12-16 10:05:53 +08:00
RuoYi
67198aede9 README 2020-12-15 10:06:12 +08:00
RuoYi
4f33da2a3f 登录后push添加catch防止出现检查错误 2020-12-15 10:04:09 +08:00
RuoYi
8988d0b4ab 若依 3.3.0 2020-12-14 09:02:10 +08:00
RuoYi
ceefa20aa2 调整代码生成页列宽 2020-12-13 16:05:49 +08:00
RuoYi
89e1f2a53f 修改Set可能导致嵌套的问题 2020-12-13 15:01:03 +08:00
若依
6800a12014 !138 修改Set可能导致嵌套的问题
Merge pull request !138 from BecomeDream/N/A
2020-12-13 14:54:17 +08:00
BecomeDream
e8f63b2994 修改Set可能导致嵌套的问题 2020-12-11 18:16:57 +08:00
RuoYi
ecfe7006e2 代码生成预览支持高亮显示 2020-12-11 17:04:54 +08:00
RuoYi
9e387dc447 去除用户手机邮箱部门必填验证 2020-12-11 13:26:14 +08:00
若依
231bbf6928 !135 增加日志记录过滤对象类型(解决多文件场景报错)
Merge pull request !135 from geruishi/master
2020-12-11 13:24:03 +08:00
RuoYi
d6eac2dc8d 前端更新插件版本 2020-12-11 09:27:12 +08:00
RuoYi
b368ad764f 升级core-js到最新版本3.8.1 2020-12-10 12:08:18 +08:00
RuoYi
ffd5f0ce5d 升级vue-router到最新版本3.4.9 2020-12-10 11:14:44 +08:00
RuoYi
a50beae599 代码生成预览提供滚动机制 2020-12-10 11:13:39 +08:00
葛瑞士
cf7f51a633 解决多文件上传Log报错 2020-12-09 16:05:09 +08:00
RuoYi
4d46f4c1b5 删除用户和角色解绑关联 2020-12-09 10:32:53 +08:00
若依
a941c1b488 !134 修改 代码生成 预览无法左右滑动
Merge pull request !134 from 〝走走停停/master
2020-12-09 10:27:34 +08:00
〝走走停停
d6b6151aea update ruoyi-ui/src/assets/styles/ruoyi.scss. 2020-12-08 17:49:51 +08:00
RuoYi
fbc071a573 关闭页签清理缓存数据 2020-12-08 16:43:26 +08:00
RuoYi
6cfff90b4a 缓存仪表图设置默认大小 2020-12-08 16:13:21 +08:00
RuoYi
474cca921e 回显数据字典防止空值报错 2020-12-08 16:12:00 +08:00
若依
1657e06be6 !132 update ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java.
Merge pull request !132 from abbfun/N/A
2020-12-08 16:03:51 +08:00
abbfun
c01eeb8521 update ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java. 2020-12-08 11:11:34 +08:00
RuoYi
f90899d72a 支持主题风格配置 2020-12-07 14:13:02 +08:00
RuoYi
7e78a9167f 修改用户头像预览宽高 2020-12-06 16:22:45 +08:00
RuoYi
563e11d9c1 get请求params添加null值判断 2020-12-06 11:05:02 +08:00
RuoYi
ef92ad4d8c 支持get请求映射params参数 2020-12-04 10:52:20 +08:00
RuoYi
d8b006c15f 升级bitwalker到最新版本1.21 2020-12-04 10:51:20 +08:00
RuoYi
0e2b97a886 升级poi到最新版本4.1.2 2020-12-03 13:28:04 +08:00
RuoYi
1c7a5faae8 Excel支持注解align对齐方式 2020-12-03 13:26:46 +08:00
RuoYi
23868c4fad 防止安全扫描YUI出现的风险提示 2020-12-03 10:26:22 +08:00
RuoYi
3b2669d148 修改缓存监控内存单位 2020-11-30 19:27:03 +08:00
RuoYi
1147ea5f8a 设置用户头像悬停高度 2020-11-30 11:10:27 +08:00
RuoYi
a1bf5aaf8e 升级element-ui版本到2.14.1 2020-11-30 10:37:48 +08:00
RuoYi
2797c1eb3a 修正转换字符串的目标字符集属性 2020-11-30 10:31:11 +08:00
若依
1791d7cf40 !126 update pom.xml.
Merge pull request !126 from abbfun/N/A
2020-11-30 10:07:08 +08:00
abbfun
01861f0aae update pom.xml. 2020-11-29 16:16:54 +08:00
RuoYi
a69cc94f35 三级菜单自动配置组件 2020-11-28 20:39:03 +08:00
RuoYi
c666faed66 修复三级菜单之间切换页面无法缓存的问题 2020-11-28 20:31:45 +08:00
RuoYi
6072239a40 修改缓存监控内存单位 2020-11-28 13:57:19 +08:00
RuoYi
a3b86d6f6d 代码生成删除多余的数字float类型 2020-11-28 12:09:24 +08:00
RuoYi
fd831d5a90 Excel支持导入Boolean型数据 2020-11-28 12:08:55 +08:00
RuoYi
e83412b9a5 升级oshi到最新版本v5.3.6 2020-11-24 16:17:33 +08:00
RuoYi
90ac416e02 新增缓存监控功能 2020-11-23 10:02:50 +08:00
RuoYi
5b63f0cab9 优化头像样式,鼠标移入悬停遮罩 2020-11-19 09:33:10 +08:00
RuoYi
8f145bba3a 若依 v3.2.1 2020-11-18 09:32:15 +08:00
RuoYi
6bb166b89f 阻止任意文件下载漏洞 2020-11-17 10:29:52 +08:00
RuoYi
823e95667e 代码生成支持上传控件 2020-11-16 16:20:17 +08:00
RuoYi
566053da0c 新增图片上传组件 2020-11-16 15:52:58 +08:00
RuoYi
0ef007240d 调整默认首页 2020-11-07 10:38:35 +08:00
RuoYi
0a75dcdd85 升级druid到最新版本v1.2.2 2020-11-05 13:58:36 +08:00
RuoYi
4c2626ffec 2020年双十一云服务器优惠,错过又要等一年 2020-11-04 16:58:28 +08:00
RuoYi
082b19e33a mapperLocations配置支持分隔符 2020-11-02 17:34:52 +08:00
若依
b779cf053d !112 未选择时,点击“确认”,出现必填验证提示。使用blur的话,选择之后验证消息不会自动消失,使用change会自动消失。
Merge pull request !112 from FlyFive/N/A
2020-11-02 17:30:06 +08:00
FlyFive
212012dc62 未选择时,点击“确认”,出现必填验证提示。使用blur的话,选择之后验证消息不会自动消失,使用change会自动消失。 2020-11-02 11:49:25 +08:00
若依
7de2cf77b4 !111 update ruoyi-ui/src/views/system/dept/index.vue.
Merge pull request !111 from FlyFive/N/A
2020-10-26 16:57:58 +08:00
FlyFive
2b9d46439f update ruoyi-ui/src/views/system/dept/index.vue.
验证的提示信息错了
2020-10-26 16:31:51 +08:00
若依
79265d59b7 !109 误修改,回退
Merge pull request !109 from tucke/master
2020-10-26 10:00:46 +08:00
tucke
093ba5b389 误修改,回退 2020-10-26 09:53:58 +08:00
RuoYi
3807b11290 权限调整 2020-10-23 17:27:20 +08:00
RuoYi
c9f25cb34e 调整sql默认时间 2020-10-21 11:30:37 +08:00
若依
203b54e5aa !106 update ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java.
Merge pull request !106 from abbfun/N/A
2020-10-14 17:12:57 +08:00
RuoYi
403f5c5dcf 解决代码生成没有bit类型的问题 2020-10-14 17:08:20 +08:00
abbfun
c6d0b9a9ae update ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java.
权限字符串修正
2020-10-14 16:21:43 +08:00
RuoYi
08df2c93a9 删除不必要的代码 2020-10-13 14:41:26 +08:00
若依
fbbdd94999 !105 update ruoyi-ui/src/views/system/role/index.vue.
Merge pull request !105 from FlyFive/N/A
2020-10-13 14:38:02 +08:00
FlyFive
0cae7d0058 update ruoyi-ui/src/views/system/role/index.vue.
getMenuAllCheckedKeys()方法中选中节点和半选节点获取的方法反了。
2020-10-12 13:50:25 +08:00
RuoYi
b0965653bf 删除不必要的代码 2020-10-10 17:54:30 +08:00
RuoYi
e472f62523 升级pagehelper到最新版1.3.0 2020-10-10 16:39:14 +08:00
RuoYi
69256940df 若依 3.2 2020-10-10 09:38:21 +08:00
RuoYi
b9f686be53 升级druid到最新版本v1.2.1 2020-10-09 11:45:33 +08:00
RuoYi
521ff51238 升级fastjson到最新版1.2.74 2020-10-09 11:45:06 +08:00
若依
f67c97e095 !102 rouyi.js中添加日期范围方法dateRange获取bug修复
Merge pull request !102 from zora/master
2020-10-09 11:37:18 +08:00
RuoYi
dd721ff894 修正定时任务执行一次权限标识 2020-10-07 13:36:55 +08:00
RuoYi
ae4290bdda 修复页签关闭所有固定标签路由不刷新问题 2020-10-03 20:05:24 +08:00
RuoYi
c19fec2cf8 格式化代码 2020-10-03 20:05:06 +08:00
RuoYi
669c42795a 表单构建布局型组件新增按钮 2020-10-03 17:47:24 +08:00
RuoYi
0d79f10c2f jna指定版本 2020-10-03 11:43:23 +08:00
RuoYi
d3595cd930 修正菜单提示信息错误 2020-10-03 11:15:18 +08:00
shizhenwei
5b0525d05c [修改]此工具类应使用参数dateRange而非bind在model上的dateRange 2020-09-27 13:22:23 +08:00
RuoYi
fb07677c32 左侧菜单文字过长显示省略号 2020-09-24 19:21:55 +08:00
RuoYi
a82a3d9465 升级oshi到最新版本v5.2.5 2020-09-22 18:25:58 +08:00
RuoYi
28bceda630 修正文字错误 2020-09-22 11:09:18 +08:00
RuoYi
69829827fe 菜单&数据权限新增(展开/折叠 全选/全不选 父子联动) 2020-09-21 14:10:01 +08:00
若依
89607fb028 !100 解决添加用户角色时报错问题
Merge pull request !100 from wensanpi/master
2020-09-21 10:31:59 +08:00
wensanpi
1aa18c523d update ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml. 2020-09-20 17:38:21 +08:00
RuoYi
abeb8d7fd8 菜单新增是否缓存keep-alive 2020-09-20 10:34:03 +08:00
RuoYi
478fae0d28 菜单&数据权限新增(展开/折叠 全选/全不选 父子联动) 2020-09-19 13:42:37 +08:00
RuoYi
0ecf27f8d6 去除多余的空格 2020-09-18 17:09:27 +08:00
RuoYi
0a5bb34fbf 升级springboot到2.1.17 提升安全性 2020-09-18 16:51:27 +08:00
RuoYi
9e38c7de2e 代码生成支持同步数据库 2020-09-18 10:24:21 +08:00
RuoYi
9ca28d6dbf 表格操作列间距调整 2020-09-18 10:23:31 +08:00
RuoYi
497f98ba90 导入excel整形值校验优化 2020-09-17 18:22:50 +08:00
RuoYi
a948affb2d 代码生成支持富文本控件 2020-09-15 15:53:27 +08:00
RuoYi
57b49dd5fa 限制系统内置参数不允许删除 2020-09-15 15:51:12 +08:00
RuoYi
9c0ed9c424 修复通知公告longblob类型乱码问题 2020-09-10 18:23:12 +08:00
RuoYi
70ab18052c 富文本工具栏样式对齐 2020-09-10 16:56:33 +08:00
RuoYi
aeb02c79d8 修正注释图标路径 2020-09-10 16:53:58 +08:00
RuoYi
33793d8eff Excel导出类型NUMERIC支持精度浮点类型 2020-09-09 11:30:34 +08:00
RuoYi
9652906954 降级druid到版本v1.1.22,防止出现一些错误 2020-09-09 10:08:31 +08:00
RuoYi
9fccc7de40 修正调用目标字符串最大长度 2020-09-07 16:40:38 +08:00
RuoYi
599be64fa8 升级jjwt到0.9.1 2020-09-07 16:40:21 +08:00
RuoYi
50ac363682 升级druid到最新版本v1.1.23 2020-09-04 14:47:07 +08:00
若依
f84b157419 !87 数据权限中的空值处理
Merge pull request !87 from sproutcat/master
2020-09-04 14:17:32 +08:00
若依
f4536d5d2e !86 数据字典缓存处理的一点小问题
Merge pull request !86 from 说一/master
2020-09-04 14:07:47 +08:00
若依
aed958b1be !82 修复Editor组件在传入内容为null时无法响应式更新其内容的bug
Merge pull request !82 from HaoRan/N/A
2020-09-04 14:04:08 +08:00
tzg
0a51f7d743 空值处理 2020-09-02 14:59:10 +08:00
dawn
3fd9147afb 解决“在只填加了字典类型,没有添加字典数据时,会出现缓存了空集合,即使后边添加了字典数据也没用,只能清空redis缓存。”的问题,小问题就是判断稍稍改了下,若依大大让我pr当个贡献者,很荣幸很欣慰。感谢! 2020-09-02 10:14:34 +08:00
RuoYi
4f86b6d9ca 修改公告内容字段类型 2020-09-01 18:07:59 +08:00
HaoRan
a65c287075 修复Editor组件无法对响应式更新null值问题 2020-08-31 02:10:01 +08:00
RuoYi
1af0d1665c 数据权限判断对象类型 2020-08-28 15:45:54 +08:00
RuoYi
4e32788b36 修正数据库字符串类型nvarchar 2020-08-28 14:11:32 +08:00
RuoYi
068c3e6f0d 优化递归子节点 2020-08-28 10:14:59 +08:00
RuoYi
dd6640086e 代码生成树模板去掉多余双引号 2020-08-27 17:34:06 +08:00
RuoYi
be54188ba6 导出Excel调整targetAttr获取值方法,防止get方法不规范 2020-08-26 15:39:46 +08:00
RuoYi
a4e2339f90 生成页面时不忽略remark属性 2020-08-26 14:24:37 +08:00
RuoYi
bf771ae5c8 Excel注解支持自动统计数据总和 2020-08-26 11:37:49 +08:00
RuoYi
fa5596bb20 Editor组件优化,支持自定义高度&图片冲突问题 2020-08-22 13:18:41 +08:00
RuoYi
eb30fc4b1a 修改公告内容字段类型 2020-08-22 13:11:40 +08:00
RuoYi
0446d211df 设置默认排序顺序 2020-08-19 17:02:23 +08:00
RuoYi
da146c2a70 Excel注解支持设置BigDecimal精度&舍入规则 2020-08-19 11:20:31 +08:00
RuoYi
7de5358dcd 升级fastjson到最新版1.2.73 2020-08-19 11:17:24 +08:00
RuoYi
549c7ee97a 代码生成添加select必填选项 2020-08-18 18:15:12 +08:00
RuoYi
5fcf342f5a 修改sass为node-sass,避免el-icon图标乱码 2020-08-18 17:36:20 +08:00
若依
c89722a7dd !74 update ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java.
Merge pull request !74 from Lyy/N/A
2020-08-18 17:30:18 +08:00
若依
61e10f2783 !73 代码生成:select的表单验证失效
Merge pull request !73 from sunshine/master
2020-08-18 17:30:03 +08:00
若依
c6912ca1d5 !64 修改sass为node-sass,避免el-icon图标乱码
Merge pull request !64 from 心悦李国楠/dev-心悦
2020-08-18 17:27:19 +08:00
若依
5c4f0c5503 !65 根节点为子部门时,树状结构显示问题
Merge pull request !65 from GSTong/master
2020-08-18 17:21:51 +08:00
Lyy
4f7702b22a update ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java.
修改注释,CRSF禁用
2020-08-17 17:05:33 +08:00
sunshine
04e294b3e5 代码生成:select的表单验证失效 2020-08-17 12:08:34 +08:00
RuoYi
d596d5bb8e 还原 addDateRange js 函数 2020-08-13 12:08:24 +08:00
RuoYi
8f9f0c04cc 若依 3.1 2020-08-13 10:27:56 +08:00
RuoYi
1bad003fe3 修改公私钥 2020-08-12 11:55:26 +08:00
RuoYi
ad4df6245d 优化防重复提交拦截器,请求没有消息头则使用地址 2020-08-11 11:24:55 +08:00
gst
0070297fe1 根节点为子部门时,树状结构显示问题 2020-08-11 10:59:02 +08:00
RuoYi
71ec44a545 修正在线用户日志记录类型 2020-08-10 17:26:11 +08:00
RuoYi
1efae4a588 优化防重复提交拦截器,接口请求非json数据不获取Body消息体 2020-08-10 17:10:34 +08:00
liguonan
650359c357 修改sass为node-sass,避免el-icon图标乱码 2020-08-10 16:28:50 +08:00
RuoYi
a78211ca00 优化上级菜单不能选择自己 2020-08-10 12:20:52 +08:00
RuoYi
74f52677be 表格右侧工具栏组件 2020-08-10 10:12:39 +08:00
若依
60d5c03e65 !63 重写表格工具栏右侧添加刷新&显隐查询栏
Merge pull request !63 from 平凡/重写表格工具栏右侧添加刷新&显隐查询栏
2020-08-10 09:53:27 +08:00
平凡
5b04f388e9 重写表格工具栏右侧添加刷新&显隐查询栏 2020-08-09 11:07:10 +08:00
RuoYi
a7eb07c7a0 Merge branch 'master' of https://gitee.com/y_project/RuoYi-Vue 2020-08-07 16:07:02 +08:00
RuoYi
d0b315f4a5 删除重复的placeholder 2020-08-07 16:03:45 +08:00
若依
a6051d4638 !60 代码注释错误
Merge pull request !60 from waylon/master
2020-08-07 15:56:44 +08:00
wanglei
c4ee9ea7c8 修复注释错误 2020-08-07 14:26:30 +08:00
RuoYi
7c39f92538 修复富文本空格和缩进保存后不生效问题 2020-08-07 12:26:15 +08:00
RuoYi
51fa66f61a 唯一限制条件只返回单条数据 2020-08-05 14:28:45 +08:00
RuoYi
3b61ed56b0 添加获取当前的环境配置方法 2020-08-05 12:56:32 +08:00
若依
db904f679e !57 若干 ruoyi-ui 前端公共工具函数优化
Merge pull request !57 from FungLeo/master
2020-08-05 11:39:56 +08:00
若依
98982515f7 !55 修复在线用户判断逻辑
Merge pull request !55 from 心悦李国楠/dev-心悦
2020-08-05 11:39:09 +08:00
若依
1a7baa0639 !58 cell的cellType由Numeric修正为String
Merge pull request !58 from 4ook/master
2020-08-05 11:38:44 +08:00
mazh
a9695d1756 修复BUG: 导出Excel功能, 当attr的cellType为String时, cell的cellType由Numeric修正为String。 2020-08-05 11:28:57 +08:00
fungleo
d78f642201 Merge remote-tracking branch 'upstream/master' 2020-08-05 10:26:05 +08:00
fungleo
26dfee2ce8 彻底重写回显数据字典方法 2020-08-05 10:24:54 +08:00
RuoYi
b56898858d 超时登录后页面跳转到首页 2020-08-05 10:04:43 +08:00
fungleo
503dd64e3f 优化 addDateRange js 函数 2020-08-04 14:32:29 +08:00
fungleo
876ecf21c7 优化构建树形数据JS方法 2020-08-04 14:11:02 +08:00
fungleo
107672419e Merge remote-tracking branch 'upstream/master' 2020-08-04 11:59:42 +08:00
RuoYi
21d07c1d71 修复角色的权限分配后,未实时生效问题 2020-08-04 11:51:25 +08:00
fungleo
d8d636fdbd 优化 回显数据字典(字符串数组)JS 函数 2020-08-04 11:39:43 +08:00
RuoYi
743fce7829 优化防重提交唯一标识 2020-08-04 11:07:37 +08:00
liguonan
de2ac66f0b 修复在线用户判断逻辑 2020-08-03 17:57:33 +08:00
RuoYi
8b5d254242 全局异常状态汉化拦截处理 2020-08-03 09:11:49 +08:00
RuoYi
a7eb0f98ac README 2020-08-03 09:02:28 +08:00
RuoYi
4dcf737db0 表格工具栏右侧添加刷新&显隐查询栏 2020-08-01 15:45:38 +08:00
RuoYi
b32d0724b7 升级vue-cli版本到4.4.4 2020-07-31 22:35:30 +08:00
若依
8deacb702e !54 update ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml.
Merge pull request !54 from yongdaidai/N/A
2020-07-31 16:50:28 +08:00
若依
5be8d46d05 !51 优化生成vue文件的vm模板文件
Merge pull request !51 from FungLeo/master
2020-07-31 16:49:51 +08:00
yongdaidai
fb19dd3e4e update ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml.
解决如果导入多个同名部门dept_name,parent_id相同,但是删除状态(del_flag)不同,导致查询结果为多条,mybatis不能映射为一条数据的问题.
2020-07-31 14:59:23 +08:00
RuoYi
cbf4795fd5 表单类型为Integer/Long设置整形默认值 2020-07-30 21:47:50 +08:00
RuoYi
5d74ed32bd 表单类型为Integer/Long设置整形默认值 2020-07-30 16:03:44 +08:00
若依
6afaced3cf !53 update ruoyi-ui/src/views/system/role/index.vue.
Merge pull request !53 from abbfun/N/A
2020-07-30 10:04:11 +08:00
abbfun
f3976c0792 update ruoyi-ui/src/views/system/role/index.vue.
权限修正(角色导出权限)
2020-07-29 21:16:53 +08:00
RuoYi
22225a5119 HTML过滤器改为将html转义 2020-07-28 17:28:09 +08:00
RuoYi
fe030cc022 修改 node-sass 为 dart-sass 2020-07-27 16:55:51 +08:00
fungleo
ca657b0482 优化 index-tree.vue.vm 文件,undefined 修改为 null 2020-07-26 17:33:42 +08:00
fungleo
c1d1ace36d 优化index.vue.vm模板,!=1修改为严格不等;undefined修改为null 2020-07-26 17:29:40 +08:00
RuoYi
6e7d7aba93 代码生成支持自定义路径 2020-07-24 15:37:57 +08:00
RuoYi
388e36ed4d 优化参数 2020-07-23 21:45:22 +08:00
若依
5d89d0b36a !49 代码生成器默认mapper路径与默认mapperScan路径不一致
Merge pull request !49 from HaoRan/master
2020-07-23 21:25:10 +08:00
若依
55095a50b5 !48 ExcelUtil 功能优化
Merge pull request !48 from soulCoke/master
2020-07-23 21:25:02 +08:00
HR.Hu
ee4b4de7b1 修复 代码生成器默认mapper路径与默认mapperScan路径不一致的bug 2020-07-23 21:01:18 +08:00
RuoYi
92c6301285 Excel支持分割字符串组内容 2020-07-23 18:58:45 +08:00
RuoYi
5c6adb25fc 代码生成支持复选框 2020-07-23 17:02:55 +08:00
soulCoke
8dd3ca5bb6 excel 导入数字不需要格式化 ,导入允许列和属性个数不一致。 2020-07-23 15:54:03 +08:00
Sxile
be778ba370 修复参数注释 2020-07-23 14:54:11 +08:00
RuoYi
52d48fa63e 检查字符支持小数点&降级改成异常提醒 2020-07-23 11:29:40 +08:00
RuoYi
df3ef54b41 验证码类型支持(数组计算、字符验证) 2020-07-23 11:17:04 +08:00
RuoYi
1e40e60dbf 支持CORS跨域请求 2020-07-22 15:25:42 +08:00
若依
133a10ecf2 !47 修复和优化前端 utils 工具函数
Merge pull request !47 from FungLeo/master
2020-07-22 13:00:51 +08:00
RuoYi
6a84ae42a5 代码生成支持选择上级菜单 2020-07-21 15:52:11 +08:00
RuoYi
b2d79b62d1 代码生成支持选择上级菜单 2020-07-21 11:21:20 +08:00
fungleo
a09a342f58 优化 uitls/ruoyi.js 中 selectDictLabel 方法,数组迭代器换为 some
提高性能
2020-07-21 10:22:07 +08:00
fungleo
3e1bd8e3bc 修复 utils/index.js 中不包含 parseTime 函数的 bug 2020-07-21 10:18:56 +08:00
RuoYi
8a076e175f Excel导出导入支持dictType字典类型 2020-07-20 15:25:05 +08:00
443 changed files with 29963 additions and 13030 deletions

1
.github/FUNDING.yml vendored Normal file
View File

@ -0,0 +1 @@
custom: http://doc.ruoyi.vip/ruoyi-vue/other/donate.html

6
.gitignore vendored
View File

@ -25,6 +25,9 @@ target/
*.iml *.iml
*.ipr *.ipr
### JRebel ###
rebel.xml
### NetBeans ### ### NetBeans ###
nbproject/private/ nbproject/private/
build/* build/*
@ -37,7 +40,8 @@ nbdist/
# Others # Others
*.log *.log
*.xml.versionsBackup *.xml.versionsBackup
*.swp
!*/build/*.java !*/build/*.java
!*/build/*.html !*/build/*.html
!*/build/*.xml !*/build/*.xml

View File

@ -1,14 +1,29 @@
<p align="center">
<img alt="logo" src="https://oscimg.oschina.net/oscnet/up-d3d0a9303e11d522a06cd263f3079027715.png">
</p>
<h1 align="center" style="margin: 30px 0 30px; font-weight: bold;">RuoYi v3.8.2</h1>
<h4 align="center">基于SpringBoot+Vue前后端分离的Java快速开发框架</h4>
<p align="center">
<a href="https://gitee.com/y_project/RuoYi-Vue/stargazers"><img src="https://gitee.com/y_project/RuoYi-Vue/badge/star.svg?theme=dark"></a>
<a href="https://gitee.com/y_project/RuoYi-Vue"><img src="https://img.shields.io/badge/RuoYi-v3.8.2-brightgreen.svg"></a>
<a href="https://gitee.com/y_project/RuoYi-Vue/blob/master/LICENSE"><img src="https://img.shields.io/github/license/mashape/apistatus.svg"></a>
</p>
## 平台简介 ## 平台简介
若依是一套全部开源的快速开发平台,毫无保留给个人及企业免费使用。
* 前端采用Vue、Element UI。 * 前端采用Vue、Element UI。
* 后端采用Spring Boot、Spring Security、Redis & Jwt。 * 后端采用Spring Boot、Spring Security、Redis & Jwt。
* 权限认证使用Jwt支持多终端认证系统。 * 权限认证使用Jwt支持多终端认证系统。
* 支持加载动态权限菜单,多方式轻松权限控制。 * 支持加载动态权限菜单,多方式轻松权限控制。
* 高效率开发,使用代码生成器可以一键生成前后端代码。 * 高效率开发,使用代码生成器可以一键生成前后端代码。
* 提供了一个Oracle版本[RuoYi-Vue-Oracle](https://github.com/yangzongzhuan/RuoYi-Vue-Oracle),保持同步更新。 * 提供了技术栈([Vue3](https://v3.cn.vuejs.org) [Element Plus](https://element-plus.org/zh-CN) [Vite](https://cn.vitejs.dev))版本[RuoYi-Vue3](https://github.com/yangzongzhuan/RuoYi-Vue3),保持同步更新。
* 感谢[Vue-Element-Admin](https://github.com/PanJiaChen/vue-element-admin)[eladmin-web](https://gitee.com/elunez/eladmin-web?_from=gitee_search)。 * 提供了单应用版本[RuoYi-Vue-fast](https://github.com/yangzongzhuan/RuoYi-Vue-fast)Oracle版本[RuoYi-Vue-Oracle](https://github.com/yangzongzhuan/RuoYi-Vue-Oracle),保持同步更新
* 不分离版本,请移步[RuoYi](https://gitee.com/y_project/RuoYi),微服务版本,请移步[RuoYi-Cloud](https://gitee.com/y_project/RuoYi-Cloud) * 不分离版本,请移步[RuoYi](https://gitee.com/y_project/RuoYi),微服务版本,请移步[RuoYi-Cloud](https://gitee.com/y_project/RuoYi-Cloud)
* 阿里云优惠券:[点我进入](https://www.aliyun.com/minisite/goods?userCode=brki8iof&share_source=copy_link),腾讯云优惠券:[点我领取](https://cloud.tencent.com/redirect.php?redirect=1025&cps_key=198c8df2ed259157187173bc7f4f32fd&from=console)&nbsp;&nbsp; * 特别鸣谢:[element](https://github.com/ElemeFE/element)[vue-element-admin](https://github.com/PanJiaChen/vue-element-admin)[eladmin-web](https://github.com/elunez/eladmin-web)。
* 阿里云折扣场:[点我进入](http://aly.ruoyi.vip),腾讯云秒杀场:[点我进入](http://txy.ruoyi.vip)&nbsp;&nbsp;
* 阿里云优惠券:[点我领取](https://www.aliyun.com/minisite/goods?userCode=brki8iof&share_source=copy_link),腾讯云优惠券:[点我领取](https://cloud.tencent.com/redirect.php?redirect=1025&cps_key=198c8df2ed259157187173bc7f4f32fd&from=console)&nbsp;&nbsp;
## 内置功能 ## 内置功能
@ -27,8 +42,9 @@
13. 代码生成前后端代码的生成java、html、xml、sql支持CRUD下载 。 13. 代码生成前后端代码的生成java、html、xml、sql支持CRUD下载 。
14. 系统接口根据业务代码自动生成相关的api接口文档。 14. 系统接口根据业务代码自动生成相关的api接口文档。
15. 服务监控监视当前系统CPU、内存、磁盘、堆栈等相关信息。 15. 服务监控监视当前系统CPU、内存、磁盘、堆栈等相关信息。
16. 在线构建器拖动表单元素生成相应的HTML代码。 16. 缓存监控:对系统的缓存信息查询,命令统计等。
17. 连接池监视监视当前系统数据库连接池状态可进行分析SQL找出系统性能瓶颈。 17. 在线构建器拖动表单元素生成相应的HTML代码。
18. 连接池监视监视当前系统数据库连接池状态可进行分析SQL找出系统性能瓶颈。
## 在线体验 ## 在线体验
@ -46,36 +62,36 @@
<td><img src="https://oscimg.oschina.net/oscnet/1cbcf0e6f257c7d3a063c0e3f2ff989e4b3.jpg"/></td> <td><img src="https://oscimg.oschina.net/oscnet/1cbcf0e6f257c7d3a063c0e3f2ff989e4b3.jpg"/></td>
</tr> </tr>
<tr> <tr>
<td><img src="https://oscimg.oschina.net/oscnet/707825ad3f29de74a8d6d02fbd73ad631ea.jpg"/></td> <td><img src="https://oscimg.oschina.net/oscnet/up-8074972883b5ba0622e13246738ebba237a.png"/></td>
<td><img src="https://oscimg.oschina.net/oscnet/46be40cc6f01aa300eed53a19b5012bf484.jpg"/></td> <td><img src="https://oscimg.oschina.net/oscnet/up-9f88719cdfca9af2e58b352a20e23d43b12.png"/></td>
</tr> </tr>
<tr> <tr>
<td><img src="https://oscimg.oschina.net/oscnet/4284796d4cea240d181b8f2201813dda710.jpg"/></td> <td><img src="https://oscimg.oschina.net/oscnet/up-39bf2584ec3a529b0d5a3b70d15c9b37646.png"/></td>
<td><img src="https://oscimg.oschina.net/oscnet/3ecfac87a049f7fe36abbcaafb2c40d36cf.jpg"/></td> <td><img src="https://oscimg.oschina.net/oscnet/up-936ec82d1f4872e1bc980927654b6007307.png"/></td>
</tr> </tr>
<tr> <tr>
<td><img src="https://oscimg.oschina.net/oscnet/71c2d48905221a09a728df4aff4160b8607.jpg"/></td> <td><img src="https://oscimg.oschina.net/oscnet/up-b2d62ceb95d2dd9b3fbe157bb70d26001e9.png"/></td>
<td><img src="https://oscimg.oschina.net/oscnet/c14c1ee9a64a6a9c2c22f67d43198767dbe.jpg"/></td> <td><img src="https://oscimg.oschina.net/oscnet/up-d67451d308b7a79ad6819723396f7c3d77a.png"/></td>
</tr> </tr>
<tr> <tr>
<td><img src="https://oscimg.oschina.net/oscnet/5e8c387724954459291aafd5eb52b456f53.jpg"/></td> <td><img src="https://oscimg.oschina.net/oscnet/5e8c387724954459291aafd5eb52b456f53.jpg"/></td>
<td><img src="https://oscimg.oschina.net/oscnet/644e78da53c2e92a95dfda4f76e6d117c4b.jpg"/></td> <td><img src="https://oscimg.oschina.net/oscnet/644e78da53c2e92a95dfda4f76e6d117c4b.jpg"/></td>
</tr> </tr>
<tr> <tr>
<td><img src="https://oscimg.oschina.net/oscnet/fdea1d8bb8625c27bf964176a2c8ebc6945.jpg"/></td> <td><img src="https://oscimg.oschina.net/oscnet/up-8370a0d02977eebf6dbf854c8450293c937.png"/></td>
<td><img src="https://oscimg.oschina.net/oscnet/509d2708cfd762b6e6339364cac1cc1970c.jpg"/></td> <td><img src="https://oscimg.oschina.net/oscnet/up-49003ed83f60f633e7153609a53a2b644f7.png"/></td>
</tr> </tr>
<tr> <tr>
<td><img src="https://oscimg.oschina.net/oscnet/up-f1fd681cc9d295db74e85ad6d2fe4389454.png"/></td> <td><img src="https://oscimg.oschina.net/oscnet/up-d4fe726319ece268d4746602c39cffc0621.png"/></td>
<td><img src="https://oscimg.oschina.net/oscnet/up-c195234bbcd30be6927f037a6755e6ab69c.png"/></td> <td><img src="https://oscimg.oschina.net/oscnet/up-c195234bbcd30be6927f037a6755e6ab69c.png"/></td>
</tr> </tr>
<tr> <tr>
<td><img src="https://oscimg.oschina.net/oscnet/b6115bc8c31de52951982e509930b20684a.jpg"/></td> <td><img src="https://oscimg.oschina.net/oscnet/b6115bc8c31de52951982e509930b20684a.jpg"/></td>
<td><img src="https://oscimg.oschina.net/oscnet/up-6d73c2140ce694e3de4c05035fdc1868d4c.png"/></td> <td><img src="https://oscimg.oschina.net/oscnet/up-5e4daac0bb59612c5038448acbcef235e3a.png"/></td>
</tr> </tr>
</table> </table>
## 若依前后端分离交流群 ## 若依前后端分离交流群
QQ群 [![加入QQ群](https://img.shields.io/badge/已满-937441-blue.svg)](https://jq.qq.com/?_wv=1027&k=5bVB1og) [![加入QQ群](https://img.shields.io/badge/已满-887144332-blue.svg)](https://jq.qq.com/?_wv=1027&k=5eiA4DH) [![加入QQ群](https://img.shields.io/badge/已满-180251782-blue.svg)](https://jq.qq.com/?_wv=1027&k=5AxMKlC) [![加入QQ群](https://img.shields.io/badge/104180207-blue.svg)](https://jq.qq.com/?_wv=1027&k=51G72yr) 点击按钮入群。 QQ群 [![加入QQ群](https://img.shields.io/badge/已满-937441-blue.svg)](https://jq.qq.com/?_wv=1027&k=5bVB1og) [![加入QQ群](https://img.shields.io/badge/已满-887144332-blue.svg)](https://jq.qq.com/?_wv=1027&k=5eiA4DH) [![加入QQ群](https://img.shields.io/badge/已满-180251782-blue.svg)](https://jq.qq.com/?_wv=1027&k=5AxMKlC) [![加入QQ群](https://img.shields.io/badge/已满-104180207-blue.svg)](https://jq.qq.com/?_wv=1027&k=51G72yr) [![加入QQ群](https://img.shields.io/badge/已满-186866453-blue.svg)](https://jq.qq.com/?_wv=1027&k=VvjN2nvu) [![加入QQ群](https://img.shields.io/badge/已满-201396349-blue.svg)](https://jq.qq.com/?_wv=1027&k=5vYAqA05) [![加入QQ群](https://img.shields.io/badge/已满-101456076-blue.svg)](https://jq.qq.com/?_wv=1027&k=kOIINEb5) [![加入QQ群](https://img.shields.io/badge/已满-101539465-blue.svg)](https://jq.qq.com/?_wv=1027&k=UKtX5jhs) [![加入QQ群](https://img.shields.io/badge/已满-264312783-blue.svg)](https://jq.qq.com/?_wv=1027&k=EI9an8lJ) [![加入QQ群](https://img.shields.io/badge/167385320-blue.svg)](https://jq.qq.com/?_wv=1027&k=SWCtLnMz) 点击按钮入群。

View File

@ -1,6 +1,6 @@
@echo off @echo off
echo. echo.
echo [信息] 清理生成路径。 echo [信息] 清理工程target生成路径。
echo. echo.
%~d0 %~d0

View File

@ -1,6 +1,6 @@
@echo off @echo off
echo. echo.
echo [信息] 运行Web工程。 echo [信息] 使用Jar命令运行Web工程。
echo. echo.
cd %~dp0 cd %~dp0

33
demo/.gitignore vendored Normal file
View File

@ -0,0 +1,33 @@
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/

BIN
demo/.mvn/wrapper/maven-wrapper.jar vendored Normal file

Binary file not shown.

View File

@ -0,0 +1,2 @@
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.4/apache-maven-3.8.4-bin.zip
wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar

316
demo/mvnw vendored Normal file
View File

@ -0,0 +1,316 @@
#!/bin/sh
# ----------------------------------------------------------------------------
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# ----------------------------------------------------------------------------
# ----------------------------------------------------------------------------
# Maven Start Up Batch script
#
# Required ENV vars:
# ------------------
# JAVA_HOME - location of a JDK home dir
#
# Optional ENV vars
# -----------------
# M2_HOME - location of maven2's installed home dir
# MAVEN_OPTS - parameters passed to the Java VM when running Maven
# e.g. to debug Maven itself, use
# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
# ----------------------------------------------------------------------------
if [ -z "$MAVEN_SKIP_RC" ] ; then
if [ -f /usr/local/etc/mavenrc ] ; then
. /usr/local/etc/mavenrc
fi
if [ -f /etc/mavenrc ] ; then
. /etc/mavenrc
fi
if [ -f "$HOME/.mavenrc" ] ; then
. "$HOME/.mavenrc"
fi
fi
# OS specific support. $var _must_ be set to either true or false.
cygwin=false;
darwin=false;
mingw=false
case "`uname`" in
CYGWIN*) cygwin=true ;;
MINGW*) mingw=true;;
Darwin*) darwin=true
# Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
# See https://developer.apple.com/library/mac/qa/qa1170/_index.html
if [ -z "$JAVA_HOME" ]; then
if [ -x "/usr/libexec/java_home" ]; then
export JAVA_HOME="`/usr/libexec/java_home`"
else
export JAVA_HOME="/Library/Java/Home"
fi
fi
;;
esac
if [ -z "$JAVA_HOME" ] ; then
if [ -r /etc/gentoo-release ] ; then
JAVA_HOME=`java-config --jre-home`
fi
fi
if [ -z "$M2_HOME" ] ; then
## resolve links - $0 may be a link to maven's home
PRG="$0"
# need this for relative symlinks
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG="`dirname "$PRG"`/$link"
fi
done
saveddir=`pwd`
M2_HOME=`dirname "$PRG"`/..
# make it fully qualified
M2_HOME=`cd "$M2_HOME" && pwd`
cd "$saveddir"
# echo Using m2 at $M2_HOME
fi
# For Cygwin, ensure paths are in UNIX format before anything is touched
if $cygwin ; then
[ -n "$M2_HOME" ] &&
M2_HOME=`cygpath --unix "$M2_HOME"`
[ -n "$JAVA_HOME" ] &&
JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
[ -n "$CLASSPATH" ] &&
CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
fi
# For Mingw, ensure paths are in UNIX format before anything is touched
if $mingw ; then
[ -n "$M2_HOME" ] &&
M2_HOME="`(cd "$M2_HOME"; pwd)`"
[ -n "$JAVA_HOME" ] &&
JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
fi
if [ -z "$JAVA_HOME" ]; then
javaExecutable="`which javac`"
if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
# readlink(1) is not available as standard on Solaris 10.
readLink=`which readlink`
if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
if $darwin ; then
javaHome="`dirname \"$javaExecutable\"`"
javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
else
javaExecutable="`readlink -f \"$javaExecutable\"`"
fi
javaHome="`dirname \"$javaExecutable\"`"
javaHome=`expr "$javaHome" : '\(.*\)/bin'`
JAVA_HOME="$javaHome"
export JAVA_HOME
fi
fi
fi
if [ -z "$JAVACMD" ] ; then
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
else
JAVACMD="`\\unset -f command; \\command -v java`"
fi
fi
if [ ! -x "$JAVACMD" ] ; then
echo "Error: JAVA_HOME is not defined correctly." >&2
echo " We cannot execute $JAVACMD" >&2
exit 1
fi
if [ -z "$JAVA_HOME" ] ; then
echo "Warning: JAVA_HOME environment variable is not set."
fi
CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
# traverses directory structure from process work directory to filesystem root
# first directory with .mvn subdirectory is considered project base directory
find_maven_basedir() {
if [ -z "$1" ]
then
echo "Path not specified to find_maven_basedir"
return 1
fi
basedir="$1"
wdir="$1"
while [ "$wdir" != '/' ] ; do
if [ -d "$wdir"/.mvn ] ; then
basedir=$wdir
break
fi
# workaround for JBEAP-8937 (on Solaris 10/Sparc)
if [ -d "${wdir}" ]; then
wdir=`cd "$wdir/.."; pwd`
fi
# end of workaround
done
echo "${basedir}"
}
# concatenates all lines of a file
concat_lines() {
if [ -f "$1" ]; then
echo "$(tr -s '\n' ' ' < "$1")"
fi
}
BASE_DIR=`find_maven_basedir "$(pwd)"`
if [ -z "$BASE_DIR" ]; then
exit 1;
fi
##########################################################################################
# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
# This allows using the maven wrapper in projects that prohibit checking in binary data.
##########################################################################################
if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
if [ "$MVNW_VERBOSE" = true ]; then
echo "Found .mvn/wrapper/maven-wrapper.jar"
fi
else
if [ "$MVNW_VERBOSE" = true ]; then
echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
fi
if [ -n "$MVNW_REPOURL" ]; then
jarUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
else
jarUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
fi
while IFS="=" read key value; do
case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
esac
done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
if [ "$MVNW_VERBOSE" = true ]; then
echo "Downloading from: $jarUrl"
fi
wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
if $cygwin; then
wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"`
fi
if command -v wget > /dev/null; then
if [ "$MVNW_VERBOSE" = true ]; then
echo "Found wget ... using wget"
fi
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
wget "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
else
wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
fi
elif command -v curl > /dev/null; then
if [ "$MVNW_VERBOSE" = true ]; then
echo "Found curl ... using curl"
fi
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
curl -o "$wrapperJarPath" "$jarUrl" -f
else
curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f
fi
else
if [ "$MVNW_VERBOSE" = true ]; then
echo "Falling back to using Java to download"
fi
javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
# For Cygwin, switch paths to Windows format before running javac
if $cygwin; then
javaClass=`cygpath --path --windows "$javaClass"`
fi
if [ -e "$javaClass" ]; then
if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
if [ "$MVNW_VERBOSE" = true ]; then
echo " - Compiling MavenWrapperDownloader.java ..."
fi
# Compiling the Java class
("$JAVA_HOME/bin/javac" "$javaClass")
fi
if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
# Running the downloader
if [ "$MVNW_VERBOSE" = true ]; then
echo " - Running MavenWrapperDownloader.java ..."
fi
("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
fi
fi
fi
fi
##########################################################################################
# End of extension
##########################################################################################
export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
if [ "$MVNW_VERBOSE" = true ]; then
echo $MAVEN_PROJECTBASEDIR
fi
MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
# For Cygwin, switch paths to Windows format before running java
if $cygwin; then
[ -n "$M2_HOME" ] &&
M2_HOME=`cygpath --path --windows "$M2_HOME"`
[ -n "$JAVA_HOME" ] &&
JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
[ -n "$CLASSPATH" ] &&
CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
[ -n "$MAVEN_PROJECTBASEDIR" ] &&
MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
fi
# Provide a "standardized" way to retrieve the CLI args that will
# work with both Windows and non-Windows executions.
MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
export MAVEN_CMD_LINE_ARGS
WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
exec "$JAVACMD" \
$MAVEN_OPTS \
$MAVEN_DEBUG_OPTS \
-classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
"-Dmaven.home=${M2_HOME}" \
"-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"

188
demo/mvnw.cmd vendored Normal file
View File

@ -0,0 +1,188 @@
@REM ----------------------------------------------------------------------------
@REM Licensed to the Apache Software Foundation (ASF) under one
@REM or more contributor license agreements. See the NOTICE file
@REM distributed with this work for additional information
@REM regarding copyright ownership. The ASF licenses this file
@REM to you under the Apache License, Version 2.0 (the
@REM "License"); you may not use this file except in compliance
@REM with the License. You may obtain a copy of the License at
@REM
@REM https://www.apache.org/licenses/LICENSE-2.0
@REM
@REM Unless required by applicable law or agreed to in writing,
@REM software distributed under the License is distributed on an
@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@REM KIND, either express or implied. See the License for the
@REM specific language governing permissions and limitations
@REM under the License.
@REM ----------------------------------------------------------------------------
@REM ----------------------------------------------------------------------------
@REM Maven Start Up Batch script
@REM
@REM Required ENV vars:
@REM JAVA_HOME - location of a JDK home dir
@REM
@REM Optional ENV vars
@REM M2_HOME - location of maven2's installed home dir
@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
@REM e.g. to debug Maven itself, use
@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
@REM ----------------------------------------------------------------------------
@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
@echo off
@REM set title of command window
title %0
@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
@REM set %HOME% to equivalent of $HOME
if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
@REM Execute a user defined script before this one
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
@REM check for pre script, once with legacy .bat ending and once with .cmd ending
if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %*
if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %*
:skipRcPre
@setlocal
set ERROR_CODE=0
@REM To isolate internal variables from possible post scripts, we use another setlocal
@setlocal
@REM ==== START VALIDATION ====
if not "%JAVA_HOME%" == "" goto OkJHome
echo.
echo Error: JAVA_HOME not found in your environment. >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error
:OkJHome
if exist "%JAVA_HOME%\bin\java.exe" goto init
echo.
echo Error: JAVA_HOME is set to an invalid directory. >&2
echo JAVA_HOME = "%JAVA_HOME%" >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error
@REM ==== END VALIDATION ====
:init
@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
@REM Fallback to current working directory if not found.
set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
set EXEC_DIR=%CD%
set WDIR=%EXEC_DIR%
:findBaseDir
IF EXIST "%WDIR%"\.mvn goto baseDirFound
cd ..
IF "%WDIR%"=="%CD%" goto baseDirNotFound
set WDIR=%CD%
goto findBaseDir
:baseDirFound
set MAVEN_PROJECTBASEDIR=%WDIR%
cd "%EXEC_DIR%"
goto endDetectBaseDir
:baseDirNotFound
set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
cd "%EXEC_DIR%"
:endDetectBaseDir
IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
@setlocal EnableExtensions EnableDelayedExpansion
for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
:endReadAdditionalConfig
SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
)
@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
if exist %WRAPPER_JAR% (
if "%MVNW_VERBOSE%" == "true" (
echo Found %WRAPPER_JAR%
)
) else (
if not "%MVNW_REPOURL%" == "" (
SET DOWNLOAD_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
)
if "%MVNW_VERBOSE%" == "true" (
echo Couldn't find %WRAPPER_JAR%, downloading it ...
echo Downloading from: %DOWNLOAD_URL%
)
powershell -Command "&{"^
"$webclient = new-object System.Net.WebClient;"^
"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
"}"^
"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^
"}"
if "%MVNW_VERBOSE%" == "true" (
echo Finished downloading %WRAPPER_JAR%
)
)
@REM End of extension
@REM Provide a "standardized" way to retrieve the CLI args that will
@REM work with both Windows and non-Windows executions.
set MAVEN_CMD_LINE_ARGS=%*
%MAVEN_JAVA_EXE% ^
%JVM_CONFIG_MAVEN_PROPS% ^
%MAVEN_OPTS% ^
%MAVEN_DEBUG_OPTS% ^
-classpath %WRAPPER_JAR% ^
"-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^
%WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
if ERRORLEVEL 1 goto error
goto end
:error
set ERROR_CODE=1
:end
@endlocal & set ERROR_CODE=%ERROR_CODE%
if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost
@REM check for post script, once with legacy .bat ending and once with .cmd ending
if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat"
if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd"
:skipRcPost
@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
if "%MAVEN_BATCH_PAUSE%"=="on" pause
if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE%
cmd /C exit /B %ERROR_CODE%

41
demo/pom.xml Normal file
View File

@ -0,0 +1,41 @@
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

View File

@ -0,0 +1,13 @@
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}

View File

@ -0,0 +1 @@

View File

@ -0,0 +1,13 @@
package com.example.demo;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class DemoApplicationTests {
@Test
void contextLoads() {
}
}

121
pom.xml
View File

@ -6,166 +6,179 @@
<groupId>com.ruoyi</groupId> <groupId>com.ruoyi</groupId>
<artifactId>ruoyi</artifactId> <artifactId>ruoyi</artifactId>
<version>3.0.0</version> <version>3.8.2</version>
<name>ruoyi</name> <name>ruoyi</name>
<url>http://www.ruoyi.vip</url> <url>http://www.ruoyi.vip</url>
<description>若依管理系统</description> <description>若依管理系统</description>
<properties> <properties>
<ruoyi.version>3.0.0</ruoyi.version> <ruoyi.version>3.8.2</ruoyi.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version> <java.version>11</java.version>
<mybatis.boot.version>1.3.2</mybatis.boot.version> <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
<druid.version>1.1.14</druid.version> <druid.version>1.2.11</druid.version>
<bitwalker.version>1.19</bitwalker.version> <bitwalker.version>1.21</bitwalker.version>
<swagger.version>2.9.2</swagger.version> <swagger.version>3.0.0</swagger.version>
<pagehelper.boot.version>1.2.5</pagehelper.boot.version> <kaptcha.version>2.3.2</kaptcha.version>
<fastjson.version>1.2.70</fastjson.version> <mybatis-spring-boot.version>2.2.2</mybatis-spring-boot.version>
<oshi.version>3.9.1</oshi.version> <pagehelper.boot.version>1.4.2</pagehelper.boot.version>
<commons.io.version>2.5</commons.io.version> <fastjson.version>1.2.83</fastjson.version>
<commons.fileupload.version>1.3.3</commons.fileupload.version> <oshi.version>6.1.6</oshi.version>
<poi.version>3.17</poi.version> <commons.io.version>2.11.0</commons.io.version>
<velocity.version>1.7</velocity.version> <commons.fileupload.version>1.4</commons.fileupload.version>
<jwt.version>0.9.0</jwt.version> <commons.collections.version>3.2.2</commons.collections.version>
<poi.version>4.1.2</poi.version>
<velocity.version>2.3</velocity.version>
<jwt.version>0.9.1</jwt.version>
</properties> </properties>
<!-- 依赖声明 --> <!-- 依赖声明 -->
<dependencyManagement> <dependencyManagement>
<dependencies> <dependencies>
<!-- SpringBoot的依赖配置--> <!-- SpringBoot的依赖配置-->
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId> <artifactId>spring-boot-dependencies</artifactId>
<version>2.1.1.RELEASE</version> <version>2.5.14</version>
<type>pom</type> <type>pom</type>
<scope>import</scope> <scope>import</scope>
</dependency> </dependency>
<!--阿里数据库连接池 --> <!-- 阿里数据库连接池 -->
<dependency> <dependency>
<groupId>com.alibaba</groupId> <groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId> <artifactId>druid-spring-boot-starter</artifactId>
<version>${druid.version}</version> <version>${druid.version}</version>
</dependency> </dependency>
<!-- 解析客户端操作系统、浏览器等 --> <!-- 解析客户端操作系统、浏览器等 -->
<dependency> <dependency>
<groupId>eu.bitwalker</groupId> <groupId>eu.bitwalker</groupId>
<artifactId>UserAgentUtils</artifactId> <artifactId>UserAgentUtils</artifactId>
<version>${bitwalker.version}</version> <version>${bitwalker.version}</version>
</dependency> </dependency>
<!-- SpringBoot集成mybatis框架 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis-spring-boot.version}</version>
</dependency>
<!-- pagehelper 分页插件 --> <!-- pagehelper 分页插件 -->
<dependency> <dependency>
<groupId>com.github.pagehelper</groupId> <groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId> <artifactId>pagehelper-spring-boot-starter</artifactId>
<version>${pagehelper.boot.version}</version> <version>${pagehelper.boot.version}</version>
</dependency> </dependency>
<!-- 获取系统信息 --> <!-- 获取系统信息 -->
<dependency> <dependency>
<groupId>com.github.oshi</groupId> <groupId>com.github.oshi</groupId>
<artifactId>oshi-core</artifactId> <artifactId>oshi-core</artifactId>
<version>${oshi.version}</version> <version>${oshi.version}</version>
</dependency> </dependency>
<!-- swagger2--> <!-- Swagger3依赖 -->
<dependency> <dependency>
<groupId>io.springfox</groupId> <groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId> <artifactId>springfox-boot-starter</artifactId>
<version>${swagger.version}</version> <version>${swagger.version}</version>
<exclusions> <exclusions>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
</exclusion>
<exclusion> <exclusion>
<groupId>io.swagger</groupId> <groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId> <artifactId>swagger-models</artifactId>
</exclusion> </exclusion>
</exclusions> </exclusions>
</dependency> </dependency>
<!-- swagger2-UI--> <!-- io常用工具类 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger.version}</version>
</dependency>
<!--io常用工具类 -->
<dependency> <dependency>
<groupId>commons-io</groupId> <groupId>commons-io</groupId>
<artifactId>commons-io</artifactId> <artifactId>commons-io</artifactId>
<version>${commons.io.version}</version> <version>${commons.io.version}</version>
</dependency> </dependency>
<!--文件上传工具类 --> <!-- 文件上传工具类 -->
<dependency> <dependency>
<groupId>commons-fileupload</groupId> <groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId> <artifactId>commons-fileupload</artifactId>
<version>${commons.fileupload.version}</version> <version>${commons.fileupload.version}</version>
</dependency> </dependency>
<!-- excel工具 --> <!-- excel工具 -->
<dependency> <dependency>
<groupId>org.apache.poi</groupId> <groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId> <artifactId>poi-ooxml</artifactId>
<version>${poi.version}</version> <version>${poi.version}</version>
</dependency> </dependency>
<!--velocity代码生成使用模板 --> <!-- velocity代码生成使用模板 -->
<dependency> <dependency>
<groupId>org.apache.velocity</groupId> <groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId> <artifactId>velocity-engine-core</artifactId>
<version>${velocity.version}</version> <version>${velocity.version}</version>
</dependency> </dependency>
<!-- collections工具类 -->
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>${commons.collections.version}</version>
</dependency>
<!-- 阿里JSON解析器 --> <!-- 阿里JSON解析器 -->
<dependency> <dependency>
<groupId>com.alibaba</groupId> <groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId> <artifactId>fastjson</artifactId>
<version>${fastjson.version}</version> <version>${fastjson.version}</version>
</dependency> </dependency>
<!--Token生成与解析--> <!-- Token生成与解析-->
<dependency> <dependency>
<groupId>io.jsonwebtoken</groupId> <groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId> <artifactId>jjwt</artifactId>
<version>${jwt.version}</version> <version>${jwt.version}</version>
</dependency> </dependency>
<!-- 验证码 -->
<dependency>
<groupId>com.github.penggle</groupId>
<artifactId>kaptcha</artifactId>
<version>${kaptcha.version}</version>
</dependency>
<!-- 定时任务--> <!-- 定时任务-->
<dependency> <dependency>
<groupId>com.ruoyi</groupId> <groupId>com.ruoyi</groupId>
<artifactId>ruoyi-quartz</artifactId> <artifactId>ruoyi-quartz</artifactId>
<version>${ruoyi.version}</version> <version>${ruoyi.version}</version>
</dependency> </dependency>
<!-- 代码生成--> <!-- 代码生成-->
<dependency> <dependency>
<groupId>com.ruoyi</groupId> <groupId>com.ruoyi</groupId>
<artifactId>ruoyi-generator</artifactId> <artifactId>ruoyi-generator</artifactId>
<version>${ruoyi.version}</version> <version>${ruoyi.version}</version>
</dependency> </dependency>
<!-- 核心模块--> <!-- 核心模块-->
<dependency> <dependency>
<groupId>com.ruoyi</groupId> <groupId>com.ruoyi</groupId>
<artifactId>ruoyi-framework</artifactId> <artifactId>ruoyi-framework</artifactId>
<version>${ruoyi.version}</version> <version>${ruoyi.version}</version>
</dependency> </dependency>
<!-- 系统模块--> <!-- 系统模块-->
<dependency> <dependency>
<groupId>com.ruoyi</groupId> <groupId>com.ruoyi</groupId>
<artifactId>ruoyi-system</artifactId> <artifactId>ruoyi-system</artifactId>
<version>${ruoyi.version}</version> <version>${ruoyi.version}</version>
</dependency> </dependency>
<!-- 通用工具--> <!-- 通用工具-->
<dependency> <dependency>
<groupId>com.ruoyi</groupId> <groupId>com.ruoyi</groupId>
@ -210,7 +223,7 @@
<repository> <repository>
<id>public</id> <id>public</id>
<name>aliyun nexus</name> <name>aliyun nexus</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url> <url>https://maven.aliyun.com/repository/public</url>
<releases> <releases>
<enabled>true</enabled> <enabled>true</enabled>
</releases> </releases>
@ -221,7 +234,7 @@
<pluginRepository> <pluginRepository>
<id>public</id> <id>public</id>
<name>aliyun nexus</name> <name>aliyun nexus</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url> <url>https://maven.aliyun.com/repository/public</url>
<releases> <releases>
<enabled>true</enabled> <enabled>true</enabled>
</releases> </releases>

View File

@ -1,108 +1,128 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" <project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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"> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent> <parent>
<artifactId>ruoyi</artifactId> <artifactId>ruoyi</artifactId>
<groupId>com.ruoyi</groupId> <groupId>com.ruoyi</groupId>
<version>3.0.0</version> <version>3.8.2</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging> <packaging>jar</packaging>
<artifactId>ruoyi-admin</artifactId> <artifactId>ruoyi-admin</artifactId>
<description> <description>
web服务入口 web服务入口
</description> </description>
<dependencies> <dependencies>
<!-- spring-boot-devtools --> <dependency>
<dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.apache.poi</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional> <!-- 表示依赖不会传递 --> <artifactId>poi</artifactId>
</dependency>
<version>4.0.1</version>
<!-- swagger2-->
<dependency> </dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId> <dependency>
</dependency>
<groupId>org.apache.poi</groupId>
<!--防止进入swagger页面报类型转换错误排除2.9.2中的引用手动增加1.5.21版本-->
<dependency> <artifactId>poi-ooxml</artifactId>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId> <version>4.0.1</version>
<version>1.5.21</version>
</dependency> </dependency>
<dependency>
<groupId>io.swagger</groupId> <dependency>
<artifactId>swagger-models</artifactId> <groupId>org.springframework.boot</groupId>
<version>1.5.21</version> <artifactId>spring-boot-devtools</artifactId>
</dependency> <optional>true</optional> <!-- 表示依赖不会传递 -->
</dependency>
<!-- swagger2-UI-->
<dependency> <!-- swagger3-->
<groupId>io.springfox</groupId> <dependency>
<artifactId>springfox-swagger-ui</artifactId> <groupId>io.springfox</groupId>
</dependency> <artifactId>springfox-boot-starter</artifactId>
</dependency>
<!-- Mysql驱动包 -->
<dependency> <!-- 防止进入swagger页面报类型转换错误排除3.0.0中的引用手动增加1.6.2版本 -->
<groupId>mysql</groupId> <dependency>
<artifactId>mysql-connector-java</artifactId> <groupId>io.swagger</groupId>
</dependency> <artifactId>swagger-models</artifactId>
<version>1.6.6</version>
<!-- 核心模块--> </dependency>
<dependency> <!-- knife4j -->
<groupId>com.ruoyi</groupId> <dependency>
<artifactId>ruoyi-framework</artifactId> <groupId>com.github.xiaoymin</groupId>
</dependency> <artifactId>knife4j-spring-boot-starter</artifactId>
<version>3.0.3</version>
<!-- 定时任务--> </dependency>
<dependency> <!-- postgresql驱动包-->
<groupId>com.ruoyi</groupId> <dependency>
<artifactId>ruoyi-quartz</artifactId> <groupId>org.postgresql</groupId>
</dependency> <artifactId>postgresql</artifactId>
<version>42.2.20</version>
<!-- 代码生成--> </dependency>
<dependency>
<groupId>com.ruoyi</groupId> <!-- Mysql驱动包 -->
<artifactId>ruoyi-generator</artifactId> <dependency>
</dependency> <groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependencies> </dependency>
<build> <!-- 核心模块-->
<plugins> <dependency>
<plugin> <groupId>com.ruoyi</groupId>
<groupId>org.springframework.boot</groupId> <artifactId>ruoyi-framework</artifactId>
<artifactId>spring-boot-maven-plugin</artifactId> </dependency>
<version>2.1.1.RELEASE</version>
<configuration> <!-- 定时任务-->
<fork>true</fork> <!-- 如果没有该配置devtools不会生效 --> <dependency>
</configuration> <groupId>com.ruoyi</groupId>
<executions> <artifactId>ruoyi-quartz</artifactId>
<execution> </dependency>
<goals>
<goal>repackage</goal> <!-- 代码生成-->
</goals> <dependency>
</execution> <groupId>com.ruoyi</groupId>
</executions> <artifactId>ruoyi-generator</artifactId>
</plugin> </dependency>
<plugin>
<groupId>org.apache.maven.plugins</groupId> </dependencies>
<artifactId>maven-war-plugin</artifactId>
<version>3.0.0</version> <build>
<configuration> <plugins>
<failOnMissingWebXml>false</failOnMissingWebXml> <plugin>
<warName>${project.artifactId}</warName> <groupId>org.springframework.boot</groupId>
</configuration> <artifactId>spring-boot-maven-plugin</artifactId>
</plugin> <version>2.1.1.RELEASE</version>
</plugins> <configuration>
<finalName>${project.artifactId}</finalName> <fork>true</fork> <!-- 如果没有该配置devtools不会生效 -->
</build> </configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
<warName>${project.artifactId}</warName>
</configuration>
</plugin>
</plugins>
<finalName>${project.artifactId}</finalName>
</build>
</project> </project>

View File

@ -1,30 +1,35 @@
package com.ruoyi; package com.ruoyi;
import org.springframework.boot.SpringApplication; import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
/**
* 启动程序 /**
* * 启动程序
* @author ruoyi *
*/ * @author ruoyi
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class }) */
public class RuoYiApplication @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
{ @MapperScan("com.ruoyi.system.mapper_yada")
public static void main(String[] args) public class RuoYiApplication
{ {
// System.setProperty("spring.devtools.restart.enabled", "false"); public static void main(String[] args)
SpringApplication.run(RuoYiApplication.class, args); {
System.out.println("(♥◠‿◠)ノ゙ 若依启动成功 ლ(´ڡ`ლ)゙ \n" + // System.setProperty("spring.devtools.restart.enabled", "false");
" .-------. ____ __ \n" + SpringApplication.run(RuoYiApplication.class, args);
" | _ _ \\ \\ \\ / / \n" + System.out.println();
" | ( ' ) | \\ _. / ' \n" + System.out.println(" --->>>启动成功!<<<---");
" |(_ o _) / _( )_ .' \n" + // System.out.println("(♥◠‿◠)ノ゙ ლ(´ڡ`ლ)゙ \n" +
" | (_,_).' __ ___(_ o _)' \n" + // " .-------. ____ __ \n" +
" | |\\ \\ | || |(_,_)' \n" + // " | _ _ \\ \\ \\ / / \n" +
" | | \\ `' /| `-' / \n" + // " | ( ' ) | \\ _. / ' \n" +
" | | \\ / \\ / \n" + // " |(_ o _) / _( )_ .' \n" +
" ''-' `'-' `-..-' "); // " | (_,_).' __ ___(_ o _)' \n" +
} // " | |\\ \\ | || |(_,_)' \n" +
} // " | | \\ `' /| `-' / \n" +
// " | | \\ / \\ / \n" +
// " ''-' `'-' `-..-' ");
}
}

View File

@ -1,18 +1,18 @@
package com.ruoyi; package com.ruoyi;
import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
/** /**
* web容器中进行部署 * web容器中进行部署
* *
* @author ruoyi * @author ruoyi
*/ */
public class RuoYiServletInitializer extends SpringBootServletInitializer public class RuoYiServletInitializer extends SpringBootServletInitializer
{ {
@Override @Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) protected SpringApplicationBuilder configure(SpringApplicationBuilder application)
{ {
return application.sources(RuoYiApplication.class); return application.sources(RuoYiApplication.class);
} }
} }

View File

@ -1,62 +0,0 @@
package com.ruoyi.web.controller.common;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.utils.VerifyCodeUtils;
import com.ruoyi.common.utils.sign.Base64;
import com.ruoyi.common.utils.uuid.IdUtils;
/**
* 验证码操作处理
*
* @author ruoyi
*/
@RestController
public class CaptchaController
{
@Autowired
private RedisCache redisCache;
/**
* 生成验证码
*/
@GetMapping("/captchaImage")
public AjaxResult getCode(HttpServletResponse response) throws IOException
{
// 生成随机字串
String verifyCode = VerifyCodeUtils.generateVerifyCode(4);
// 唯一标识
String uuid = IdUtils.simpleUUID();
String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid;
redisCache.setCacheObject(verifyKey, verifyCode, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
// 生成图片
int w = 111, h = 36;
ByteArrayOutputStream stream = new ByteArrayOutputStream();
VerifyCodeUtils.outputImage(w, h, stream, verifyCode);
try
{
AjaxResult ajax = AjaxResult.success();
ajax.put("uuid", uuid);
ajax.put("img", Base64.encode(stream.toByteArray()));
return ajax;
}
catch (Exception e)
{
e.printStackTrace();
return AjaxResult.error(e.getMessage());
}
finally
{
stream.close();
}
}
}

View File

@ -1,109 +1,163 @@
package com.ruoyi.web.controller.common; package com.ruoyi.web.controller.common;
import javax.servlet.http.HttpServletRequest; import java.util.ArrayList;
import javax.servlet.http.HttpServletResponse; import java.util.List;
import org.slf4j.Logger; import javax.servlet.http.HttpServletRequest;
import org.slf4j.LoggerFactory; import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired; import org.slf4j.Logger;
import org.springframework.web.bind.annotation.GetMapping; import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RestController; import org.springframework.http.MediaType;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.bind.annotation.GetMapping;
import com.ruoyi.common.config.RuoYiConfig; import org.springframework.web.bind.annotation.PostMapping;
import com.ruoyi.common.constant.Constants; import org.springframework.web.bind.annotation.RequestMapping;
import com.ruoyi.common.core.domain.AjaxResult; import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.utils.StringUtils; import org.springframework.web.multipart.MultipartFile;
import com.ruoyi.common.utils.file.FileUploadUtils; import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.utils.file.FileUtils; import com.ruoyi.common.constant.Constants;
import com.ruoyi.framework.config.ServerConfig; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.StringUtils;
/** import com.ruoyi.common.utils.file.FileUploadUtils;
* 通用请求处理 import com.ruoyi.common.utils.file.FileUtils;
* import com.ruoyi.framework.config.ServerConfig;
* @author ruoyi
*/ /**
@RestController * 通用请求处理
public class CommonController *
{ * @author ruoyi
private static final Logger log = LoggerFactory.getLogger(CommonController.class); */
@RestController
@Autowired @RequestMapping("/common")
private ServerConfig serverConfig; public class CommonController
{
/** private static final Logger log = LoggerFactory.getLogger(CommonController.class);
* 通用下载请求
* @Autowired
* @param fileName 文件名称 private ServerConfig serverConfig;
* @param delete 是否删除
*/ private static final String FILE_DELIMETER = ",";
@GetMapping("common/download")
public void fileDownload(String fileName, Boolean delete, HttpServletResponse response, HttpServletRequest request) /**
{ * 通用下载请求
try *
{ * @param fileName 文件名称
if (!FileUtils.isValidFilename(fileName)) * @param delete 是否删除
{ */
throw new Exception(StringUtils.format("文件名称({})非法,不允许下载。 ", fileName)); @GetMapping("/download")
} public void fileDownload(String fileName, Boolean delete, HttpServletResponse response, HttpServletRequest request)
String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1); {
String filePath = RuoYiConfig.getDownloadPath() + fileName; try
{
response.setCharacterEncoding("utf-8"); if (!FileUtils.checkAllowDownload(fileName))
response.setContentType("multipart/form-data"); {
response.setHeader("Content-Disposition", throw new Exception(StringUtils.format("文件名称({})非法,不允许下载。 ", fileName));
"attachment;fileName=" + FileUtils.setFileDownloadHeader(request, realFileName)); }
FileUtils.writeBytes(filePath, response.getOutputStream()); String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1);
if (delete) String filePath = RuoYiConfig.getDownloadPath() + fileName;
{
FileUtils.deleteFile(filePath); response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
} FileUtils.setAttachmentResponseHeader(response, realFileName);
} FileUtils.writeBytes(filePath, response.getOutputStream());
catch (Exception e) if (delete)
{ {
log.error("下载文件失败", e); FileUtils.deleteFile(filePath);
} }
} }
catch (Exception e)
/** {
* 通用上传请求 log.error("下载文件失败", e);
*/ }
@PostMapping("/common/upload") }
public AjaxResult uploadFile(MultipartFile file) throws Exception
{ /**
try * 通用上传请求单个
{ */
// 上传文件路径 @PostMapping("/upload")
String filePath = RuoYiConfig.getUploadPath(); public AjaxResult uploadFile(MultipartFile file) throws Exception
// 上传并返回新文件名称 {
String fileName = FileUploadUtils.upload(filePath, file); try
String url = serverConfig.getUrl() + fileName; {
AjaxResult ajax = AjaxResult.success(); // 上传文件路径
ajax.put("fileName", fileName); String filePath = RuoYiConfig.getUploadPath();
ajax.put("url", url); // 上传并返回新文件名称
return ajax; String fileName = FileUploadUtils.upload(filePath, file);
} String url = serverConfig.getUrl() + fileName;
catch (Exception e) AjaxResult ajax = AjaxResult.success();
{ ajax.put("url", url);
return AjaxResult.error(e.getMessage()); ajax.put("fileName", fileName);
} ajax.put("newFileName", FileUtils.getName(fileName));
} ajax.put("originalFilename", file.getOriginalFilename());
return ajax;
/** }
* 本地资源通用下载 catch (Exception e)
*/ {
@GetMapping("/common/download/resource") return AjaxResult.error(e.getMessage());
public void resourceDownload(String name, HttpServletRequest request, HttpServletResponse response) throws Exception }
{ }
// 本地资源路径
String localPath = RuoYiConfig.getProfile(); /**
// 数据库资源地址 * 通用上传请求多个
String downloadPath = localPath + StringUtils.substringAfter(name, Constants.RESOURCE_PREFIX); */
// 下载名称 @PostMapping("/uploads")
String downloadName = StringUtils.substringAfterLast(downloadPath, "/"); public AjaxResult uploadFiles(List<MultipartFile> files) throws Exception
response.setCharacterEncoding("utf-8"); {
response.setContentType("multipart/form-data"); try
response.setHeader("Content-Disposition", {
"attachment;fileName=" + FileUtils.setFileDownloadHeader(request, downloadName)); // 上传文件路径
FileUtils.writeBytes(downloadPath, response.getOutputStream()); String filePath = RuoYiConfig.getUploadPath();
} List<String> urls = new ArrayList<String>();
} List<String> fileNames = new ArrayList<String>();
List<String> newFileNames = new ArrayList<String>();
List<String> originalFilenames = new ArrayList<String>();
for (MultipartFile file : files)
{
// 上传并返回新文件名称
String fileName = FileUploadUtils.upload(filePath, file);
String url = serverConfig.getUrl() + fileName;
urls.add(url);
fileNames.add(fileName);
newFileNames.add(FileUtils.getName(fileName));
originalFilenames.add(file.getOriginalFilename());
}
AjaxResult ajax = AjaxResult.success();
ajax.put("urls", StringUtils.join(urls, FILE_DELIMETER));
ajax.put("fileNames", StringUtils.join(fileNames, FILE_DELIMETER));
ajax.put("newFileNames", StringUtils.join(newFileNames, FILE_DELIMETER));
ajax.put("originalFilenames", StringUtils.join(originalFilenames, FILE_DELIMETER));
return ajax;
}
catch (Exception e)
{
return AjaxResult.error(e.getMessage());
}
}
/**
* 本地资源通用下载
*/
@GetMapping("/download/resource")
public void resourceDownload(String resource, HttpServletRequest request, HttpServletResponse response)
throws Exception
{
try
{
if (!FileUtils.checkAllowDownload(resource))
{
throw new Exception(StringUtils.format("资源文件({})非法,不允许下载。 ", resource));
}
// 本地资源路径
String localPath = RuoYiConfig.getProfile();
// 数据库资源地址
String downloadPath = localPath + StringUtils.substringAfter(resource, Constants.RESOURCE_PREFIX);
// 下载名称
String downloadName = StringUtils.substringAfterLast(downloadPath, "/");
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
FileUtils.setAttachmentResponseHeader(response, downloadName);
FileUtils.writeBytes(downloadPath, response.getOutputStream());
}
catch (Exception e)
{
log.error("下载文件失败", e);
}
}
}

View File

@ -0,0 +1,53 @@
package com.ruoyi.web.controller.monitor;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.StringUtils;
/**
* 缓存监控
*
* @author ruoyi
*/
@RestController
@RequestMapping("/monitor/cache")
public class CacheController
{
@Autowired
private RedisTemplate<String, String> redisTemplate;
@PreAuthorize("@ss.hasPermi('monitor:cache:list')")
@GetMapping()
public AjaxResult getInfo() throws Exception
{
Properties info = (Properties) redisTemplate.execute((RedisCallback<Object>) connection -> connection.info());
Properties commandStats = (Properties) redisTemplate.execute((RedisCallback<Object>) connection -> connection.info("commandstats"));
Object dbSize = redisTemplate.execute((RedisCallback<Object>) connection -> connection.dbSize());
Map<String, Object> result = new HashMap<>(3);
result.put("info", info);
result.put("dbSize", dbSize);
List<Map<String, String>> pieList = new ArrayList<>();
commandStats.stringPropertyNames().forEach(key -> {
Map<String, String> data = new HashMap<>(2);
String property = commandStats.getProperty(key);
data.put("name", StringUtils.removeStart(key, "cmdstat_"));
data.put("value", StringUtils.substringBetween(property, "calls=", ",usec"));
pieList.add(data);
});
result.put("commandStats", pieList);
return AjaxResult.success(result);
}
}

View File

@ -1,28 +1,27 @@
package com.ruoyi.web.controller.monitor; package com.ruoyi.web.controller.monitor;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.framework.web.domain.Server;
import com.ruoyi.framework.web.domain.Server;
/**
/** * 服务器监控
* 服务器监控 *
* * @author ruoyi
* @author ruoyi */
*/ @RestController
@RestController @RequestMapping("/monitor/server")
@RequestMapping("/monitor/server") public class ServerController
public class ServerController extends BaseController {
{ @PreAuthorize("@ss.hasPermi('monitor:server:list')")
@PreAuthorize("@ss.hasPermi('monitor:server:list')") @GetMapping()
@GetMapping() public AjaxResult getInfo() throws Exception
public AjaxResult getInfo() throws Exception {
{ Server server = new Server();
Server server = new Server(); server.copyTo();
server.copyTo(); return AjaxResult.success(server);
return AjaxResult.success(server); }
} }
}

View File

@ -1,67 +1,69 @@
package com.ruoyi.web.controller.monitor; package com.ruoyi.web.controller.monitor;
import java.util.List; import java.util.List;
import org.springframework.beans.factory.annotation.Autowired; import javax.servlet.http.HttpServletResponse;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.PostMapping;
import com.ruoyi.common.annotation.Log; import org.springframework.web.bind.annotation.RequestMapping;
import com.ruoyi.common.core.controller.BaseController; import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.system.domain.SysLogininfor; import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.system.service.ISysLogininforService; import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.system.domain.SysLogininfor;
/** import com.ruoyi.system.service.ISysLogininforService;
* 系统访问记录
* /**
* @author ruoyi * 系统访问记录
*/ *
@RestController * @author ruoyi
@RequestMapping("/monitor/logininfor") */
public class SysLogininforController extends BaseController @RestController
{ @RequestMapping("/monitor/logininfor")
@Autowired public class SysLogininforController extends BaseController
private ISysLogininforService logininforService; {
@Autowired
@PreAuthorize("@ss.hasPermi('monitor:logininfor:list')") private ISysLogininforService logininforService;
@GetMapping("/list")
public TableDataInfo list(SysLogininfor logininfor) @PreAuthorize("@ss.hasPermi('monitor:logininfor:list')")
{ @GetMapping("/list")
startPage(); public TableDataInfo list(SysLogininfor logininfor)
List<SysLogininfor> list = logininforService.selectLogininforList(logininfor); {
return getDataTable(list); startPage();
} List<SysLogininfor> list = logininforService.selectLogininforList(logininfor);
return getDataTable(list);
@Log(title = "登陆日志", businessType = BusinessType.EXPORT) }
@PreAuthorize("@ss.hasPermi('monitor:logininfor:export')")
@GetMapping("/export") @Log(title = "登录日志", businessType = BusinessType.EXPORT)
public AjaxResult export(SysLogininfor logininfor) @PreAuthorize("@ss.hasPermi('monitor:logininfor:export')")
{ @PostMapping("/export")
List<SysLogininfor> list = logininforService.selectLogininforList(logininfor); public void export(HttpServletResponse response, SysLogininfor logininfor)
ExcelUtil<SysLogininfor> util = new ExcelUtil<SysLogininfor>(SysLogininfor.class); {
return util.exportExcel(list, "登陆日志"); List<SysLogininfor> list = logininforService.selectLogininforList(logininfor);
} ExcelUtil<SysLogininfor> util = new ExcelUtil<SysLogininfor>(SysLogininfor.class);
util.exportExcel(response, list, "登录日志");
@PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')") }
@Log(title = "登陆日志", businessType = BusinessType.DELETE)
@DeleteMapping("/{infoIds}") @PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')")
public AjaxResult remove(@PathVariable Long[] infoIds) @Log(title = "登录日志", businessType = BusinessType.DELETE)
{ @DeleteMapping("/{infoIds}")
return toAjax(logininforService.deleteLogininforByIds(infoIds)); public AjaxResult remove(@PathVariable Long[] infoIds)
} {
return toAjax(logininforService.deleteLogininforByIds(infoIds));
@PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')") }
@Log(title = "登陆日志", businessType = BusinessType.CLEAN)
@DeleteMapping("/clean") @PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')")
public AjaxResult clean() @Log(title = "登录日志", businessType = BusinessType.CLEAN)
{ @DeleteMapping("/clean")
logininforService.cleanLogininfor(); public AjaxResult clean()
return AjaxResult.success(); {
} logininforService.cleanLogininfor();
} return AjaxResult.success();
}
}

View File

@ -1,66 +1,69 @@
package com.ruoyi.web.controller.monitor; package com.ruoyi.web.controller.monitor;
import java.util.List; import java.util.List;
import org.springframework.beans.factory.annotation.Autowired; import javax.servlet.http.HttpServletResponse;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.PostMapping;
import com.ruoyi.common.annotation.Log; import org.springframework.web.bind.annotation.RequestMapping;
import com.ruoyi.common.core.controller.BaseController; import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.system.domain.SysOperLog; import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.system.service.ISysOperLogService; import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.system.domain.SysOperLog;
/** import com.ruoyi.system.service.ISysOperLogService;
* 操作日志记录
* /**
* @author ruoyi * 操作日志记录
*/ *
@RestController * @author ruoyi
@RequestMapping("/monitor/operlog") */
public class SysOperlogController extends BaseController @RestController
{ @RequestMapping("/monitor/operlog")
@Autowired public class SysOperlogController extends BaseController
private ISysOperLogService operLogService; {
@Autowired
@PreAuthorize("@ss.hasPermi('monitor:operlog:list')") private ISysOperLogService operLogService;
@GetMapping("/list")
public TableDataInfo list(SysOperLog operLog) @PreAuthorize("@ss.hasPermi('monitor:operlog:list')")
{ @GetMapping("/list")
startPage(); public TableDataInfo list(SysOperLog operLog)
List<SysOperLog> list = operLogService.selectOperLogList(operLog); {
return getDataTable(list); startPage();
} List<SysOperLog> list = operLogService.selectOperLogList(operLog);
return getDataTable(list);
@Log(title = "操作日志", businessType = BusinessType.EXPORT) }
@PreAuthorize("@ss.hasPermi('monitor:operlog:export')")
@GetMapping("/export") @Log(title = "操作日志", businessType = BusinessType.EXPORT)
public AjaxResult export(SysOperLog operLog) @PreAuthorize("@ss.hasPermi('monitor:operlog:export')")
{ @PostMapping("/export")
List<SysOperLog> list = operLogService.selectOperLogList(operLog); public void export(HttpServletResponse response, SysOperLog operLog)
ExcelUtil<SysOperLog> util = new ExcelUtil<SysOperLog>(SysOperLog.class); {
return util.exportExcel(list, "操作日志"); List<SysOperLog> list = operLogService.selectOperLogList(operLog);
} ExcelUtil<SysOperLog> util = new ExcelUtil<SysOperLog>(SysOperLog.class);
util.exportExcel(response, list, "操作日志");
@PreAuthorize("@ss.hasPermi('monitor:operlog:remove')") }
@DeleteMapping("/{operIds}")
public AjaxResult remove(@PathVariable Long[] operIds) @Log(title = "操作日志", businessType = BusinessType.DELETE)
{ @PreAuthorize("@ss.hasPermi('monitor:operlog:remove')")
return toAjax(operLogService.deleteOperLogByIds(operIds)); @DeleteMapping("/{operIds}")
} public AjaxResult remove(@PathVariable Long[] operIds)
{
@Log(title = "操作日志", businessType = BusinessType.CLEAN) return toAjax(operLogService.deleteOperLogByIds(operIds));
@PreAuthorize("@ss.hasPermi('monitor:operlog:remove')") }
@DeleteMapping("/clean")
public AjaxResult clean() @Log(title = "操作日志", businessType = BusinessType.CLEAN)
{ @PreAuthorize("@ss.hasPermi('monitor:operlog:remove')")
operLogService.cleanOperLog(); @DeleteMapping("/clean")
return AjaxResult.success(); public AjaxResult clean()
} {
} operLogService.cleanOperLog();
return AjaxResult.success();
}
}

View File

@ -1,92 +1,92 @@
package com.ruoyi.web.controller.monitor; package com.ruoyi.web.controller.monitor;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log; import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.SysUserOnline; import com.ruoyi.system.domain.SysUserOnline;
import com.ruoyi.system.service.ISysUserOnlineService; import com.ruoyi.system.service.ISysUserOnlineService;
/** /**
* 在线用户监控 * 在线用户监控
* *
* @author ruoyi * @author ruoyi
*/ */
@RestController @RestController
@RequestMapping("/monitor/online") @RequestMapping("/monitor/online")
public class SysUserOnlineController extends BaseController public class SysUserOnlineController extends BaseController
{ {
@Autowired @Autowired
private ISysUserOnlineService userOnlineService; private ISysUserOnlineService userOnlineService;
@Autowired @Autowired
private RedisCache redisCache; private RedisCache redisCache;
@PreAuthorize("@ss.hasPermi('monitor:online:list')") @PreAuthorize("@ss.hasPermi('monitor:online:list')")
@GetMapping("/list") @GetMapping("/list")
public TableDataInfo list(String ipaddr, String userName) public TableDataInfo list(String ipaddr, String userName)
{ {
Collection<String> keys = redisCache.keys(Constants.LOGIN_TOKEN_KEY + "*"); Collection<String> keys = redisCache.keys(Constants.LOGIN_TOKEN_KEY + "*");
List<SysUserOnline> userOnlineList = new ArrayList<SysUserOnline>(); List<SysUserOnline> userOnlineList = new ArrayList<SysUserOnline>();
for (String key : keys) for (String key : keys)
{ {
LoginUser user = redisCache.getCacheObject(key); LoginUser user = redisCache.getCacheObject(key);
if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(userName)) if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(userName))
{ {
if (StringUtils.equals(ipaddr, user.getIpaddr()) && StringUtils.equals(userName, user.getUsername())) if (StringUtils.equals(ipaddr, user.getIpaddr()) && StringUtils.equals(userName, user.getUsername()))
{ {
userOnlineList.add(userOnlineService.selectOnlineByInfo(ipaddr, userName, user)); userOnlineList.add(userOnlineService.selectOnlineByInfo(ipaddr, userName, user));
} }
} }
else if (StringUtils.isNotEmpty(ipaddr)) else if (StringUtils.isNotEmpty(ipaddr))
{ {
if (StringUtils.equals(ipaddr, user.getIpaddr())) if (StringUtils.equals(ipaddr, user.getIpaddr()))
{ {
userOnlineList.add(userOnlineService.selectOnlineByIpaddr(ipaddr, user)); userOnlineList.add(userOnlineService.selectOnlineByIpaddr(ipaddr, user));
} }
} }
else if (StringUtils.isNotEmpty(userName) && StringUtils.isNotNull(user.getUser())) else if (StringUtils.isNotEmpty(userName) && StringUtils.isNotNull(user.getUser()))
{ {
if (StringUtils.equals(userName, user.getUsername())) if (StringUtils.equals(userName, user.getUsername()))
{ {
userOnlineList.add(userOnlineService.selectOnlineByUserName(userName, user)); userOnlineList.add(userOnlineService.selectOnlineByUserName(userName, user));
} }
} }
else else
{ {
userOnlineList.add(userOnlineService.loginUserToUserOnline(user)); userOnlineList.add(userOnlineService.loginUserToUserOnline(user));
} }
} }
Collections.reverse(userOnlineList); Collections.reverse(userOnlineList);
userOnlineList.removeAll(Collections.singleton(null)); userOnlineList.removeAll(Collections.singleton(null));
return getDataTable(userOnlineList); return getDataTable(userOnlineList);
} }
/** /**
* 强退用户 * 强退用户
*/ */
@PreAuthorize("@ss.hasPermi('monitor:online:forceLogout')") @PreAuthorize("@ss.hasPermi('monitor:online:forceLogout')")
@Log(title = "在线用户", businessType = BusinessType.DELETE) @Log(title = "在线用户", businessType = BusinessType.FORCE)
@DeleteMapping("/{tokenId}") @DeleteMapping("/{tokenId}")
public AjaxResult forceLogout(@PathVariable String tokenId) public AjaxResult forceLogout(@PathVariable String tokenId)
{ {
redisCache.deleteObject(Constants.LOGIN_TOKEN_KEY + tokenId); redisCache.deleteObject(Constants.LOGIN_TOKEN_KEY + tokenId);
return AjaxResult.success(); return AjaxResult.success();
} }
} }

View File

@ -1,135 +1,134 @@
package com.ruoyi.web.controller.system; package com.ruoyi.web.controller.system;
import java.util.List; import java.util.List;
import org.springframework.beans.factory.annotation.Autowired; import javax.servlet.http.HttpServletResponse;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RequestMapping;
import com.ruoyi.common.annotation.Log; import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.RepeatSubmit; import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.system.domain.SysConfig;
import com.ruoyi.system.domain.SysConfig; import com.ruoyi.system.service.ISysConfigService;
import com.ruoyi.system.service.ISysConfigService;
/**
/** * 参数配置 信息操作处理
* 参数配置 信息操作处理 *
* * @author ruoyi
* @author ruoyi */
*/ @RestController
@RestController @RequestMapping("/system/config")
@RequestMapping("/system/config") public class SysConfigController extends BaseController
public class SysConfigController extends BaseController {
{ @Autowired
@Autowired private ISysConfigService configService;
private ISysConfigService configService;
/**
/** * 获取参数配置列表
* 获取参数配置列表 */
*/ @PreAuthorize("@ss.hasPermi('system:config:list')")
@PreAuthorize("@ss.hasPermi('system:config:list')") @GetMapping("/list")
@GetMapping("/list") public TableDataInfo list(SysConfig config)
public TableDataInfo list(SysConfig config) {
{ startPage();
startPage(); List<SysConfig> list = configService.selectConfigList(config);
List<SysConfig> list = configService.selectConfigList(config); return getDataTable(list);
return getDataTable(list); }
}
@Log(title = "参数管理", businessType = BusinessType.EXPORT)
@Log(title = "参数管理", businessType = BusinessType.EXPORT) @PreAuthorize("@ss.hasPermi('system:config:export')")
@PreAuthorize("@ss.hasPermi('system:config:export')") @PostMapping("/export")
@GetMapping("/export") public void export(HttpServletResponse response, SysConfig config)
public AjaxResult export(SysConfig config) {
{ List<SysConfig> list = configService.selectConfigList(config);
List<SysConfig> list = configService.selectConfigList(config); ExcelUtil<SysConfig> util = new ExcelUtil<SysConfig>(SysConfig.class);
ExcelUtil<SysConfig> util = new ExcelUtil<SysConfig>(SysConfig.class); util.exportExcel(response, list, "参数数据");
return util.exportExcel(list, "参数数据"); }
}
/**
/** * 根据参数编号获取详细信息
* 根据参数编号获取详细信息 */
*/ @PreAuthorize("@ss.hasPermi('system:config:query')")
@PreAuthorize("@ss.hasPermi('system:config:query')") @GetMapping(value = "/{configId}")
@GetMapping(value = "/{configId}") public AjaxResult getInfo(@PathVariable Long configId)
public AjaxResult getInfo(@PathVariable Long configId) {
{ return AjaxResult.success(configService.selectConfigById(configId));
return AjaxResult.success(configService.selectConfigById(configId)); }
}
/**
/** * 根据参数键名查询参数值
* 根据参数键名查询参数值 */
*/ @GetMapping(value = "/configKey/{configKey}")
@GetMapping(value = "/configKey/{configKey}") public AjaxResult getConfigKey(@PathVariable String configKey)
public AjaxResult getConfigKey(@PathVariable String configKey) {
{ return AjaxResult.success(configService.selectConfigByKey(configKey));
return AjaxResult.success(configService.selectConfigByKey(configKey)); }
}
/**
/** * 新增参数配置
* 新增参数配置 */
*/ @PreAuthorize("@ss.hasPermi('system:config:add')")
@PreAuthorize("@ss.hasPermi('system:config:add')") @Log(title = "参数管理", businessType = BusinessType.INSERT)
@Log(title = "参数管理", businessType = BusinessType.INSERT) @PostMapping
@PostMapping public AjaxResult add(@Validated @RequestBody SysConfig config)
@RepeatSubmit {
public AjaxResult add(@Validated @RequestBody SysConfig config) if (UserConstants.NOT_UNIQUE.equals(configService.checkConfigKeyUnique(config)))
{ {
if (UserConstants.NOT_UNIQUE.equals(configService.checkConfigKeyUnique(config))) return AjaxResult.error("新增参数'" + config.getConfigName() + "'失败,参数键名已存在");
{ }
return AjaxResult.error("新增参数'" + config.getConfigName() + "'失败,参数键名已存在"); config.setCreateBy(getUsername());
} return toAjax(configService.insertConfig(config));
config.setCreateBy(SecurityUtils.getUsername()); }
return toAjax(configService.insertConfig(config));
} /**
* 修改参数配置
/** */
* 修改参数配置 @PreAuthorize("@ss.hasPermi('system:config:edit')")
*/ @Log(title = "参数管理", businessType = BusinessType.UPDATE)
@PreAuthorize("@ss.hasPermi('system:config:edit')") @PutMapping
@Log(title = "参数管理", businessType = BusinessType.UPDATE) public AjaxResult edit(@Validated @RequestBody SysConfig config)
@PutMapping {
public AjaxResult edit(@Validated @RequestBody SysConfig config) if (UserConstants.NOT_UNIQUE.equals(configService.checkConfigKeyUnique(config)))
{ {
if (UserConstants.NOT_UNIQUE.equals(configService.checkConfigKeyUnique(config))) return AjaxResult.error("修改参数'" + config.getConfigName() + "'失败,参数键名已存在");
{ }
return AjaxResult.error("修改参数'" + config.getConfigName() + "'失败,参数键名已存在"); config.setUpdateBy(getUsername());
} return toAjax(configService.updateConfig(config));
config.setUpdateBy(SecurityUtils.getUsername()); }
return toAjax(configService.updateConfig(config));
} /**
* 删除参数配置
/** */
* 删除参数配置 @PreAuthorize("@ss.hasPermi('system:config:remove')")
*/ @Log(title = "参数管理", businessType = BusinessType.DELETE)
@PreAuthorize("@ss.hasPermi('system:config:remove')") @DeleteMapping("/{configIds}")
@Log(title = "参数管理", businessType = BusinessType.DELETE) public AjaxResult remove(@PathVariable Long[] configIds)
@DeleteMapping("/{configIds}") {
public AjaxResult remove(@PathVariable Long[] configIds) configService.deleteConfigByIds(configIds);
{ return success();
return toAjax(configService.deleteConfigByIds(configIds)); }
}
/**
/** * 刷新参数缓存
* 清空缓存 */
*/ @PreAuthorize("@ss.hasPermi('system:config:remove')")
@PreAuthorize("@ss.hasPermi('system:config:remove')") @Log(title = "参数管理", businessType = BusinessType.CLEAN)
@Log(title = "参数管理", businessType = BusinessType.CLEAN) @DeleteMapping("/refreshCache")
@DeleteMapping("/clearCache") public AjaxResult refreshCache()
public AjaxResult clearCache() {
{ configService.resetConfigCache();
configService.clearCache(); return AjaxResult.success();
return AjaxResult.success(); }
} }
}

View File

@ -1,163 +1,165 @@
package com.ruoyi.web.controller.system; package com.ruoyi.web.controller.system;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.ArrayUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log; import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysDept; import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.system.service.ISysDeptService;
import com.ruoyi.system.service.ISysDeptService;
/**
/** * 部门信息
* 部门信息 *
* * @author ruoyi
* @author ruoyi */
*/ @RestController
@RestController @RequestMapping("/system/dept")
@RequestMapping("/system/dept") public class SysDeptController extends BaseController
public class SysDeptController extends BaseController {
{ @Autowired
@Autowired private ISysDeptService deptService;
private ISysDeptService deptService;
/**
/** * 获取部门列表
* 获取部门列表 */
*/ @PreAuthorize("@ss.hasPermi('system:dept:list')")
@PreAuthorize("@ss.hasPermi('system:dept:list')") @GetMapping("/list")
@GetMapping("/list") public AjaxResult list(SysDept dept)
public AjaxResult list(SysDept dept) {
{ List<SysDept> depts = deptService.selectDeptList(dept);
List<SysDept> depts = deptService.selectDeptList(dept); return AjaxResult.success(depts);
return AjaxResult.success(depts); }
}
/**
/** * 查询部门列表排除节点
* 查询部门列表排除节点 */
*/ @PreAuthorize("@ss.hasPermi('system:dept:list')")
@PreAuthorize("@ss.hasPermi('system:dept:list')") @GetMapping("/list/exclude/{deptId}")
@GetMapping("/list/exclude/{deptId}") public AjaxResult excludeChild(@PathVariable(value = "deptId", required = false) Long deptId)
public AjaxResult excludeChild(@PathVariable(value = "deptId", required = false) Long deptId) {
{ List<SysDept> depts = deptService.selectDeptList(new SysDept());
List<SysDept> depts = deptService.selectDeptList(new SysDept()); Iterator<SysDept> it = depts.iterator();
Iterator<SysDept> it = depts.iterator(); while (it.hasNext())
while (it.hasNext()) {
{ SysDept d = (SysDept) it.next();
SysDept d = (SysDept) it.next(); if (d.getDeptId().intValue() == deptId
if (d.getDeptId().intValue() == deptId || ArrayUtils.contains(StringUtils.split(d.getAncestors(), ","), deptId + ""))
|| ArrayUtils.contains(StringUtils.split(d.getAncestors(), ","), deptId + "")) {
{ it.remove();
it.remove(); }
} }
} return AjaxResult.success(depts);
return AjaxResult.success(depts); }
}
/**
/** * 根据部门编号获取详细信息
* 根据部门编号获取详细信息 */
*/ @PreAuthorize("@ss.hasPermi('system:dept:query')")
@PreAuthorize("@ss.hasPermi('system:dept:query')") @GetMapping(value = "/{deptId}")
@GetMapping(value = "/{deptId}") public AjaxResult getInfo(@PathVariable Long deptId)
public AjaxResult getInfo(@PathVariable Long deptId) {
{ deptService.checkDeptDataScope(deptId);
return AjaxResult.success(deptService.selectDeptById(deptId)); return AjaxResult.success(deptService.selectDeptById(deptId));
} }
/** /**
* 获取部门下拉树列表 * 获取部门下拉树列表
*/ */
@GetMapping("/treeselect") @GetMapping("/treeselect")
public AjaxResult treeselect(SysDept dept) public AjaxResult treeselect(SysDept dept)
{ {
List<SysDept> depts = deptService.selectDeptList(dept); List<SysDept> depts = deptService.selectDeptList(dept);
return AjaxResult.success(deptService.buildDeptTreeSelect(depts)); return AjaxResult.success(deptService.buildDeptTreeSelect(depts));
} }
/** /**
* 加载对应角色部门列表树 * 加载对应角色部门列表树
*/ */
@GetMapping(value = "/roleDeptTreeselect/{roleId}") @GetMapping(value = "/roleDeptTreeselect/{roleId}")
public AjaxResult roleDeptTreeselect(@PathVariable("roleId") Long roleId) public AjaxResult roleDeptTreeselect(@PathVariable("roleId") Long roleId)
{ {
List<SysDept> depts = deptService.selectDeptList(new SysDept()); List<SysDept> depts = deptService.selectDeptList(new SysDept());
AjaxResult ajax = AjaxResult.success(); AjaxResult ajax = AjaxResult.success();
ajax.put("checkedKeys", deptService.selectDeptListByRoleId(roleId)); ajax.put("checkedKeys", deptService.selectDeptListByRoleId(roleId));
ajax.put("depts", deptService.buildDeptTreeSelect(depts)); ajax.put("depts", deptService.buildDeptTreeSelect(depts));
return ajax; return ajax;
} }
/** /**
* 新增部门 * 新增部门
*/ */
@PreAuthorize("@ss.hasPermi('system:dept:add')") @PreAuthorize("@ss.hasPermi('system:dept:add')")
@Log(title = "部门管理", businessType = BusinessType.INSERT) @Log(title = "部门管理", businessType = BusinessType.INSERT)
@PostMapping @PostMapping
public AjaxResult add(@Validated @RequestBody SysDept dept) public AjaxResult add(@Validated @RequestBody SysDept dept)
{ {
if (UserConstants.NOT_UNIQUE.equals(deptService.checkDeptNameUnique(dept))) if (UserConstants.NOT_UNIQUE.equals(deptService.checkDeptNameUnique(dept)))
{ {
return AjaxResult.error("新增部门'" + dept.getDeptName() + "'失败,部门名称已存在"); return AjaxResult.error("新增部门'" + dept.getDeptName() + "'失败,部门名称已存在");
} }
dept.setCreateBy(SecurityUtils.getUsername()); dept.setCreateBy(getUsername());
return toAjax(deptService.insertDept(dept)); return toAjax(deptService.insertDept(dept));
} }
/** /**
* 修改部门 * 修改部门
*/ */
@PreAuthorize("@ss.hasPermi('system:dept:edit')") @PreAuthorize("@ss.hasPermi('system:dept:edit')")
@Log(title = "部门管理", businessType = BusinessType.UPDATE) @Log(title = "部门管理", businessType = BusinessType.UPDATE)
@PutMapping @PutMapping
public AjaxResult edit(@Validated @RequestBody SysDept dept) public AjaxResult edit(@Validated @RequestBody SysDept dept)
{ {
if (UserConstants.NOT_UNIQUE.equals(deptService.checkDeptNameUnique(dept))) Long deptId = dept.getDeptId();
{ deptService.checkDeptDataScope(deptId);
return AjaxResult.error("修改部门'" + dept.getDeptName() + "'失败,部门名称已存在"); if (UserConstants.NOT_UNIQUE.equals(deptService.checkDeptNameUnique(dept)))
} {
else if (dept.getParentId().equals(dept.getDeptId())) return AjaxResult.error("修改部门'" + dept.getDeptName() + "'失败,部门名称已存在");
{ }
return AjaxResult.error("修改部门'" + dept.getDeptName() + "'失败,上级部门不能是自己"); else if (dept.getParentId().equals(deptId))
} {
else if (StringUtils.equals(UserConstants.DEPT_DISABLE, dept.getStatus()) return AjaxResult.error("修改部门'" + dept.getDeptName() + "'失败,上级部门不能是自己");
&& deptService.selectNormalChildrenDeptById(dept.getDeptId()) > 0) }
{ else if (StringUtils.equals(UserConstants.DEPT_DISABLE, dept.getStatus()) && deptService.selectNormalChildrenDeptById(deptId) > 0)
return AjaxResult.error("该部门包含未停用的子部门!"); {
} return AjaxResult.error("该部门包含未停用的子部门!");
dept.setUpdateBy(SecurityUtils.getUsername()); }
return toAjax(deptService.updateDept(dept)); dept.setUpdateBy(getUsername());
} return toAjax(deptService.updateDept(dept));
}
/**
* 删除部门 /**
*/ * 删除部门
@PreAuthorize("@ss.hasPermi('system:dept:remove')") */
@Log(title = "部门管理", businessType = BusinessType.DELETE) @PreAuthorize("@ss.hasPermi('system:dept:remove')")
@DeleteMapping("/{deptId}") @Log(title = "部门管理", businessType = BusinessType.DELETE)
public AjaxResult remove(@PathVariable Long deptId) @DeleteMapping("/{deptId}")
{ public AjaxResult remove(@PathVariable Long deptId)
if (deptService.hasChildByDeptId(deptId)) {
{ if (deptService.hasChildByDeptId(deptId))
return AjaxResult.error("存在下级部门,不允许删除"); {
} return AjaxResult.error("存在下级部门,不允许删除");
if (deptService.checkDeptExistUser(deptId)) }
{ if (deptService.checkDeptExistUser(deptId))
return AjaxResult.error("部门存在用户,不允许删除"); {
} return AjaxResult.error("部门存在用户,不允许删除");
return toAjax(deptService.deleteDeptById(deptId)); }
} deptService.checkDeptDataScope(deptId);
} return toAjax(deptService.deleteDeptById(deptId));
}
}

View File

@ -1,113 +1,121 @@
package com.ruoyi.web.controller.system; package com.ruoyi.web.controller.system;
import java.util.List; import java.util.ArrayList;
import org.springframework.beans.factory.annotation.Autowired; import java.util.List;
import org.springframework.security.access.prepost.PreAuthorize; import javax.servlet.http.HttpServletResponse;
import org.springframework.validation.annotation.Validated; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RequestBody;
import com.ruoyi.common.annotation.Log; import org.springframework.web.bind.annotation.RequestMapping;
import com.ruoyi.common.core.controller.BaseController; import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.domain.entity.SysDictData; import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.core.domain.entity.SysDictData;
import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.system.service.ISysDictDataService; import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.service.ISysDictTypeService; import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.system.service.ISysDictDataService;
/** import com.ruoyi.system.service.ISysDictTypeService;
* 数据字典信息
* /**
* @author ruoyi * 数据字典信息
*/ *
@RestController * @author ruoyi
@RequestMapping("/system/dict/data") */
public class SysDictDataController extends BaseController @RestController
{ @RequestMapping("/system/dict/data")
@Autowired public class SysDictDataController extends BaseController
private ISysDictDataService dictDataService; {
@Autowired
@Autowired private ISysDictDataService dictDataService;
private ISysDictTypeService dictTypeService;
@Autowired
@PreAuthorize("@ss.hasPermi('system:dict:list')") private ISysDictTypeService dictTypeService;
@GetMapping("/list")
public TableDataInfo list(SysDictData dictData) @PreAuthorize("@ss.hasPermi('system:dict:list')")
{ @GetMapping("/list")
startPage(); public TableDataInfo list(SysDictData dictData)
List<SysDictData> list = dictDataService.selectDictDataList(dictData); {
return getDataTable(list); startPage();
} List<SysDictData> list = dictDataService.selectDictDataList(dictData);
return getDataTable(list);
@Log(title = "字典数据", businessType = BusinessType.EXPORT) }
@PreAuthorize("@ss.hasPermi('system:dict:export')")
@GetMapping("/export") @Log(title = "字典数据", businessType = BusinessType.EXPORT)
public AjaxResult export(SysDictData dictData) @PreAuthorize("@ss.hasPermi('system:dict:export')")
{ @PostMapping("/export")
List<SysDictData> list = dictDataService.selectDictDataList(dictData); public void export(HttpServletResponse response, SysDictData dictData)
ExcelUtil<SysDictData> util = new ExcelUtil<SysDictData>(SysDictData.class); {
return util.exportExcel(list, "字典数据"); List<SysDictData> list = dictDataService.selectDictDataList(dictData);
} ExcelUtil<SysDictData> util = new ExcelUtil<SysDictData>(SysDictData.class);
util.exportExcel(response, list, "字典数据");
/** }
* 查询字典数据详细
*/ /**
@PreAuthorize("@ss.hasPermi('system:dict:query')") * 查询字典数据详细
@GetMapping(value = "/{dictCode}") */
public AjaxResult getInfo(@PathVariable Long dictCode) @PreAuthorize("@ss.hasPermi('system:dict:query')")
{ @GetMapping(value = "/{dictCode}")
return AjaxResult.success(dictDataService.selectDictDataById(dictCode)); public AjaxResult getInfo(@PathVariable Long dictCode)
} {
return AjaxResult.success(dictDataService.selectDictDataById(dictCode));
/** }
* 根据字典类型查询字典数据信息
*/ /**
@GetMapping(value = "/type/{dictType}") * 根据字典类型查询字典数据信息
public AjaxResult dictType(@PathVariable String dictType) */
{ @GetMapping(value = "/type/{dictType}")
return AjaxResult.success(dictTypeService.selectDictDataByType(dictType)); public AjaxResult dictType(@PathVariable String dictType)
} {
List<SysDictData> data = dictTypeService.selectDictDataByType(dictType);
/** if (StringUtils.isNull(data))
* 新增字典类型 {
*/ data = new ArrayList<SysDictData>();
@PreAuthorize("@ss.hasPermi('system:dict:add')") }
@Log(title = "字典数据", businessType = BusinessType.INSERT) return AjaxResult.success(data);
@PostMapping }
public AjaxResult add(@Validated @RequestBody SysDictData dict)
{ /**
dict.setCreateBy(SecurityUtils.getUsername()); * 新增字典类型
return toAjax(dictDataService.insertDictData(dict)); */
} @PreAuthorize("@ss.hasPermi('system:dict:add')")
@Log(title = "字典数据", businessType = BusinessType.INSERT)
/** @PostMapping
* 修改保存字典类型 public AjaxResult add(@Validated @RequestBody SysDictData dict)
*/ {
@PreAuthorize("@ss.hasPermi('system:dict:edit')") dict.setCreateBy(getUsername());
@Log(title = "字典数据", businessType = BusinessType.UPDATE) return toAjax(dictDataService.insertDictData(dict));
@PutMapping }
public AjaxResult edit(@Validated @RequestBody SysDictData dict)
{ /**
dict.setUpdateBy(SecurityUtils.getUsername()); * 修改保存字典类型
return toAjax(dictDataService.updateDictData(dict)); */
} @PreAuthorize("@ss.hasPermi('system:dict:edit')")
@Log(title = "字典数据", businessType = BusinessType.UPDATE)
/** @PutMapping
* 删除字典类型 public AjaxResult edit(@Validated @RequestBody SysDictData dict)
*/ {
@PreAuthorize("@ss.hasPermi('system:dict:remove')") dict.setUpdateBy(getUsername());
@Log(title = "字典类型", businessType = BusinessType.DELETE) return toAjax(dictDataService.updateDictData(dict));
@DeleteMapping("/{dictCodes}") }
public AjaxResult remove(@PathVariable Long[] dictCodes)
{ /**
return toAjax(dictDataService.deleteDictDataByIds(dictCodes)); * 删除字典类型
} */
} @PreAuthorize("@ss.hasPermi('system:dict:remove')")
@Log(title = "字典类型", businessType = BusinessType.DELETE)
@DeleteMapping("/{dictCodes}")
public AjaxResult remove(@PathVariable Long[] dictCodes)
{
dictDataService.deleteDictDataByIds(dictCodes);
return success();
}
}

View File

@ -1,131 +1,132 @@
package com.ruoyi.web.controller.system; package com.ruoyi.web.controller.system;
import java.util.List; import java.util.List;
import org.springframework.beans.factory.annotation.Autowired; import javax.servlet.http.HttpServletResponse;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RequestMapping;
import com.ruoyi.common.annotation.Log; import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.entity.SysDictType; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.domain.entity.SysDictType;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.system.service.ISysDictTypeService; import com.ruoyi.system.service.ISysDictTypeService;
/** /**
* 数据字典信息 * 数据字典信息
* *
* @author ruoyi * @author ruoyi
*/ */
@RestController @RestController
@RequestMapping("/system/dict/type") @RequestMapping("/system/dict/type")
public class SysDictTypeController extends BaseController public class SysDictTypeController extends BaseController
{ {
@Autowired @Autowired
private ISysDictTypeService dictTypeService; private ISysDictTypeService dictTypeService;
@PreAuthorize("@ss.hasPermi('system:dict:list')") @PreAuthorize("@ss.hasPermi('system:dict:list')")
@GetMapping("/list") @GetMapping("/list")
public TableDataInfo list(SysDictType dictType) public TableDataInfo list(SysDictType dictType)
{ {
startPage(); startPage();
List<SysDictType> list = dictTypeService.selectDictTypeList(dictType); List<SysDictType> list = dictTypeService.selectDictTypeList(dictType);
return getDataTable(list); return getDataTable(list);
} }
@Log(title = "字典类型", businessType = BusinessType.EXPORT) @Log(title = "字典类型", businessType = BusinessType.EXPORT)
@PreAuthorize("@ss.hasPermi('system:dict:export')") @PreAuthorize("@ss.hasPermi('system:dict:export')")
@GetMapping("/export") @PostMapping("/export")
public AjaxResult export(SysDictType dictType) public void export(HttpServletResponse response, SysDictType dictType)
{ {
List<SysDictType> list = dictTypeService.selectDictTypeList(dictType); List<SysDictType> list = dictTypeService.selectDictTypeList(dictType);
ExcelUtil<SysDictType> util = new ExcelUtil<SysDictType>(SysDictType.class); ExcelUtil<SysDictType> util = new ExcelUtil<SysDictType>(SysDictType.class);
return util.exportExcel(list, "字典类型"); util.exportExcel(response, list, "字典类型");
} }
/** /**
* 查询字典类型详细 * 查询字典类型详细
*/ */
@PreAuthorize("@ss.hasPermi('system:dict:query')") @PreAuthorize("@ss.hasPermi('system:dict:query')")
@GetMapping(value = "/{dictId}") @GetMapping(value = "/{dictId}")
public AjaxResult getInfo(@PathVariable Long dictId) public AjaxResult getInfo(@PathVariable Long dictId)
{ {
return AjaxResult.success(dictTypeService.selectDictTypeById(dictId)); return AjaxResult.success(dictTypeService.selectDictTypeById(dictId));
} }
/** /**
* 新增字典类型 * 新增字典类型
*/ */
@PreAuthorize("@ss.hasPermi('system:dict:add')") @PreAuthorize("@ss.hasPermi('system:dict:add')")
@Log(title = "字典类型", businessType = BusinessType.INSERT) @Log(title = "字典类型", businessType = BusinessType.INSERT)
@PostMapping @PostMapping
public AjaxResult add(@Validated @RequestBody SysDictType dict) public AjaxResult add(@Validated @RequestBody SysDictType dict)
{ {
if (UserConstants.NOT_UNIQUE.equals(dictTypeService.checkDictTypeUnique(dict))) if (UserConstants.NOT_UNIQUE.equals(dictTypeService.checkDictTypeUnique(dict)))
{ {
return AjaxResult.error("新增字典'" + dict.getDictName() + "'失败,字典类型已存在"); return AjaxResult.error("新增字典'" + dict.getDictName() + "'失败,字典类型已存在");
} }
dict.setCreateBy(SecurityUtils.getUsername()); dict.setCreateBy(getUsername());
return toAjax(dictTypeService.insertDictType(dict)); return toAjax(dictTypeService.insertDictType(dict));
} }
/** /**
* 修改字典类型 * 修改字典类型
*/ */
@PreAuthorize("@ss.hasPermi('system:dict:edit')") @PreAuthorize("@ss.hasPermi('system:dict:edit')")
@Log(title = "字典类型", businessType = BusinessType.UPDATE) @Log(title = "字典类型", businessType = BusinessType.UPDATE)
@PutMapping @PutMapping
public AjaxResult edit(@Validated @RequestBody SysDictType dict) public AjaxResult edit(@Validated @RequestBody SysDictType dict)
{ {
if (UserConstants.NOT_UNIQUE.equals(dictTypeService.checkDictTypeUnique(dict))) if (UserConstants.NOT_UNIQUE.equals(dictTypeService.checkDictTypeUnique(dict)))
{ {
return AjaxResult.error("修改字典'" + dict.getDictName() + "'失败,字典类型已存在"); return AjaxResult.error("修改字典'" + dict.getDictName() + "'失败,字典类型已存在");
} }
dict.setUpdateBy(SecurityUtils.getUsername()); dict.setUpdateBy(getUsername());
return toAjax(dictTypeService.updateDictType(dict)); return toAjax(dictTypeService.updateDictType(dict));
} }
/** /**
* 删除字典类型 * 删除字典类型
*/ */
@PreAuthorize("@ss.hasPermi('system:dict:remove')") @PreAuthorize("@ss.hasPermi('system:dict:remove')")
@Log(title = "字典类型", businessType = BusinessType.DELETE) @Log(title = "字典类型", businessType = BusinessType.DELETE)
@DeleteMapping("/{dictIds}") @DeleteMapping("/{dictIds}")
public AjaxResult remove(@PathVariable Long[] dictIds) public AjaxResult remove(@PathVariable Long[] dictIds)
{ {
return toAjax(dictTypeService.deleteDictTypeByIds(dictIds)); dictTypeService.deleteDictTypeByIds(dictIds);
} return success();
}
/**
* 清空缓存 /**
*/ * 刷新字典缓存
@PreAuthorize("@ss.hasPermi('system:dict:remove')") */
@Log(title = "字典类型", businessType = BusinessType.CLEAN) @PreAuthorize("@ss.hasPermi('system:dict:remove')")
@DeleteMapping("/clearCache") @Log(title = "字典类型", businessType = BusinessType.CLEAN)
public AjaxResult clearCache() @DeleteMapping("/refreshCache")
{ public AjaxResult refreshCache()
dictTypeService.clearCache(); {
return AjaxResult.success(); dictTypeService.resetDictCache();
} return AjaxResult.success();
}
/**
* 获取字典选择框列表 /**
*/ * 获取字典选择框列表
@GetMapping("/optionselect") */
public AjaxResult optionselect() @GetMapping("/optionselect")
{ public AjaxResult optionselect()
List<SysDictType> dictTypes = dictTypeService.selectDictTypeAll(); {
return AjaxResult.success(dictTypes); List<SysDictType> dictTypes = dictTypeService.selectDictTypeAll();
} return AjaxResult.success(dictTypes);
} }
}

View File

@ -0,0 +1,29 @@
package com.ruoyi.web.controller.system;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.utils.StringUtils;
/**
* 首页
*
* @author ruoyi
*/
@RestController
public class SysIndexController
{
/** 系统基础配置 */
@Autowired
private RuoYiConfig ruoyiConfig;
/**
* 访问首页提示语
*/
@RequestMapping("/")
public String index()
{
return StringUtils.format("欢迎使用{}后台管理框架当前版本v{},请通过前端地址访问。", ruoyiConfig.getName(), ruoyiConfig.getVersion());
}
}

View File

@ -1,94 +1,93 @@
package com.ruoyi.web.controller.system; package com.ruoyi.web.controller.system;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysMenu; import com.ruoyi.common.core.domain.entity.SysMenu;
import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginBody; import com.ruoyi.common.core.domain.model.LoginBody;
import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.utils.ServletUtils; import com.ruoyi.common.utils.ServletUtils;
import com.ruoyi.framework.web.service.SysLoginService; import com.ruoyi.framework.web.service.SysLoginService;
import com.ruoyi.framework.web.service.SysPermissionService; import com.ruoyi.framework.web.service.SysPermissionService;
import com.ruoyi.framework.web.service.TokenService; import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.service.ISysMenuService; import com.ruoyi.system.service.ISysMenuService;
/** /**
* 登录验证 * 登录验证
* *
* @author ruoyi * @author ruoyi
*/ */
@RestController @RestController
public class SysLoginController public class SysLoginController
{ {
@Autowired @Autowired
private SysLoginService loginService; private SysLoginService loginService;
@Autowired @Autowired
private ISysMenuService menuService; private ISysMenuService menuService;
@Autowired @Autowired
private SysPermissionService permissionService; private SysPermissionService permissionService;
@Autowired @Autowired
private TokenService tokenService; private TokenService tokenService;
/** /**
* 登录方法 * 登录方法
* *
* @param loginBody 登录信息 * @param loginBody 登录信息
* @return 结果 * @return 结果
*/ */
@PostMapping("/login") @PostMapping("/login")
public AjaxResult login(@RequestBody LoginBody loginBody) public AjaxResult login(@RequestBody LoginBody loginBody)
{ {
AjaxResult ajax = AjaxResult.success(); AjaxResult ajax = AjaxResult.success();
// 生成令牌 // 生成令牌
String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(), String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode());
loginBody.getUuid()); ajax.put(Constants.TOKEN, token);
ajax.put(Constants.TOKEN, token); return ajax;
return ajax; }
}
/**
/** * 获取用户信息
* 获取用户信息 *
* * @return 用户信息
* @return 用户信息 */
*/ @GetMapping("getInfo")
@GetMapping("getInfo") public AjaxResult getInfo()
public AjaxResult getInfo() {
{ LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest()); SysUser user = loginUser.getUser();
SysUser user = loginUser.getUser(); // 角色集合
// 角色集合 Set<String> roles = permissionService.getRolePermission(user);
Set<String> roles = permissionService.getRolePermission(user); // 权限集合
// 权限集合 Set<String> permissions = permissionService.getMenuPermission(user);
Set<String> permissions = permissionService.getMenuPermission(user); AjaxResult ajax = AjaxResult.success();
AjaxResult ajax = AjaxResult.success(); ajax.put("user", user);
ajax.put("user", user); ajax.put("roles", roles);
ajax.put("roles", roles); ajax.put("permissions", permissions);
ajax.put("permissions", permissions); return ajax;
return ajax; }
}
/**
/** * 获取路由信息
* 获取路由信息 *
* * @return 路由信息
* @return 路由信息 */
*/ @GetMapping("getRouters")
@GetMapping("getRouters") public AjaxResult getRouters()
public AjaxResult getRouters() {
{ LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest()); // 用户信息
// 用户信息 SysUser user = loginUser.getUser();
SysUser user = loginUser.getUser(); List<SysMenu> menus = menuService.selectMenuTreeByUserId(user.getUserId());
List<SysMenu> menus = menuService.selectMenuTreeByUserId(user.getUserId()); return AjaxResult.success(menuService.buildMenus(menus));
return AjaxResult.success(menuService.buildMenus(menus)); }
} }
}

View File

@ -1,153 +1,142 @@
package com.ruoyi.web.controller.system; package com.ruoyi.web.controller.system;
import java.util.List; import java.util.List;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log; import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.entity.SysMenu;
import com.ruoyi.common.core.domain.entity.SysMenu; import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.system.service.ISysMenuService;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.ServletUtils; /**
import com.ruoyi.common.utils.StringUtils; * 菜单信息
import com.ruoyi.framework.web.service.TokenService; *
import com.ruoyi.system.service.ISysMenuService; * @author ruoyi
*/
/** @RestController
* 菜单信息 @RequestMapping("/system/menu")
* public class SysMenuController extends BaseController
* @author ruoyi {
*/ @Autowired
@RestController private ISysMenuService menuService;
@RequestMapping("/system/menu")
public class SysMenuController extends BaseController /**
{ * 获取菜单列表
@Autowired */
private ISysMenuService menuService; @PreAuthorize("@ss.hasPermi('system:menu:list')")
@GetMapping("/list")
@Autowired public AjaxResult list(SysMenu menu)
private TokenService tokenService; {
List<SysMenu> menus = menuService.selectMenuList(menu, getUserId());
/** return AjaxResult.success(menus);
* 获取菜单列表 }
*/
@PreAuthorize("@ss.hasPermi('system:menu:list')") /**
@GetMapping("/list") * 根据菜单编号获取详细信息
public AjaxResult list(SysMenu menu) */
{ @PreAuthorize("@ss.hasPermi('system:menu:query')")
LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest()); @GetMapping(value = "/{menuId}")
Long userId = loginUser.getUser().getUserId(); public AjaxResult getInfo(@PathVariable Long menuId)
List<SysMenu> menus = menuService.selectMenuList(menu, userId); {
return AjaxResult.success(menus); return AjaxResult.success(menuService.selectMenuById(menuId));
} }
/** /**
* 根据菜单编号获取详细信息 * 获取菜单下拉树列表
*/ */
@PreAuthorize("@ss.hasPermi('system:menu:query')") @GetMapping("/treeselect")
@GetMapping(value = "/{menuId}") public AjaxResult treeselect(SysMenu menu)
public AjaxResult getInfo(@PathVariable Long menuId) {
{ List<SysMenu> menus = menuService.selectMenuList(menu, getUserId());
return AjaxResult.success(menuService.selectMenuById(menuId)); return AjaxResult.success(menuService.buildMenuTreeSelect(menus));
} }
/** /**
* 获取菜单下拉树列表 * 加载对应角色菜单列表树
*/ */
@GetMapping("/treeselect") @GetMapping(value = "/roleMenuTreeselect/{roleId}")
public AjaxResult treeselect(SysMenu menu) public AjaxResult roleMenuTreeselect(@PathVariable("roleId") Long roleId)
{ {
LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest()); List<SysMenu> menus = menuService.selectMenuList(getUserId());
Long userId = loginUser.getUser().getUserId(); AjaxResult ajax = AjaxResult.success();
List<SysMenu> menus = menuService.selectMenuList(menu, userId); ajax.put("checkedKeys", menuService.selectMenuListByRoleId(roleId));
return AjaxResult.success(menuService.buildMenuTreeSelect(menus)); ajax.put("menus", menuService.buildMenuTreeSelect(menus));
} return ajax;
}
/**
* 加载对应角色菜单列表树 /**
*/ * 新增菜单
@GetMapping(value = "/roleMenuTreeselect/{roleId}") */
public AjaxResult roleMenuTreeselect(@PathVariable("roleId") Long roleId) @PreAuthorize("@ss.hasPermi('system:menu:add')")
{ @Log(title = "菜单管理", businessType = BusinessType.INSERT)
LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest()); @PostMapping
List<SysMenu> menus = menuService.selectMenuList(loginUser.getUser().getUserId()); public AjaxResult add(@Validated @RequestBody SysMenu menu)
AjaxResult ajax = AjaxResult.success(); {
ajax.put("checkedKeys", menuService.selectMenuListByRoleId(roleId)); if (UserConstants.NOT_UNIQUE.equals(menuService.checkMenuNameUnique(menu)))
ajax.put("menus", menuService.buildMenuTreeSelect(menus)); {
return ajax; return AjaxResult.error("新增菜单'" + menu.getMenuName() + "'失败,菜单名称已存在");
} }
else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath()))
/** {
* 新增菜单 return AjaxResult.error("新增菜单'" + menu.getMenuName() + "'失败地址必须以http(s)://开头");
*/ }
@PreAuthorize("@ss.hasPermi('system:menu:add')") menu.setCreateBy(getUsername());
@Log(title = "菜单管理", businessType = BusinessType.INSERT) return toAjax(menuService.insertMenu(menu));
@PostMapping }
public AjaxResult add(@Validated @RequestBody SysMenu menu)
{ /**
if (UserConstants.NOT_UNIQUE.equals(menuService.checkMenuNameUnique(menu))) * 修改菜单
{ */
return AjaxResult.error("新增菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); @PreAuthorize("@ss.hasPermi('system:menu:edit')")
} @Log(title = "菜单管理", businessType = BusinessType.UPDATE)
else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) @PutMapping
&& !StringUtils.startsWithAny(menu.getPath(), Constants.HTTP, Constants.HTTPS)) public AjaxResult edit(@Validated @RequestBody SysMenu menu)
{ {
return AjaxResult.error("新增菜单'" + menu.getMenuName() + "'失败地址必须以http(s)://开头"); if (UserConstants.NOT_UNIQUE.equals(menuService.checkMenuNameUnique(menu)))
} {
menu.setCreateBy(SecurityUtils.getUsername()); return AjaxResult.error("修改菜单'" + menu.getMenuName() + "'失败,菜单名称已存在");
return toAjax(menuService.insertMenu(menu)); }
} else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath()))
{
/** return AjaxResult.error("修改菜单'" + menu.getMenuName() + "'失败地址必须以http(s)://开头");
* 修改菜单 }
*/ else if (menu.getMenuId().equals(menu.getParentId()))
@PreAuthorize("@ss.hasPermi('system:menu:edit')") {
@Log(title = "菜单管理", businessType = BusinessType.UPDATE) return AjaxResult.error("修改菜单'" + menu.getMenuName() + "'失败,上级菜单不能选择自己");
@PutMapping }
public AjaxResult edit(@Validated @RequestBody SysMenu menu) menu.setUpdateBy(getUsername());
{ return toAjax(menuService.updateMenu(menu));
if (UserConstants.NOT_UNIQUE.equals(menuService.checkMenuNameUnique(menu))) }
{
return AjaxResult.error("修改菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); /**
} * 删除菜单
else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) */
&& !StringUtils.startsWithAny(menu.getPath(), Constants.HTTP, Constants.HTTPS)) @PreAuthorize("@ss.hasPermi('system:menu:remove')")
{ @Log(title = "菜单管理", businessType = BusinessType.DELETE)
return AjaxResult.error("新增菜单'" + menu.getMenuName() + "'失败地址必须以http(s)://开头"); @DeleteMapping("/{menuId}")
} public AjaxResult remove(@PathVariable("menuId") Long menuId)
menu.setUpdateBy(SecurityUtils.getUsername()); {
return toAjax(menuService.updateMenu(menu)); if (menuService.hasChildByMenuId(menuId))
} {
return AjaxResult.error("存在子菜单,不允许删除");
/** }
* 删除菜单 if (menuService.checkMenuExistRole(menuId))
*/ {
@PreAuthorize("@ss.hasPermi('system:menu:remove')") return AjaxResult.error("菜单已分配,不允许删除");
@Log(title = "菜单管理", businessType = BusinessType.DELETE) }
@DeleteMapping("/{menuId}") return toAjax(menuService.deleteMenuById(menuId));
public AjaxResult remove(@PathVariable("menuId") Long menuId) }
{
if (menuService.hasChildByMenuId(menuId))
{
return AjaxResult.error("存在子菜单,不允许删除");
}
if (menuService.checkMenuExistRole(menuId))
{
return AjaxResult.error("菜单已分配,不允许删除");
}
return toAjax(menuService.deleteMenuById(menuId));
}
} }

View File

@ -1,92 +1,91 @@
package com.ruoyi.web.controller.system; package com.ruoyi.web.controller.system;
import java.util.List; import java.util.List;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log; import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.system.domain.SysNotice;
import com.ruoyi.system.domain.SysNotice; import com.ruoyi.system.service.ISysNoticeService;
import com.ruoyi.system.service.ISysNoticeService;
/**
/** * 公告 信息操作处理
* 公告 信息操作处理 *
* * @author ruoyi
* @author ruoyi */
*/ @RestController
@RestController @RequestMapping("/system/notice")
@RequestMapping("/system/notice") public class SysNoticeController extends BaseController
public class SysNoticeController extends BaseController {
{ @Autowired
@Autowired private ISysNoticeService noticeService;
private ISysNoticeService noticeService;
/**
/** * 获取通知公告列表
* 获取通知公告列表 */
*/ @PreAuthorize("@ss.hasPermi('system:notice:list')")
@PreAuthorize("@ss.hasPermi('system:notice:list')") @GetMapping("/list")
@GetMapping("/list") public TableDataInfo list(SysNotice notice)
public TableDataInfo list(SysNotice notice) {
{ startPage();
startPage(); List<SysNotice> list = noticeService.selectNoticeList(notice);
List<SysNotice> list = noticeService.selectNoticeList(notice); return getDataTable(list);
return getDataTable(list); }
}
/**
/** * 根据通知公告编号获取详细信息
* 根据通知公告编号获取详细信息 */
*/ @PreAuthorize("@ss.hasPermi('system:notice:query')")
@PreAuthorize("@ss.hasPermi('system:notice:query')") @GetMapping(value = "/{noticeId}")
@GetMapping(value = "/{noticeId}") public AjaxResult getInfo(@PathVariable Long noticeId)
public AjaxResult getInfo(@PathVariable Long noticeId) {
{ return AjaxResult.success(noticeService.selectNoticeById(noticeId));
return AjaxResult.success(noticeService.selectNoticeById(noticeId)); }
}
/**
/** * 新增通知公告
* 新增通知公告 */
*/ @PreAuthorize("@ss.hasPermi('system:notice:add')")
@PreAuthorize("@ss.hasPermi('system:notice:add')") @Log(title = "通知公告", businessType = BusinessType.INSERT)
@Log(title = "通知公告", businessType = BusinessType.INSERT) @PostMapping
@PostMapping public AjaxResult add(@Validated @RequestBody SysNotice notice)
public AjaxResult add(@Validated @RequestBody SysNotice notice) {
{ notice.setCreateBy(getUsername());
notice.setCreateBy(SecurityUtils.getUsername()); return toAjax(noticeService.insertNotice(notice));
return toAjax(noticeService.insertNotice(notice)); }
}
/**
/** * 修改通知公告
* 修改通知公告 */
*/ @PreAuthorize("@ss.hasPermi('system:notice:edit')")
@PreAuthorize("@ss.hasPermi('system:notice:edit')") @Log(title = "通知公告", businessType = BusinessType.UPDATE)
@Log(title = "通知公告", businessType = BusinessType.UPDATE) @PutMapping
@PutMapping public AjaxResult edit(@Validated @RequestBody SysNotice notice)
public AjaxResult edit(@Validated @RequestBody SysNotice notice) {
{ notice.setUpdateBy(getUsername());
notice.setUpdateBy(SecurityUtils.getUsername()); return toAjax(noticeService.updateNotice(notice));
return toAjax(noticeService.updateNotice(notice)); }
}
/**
/** * 删除通知公告
* 删除通知公告 */
*/ @PreAuthorize("@ss.hasPermi('system:notice:remove')")
@PreAuthorize("@ss.hasPermi('system:notice:remove')") @Log(title = "通知公告", businessType = BusinessType.DELETE)
@Log(title = "通知公告", businessType = BusinessType.DELETE) @DeleteMapping("/{noticeIds}")
@DeleteMapping("/{noticeIds}") public AjaxResult remove(@PathVariable Long[] noticeIds)
public AjaxResult remove(@PathVariable Long[] noticeIds) {
{ return toAjax(noticeService.deleteNoticeByIds(noticeIds));
return toAjax(noticeService.deleteNoticeByIds(noticeIds)); }
} }
}

View File

@ -1,130 +1,130 @@
package com.ruoyi.web.controller.system; package com.ruoyi.web.controller.system;
import java.util.List; import java.util.List;
import org.springframework.beans.factory.annotation.Autowired; import javax.servlet.http.HttpServletResponse;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RequestMapping;
import com.ruoyi.common.annotation.Log; import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.system.domain.SysPost; import com.ruoyi.system.domain.SysPost;
import com.ruoyi.system.service.ISysPostService; import com.ruoyi.system.service.ISysPostService;
/** /**
* 岗位信息操作处理 * 岗位信息操作处理
* *
* @author ruoyi * @author ruoyi
*/ */
@RestController @RestController
@RequestMapping("/system/post") @RequestMapping("/system/post")
public class SysPostController extends BaseController public class SysPostController extends BaseController
{ {
@Autowired @Autowired
private ISysPostService postService; private ISysPostService postService;
/** /**
* 获取岗位列表 * 获取岗位列表
*/ */
@PreAuthorize("@ss.hasPermi('system:post:list')") @PreAuthorize("@ss.hasPermi('system:post:list')")
@GetMapping("/list") @GetMapping("/list")
public TableDataInfo list(SysPost post) public TableDataInfo list(SysPost post)
{ {
startPage(); startPage();
List<SysPost> list = postService.selectPostList(post); List<SysPost> list = postService.selectPostList(post);
return getDataTable(list); return getDataTable(list);
} }
@Log(title = "岗位管理", businessType = BusinessType.EXPORT) @Log(title = "岗位管理", businessType = BusinessType.EXPORT)
@PreAuthorize("@ss.hasPermi('system:post:export')") @PreAuthorize("@ss.hasPermi('system:post:export')")
@GetMapping("/export") @PostMapping("/export")
public AjaxResult export(SysPost post) public void export(HttpServletResponse response, SysPost post)
{ {
List<SysPost> list = postService.selectPostList(post); List<SysPost> list = postService.selectPostList(post);
ExcelUtil<SysPost> util = new ExcelUtil<SysPost>(SysPost.class); ExcelUtil<SysPost> util = new ExcelUtil<SysPost>(SysPost.class);
return util.exportExcel(list, "岗位数据"); util.exportExcel(response, list, "岗位数据");
} }
/** /**
* 根据岗位编号获取详细信息 * 根据岗位编号获取详细信息
*/ */
@PreAuthorize("@ss.hasPermi('system:post:query')") @PreAuthorize("@ss.hasPermi('system:post:query')")
@GetMapping(value = "/{postId}") @GetMapping(value = "/{postId}")
public AjaxResult getInfo(@PathVariable Long postId) public AjaxResult getInfo(@PathVariable Long postId)
{ {
return AjaxResult.success(postService.selectPostById(postId)); return AjaxResult.success(postService.selectPostById(postId));
} }
/** /**
* 新增岗位 * 新增岗位
*/ */
@PreAuthorize("@ss.hasPermi('system:post:add')") @PreAuthorize("@ss.hasPermi('system:post:add')")
@Log(title = "岗位管理", businessType = BusinessType.INSERT) @Log(title = "岗位管理", businessType = BusinessType.INSERT)
@PostMapping @PostMapping
public AjaxResult add(@Validated @RequestBody SysPost post) public AjaxResult add(@Validated @RequestBody SysPost post)
{ {
if (UserConstants.NOT_UNIQUE.equals(postService.checkPostNameUnique(post))) if (UserConstants.NOT_UNIQUE.equals(postService.checkPostNameUnique(post)))
{ {
return AjaxResult.error("新增岗位'" + post.getPostName() + "'失败,岗位名称已存在"); return AjaxResult.error("新增岗位'" + post.getPostName() + "'失败,岗位名称已存在");
} }
else if (UserConstants.NOT_UNIQUE.equals(postService.checkPostCodeUnique(post))) else if (UserConstants.NOT_UNIQUE.equals(postService.checkPostCodeUnique(post)))
{ {
return AjaxResult.error("新增岗位'" + post.getPostName() + "'失败,岗位编码已存在"); return AjaxResult.error("新增岗位'" + post.getPostName() + "'失败,岗位编码已存在");
} }
post.setCreateBy(SecurityUtils.getUsername()); post.setCreateBy(getUsername());
return toAjax(postService.insertPost(post)); return toAjax(postService.insertPost(post));
} }
/** /**
* 修改岗位 * 修改岗位
*/ */
@PreAuthorize("@ss.hasPermi('system:post:edit')") @PreAuthorize("@ss.hasPermi('system:post:edit')")
@Log(title = "岗位管理", businessType = BusinessType.UPDATE) @Log(title = "岗位管理", businessType = BusinessType.UPDATE)
@PutMapping @PutMapping
public AjaxResult edit(@Validated @RequestBody SysPost post) public AjaxResult edit(@Validated @RequestBody SysPost post)
{ {
if (UserConstants.NOT_UNIQUE.equals(postService.checkPostNameUnique(post))) if (UserConstants.NOT_UNIQUE.equals(postService.checkPostNameUnique(post)))
{ {
return AjaxResult.error("修改岗位'" + post.getPostName() + "'失败,岗位名称已存在"); return AjaxResult.error("修改岗位'" + post.getPostName() + "'失败,岗位名称已存在");
} }
else if (UserConstants.NOT_UNIQUE.equals(postService.checkPostCodeUnique(post))) else if (UserConstants.NOT_UNIQUE.equals(postService.checkPostCodeUnique(post)))
{ {
return AjaxResult.error("修改岗位'" + post.getPostName() + "'失败,岗位编码已存在"); return AjaxResult.error("修改岗位'" + post.getPostName() + "'失败,岗位编码已存在");
} }
post.setUpdateBy(SecurityUtils.getUsername()); post.setUpdateBy(getUsername());
return toAjax(postService.updatePost(post)); return toAjax(postService.updatePost(post));
} }
/** /**
* 删除岗位 * 删除岗位
*/ */
@PreAuthorize("@ss.hasPermi('system:post:remove')") @PreAuthorize("@ss.hasPermi('system:post:remove')")
@Log(title = "岗位管理", businessType = BusinessType.DELETE) @Log(title = "岗位管理", businessType = BusinessType.DELETE)
@DeleteMapping("/{postIds}") @DeleteMapping("/{postIds}")
public AjaxResult remove(@PathVariable Long[] postIds) public AjaxResult remove(@PathVariable Long[] postIds)
{ {
return toAjax(postService.deletePostByIds(postIds)); return toAjax(postService.deletePostByIds(postIds));
} }
/** /**
* 获取岗位选择框列表 * 获取岗位选择框列表
*/ */
@GetMapping("/optionselect") @GetMapping("/optionselect")
public AjaxResult optionselect() public AjaxResult optionselect()
{ {
List<SysPost> posts = postService.selectPostAll(); List<SysPost> posts = postService.selectPostAll();
return AjaxResult.success(posts); return AjaxResult.success(posts);
} }
} }

View File

@ -1,127 +1,142 @@
package com.ruoyi.web.controller.system; package com.ruoyi.web.controller.system;
import java.io.IOException; import java.io.IOException;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import com.ruoyi.common.annotation.Log; import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.config.RuoYiConfig; import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.ServletUtils; import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.file.FileUploadUtils; import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.web.service.TokenService; import com.ruoyi.common.utils.file.FileUploadUtils;
import com.ruoyi.system.service.ISysUserService; import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.service.ISysUserService;
/**
* 个人信息 业务处理 /**
* * 个人信息 业务处理
* @author ruoyi *
*/ * @author ruoyi
@RestController */
@RequestMapping("/system/user/profile") @RestController
public class SysProfileController extends BaseController @RequestMapping("/system/user/profile")
{ public class SysProfileController extends BaseController
@Autowired {
private ISysUserService userService; @Autowired
private ISysUserService userService;
@Autowired
private TokenService tokenService; @Autowired
private TokenService tokenService;
/**
* 个人信息 /**
*/ * 个人信息
@GetMapping */
public AjaxResult profile() @GetMapping
{ public AjaxResult profile()
LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest()); {
SysUser user = loginUser.getUser(); LoginUser loginUser = getLoginUser();
AjaxResult ajax = AjaxResult.success(user); SysUser user = loginUser.getUser();
ajax.put("roleGroup", userService.selectUserRoleGroup(loginUser.getUsername())); AjaxResult ajax = AjaxResult.success(user);
ajax.put("postGroup", userService.selectUserPostGroup(loginUser.getUsername())); ajax.put("roleGroup", userService.selectUserRoleGroup(loginUser.getUsername()));
return ajax; ajax.put("postGroup", userService.selectUserPostGroup(loginUser.getUsername()));
} return ajax;
}
/**
* 修改用户 /**
*/ * 修改用户
@Log(title = "个人信息", businessType = BusinessType.UPDATE) */
@PutMapping @Log(title = "个人信息", businessType = BusinessType.UPDATE)
public AjaxResult updateProfile(@RequestBody SysUser user) @PutMapping
{ public AjaxResult updateProfile(@RequestBody SysUser user)
if (userService.updateUserProfile(user) > 0) {
{ LoginUser loginUser = getLoginUser();
LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest()); SysUser sysUser = loginUser.getUser();
// 更新缓存用户信息 user.setUserName(sysUser.getUserName());
loginUser.getUser().setNickName(user.getNickName()); if (StringUtils.isNotEmpty(user.getPhonenumber())
loginUser.getUser().setPhonenumber(user.getPhonenumber()); && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user)))
loginUser.getUser().setEmail(user.getEmail()); {
loginUser.getUser().setSex(user.getSex()); return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,手机号码已存在");
tokenService.setLoginUser(loginUser); }
return AjaxResult.success(); if (StringUtils.isNotEmpty(user.getEmail())
} && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user)))
return AjaxResult.error("修改个人信息异常,请联系管理员"); {
} return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在");
}
/** user.setUserId(sysUser.getUserId());
* 重置密码 user.setPassword(null);
*/ if (userService.updateUserProfile(user) > 0)
@Log(title = "个人信息", businessType = BusinessType.UPDATE) {
@PutMapping("/updatePwd") // 更新缓存用户信息
public AjaxResult updatePwd(String oldPassword, String newPassword) sysUser.setNickName(user.getNickName());
{ sysUser.setPhonenumber(user.getPhonenumber());
LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest()); sysUser.setEmail(user.getEmail());
String userName = loginUser.getUsername(); sysUser.setSex(user.getSex());
String password = loginUser.getPassword(); tokenService.setLoginUser(loginUser);
if (!SecurityUtils.matchesPassword(oldPassword, password)) return AjaxResult.success();
{ }
return AjaxResult.error("修改密码失败,旧密码错误"); return AjaxResult.error("修改个人信息异常,请联系管理员");
} }
if (SecurityUtils.matchesPassword(newPassword, password))
{ /**
return AjaxResult.error("新密码不能与旧密码相同"); * 重置密码
} */
if (userService.resetUserPwd(userName, SecurityUtils.encryptPassword(newPassword)) > 0) @Log(title = "个人信息", businessType = BusinessType.UPDATE)
{ @PutMapping("/updatePwd")
// 更新缓存用户密码 public AjaxResult updatePwd(String oldPassword, String newPassword)
loginUser.getUser().setPassword(SecurityUtils.encryptPassword(newPassword)); {
tokenService.setLoginUser(loginUser); LoginUser loginUser = getLoginUser();
return AjaxResult.success(); String userName = loginUser.getUsername();
} String password = loginUser.getPassword();
return AjaxResult.error("修改密码异常,请联系管理员"); if (!SecurityUtils.matchesPassword(oldPassword, password))
} {
return AjaxResult.error("修改密码失败,旧密码错误");
/** }
* 头像上传 if (SecurityUtils.matchesPassword(newPassword, password))
*/ {
@Log(title = "用户头像", businessType = BusinessType.UPDATE) return AjaxResult.error("新密码不能与旧密码相同");
@PostMapping("/avatar") }
public AjaxResult avatar(@RequestParam("avatarfile") MultipartFile file) throws IOException if (userService.resetUserPwd(userName, SecurityUtils.encryptPassword(newPassword)) > 0)
{ {
if (!file.isEmpty()) // 更新缓存用户密码
{ loginUser.getUser().setPassword(SecurityUtils.encryptPassword(newPassword));
LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest()); tokenService.setLoginUser(loginUser);
String avatar = FileUploadUtils.upload(RuoYiConfig.getAvatarPath(), file); return AjaxResult.success();
if (userService.updateUserAvatar(loginUser.getUsername(), avatar)) }
{ return AjaxResult.error("修改密码异常,请联系管理员");
AjaxResult ajax = AjaxResult.success(); }
ajax.put("imgUrl", avatar);
// 更新缓存用户头像 /**
loginUser.getUser().setAvatar(avatar); * 头像上传
tokenService.setLoginUser(loginUser); */
return ajax; @Log(title = "用户头像", businessType = BusinessType.UPDATE)
} @PostMapping("/avatar")
} public AjaxResult avatar(@RequestParam("avatarfile") MultipartFile file) throws IOException
return AjaxResult.error("上传图片异常,请联系管理员"); {
} if (!file.isEmpty())
} {
LoginUser loginUser = getLoginUser();
String avatar = FileUploadUtils.upload(RuoYiConfig.getAvatarPath(), file);
if (userService.updateUserAvatar(loginUser.getUsername(), avatar))
{
AjaxResult ajax = AjaxResult.success();
ajax.put("imgUrl", avatar);
// 更新缓存用户头像
loginUser.getUser().setAvatar(avatar);
tokenService.setLoginUser(loginUser);
return ajax;
}
}
return AjaxResult.error("上传图片异常,请联系管理员");
}
}

View File

@ -0,0 +1,38 @@
package com.ruoyi.web.controller.system;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.model.RegisterBody;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.web.service.SysRegisterService;
import com.ruoyi.system.service.ISysConfigService;
/**
* 注册验证
*
* @author ruoyi
*/
@RestController
public class SysRegisterController extends BaseController
{
@Autowired
private SysRegisterService registerService;
@Autowired
private ISysConfigService configService;
@PostMapping("/register")
public AjaxResult register(@RequestBody RegisterBody user)
{
// if (!("true".equals(configService.selectConfigByKey("sys.account.registerUser"))))
// {
// return error("当前系统没有开启注册功能!");
// }
String msg = registerService.register(user);
return StringUtils.isEmpty(msg) ? success() : error(msg);
}
}

View File

@ -1,154 +1,245 @@
package com.ruoyi.web.controller.system; package com.ruoyi.web.controller.system;
import java.util.List; import java.util.List;
import org.springframework.beans.factory.annotation.Autowired; import javax.servlet.http.HttpServletResponse;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RequestMapping;
import com.ruoyi.common.annotation.Log; import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.system.service.ISysRoleService; import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.StringUtils;
/** import com.ruoyi.common.utils.poi.ExcelUtil;
* 角色信息 import com.ruoyi.framework.web.service.SysPermissionService;
* import com.ruoyi.framework.web.service.TokenService;
* @author ruoyi import com.ruoyi.system.domain.SysUserRole;
*/ import com.ruoyi.system.service.ISysRoleService;
@RestController import com.ruoyi.system.service.ISysUserService;
@RequestMapping("/system/role")
public class SysRoleController extends BaseController /**
{ * 角色信息
@Autowired *
private ISysRoleService roleService; * @author ruoyi
*/
@PreAuthorize("@ss.hasPermi('system:role:list')") @RestController
@GetMapping("/list") @RequestMapping("/system/role")
public TableDataInfo list(SysRole role) public class SysRoleController extends BaseController
{ {
startPage(); @Autowired
List<SysRole> list = roleService.selectRoleList(role); private ISysRoleService roleService;
return getDataTable(list);
} @Autowired
private TokenService tokenService;
@Log(title = "角色管理", businessType = BusinessType.EXPORT)
@PreAuthorize("@ss.hasPermi('system:role:export')") @Autowired
@GetMapping("/export") private SysPermissionService permissionService;
public AjaxResult export(SysRole role)
{ @Autowired
List<SysRole> list = roleService.selectRoleList(role); private ISysUserService userService;
ExcelUtil<SysRole> util = new ExcelUtil<SysRole>(SysRole.class);
return util.exportExcel(list, "角色数据"); @PreAuthorize("@ss.hasPermi('system:role:list')")
} @GetMapping("/list")
public TableDataInfo list(SysRole role)
/** {
* 根据角色编号获取详细信息 startPage();
*/ List<SysRole> list = roleService.selectRoleList(role);
@PreAuthorize("@ss.hasPermi('system:role:query')") return getDataTable(list);
@GetMapping(value = "/{roleId}") }
public AjaxResult getInfo(@PathVariable Long roleId)
{ @Log(title = "角色管理", businessType = BusinessType.EXPORT)
return AjaxResult.success(roleService.selectRoleById(roleId)); @PreAuthorize("@ss.hasPermi('system:role:export')")
} @PostMapping("/export")
public void export(HttpServletResponse response, SysRole role)
/** {
* 新增角色 List<SysRole> list = roleService.selectRoleList(role);
*/ ExcelUtil<SysRole> util = new ExcelUtil<SysRole>(SysRole.class);
@PreAuthorize("@ss.hasPermi('system:role:add')") util.exportExcel(response, list, "角色数据");
@Log(title = "角色管理", businessType = BusinessType.INSERT) }
@PostMapping
public AjaxResult add(@Validated @RequestBody SysRole role) /**
{ * 根据角色编号获取详细信息
if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role))) */
{ @PreAuthorize("@ss.hasPermi('system:role:query')")
return AjaxResult.error("新增角色'" + role.getRoleName() + "'失败,角色名称已存在"); @GetMapping(value = "/{roleId}")
} public AjaxResult getInfo(@PathVariable Long roleId)
else if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role))) {
{ roleService.checkRoleDataScope(roleId);
return AjaxResult.error("新增角色'" + role.getRoleName() + "'失败,角色权限已存在"); return AjaxResult.success(roleService.selectRoleById(roleId));
} }
role.setCreateBy(SecurityUtils.getUsername());
return toAjax(roleService.insertRole(role)); /**
* 新增角色
} */
@PreAuthorize("@ss.hasPermi('system:role:add')")
/** @Log(title = "角色管理", businessType = BusinessType.INSERT)
* 修改保存角色 @PostMapping
*/ public AjaxResult add(@Validated @RequestBody SysRole role)
@PreAuthorize("@ss.hasPermi('system:role:edit')") {
@Log(title = "角色管理", businessType = BusinessType.UPDATE) if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role)))
@PutMapping {
public AjaxResult edit(@Validated @RequestBody SysRole role) return AjaxResult.error("新增角色'" + role.getRoleName() + "'失败,角色名称已存在");
{ }
roleService.checkRoleAllowed(role); else if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role)))
if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role))) {
{ return AjaxResult.error("新增角色'" + role.getRoleName() + "'失败,角色权限已存在");
return AjaxResult.error("修改角色'" + role.getRoleName() + "'失败,角色名称已存在"); }
} role.setCreateBy(getUsername());
else if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role))) return toAjax(roleService.insertRole(role));
{
return AjaxResult.error("修改角色'" + role.getRoleName() + "'失败,角色权限已存在"); }
}
role.setUpdateBy(SecurityUtils.getUsername()); /**
return toAjax(roleService.updateRole(role)); * 修改保存角色
} */
@PreAuthorize("@ss.hasPermi('system:role:edit')")
/** @Log(title = "角色管理", businessType = BusinessType.UPDATE)
* 修改保存数据权限 @PutMapping
*/ public AjaxResult edit(@Validated @RequestBody SysRole role)
@PreAuthorize("@ss.hasPermi('system:role:edit')") {
@Log(title = "角色管理", businessType = BusinessType.UPDATE) roleService.checkRoleAllowed(role);
@PutMapping("/dataScope") roleService.checkRoleDataScope(role.getRoleId());
public AjaxResult dataScope(@RequestBody SysRole role) if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role)))
{ {
roleService.checkRoleAllowed(role); return AjaxResult.error("修改角色'" + role.getRoleName() + "'失败,角色名称已存在");
return toAjax(roleService.authDataScope(role)); }
} else if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role)))
{
/** return AjaxResult.error("修改角色'" + role.getRoleName() + "'失败,角色权限已存在");
* 状态修改 }
*/ role.setUpdateBy(getUsername());
@PreAuthorize("@ss.hasPermi('system:role:edit')")
@Log(title = "角色管理", businessType = BusinessType.UPDATE) if (roleService.updateRole(role) > 0)
@PutMapping("/changeStatus") {
public AjaxResult changeStatus(@RequestBody SysRole role) // 更新缓存用户权限
{ LoginUser loginUser = getLoginUser();
roleService.checkRoleAllowed(role); if (StringUtils.isNotNull(loginUser.getUser()) && !loginUser.getUser().isAdmin())
role.setUpdateBy(SecurityUtils.getUsername()); {
return toAjax(roleService.updateRoleStatus(role)); loginUser.setPermissions(permissionService.getMenuPermission(loginUser.getUser()));
} loginUser.setUser(userService.selectUserByUserName(loginUser.getUser().getUserName()));
tokenService.setLoginUser(loginUser);
/** }
* 删除角色 return AjaxResult.success();
*/ }
@PreAuthorize("@ss.hasPermi('system:role:remove')") return AjaxResult.error("修改角色'" + role.getRoleName() + "'失败,请联系管理员");
@Log(title = "角色管理", businessType = BusinessType.DELETE) }
@DeleteMapping("/{roleIds}")
public AjaxResult remove(@PathVariable Long[] roleIds) /**
{ * 修改保存数据权限
return toAjax(roleService.deleteRoleByIds(roleIds)); */
} @PreAuthorize("@ss.hasPermi('system:role:edit')")
@Log(title = "角色管理", businessType = BusinessType.UPDATE)
/** @PutMapping("/dataScope")
* 获取角色选择框列表 public AjaxResult dataScope(@RequestBody SysRole role)
*/ {
@PreAuthorize("@ss.hasPermi('system:role:query')") roleService.checkRoleAllowed(role);
@GetMapping("/optionselect") roleService.checkRoleDataScope(role.getRoleId());
public AjaxResult optionselect() return toAjax(roleService.authDataScope(role));
{ }
return AjaxResult.success(roleService.selectRoleAll());
} /**
} * 状态修改
*/
@PreAuthorize("@ss.hasPermi('system:role:edit')")
@Log(title = "角色管理", businessType = BusinessType.UPDATE)
@PutMapping("/changeStatus")
public AjaxResult changeStatus(@RequestBody SysRole role)
{
roleService.checkRoleAllowed(role);
roleService.checkRoleDataScope(role.getRoleId());
role.setUpdateBy(getUsername());
return toAjax(roleService.updateRoleStatus(role));
}
/**
* 删除角色
*/
@PreAuthorize("@ss.hasPermi('system:role:remove')")
@Log(title = "角色管理", businessType = BusinessType.DELETE)
@DeleteMapping("/{roleIds}")
public AjaxResult remove(@PathVariable Long[] roleIds)
{
return toAjax(roleService.deleteRoleByIds(roleIds));
}
/**
* 获取角色选择框列表
*/
@PreAuthorize("@ss.hasPermi('system:role:query')")
@GetMapping("/optionselect")
public AjaxResult optionselect()
{
return AjaxResult.success(roleService.selectRoleAll());
}
/**
* 查询已分配用户角色列表
*/
@PreAuthorize("@ss.hasPermi('system:role:list')")
@GetMapping("/authUser/allocatedList")
public TableDataInfo allocatedList(SysUser user)
{
startPage();
List<SysUser> list = userService.selectAllocatedList(user);
return getDataTable(list);
}
/**
* 查询未分配用户角色列表
*/
@PreAuthorize("@ss.hasPermi('system:role:list')")
@GetMapping("/authUser/unallocatedList")
public TableDataInfo unallocatedList(SysUser user)
{
startPage();
List<SysUser> list = userService.selectUnallocatedList(user);
return getDataTable(list);
}
/**
* 取消授权用户
*/
@PreAuthorize("@ss.hasPermi('system:role:edit')")
@Log(title = "角色管理", businessType = BusinessType.GRANT)
@PutMapping("/authUser/cancel")
public AjaxResult cancelAuthUser(@RequestBody SysUserRole userRole)
{
return toAjax(roleService.deleteAuthUser(userRole));
}
/**
* 批量取消授权用户
*/
@PreAuthorize("@ss.hasPermi('system:role:edit')")
@Log(title = "角色管理", businessType = BusinessType.GRANT)
@PutMapping("/authUser/cancelAll")
public AjaxResult cancelAuthUserAll(Long roleId, Long[] userIds)
{
return toAjax(roleService.deleteAuthUsers(roleId, userIds));
}
/**
* 批量选择用户授权
*/
@PreAuthorize("@ss.hasPermi('system:role:edit')")
@Log(title = "角色管理", businessType = BusinessType.GRANT)
@PutMapping("/authUser/selectAll")
public AjaxResult selectAuthUserAll(Long roleId, Long[] userIds)
{
roleService.checkRoleDataScope(roleId);
return toAjax(roleService.insertAuthUsers(roleId, userIds));
}
}

View File

@ -1,201 +1,237 @@
package com.ruoyi.web.controller.system; package com.ruoyi.web.controller.system;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.springframework.beans.factory.annotation.Autowired; import javax.servlet.http.HttpServletResponse;
import org.springframework.security.access.prepost.PreAuthorize; import org.apache.commons.lang3.ArrayUtils;
import org.springframework.validation.annotation.Validated; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.bind.annotation.RequestMapping;
import com.ruoyi.common.annotation.Log; import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.constant.UserConstants; import org.springframework.web.multipart.MultipartFile;
import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.ServletUtils; import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.web.service.TokenService; import com.ruoyi.system.service.ISysPostService;
import com.ruoyi.system.service.ISysPostService; import com.ruoyi.system.service.ISysRoleService;
import com.ruoyi.system.service.ISysRoleService; import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.system.service.ISysUserService;
/**
/** * 用户信息
* 用户信息 *
* * @author ruoyi
* @author ruoyi */
*/ @RestController
@RestController @RequestMapping("/system/user")
@RequestMapping("/system/user") public class SysUserController extends BaseController
public class SysUserController extends BaseController {
{ @Autowired
@Autowired private ISysUserService userService;
private ISysUserService userService;
@Autowired
@Autowired private ISysRoleService roleService;
private ISysRoleService roleService;
@Autowired
@Autowired private ISysPostService postService;
private ISysPostService postService;
/**
@Autowired * 获取用户列表
private TokenService tokenService; */
@PreAuthorize("@ss.hasPermi('system:user:list')")
/** @GetMapping("/list")
* 获取用户列表 public TableDataInfo list(SysUser user)
*/ {
@PreAuthorize("@ss.hasPermi('system:user:list')") startPage();
@GetMapping("/list") List<SysUser> list = userService.selectUserList(user);
public TableDataInfo list(SysUser user) return getDataTable(list);
{ }
startPage();
List<SysUser> list = userService.selectUserList(user); @Log(title = "用户管理", businessType = BusinessType.EXPORT)
return getDataTable(list); @PreAuthorize("@ss.hasPermi('system:user:export')")
} @PostMapping("/export")
public void export(HttpServletResponse response, SysUser user)
@Log(title = "用户管理", businessType = BusinessType.EXPORT) {
@PreAuthorize("@ss.hasPermi('system:user:export')") List<SysUser> list = userService.selectUserList(user);
@GetMapping("/export") ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
public AjaxResult export(SysUser user) util.exportExcel(response, list, "用户数据");
{ }
List<SysUser> list = userService.selectUserList(user);
ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class); @Log(title = "用户管理", businessType = BusinessType.IMPORT)
return util.exportExcel(list, "用户数据"); @PreAuthorize("@ss.hasPermi('system:user:import')")
} @PostMapping("/importData")
public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
@Log(title = "用户管理", businessType = BusinessType.IMPORT) {
@PreAuthorize("@ss.hasPermi('system:user:import')") ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
@PostMapping("/importData") List<SysUser> userList = util.importExcel(file.getInputStream());
public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception String operName = getUsername();
{ String message = userService.importUser(userList, updateSupport, operName);
ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class); return AjaxResult.success(message);
List<SysUser> userList = util.importExcel(file.getInputStream()); }
LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
String operName = loginUser.getUsername(); @PostMapping("/importTemplate")
String message = userService.importUser(userList, updateSupport, operName); public void importTemplate(HttpServletResponse response)
return AjaxResult.success(message); {
} ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
util.importTemplateExcel(response, "用户数据");
@GetMapping("/importTemplate") }
public AjaxResult importTemplate()
{ /**
ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class); * 根据用户编号获取详细信息
return util.importTemplateExcel("用户数据"); */
} @PreAuthorize("@ss.hasPermi('system:user:query')")
@GetMapping(value = { "/", "/{userId}" })
/** public AjaxResult getInfo(@PathVariable(value = "userId", required = false) Long userId)
* 根据用户编号获取详细信息 {
*/ userService.checkUserDataScope(userId);
@PreAuthorize("@ss.hasPermi('system:user:query')") AjaxResult ajax = AjaxResult.success();
@GetMapping(value = { "/", "/{userId}" }) List<SysRole> roles = roleService.selectRoleAll();
public AjaxResult getInfo(@PathVariable(value = "userId", required = false) Long userId) ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
{ ajax.put("posts", postService.selectPostAll());
AjaxResult ajax = AjaxResult.success(); if (StringUtils.isNotNull(userId))
List<SysRole> roles = roleService.selectRoleAll(); {
ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList())); SysUser sysUser = userService.selectUserById(userId);
ajax.put("posts", postService.selectPostAll()); ajax.put(AjaxResult.DATA_TAG, sysUser);
if (StringUtils.isNotNull(userId)) ajax.put("postIds", postService.selectPostListByUserId(userId));
{ ajax.put("roleIds", sysUser.getRoles().stream().map(SysRole::getRoleId).collect(Collectors.toList()));
ajax.put(AjaxResult.DATA_TAG, userService.selectUserById(userId)); }
ajax.put("postIds", postService.selectPostListByUserId(userId)); return ajax;
ajax.put("roleIds", roleService.selectRoleListByUserId(userId)); }
}
return ajax; /**
} * 新增用户
*/
/** @PreAuthorize("@ss.hasPermi('system:user:add')")
* 新增用户 @Log(title = "用户管理", businessType = BusinessType.INSERT)
*/ @PostMapping
@PreAuthorize("@ss.hasPermi('system:user:add')") public AjaxResult add(@Validated @RequestBody SysUser user)
@Log(title = "用户管理", businessType = BusinessType.INSERT) {
@PostMapping if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(user.getUserName())))
public AjaxResult add(@Validated @RequestBody SysUser user) {
{ return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,登录账号已存在");
if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(user.getUserName()))) }
{ else if (StringUtils.isNotEmpty(user.getPhonenumber())
return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,登录账号已存在"); && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user)))
} {
else if (UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,手机号码已存在");
{ }
return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,手机号码已存在"); else if (StringUtils.isNotEmpty(user.getEmail())
} && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user)))
else if (UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) {
{ return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在");
return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在"); }
} user.setCreateBy(getUsername());
user.setCreateBy(SecurityUtils.getUsername()); user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
user.setPassword(SecurityUtils.encryptPassword(user.getPassword())); return toAjax(userService.insertUser(user));
return toAjax(userService.insertUser(user)); }
}
/**
/** * 修改用户
* 修改用户 */
*/ @PreAuthorize("@ss.hasPermi('system:user:edit')")
@PreAuthorize("@ss.hasPermi('system:user:edit')") @Log(title = "用户管理", businessType = BusinessType.UPDATE)
@Log(title = "用户管理", businessType = BusinessType.UPDATE) @PutMapping
@PutMapping public AjaxResult edit(@Validated @RequestBody SysUser user)
public AjaxResult edit(@Validated @RequestBody SysUser user) {
{ userService.checkUserAllowed(user);
userService.checkUserAllowed(user); userService.checkUserDataScope(user.getUserId());
if (UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) if (StringUtils.isNotEmpty(user.getPhonenumber())
{ && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user)))
return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,手机号码已存在"); {
} return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,手机号码已存在");
else if (UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) }
{ else if (StringUtils.isNotEmpty(user.getEmail())
return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在"); && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user)))
} {
user.setUpdateBy(SecurityUtils.getUsername()); return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在");
return toAjax(userService.updateUser(user)); }
} user.setUpdateBy(getUsername());
return toAjax(userService.updateUser(user));
/** }
* 删除用户
*/ /**
@PreAuthorize("@ss.hasPermi('system:user:remove')") * 删除用户
@Log(title = "用户管理", businessType = BusinessType.DELETE) */
@DeleteMapping("/{userIds}") @PreAuthorize("@ss.hasPermi('system:user:remove')")
public AjaxResult remove(@PathVariable Long[] userIds) @Log(title = "用户管理", businessType = BusinessType.DELETE)
{ @DeleteMapping("/{userIds}")
return toAjax(userService.deleteUserByIds(userIds)); public AjaxResult remove(@PathVariable Long[] userIds)
} {
if (ArrayUtils.contains(userIds, getUserId()))
/** {
* 重置密码 return error("当前用户不能删除");
*/ }
@PreAuthorize("@ss.hasPermi('system:user:edit')") return toAjax(userService.deleteUserByIds(userIds));
@Log(title = "用户管理", businessType = BusinessType.UPDATE) }
@PutMapping("/resetPwd")
public AjaxResult resetPwd(@RequestBody SysUser user) /**
{ * 重置密码
userService.checkUserAllowed(user); */
user.setPassword(SecurityUtils.encryptPassword(user.getPassword())); @PreAuthorize("@ss.hasPermi('system:user:resetPwd')")
user.setUpdateBy(SecurityUtils.getUsername()); @Log(title = "用户管理", businessType = BusinessType.UPDATE)
return toAjax(userService.resetPwd(user)); @PutMapping("/resetPwd")
} public AjaxResult resetPwd(@RequestBody SysUser user)
{
/** userService.checkUserAllowed(user);
* 状态修改 userService.checkUserDataScope(user.getUserId());
*/ user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
@PreAuthorize("@ss.hasPermi('system:user:edit')") user.setUpdateBy(getUsername());
@Log(title = "用户管理", businessType = BusinessType.UPDATE) return toAjax(userService.resetPwd(user));
@PutMapping("/changeStatus") }
public AjaxResult changeStatus(@RequestBody SysUser user)
{ /**
userService.checkUserAllowed(user); * 状态修改
user.setUpdateBy(SecurityUtils.getUsername()); */
return toAjax(userService.updateUserStatus(user)); @PreAuthorize("@ss.hasPermi('system:user:edit')")
} @Log(title = "用户管理", businessType = BusinessType.UPDATE)
} @PutMapping("/changeStatus")
public AjaxResult changeStatus(@RequestBody SysUser user)
{
userService.checkUserAllowed(user);
userService.checkUserDataScope(user.getUserId());
user.setUpdateBy(getUsername());
return toAjax(userService.updateUserStatus(user));
}
/**
* 根据用户编号获取授权角色
*/
@PreAuthorize("@ss.hasPermi('system:user:query')")
@GetMapping("/authRole/{userId}")
public AjaxResult authRole(@PathVariable("userId") Long userId)
{
AjaxResult ajax = AjaxResult.success();
SysUser user = userService.selectUserById(userId);
List<SysRole> roles = roleService.selectRolesByUserId(userId);
ajax.put("user", user);
ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
return ajax;
}
/**
* 用户授权角色
*/
@PreAuthorize("@ss.hasPermi('system:user:edit')")
@Log(title = "用户管理", businessType = BusinessType.GRANT)
@PutMapping("/authRole")
public AjaxResult insertAuthRole(Long userId, Long[] roleIds)
{
userService.checkUserDataScope(userId);
userService.insertUserAuth(userId, roleIds);
return success();
}
}

View File

@ -1,24 +1,24 @@
package com.ruoyi.web.controller.tool; package com.ruoyi.web.controller.tool;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.controller.BaseController;
/** /**
* swagger 接口 * swagger 接口
* *
* @author ruoyi * @author ruoyi
*/ */
@Controller @Controller
@RequestMapping("/tool/swagger") @RequestMapping("/tool/swagger")
public class SwaggerController extends BaseController public class SwaggerController extends BaseController
{ {
@PreAuthorize("@ss.hasPermi('tool:swagger:view')") @PreAuthorize("@ss.hasPermi('tool:swagger:view')")
@GetMapping() @GetMapping()
public String index() public String index()
{ {
return redirect("/swagger-ui.html"); return redirect("/swagger-ui.html");
} }
} }

View File

@ -1,175 +1,181 @@
package com.ruoyi.web.controller.tool; package com.ruoyi.web.controller.tool;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RequestMapping;
import com.ruoyi.common.core.controller.BaseController; import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.core.domain.AjaxResult;
import io.swagger.annotations.Api; import com.ruoyi.common.utils.StringUtils;
import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
/** import io.swagger.annotations.ApiOperation;
* swagger 用户测试方法
* /**
* @author ruoyi * swagger 用户测试方法
*/ *
@Api("用户信息管理") * @author ruoyi
@RestController */
@RequestMapping("/test/user") @Api("用户信息管理")
public class TestController extends BaseController @RestController
{ @RequestMapping("/test/user")
private final static Map<Integer, UserEntity> users = new LinkedHashMap<Integer, UserEntity>(); public class TestController extends BaseController
{ {
users.put(1, new UserEntity(1, "admin", "admin123", "15888888888")); private final static Map<Integer, UserEntity> users = new LinkedHashMap<Integer, UserEntity>();
users.put(2, new UserEntity(2, "ry", "admin123", "15666666666")); {
} users.put(1, new UserEntity(1, "admin", "admin123", "15888888888"));
users.put(2, new UserEntity(2, "ry", "admin123", "15666666666"));
@ApiOperation("获取用户列表") }
@GetMapping("/list")
public AjaxResult userList() @ApiOperation("获取用户列表")
{ @GetMapping("/list")
List<UserEntity> userList = new ArrayList<UserEntity>(users.values()); public AjaxResult userList()
return AjaxResult.success(userList); {
} List<UserEntity> userList = new ArrayList<UserEntity>(users.values());
return AjaxResult.success(userList);
@ApiOperation("获取用户详细") }
@ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path")
@GetMapping("/{userId}") @ApiOperation("获取用户详细")
public AjaxResult getUser(@PathVariable Integer userId) @ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path", dataTypeClass = Integer.class)
{ @GetMapping("/{userId}")
if (!users.isEmpty() && users.containsKey(userId)) public AjaxResult getUser(@PathVariable Integer userId)
{ {
return AjaxResult.success(users.get(userId)); if (!users.isEmpty() && users.containsKey(userId))
} {
else return AjaxResult.success(users.get(userId));
{ }
return AjaxResult.error("用户不存在"); else
} {
} return error("用户不存在");
}
@ApiOperation("新增用户") }
@ApiImplicitParam(name = "userEntity", value = "新增用户信息", dataType = "UserEntity")
@PostMapping("/save") @ApiOperation("新增用户")
public AjaxResult save(UserEntity user) @ApiImplicitParams({
{ @ApiImplicitParam(name = "userId", value = "用户id", dataType = "Integer", dataTypeClass = Integer.class),
if (StringUtils.isNull(user) || StringUtils.isNull(user.getUserId())) @ApiImplicitParam(name = "username", value = "用户名称", dataType = "String", dataTypeClass = String.class),
{ @ApiImplicitParam(name = "password", value = "用户密码", dataType = "String", dataTypeClass = String.class),
return AjaxResult.error("用户ID不能为空"); @ApiImplicitParam(name = "mobile", value = "用户手机", dataType = "String", dataTypeClass = String.class)
} })
return AjaxResult.success(users.put(user.getUserId(), user)); @PostMapping("/save")
} public AjaxResult save(UserEntity user)
{
@ApiOperation("更新用户") if (StringUtils.isNull(user) || StringUtils.isNull(user.getUserId()))
@ApiImplicitParam(name = "userEntity", value = "新增用户信息", dataType = "UserEntity") {
@PutMapping("/update") return error("用户ID不能为空");
public AjaxResult update(UserEntity user) }
{ return AjaxResult.success(users.put(user.getUserId(), user));
if (StringUtils.isNull(user) || StringUtils.isNull(user.getUserId())) }
{
return AjaxResult.error("用户ID不能为空"); @ApiOperation("更新用户")
} @PutMapping("/update")
if (users.isEmpty() || !users.containsKey(user.getUserId())) public AjaxResult update(@RequestBody UserEntity user)
{ {
return AjaxResult.error("用户不存在"); if (StringUtils.isNull(user) || StringUtils.isNull(user.getUserId()))
} {
users.remove(user.getUserId()); return error("用户ID不能为空");
return AjaxResult.success(users.put(user.getUserId(), user)); }
} if (users.isEmpty() || !users.containsKey(user.getUserId()))
{
@ApiOperation("删除用户信息") return error("用户不存在");
@ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path") }
@DeleteMapping("/{userId}") users.remove(user.getUserId());
public AjaxResult delete(@PathVariable Integer userId) return AjaxResult.success(users.put(user.getUserId(), user));
{ }
if (!users.isEmpty() && users.containsKey(userId))
{ @ApiOperation("删除用户信息")
users.remove(userId); @ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path", dataTypeClass = Integer.class)
return AjaxResult.success(); @DeleteMapping("/{userId}")
} public AjaxResult delete(@PathVariable Integer userId)
else {
{ if (!users.isEmpty() && users.containsKey(userId))
return AjaxResult.error("用户不存在"); {
} users.remove(userId);
} return success();
} }
else
@ApiModel("用户实体") {
class UserEntity return error("用户不存在");
{ }
@ApiModelProperty("用户ID") }
private Integer userId; }
@ApiModelProperty("用户名称") @ApiModel(value = "UserEntity", description = "用户实体")
private String username; class UserEntity
{
@ApiModelProperty("用户密码") @ApiModelProperty("用户ID")
private String password; private Integer userId;
@ApiModelProperty("用户手机") @ApiModelProperty("用户名称")
private String mobile; private String username;
public UserEntity() @ApiModelProperty("用户密码")
{ private String password;
} @ApiModelProperty("用户手机")
private String mobile;
public UserEntity(Integer userId, String username, String password, String mobile)
{ public UserEntity()
this.userId = userId; {
this.username = username;
this.password = password; }
this.mobile = mobile;
} public UserEntity(Integer userId, String username, String password, String mobile)
{
public Integer getUserId() this.userId = userId;
{ this.username = username;
return userId; this.password = password;
} this.mobile = mobile;
}
public void setUserId(Integer userId)
{ public Integer getUserId()
this.userId = userId; {
} return userId;
}
public String getUsername()
{ public void setUserId(Integer userId)
return username; {
} this.userId = userId;
}
public void setUsername(String username)
{ public String getUsername()
this.username = username; {
} return username;
}
public String getPassword()
{ public void setUsername(String username)
return password; {
} this.username = username;
}
public void setPassword(String password)
{ public String getPassword()
this.password = password; {
} return password;
}
public String getMobile()
{ public void setPassword(String password)
return mobile; {
} this.password = password;
}
public void setMobile(String mobile)
{ public String getMobile()
this.mobile = mobile; {
} return mobile;
} }
public void setMobile(String mobile)
{
this.mobile = mobile;
}
}

View File

@ -0,0 +1,172 @@
package com.ruoyi.web.controller.yada;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.file.FileUploadUtils;
import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.system.domain_yada.*;
import com.ruoyi.system.service_yada.IAorestCoverageService;
import com.ruoyi.system.service_yada.IAustraliaMiddleEastService;
import com.ruoyi.system.service_yada.ThematicMapService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.crypto.Data;
import java.io.InputStream;
import java.security.Guard;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.List;
/**
* 森林覆盖率
*/
@RestController
@RequestMapping(value = "/business-service/api/Aorest", produces = "application/json;charset=UTF-8")
@Api(tags = "森林覆盖率")
public class AorestCoverageController {
@Resource
private IAorestCoverageService service;
@Resource
private ThematicMapService thematicMapService;
/**
* 查询方法
* 需要查询的字段参数
* @return 参数类
*/
@RequestMapping(value = "/selectAorestCoverage",method = {RequestMethod.GET})
@ApiOperation(value = "查询方法",httpMethod = "GET")
public AjaxResult selectAorestCoverage()
{
List<AorestCoverageVO> eastVOSList= service.selectAorestCoverage();
return AjaxResult.success(eastVOSList);
}
/**
* 删除方法
* @param ID id
* @return 状态码
*/
@RequestMapping(value = "/DelAorestCoverage",method = {RequestMethod.DELETE})
@ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path", dataTypeClass = Integer.class)
@ApiOperation(value = "删除方法",httpMethod = "DELETE")
public AjaxResult DelAorestCoverage(@Param("ID") String ID)
{
int NUM = service.DelAorestCoverage(ID);
if (NUM>0)
{
return AjaxResult.success();
}
return AjaxResult.error();
}
/**
* 新增方法
* @param eastVOS 新增实体类
* @return 状态码
*/
@RequestMapping(value = "/IntoAorestCoverage",method = {RequestMethod.POST})
@ApiOperation(value = "新增方法",httpMethod = "POST")
public AjaxResult IntoAorestCoverage(@RequestBody AorestCoverageVO eastVOS)
{
try {
eastVOS.setCreateTime(LocalDateTime.now());
int NUM = service.IntoAorestCoverage(eastVOS);
if (NUM>0)
{
return AjaxResult.success();
}
return AjaxResult.error();
}
catch (Exception E){
E.getMessage();
return AjaxResult.error();
}
}
/**
* 上传文件
* @return 状态码
*/
@RequestMapping(value = "/IntoUpLoad",method = {RequestMethod.POST})
@ApiOperation(value = "上传文件",httpMethod = "POST")
public AjaxResult IntoUpload(@RequestBody MultipartFile file)
{
UploadFile upload=new UploadFile();
ThematicMapDomain domain=new ThematicMapDomain();
UploadFile value= null;
try {
value = uploadFile(file,upload);
} catch (Exception e) {
e.printStackTrace();
}
int NUM = service.IntoUpload(value);
domain.setPictureCode(value.getFileId());
if (NUM>0)
{
return AjaxResult.success();
}
return AjaxResult.error();
}
/**
* 文件查询
* @param response
* @param request 客户端请求
* @return
*/
@RequestMapping(value = "/selectUpload",method = {RequestMethod.GET})
@ApiOperation(value = "文件查询",httpMethod = "GET")
public AjaxResult selectUpload(HttpServletResponse response, HttpServletRequest request,@RequestBody UploadFile upload)
{
List<UploadFile> eastVOSList= service.selectUpload(upload.getFileId(),upload.getFileName());
return AjaxResult.success(eastVOSList);
}
public UploadFile uploadFile(MultipartFile file,UploadFile upload) throws Exception
{
// 上传文件路径
String filePath = RuoYiConfig.getUploadPath();
// 上传并返回新文件名称
String fileName = FileUploadUtils.upload(filePath, file);
upload.setFileId(String.valueOf(System.currentTimeMillis()));
upload.setFileName(file.getOriginalFilename());
upload.setFilePath(fileName);
upload.setFileSize(String.valueOf(file.getSize()));
upload.setCreateTime(LocalDateTime.now());
return upload;
}
@RequestMapping(value = "/Dictionary")
@ApiOperation(value = "字典查询",httpMethod = "POST")
public AjaxResult Dictionary(@RequestBody Dictionary dic)
{
List<Dictionary> diclist=service.selectDic(dic.getCodingType(),dic.getCodingType1(), dic.getCodingType2());
return AjaxResult.success(diclist);
}
}

View File

@ -0,0 +1,81 @@
package com.ruoyi.web.controller.yada;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.system.service_yada.IAustraliaMiddleEastService;
import com.ruoyi.system.domain_yada.AustraliaMiddleEastVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDateTime;
import java.util.List;
/**
* 澳大利亚中东部地区
*/
@RestController
@RequestMapping(value = "/business-service/api/Australia", produces = "application/json;charset=UTF-8")
@Api(tags = "澳大利亚中东部地区")
public class AustraliaMiddleEastController
{
@Resource
private IAustraliaMiddleEastService australiaMiddleEastService;
/**
* 查询方法
* @return 实体类
*/
@ApiOperation(value = "查询方法",httpMethod = "GET")
@RequestMapping(value = "/SelectAustralia",method = {RequestMethod.GET})
public AjaxResult SelectAustralia(@RequestBody AustraliaMiddleEastVO eastVO )
{
List<AustraliaMiddleEastVO> eastVOSList= australiaMiddleEastService.selectAustralia(eastVO.getYearMonth(),eastVO.getMonth());
return AjaxResult.success(eastVOSList);
}
/**
* 删除方法
* @param ID id
* @return 状态码
*/
@RequestMapping(value = "/DelAustralia",method = {RequestMethod.DELETE})
@ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path", dataTypeClass = Integer.class)
@ApiOperation(value = "删除方法",httpMethod = "DELETE")
public AjaxResult DelAustralia(@Param("ID") String ID)
{
int NUM = australiaMiddleEastService.DelAustralia(ID);
if (NUM>0)
{
return AjaxResult.success();
}
return AjaxResult.error();
}
/**
* 新增方法
* @param eastVOS 新增实体类
* @return 状态码
*/
@RequestMapping(value = "/IntoAustralia",method = {RequestMethod.POST})
@ApiOperation(value = "新增方法",httpMethod = "POST")
public AjaxResult IntoAustralia(@RequestBody AustraliaMiddleEastVO eastVOS)
{
eastVOS.setCreateTime(LocalDateTime.now());
int NUM = australiaMiddleEastService.IntoAustralia(eastVOS);
if (NUM>0)
{
return AjaxResult.success();
}
return AjaxResult.error();
}
}

View File

@ -0,0 +1,85 @@
package com.ruoyi.web.controller.yada;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.system.domain_yada.AustraliaMiddleEastVO;
import com.ruoyi.system.domain_yada.GlobalTypeVO;
import com.ruoyi.system.service_yada.IAustraliaMiddleEastService;
import com.ruoyi.system.service_yada.IGlobalTypeService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDateTime;
import java.util.List;
/**
*全球各类型占比
*/
@RestController
@RequestMapping("/monitor/clobal")
@Api(tags = "全球各类型占比")
public class GlobalTypeController {
@Resource
private IGlobalTypeService typeService;
/**
* 查询方法
* @param response 响应头
* @param request 客户端请求
* @return 参数类
*/
@RequestMapping(value = "/selectGlobalType",method = {RequestMethod.POST})
@ApiOperation(value = "查询方法",httpMethod = "POST")
public AjaxResult selectGlobalType(HttpServletResponse response, HttpServletRequest request,@RequestBody GlobalTypeVO TypeVO)
{
List<GlobalTypeVO> eastVOSList= typeService.selectGlobalType(TypeVO.getTypeName(),TypeVO.getParticularYear());
return AjaxResult.success(eastVOSList);
}
/**
* 删除方法
* @param ID id
* @return 状态码
*/
@RequestMapping(value = "/DelGlobalType",method = {RequestMethod.DELETE})
@ApiOperation(value = "删除方法",httpMethod = "DELETE")
@ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path", dataTypeClass = Integer.class)
public AjaxResult DelGlobalType(@Param("ID") String ID)
{
int NUM = typeService.DelGlobalType(ID);
if (NUM>0)
{
return AjaxResult.success();
}
return AjaxResult.error();
}
/**
* 新增方法
* @param eastVOS 新增实体类
* @return 状态码
*/
@ApiOperation(value = "新增方法",httpMethod = "POST")
@RequestMapping(value = "/IntoGlobalType",method = {RequestMethod.POST})
public AjaxResult IntoGlobalType(@RequestBody GlobalTypeVO eastVOS)
{
eastVOS.setCreateTime(LocalDateTime.now());
int NUM = typeService.IntoGlobalType(eastVOS);
if (NUM>0)
{
return AjaxResult.success();
}
return AjaxResult.error();
}
}

View File

@ -0,0 +1,83 @@
package com.ruoyi.web.controller.yada;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.system.domain_yada.AustraliaMiddleEastVO;
import com.ruoyi.system.domain_yada.OceanTemperatureVO;
import com.ruoyi.system.service_yada.IAustraliaMiddleEastService;
import com.ruoyi.system.service_yada.IOceanTemperatureService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDateTime;
import java.util.List;
/**
* 海洋表面温度监测
*/
@Api(tags = "海洋表面温度监测")
@RestController
@RequestMapping(value = "/business-service/api/Ocean", produces = "application/json;charset=UTF-8")
public class OceanTemperatureController {
@Resource
private IOceanTemperatureService temperatureService;
/**
* 查询方法
* @return 参数类
*/
@RequestMapping(value = "/selectOcean",method = {RequestMethod.GET})
@ApiOperation(value = "查询方法",httpMethod = "GET")
public AjaxResult selectOcean(@RequestBody OceanTemperatureVO temperatureVO)
{
List<OceanTemperatureVO> eastVOSList= temperatureService.selectOcean(temperatureVO.getStartDate());
return AjaxResult.success(eastVOSList);
}
/**
* 删除方法
* @param ID id
* @return 状态码
*/
@RequestMapping(value = "/DelOcean",method = {RequestMethod.DELETE})
@ApiOperation(value = "删除方法",httpMethod = "DELETE")
@ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path", dataTypeClass = Integer.class)
public AjaxResult DelOcean(@Param("ID") String ID)
{
int NUM = temperatureService.DelOcean(ID);
if (NUM>0)
{
return AjaxResult.success();
}
return AjaxResult.error();
}
/**
* 新增方法
* @param eastVOS 新增实体类
* @return 状态码
*/
@ApiOperation(value = "新增方法",httpMethod = "POST")
@RequestMapping(value = "/IntoAustralia",method = {RequestMethod.POST})
public AjaxResult IntoOcean(@RequestBody OceanTemperatureVO eastVOS)
{
eastVOS.setCreateTime(LocalDateTime.now());
int NUM = temperatureService.IntoOcean(eastVOS);
if (NUM>0)
{
return AjaxResult.success();
}
return AjaxResult.error();
}
}

View File

@ -0,0 +1,81 @@
package com.ruoyi.web.controller.yada;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.system.service_yada.IRegionVGIService;
import com.ruoyi.system.domain_yada.RegionVGIVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDateTime;
import java.util.List;
/**
* 各区域VGI
*/
@Api(tags = "各区域VGI")
@RestController
@RequestMapping(value = "/business-service/api/orderMng", produces = "application/json;charset=UTF-8")
public class RegionVGIController
{
@Resource
private IRegionVGIService regionVGIService;
/**
* 查询方法
* @return 参数类
*/
@RequestMapping(value = "/SelectRegion",method = {RequestMethod.GET})
@ApiOperation(value = "查询方法",httpMethod = "GET")
public AjaxResult SelectRegion()
{
List<RegionVGIVO> vgivost= regionVGIService.selectRegion();
return AjaxResult.success(vgivost);
}
/**
* 删除方法
* @param ID id
* @return 状态码
*/
@RequestMapping(value = "/DelRegion",method = {RequestMethod.DELETE})
@ApiOperation(value = "删除方法",httpMethod = "DELETE")
@ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path", dataTypeClass = Integer.class)
public AjaxResult DelRegion(@Param("ID") String ID)
{
int NUM = regionVGIService.DelRegion(ID);
if (NUM>0)
{
return AjaxResult.success();
}
return AjaxResult.error();
}
/**
* 新增方法
* @param vgivo 新增实体类
* @return 状态码
*/
@ApiOperation(value = "新增方法",httpMethod = "POST")
@RequestMapping(value = "/IntoRegion",method = {RequestMethod.POST})
public AjaxResult IntoRegion(@RequestBody RegionVGIVO vgivo)
{
vgivo.setCreatedTime(LocalDateTime.now());
int NUM = regionVGIService.IntoRegion(vgivo);
if (NUM>0)
{
return AjaxResult.success();
}
return AjaxResult.error();
}
}

View File

@ -0,0 +1,76 @@
package com.ruoyi.web.controller.yada;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.system.domain_yada.AustraliaMiddleEastVO;
import com.ruoyi.system.domain_yada.RegionVGIVO;
import com.ruoyi.system.domain_yada.RegionalSystemVO;
import com.ruoyi.system.service_yada.IAustraliaMiddleEastService;
import com.ruoyi.system.service_yada.IRegionalSystemService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List;
/**
* 区域生态系统
*/
@Api(tags = "区域生态系统")
@RestController
@RequestMapping(value = "/business-service/api/Regional", produces = "application/json;charset=UTF-8")
public class RegionalSystemController {
@Resource
private IRegionalSystemService systemService;
/**
* 查询方法
* @return 参数类
*/
@RequestMapping(value = "/selectRegional",method = {RequestMethod.GET})
@ApiOperation(value = "查询方法",httpMethod = "GET")
public AjaxResult selectRegional(@RequestParam("region") String region)
{
List<RegionalSystemVO> eastVOSList= systemService.selectRegional(region);
return AjaxResult.success(eastVOSList);
}
/**
* 删除方法
* @param ID id
* @return 状态码
*/
@RequestMapping(value = "/DelRegional",method = {RequestMethod.DELETE})
@ApiOperation(value = "删除方法",httpMethod = "DELETE")
@ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path", dataTypeClass = Integer.class)
public AjaxResult DelRegional(@RequestParam("ID") String ID)
{
int NUM = systemService.DelRegional(ID);
if (NUM>0)
{
return AjaxResult.success();
}
return AjaxResult.error();
}
/**
* 新增方法
* @param eastVOS 新增实体类
* @return 状态码
*/
@ApiOperation(value = "新增方法",httpMethod = "POST")
@RequestMapping(value = "/IntoRegional",method = {RequestMethod.POST})
public AjaxResult IntoRegional(@RequestBody RegionalSystemVO eastVOS)
{
eastVOS.setCreateTime(LocalDateTime.now());
int NUM = systemService.IntoRegional(eastVOS);
if (NUM>0)
{
return AjaxResult.success();
}
return AjaxResult.error();
}
}

View File

@ -0,0 +1,330 @@
package com.ruoyi.web.controller.yada;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.file.WeatherUtils;
import com.ruoyi.system.domain_yada.*;
import com.ruoyi.system.service_yada.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import jdk.jfr.Frequency;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import springfox.documentation.spring.web.json.Json;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.net.http.HttpRequest;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping(value = "/Special")
@Api(tags = "模板导入")
public class SpecialController {
@Resource
private IRegionVGIService regionVGIService;
@Resource
private IAustraliaMiddleEastService australiaMiddleEastService;
@Resource
private IAorestCoverageService service;
@Resource
private IVegetationCoverageService coverageService;
@Resource
private IRegionalSystemService systemService;
/**
*/
@RequestMapping(value = "/helpSaveExcel")
private AjaxResult helpSaveExcel(@RequestBody MultipartFile file) {
List<RegionVGIVO> value = saveExcel(file);
return IntoRegion(value);
}
@RequestMapping(value = "/helpWeatherClass",method = {RequestMethod.GET})
public AjaxResult helpWeatherClass(String city,String type)
{
String url="https://restapi.amap.com/v3/weather/weatherInfo";
Map<String,String> map=new HashMap<>();
map.put("key","37087f0a3007dc67d37859553cd02d33");
map.put("city",city);
if (type!=null){ map.put("extensions",type);}
map.put("output","json");
String value= WeatherUtils.httpRequest(url,map);
WeatherUtilsVO vo = JSON.parseObject(value,WeatherUtilsVO.class);
// String value2=vo.getForecasts().substring(1,vo.getForecasts().length()-1);
// System.out.println(value2);
// vo.setForecast(JSON.parseObject(value2,ForecastVo.class));
// JSONObject userJson=JSONObject.parseObject(value);
// WeatherUtilsVO utilsValue= JSON.toJavaObject(userJson,WeatherUtilsVO.class);
return AjaxResult.success(vo);
} /**
* 森林覆盖率模板导入
*/
@RequestMapping(value = "/helpExcelAorest")
private AjaxResult helpExcelAorest(@RequestBody MultipartFile file) {
List<AorestCoverageVO> value = saveExcelAorest(file);
return IntoAorestCoverage(value);
}
/**
*平均植被覆盖度和净初级生产力
*/
@RequestMapping(value = "/helpExcelnpp")
private AjaxResult helpExcelnpp(@RequestBody MultipartFile file) {
List<VegetationCoverageVO> value = saveExcelnpp(file);
return IntoVegetation(value);
}
/**
* 澳大利亚中部地区模板导入
*/
@RequestMapping(value = "/helpExcelAus")
private AjaxResult helpExcelAus(@RequestBody MultipartFile file) {
List<AustraliaMiddleEastVO> value = saveExcelAus(file);
return IntoAustralia(value);
}
/**
* 区域生态系统类型转移
*/
@RequestMapping(value = "/helpExcelRegion")
private AjaxResult helpExcelRegion(@RequestBody MultipartFile file) {
List<RegionalSystemVO> value = saveExcelRegion(file);
return IntoRegional(value);
}
public AjaxResult IntoRegional(List<RegionalSystemVO> eastVOS)
{
try {
for (int i = 0; i < eastVOS.size(); i++) {
eastVOS.get(i).setCreateTime(LocalDateTime.now());
systemService.IntoRegional(eastVOS.get(i));
}
return AjaxResult.success();
}
catch (Exception E){
E.getMessage();
return AjaxResult.error(E.getMessage());
}
}
public AjaxResult IntoAustralia(List<AustraliaMiddleEastVO> eastVOS) {
for (int i = 0; i < eastVOS.size(); i++) {
eastVOS.get(i).setCreateTime(LocalDateTime.now());
australiaMiddleEastService.IntoAustralia(eastVOS.get(i));
}
return AjaxResult.success();
}
public AjaxResult IntoRegion(List<RegionVGIVO> vgivo) {
for (int i = 0; i < vgivo.size(); i++) {
vgivo.get(i).setCreatedTime(LocalDateTime.now());
regionVGIService.IntoRegion(vgivo.get(i));
}
return AjaxResult.success();
}
public AjaxResult IntoAorestCoverage(List<AorestCoverageVO> eastVOS)
{
try {
for (int i = 0; i < eastVOS.size(); i++) {
eastVOS.get(i).setCreateTime(LocalDateTime.now());
service.IntoAorestCoverage(eastVOS.get(i));
}
return AjaxResult.success();
}
catch (Exception E){
E.getMessage();
return AjaxResult.error(E.getMessage());
}
}
public AjaxResult IntoVegetation(List<VegetationCoverageVO> eastVOS)
{
try {
for (int i = 0; i < eastVOS.size(); i++) {
eastVOS.get(i).setCreateTime(LocalDateTime.now());
coverageService.IntoVegetation(eastVOS.get(i));
}
return AjaxResult.success();
}
catch (Exception E){
E.getMessage();
return AjaxResult.error(E.getMessage());
}
}
private List<RegionVGIVO> saveExcel(MultipartFile file) {
try {
List<RegionVGIVO> Value = new ArrayList<>();
InputStream inputStream = file.getInputStream();
Workbook book;
Sheet sheet;
book = new XSSFWorkbook(inputStream);
sheet = book.getSheetAt(0);
for (int i = 1; i < sheet.getLastRowNum() + 1; i++) {
RegionVGIVO value = new RegionVGIVO();
Row row = sheet.getRow(i);
value.setCreatedTime(LocalDateTime.now());
value.setRegion(row.getCell(0).toString());
value.setRegionEn(row.getCell(1).toString());
value.setForest(Double.parseDouble(row.getCell(2).toString()));
value.setGrassland(Double.parseDouble(row.getCell(3).toString()));
value.setParticularYear(row.getCell(4).toString());
Value.add(value);
}
return Value;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
private List<AustraliaMiddleEastVO> saveExcelAus(MultipartFile file) {
try {
List<AustraliaMiddleEastVO> Value = new ArrayList<>();
InputStream inputStream = file.getInputStream();
Workbook book;
Sheet sheet;
book = new XSSFWorkbook(inputStream);
sheet = book.getSheetAt(0);
for (int i = 1; i < sheet.getLastRowNum() + 1; i++) {
AustraliaMiddleEastVO value = new AustraliaMiddleEastVO();
Row row = sheet.getRow(i);
value.setYearMonth(row.getCell(0).toString());
value.setMonth(row.getCell(1).toString());
value.setSstAnomalyIndex(Double.parseDouble(row.getCell(2).toString()));
value.setTemperatureAnomolies(Double.parseDouble(row.getCell(3).toString()));
value.setPrecipitationAnomolies(Double.parseDouble(row.getCell(4).toString()));
value.setVaiAnomolies(Double.parseDouble(row.getCell(5).toString()));
Value.add(value);
}
return Value;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
private List<AorestCoverageVO> saveExcelAorest(MultipartFile file) {
try {
List<AorestCoverageVO> Value = new ArrayList<>();
InputStream inputStream = file.getInputStream();
Workbook book;
Sheet sheet;
book = new XSSFWorkbook(inputStream);
sheet = book.getSheetAt(0);
for (int i = 1; i < sheet.getLastRowNum() + 1; i++) {
AorestCoverageVO value = new AorestCoverageVO();
Row row = sheet.getRow(i);
value.setRegion(row.getCell(0).toString());
value.setRegionEn(row.getCell(1).toString());
value.setProtectedLands(Double.parseDouble(row.getCell(2).toString()));
value.setNonProtectedLands(Double.parseDouble(row.getCell(3).toString()));
value.setMountain(Double.parseDouble(row.getCell(4).toString()));
value.setNonMountain(Double.parseDouble(row.getCell(5).toString()));
value.setCreateTime(LocalDateTime.now());
Value.add(value);
}
return Value;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
private List<VegetationCoverageVO> saveExcelnpp(MultipartFile file) {
try {
List<VegetationCoverageVO> Value = new ArrayList<>();
InputStream inputStream = file.getInputStream();
Workbook book;
Sheet sheet;
book = new XSSFWorkbook(inputStream);
sheet = book.getSheetAt(0);
for (int i = 1; i < sheet.getLastRowNum() + 1; i++) {
VegetationCoverageVO value = new VegetationCoverageVO();
Row row = sheet.getRow(i);
value.setRegion(row.getCell(0).toString());
value.setRegionEn(row.getCell(1).toString());
value.setProtectedLands(Double.parseDouble(row.getCell(4).toString()));
value.setNonProtectedLands(Double.parseDouble(row.getCell(5).toString()));
value.setMountain(Double.parseDouble(row.getCell(2).toString()));
value.setNonMountain(Double.parseDouble(row.getCell(3).toString()));
value.setCreateTime(LocalDateTime.now());
Value.add(value);
}
return Value;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
private List<RegionalSystemVO> saveExcelRegion(MultipartFile file) {
try {
List<RegionalSystemVO> Value = new ArrayList<>();
InputStream inputStream = file.getInputStream();
Workbook book;
Sheet sheet;
book = new XSSFWorkbook(inputStream);
sheet = book.getSheetAt(0);
for (int i = 1; i < sheet.getLastRowNum() + 1; i++) {
RegionalSystemVO value = new RegionalSystemVO();
Row row = sheet.getRow(i);
value.setRegion(row.getCell(0).toString());
value.setRegionEn(row.getCell(1).toString());
value.setTypeConversion(row.getCell(2).toString());
value.setTypeconversionEn(row.getCell(3).toString());
value.setProportionOfChangedAreas(Double.parseDouble(row.getCell(4).toString()));
value.setCreateTime(LocalDateTime.now());
Value.add(value);
}
return Value;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
}

View File

@ -0,0 +1,92 @@
package com.ruoyi.web.controller.yada;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.file.FileUploadUtils;
import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.system.domain_yada.ThematicMapDomain;
import com.ruoyi.system.service_yada.ThematicMapService;
import io.swagger.annotations.*;
import org.apache.ibatis.annotations.Param;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDateTime;
import java.util.List;
/**
* 专题图模块
* @author taco chen
*/
@RestController
@RequestMapping(value = "/thematic-map")
@Api(tags = "专题图模块")
public class ThematicMapController {
@Resource
private ThematicMapService thematicMapService;
/**
* 查询方法
* @param response 响应头
* @return 参数类
*/
@ApiOperation("获取所有专题图")
@ApiImplicitParams({})
@ApiResponses({
@ApiResponse(code =200,message = "请求成功"),
@ApiResponse(code =401,message = "没有认证"),
@ApiResponse(code =403,message = "权限不足"),
@ApiResponse(code =404,message = "未找到")
})
@RequestMapping(value = "/get/all",method = {RequestMethod.POST})
public AjaxResult selectAllThematicMap(HttpServletResponse response,@RequestBody ThematicMapDomain thematicMapDomain)
{
List<ThematicMapDomain> res= thematicMapService.selectAll(thematicMapDomain.getPictureType(),
thematicMapDomain.getPictureTypeOne(),thematicMapDomain.getPictureTypeTwo());
return AjaxResult.success(res);
}
/**
* 删除方法
* @param id id
* @return 状态码
*/
@RequestMapping(value = "/delete",method = {RequestMethod.DELETE})
@ApiOperation(value = "删除方法",httpMethod = "DELETE")
@ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "long", paramType = "path", dataTypeClass = long.class)
public AjaxResult deleteThematicMap(@Param("id") Long id)
{
int num = thematicMapService.deleteById(id);
if (num>0) {
return AjaxResult.success();
}
return AjaxResult.error();
}
/**
* 新增方法
* @param thematicMapDomain 新增实体类
* @return 状态码
*/
@ApiOperation(value = "新增方法",httpMethod = "POST")
@RequestMapping(value = "/add",method = {RequestMethod.POST})
public AjaxResult saveThematicMap(@RequestBody ThematicMapDomain thematicMapDomain)
{
thematicMapDomain.setCreatedTime(LocalDateTime.now());
int num = thematicMapService.save(thematicMapDomain);
if (num>0) {
return AjaxResult.success();
}
return AjaxResult.error();
}
}

View File

@ -0,0 +1,84 @@
package com.ruoyi.web.controller.yada;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.system.domain_yada.AustraliaMiddleEastVO;
import com.ruoyi.system.domain_yada.UrbanVO;
import com.ruoyi.system.service_yada.IAustraliaMiddleEastService;
import com.ruoyi.system.service_yada.IUrbanService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDateTime;
import java.util.List;
/**
* 中国城市监测
*/
@Api(tags = "中国城市监测")
@RestController
@RequestMapping(value = "/business-service/api/Urban", produces = "application/json;charset=UTF-8")
public class UrbanController {
@Resource
private IUrbanService urbanService;
/**
* 查询方法
* @param response 响应头
* @param request 客户端请求
* @return 参数类
*/
@RequestMapping(value = "/selectUrban",method = {RequestMethod.GET})
@ApiOperation(value = "查询方法",httpMethod = "GET")
public AjaxResult selectUrban(HttpServletResponse response, HttpServletRequest request,@RequestBody UrbanVO urbanVO)
{
List<UrbanVO> eastVOSList= urbanService.selectUrban(urbanVO.getName(),urbanVO.getParticularYear());
return AjaxResult.success(eastVOSList);
}
/**
* 删除方法
* @param ID id
* @return 状态码
*/
@RequestMapping(value = "/DelUrban",method = {RequestMethod.DELETE})
@ApiOperation(value = "删除方法",httpMethod = "DELETE")
public AjaxResult DelUrban(@Param("ID") String ID)
{
int NUM = urbanService.DelUrban(ID);
if (NUM>0)
{
return AjaxResult.success();
}
return AjaxResult.error();
}
/**
* 新增方法
* @param eastVOS 新增实体类
* @return 状态码
*/
@ApiOperation(value = "新增方法",httpMethod = "POST")
@RequestMapping(value = "/IntoUrban",method = {RequestMethod.POST})
@ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "long", paramType = "path", dataTypeClass = long.class)
public AjaxResult IntoUrban(@RequestBody UrbanVO eastVOS)
{
eastVOS.setCreateTime(LocalDateTime.now());
int NUM = urbanService.IntoUrban(eastVOS);
if (NUM>0)
{
return AjaxResult.success();
}
return AjaxResult.error();
}
}

View File

@ -0,0 +1,82 @@
package com.ruoyi.web.controller.yada;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.system.domain_yada.AustraliaMiddleEastVO;
import com.ruoyi.system.domain_yada.VegetationCoverageVO;
import com.ruoyi.system.service_yada.IAustraliaMiddleEastService;
import com.ruoyi.system.service_yada.IVegetationCoverageService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDateTime;
import java.util.List;
/**
* 平均植被覆盖度和净初级生产力
*/
@Api(tags = "平均植被覆盖度和净初级生产力")
@RestController
@RequestMapping(value = "/business-service/api/Vegetation", produces = "application/json;charset=UTF-8")
public class VegetationCoverageController {
@Resource
private IVegetationCoverageService coverageService;
/**
* 查询方法
* @return 参数类
*/
@RequestMapping(value = "/selectVegetation",method = {RequestMethod.GET})
@ApiOperation(value = "查询方法",httpMethod = "GET")
public AjaxResult selectVegetation()
{
List<VegetationCoverageVO> eastVOSList= coverageService.selectVegetation();
return AjaxResult.success(eastVOSList);
}
/**
* 删除方法
* @param ID id
* @return 状态码
*/
@RequestMapping(value = "/DelVegetation",method = {RequestMethod.DELETE})
@ApiOperation(value = "删除方法",httpMethod = "DELETE")
@ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "long", paramType = "path", dataTypeClass = long.class)
public AjaxResult DelVegetation(@Param("ID") String ID)
{
int NUM = coverageService.DelVegetation(ID);
if (NUM>0)
{
return AjaxResult.success();
}
return AjaxResult.error();
}
/**
* 新增方法
* @param eastVOS 新增实体类
* @return 状态码
*/
@ApiOperation(value = "新增方法",httpMethod = "POST")
@RequestMapping(value = "/IntoVegetation",method = {RequestMethod.POST})
public AjaxResult IntoVegetation(@RequestBody VegetationCoverageVO eastVOS)
{
eastVOS.setCreateTime(LocalDateTime.now());
int NUM = coverageService.IntoVegetation(eastVOS);
if (NUM>0)
{
return AjaxResult.success();
}
return AjaxResult.error();
}
}

View File

@ -1,125 +1,125 @@
package com.ruoyi.web.core.config; package com.ruoyi.web.core.config;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import com.ruoyi.common.config.RuoYiConfig; import com.ruoyi.common.config.RuoYiConfig;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import springfox.documentation.builders.ApiInfoBuilder; import io.swagger.models.auth.In;
import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.builders.PathSelectors;
import springfox.documentation.service.ApiInfo; import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiKey; import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.AuthorizationScope; import springfox.documentation.service.ApiKey;
import springfox.documentation.service.Contact; import springfox.documentation.service.AuthorizationScope;
import springfox.documentation.service.SecurityReference; import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType; import springfox.documentation.service.SecurityReference;
import springfox.documentation.spi.service.contexts.SecurityContext; import springfox.documentation.service.SecurityScheme;
import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.spi.DocumentationType;
import springfox.documentation.swagger2.annotations.EnableSwagger2; import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.Docket;
/**
* Swagger2的接口配置 /**
* * Swagger2的接口配置
* @author ruoyi *
*/ * @author ruoyi
@Configuration */
@EnableSwagger2 @Configuration
public class SwaggerConfig public class SwaggerConfig
{ {
/** 系统基础配置 */ /** 系统基础配置 */
@Autowired @Autowired
private RuoYiConfig ruoyiConfig; private RuoYiConfig ruoyiConfig;
/** 是否开启swagger */ /** 是否开启swagger */
@Value("${swagger.enabled}") @Value("${swagger.enabled}")
private boolean enabled; private boolean enabled;
/** 设置请求的统一前缀 */ /** 设置请求的统一前缀 */
@Value("${swagger.pathMapping}") @Value("${swagger.pathMapping}")
private String pathMapping; private String pathMapping;
/** /**
* 创建API * 创建API
*/ */
@Bean @Bean
public Docket createRestApi() public Docket createRestApi()
{ {
return new Docket(DocumentationType.SWAGGER_2) return new Docket(DocumentationType.OAS_30)
// 是否启用Swagger // 是否启用Swagger
.enable(enabled) .enable(enabled)
// 用来创建该API的基本信息展示在文档的页面中自定义展示的信息 // 用来创建该API的基本信息展示在文档的页面中自定义展示的信息
.apiInfo(apiInfo()) .apiInfo(apiInfo())
// 设置哪些接口暴露给Swagger展示 // 设置哪些接口暴露给Swagger展示
.select() .select()
// 扫描所有有注解的api用这种方式更灵活 // 扫描所有有注解的api用这种方式更灵活
.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
// 扫描指定包中的swagger注解 // 扫描指定包中的swagger注解
// .apis(RequestHandlerSelectors.basePackage("com.ruoyi.project.tool.swagger")) // .apis(RequestHandlerSelectors.basePackage("com.ruoyi.project.tool.swagger"))
// 扫描所有 .apis(RequestHandlerSelectors.any()) // 扫描所有 .apis(RequestHandlerSelectors.any())
.paths(PathSelectors.any()) .paths(PathSelectors.any())
.build() .build()
/* 设置安全模式swagger可以设置访问token */ /* 设置安全模式swagger可以设置访问token */
.securitySchemes(securitySchemes()) .securitySchemes(securitySchemes())
.securityContexts(securityContexts()) .securityContexts(securityContexts())
.pathMapping(pathMapping); .pathMapping(pathMapping);
} }
/** /**
* 安全模式这里指定token通过Authorization头请求头传递 * 安全模式这里指定token通过Authorization头请求头传递
*/ */
private List<ApiKey> securitySchemes() private List<SecurityScheme> securitySchemes()
{ {
List<ApiKey> apiKeyList = new ArrayList<ApiKey>(); List<SecurityScheme> apiKeyList = new ArrayList<SecurityScheme>();
apiKeyList.add(new ApiKey("Authorization", "Authorization", "header")); apiKeyList.add(new ApiKey("Authorization", "Authorization", In.HEADER.toValue()));
return apiKeyList; return apiKeyList;
} }
/** /**
* 安全上下文 * 安全上下文
*/ */
private List<SecurityContext> securityContexts() private List<SecurityContext> securityContexts()
{ {
List<SecurityContext> securityContexts = new ArrayList<>(); List<SecurityContext> securityContexts = new ArrayList<>();
securityContexts.add( securityContexts.add(
SecurityContext.builder() SecurityContext.builder()
.securityReferences(defaultAuth()) .securityReferences(defaultAuth())
.forPaths(PathSelectors.regex("^(?!auth).*$")) .operationSelector(o -> o.requestMappingPattern().matches("/.*"))
.build()); .build());
return securityContexts; return securityContexts;
} }
/** /**
* 默认的安全上引用 * 默认的安全上引用
*/ */
private List<SecurityReference> defaultAuth() private List<SecurityReference> defaultAuth()
{ {
AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything"); AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
authorizationScopes[0] = authorizationScope; authorizationScopes[0] = authorizationScope;
List<SecurityReference> securityReferences = new ArrayList<>(); List<SecurityReference> securityReferences = new ArrayList<>();
securityReferences.add(new SecurityReference("Authorization", authorizationScopes)); securityReferences.add(new SecurityReference("Authorization", authorizationScopes));
return securityReferences; return securityReferences;
} }
/** /**
* 添加摘要信息 * 添加摘要信息
*/ */
private ApiInfo apiInfo() private ApiInfo apiInfo()
{ {
// 用ApiInfoBuilder进行定制 // 用ApiInfoBuilder进行定制
return new ApiInfoBuilder() return new ApiInfoBuilder()
// 设置标题 // 设置标题
.title("标题若依管理系统_接口文档") .title("标题若依管理系统_接口文档")
// 描述 // 描述
.description("描述:用于管理集团旗下公司的人员信息,具体包括XXX,XXX模块...") .description("描述:用于管理集团旗下公司的人员信息,具体包括XXX,XXX模块...")
// 作者信息 // 作者信息
.contact(new Contact(ruoyiConfig.getName(), null, null)) .contact(new Contact(ruoyiConfig.getName(), null, null))
// 版本 // 版本
.version("版本号:" + ruoyiConfig.getVersion()) .version("版本号:" + ruoyiConfig.getVersion())
.build(); .build();
} }
} }

View File

@ -0,0 +1 @@
com.ruoyi.framework.web.service.CaptchaRedisService

View File

@ -1,57 +1,62 @@
# 数据源配置 # 数据源配置
spring: spring:
datasource: datasource:
type: com.alibaba.druid.pool.DruidDataSource type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver # driverClassName: com.mysql.cj.jdbc.Driver
druid: driver-class-name: org.postgresql.Driver
# 主库数据源 druid:
master: master:
url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 #url: jdbc:postgresql://47.243.79.66:5432/yada?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=Asia/Shanghai
username: root #url: jdbc:postgresql://192.168.2.9:5432/yada?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=Asia/Shanghai
password: password # username: postgres
# 从库数据源 # password: postgres
slave: url: jdbc:postgresql://118.195.242.28:5432/yada?AllowPublicKeyRetrieval=True&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
# 从数据源开关/默认关闭 username: gty
enabled: false password: 308525
url: # 从库数据源
username: slave:
password: # 从数据源开关/默认关闭
# 初始连接数 enabled: false
initialSize: 5 url:
# 最小连接池数量 username:
minIdle: 10 password:
# 最大连接池数量 # 初始连接数
maxActive: 20 initialSize: 5
# 配置获取连接等待超时的时间 # 最小连接池数量
maxWait: 60000 minIdle: 10
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 # 最大连接池数量
timeBetweenEvictionRunsMillis: 60000 maxActive: 20
# 配置一个连接在池中最小生存的时间,单位是毫秒 # 配置获取连接等待超时的时间
minEvictableIdleTimeMillis: 300000 maxWait: 60000
# 配置一个连接在池中最大生存的时间,单位是毫秒 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
maxEvictableIdleTimeMillis: 900000 timeBetweenEvictionRunsMillis: 60000
# 配置检测连接是否有效 # 配置一个连接在池中最小生存的时间,单位是毫秒
validationQuery: SELECT 1 FROM DUAL minEvictableIdleTimeMillis: 300000
testWhileIdle: true # 配置一个连接在池中最大生存的时间,单位是毫秒
testOnBorrow: false maxEvictableIdleTimeMillis: 900000
testOnReturn: false # 配置检测连接是否有效select * from pg_stat_activity
webStatFilter: # validationQuery: SELECT 1 FROM DUAL
enabled: true validationQuery: SELECT version()
statViewServlet: testWhileIdle: true
enabled: true testOnBorrow: false
# 设置白名单,不填则允许所有访问 testOnReturn: false
allow: webStatFilter:
url-pattern: /druid/* enabled: true
# 控制台管理用户名和密码 statViewServlet:
login-username: enabled: true
login-password: # 设置白名单,不填则允许所有访问
filter: allow:
stat: url-pattern: /druid/*
enabled: true # 控制台管理用户名和密码
# 慢SQL记录 login-username: ruoyi
log-slow-sql: true login-password: 123456
slow-sql-millis: 1000 filter:
merge-sql: true stat:
wall: enabled: true
config: # 慢SQL记录
multi-statement-allow: true log-slow-sql: true
slow-sql-millis: 1000
merge-sql: true
wall:
config:
multi-statement-allow: true

View File

@ -1,117 +1,138 @@
# 项目相关配置 # 项目相关配置
ruoyi: ruoyi:
# 名称 # 名称
name: RuoYi name: RuoYi
# 版本 # 版本
version: 3.0.0 version: 3.4.0
# 版权年份 # 版权年份
copyrightYear: 2019 copyrightYear: 2021
# 实例演示开关 # 实例演示开关
demoEnabled: true demoEnabled: true
# 文件路径 示例( Windows配置D:/ruoyi/uploadPathLinux配置 /home/ruoyi/uploadPath # 文件路径 示例( Windows配置D:/ruoyi/uploadPathLinux配置 /home/ruoyi/uploadPath
profile: D:/ruoyi/uploadPath profile: /home/gty/ruoyi/uploadPath
# 获取ip地址开关 # 获取ip地址开关
addressEnabled: false addressEnabled: false
# 验证码类型 math 数组计算 char 字符验证
# 开发环境配置 captchaType: math
server:
# 服务器的HTTP端口默认为8080 # 开发环境配置
port: 8080 server:
servlet: # 服务器的HTTP端口默认为8080
# 应用的访问路径 port: 8080
context-path: / #port: 6061
tomcat: servlet:
# tomcat的URI编码 # 应用的访问路径
uri-encoding: UTF-8 context-path: /
# tomcat最大线程数默认为200 tomcat:
max-threads: 800 # tomcat的URI编码
# Tomcat启动初始化的线程数默认值25 uri-encoding: UTF-8
min-spare-threads: 30 # tomcat最大线程数默认为200
max-threads: 800
# 日志配置 # Tomcat启动初始化的线程数默认值25
logging: min-spare-threads: 30
level:
com.ruoyi: debug # 日志配置
org.springframework: warn logging:
level:
# Spring配置 com.ruoyi: debug
spring: org.springframework: warn
# 资源信息
messages: # Spring配置
# 国际化资源文件路径 spring:
basename: i18n/messages # 资源信息
profiles: messages:
active: druid # 国际化资源文件路径
# 文件上传 basename: i18n/messages
servlet: profiles:
multipart: active: druid
# 单个文件大小 # 文件上传
max-file-size: 10MB servlet:
# 设置总上传的文件大小 multipart:
max-request-size: 20MB # 单个文件大小
# 服务模块 max-file-size: 10MB
devtools: # 设置总上传的文件大小
restart: max-request-size: 20MB
# 热部署开关 # 服务模块
enabled: true devtools:
# redis 配置 restart:
redis: # 热部署开关
# 地址 enabled: true
host: localhost # redis 配置
# 端口默认为6379 redis:
port: 6379 # 地址
# 密码 host: localhost
password: # 端口默认为6379
# 连接超时时间 port: 6379
timeout: 10s # 数据库索引
lettuce: database: 0
pool: # 密码
# 连接池中的最小空闲连接 password: '*&jkjusWETO(^ses%i'
min-idle: 0 # 连接超时时间
# 连接池中的最大空闲连接 timeout: 10s
max-idle: 8 lettuce:
# 连接池的最大数据库连接数 pool:
max-active: 8 # 连接池中的最小空闲连接
# #连接池最大阻塞等待时间(使用负值表示没有限制) min-idle: 0
max-wait: -1ms # 连接池中的最大空闲连接
max-idle: 8
# token配置 # 连接池的最大数据库连接数
token: max-active: 8
# 令牌自定义标识 # #连接池最大阻塞等待时间(使用负值表示没有限制)
header: Authorization max-wait: -1ms
# 令牌密钥
secret: abcdefghijklmnopqrstuvwxyz # token配置
# 令牌有效期默认30分钟 token:
expireTime: 30 # 令牌自定义标识
header: Authorization
# MyBatis配置 # 令牌密钥
mybatis: secret: abcdefghijklmnopqrstuvwxyz
# 搜索指定包别名 # 令牌有效期默认30分钟
typeAliasesPackage: com.ruoyi.**.domain expireTime: 300
# 配置mapper的扫描找到所有的mapper.xml映射文件
mapperLocations: classpath*:mapper/**/*Mapper.xml # MyBatis配置
# 加载全局的配置文件 mybatis:
configLocation: classpath:mybatis/mybatis-config.xml # 搜索指定包别名
typeAliasesPackage: com.ruoyi.**.domain
# PageHelper分页插件 # 配置mapper的扫描找到所有的mapper.xml映射文件
pagehelper: mapperLocations: classpath*:mapper/**/*Mapper.xml
helperDialect: mysql # 加载全局的配置文件
reasonable: true configLocation: classpath:mybatis/mybatis-config.xml
supportMethodsArguments: true
params: count=countSql # PageHelper分页插件
pagehelper:
# Swagger配置 helperDialect: mysql
swagger: reasonable: true
# 是否开启swagger supportMethodsArguments: true
enabled: true params: count=countSql
# 请求前缀
pathMapping: /dev-api # Swagger配置
swagger:
# 防止XSS攻击 # 是否开启swagger
xss: enabled: true
# 过滤开关 # 请求前缀
enabled: true pathMapping: /dev-api
# 排除链接(多个用逗号分隔)
excludes: /system/notice/* # 滑块验证码
# 匹配链接 aj:
urlPatterns: /system/*,/monitor/*,/tool/* captcha:
cache-type: redis
# blockPuzzle 滑块 clickWord 文字点选 default默认两者都实例化
type: blockPuzzle
# 右下角显示字
water-mark: ruoyi.vip
# 校验滑动拼图允许误差偏移量(默认5像素)
slip-offset: 5
# aes加密坐标开启或者禁用(true|false)
aes-status: true
# 滑动干扰项(0/1/2)
interference-options: 2
# 防止XSS攻击
xss:
# 过滤开关
enabled: true
# 排除链接(多个用逗号分隔)
excludes: /system/notice/*
# 匹配链接
urlPatterns: /system/*,/monitor/*,/tool/*

View File

@ -1,24 +1,6 @@
Application Version: ${ruoyi.version} _
Spring Boot Version: ${spring-boot.version} ( )
//////////////////////////////////////////////////////////////////// | |/') _ __ ___
// _ooOoo_ // (`\/')| , < ( '__)/',__)
// o8888888o // > < | |\`\ | | \__, \
// 88" . "88 // (_/\_)(_) (_)(_) (____/
// (| ^_^ |) //
// O\ = /O //
// ____/`---'\____ //
// .' \\| |// `. //
// / \\||| : |||// \ //
// / _||||| -:- |||||- \ //
// | | \\\ - /// | | //
// | \_| ''\---/'' | | //
// \ .-\__ `-` ___/-. / //
// ___`. .' /--.--\ `. . ___ //
// ."" '< `.___\_<|>_/___.' >'"". //
// | | : `- \`.;`\ _ /`;.`/ - ` : | | //
// \ \ `-. \_ __\ /__ _/ .-` / / //
// ========`-.____`-.___\_____/___.-`____.-'======== //
// `=---=' //
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //
// 佛祖保佑 永不宕机 永无BUG //
////////////////////////////////////////////////////////////////////

View File

@ -1,36 +1,37 @@
#错误消息 #错误消息
not.null=* 必须填写 not.null=* 必须填写
user.jcaptcha.error=验证码错误 user.jcaptcha.error=验证码错误
user.jcaptcha.expire=验证码已失效 user.jcaptcha.expire=验证码已失效
user.not.exists=用户不存在/密码错误 user.not.exists=用户不存在/密码错误
user.password.not.match=用户不存在/密码错误 user.password.not.match=用户不存在/密码错误
user.password.retry.limit.count=密码输入错误{0}次 user.password.retry.limit.count=密码输入错误{0}次
user.password.retry.limit.exceed=密码输入错误{0}次帐户锁定10分钟 user.password.retry.limit.exceed=密码输入错误{0}次帐户锁定10分钟
user.password.delete=对不起,您的账号已被删除 user.password.delete=对不起,您的账号已被删除
user.blocked=用户已封禁,请联系管理员 user.blocked=用户已封禁,请联系管理员
role.blocked=角色已封禁,请联系管理员 role.blocked=角色已封禁,请联系管理员
user.logout.success=退出成功 user.logout.success=退出成功
length.not.valid=长度必须在{min}到{max}个字符之间 length.not.valid=长度必须在{min}到{max}个字符之间
user.username.not.valid=* 2到20个汉字、字母、数字或下划线组成且必须以非数字开头 user.username.not.valid=* 2到20个汉字、字母、数字或下划线组成且必须以非数字开头
user.password.not.valid=* 5-50个字符 user.password.not.valid=* 5-50个字符
user.email.not.valid=邮箱格式错误 user.email.not.valid=邮箱格式错误
user.mobile.phone.number.not.valid=手机号格式错误 user.mobile.phone.number.not.valid=手机号格式错误
user.login.success=登录成功 user.login.success=登录成功
user.notfound=请重新登录 user.register.success=注册成功
user.forcelogout=管理员强制退出,请重新登录 user.notfound=请重新登录
user.unknown.error=未知错误,请重新登录 user.forcelogout=管理员强制退出,请重新登录
user.unknown.error=未知错误,请重新登录
##文件上传消息
upload.exceed.maxSize=上传的文件大小超出限制的文件大小!<br/>允许的文件最大大小是:{0}MB ##文件上传消息
upload.filename.exceed.length=上传的文件名最长{0}个字符 upload.exceed.maxSize=上传的文件大小超出限制的文件大小!<br/>允许的文件最大大小是:{0}MB
upload.filename.exceed.length=上传的文件名最长{0}个字符
##权限
no.permission=您没有数据的权限,请联系管理员添加权限 [{0}] ##权限
no.create.permission=您没有创建数据的权限,请联系管理员添加权限 [{0}] no.permission=您没有数据的权限,请联系管理员添加权限 [{0}]
no.update.permission=您没有修改数据的权限,请联系管理员添加权限 [{0}] no.create.permission=您没有创建数据的权限,请联系管理员添加权限 [{0}]
no.delete.permission=您没有删除数据的权限,请联系管理员添加权限 [{0}] no.update.permission=您没有修改数据的权限,请联系管理员添加权限 [{0}]
no.export.permission=您没有导出数据的权限,请联系管理员添加权限 [{0}] no.delete.permission=您没有删除数据的权限,请联系管理员添加权限 [{0}]
no.view.permission=您没有查看数据的权限,请联系管理员添加权限 [{0}] no.export.permission=您没有导出数据的权限,请联系管理员添加权限 [{0}]
no.view.permission=您没有查看数据的权限,请联系管理员添加权限 [{0}]

View File

@ -1,93 +1,93 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<configuration> <configuration>
<!-- 日志存放路径 --> <!-- 日志存放路径 -->
<property name="log.path" value="/home/ruoyi/logs" /> <property name="log.path" value="/home/ruoyi/logs" />
<!-- 日志输出格式 --> <!-- 日志输出格式 -->
<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" /> <property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
<!-- 控制台输出 --> <!-- 控制台输出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder> <encoder>
<pattern>${log.pattern}</pattern> <pattern>${log.pattern}</pattern>
</encoder> </encoder>
</appender> </appender>
<!-- 系统日志输出 --> <!-- 系统日志输出 -->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender"> <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-info.log</file> <file>${log.path}/sys-info.log</file>
<!-- 循环政策:基于时间创建日志文件 --> <!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 --> <!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern> <fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 --> <!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory> <maxHistory>60</maxHistory>
</rollingPolicy> </rollingPolicy>
<encoder> <encoder>
<pattern>${log.pattern}</pattern> <pattern>${log.pattern}</pattern>
</encoder> </encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter"> <filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 --> <!-- 过滤的级别 -->
<level>INFO</level> <level>INFO</level>
<!-- 匹配时的操作:接收(记录) --> <!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch> <onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) --> <!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch> <onMismatch>DENY</onMismatch>
</filter> </filter>
</appender> </appender>
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender"> <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-error.log</file> <file>${log.path}/sys-error.log</file>
<!-- 循环政策:基于时间创建日志文件 --> <!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 --> <!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern> <fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 --> <!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory> <maxHistory>60</maxHistory>
</rollingPolicy> </rollingPolicy>
<encoder> <encoder>
<pattern>${log.pattern}</pattern> <pattern>${log.pattern}</pattern>
</encoder> </encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter"> <filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 --> <!-- 过滤的级别 -->
<level>ERROR</level> <level>ERROR</level>
<!-- 匹配时的操作:接收(记录) --> <!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch> <onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) --> <!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch> <onMismatch>DENY</onMismatch>
</filter> </filter>
</appender> </appender>
<!-- 用户访问日志输出 --> <!-- 用户访问日志输出 -->
<appender name="sys-user" class="ch.qos.logback.core.rolling.RollingFileAppender"> <appender name="sys-user" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-user.log</file> <file>${log.path}/sys-user.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 按天回滚 daily --> <!-- 按天回滚 daily -->
<fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.log</fileNamePattern> <fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 --> <!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory> <maxHistory>60</maxHistory>
</rollingPolicy> </rollingPolicy>
<encoder> <encoder>
<pattern>${log.pattern}</pattern> <pattern>${log.pattern}</pattern>
</encoder> </encoder>
</appender> </appender>
<!-- 系统模块日志级别控制 --> <!-- 系统模块日志级别控制 -->
<logger name="com.ruoyi" level="info" /> <logger name="com.ruoyi" level="info" />
<!-- Spring日志级别控制 --> <!-- Spring日志级别控制 -->
<logger name="org.springframework" level="warn" /> <logger name="org.springframework" level="warn" />
<root level="info"> <root level="info">
<appender-ref ref="console" /> <appender-ref ref="console" />
</root> </root>
<!--系统操作日志--> <!--系统操作日志-->
<root level="info"> <root level="info">
<appender-ref ref="file_info" /> <appender-ref ref="file_info" />
<appender-ref ref="file_error" /> <appender-ref ref="file_error" />
</root> </root>
<!--系统用户操作日志--> <!--系统用户操作日志-->
<logger name="sys-user" level="info"> <logger name="sys-user" level="info">
<appender-ref ref="sys-user"/> <appender-ref ref="sys-user"/>
</logger> </logger>
</configuration> </configuration>

View File

@ -1,15 +1,20 @@
<?xml version="1.0" encoding="UTF-8" ?> <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration <!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN" PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd"> "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration> <configuration>
<!-- 全局参数 -->
<settings> <settings>
<setting name="cacheEnabled" value="true" /> <!-- 全局映射器启用缓存 --> <!-- 使全局的映射器启用或禁用缓存 -->
<setting name="useGeneratedKeys" value="true" /> <!-- 允许 JDBC 支持自动生成主键 --> <setting name="cacheEnabled" value="true" />
<setting name="defaultExecutorType" value="REUSE" /> <!-- 配置默认的执行器 --> <!-- 允许JDBC 支持自动生成主键 -->
<setting name="logImpl" value="SLF4J" /> <!-- 指定 MyBatis 所用日志的具体实现 --> <setting name="useGeneratedKeys" value="true" />
<!-- <setting name="mapUnderscoreToCamelCase" value="true"/> 驼峰式命名 --> <!-- 配置默认的执行器.SIMPLE就是普通执行器;REUSE执行器会重用预处理语句(prepared statements);BATCH执行器将重用语句并执行批量更新 -->
</settings> <setting name="defaultExecutorType" value="SIMPLE" />
<!-- 指定 MyBatis 所用日志的具体实现 -->
</configuration> <setting name="logImpl" value="SLF4J" />
<!-- 使用驼峰命名法转换字段 -->
<!-- <setting name="mapUnderscoreToCamelCase" value="true"/> -->
</settings>
</configuration>

View File

@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>ruoyi</artifactId> <artifactId>ruoyi</artifactId>
<groupId>com.ruoyi</groupId> <groupId>com.ruoyi</groupId>
<version>3.0.0</version> <version>3.8.2</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
@ -43,8 +43,8 @@
<!-- 自定义验证注解 --> <!-- 自定义验证注解 -->
<dependency> <dependency>
<groupId>javax.validation</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>validation-api</artifactId> <artifactId>spring-boot-starter-validation</artifactId>
</dependency> </dependency>
<!--常用工具类 --> <!--常用工具类 -->
@ -89,12 +89,18 @@
<artifactId>snakeyaml</artifactId> <artifactId>snakeyaml</artifactId>
</dependency> </dependency>
<!--Token生成与解析--> <!-- Token生成与解析-->
<dependency> <dependency>
<groupId>io.jsonwebtoken</groupId> <groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId> <artifactId>jjwt</artifactId>
</dependency> </dependency>
<!-- Jaxb -->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
</dependency>
<!-- redis 缓存操作 --> <!-- redis 缓存操作 -->
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>

View File

@ -4,6 +4,10 @@ import java.lang.annotation.ElementType;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; import java.lang.annotation.Target;
import java.math.BigDecimal;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import com.ruoyi.common.utils.poi.ExcelHandlerAdapter;
/** /**
* 自定义导出Excel数据注解 * 自定义导出Excel数据注解
@ -29,15 +33,30 @@ public @interface Excel
*/ */
public String dateFormat() default ""; public String dateFormat() default "";
/**
* 如果是字典类型请设置字典的type值 (: sys_user_sex)
*/
public String dictType() default "";
/** /**
* 读取内容转表达式 (: 0=,1=,2=未知) * 读取内容转表达式 (: 0=,1=,2=未知)
*/ */
public String readConverterExp() default ""; public String readConverterExp() default "";
/** /**
* 导出类型0数字 1字符串 * 分隔符读取字符串组内容
*/ */
public ColumnType cellType() default ColumnType.STRING; public String separator() default ",";
/**
* BigDecimal 精度 默认:-1(默认不开启BigDecimal格式化)
*/
public int scale() default -1;
/**
* BigDecimal 舍入规则 默认:BigDecimal.ROUND_HALF_EVEN
*/
public int roundingMode() default BigDecimal.ROUND_HALF_EVEN;
/** /**
* 导出时在excel中每个列的高度 单位为字符 * 导出时在excel中每个列的高度 单位为字符
@ -79,6 +98,52 @@ public @interface Excel
*/ */
public String targetAttr() default ""; public String targetAttr() default "";
/**
* 是否自动统计数据,在最后追加一行统计数据总和
*/
public boolean isStatistics() default false;
/**
* 导出类型0数字 1字符串
*/
public ColumnType cellType() default ColumnType.STRING;
/**
* 导出字体颜色
*/
public IndexedColors color() default IndexedColors.BLACK;
/**
* 导出字段对齐方式
*/
public HorizontalAlignment align() default HorizontalAlignment.CENTER;
/**
* 自定义数据处理器
*/
public Class<?> handler() default ExcelHandlerAdapter.class;
/**
* 自定义数据处理器参数
*/
public String[] args() default {};
public enum Align
{
AUTO(0), LEFT(1), CENTER(2), RIGHT(3);
private final int value;
Align(int value)
{
this.value = value;
}
public int value()
{
return this.value;
}
}
/** /**
* 字段类型0导出导入1仅导出2仅导入 * 字段类型0导出导入1仅导出2仅导入
*/ */
@ -102,7 +167,7 @@ public @interface Excel
public enum ColumnType public enum ColumnType
{ {
NUMERIC(0), STRING(1); NUMERIC(0), STRING(1), IMAGE(2);
private final int value; private final int value;
ColumnType(int value) ColumnType(int value)
@ -115,4 +180,4 @@ public @interface Excel
return this.value; return this.value;
} }
} }
} }

View File

@ -14,5 +14,5 @@ import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME) @Retention(RetentionPolicy.RUNTIME)
public @interface Excels public @interface Excels
{ {
Excel[] value(); public Excel[] value();
} }

View File

@ -38,4 +38,9 @@ public @interface Log
* 是否保存请求的参数 * 是否保存请求的参数
*/ */
public boolean isSaveRequestData() default true; public boolean isSaveRequestData() default true;
/**
* 是否保存响应的参数
*/
public boolean isSaveResponseData() default true;
} }

View File

@ -0,0 +1,40 @@
package com.ruoyi.common.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.enums.LimitType;
/**
* 限流注解
*
* @author ruoyi
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RateLimiter
{
/**
* 限流key
*/
public String key() default Constants.RATE_LIMIT_KEY;
/**
* 限流时间,单位秒
*/
public int time() default 60;
/**
* 限流次数
*/
public int count() default 100;
/**
* 限流类型
*/
public LimitType limitType() default LimitType.DEFAULT;
}

View File

@ -19,5 +19,13 @@ import java.lang.annotation.Target;
@Documented @Documented
public @interface RepeatSubmit public @interface RepeatSubmit
{ {
/**
* 间隔时间(ms)小于此时间视为重复提交
*/
public int interval() default 5000;
/**
* 提示消息
*/
public String message() default "不允许重复提交,请稍候再试";
} }

View File

@ -30,6 +30,9 @@ public class RuoYiConfig
/** 获取地址开关 */ /** 获取地址开关 */
private static boolean addressEnabled; private static boolean addressEnabled;
/** 验证码类型 */
private static String captchaType;
public String getName() public String getName()
{ {
return name; return name;
@ -90,6 +93,22 @@ public class RuoYiConfig
RuoYiConfig.addressEnabled = addressEnabled; RuoYiConfig.addressEnabled = addressEnabled;
} }
public static String getCaptchaType() {
return captchaType;
}
public void setCaptchaType(String captchaType) {
RuoYiConfig.captchaType = captchaType;
}
/**
* 获取导入上传路径
*/
public static String getImportPath()
{
return getProfile() + "/import";
}
/** /**
* 获取头像上传路径 * 获取头像上传路径
*/ */

View File

@ -1,5 +1,7 @@
package com.ruoyi.common.constant; package com.ruoyi.common.constant;
import io.jsonwebtoken.Claims;
/** /**
* 通用常量信息 * 通用常量信息
* *
@ -47,6 +49,11 @@ public class Constants
*/ */
public static final String LOGOUT = "Logout"; public static final String LOGOUT = "Logout";
/**
* 注册
*/
public static final String REGISTER = "Register";
/** /**
* 登录失败 * 登录失败
*/ */
@ -62,6 +69,16 @@ public class Constants
*/ */
public static final String LOGIN_TOKEN_KEY = "login_tokens:"; public static final String LOGIN_TOKEN_KEY = "login_tokens:";
/**
* 防重提交 redis key
*/
public static final String REPEAT_SUBMIT_KEY = "repeat_submit:";
/**
* 限流 redis key
*/
public static final String RATE_LIMIT_KEY = "rate_limit:";
/** /**
* 验证码有效期分钟 * 验证码有效期分钟
*/ */
@ -90,7 +107,7 @@ public class Constants
/** /**
* 用户名称 * 用户名称
*/ */
public static final String JWT_USERNAME = "sub"; public static final String JWT_USERNAME = Claims.SUBJECT;
/** /**
* 用户头像 * 用户头像
@ -121,4 +138,30 @@ public class Constants
* 资源映射路径 前缀 * 资源映射路径 前缀
*/ */
public static final String RESOURCE_PREFIX = "/profile"; public static final String RESOURCE_PREFIX = "/profile";
/**
* RMI 远程方法调用
*/
public static final String LOOKUP_RMI = "rmi:";
/**
* LDAP 远程方法调用
*/
public static final String LOOKUP_LDAP = "ldap:";
/**
* LDAPS 远程方法调用
*/
public static final String LOOKUP_LDAPS = "ldaps:";
/**
* 定时任务白名单配置仅允许访问的包名如其他需要可以自行添加
*/
public static final String[] JOB_WHITELIST_STR = { "com.ruoyi" };
/**
* 定时任务违规的字符
*/
public static final String[] JOB_ERROR_STR = { "java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml",
"org.springframework", "org.apache", "com.ruoyi.common.utils.file" };
} }

View File

@ -13,6 +13,9 @@ public class GenConstants
/** 树表(增删改查) */ /** 树表(增删改查) */
public static final String TPL_TREE = "tree"; public static final String TPL_TREE = "tree";
/** 主子表(增删改查) */
public static final String TPL_SUB = "sub";
/** 树编码字段 */ /** 树编码字段 */
public static final String TREE_CODE = "treeCode"; public static final String TREE_CODE = "treeCode";
@ -22,16 +25,24 @@ public class GenConstants
/** 树名称字段 */ /** 树名称字段 */
public static final String TREE_NAME = "treeName"; public static final String TREE_NAME = "treeName";
/** 上级菜单ID字段 */
public static final String PARENT_MENU_ID = "parentMenuId";
/** 上级菜单名称字段 */
public static final String PARENT_MENU_NAME = "parentMenuName";
/** 数据库字符串类型 */ /** 数据库字符串类型 */
public static final String[] COLUMNTYPE_STR = { "char", "varchar", "narchar", "varchar2", "tinytext", "text", public static final String[] COLUMNTYPE_STR = { "char", "varchar", "nvarchar", "varchar2" };
"mediumtext", "longtext" };
/** 数据库文本类型 */
public static final String[] COLUMNTYPE_TEXT = { "tinytext", "text", "mediumtext", "longtext" };
/** 数据库时间类型 */ /** 数据库时间类型 */
public static final String[] COLUMNTYPE_TIME = { "datetime", "time", "date", "timestamp" }; public static final String[] COLUMNTYPE_TIME = { "datetime", "time", "date", "timestamp" };
/** 数据库数字类型 */ /** 数据库数字类型 */
public static final String[] COLUMNTYPE_NUMBER = { "tinyint", "smallint", "mediumint", "int", "number", "integer", public static final String[] COLUMNTYPE_NUMBER = { "tinyint", "smallint", "mediumint", "int", "number", "integer",
"bigint", "float", "float", "double", "decimal" }; "bit", "bigint", "float", "double", "decimal" };
/** 页面不需要编辑字段 */ /** 页面不需要编辑字段 */
public static final String[] COLUMNNAME_NOT_EDIT = { "id", "create_by", "create_time", "del_flag" }; public static final String[] COLUMNNAME_NOT_EDIT = { "id", "create_by", "create_time", "del_flag" };
@ -68,6 +79,15 @@ public class GenConstants
/** 日期控件 */ /** 日期控件 */
public static final String HTML_DATETIME = "datetime"; public static final String HTML_DATETIME = "datetime";
/** 图片上传控件 */
public static final String HTML_IMAGE_UPLOAD = "imageUpload";
/** 文件上传控件 */
public static final String HTML_FILE_UPLOAD = "fileUpload";
/** 富文本控件 */
public static final String HTML_EDITOR = "editor";
/** 字符串类型 */ /** 字符串类型 */
public static final String TYPE_STRING = "String"; public static final String TYPE_STRING = "String";
@ -89,6 +109,9 @@ public class GenConstants
/** 模糊查询 */ /** 模糊查询 */
public static final String QUERY_LIKE = "LIKE"; public static final String QUERY_LIKE = "LIKE";
/** 相等查询 */
public static final String QUERY_EQ = "EQ";
/** 需要 */ /** 需要 */
public static final String REQUIRE = "1"; public static final String REQUIRE = "1";
} }

View File

@ -53,8 +53,26 @@ public class UserConstants
/** Layout组件标识 */ /** Layout组件标识 */
public final static String LAYOUT = "Layout"; public final static String LAYOUT = "Layout";
/** ParentView组件标识 */
public final static String PARENT_VIEW = "ParentView";
/** InnerLink组件标识 */
public final static String INNER_LINK = "InnerLink";
/** 校验返回结果码 */ /** 校验返回结果码 */
public final static String UNIQUE = "0"; public final static String UNIQUE = "0";
public final static String NOT_UNIQUE = "1"; public final static String NOT_UNIQUE = "1";
/**
* 用户名长度限制
*/
public static final int USERNAME_MIN_LENGTH = 2;
public static final int USERNAME_MAX_LENGTH = 20;
/**
* 密码长度限制
*/
public static final int PASSWORD_MIN_LENGTH = 5;
public static final int PASSWORD_MAX_LENGTH = 20;
} }

View File

@ -11,10 +11,13 @@ import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.ruoyi.common.constant.HttpStatus; import com.ruoyi.common.constant.HttpStatus;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.core.page.PageDomain; import com.ruoyi.common.core.page.PageDomain;
import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.page.TableSupport; import com.ruoyi.common.core.page.TableSupport;
import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.PageUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.sql.SqlUtil; import com.ruoyi.common.utils.sql.SqlUtil;
@ -25,7 +28,7 @@ import com.ruoyi.common.utils.sql.SqlUtil;
*/ */
public class BaseController public class BaseController
{ {
protected final Logger logger = LoggerFactory.getLogger(BaseController.class); protected final Logger logger = LoggerFactory.getLogger(this.getClass());
/** /**
* 将前台传递过来的日期格式的字符串自动转化为Date类型 * 将前台传递过来的日期格式的字符串自动转化为Date类型
@ -48,17 +51,31 @@ public class BaseController
* 设置请求分页数据 * 设置请求分页数据
*/ */
protected void startPage() protected void startPage()
{
PageUtils.startPage();
}
/**
* 设置请求排序数据
*/
protected void startOrderBy()
{ {
PageDomain pageDomain = TableSupport.buildPageRequest(); PageDomain pageDomain = TableSupport.buildPageRequest();
Integer pageNum = pageDomain.getPageNum(); if (StringUtils.isNotEmpty(pageDomain.getOrderBy()))
Integer pageSize = pageDomain.getPageSize();
if (StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize))
{ {
String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy()); String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy());
PageHelper.startPage(pageNum, pageSize, orderBy); PageHelper.orderBy(orderBy);
} }
} }
/**
* 清理分页的线程变量
*/
protected void clearPage()
{
PageUtils.clearPage();
}
/** /**
* 响应请求分页数据 * 响应请求分页数据
*/ */
@ -73,6 +90,38 @@ public class BaseController
return rspData; return rspData;
} }
/**
* 返回成功
*/
public AjaxResult success()
{
return AjaxResult.success();
}
/**
* 返回失败消息
*/
public AjaxResult error()
{
return AjaxResult.error();
}
/**
* 返回成功消息
*/
public AjaxResult success(String message)
{
return AjaxResult.success(message);
}
/**
* 返回失败消息
*/
public AjaxResult error(String message)
{
return AjaxResult.error(message);
}
/** /**
* 响应返回结果 * 响应返回结果
* *
@ -84,6 +133,17 @@ public class BaseController
return rows > 0 ? AjaxResult.success() : AjaxResult.error(); return rows > 0 ? AjaxResult.success() : AjaxResult.error();
} }
/**
* 响应返回结果
*
* @param result 结果
* @return 操作结果
*/
protected AjaxResult toAjax(boolean result)
{
return result ? success() : error();
}
/** /**
* 页面跳转 * 页面跳转
*/ */
@ -91,4 +151,36 @@ public class BaseController
{ {
return StringUtils.format("redirect:{}", url); return StringUtils.format("redirect:{}", url);
} }
/**
* 获取用户缓存信息
*/
public LoginUser getLoginUser()
{
return SecurityUtils.getLoginUser();
}
/**
* 获取登录用户id
*/
public Long getUserId()
{
return getLoginUser().getUserId();
}
/**
* 获取登录部门id
*/
public Long getDeptId()
{
return getLoginUser().getDeptId();
}
/**
* 获取登录用户名
*/
public String getUsername()
{
return getLoginUser().getUsername();
}
} }

View File

@ -145,4 +145,18 @@ public class AjaxResult extends HashMap<String, Object>
{ {
return new AjaxResult(code, msg, null); return new AjaxResult(code, msg, null);
} }
/**
* 方便链式调用
*
* @param key
* @param value
* @return 数据对象
*/
@Override
public AjaxResult put(String key, Object value)
{
super.put(key, value);
return this;
}
} }

View File

@ -5,7 +5,6 @@ import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
/** /**
* Entity基类 * Entity基类
@ -36,14 +35,6 @@ public class BaseEntity implements Serializable
/** 备注 */ /** 备注 */
private String remark; private String remark;
/** 开始时间 */
@JsonIgnore
private String beginTime;
/** 结束时间 */
@JsonIgnore
private String endTime;
/** 请求参数 */ /** 请求参数 */
private Map<String, Object> params; private Map<String, Object> params;
@ -107,26 +98,6 @@ public class BaseEntity implements Serializable
this.remark = remark; this.remark = remark;
} }
public String getBeginTime()
{
return beginTime;
}
public void setBeginTime(String beginTime)
{
this.beginTime = beginTime;
}
public String getEndTime()
{
return endTime;
}
public void setEndTime(String endTime)
{
this.endTime = endTime;
}
public Map<String, Object> getParams() public Map<String, Object> getParams()
{ {
if (params == null) if (params == null)

View File

@ -4,6 +4,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import javax.validation.constraints.Email; import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size; import javax.validation.constraints.Size;
import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle; import org.apache.commons.lang3.builder.ToStringStyle;
@ -31,7 +32,7 @@ public class SysDept extends BaseEntity
private String deptName; private String deptName;
/** 显示顺序 */ /** 显示顺序 */
private String orderNum; private Integer orderNum;
/** 负责人 */ /** 负责人 */
private String leader; private String leader;
@ -96,13 +97,13 @@ public class SysDept extends BaseEntity
this.deptName = deptName; this.deptName = deptName;
} }
@NotBlank(message = "显示顺序不能为空") @NotNull(message = "显示顺序不能为空")
public String getOrderNum() public Integer getOrderNum()
{ {
return orderNum; return orderNum;
} }
public void setOrderNum(String orderNum) public void setOrderNum(Integer orderNum)
{ {
this.orderNum = orderNum; this.orderNum = orderNum;
} }

View File

@ -1,6 +1,7 @@
package com.ruoyi.common.core.domain.entity; package com.ruoyi.common.core.domain.entity;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size; import javax.validation.constraints.Size;
import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle; import org.apache.commons.lang3.builder.ToStringStyle;
@ -57,6 +58,7 @@ public class SysDictType extends BaseEntity
@NotBlank(message = "字典类型不能为空") @NotBlank(message = "字典类型不能为空")
@Size(min = 0, max = 100, message = "字典类型类型长度不能超过100个字符") @Size(min = 0, max = 100, message = "字典类型类型长度不能超过100个字符")
@Pattern(regexp = "^[a-z][a-z0-9_]*$", message = "字典类型必须以字母开头,且只能为(小写字母,数字,下滑线)")
public String getDictType() public String getDictType()
{ {
return dictType; return dictType;

View File

@ -3,6 +3,7 @@ package com.ruoyi.common.core.domain.entity;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size; import javax.validation.constraints.Size;
import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle; import org.apache.commons.lang3.builder.ToStringStyle;
@ -30,7 +31,7 @@ public class SysMenu extends BaseEntity
private Long parentId; private Long parentId;
/** 显示顺序 */ /** 显示顺序 */
private String orderNum; private Integer orderNum;
/** 路由地址 */ /** 路由地址 */
private String path; private String path;
@ -38,9 +39,15 @@ public class SysMenu extends BaseEntity
/** 组件路径 */ /** 组件路径 */
private String component; private String component;
/** 路由参数 */
private String query;
/** 是否为外链0是 1否 */ /** 是否为外链0是 1否 */
private String isFrame; private String isFrame;
/** 是否缓存0缓存 1不缓存 */
private String isCache;
/** 类型M目录 C菜单 F按钮 */ /** 类型M目录 C菜单 F按钮 */
private String menuType; private String menuType;
@ -101,13 +108,13 @@ public class SysMenu extends BaseEntity
this.parentId = parentId; this.parentId = parentId;
} }
@NotBlank(message = "显示顺序不能为空") @NotNull(message = "显示顺序不能为空")
public String getOrderNum() public Integer getOrderNum()
{ {
return orderNum; return orderNum;
} }
public void setOrderNum(String orderNum) public void setOrderNum(Integer orderNum)
{ {
this.orderNum = orderNum; this.orderNum = orderNum;
} }
@ -134,6 +141,16 @@ public class SysMenu extends BaseEntity
this.component = component; this.component = component;
} }
public String getQuery()
{
return query;
}
public void setQuery(String query)
{
this.query = query;
}
public String getIsFrame() public String getIsFrame()
{ {
return isFrame; return isFrame;
@ -144,6 +161,16 @@ public class SysMenu extends BaseEntity
this.isFrame = isFrame; this.isFrame = isFrame;
} }
public String getIsCache()
{
return isCache;
}
public void setIsCache(String isCache)
{
this.isCache = isCache;
}
@NotBlank(message = "菜单类型不能为空") @NotBlank(message = "菜单类型不能为空")
public String getMenuType() public String getMenuType()
{ {
@ -216,6 +243,7 @@ public class SysMenu extends BaseEntity
.append("path", getPath()) .append("path", getPath())
.append("component", getComponent()) .append("component", getComponent())
.append("isFrame", getIsFrame()) .append("isFrame", getIsFrame())
.append("IsCache", getIsCache())
.append("menuType", getMenuType()) .append("menuType", getMenuType())
.append("visible", getVisible()) .append("visible", getVisible())
.append("status ", getStatus()) .append("status ", getStatus())

View File

@ -33,10 +33,16 @@ public class SysRole extends BaseEntity
@Excel(name = "角色排序") @Excel(name = "角色排序")
private String roleSort; private String roleSort;
/** 数据范围1所有数据权限2自定义数据权限3本部门数据权限4本部门及以下数据权限 */ /** 数据范围1所有数据权限2自定义数据权限3本部门数据权限4本部门及以下数据权限5仅本人数据权限 */
@Excel(name = "数据范围", readConverterExp = "1=所有数据权限,2=自定义数据权限,3=本部门数据权限,4=本部门及以下数据权限") @Excel(name = "数据范围", readConverterExp = "1=所有数据权限,2=自定义数据权限,3=本部门数据权限,4=本部门及以下数据权限,5=仅本人数据权限")
private String dataScope; private String dataScope;
/** 菜单树选择项是否关联显示( 0父子不互相关联显示 1父子互相关联显示 */
private boolean menuCheckStrictly;
/** 部门树选择项是否关联显示0父子不互相关联显示 1父子互相关联显示 */
private boolean deptCheckStrictly;
/** 角色状态0正常 1停用 */ /** 角色状态0正常 1停用 */
@Excel(name = "角色状态", readConverterExp = "0=正常,1=停用") @Excel(name = "角色状态", readConverterExp = "0=正常,1=停用")
private String status; private String status;
@ -128,6 +134,26 @@ public class SysRole extends BaseEntity
this.dataScope = dataScope; this.dataScope = dataScope;
} }
public boolean isMenuCheckStrictly()
{
return menuCheckStrictly;
}
public void setMenuCheckStrictly(boolean menuCheckStrictly)
{
this.menuCheckStrictly = menuCheckStrictly;
}
public boolean isDeptCheckStrictly()
{
return deptCheckStrictly;
}
public void setDeptCheckStrictly(boolean deptCheckStrictly)
{
this.deptCheckStrictly = deptCheckStrictly;
}
public String getStatus() public String getStatus()
{ {
return status; return status;
@ -186,6 +212,8 @@ public class SysRole extends BaseEntity
.append("roleKey", getRoleKey()) .append("roleKey", getRoleKey())
.append("roleSort", getRoleSort()) .append("roleSort", getRoleSort())
.append("dataScope", getDataScope()) .append("dataScope", getDataScope())
.append("menuCheckStrictly", isMenuCheckStrictly())
.append("deptCheckStrictly", isDeptCheckStrictly())
.append("status", getStatus()) .append("status", getStatus())
.append("delFlag", getDelFlag()) .append("delFlag", getDelFlag())
.append("createBy", getCreateBy()) .append("createBy", getCreateBy())

View File

@ -2,9 +2,7 @@ package com.ruoyi.common.core.domain.entity;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import javax.validation.constraints.Email; import javax.validation.constraints.*;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle; import org.apache.commons.lang3.builder.ToStringStyle;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
@ -14,6 +12,7 @@ import com.ruoyi.common.annotation.Excel.ColumnType;
import com.ruoyi.common.annotation.Excel.Type; import com.ruoyi.common.annotation.Excel.Type;
import com.ruoyi.common.annotation.Excels; import com.ruoyi.common.annotation.Excels;
import com.ruoyi.common.core.domain.BaseEntity; import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.common.xss.Xss;
/** /**
* 用户对象 sys_user * 用户对象 sys_user
@ -68,12 +67,12 @@ public class SysUser extends BaseEntity
/** 删除标志0代表存在 2代表删除 */ /** 删除标志0代表存在 2代表删除 */
private String delFlag; private String delFlag;
/** 最后登IP */ /** 最后登IP */
@Excel(name = "最后登IP", type = Type.EXPORT) @Excel(name = "最后登IP", type = Type.EXPORT)
private String loginIp; private String loginIp;
/** 最后登时间 */ /** 最后登时间 */
@Excel(name = "最后登时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Type.EXPORT) @Excel(name = "最后登时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Type.EXPORT)
private Date loginDate; private Date loginDate;
/** 部门对象 */ /** 部门对象 */
@ -92,6 +91,9 @@ public class SysUser extends BaseEntity
/** 岗位组 */ /** 岗位组 */
private Long[] postIds; private Long[] postIds;
/** 角色ID */
private Long roleId;
public SysUser() public SysUser()
{ {
@ -132,6 +134,7 @@ public class SysUser extends BaseEntity
this.deptId = deptId; this.deptId = deptId;
} }
@Xss(message = "用户昵称不能包含脚本字符")
@Size(min = 0, max = 30, message = "用户昵称长度不能超过30个字符") @Size(min = 0, max = 30, message = "用户昵称长度不能超过30个字符")
public String getNickName() public String getNickName()
{ {
@ -143,6 +146,7 @@ public class SysUser extends BaseEntity
this.nickName = nickName; this.nickName = nickName;
} }
@Xss(message = "用户账号不能包含脚本字符")
@NotBlank(message = "用户账号不能为空") @NotBlank(message = "用户账号不能为空")
@Size(min = 0, max = 30, message = "用户账号长度不能超过30个字符") @Size(min = 0, max = 30, message = "用户账号长度不能超过30个字符")
public String getUserName() public String getUserName()
@ -198,7 +202,7 @@ public class SysUser extends BaseEntity
this.avatar = avatar; this.avatar = avatar;
} }
@JsonIgnore @JsonIgnore
@JsonProperty @JsonProperty
public String getPassword() public String getPassword()
{ {
@ -300,6 +304,16 @@ public class SysUser extends BaseEntity
this.postIds = postIds; this.postIds = postIds;
} }
public Long getRoleId()
{
return roleId;
}
public void setRoleId(Long roleId)
{
this.roleId = roleId;
}
@Override @Override
public String toString() { public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)

View File

@ -25,7 +25,7 @@ public class LoginBody
/** /**
* 唯一标识 * 唯一标识
*/ */
private String uuid = ""; private String uuid;
public String getUsername() public String getUsername()
{ {

View File

@ -4,7 +4,7 @@ import java.util.Collection;
import java.util.Set; import java.util.Set;
import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetails;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.alibaba.fastjson.annotation.JSONField;
import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.entity.SysUser;
/** /**
@ -16,13 +16,23 @@ public class LoginUser implements UserDetails
{ {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
/**
* 用户ID
*/
private Long userId;
/**
* 部门ID
*/
private Long deptId;
/** /**
* 用户唯一标识 * 用户唯一标识
*/ */
private String token; private String token;
/** /**
* 登陆时间 * 时间
*/ */
private Long loginTime; private Long loginTime;
@ -61,6 +71,26 @@ public class LoginUser implements UserDetails
*/ */
private SysUser user; private SysUser user;
public Long getUserId()
{
return userId;
}
public void setUserId(Long userId)
{
this.userId = userId;
}
public Long getDeptId()
{
return deptId;
}
public void setDeptId(Long deptId)
{
this.deptId = deptId;
}
public String getToken() public String getToken()
{ {
return token; return token;
@ -81,7 +111,15 @@ public class LoginUser implements UserDetails
this.permissions = permissions; this.permissions = permissions;
} }
@JsonIgnore public LoginUser(Long userId, Long deptId, SysUser user, Set<String> permissions)
{
this.userId = userId;
this.deptId = deptId;
this.user = user;
this.permissions = permissions;
}
@JSONField(serialize = false)
@Override @Override
public String getPassword() public String getPassword()
{ {
@ -97,7 +135,7 @@ public class LoginUser implements UserDetails
/** /**
* 账户是否未过期,过期无法验证 * 账户是否未过期,过期无法验证
*/ */
@JsonIgnore @JSONField(serialize = false)
@Override @Override
public boolean isAccountNonExpired() public boolean isAccountNonExpired()
{ {
@ -109,7 +147,7 @@ public class LoginUser implements UserDetails
* *
* @return * @return
*/ */
@JsonIgnore @JSONField(serialize = false)
@Override @Override
public boolean isAccountNonLocked() public boolean isAccountNonLocked()
{ {
@ -121,7 +159,7 @@ public class LoginUser implements UserDetails
* *
* @return * @return
*/ */
@JsonIgnore @JSONField(serialize = false)
@Override @Override
public boolean isCredentialsNonExpired() public boolean isCredentialsNonExpired()
{ {
@ -133,7 +171,7 @@ public class LoginUser implements UserDetails
* *
* @return * @return
*/ */
@JsonIgnore @JSONField(serialize = false)
@Override @Override
public boolean isEnabled() public boolean isEnabled()
{ {

View File

@ -0,0 +1,11 @@
package com.ruoyi.common.core.domain.model;
/**
* 用户注册对象
*
* @author ruoyi
*/
public class RegisterBody extends LoginBody
{
}

View File

@ -1,72 +1,101 @@
package com.ruoyi.common.core.page; package com.ruoyi.common.core.page;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;
/** /**
* 分页数据 * 分页数据
* *
* @author ruoyi * @author ruoyi
*/ */
public class PageDomain public class PageDomain
{ {
/** 当前记录起始索引 */ /** 当前记录起始索引 */
private Integer pageNum; private Integer pageNum;
/** 每页显示记录数 */ /** 每页显示记录数 */
private Integer pageSize; private Integer pageSize;
/** 排序列 */ /** 排序列 */
private String orderByColumn; private String orderByColumn;
/** 排序的方向 "desc" 或者 "asc". */ /** 排序的方向desc或者asc */
private String isAsc; private String isAsc = "asc";
public String getOrderBy() /** 分页参数合理化 */
{ private Boolean reasonable = true;
if (StringUtils.isEmpty(orderByColumn))
{ public String getOrderBy()
return ""; {
} if (StringUtils.isEmpty(orderByColumn))
return StringUtils.toUnderScoreCase(orderByColumn) + " " + isAsc; {
} return "";
}
public Integer getPageNum() return StringUtils.toUnderScoreCase(orderByColumn) + " " + isAsc;
{ }
return pageNum;
} public Integer getPageNum()
{
public void setPageNum(Integer pageNum) return pageNum;
{ }
this.pageNum = pageNum;
} public void setPageNum(Integer pageNum)
{
public Integer getPageSize() this.pageNum = pageNum;
{ }
return pageSize;
} public Integer getPageSize()
{
public void setPageSize(Integer pageSize) return pageSize;
{ }
this.pageSize = pageSize;
} public void setPageSize(Integer pageSize)
{
public String getOrderByColumn() this.pageSize = pageSize;
{ }
return orderByColumn;
} public String getOrderByColumn()
{
public void setOrderByColumn(String orderByColumn) return orderByColumn;
{ }
this.orderByColumn = orderByColumn;
} public void setOrderByColumn(String orderByColumn)
{
public String getIsAsc() this.orderByColumn = orderByColumn;
{ }
return isAsc;
} public String getIsAsc()
{
public void setIsAsc(String isAsc) return isAsc;
{ }
this.isAsc = isAsc;
} public void setIsAsc(String isAsc)
} {
if (StringUtils.isNotEmpty(isAsc))
{
// 兼容前端排序类型
if ("ascending".equals(isAsc))
{
isAsc = "asc";
}
else if ("descending".equals(isAsc))
{
isAsc = "desc";
}
this.isAsc = isAsc;
}
}
public Boolean getReasonable()
{
if (StringUtils.isNull(reasonable))
{
return Boolean.TRUE;
}
return reasonable;
}
public void setReasonable(Boolean reasonable)
{
this.reasonable = reasonable;
}
}

View File

@ -1,5 +1,6 @@
package com.ruoyi.common.core.page; package com.ruoyi.common.core.page;
import com.ruoyi.common.core.text.Convert;
import com.ruoyi.common.utils.ServletUtils; import com.ruoyi.common.utils.ServletUtils;
/** /**
@ -29,16 +30,22 @@ public class TableSupport
*/ */
public static final String IS_ASC = "isAsc"; public static final String IS_ASC = "isAsc";
/**
* 分页参数合理化
*/
public static final String REASONABLE = "reasonable";
/** /**
* 封装分页对象 * 封装分页对象
*/ */
public static PageDomain getPageDomain() public static PageDomain getPageDomain()
{ {
PageDomain pageDomain = new PageDomain(); PageDomain pageDomain = new PageDomain();
pageDomain.setPageNum(ServletUtils.getParameterToInt(PAGE_NUM)); pageDomain.setPageNum(Convert.toInt(ServletUtils.getParameter(PAGE_NUM), 1));
pageDomain.setPageSize(ServletUtils.getParameterToInt(PAGE_SIZE)); pageDomain.setPageSize(Convert.toInt(ServletUtils.getParameter(PAGE_SIZE), 10));
pageDomain.setOrderByColumn(ServletUtils.getParameter(ORDER_BY_COLUMN)); pageDomain.setOrderByColumn(ServletUtils.getParameter(ORDER_BY_COLUMN));
pageDomain.setIsAsc(ServletUtils.getParameter(IS_ASC)); pageDomain.setIsAsc(ServletUtils.getParameter(IS_ASC));
pageDomain.setReasonable(ServletUtils.getParameterToBool(REASONABLE));
return pageDomain; return pageDomain;
} }

View File

@ -1,11 +1,13 @@
package com.ruoyi.common.core.redis; package com.ruoyi.common.core.redis;
import java.util.Collection; import java.util.Collection;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.BoundSetOperations;
import org.springframework.data.redis.core.HashOperations; import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations; import org.springframework.data.redis.core.ValueOperations;
@ -13,7 +15,7 @@ import org.springframework.stereotype.Component;
/** /**
* spring redis 工具类 * spring redis 工具类
* *
* @author ruoyi * @author ruoyi
**/ **/
@SuppressWarnings(value = { "unchecked", "rawtypes" }) @SuppressWarnings(value = { "unchecked", "rawtypes" })
@ -109,7 +111,7 @@ public class RedisCache
* 缓存List数据 * 缓存List数据
* *
* @param key 缓存的键值 * @param key 缓存的键值
* @param values 待缓存的List数据 * @param dataList 待缓存的List数据
* @return 缓存的对象 * @return 缓存的对象
*/ */
public <T> long setCacheList(final String key, final List<T> dataList) public <T> long setCacheList(final String key, final List<T> dataList)
@ -136,10 +138,15 @@ public class RedisCache
* @param dataSet 缓存的数据 * @param dataSet 缓存的数据
* @return 缓存数据的对象 * @return 缓存数据的对象
*/ */
public <T> long setCacheSet(final String key, final Set<T> dataSet) public <T> BoundSetOperations<String, T> setCacheSet(final String key, final Set<T> dataSet)
{ {
Long count = redisTemplate.opsForSet().add(key, dataSet); BoundSetOperations<String, T> setOperation = redisTemplate.boundSetOps(key);
return count == null ? 0 : count; Iterator<T> it = dataSet.iterator();
while (it.hasNext())
{
setOperation.add(it.next());
}
return setOperation;
} }
/** /**
@ -202,6 +209,18 @@ public class RedisCache
return opsForHash.get(key, hKey); return opsForHash.get(key, hKey);
} }
/**
* 删除Hash中的数据
*
* @param key
* @param hKey
*/
public void delCacheMapValue(final String key, final String hKey)
{
HashOperations hashOperations = redisTemplate.opsForHash();
hashOperations.delete(key, hKey);
}
/** /**
* 获取多个Hash中的数据 * 获取多个Hash中的数据
* *
@ -216,7 +235,7 @@ public class RedisCache
/** /**
* 获得缓存的基本对象列表 * 获得缓存的基本对象列表
* *
* @param pattern 字符串前缀 * @param pattern 字符串前缀
* @return 对象列表 * @return 对象列表
*/ */

View File

@ -66,7 +66,7 @@ public class CharsetKit
if (null == destCharset) if (null == destCharset)
{ {
srcCharset = StandardCharsets.UTF_8; destCharset = StandardCharsets.UTF_8;
} }
if (StringUtils.isEmpty(source) || srcCharset.equals(destCharset)) if (StringUtils.isEmpty(source) || srcCharset.equals(destCharset))

View File

@ -7,10 +7,11 @@ import java.nio.charset.Charset;
import java.text.NumberFormat; import java.text.NumberFormat;
import java.util.Set; import java.util.Set;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;
import org.apache.commons.lang3.ArrayUtils;
/** /**
* 类型转换器 * 类型转换器
* *
* @author ruoyi * @author ruoyi
*/ */
public class Convert public class Convert
@ -19,7 +20,7 @@ public class Convert
* 转换为字符串<br> * 转换为字符串<br>
* 如果给定的值为null或者转换失败返回默认值<br> * 如果给定的值为null或者转换失败返回默认值<br>
* 转换失败不会报错 * 转换失败不会报错
* *
* @param value 被转换的值 * @param value 被转换的值
* @param defaultValue 转换错误时的默认值 * @param defaultValue 转换错误时的默认值
* @return 结果 * @return 结果
@ -41,7 +42,7 @@ public class Convert
* 转换为字符串<br> * 转换为字符串<br>
* 如果给定的值为<code>null</code>或者转换失败返回默认值<code>null</code><br> * 如果给定的值为<code>null</code>或者转换失败返回默认值<code>null</code><br>
* 转换失败不会报错 * 转换失败不会报错
* *
* @param value 被转换的值 * @param value 被转换的值
* @return 结果 * @return 结果
*/ */
@ -54,7 +55,7 @@ public class Convert
* 转换为字符<br> * 转换为字符<br>
* 如果给定的值为null或者转换失败返回默认值<br> * 如果给定的值为null或者转换失败返回默认值<br>
* 转换失败不会报错 * 转换失败不会报错
* *
* @param value 被转换的值 * @param value 被转换的值
* @param defaultValue 转换错误时的默认值 * @param defaultValue 转换错误时的默认值
* @return 结果 * @return 结果
@ -78,7 +79,7 @@ public class Convert
* 转换为字符<br> * 转换为字符<br>
* 如果给定的值为<code>null</code>或者转换失败返回默认值<code>null</code><br> * 如果给定的值为<code>null</code>或者转换失败返回默认值<code>null</code><br>
* 转换失败不会报错 * 转换失败不会报错
* *
* @param value 被转换的值 * @param value 被转换的值
* @return 结果 * @return 结果
*/ */
@ -91,7 +92,7 @@ public class Convert
* 转换为byte<br> * 转换为byte<br>
* 如果给定的值为<code>null</code>或者转换失败返回默认值<br> * 如果给定的值为<code>null</code>或者转换失败返回默认值<br>
* 转换失败不会报错 * 转换失败不会报错
* *
* @param value 被转换的值 * @param value 被转换的值
* @param defaultValue 转换错误时的默认值 * @param defaultValue 转换错误时的默认值
* @return 结果 * @return 结果
@ -129,7 +130,7 @@ public class Convert
* 转换为byte<br> * 转换为byte<br>
* 如果给定的值为<code>null</code>或者转换失败返回默认值<code>null</code><br> * 如果给定的值为<code>null</code>或者转换失败返回默认值<code>null</code><br>
* 转换失败不会报错 * 转换失败不会报错
* *
* @param value 被转换的值 * @param value 被转换的值
* @return 结果 * @return 结果
*/ */
@ -142,7 +143,7 @@ public class Convert
* 转换为Short<br> * 转换为Short<br>
* 如果给定的值为<code>null</code>或者转换失败返回默认值<br> * 如果给定的值为<code>null</code>或者转换失败返回默认值<br>
* 转换失败不会报错 * 转换失败不会报错
* *
* @param value 被转换的值 * @param value 被转换的值
* @param defaultValue 转换错误时的默认值 * @param defaultValue 转换错误时的默认值
* @return 结果 * @return 结果
@ -180,7 +181,7 @@ public class Convert
* 转换为Short<br> * 转换为Short<br>
* 如果给定的值为<code>null</code>或者转换失败返回默认值<code>null</code><br> * 如果给定的值为<code>null</code>或者转换失败返回默认值<code>null</code><br>
* 转换失败不会报错 * 转换失败不会报错
* *
* @param value 被转换的值 * @param value 被转换的值
* @return 结果 * @return 结果
*/ */
@ -193,7 +194,7 @@ public class Convert
* 转换为Number<br> * 转换为Number<br>
* 如果给定的值为空或者转换失败返回默认值<br> * 如果给定的值为空或者转换失败返回默认值<br>
* 转换失败不会报错 * 转换失败不会报错
* *
* @param value 被转换的值 * @param value 被转换的值
* @param defaultValue 转换错误时的默认值 * @param defaultValue 转换错误时的默认值
* @return 结果 * @return 结果
@ -227,7 +228,7 @@ public class Convert
* 转换为Number<br> * 转换为Number<br>
* 如果给定的值为空或者转换失败返回默认值<code>null</code><br> * 如果给定的值为空或者转换失败返回默认值<code>null</code><br>
* 转换失败不会报错 * 转换失败不会报错
* *
* @param value 被转换的值 * @param value 被转换的值
* @return 结果 * @return 结果
*/ */
@ -240,7 +241,7 @@ public class Convert
* 转换为int<br> * 转换为int<br>
* 如果给定的值为空或者转换失败返回默认值<br> * 如果给定的值为空或者转换失败返回默认值<br>
* 转换失败不会报错 * 转换失败不会报错
* *
* @param value 被转换的值 * @param value 被转换的值
* @param defaultValue 转换错误时的默认值 * @param defaultValue 转换错误时的默认值
* @return 结果 * @return 结果
@ -278,7 +279,7 @@ public class Convert
* 转换为int<br> * 转换为int<br>
* 如果给定的值为<code>null</code>或者转换失败返回默认值<code>null</code><br> * 如果给定的值为<code>null</code>或者转换失败返回默认值<code>null</code><br>
* 转换失败不会报错 * 转换失败不会报错
* *
* @param value 被转换的值 * @param value 被转换的值
* @return 结果 * @return 结果
*/ */
@ -289,7 +290,7 @@ public class Convert
/** /**
* 转换为Integer数组<br> * 转换为Integer数组<br>
* *
* @param str 被转换的值 * @param str 被转换的值
* @return 结果 * @return 结果
*/ */
@ -300,7 +301,7 @@ public class Convert
/** /**
* 转换为Long数组<br> * 转换为Long数组<br>
* *
* @param str 被转换的值 * @param str 被转换的值
* @return 结果 * @return 结果
*/ */
@ -311,7 +312,7 @@ public class Convert
/** /**
* 转换为Integer数组<br> * 转换为Integer数组<br>
* *
* @param split 分隔符 * @param split 分隔符
* @param split 被转换的值 * @param split 被转换的值
* @return 结果 * @return 结果
@ -334,7 +335,7 @@ public class Convert
/** /**
* 转换为Long数组<br> * 转换为Long数组<br>
* *
* @param split 分隔符 * @param split 分隔符
* @param str 被转换的值 * @param str 被转换的值
* @return 结果 * @return 结果
@ -357,7 +358,7 @@ public class Convert
/** /**
* 转换为String数组<br> * 转换为String数组<br>
* *
* @param str 被转换的值 * @param str 被转换的值
* @return 结果 * @return 结果
*/ */
@ -368,7 +369,7 @@ public class Convert
/** /**
* 转换为String数组<br> * 转换为String数组<br>
* *
* @param split 分隔符 * @param split 分隔符
* @param split 被转换的值 * @param split 被转换的值
* @return 结果 * @return 结果
@ -382,7 +383,7 @@ public class Convert
* 转换为long<br> * 转换为long<br>
* 如果给定的值为空或者转换失败返回默认值<br> * 如果给定的值为空或者转换失败返回默认值<br>
* 转换失败不会报错 * 转换失败不会报错
* *
* @param value 被转换的值 * @param value 被转换的值
* @param defaultValue 转换错误时的默认值 * @param defaultValue 转换错误时的默认值
* @return 结果 * @return 结果
@ -421,7 +422,7 @@ public class Convert
* 转换为long<br> * 转换为long<br>
* 如果给定的值为<code>null</code>或者转换失败返回默认值<code>null</code><br> * 如果给定的值为<code>null</code>或者转换失败返回默认值<code>null</code><br>
* 转换失败不会报错 * 转换失败不会报错
* *
* @param value 被转换的值 * @param value 被转换的值
* @return 结果 * @return 结果
*/ */
@ -434,7 +435,7 @@ public class Convert
* 转换为double<br> * 转换为double<br>
* 如果给定的值为空或者转换失败返回默认值<br> * 如果给定的值为空或者转换失败返回默认值<br>
* 转换失败不会报错 * 转换失败不会报错
* *
* @param value 被转换的值 * @param value 被转换的值
* @param defaultValue 转换错误时的默认值 * @param defaultValue 转换错误时的默认值
* @return 结果 * @return 结果
@ -473,7 +474,7 @@ public class Convert
* 转换为double<br> * 转换为double<br>
* 如果给定的值为空或者转换失败返回默认值<code>null</code><br> * 如果给定的值为空或者转换失败返回默认值<code>null</code><br>
* 转换失败不会报错 * 转换失败不会报错
* *
* @param value 被转换的值 * @param value 被转换的值
* @return 结果 * @return 结果
*/ */
@ -486,7 +487,7 @@ public class Convert
* 转换为Float<br> * 转换为Float<br>
* 如果给定的值为空或者转换失败返回默认值<br> * 如果给定的值为空或者转换失败返回默认值<br>
* 转换失败不会报错 * 转换失败不会报错
* *
* @param value 被转换的值 * @param value 被转换的值
* @param defaultValue 转换错误时的默认值 * @param defaultValue 转换错误时的默认值
* @return 结果 * @return 结果
@ -524,7 +525,7 @@ public class Convert
* 转换为Float<br> * 转换为Float<br>
* 如果给定的值为空或者转换失败返回默认值<code>null</code><br> * 如果给定的值为空或者转换失败返回默认值<code>null</code><br>
* 转换失败不会报错 * 转换失败不会报错
* *
* @param value 被转换的值 * @param value 被转换的值
* @return 结果 * @return 结果
*/ */
@ -537,7 +538,7 @@ public class Convert
* 转换为boolean<br> * 转换为boolean<br>
* String支持的值为truefalseyesokno1,0 如果给定的值为空或者转换失败返回默认值<br> * String支持的值为truefalseyesokno1,0 如果给定的值为空或者转换失败返回默认值<br>
* 转换失败不会报错 * 转换失败不会报错
* *
* @param value 被转换的值 * @param value 被转换的值
* @param defaultValue 转换错误时的默认值 * @param defaultValue 转换错误时的默认值
* @return 结果 * @return 结果
@ -583,7 +584,7 @@ public class Convert
* 转换为boolean<br> * 转换为boolean<br>
* 如果给定的值为空或者转换失败返回默认值<code>null</code><br> * 如果给定的值为空或者转换失败返回默认值<code>null</code><br>
* 转换失败不会报错 * 转换失败不会报错
* *
* @param value 被转换的值 * @param value 被转换的值
* @return 结果 * @return 结果
*/ */
@ -595,7 +596,7 @@ public class Convert
/** /**
* 转换为Enum对象<br> * 转换为Enum对象<br>
* 如果给定的值为空或者转换失败返回默认值<br> * 如果给定的值为空或者转换失败返回默认值<br>
* *
* @param clazz Enum的Class * @param clazz Enum的Class
* @param value * @param value
* @param defaultValue 默认值 * @param defaultValue 默认值
@ -631,7 +632,7 @@ public class Convert
/** /**
* 转换为Enum对象<br> * 转换为Enum对象<br>
* 如果给定的值为空或者转换失败返回默认值<code>null</code><br> * 如果给定的值为空或者转换失败返回默认值<code>null</code><br>
* *
* @param clazz Enum的Class * @param clazz Enum的Class
* @param value * @param value
* @return Enum * @return Enum
@ -645,7 +646,7 @@ public class Convert
* 转换为BigInteger<br> * 转换为BigInteger<br>
* 如果给定的值为空或者转换失败返回默认值<br> * 如果给定的值为空或者转换失败返回默认值<br>
* 转换失败不会报错 * 转换失败不会报错
* *
* @param value 被转换的值 * @param value 被转换的值
* @param defaultValue 转换错误时的默认值 * @param defaultValue 转换错误时的默认值
* @return 结果 * @return 结果
@ -683,7 +684,7 @@ public class Convert
* 转换为BigInteger<br> * 转换为BigInteger<br>
* 如果给定的值为空或者转换失败返回默认值<code>null</code><br> * 如果给定的值为空或者转换失败返回默认值<code>null</code><br>
* 转换失败不会报错 * 转换失败不会报错
* *
* @param value 被转换的值 * @param value 被转换的值
* @return 结果 * @return 结果
*/ */
@ -696,7 +697,7 @@ public class Convert
* 转换为BigDecimal<br> * 转换为BigDecimal<br>
* 如果给定的值为空或者转换失败返回默认值<br> * 如果给定的值为空或者转换失败返回默认值<br>
* 转换失败不会报错 * 转换失败不会报错
* *
* @param value 被转换的值 * @param value 被转换的值
* @param defaultValue 转换错误时的默认值 * @param defaultValue 转换错误时的默认值
* @return 结果 * @return 结果
@ -742,7 +743,7 @@ public class Convert
* 转换为BigDecimal<br> * 转换为BigDecimal<br>
* 如果给定的值为空或者转换失败返回默认值<br> * 如果给定的值为空或者转换失败返回默认值<br>
* 转换失败不会报错 * 转换失败不会报错
* *
* @param value 被转换的值 * @param value 被转换的值
* @return 结果 * @return 结果
*/ */
@ -754,7 +755,7 @@ public class Convert
/** /**
* 将对象转为字符串<br> * 将对象转为字符串<br>
* 1Byte数组和ByteBuffer会被转换为对应字符串的数组 2对象数组会调用Arrays.toString方法 * 1Byte数组和ByteBuffer会被转换为对应字符串的数组 2对象数组会调用Arrays.toString方法
* *
* @param obj 对象 * @param obj 对象
* @return 字符串 * @return 字符串
*/ */
@ -766,7 +767,7 @@ public class Convert
/** /**
* 将对象转为字符串<br> * 将对象转为字符串<br>
* 1Byte数组和ByteBuffer会被转换为对应字符串的数组 2对象数组会调用Arrays.toString方法 * 1Byte数组和ByteBuffer会被转换为对应字符串的数组 2对象数组会调用Arrays.toString方法
* *
* @param obj 对象 * @param obj 对象
* @param charsetName 字符集 * @param charsetName 字符集
* @return 字符串 * @return 字符串
@ -779,7 +780,7 @@ public class Convert
/** /**
* 将对象转为字符串<br> * 将对象转为字符串<br>
* 1Byte数组和ByteBuffer会被转换为对应字符串的数组 2对象数组会调用Arrays.toString方法 * 1Byte数组和ByteBuffer会被转换为对应字符串的数组 2对象数组会调用Arrays.toString方法
* *
* @param obj 对象 * @param obj 对象
* @param charset 字符集 * @param charset 字符集
* @return 字符串 * @return 字符串
@ -795,9 +796,14 @@ public class Convert
{ {
return (String) obj; return (String) obj;
} }
else if (obj instanceof byte[] || obj instanceof Byte[]) else if (obj instanceof byte[])
{ {
return str((Byte[]) obj, charset); return str((byte[]) obj, charset);
}
else if (obj instanceof Byte[])
{
byte[] bytes = ArrayUtils.toPrimitive((Byte[]) obj);
return str(bytes, charset);
} }
else if (obj instanceof ByteBuffer) else if (obj instanceof ByteBuffer)
{ {
@ -808,7 +814,7 @@ public class Convert
/** /**
* 将byte数组转为字符串 * 将byte数组转为字符串
* *
* @param bytes byte数组 * @param bytes byte数组
* @param charset 字符集 * @param charset 字符集
* @return 字符串 * @return 字符串
@ -820,7 +826,7 @@ public class Convert
/** /**
* 解码字节码 * 解码字节码
* *
* @param data 字符串 * @param data 字符串
* @param charset 字符集如果此字段为空则解码的结果取决于平台 * @param charset 字符集如果此字段为空则解码的结果取决于平台
* @return 解码后的字符串 * @return 解码后的字符串
@ -841,7 +847,7 @@ public class Convert
/** /**
* 将编码的byteBuffer数据转换为字符串 * 将编码的byteBuffer数据转换为字符串
* *
* @param data 数据 * @param data 数据
* @param charset 字符集如果为空使用当前系统字符集 * @param charset 字符集如果为空使用当前系统字符集
* @return 字符串 * @return 字符串
@ -858,7 +864,7 @@ public class Convert
/** /**
* 将编码的byteBuffer数据转换为字符串 * 将编码的byteBuffer数据转换为字符串
* *
* @param data 数据 * @param data 数据
* @param charset 字符集如果为空使用当前系统字符集 * @param charset 字符集如果为空使用当前系统字符集
* @return 字符串 * @return 字符串
@ -875,7 +881,7 @@ public class Convert
// ----------------------------------------------------------------------- 全角半角转换 // ----------------------------------------------------------------------- 全角半角转换
/** /**
* 半角转全角 * 半角转全角
* *
* @param input String. * @param input String.
* @return 全角字符串. * @return 全角字符串.
*/ */
@ -886,7 +892,7 @@ public class Convert
/** /**
* 半角转全角 * 半角转全角
* *
* @param input String * @param input String
* @param notConvertSet 不替换的字符集合 * @param notConvertSet 不替换的字符集合
* @return 全角字符串. * @return 全角字符串.
@ -917,7 +923,7 @@ public class Convert
/** /**
* 全角转半角 * 全角转半角
* *
* @param input String. * @param input String.
* @return 半角字符串 * @return 半角字符串
*/ */
@ -928,7 +934,7 @@ public class Convert
/** /**
* 替换全角为半角 * 替换全角为半角
* *
* @param text 文本 * @param text 文本
* @param notConvertSet 不替换的字符集合 * @param notConvertSet 不替换的字符集合
* @return 替换后的字符 * @return 替换后的字符
@ -960,7 +966,7 @@ public class Convert
/** /**
* 数字金额大写转换 先写个完整的然后将如零拾替换成零 * 数字金额大写转换 先写个完整的然后将如零拾替换成零
* *
* @param n 数字 * @param n 数字
* @return 中文大写数字 * @return 中文大写数字
*/ */

View File

@ -0,0 +1,20 @@
package com.ruoyi.common.enums;
/**
* 限流类型
*
* @author ruoyi
*/
public enum LimitType
{
/**
* 默认策略全局限流
*/
DEFAULT,
/**
* 根据请求者IP进行限流
*/
IP
}

View File

@ -1,43 +0,0 @@
package com.ruoyi.common.exception;
/**
* 自定义异常
*
* @author ruoyi
*/
public class CustomException extends RuntimeException
{
private static final long serialVersionUID = 1L;
private Integer code;
private String message;
public CustomException(String message)
{
this.message = message;
}
public CustomException(String message, Integer code)
{
this.message = message;
this.code = code;
}
public CustomException(String message, Throwable e)
{
super(message, e);
this.message = message;
}
@Override
public String getMessage()
{
return message;
}
public Integer getCode()
{
return code;
}
}

View File

@ -0,0 +1,58 @@
package com.ruoyi.common.exception;
/**
* 全局异常
*
* @author ruoyi
*/
public class GlobalException extends RuntimeException
{
private static final long serialVersionUID = 1L;
/**
* 错误提示
*/
private String message;
/**
* 错误明细内部调试错误
*
* {@link CommonResult#getDetailMessage()} 一致的设计
*/
private String detailMessage;
/**
* 空构造方法避免反序列化问题
*/
public GlobalException()
{
}
public GlobalException(String message)
{
this.message = message;
}
public String getDetailMessage()
{
return detailMessage;
}
public GlobalException setDetailMessage(String detailMessage)
{
this.detailMessage = detailMessage;
return this;
}
public String getMessage()
{
return message;
}
public GlobalException setMessage(String message)
{
this.message = message;
return this;
}
}

View File

@ -0,0 +1,73 @@
package com.ruoyi.common.exception;
/**
* 业务异常
*
* @author ruoyi
*/
public final class ServiceException extends RuntimeException
{
private static final long serialVersionUID = 1L;
/**
* 错误码
*/
private Integer code;
/**
* 错误提示
*/
private String message;
/**
* 错误明细内部调试错误
*
* {@link CommonResult#getDetailMessage()} 一致的设计
*/
private String detailMessage;
/**
* 空构造方法避免反序列化问题
*/
public ServiceException()
{
}
public ServiceException(String message)
{
this.message = message;
}
public ServiceException(String message, Integer code)
{
this.message = message;
this.code = code;
}
public String getDetailMessage()
{
return detailMessage;
}
public String getMessage()
{
return message;
}
public Integer getCode()
{
return code;
}
public ServiceException setMessage(String message)
{
this.message = message;
return this;
}
public ServiceException setDetailMessage(String detailMessage)
{
this.detailMessage = detailMessage;
return this;
}
}

View File

@ -1,4 +1,4 @@
package com.ruoyi.common.exception; package com.ruoyi.common.exception.base;
import com.ruoyi.common.utils.MessageUtils; import com.ruoyi.common.utils.MessageUtils;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;

View File

@ -1,6 +1,6 @@
package com.ruoyi.common.exception.file; package com.ruoyi.common.exception.file;
import com.ruoyi.common.exception.BaseException; import com.ruoyi.common.exception.base.BaseException;
/** /**
* 文件信息异常类 * 文件信息异常类

View File

@ -68,4 +68,14 @@ public class InvalidExtensionException extends FileUploadException
super(allowedExtension, extension, filename); super(allowedExtension, extension, filename);
} }
} }
public static class InvalidVideoExtensionException extends InvalidExtensionException
{
private static final long serialVersionUID = 1L;
public InvalidVideoExtensionException(String[] allowedExtension, String extension, String filename)
{
super(allowedExtension, extension, filename);
}
}
} }

View File

@ -1,6 +1,6 @@
package com.ruoyi.common.exception.user; package com.ruoyi.common.exception.user;
import com.ruoyi.common.exception.BaseException; import com.ruoyi.common.exception.base.BaseException;
/** /**
* 用户信息异常类 * 用户信息异常类

View File

@ -29,8 +29,8 @@ public class RepeatableFilter implements Filter
throws IOException, ServletException throws IOException, ServletException
{ {
ServletRequest requestWrapper = null; ServletRequest requestWrapper = null;
if (request instanceof HttpServletRequest && StringUtils.equalsAnyIgnoreCase(request.getContentType(), if (request instanceof HttpServletRequest
MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_JSON_UTF8_VALUE)) && StringUtils.startsWithIgnoreCase(request.getContentType(), MediaType.APPLICATION_JSON_VALUE))
{ {
requestWrapper = new RepeatedlyRequestWrapper((HttpServletRequest) request, response); requestWrapper = new RepeatedlyRequestWrapper((HttpServletRequest) request, response);
} }

View File

@ -38,18 +38,21 @@ public class RepeatedlyRequestWrapper extends HttpServletRequestWrapper
@Override @Override
public ServletInputStream getInputStream() throws IOException public ServletInputStream getInputStream() throws IOException
{ {
final ByteArrayInputStream bais = new ByteArrayInputStream(body); final ByteArrayInputStream bais = new ByteArrayInputStream(body);
return new ServletInputStream() return new ServletInputStream()
{ {
@Override @Override
public int read() throws IOException public int read() throws IOException
{ {
return bais.read(); return bais.read();
} }
@Override
public int available() throws IOException
{
return body.length;
}
@Override @Override
public boolean isFinished() public boolean isFinished()
{ {

View File

@ -3,8 +3,6 @@ package com.ruoyi.common.filter;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.Filter; import javax.servlet.Filter;
import javax.servlet.FilterChain; import javax.servlet.FilterChain;
import javax.servlet.FilterConfig; import javax.servlet.FilterConfig;
@ -27,16 +25,10 @@ public class XssFilter implements Filter
*/ */
public List<String> excludes = new ArrayList<>(); public List<String> excludes = new ArrayList<>();
/**
* xss过滤开关
*/
public boolean enabled = false;
@Override @Override
public void init(FilterConfig filterConfig) throws ServletException public void init(FilterConfig filterConfig) throws ServletException
{ {
String tempExcludes = filterConfig.getInitParameter("excludes"); String tempExcludes = filterConfig.getInitParameter("excludes");
String tempEnabled = filterConfig.getInitParameter("enabled");
if (StringUtils.isNotEmpty(tempExcludes)) if (StringUtils.isNotEmpty(tempExcludes))
{ {
String[] url = tempExcludes.split(","); String[] url = tempExcludes.split(",");
@ -45,10 +37,6 @@ public class XssFilter implements Filter
excludes.add(url[i]); excludes.add(url[i]);
} }
} }
if (StringUtils.isNotEmpty(tempEnabled))
{
enabled = Boolean.valueOf(tempEnabled);
}
} }
@Override @Override
@ -68,25 +56,14 @@ public class XssFilter implements Filter
private boolean handleExcludeURL(HttpServletRequest request, HttpServletResponse response) private boolean handleExcludeURL(HttpServletRequest request, HttpServletResponse response)
{ {
if (!enabled) String url = request.getServletPath();
String method = request.getMethod();
// GET DELETE 不过滤
if (method == null || method.matches("GET") || method.matches("DELETE"))
{ {
return true; return true;
} }
if (excludes == null || excludes.isEmpty()) return StringUtils.matches(url, excludes);
{
return false;
}
String url = request.getServletPath();
for (String pattern : excludes)
{
Pattern p = Pattern.compile("^" + pattern);
Matcher m = p.matcher(url);
if (m.find())
{
return true;
}
}
return false;
} }
@Override @Override

View File

@ -63,7 +63,8 @@ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper
// xss过滤 // xss过滤
json = EscapeUtil.clean(json).trim(); json = EscapeUtil.clean(json).trim();
final ByteArrayInputStream bis = new ByteArrayInputStream(json.getBytes("utf-8")); byte[] jsonBytes = json.getBytes("utf-8");
final ByteArrayInputStream bis = new ByteArrayInputStream(jsonBytes);
return new ServletInputStream() return new ServletInputStream()
{ {
@Override @Override
@ -78,6 +79,12 @@ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper
return true; return true;
} }
@Override
public int available() throws IOException
{
return jsonBytes.length;
}
@Override @Override
public void setReadListener(ReadListener readListener) public void setReadListener(ReadListener readListener)
{ {
@ -99,7 +106,6 @@ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper
public boolean isJsonRequest() public boolean isJsonRequest()
{ {
String header = super.getHeader(HttpHeaders.CONTENT_TYPE); String header = super.getHeader(HttpHeaders.CONTENT_TYPE);
return MediaType.APPLICATION_JSON_VALUE.equalsIgnoreCase(header) return StringUtils.startsWithIgnoreCase(header, MediaType.APPLICATION_JSON_VALUE);
|| MediaType.APPLICATION_JSON_UTF8_VALUE.equalsIgnoreCase(header);
} }
} }

View File

@ -1,114 +1,114 @@
package com.ruoyi.common.utils; package com.ruoyi.common.utils;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
/** /**
* 精确的浮点数运算 * 精确的浮点数运算
* *
* @author ruoyi * @author ruoyi
*/ */
public class Arith public class Arith
{ {
/** 默认除法运算精度 */ /** 默认除法运算精度 */
private static final int DEF_DIV_SCALE = 10; private static final int DEF_DIV_SCALE = 10;
/** 这个类不能实例化 */ /** 这个类不能实例化 */
private Arith() private Arith()
{ {
} }
/** /**
* 提供精确的加法运算 * 提供精确的加法运算
* @param v1 被加数 * @param v1 被加数
* @param v2 加数 * @param v2 加数
* @return 两个参数的和 * @return 两个参数的和
*/ */
public static double add(double v1, double v2) public static double add(double v1, double v2)
{ {
BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2)); BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.add(b2).doubleValue(); return b1.add(b2).doubleValue();
} }
/** /**
* 提供精确的减法运算 * 提供精确的减法运算
* @param v1 被减数 * @param v1 被减数
* @param v2 减数 * @param v2 减数
* @return 两个参数的差 * @return 两个参数的差
*/ */
public static double sub(double v1, double v2) public static double sub(double v1, double v2)
{ {
BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2)); BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.subtract(b2).doubleValue(); return b1.subtract(b2).doubleValue();
} }
/** /**
* 提供精确的乘法运算 * 提供精确的乘法运算
* @param v1 被乘数 * @param v1 被乘数
* @param v2 乘数 * @param v2 乘数
* @return 两个参数的积 * @return 两个参数的积
*/ */
public static double mul(double v1, double v2) public static double mul(double v1, double v2)
{ {
BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2)); BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.multiply(b2).doubleValue(); return b1.multiply(b2).doubleValue();
} }
/** /**
* 提供相对精确的除法运算当发生除不尽的情况时精确到 * 提供相对精确的除法运算当发生除不尽的情况时精确到
* 小数点以后10位以后的数字四舍五入 * 小数点以后10位以后的数字四舍五入
* @param v1 被除数 * @param v1 被除数
* @param v2 除数 * @param v2 除数
* @return 两个参数的商 * @return 两个参数的商
*/ */
public static double div(double v1, double v2) public static double div(double v1, double v2)
{ {
return div(v1, v2, DEF_DIV_SCALE); return div(v1, v2, DEF_DIV_SCALE);
} }
/** /**
* 提供相对精确的除法运算当发生除不尽的情况时由scale参数指 * 提供相对精确的除法运算当发生除不尽的情况时由scale参数指
* 定精度以后的数字四舍五入 * 定精度以后的数字四舍五入
* @param v1 被除数 * @param v1 被除数
* @param v2 除数 * @param v2 除数
* @param scale 表示表示需要精确到小数点以后几位 * @param scale 表示表示需要精确到小数点以后几位
* @return 两个参数的商 * @return 两个参数的商
*/ */
public static double div(double v1, double v2, int scale) public static double div(double v1, double v2, int scale)
{ {
if (scale < 0) if (scale < 0)
{ {
throw new IllegalArgumentException( throw new IllegalArgumentException(
"The scale must be a positive integer or zero"); "The scale must be a positive integer or zero");
} }
BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2)); BigDecimal b2 = new BigDecimal(Double.toString(v2));
if (b1.compareTo(BigDecimal.ZERO) == 0) if (b1.compareTo(BigDecimal.ZERO) == 0)
{ {
return BigDecimal.ZERO.doubleValue(); return BigDecimal.ZERO.doubleValue();
} }
return b1.divide(b2, scale, RoundingMode.HALF_UP).doubleValue(); return b1.divide(b2, scale, RoundingMode.HALF_UP).doubleValue();
} }
/** /**
* 提供精确的小数位四舍五入处理 * 提供精确的小数位四舍五入处理
* @param v 需要四舍五入的数字 * @param v 需要四舍五入的数字
* @param scale 小数点后保留几位 * @param scale 小数点后保留几位
* @return 四舍五入后的结果 * @return 四舍五入后的结果
*/ */
public static double round(double v, int scale) public static double round(double v, int scale)
{ {
if (scale < 0) if (scale < 0)
{ {
throw new IllegalArgumentException( throw new IllegalArgumentException(
"The scale must be a positive integer or zero"); "The scale must be a positive integer or zero");
} }
BigDecimal b = new BigDecimal(Double.toString(v)); BigDecimal b = new BigDecimal(Double.toString(v));
BigDecimal one = new BigDecimal("1"); BigDecimal one = BigDecimal.ONE;
return b.divide(one, scale, RoundingMode.HALF_UP).doubleValue(); return b.divide(one, scale, RoundingMode.HALF_UP).doubleValue();
} }
} }

View File

@ -3,6 +3,11 @@ package com.ruoyi.common.utils;
import java.lang.management.ManagementFactory; import java.lang.management.ManagementFactory;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Date; import java.util.Date;
import org.apache.commons.lang3.time.DateFormatUtils; import org.apache.commons.lang3.time.DateFormatUtils;
@ -22,7 +27,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss"; public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss"; public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
private static String[] parsePatterns = { private static String[] parsePatterns = {
"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM",
"yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM", "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
@ -121,7 +126,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
return null; return null;
} }
} }
/** /**
* 获取服务器启动时间 * 获取服务器启动时间
*/ */
@ -131,6 +136,14 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
return new Date(time); return new Date(time);
} }
/**
* 计算相差天数
*/
public static int differentDaysByMillisecond(Date date1, Date date2)
{
return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24)));
}
/** /**
* 计算两个时间差 * 计算两个时间差
*/ */
@ -152,4 +165,23 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
// long sec = diff % nd % nh % nm / ns; // long sec = diff % nd % nh % nm / ns;
return day + "" + hour + "小时" + min + "分钟"; return day + "" + hour + "小时" + min + "分钟";
} }
/**
* 增加 LocalDateTime ==> Date
*/
public static Date toDate(LocalDateTime temporalAccessor)
{
ZonedDateTime zdt = temporalAccessor.atZone(ZoneId.systemDefault());
return Date.from(zdt.toInstant());
}
/**
* 增加 LocalDate ==> Date
*/
public static Date toDate(LocalDate temporalAccessor)
{
LocalDateTime localDateTime = LocalDateTime.of(temporalAccessor, LocalTime.of(0, 0, 0));
ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault());
return Date.from(zdt.toInstant());
}
} }

View File

@ -2,7 +2,6 @@ package com.ruoyi.common.utils;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.entity.SysDictData; import com.ruoyi.common.core.domain.entity.SysDictData;
import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.core.redis.RedisCache;
@ -15,6 +14,11 @@ import com.ruoyi.common.utils.spring.SpringUtils;
*/ */
public class DictUtils public class DictUtils
{ {
/**
* 分隔符
*/
public static final String SEPARATOR = ",";
/** /**
* 设置字典缓存 * 设置字典缓存
* *
@ -37,12 +41,125 @@ public class DictUtils
Object cacheObj = SpringUtils.getBean(RedisCache.class).getCacheObject(getCacheKey(key)); Object cacheObj = SpringUtils.getBean(RedisCache.class).getCacheObject(getCacheKey(key));
if (StringUtils.isNotNull(cacheObj)) if (StringUtils.isNotNull(cacheObj))
{ {
List<SysDictData> DictDatas = StringUtils.cast(cacheObj); return StringUtils.cast(cacheObj);
return DictDatas;
} }
return null; return null;
} }
/**
* 根据字典类型和字典值获取字典标签
*
* @param dictType 字典类型
* @param dictValue 字典值
* @return 字典标签
*/
public static String getDictLabel(String dictType, String dictValue)
{
return getDictLabel(dictType, dictValue, SEPARATOR);
}
/**
* 根据字典类型和字典标签获取字典值
*
* @param dictType 字典类型
* @param dictLabel 字典标签
* @return 字典值
*/
public static String getDictValue(String dictType, String dictLabel)
{
return getDictValue(dictType, dictLabel, SEPARATOR);
}
/**
* 根据字典类型和字典值获取字典标签
*
* @param dictType 字典类型
* @param dictValue 字典值
* @param separator 分隔符
* @return 字典标签
*/
public static String getDictLabel(String dictType, String dictValue, String separator)
{
StringBuilder propertyString = new StringBuilder();
List<SysDictData> datas = getDictCache(dictType);
if (StringUtils.containsAny(separator, dictValue) && StringUtils.isNotEmpty(datas))
{
for (SysDictData dict : datas)
{
for (String value : dictValue.split(separator))
{
if (value.equals(dict.getDictValue()))
{
propertyString.append(dict.getDictLabel()).append(separator);
break;
}
}
}
}
else
{
for (SysDictData dict : datas)
{
if (dictValue.equals(dict.getDictValue()))
{
return dict.getDictLabel();
}
}
}
return StringUtils.stripEnd(propertyString.toString(), separator);
}
/**
* 根据字典类型和字典标签获取字典值
*
* @param dictType 字典类型
* @param dictLabel 字典标签
* @param separator 分隔符
* @return 字典值
*/
public static String getDictValue(String dictType, String dictLabel, String separator)
{
StringBuilder propertyString = new StringBuilder();
List<SysDictData> datas = getDictCache(dictType);
if (StringUtils.containsAny(separator, dictLabel) && StringUtils.isNotEmpty(datas))
{
for (SysDictData dict : datas)
{
for (String label : dictLabel.split(separator))
{
if (label.equals(dict.getDictLabel()))
{
propertyString.append(dict.getDictValue()).append(separator);
break;
}
}
}
}
else
{
for (SysDictData dict : datas)
{
if (dictLabel.equals(dict.getDictLabel()))
{
return dict.getDictValue();
}
}
}
return StringUtils.stripEnd(propertyString.toString(), separator);
}
/**
* 删除指定字典缓存
*
* @param key 字典键
*/
public static void removeDictCache(String key)
{
SpringUtils.getBean(RedisCache.class).deleteObject(getCacheKey(key));
}
/** /**
* 清空字典缓存 * 清空字典缓存
*/ */

View File

@ -18,11 +18,10 @@ public class ExceptionUtil
{ {
StringWriter sw = new StringWriter(); StringWriter sw = new StringWriter();
e.printStackTrace(new PrintWriter(sw, true)); e.printStackTrace(new PrintWriter(sw, true));
String str = sw.toString(); return sw.toString();
return str;
} }
public static String getRootErrorMseeage(Exception e) public static String getRootErrorMessage(Exception e)
{ {
Throwable root = ExceptionUtils.getRootCause(e); Throwable root = ExceptionUtils.getRootCause(e);
root = (root == null ? e : root); root = (root == null ? e : root);

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