diff --git a/.gitee/ISSUE_TEMPLATE.zh-CN.md b/.gitee/ISSUE_TEMPLATE.zh-CN.md new file mode 100644 index 000000000..22cb51d52 --- /dev/null +++ b/.gitee/ISSUE_TEMPLATE.zh-CN.md @@ -0,0 +1,13 @@ +### 使用版本 + + +### 问题描述 + + +### 希望结果 + + +### 重现步骤 + + +### 报错信息(截图为主 请勿发混乱格式) \ No newline at end of file diff --git a/.gitee/PULL_REQUEST_TEMPLATE.zh-CN.md b/.gitee/PULL_REQUEST_TEMPLATE.zh-CN.md new file mode 100644 index 000000000..9429a8e86 --- /dev/null +++ b/.gitee/PULL_REQUEST_TEMPLATE.zh-CN.md @@ -0,0 +1,7 @@ +### 更改目的 解决了什么问题 + + +### 描述 做了哪些改动 + + +### 测试 都做了哪些测试(未经过测试不采纳) \ No newline at end of file diff --git a/.gitignore b/.gitignore index 4fbb2fe73..9e339689d 100644 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,9 @@ target/ *.iml *.ipr +### JRebel ### +rebel.xml + ### NetBeans ### nbproject/private/ build/* diff --git a/README.md b/README.md index d5c45c7cc..d6a2409a5 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ [![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/blob/master/LICENSE) [![使用IntelliJ IDEA开发维护](https://img.shields.io/badge/IntelliJ%20IDEA-提供支持-blue.svg)](https://www.jetbrains.com/?from=RuoYi-Vue-Plus)
-[![RuoYi-Vue-Plus](https://img.shields.io/badge/RuoYi_Vue_Plus-3.5.0-success.svg)](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus) +[![RuoYi-Vue-Plus](https://img.shields.io/badge/RuoYi_Vue_Plus-4.0.1-success.svg)](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus) [![Spring Boot](https://img.shields.io/badge/Spring%20Boot-2.5-blue.svg)]() [![JDK-8+](https://img.shields.io/badge/JDK-8-green.svg)]() [![JDK-11](https://img.shields.io/badge/JDK-11-green.svg)]() @@ -13,39 +13,40 @@ > 系统演示: [传送门](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/系统演示?sort_id=4836388) -| 功能介绍 | 使用技术 | 文档地址 | 特性注意事项 | -|-----------|------------------------|---------------------------------------------------------------------------------------------------|--------------------------| -| 当前框架 | RuoYi-Vue-Plus | [RuoYi-Vue-Plus文档](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/pages) | 重写RuoYi-Vue全方位升级(不兼容原框架) | -| 单体分支 | RuoYi-Vue-Plus-fast | [fast分支地址](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/tree/fast/) | 单体应用结构 | -| Vue3分支 | RuoYi-Vue-Plus-UI | [UI地址](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus-UI) | 由于组件还未完善 仅供学习 | -| 原框架 | RuoYi-Vue | [RuoYi-Vue官网](http://ruoyi.vip/) | 定期同步需要的功能 | -| 前端开发框架 | Vue、Element UI | [Element UI官网](https://element.eleme.cn/#/zh-CN) | | -| 后端开发框架 | SpringBoot | [SpringBoot官网](https://spring.io/projects/spring-boot/#learn) | | -| 容器框架 | Undertow | [Undertow官网](https://undertow.io/) | 基于 XNIO 的高性能容器 | -| 权限认证框架 | Sa-Token、Jwt | [Sa-Token官网](https://sa-token.dev33.cn/) | 强解耦、强扩展 | -| 关系数据库 | MySQL | [MySQL官网](https://dev.mysql.com/) | 适配 8.X 最低 5.7 | -| 缓存数据库 | Redis | [Redis官网](https://redis.io/) | 适配 6.X 最低 4.X | -| 数据库框架 | Mybatis-Plus | [Mybatis-Plus文档](https://baomidou.com/guide/) | 快速 CRUD 增加开发效率 | -| 数据库框架 | p6spy | [p6spy官网](https://p6spy.readthedocs.io/) | 更强劲的 SQL 分析 | -| 多数据源框架 | dynamic-datasource | [dynamic-ds文档](https://www.kancloud.cn/tracy5546/dynamic-datasource/content) | 支持主从与多种类数据库异构 | -| 序列化框架 | Jackson | [Jackson官网](https://github.com/FasterXML/jackson) | 统一使用 jackson 高效可靠 | -| Redis客户端 | Redisson | [Redisson文档](https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95) | 支持单机、集群配置 | -| 分布式限流 | Redisson | [Redisson文档](https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95) | 全局、请求IP、集群ID 多种限流 | -| 分布式队列 | Redisson | [Redisson文档](https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95) | 普通队列、延迟队列、优先队列 等 | -| 分布式锁 | Lock4j | [Lock4j官网](https://gitee.com/baomidou/lock4j) | 注解锁、工具锁 多种多样 | -| 分布式幂等 | Redisson | [Lock4j文档](https://gitee.com/baomidou/lock4j) | 拦截重复提交 | -| 分布式日志 | TLog | [TLog文档](https://yomahub.com/tlog/docs) | 支持跟踪链路日志记录、性能分析、链路排查 | -| 分布式任务调度 | Xxl-Job | [Xxl-Job官网](https://www.xuxueli.com/xxl-job/) | 高性能 高可靠 易扩展 | -| 文件存储 | Minio | [Minio文档](https://docs.min.io/) | 本地存储 | -| 文件存储 | 七牛、阿里、腾讯 | [OSS使用文档](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/pages?sort_id=4359146&doc_id=1469725) | 云存储 | -| 监控框架 | SpringBoot-Admin | [SpringBoot-Admin文档](https://codecentric.github.io/spring-boot-admin/current/) | 全方位服务监控 | -| 校验框架 | Validation | [Validation文档](https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/) | 增强接口安全性、严谨性 支持国际化 | -| Excel框架 | Alibaba EasyExcel | [EasyExcel文档](https://www.yuque.com/easyexcel/doc/easyexcel) | 性能优异 扩展性强 | -| 文档框架 | Knife4j | [Knife4j文档](https://doc.xiaominfo.com/knife4j/documentation/) | 美化接口文档 | -| 工具类框架 | Hutool、Lombok | [Hutool文档](https://www.hutool.cn/docs/) | 减少代码冗余 增加安全性 | -| 代码生成器 | 适配MP、Knife4j规范化代码 | [Hutool文档](https://www.hutool.cn/docs/) | 一键生成前后端代码 | -| 部署方式 | Docker | [Docker文档](https://docs.docker.com/) | 容器编排 一键部署业务集群 | -| 国际化 | SpringMessage | [SpringMVC文档](https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc) | Spring标准国际化方案 | +| 功能介绍 | 使用技术 | 文档地址 | 特性注意事项 | +|----------|---------------------|---------------------------------------------------------------------------------------------------|----------------------------| +| 当前框架 | RuoYi-Vue-Plus | [RuoYi-Vue-Plus文档](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/pages) | 重写RuoYi-Vue全方位升级(不兼容原框架) | +| 微服务分支 | RuoYi-Cloud-Plus | [微服务分支地址](https://gitee.com/JavaLionLi/RuoYi-Cloud-Plus) | 重写RuoYi-Cloud全方位升级(不兼容原框架) | +| 单体分支 | RuoYi-Vue-Plus-fast | [fast分支地址](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/tree/fast/) | 单体应用结构 | +| Vue3分支 | RuoYi-Vue-Plus-UI | [UI地址](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus-UI) | 由于组件还未完善 仅供学习 | +| 原框架 | RuoYi-Vue | [RuoYi-Vue官网](http://ruoyi.vip/) | 定期同步需要的功能 | +| 前端开发框架 | Vue、Element UI | [Element UI官网](https://element.eleme.cn/#/zh-CN) | | +| 后端开发框架 | SpringBoot | [SpringBoot官网](https://spring.io/projects/spring-boot/#learn) | | +| 容器框架 | Undertow | [Undertow官网](https://undertow.io/) | 基于 XNIO 的高性能容器 | +| 权限认证框架 | Sa-Token、Jwt | [Sa-Token官网](https://sa-token.dev33.cn/) | 强解耦、强扩展 | +| 关系数据库 | MySQL | [MySQL官网](https://dev.mysql.com/) | 适配 8.X 最低 5.7 | +| 缓存数据库 | Redis | [Redis官网](https://redis.io/) | 适配 6.X 最低 4.X | +| 数据库框架 | Mybatis-Plus | [Mybatis-Plus文档](https://baomidou.com/guide/) | 快速 CRUD 增加开发效率 | +| 数据库框架 | p6spy | [p6spy官网](https://p6spy.readthedocs.io/) | 更强劲的 SQL 分析 | +| 多数据源框架 | dynamic-datasource | [dynamic-ds文档](https://www.kancloud.cn/tracy5546/dynamic-datasource/content) | 支持主从与多种类数据库异构 | +| 序列化框架 | Jackson | [Jackson官网](https://github.com/FasterXML/jackson) | 统一使用 jackson 高效可靠 | +| Redis客户端 | Redisson | [Redisson文档](https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95) | 支持单机、集群配置 | +| 分布式限流 | Redisson | [Redisson文档](https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95) | 全局、请求IP、集群ID 多种限流 | +| 分布式队列 | Redisson | [Redisson文档](https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95) | 普通队列、延迟队列、优先队列 等 | +| 分布式锁 | Lock4j | [Lock4j官网](https://gitee.com/baomidou/lock4j) | 注解锁、工具锁 多种多样 | +| 分布式幂等 | Redisson | [Lock4j文档](https://gitee.com/baomidou/lock4j) | 拦截重复提交 | +| 分布式日志 | TLog | [TLog文档](https://yomahub.com/tlog/docs) | 支持跟踪链路日志记录、性能分析、链路排查 | +| 分布式任务调度 | Xxl-Job | [Xxl-Job官网](https://www.xuxueli.com/xxl-job/) | 高性能 高可靠 易扩展 | +| 文件存储 | Minio | [Minio文档](https://docs.min.io/) | 本地存储 | +| 文件存储 | 七牛、阿里、腾讯 | [OSS使用文档](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/pages?sort_id=4359146&doc_id=1469725) | 云存储 | +| 监控框架 | SpringBoot-Admin | [SpringBoot-Admin文档](https://codecentric.github.io/spring-boot-admin/current/) | 全方位服务监控 | +| 校验框架 | Validation | [Validation文档](https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/) | 增强接口安全性、严谨性 支持国际化 | +| Excel框架 | Alibaba EasyExcel | [EasyExcel文档](https://www.yuque.com/easyexcel/doc/easyexcel) | 性能优异 扩展性强 | +| 文档框架 | Knife4j | [Knife4j文档](https://doc.xiaominfo.com/knife4j/documentation/) | 美化接口文档 | +| 工具类框架 | Hutool、Lombok | [Hutool文档](https://www.hutool.cn/docs/) | 减少代码冗余 增加安全性 | +| 代码生成器 | 适配MP、Knife4j规范化代码 | [Hutool文档](https://www.hutool.cn/docs/) | 一键生成前后端代码 | +| 部署方式 | Docker | [Docker文档](https://docs.docker.com/) | 容器编排 一键部署业务集群 | +| 国际化 | SpringMessage | [SpringMVC文档](https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc) | Spring标准国际化方案 | ## 参考文档 @@ -73,8 +74,8 @@ * 同步升级 RuoYi-Vue * GitHub 地址 [RuoYi-Vue-Plus-github](https://github.com/JavaLionLi/RuoYi-Vue-Plus) -* 单模块 fast 分支 [RuoYi-Vue-Plus-fast](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/tree/fast/) -* satoken 分支 [RuoYi-Vue-Plus-satoken](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/tree/satoken/) +* 单模块 分支 [RuoYi-Vue-Plus-fast](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/tree/fast/) +* 微服务 分支 [RuoYi-Cloud-Plus](https://gitee.com/JavaLionLi/RuoYi-Cloud-Plus) * 用户扩展项目 [扩展项目列表](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/pages?sort_id=4478302&doc_id=1469725) ## 加群与捐献 @@ -83,7 +84,7 @@ ## 捐献作者 作者为兼职做开源,平时还需要工作,如果帮到了您可以请作者吃个盒饭 - + ## 业务功能 diff --git a/pom.xml b/pom.xml index 2062f0a09..b999e6e13 100644 --- a/pom.xml +++ b/pom.xml @@ -6,30 +6,32 @@ com.ruoyi ruoyi-vue-plus - 3.5.0 + 4.0.1 RuoYi-Vue-Plus https://gitee.com/JavaLionLi/RuoYi-Vue-Plus RuoYi-Vue-Plus后台管理系统 - 3.5.0 - 2.6.3 + 4.0.1 + 2.6.4 UTF-8 UTF-8 1.8 3.2.2 + 2.2.0 1.2.8 3.0.3 1.5.22 4.1.2 + 1.21 3.0.5 3.3.0 2.3 - 1.28.0 - 3.5.0 + 1.29.0 + 3.5.1 3.9.1 - 5.7.20 + 5.7.21 4.9.2 2.6.2 3.16.8 @@ -42,10 +44,10 @@ 3.0.1 - 7.9.2 + 7.9.3 3.14.0 5.6.68 - 8.3.5 + 8.3.7 localhost @@ -109,6 +111,13 @@ ${poi.version} + + + org.apache.commons + commons-compress + ${commons-compress.version} + + com.alibaba easyexcel diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml index 94ac14d2e..d4fc17fe2 100644 --- a/ruoyi-admin/pom.xml +++ b/ruoyi-admin/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 3.5.0 + 4.0.1 4.0.0 jar @@ -29,6 +29,21 @@ mysql mysql-connector-java + + + com.oracle.database.jdbc + ojdbc8 + + + + org.postgresql + postgresql + + + + com.microsoft.sqlserver + mssql-jdbc + diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java index d31624c85..a19be65ea 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java @@ -5,7 +5,7 @@ import cn.hutool.captcha.generator.CodeGenerator; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.IdUtil; import com.ruoyi.common.constant.Constants; -import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.R; import com.ruoyi.common.enums.CaptchaType; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.redis.RedisUtils; @@ -41,12 +41,12 @@ public class CaptchaController { */ @ApiOperation("生成验证码") @GetMapping("/captchaImage") - public AjaxResult> getCode() { + public R> getCode() { Map ajax = new HashMap<>(); boolean captchaOnOff = configService.selectCaptchaOnOff(); ajax.put("captchaOnOff", captchaOnOff); if (!captchaOnOff) { - return AjaxResult.success(ajax); + return R.ok(ajax); } // 保存验证码信息 String uuid = IdUtil.simpleUUID(); @@ -63,7 +63,7 @@ public class CaptchaController { RedisUtils.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES); ajax.put("uuid", uuid); ajax.put("img", captcha.getImageBase64()); - return AjaxResult.success(ajax); + return R.ok(ajax); } private String getCodeResult(String capStr) { diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java index 6bbb96e73..21fbd201f 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java @@ -1,7 +1,7 @@ package com.ruoyi.web.controller.monitor; import cn.dev33.satoken.annotation.SaCheckPermission; -import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.R; import com.ruoyi.common.utils.StringUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -31,7 +31,7 @@ public class CacheController { @ApiOperation("获取缓存监控详细信息") @SaCheckPermission("monitor:cache:list") @GetMapping() - public AjaxResult> getInfo() throws Exception { + public R> getInfo() throws Exception { Properties info = (Properties) redisTemplate.execute((RedisCallback) RedisServerCommands::info); Properties commandStats = (Properties) redisTemplate.execute((RedisCallback) connection -> connection.info("commandstats")); Object dbSize = redisTemplate.execute((RedisCallback) RedisServerCommands::dbSize); @@ -51,6 +51,6 @@ public class CacheController { }); } result.put("commandStats", pieList); - return AjaxResult.success(result); + return R.ok(result); } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java index af73e9f4d..5bec15169 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java @@ -3,7 +3,7 @@ package com.ruoyi.web.controller.monitor; import cn.dev33.satoken.annotation.SaCheckPermission; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; -import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; @@ -53,7 +53,7 @@ public class SysLogininforController extends BaseController { @SaCheckPermission("monitor:logininfor:remove") @Log(title = "登录日志", businessType = BusinessType.DELETE) @DeleteMapping("/{infoIds}") - public AjaxResult remove(@PathVariable Long[] infoIds) { + public R remove(@PathVariable Long[] infoIds) { return toAjax(logininforService.deleteLogininforByIds(infoIds)); } @@ -61,8 +61,8 @@ public class SysLogininforController extends BaseController { @SaCheckPermission("monitor:logininfor:remove") @Log(title = "登录日志", businessType = BusinessType.CLEAN) @DeleteMapping("/clean") - public AjaxResult clean() { + public R clean() { logininforService.cleanLogininfor(); - return AjaxResult.success(); + return R.ok(); } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java index 81e311cef..8145bc66e 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java @@ -3,7 +3,7 @@ package com.ruoyi.web.controller.monitor; import cn.dev33.satoken.annotation.SaCheckPermission; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; -import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; @@ -53,7 +53,7 @@ public class SysOperlogController extends BaseController { @Log(title = "操作日志", businessType = BusinessType.DELETE) @SaCheckPermission("monitor:operlog:remove") @DeleteMapping("/{operIds}") - public AjaxResult remove(@PathVariable Long[] operIds) { + public R remove(@PathVariable Long[] operIds) { return toAjax(operLogService.deleteOperLogByIds(operIds)); } @@ -61,8 +61,8 @@ public class SysOperlogController extends BaseController { @Log(title = "操作日志", businessType = BusinessType.CLEAN) @SaCheckPermission("monitor:operlog:remove") @DeleteMapping("/clean") - public AjaxResult clean() { + public R clean() { operLogService.cleanOperLog(); - return AjaxResult.success(); + return R.ok(); } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java index 2e74ed4de..2ad51e315 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java @@ -7,7 +7,7 @@ import cn.hutool.core.bean.BeanUtil; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.controller.BaseController; -import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.domain.dto.UserOnlineDTO; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; @@ -77,11 +77,11 @@ public class SysUserOnlineController extends BaseController { @SaCheckPermission("monitor:online:forceLogout") @Log(title = "在线用户", businessType = BusinessType.FORCE) @DeleteMapping("/{tokenId}") - public AjaxResult forceLogout(@PathVariable String tokenId) { + public R forceLogout(@PathVariable String tokenId) { try { StpUtil.kickoutByTokenValue(tokenId); } catch (NotLoginException e) { } - return AjaxResult.success(); + return R.ok(); } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java index da1d0fbd1..2dcb84375 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java @@ -4,7 +4,7 @@ import cn.dev33.satoken.annotation.SaCheckPermission; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.controller.BaseController; -import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; @@ -60,8 +60,8 @@ public class SysConfigController extends BaseController { @ApiOperation("根据参数编号获取详细信息") @SaCheckPermission("system:config:query") @GetMapping(value = "/{configId}") - public AjaxResult getInfo(@ApiParam("参数ID") @PathVariable Long configId) { - return AjaxResult.success(configService.selectConfigById(configId)); + public R getInfo(@ApiParam("参数ID") @PathVariable Long configId) { + return R.ok(configService.selectConfigById(configId)); } /** @@ -69,8 +69,8 @@ public class SysConfigController extends BaseController { */ @ApiOperation("根据参数键名查询参数值") @GetMapping(value = "/configKey/{configKey}") - public AjaxResult getConfigKey(@ApiParam("参数Key") @PathVariable String configKey) { - return AjaxResult.success(configService.selectConfigByKey(configKey)); + public R getConfigKey(@ApiParam("参数Key") @PathVariable String configKey) { + return R.ok(configService.selectConfigByKey(configKey)); } /** @@ -80,9 +80,9 @@ public class SysConfigController extends BaseController { @SaCheckPermission("system:config:add") @Log(title = "参数管理", businessType = BusinessType.INSERT) @PostMapping - public AjaxResult add(@Validated @RequestBody SysConfig config) { + public R add(@Validated @RequestBody SysConfig config) { if (UserConstants.NOT_UNIQUE.equals(configService.checkConfigKeyUnique(config))) { - return AjaxResult.error("新增参数'" + config.getConfigName() + "'失败,参数键名已存在"); + return R.fail("新增参数'" + config.getConfigName() + "'失败,参数键名已存在"); } return toAjax(configService.insertConfig(config)); } @@ -94,13 +94,24 @@ public class SysConfigController extends BaseController { @SaCheckPermission("system:config:edit") @Log(title = "参数管理", businessType = BusinessType.UPDATE) @PutMapping - public AjaxResult edit(@Validated @RequestBody SysConfig config) { + public R edit(@Validated @RequestBody SysConfig config) { if (UserConstants.NOT_UNIQUE.equals(configService.checkConfigKeyUnique(config))) { - return AjaxResult.error("修改参数'" + config.getConfigName() + "'失败,参数键名已存在"); + return R.fail("修改参数'" + config.getConfigName() + "'失败,参数键名已存在"); } return toAjax(configService.updateConfig(config)); } + /** + * 根据参数键名修改参数配置 + */ + @ApiOperation("根据参数键名修改参数配置") + @SaCheckPermission("system:config:edit") + @Log(title = "参数管理", businessType = BusinessType.UPDATE) + @PutMapping("/updateByKey") + public R updateByKey(@RequestBody SysConfig config) { + return toAjax(configService.updateConfig(config)); + } + /** * 删除参数配置 */ @@ -108,9 +119,9 @@ public class SysConfigController extends BaseController { @SaCheckPermission("system:config:remove") @Log(title = "参数管理", businessType = BusinessType.DELETE) @DeleteMapping("/{configIds}") - public AjaxResult remove(@ApiParam("参数ID串") @PathVariable Long[] configIds) { + public R remove(@ApiParam("参数ID串") @PathVariable Long[] configIds) { configService.deleteConfigByIds(configIds); - return success(); + return R.ok(); } /** @@ -120,8 +131,8 @@ public class SysConfigController extends BaseController { @SaCheckPermission("system:config:remove") @Log(title = "参数管理", businessType = BusinessType.CLEAN) @DeleteMapping("/refreshCache") - public AjaxResult refreshCache() { + public R refreshCache() { configService.resetConfigCache(); - return AjaxResult.success(); + return R.ok(); } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java index f38758c6b..475cdb7e4 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java @@ -6,7 +6,7 @@ import cn.hutool.core.util.ArrayUtil; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.controller.BaseController; -import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.domain.entity.SysDept; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.StringUtils; @@ -42,9 +42,9 @@ public class SysDeptController extends BaseController { @ApiOperation("获取部门列表") @SaCheckPermission("system:dept:list") @GetMapping("/list") - public AjaxResult> list(SysDept dept) { + public R> list(SysDept dept) { List depts = deptService.selectDeptList(dept); - return AjaxResult.success(depts); + return R.ok(depts); } /** @@ -53,11 +53,11 @@ public class SysDeptController extends BaseController { @ApiOperation("查询部门列表(排除节点)") @SaCheckPermission("system:dept:list") @GetMapping("/list/exclude/{deptId}") - public AjaxResult> excludeChild(@ApiParam("部门ID") @PathVariable(value = "deptId", required = false) Long deptId) { + public R> excludeChild(@ApiParam("部门ID") @PathVariable(value = "deptId", required = false) Long deptId) { List depts = deptService.selectDeptList(new SysDept()); depts.removeIf(d -> d.getDeptId().equals(deptId) || ArrayUtil.contains(StringUtils.split(d.getAncestors(), ","), deptId + "")); - return AjaxResult.success(depts); + return R.ok(depts); } /** @@ -66,9 +66,9 @@ public class SysDeptController extends BaseController { @ApiOperation("根据部门编号获取详细信息") @SaCheckPermission("system:dept:query") @GetMapping(value = "/{deptId}") - public AjaxResult getInfo(@ApiParam("部门ID") @PathVariable Long deptId) { + public R getInfo(@ApiParam("部门ID") @PathVariable Long deptId) { deptService.checkDeptDataScope(deptId); - return AjaxResult.success(deptService.selectDeptById(deptId)); + return R.ok(deptService.selectDeptById(deptId)); } /** @@ -76,9 +76,9 @@ public class SysDeptController extends BaseController { */ @ApiOperation("获取部门下拉树列表") @GetMapping("/treeselect") - public AjaxResult>> treeselect(SysDept dept) { + public R>> treeselect(SysDept dept) { List depts = deptService.selectDeptList(dept); - return AjaxResult.success(deptService.buildDeptTreeSelect(depts)); + return R.ok(deptService.buildDeptTreeSelect(depts)); } /** @@ -86,12 +86,12 @@ public class SysDeptController extends BaseController { */ @ApiOperation("加载对应角色部门列表树") @GetMapping(value = "/roleDeptTreeselect/{roleId}") - public AjaxResult> roleDeptTreeselect(@ApiParam("角色ID") @PathVariable("roleId") Long roleId) { + public R> roleDeptTreeselect(@ApiParam("角色ID") @PathVariable("roleId") Long roleId) { List depts = deptService.selectDeptList(new SysDept()); Map ajax = new HashMap<>(); ajax.put("checkedKeys", deptService.selectDeptListByRoleId(roleId)); ajax.put("depts", deptService.buildDeptTreeSelect(depts)); - return AjaxResult.success(ajax); + return R.ok(ajax); } /** @@ -101,9 +101,9 @@ public class SysDeptController extends BaseController { @SaCheckPermission("system:dept:add") @Log(title = "部门管理", businessType = BusinessType.INSERT) @PostMapping - public AjaxResult add(@Validated @RequestBody SysDept dept) { + public R add(@Validated @RequestBody SysDept dept) { if (UserConstants.NOT_UNIQUE.equals(deptService.checkDeptNameUnique(dept))) { - return AjaxResult.error("新增部门'" + dept.getDeptName() + "'失败,部门名称已存在"); + return R.fail("新增部门'" + dept.getDeptName() + "'失败,部门名称已存在"); } return toAjax(deptService.insertDept(dept)); } @@ -115,14 +115,16 @@ public class SysDeptController extends BaseController { @SaCheckPermission("system:dept:edit") @Log(title = "部门管理", businessType = BusinessType.UPDATE) @PutMapping - public AjaxResult edit(@Validated @RequestBody SysDept dept) { + public R edit(@Validated @RequestBody SysDept dept) { + Long deptId = dept.getDeptId(); + deptService.checkDeptDataScope(deptId); if (UserConstants.NOT_UNIQUE.equals(deptService.checkDeptNameUnique(dept))) { - return AjaxResult.error("修改部门'" + dept.getDeptName() + "'失败,部门名称已存在"); - } else if (dept.getParentId().equals(dept.getDeptId())) { - return AjaxResult.error("修改部门'" + dept.getDeptName() + "'失败,上级部门不能是自己"); + return R.fail("修改部门'" + dept.getDeptName() + "'失败,部门名称已存在"); + } else if (dept.getParentId().equals(deptId)) { + return R.fail("修改部门'" + dept.getDeptName() + "'失败,上级部门不能是自己"); } else if (StringUtils.equals(UserConstants.DEPT_DISABLE, dept.getStatus()) - && deptService.selectNormalChildrenDeptById(dept.getDeptId()) > 0) { - return AjaxResult.error("该部门包含未停用的子部门!"); + && deptService.selectNormalChildrenDeptById(deptId) > 0) { + return R.fail("该部门包含未停用的子部门!"); } return toAjax(deptService.updateDept(dept)); } @@ -134,13 +136,14 @@ public class SysDeptController extends BaseController { @SaCheckPermission("system:dept:remove") @Log(title = "部门管理", businessType = BusinessType.DELETE) @DeleteMapping("/{deptId}") - public AjaxResult remove(@ApiParam("部门ID串") @PathVariable Long deptId) { + public R remove(@ApiParam("部门ID串") @PathVariable Long deptId) { if (deptService.hasChildByDeptId(deptId)) { - return AjaxResult.error("存在下级部门,不允许删除"); + return R.fail("存在下级部门,不允许删除"); } if (deptService.checkDeptExistUser(deptId)) { - return AjaxResult.error("部门存在用户,不允许删除"); + return R.fail("部门存在用户,不允许删除"); } + deptService.checkDeptDataScope(deptId); return toAjax(deptService.deleteDeptById(deptId)); } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java index d1bc605d1..060e980e4 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java @@ -4,7 +4,7 @@ import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.util.ObjectUtil; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; -import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.entity.SysDictData; import com.ruoyi.common.core.page.TableDataInfo; @@ -60,8 +60,8 @@ public class SysDictDataController extends BaseController { @ApiOperation("查询字典数据详细") @SaCheckPermission("system:dict:query") @GetMapping(value = "/{dictCode}") - public AjaxResult getInfo(@ApiParam("字典code") @PathVariable Long dictCode) { - return AjaxResult.success(dictDataService.selectDictDataById(dictCode)); + public R getInfo(@ApiParam("字典code") @PathVariable Long dictCode) { + return R.ok(dictDataService.selectDictDataById(dictCode)); } /** @@ -69,12 +69,12 @@ public class SysDictDataController extends BaseController { */ @ApiOperation("根据字典类型查询字典数据信息") @GetMapping(value = "/type/{dictType}") - public AjaxResult> dictType(@ApiParam("字典类型") @PathVariable String dictType) { + public R> dictType(@ApiParam("字典类型") @PathVariable String dictType) { List data = dictTypeService.selectDictDataByType(dictType); if (ObjectUtil.isNull(data)) { data = new ArrayList<>(); } - return AjaxResult.success(data); + return R.ok(data); } /** @@ -84,7 +84,7 @@ public class SysDictDataController extends BaseController { @SaCheckPermission("system:dict:add") @Log(title = "字典数据", businessType = BusinessType.INSERT) @PostMapping - public AjaxResult add(@Validated @RequestBody SysDictData dict) { + public R add(@Validated @RequestBody SysDictData dict) { return toAjax(dictDataService.insertDictData(dict)); } @@ -95,7 +95,7 @@ public class SysDictDataController extends BaseController { @SaCheckPermission("system:dict:edit") @Log(title = "字典数据", businessType = BusinessType.UPDATE) @PutMapping - public AjaxResult edit(@Validated @RequestBody SysDictData dict) { + public R edit(@Validated @RequestBody SysDictData dict) { return toAjax(dictDataService.updateDictData(dict)); } @@ -106,8 +106,8 @@ public class SysDictDataController extends BaseController { @SaCheckPermission("system:dict:remove") @Log(title = "字典类型", businessType = BusinessType.DELETE) @DeleteMapping("/{dictCodes}") - public AjaxResult remove(@ApiParam("字典code串") @PathVariable Long[] dictCodes) { + public R remove(@ApiParam("字典code串") @PathVariable Long[] dictCodes) { dictDataService.deleteDictDataByIds(dictCodes); - return success(); + return R.ok(); } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java index 5b8391a19..c8ebd49be 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java @@ -4,7 +4,7 @@ import cn.dev33.satoken.annotation.SaCheckPermission; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.controller.BaseController; -import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.entity.SysDictType; import com.ruoyi.common.core.page.TableDataInfo; @@ -57,8 +57,8 @@ public class SysDictTypeController extends BaseController { @ApiOperation("查询字典类型详细") @SaCheckPermission("system:dict:query") @GetMapping(value = "/{dictId}") - public AjaxResult getInfo(@ApiParam("字典ID") @PathVariable Long dictId) { - return AjaxResult.success(dictTypeService.selectDictTypeById(dictId)); + public R getInfo(@ApiParam("字典ID") @PathVariable Long dictId) { + return R.ok(dictTypeService.selectDictTypeById(dictId)); } /** @@ -68,9 +68,9 @@ public class SysDictTypeController extends BaseController { @SaCheckPermission("system:dict:add") @Log(title = "字典类型", businessType = BusinessType.INSERT) @PostMapping - public AjaxResult add(@Validated @RequestBody SysDictType dict) { + public R add(@Validated @RequestBody SysDictType dict) { if (UserConstants.NOT_UNIQUE.equals(dictTypeService.checkDictTypeUnique(dict))) { - return AjaxResult.error("新增字典'" + dict.getDictName() + "'失败,字典类型已存在"); + return R.fail("新增字典'" + dict.getDictName() + "'失败,字典类型已存在"); } return toAjax(dictTypeService.insertDictType(dict)); } @@ -82,9 +82,9 @@ public class SysDictTypeController extends BaseController { @SaCheckPermission("system:dict:edit") @Log(title = "字典类型", businessType = BusinessType.UPDATE) @PutMapping - public AjaxResult edit(@Validated @RequestBody SysDictType dict) { + public R edit(@Validated @RequestBody SysDictType dict) { if (UserConstants.NOT_UNIQUE.equals(dictTypeService.checkDictTypeUnique(dict))) { - return AjaxResult.error("修改字典'" + dict.getDictName() + "'失败,字典类型已存在"); + return R.fail("修改字典'" + dict.getDictName() + "'失败,字典类型已存在"); } return toAjax(dictTypeService.updateDictType(dict)); } @@ -96,9 +96,9 @@ public class SysDictTypeController extends BaseController { @SaCheckPermission("system:dict:remove") @Log(title = "字典类型", businessType = BusinessType.DELETE) @DeleteMapping("/{dictIds}") - public AjaxResult remove(@ApiParam("字典ID串") @PathVariable Long[] dictIds) { + public R remove(@ApiParam("字典ID串") @PathVariable Long[] dictIds) { dictTypeService.deleteDictTypeByIds(dictIds); - return success(); + return R.ok(); } /** @@ -108,9 +108,9 @@ public class SysDictTypeController extends BaseController { @SaCheckPermission("system:dict:remove") @Log(title = "字典类型", businessType = BusinessType.CLEAN) @DeleteMapping("/refreshCache") - public AjaxResult refreshCache() { + public R refreshCache() { dictTypeService.resetDictCache(); - return AjaxResult.success(); + return R.ok(); } /** @@ -118,8 +118,8 @@ public class SysDictTypeController extends BaseController { */ @ApiOperation("获取字典选择框列表") @GetMapping("/optionselect") - public AjaxResult> optionselect() { + public R> optionselect() { List dictTypes = dictTypeService.selectDictTypeAll(); - return AjaxResult.success(dictTypes); + return R.ok(dictTypes); } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java index 40c315cb8..fad8b5bf3 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java @@ -3,15 +3,14 @@ package com.ruoyi.web.controller.system; import cn.dev33.satoken.exception.NotLoginException; import cn.dev33.satoken.stp.StpUtil; import com.ruoyi.common.constant.Constants; -import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.domain.entity.SysMenu; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.model.LoginBody; -import com.ruoyi.common.core.service.UserService; import com.ruoyi.common.helper.LoginHelper; -import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.system.domain.vo.RouterVo; import com.ruoyi.system.service.ISysMenuService; +import com.ruoyi.system.service.ISysUserService; import com.ruoyi.system.service.SysLoginService; import com.ruoyi.system.service.SysPermissionService; import io.swagger.annotations.Api; @@ -41,6 +40,7 @@ public class SysLoginController { private final SysLoginService loginService; private final ISysMenuService menuService; + private final ISysUserService userService; private final SysPermissionService permissionService; /** @@ -51,23 +51,24 @@ public class SysLoginController { */ @ApiOperation("登录方法") @PostMapping("/login") - public AjaxResult> login(@RequestBody LoginBody loginBody) { + public R> login(@Validated @RequestBody LoginBody loginBody) { Map ajax = new HashMap<>(); // 生成令牌 String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(), loginBody.getUuid()); ajax.put(Constants.TOKEN, token); - return AjaxResult.success(ajax); + return R.ok(ajax); } @ApiOperation("登出方法") @PostMapping("/logout") - public AjaxResult logout() { + public R logout() { try { StpUtil.logout(); + loginService.logout(LoginHelper.getUsername()); } catch (NotLoginException e) { } - return AjaxResult.success("退出成功"); + return R.ok("退出成功"); } /** @@ -77,8 +78,8 @@ public class SysLoginController { */ @ApiOperation("获取用户信息") @GetMapping("getInfo") - public AjaxResult> getInfo() { - SysUser user = SpringUtils.getBean(UserService.class).selectUserById(LoginHelper.getUserId()); + public R> getInfo() { + SysUser user = userService.selectUserById(LoginHelper.getUserId()); // 角色集合 Set roles = permissionService.getRolePermission(user); // 权限集合 @@ -87,7 +88,7 @@ public class SysLoginController { ajax.put("user", user); ajax.put("roles", roles); ajax.put("permissions", permissions); - return AjaxResult.success(ajax); + return R.ok(ajax); } /** @@ -97,9 +98,9 @@ public class SysLoginController { */ @ApiOperation("获取路由信息") @GetMapping("getRouters") - public AjaxResult> getRouters() { + public R> getRouters() { Long userId = LoginHelper.getUserId(); List menus = menuService.selectMenuTreeByUserId(userId); - return AjaxResult.success(menuService.buildMenus(menus)); + return R.ok(menuService.buildMenus(menus)); } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java index b17b17f31..030363e00 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java @@ -5,7 +5,7 @@ import cn.hutool.core.lang.tree.Tree; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.controller.BaseController; -import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.domain.entity.SysMenu; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.StringUtils; @@ -41,9 +41,9 @@ public class SysMenuController extends BaseController { @ApiOperation("获取菜单列表") @SaCheckPermission("system:menu:list") @GetMapping("/list") - public AjaxResult> list(SysMenu menu) { + public R> list(SysMenu menu) { List menus = menuService.selectMenuList(menu, getUserId()); - return AjaxResult.success(menus); + return R.ok(menus); } /** @@ -52,8 +52,8 @@ public class SysMenuController extends BaseController { @ApiOperation("根据菜单编号获取详细信息") @SaCheckPermission("system:menu:query") @GetMapping(value = "/{menuId}") - public AjaxResult getInfo(@ApiParam("菜单ID") @PathVariable Long menuId) { - return AjaxResult.success(menuService.selectMenuById(menuId)); + public R getInfo(@ApiParam("菜单ID") @PathVariable Long menuId) { + return R.ok(menuService.selectMenuById(menuId)); } /** @@ -61,9 +61,9 @@ public class SysMenuController extends BaseController { */ @ApiOperation("获取菜单下拉树列表") @GetMapping("/treeselect") - public AjaxResult>> treeselect(SysMenu menu) { + public R>> treeselect(SysMenu menu) { List menus = menuService.selectMenuList(menu, getUserId()); - return AjaxResult.success(menuService.buildMenuTreeSelect(menus)); + return R.ok(menuService.buildMenuTreeSelect(menus)); } /** @@ -71,12 +71,12 @@ public class SysMenuController extends BaseController { */ @ApiOperation("加载对应角色菜单列表树") @GetMapping(value = "/roleMenuTreeselect/{roleId}") - public AjaxResult> roleMenuTreeselect(@ApiParam("角色ID") @PathVariable("roleId") Long roleId) { + public R> roleMenuTreeselect(@ApiParam("角色ID") @PathVariable("roleId") Long roleId) { List menus = menuService.selectMenuList(getUserId()); Map ajax = new HashMap<>(); ajax.put("checkedKeys", menuService.selectMenuListByRoleId(roleId)); ajax.put("menus", menuService.buildMenuTreeSelect(menus)); - return AjaxResult.success(ajax); + return R.ok(ajax); } /** @@ -86,11 +86,11 @@ public class SysMenuController extends BaseController { @SaCheckPermission("system:menu:add") @Log(title = "菜单管理", businessType = BusinessType.INSERT) @PostMapping - public AjaxResult add(@Validated @RequestBody SysMenu menu) { + public R add(@Validated @RequestBody SysMenu menu) { if (UserConstants.NOT_UNIQUE.equals(menuService.checkMenuNameUnique(menu))) { - return AjaxResult.error("新增菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); + return R.fail("新增菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); } else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath())) { - return AjaxResult.error("新增菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头"); + return R.fail("新增菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头"); } return toAjax(menuService.insertMenu(menu)); } @@ -102,13 +102,13 @@ public class SysMenuController extends BaseController { @SaCheckPermission("system:menu:edit") @Log(title = "菜单管理", businessType = BusinessType.UPDATE) @PutMapping - public AjaxResult edit(@Validated @RequestBody SysMenu menu) { + public R edit(@Validated @RequestBody SysMenu menu) { if (UserConstants.NOT_UNIQUE.equals(menuService.checkMenuNameUnique(menu))) { - return AjaxResult.error("修改菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); + return R.fail("修改菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); } else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath())) { - return AjaxResult.error("修改菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头"); + return R.fail("修改菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头"); } else if (menu.getMenuId().equals(menu.getParentId())) { - return AjaxResult.error("修改菜单'" + menu.getMenuName() + "'失败,上级菜单不能选择自己"); + return R.fail("修改菜单'" + menu.getMenuName() + "'失败,上级菜单不能选择自己"); } return toAjax(menuService.updateMenu(menu)); } @@ -120,12 +120,12 @@ public class SysMenuController extends BaseController { @SaCheckPermission("system:menu:remove") @Log(title = "菜单管理", businessType = BusinessType.DELETE) @DeleteMapping("/{menuId}") - public AjaxResult remove(@ApiParam("菜单ID") @PathVariable("menuId") Long menuId) { + public R remove(@ApiParam("菜单ID") @PathVariable("menuId") Long menuId) { if (menuService.hasChildByMenuId(menuId)) { - return AjaxResult.error("存在子菜单,不允许删除"); + return R.fail("存在子菜单,不允许删除"); } if (menuService.checkMenuExistRole(menuId)) { - return AjaxResult.error("菜单已分配,不允许删除"); + return R.fail("菜单已分配,不允许删除"); } return toAjax(menuService.deleteMenuById(menuId)); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java index 304ee3399..6febd3e3f 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java @@ -3,7 +3,7 @@ package com.ruoyi.web.controller.system; import cn.dev33.satoken.annotation.SaCheckPermission; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; -import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; @@ -46,8 +46,8 @@ public class SysNoticeController extends BaseController { @ApiOperation("根据通知公告编号获取详细信息") @SaCheckPermission("system:notice:query") @GetMapping(value = "/{noticeId}") - public AjaxResult getInfo(@ApiParam("公告ID") @PathVariable Long noticeId) { - return AjaxResult.success(noticeService.selectNoticeById(noticeId)); + public R getInfo(@ApiParam("公告ID") @PathVariable Long noticeId) { + return R.ok(noticeService.selectNoticeById(noticeId)); } /** @@ -57,7 +57,7 @@ public class SysNoticeController extends BaseController { @SaCheckPermission("system:notice:add") @Log(title = "通知公告", businessType = BusinessType.INSERT) @PostMapping - public AjaxResult add(@Validated @RequestBody SysNotice notice) { + public R add(@Validated @RequestBody SysNotice notice) { return toAjax(noticeService.insertNotice(notice)); } @@ -68,7 +68,7 @@ public class SysNoticeController extends BaseController { @SaCheckPermission("system:notice:edit") @Log(title = "通知公告", businessType = BusinessType.UPDATE) @PutMapping - public AjaxResult edit(@Validated @RequestBody SysNotice notice) { + public R edit(@Validated @RequestBody SysNotice notice) { return toAjax(noticeService.updateNotice(notice)); } @@ -79,7 +79,7 @@ public class SysNoticeController extends BaseController { @SaCheckPermission("system:notice:remove") @Log(title = "通知公告", businessType = BusinessType.DELETE) @DeleteMapping("/{noticeIds}") - public AjaxResult remove(@ApiParam("公告ID串") @PathVariable Long[] noticeIds) { + public R remove(@ApiParam("公告ID串") @PathVariable Long[] noticeIds) { return toAjax(noticeService.deleteNoticeByIds(noticeIds)); } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssConfigController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssConfigController.java index 3ab986493..e344dea98 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssConfigController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssConfigController.java @@ -4,7 +4,7 @@ import cn.dev33.satoken.annotation.SaCheckPermission; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.annotation.RepeatSubmit; import com.ruoyi.common.core.controller.BaseController; -import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.validate.AddGroup; @@ -57,10 +57,10 @@ public class SysOssConfigController extends BaseController { @ApiOperation("获取对象存储配置详细信息") @SaCheckPermission("system:oss:query") @GetMapping("/{ossConfigId}") - public AjaxResult getInfo(@ApiParam("OSS配置ID") + public R getInfo(@ApiParam("OSS配置ID") @NotNull(message = "主键不能为空") @PathVariable("ossConfigId") Integer ossConfigId) { - return AjaxResult.success(iSysOssConfigService.queryById(ossConfigId)); + return R.ok(iSysOssConfigService.queryById(ossConfigId)); } /** @@ -71,7 +71,7 @@ public class SysOssConfigController extends BaseController { @Log(title = "对象存储配置", businessType = BusinessType.INSERT) @RepeatSubmit() @PostMapping() - public AjaxResult add(@Validated(AddGroup.class) @RequestBody SysOssConfigBo bo) { + public R add(@Validated(AddGroup.class) @RequestBody SysOssConfigBo bo) { return toAjax(iSysOssConfigService.insertByBo(bo) ? 1 : 0); } @@ -83,7 +83,7 @@ public class SysOssConfigController extends BaseController { @Log(title = "对象存储配置", businessType = BusinessType.UPDATE) @RepeatSubmit() @PutMapping() - public AjaxResult edit(@Validated(EditGroup.class) @RequestBody SysOssConfigBo bo) { + public R edit(@Validated(EditGroup.class) @RequestBody SysOssConfigBo bo) { return toAjax(iSysOssConfigService.updateByBo(bo) ? 1 : 0); } @@ -94,7 +94,7 @@ public class SysOssConfigController extends BaseController { @SaCheckPermission("system:oss:remove") @Log(title = "对象存储配置", businessType = BusinessType.DELETE) @DeleteMapping("/{ossConfigIds}") - public AjaxResult remove(@ApiParam("OSS配置ID串") + public R remove(@ApiParam("OSS配置ID串") @NotEmpty(message = "主键不能为空") @PathVariable Long[] ossConfigIds) { return toAjax(iSysOssConfigService.deleteWithValidByIds(Arrays.asList(ossConfigIds), true) ? 1 : 0); @@ -107,7 +107,7 @@ public class SysOssConfigController extends BaseController { @SaCheckPermission("system:oss:edit") @Log(title = "对象存储状态修改", businessType = BusinessType.UPDATE) @PutMapping("/changeStatus") - public AjaxResult changeStatus(@RequestBody SysOssConfigBo bo) { + public R changeStatus(@RequestBody SysOssConfigBo bo) { return toAjax(iSysOssConfigService.updateOssConfigStatus(bo)); } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssController.java index e60b4bb21..4342716f7 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssController.java @@ -7,18 +7,14 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.http.HttpException; import cn.hutool.http.HttpUtil; import com.ruoyi.common.annotation.Log; -import com.ruoyi.common.annotation.RepeatSubmit; import com.ruoyi.common.core.controller.BaseController; -import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.PageQuery; +import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.validate.QueryGroup; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.exception.ServiceException; -import com.ruoyi.common.utils.JsonUtils; import com.ruoyi.common.utils.file.FileUtils; -import com.ruoyi.oss.constant.OssConstant; -import com.ruoyi.system.domain.SysConfig; import com.ruoyi.system.domain.SysOss; import com.ruoyi.system.domain.bo.SysOssBo; import com.ruoyi.system.domain.vo.SysOssVo; @@ -45,7 +41,7 @@ import java.util.Map; * @author Lion Li */ @Validated -@Api(value = "OSS对象存储控制器", tags = {"OSS对象存储管理"}) +@Api(value = "对象存储控制器", tags = {"对象存储管理"}) @RequiredArgsConstructor @RestController @RequestMapping("/system/oss") @@ -69,13 +65,12 @@ public class SysOssController extends BaseController { */ @ApiOperation("上传OSS对象存储") @ApiImplicitParams({ - @ApiImplicitParam(name = "file", value = "文件", dataTypeClass = File.class, required = true), + @ApiImplicitParam(name = "file", value = "文件", paramType = "query", dataTypeClass = File.class, required = true) }) @SaCheckPermission("system:oss:upload") @Log(title = "OSS对象存储", businessType = BusinessType.INSERT) - @RepeatSubmit @PostMapping("/upload") - public AjaxResult> upload(@RequestPart("file") MultipartFile file) { + public R> upload(@RequestPart("file") MultipartFile file) { if (ObjectUtil.isNull(file)) { throw new ServiceException("上传文件不能为空"); } @@ -83,7 +78,7 @@ public class SysOssController extends BaseController { Map map = new HashMap<>(2); map.put("url", oss.getUrl()); map.put("fileName", oss.getFileName()); - return AjaxResult.success(map); + return R.ok(map); } @ApiOperation("下载OSS对象存储") @@ -117,24 +112,10 @@ public class SysOssController extends BaseController { @SaCheckPermission("system:oss:remove") @Log(title = "OSS对象存储", businessType = BusinessType.DELETE) @DeleteMapping("/{ossIds}") - public AjaxResult remove(@ApiParam("OSS对象ID串") + public R remove(@ApiParam("OSS对象ID串") @NotEmpty(message = "主键不能为空") @PathVariable Long[] ossIds) { return toAjax(iSysOssService.deleteWithValidByIds(Arrays.asList(ossIds), true) ? 1 : 0); } - /** - * 变更图片列表预览状态 - */ - @ApiOperation("变更图片列表预览状态") - @SaCheckPermission("system:oss:edit") - @Log(title = "OSS对象存储", businessType = BusinessType.UPDATE) - @PutMapping("/changePreviewListResource") - public AjaxResult changePreviewListResource(@RequestBody String body) { - Map map = JsonUtils.parseMap(body); - SysConfig config = iSysConfigService.getOne(new SysConfig().setConfigKey(OssConstant.PEREVIEW_LIST_RESOURCE_KEY)); - config.setConfigValue(map.get("previewListResource").toString()); - return toAjax(iSysConfigService.updateConfig(config)); - } - } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java index 080ddd33a..7e08698f9 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java @@ -4,7 +4,7 @@ import cn.dev33.satoken.annotation.SaCheckPermission; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.controller.BaseController; -import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; @@ -60,8 +60,8 @@ public class SysPostController extends BaseController { @ApiOperation("根据岗位编号获取详细信息") @SaCheckPermission("system:post:query") @GetMapping(value = "/{postId}") - public AjaxResult getInfo(@ApiParam("岗位ID") @PathVariable Long postId) { - return AjaxResult.success(postService.selectPostById(postId)); + public R getInfo(@ApiParam("岗位ID") @PathVariable Long postId) { + return R.ok(postService.selectPostById(postId)); } /** @@ -71,11 +71,11 @@ public class SysPostController extends BaseController { @SaCheckPermission("system:post:add") @Log(title = "岗位管理", businessType = BusinessType.INSERT) @PostMapping - public AjaxResult add(@Validated @RequestBody SysPost post) { + public R add(@Validated @RequestBody SysPost post) { if (UserConstants.NOT_UNIQUE.equals(postService.checkPostNameUnique(post))) { - return AjaxResult.error("新增岗位'" + post.getPostName() + "'失败,岗位名称已存在"); + return R.fail("新增岗位'" + post.getPostName() + "'失败,岗位名称已存在"); } else if (UserConstants.NOT_UNIQUE.equals(postService.checkPostCodeUnique(post))) { - return AjaxResult.error("新增岗位'" + post.getPostName() + "'失败,岗位编码已存在"); + return R.fail("新增岗位'" + post.getPostName() + "'失败,岗位编码已存在"); } return toAjax(postService.insertPost(post)); } @@ -87,11 +87,11 @@ public class SysPostController extends BaseController { @SaCheckPermission("system:post:edit") @Log(title = "岗位管理", businessType = BusinessType.UPDATE) @PutMapping - public AjaxResult edit(@Validated @RequestBody SysPost post) { + public R edit(@Validated @RequestBody SysPost post) { if (UserConstants.NOT_UNIQUE.equals(postService.checkPostNameUnique(post))) { - return AjaxResult.error("修改岗位'" + post.getPostName() + "'失败,岗位名称已存在"); + return R.fail("修改岗位'" + post.getPostName() + "'失败,岗位名称已存在"); } else if (UserConstants.NOT_UNIQUE.equals(postService.checkPostCodeUnique(post))) { - return AjaxResult.error("修改岗位'" + post.getPostName() + "'失败,岗位编码已存在"); + return R.fail("修改岗位'" + post.getPostName() + "'失败,岗位编码已存在"); } return toAjax(postService.updatePost(post)); } @@ -103,7 +103,7 @@ public class SysPostController extends BaseController { @SaCheckPermission("system:post:remove") @Log(title = "岗位管理", businessType = BusinessType.DELETE) @DeleteMapping("/{postIds}") - public AjaxResult remove(@ApiParam("岗位ID串") @PathVariable Long[] postIds) { + public R remove(@ApiParam("岗位ID串") @PathVariable Long[] postIds) { return toAjax(postService.deletePostByIds(postIds)); } @@ -112,8 +112,8 @@ public class SysPostController extends BaseController { */ @ApiOperation("获取岗位选择框列表") @GetMapping("/optionselect") - public AjaxResult> optionselect() { + public R> optionselect() { List posts = postService.selectPostAll(); - return AjaxResult.success(posts); + return R.ok(posts); } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java index 0fa8e1ed1..84d4c0b3d 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java @@ -1,16 +1,14 @@ package com.ruoyi.web.controller.system; +import cn.dev33.satoken.secure.BCrypt; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.controller.BaseController; -import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.domain.entity.SysUser; -import com.ruoyi.common.core.service.UserService; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.helper.LoginHelper; -import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.system.domain.SysOss; import com.ruoyi.system.service.ISysOssService; import com.ruoyi.system.service.ISysUserService; @@ -47,13 +45,13 @@ public class SysProfileController extends BaseController { */ @ApiOperation("个人信息") @GetMapping - public AjaxResult> profile() { + public R> profile() { SysUser user = userService.selectUserById(getUserId()); Map ajax = new HashMap<>(); ajax.put("user", user); ajax.put("roleGroup", userService.selectUserRoleGroup(user.getUserName())); ajax.put("postGroup", userService.selectUserPostGroup(user.getUserName())); - return AjaxResult.success(ajax); + return R.ok(ajax); } /** @@ -62,22 +60,22 @@ public class SysProfileController extends BaseController { @ApiOperation("修改用户") @Log(title = "个人信息", businessType = BusinessType.UPDATE) @PutMapping - public AjaxResult updateProfile(@RequestBody SysUser user) { + public R updateProfile(@RequestBody SysUser user) { if (StringUtils.isNotEmpty(user.getPhonenumber()) && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) { - return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,手机号码已存在"); + return R.fail("修改用户'" + user.getUserName() + "'失败,手机号码已存在"); } if (StringUtils.isNotEmpty(user.getEmail()) && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) { - return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在"); + return R.fail("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在"); } user.setUserId(getUserId()); user.setUserName(null); user.setPassword(null); if (userService.updateUserProfile(user) > 0) { - return AjaxResult.success(); + return R.ok(); } - return AjaxResult.error("修改个人信息异常,请联系管理员"); + return R.fail("修改个人信息异常,请联系管理员"); } /** @@ -90,20 +88,21 @@ public class SysProfileController extends BaseController { }) @Log(title = "个人信息", businessType = BusinessType.UPDATE) @PutMapping("/updatePwd") - public AjaxResult updatePwd(String oldPassword, String newPassword) { - SysUser user = SpringUtils.getBean(UserService.class).selectUserById(LoginHelper.getUserId()); + public R updatePwd(String oldPassword, String newPassword) { + SysUser user = userService.selectUserById(LoginHelper.getUserId()); String userName = user.getUserName(); String password = user.getPassword(); - if (!SecurityUtils.matchesPassword(oldPassword, password)) { - return AjaxResult.error("修改密码失败,旧密码错误"); + if (!BCrypt.checkpw(oldPassword, password)) { + return R.fail("修改密码失败,旧密码错误"); } - if (SecurityUtils.matchesPassword(newPassword, password)) { - return AjaxResult.error("新密码不能与旧密码相同"); + if (BCrypt.checkpw(newPassword, password)) { + return R.fail("新密码不能与旧密码相同"); } - if (userService.resetUserPwd(userName, SecurityUtils.encryptPassword(newPassword)) > 0) { - return AjaxResult.success(); + + if (userService.resetUserPwd(userName, BCrypt.hashpw(newPassword)) > 0) { + return R.ok(); } - return AjaxResult.error("修改密码异常,请联系管理员"); + return R.fail("修改密码异常,请联系管理员"); } /** @@ -111,20 +110,20 @@ public class SysProfileController extends BaseController { */ @ApiOperation("头像上传") @ApiImplicitParams({ - @ApiImplicitParam(name = "avatarfile", value = "用户头像", dataTypeClass = File.class, required = true), + @ApiImplicitParam(name = "avatarfile", value = "用户头像", paramType = "query", dataTypeClass = File.class, required = true) }) @Log(title = "用户头像", businessType = BusinessType.UPDATE) @PostMapping("/avatar") - public AjaxResult> avatar(@RequestPart("avatarfile") MultipartFile file) { + public R> avatar(@RequestPart("avatarfile") MultipartFile file) { Map ajax = new HashMap<>(); if (!file.isEmpty()) { SysOss oss = iSysOssService.upload(file); String avatar = oss.getUrl(); if (userService.updateUserAvatar(getUsername(), avatar)) { ajax.put("imgUrl", avatar); - return AjaxResult.success(ajax); + return R.ok(ajax); } } - return AjaxResult.error("上传图片异常,请联系管理员", ajax); + return R.fail("上传图片异常,请联系管理员"); } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java index 4d7801b3d..6595f06df 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java @@ -1,9 +1,8 @@ package com.ruoyi.web.controller.system; import com.ruoyi.common.core.controller.BaseController; -import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.domain.model.RegisterBody; -import com.ruoyi.common.utils.StringUtils; import com.ruoyi.system.service.ISysConfigService; import com.ruoyi.system.service.SysRegisterService; import io.swagger.annotations.Api; @@ -30,11 +29,11 @@ public class SysRegisterController extends BaseController { @ApiOperation("用户注册") @PostMapping("/register") - public AjaxResult register(@RequestBody RegisterBody user) { + public R register(@Validated @RequestBody RegisterBody user) { if (!("true".equals(configService.selectConfigByKey("sys.account.registerUser")))) { - return error("当前系统没有开启注册功能!"); + return R.fail("当前系统没有开启注册功能!"); } - String msg = registerService.register(user); - return StringUtils.isEmpty(msg) ? success() : error(msg); + registerService.register(user); + return R.ok(); } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java index c6d887c04..5d9a20615 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java @@ -5,7 +5,7 @@ import cn.hutool.core.util.ObjectUtil; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.controller.BaseController; -import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.domain.entity.SysUser; @@ -64,9 +64,9 @@ public class SysRoleController extends BaseController { @ApiOperation("根据角色编号获取详细信息") @SaCheckPermission("system:role:query") @GetMapping(value = "/{roleId}") - public AjaxResult getInfo(@ApiParam("角色ID") @PathVariable Long roleId) { + public R getInfo(@ApiParam("角色ID") @PathVariable Long roleId) { roleService.checkRoleDataScope(roleId); - return AjaxResult.success(roleService.selectRoleById(roleId)); + return R.ok(roleService.selectRoleById(roleId)); } /** @@ -76,11 +76,11 @@ public class SysRoleController extends BaseController { @SaCheckPermission("system:role:add") @Log(title = "角色管理", businessType = BusinessType.INSERT) @PostMapping - public AjaxResult add(@Validated @RequestBody SysRole role) { + public R add(@Validated @RequestBody SysRole role) { if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role))) { - return AjaxResult.error("新增角色'" + role.getRoleName() + "'失败,角色名称已存在"); + return R.fail("新增角色'" + role.getRoleName() + "'失败,角色名称已存在"); } else if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role))) { - return AjaxResult.error("新增角色'" + role.getRoleName() + "'失败,角色权限已存在"); + return R.fail("新增角色'" + role.getRoleName() + "'失败,角色权限已存在"); } return toAjax(roleService.insertRole(role)); @@ -93,12 +93,13 @@ public class SysRoleController extends BaseController { @SaCheckPermission("system:role:edit") @Log(title = "角色管理", businessType = BusinessType.UPDATE) @PutMapping - public AjaxResult edit(@Validated @RequestBody SysRole role) { + public R edit(@Validated @RequestBody SysRole role) { roleService.checkRoleAllowed(role); + roleService.checkRoleDataScope(role.getRoleId()); if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role))) { - return AjaxResult.error("修改角色'" + role.getRoleName() + "'失败,角色名称已存在"); + return R.fail("修改角色'" + role.getRoleName() + "'失败,角色名称已存在"); } else if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role))) { - return AjaxResult.error("修改角色'" + role.getRoleName() + "'失败,角色权限已存在"); + return R.fail("修改角色'" + role.getRoleName() + "'失败,角色权限已存在"); } if (roleService.updateRole(role) > 0) { @@ -109,9 +110,9 @@ public class SysRoleController extends BaseController { loginUser.setMenuPermission(permissionService.getMenuPermission(sysUser)); LoginHelper.setLoginUser(loginUser); } - return AjaxResult.success(); + return R.ok(); } - return AjaxResult.error("修改角色'" + role.getRoleName() + "'失败,请联系管理员"); + return R.fail("修改角色'" + role.getRoleName() + "'失败,请联系管理员"); } /** @@ -121,8 +122,9 @@ public class SysRoleController extends BaseController { @SaCheckPermission("system:role:edit") @Log(title = "角色管理", businessType = BusinessType.UPDATE) @PutMapping("/dataScope") - public AjaxResult dataScope(@RequestBody SysRole role) { + public R dataScope(@RequestBody SysRole role) { roleService.checkRoleAllowed(role); + roleService.checkRoleDataScope(role.getRoleId()); return toAjax(roleService.authDataScope(role)); } @@ -133,8 +135,9 @@ public class SysRoleController extends BaseController { @SaCheckPermission("system:role:edit") @Log(title = "角色管理", businessType = BusinessType.UPDATE) @PutMapping("/changeStatus") - public AjaxResult changeStatus(@RequestBody SysRole role) { + public R changeStatus(@RequestBody SysRole role) { roleService.checkRoleAllowed(role); + roleService.checkRoleDataScope(role.getRoleId()); return toAjax(roleService.updateRoleStatus(role)); } @@ -145,7 +148,7 @@ public class SysRoleController extends BaseController { @SaCheckPermission("system:role:remove") @Log(title = "角色管理", businessType = BusinessType.DELETE) @DeleteMapping("/{roleIds}") - public AjaxResult remove(@ApiParam("岗位ID串") @PathVariable Long[] roleIds) { + public R remove(@ApiParam("岗位ID串") @PathVariable Long[] roleIds) { return toAjax(roleService.deleteRoleByIds(roleIds)); } @@ -155,8 +158,8 @@ public class SysRoleController extends BaseController { @ApiOperation("获取角色选择框列表") @SaCheckPermission("system:role:query") @GetMapping("/optionselect") - public AjaxResult> optionselect() { - return AjaxResult.success(roleService.selectRoleAll()); + public R> optionselect() { + return R.ok(roleService.selectRoleAll()); } /** @@ -186,7 +189,7 @@ public class SysRoleController extends BaseController { @SaCheckPermission("system:role:edit") @Log(title = "角色管理", businessType = BusinessType.GRANT) @PutMapping("/authUser/cancel") - public AjaxResult cancelAuthUser(@RequestBody SysUserRole userRole) { + public R cancelAuthUser(@RequestBody SysUserRole userRole) { return toAjax(roleService.deleteAuthUser(userRole)); } @@ -201,7 +204,7 @@ public class SysRoleController extends BaseController { @SaCheckPermission("system:role:edit") @Log(title = "角色管理", businessType = BusinessType.GRANT) @PutMapping("/authUser/cancelAll") - public AjaxResult cancelAuthUserAll(Long roleId, Long[] userIds) { + public R cancelAuthUserAll(Long roleId, Long[] userIds) { return toAjax(roleService.deleteAuthUsers(roleId, userIds)); } @@ -216,7 +219,8 @@ public class SysRoleController extends BaseController { @SaCheckPermission("system:role:edit") @Log(title = "角色管理", businessType = BusinessType.GRANT) @PutMapping("/authUser/selectAll") - public AjaxResult selectAuthUserAll(Long roleId, Long[] userIds) { + public R selectAuthUserAll(Long roleId, Long[] userIds) { + roleService.checkRoleDataScope(roleId); return toAjax(roleService.insertAuthUsers(roleId, userIds)); } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java index bc2599831..07553d7aa 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java @@ -1,21 +1,22 @@ package com.ruoyi.web.controller.system; import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.secure.BCrypt; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjectUtil; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.controller.BaseController; -import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.PageQuery; +import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.domain.entity.SysDept; import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.excel.ExcelResult; -import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.helper.LoginHelper; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.system.domain.vo.SysUserExportVo; @@ -88,9 +89,9 @@ public class SysUserController extends BaseController { @Log(title = "用户管理", businessType = BusinessType.IMPORT) @SaCheckPermission("system:user:import") @PostMapping("/importData") - public AjaxResult importData(@RequestPart("file") MultipartFile file, boolean updateSupport) throws Exception { + public R importData(@RequestPart("file") MultipartFile file, boolean updateSupport) throws Exception { ExcelResult result = ExcelUtil.importExcel(file.getInputStream(), SysUserImportVo.class, new SysUserImportListener(updateSupport)); - return AjaxResult.success(result.getAnalysis()); + return R.ok(result.getAnalysis()); } @ApiOperation("下载导入模板") @@ -105,11 +106,11 @@ public class SysUserController extends BaseController { @ApiOperation("根据用户编号获取详细信息") @SaCheckPermission("system:user:query") @GetMapping(value = {"/", "/{userId}"}) - public AjaxResult> getInfo(@ApiParam("用户ID") @PathVariable(value = "userId", required = false) Long userId) { + public R> getInfo(@ApiParam("用户ID") @PathVariable(value = "userId", required = false) Long userId) { userService.checkUserDataScope(userId); Map ajax = new HashMap<>(); List roles = roleService.selectRoleAll(); - ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList())); + ajax.put("roles", LoginHelper.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList())); ajax.put("posts", postService.selectPostAll()); if (ObjectUtil.isNotNull(userId)) { SysUser sysUser = userService.selectUserById(userId); @@ -117,7 +118,7 @@ public class SysUserController extends BaseController { ajax.put("postIds", postService.selectPostListByUserId(userId)); ajax.put("roleIds", sysUser.getRoles().stream().map(SysRole::getRoleId).collect(Collectors.toList())); } - return AjaxResult.success(ajax); + return R.ok(ajax); } /** @@ -127,17 +128,17 @@ public class SysUserController extends BaseController { @SaCheckPermission("system:user:add") @Log(title = "用户管理", businessType = BusinessType.INSERT) @PostMapping - public AjaxResult add(@Validated @RequestBody SysUser user) { + public R add(@Validated @RequestBody SysUser user) { if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(user.getUserName()))) { - return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,登录账号已存在"); + return R.fail("新增用户'" + user.getUserName() + "'失败,登录账号已存在"); } else if (StringUtils.isNotEmpty(user.getPhonenumber()) && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) { - return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,手机号码已存在"); + return R.fail("新增用户'" + user.getUserName() + "'失败,手机号码已存在"); } else if (StringUtils.isNotEmpty(user.getEmail()) && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) { - return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在"); + return R.fail("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在"); } - user.setPassword(SecurityUtils.encryptPassword(user.getPassword())); + user.setPassword(BCrypt.hashpw(user.getPassword())); return toAjax(userService.insertUser(user)); } @@ -148,14 +149,15 @@ public class SysUserController extends BaseController { @SaCheckPermission("system:user:edit") @Log(title = "用户管理", businessType = BusinessType.UPDATE) @PutMapping - public AjaxResult edit(@Validated @RequestBody SysUser user) { + public R edit(@Validated @RequestBody SysUser user) { userService.checkUserAllowed(user); + userService.checkUserDataScope(user.getUserId()); if (StringUtils.isNotEmpty(user.getPhonenumber()) && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) { - return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,手机号码已存在"); + return R.fail("修改用户'" + user.getUserName() + "'失败,手机号码已存在"); } else if (StringUtils.isNotEmpty(user.getEmail()) && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) { - return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在"); + return R.fail("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在"); } return toAjax(userService.updateUser(user)); } @@ -167,9 +169,9 @@ public class SysUserController extends BaseController { @SaCheckPermission("system:user:remove") @Log(title = "用户管理", businessType = BusinessType.DELETE) @DeleteMapping("/{userIds}") - public AjaxResult remove(@ApiParam("角色ID串") @PathVariable Long[] userIds) { + public R remove(@ApiParam("角色ID串") @PathVariable Long[] userIds) { if (ArrayUtil.contains(userIds, getUserId())) { - return error("当前用户不能删除"); + return R.fail("当前用户不能删除"); } return toAjax(userService.deleteUserByIds(userIds)); } @@ -181,9 +183,10 @@ public class SysUserController extends BaseController { @SaCheckPermission("system:user:resetPwd") @Log(title = "用户管理", businessType = BusinessType.UPDATE) @PutMapping("/resetPwd") - public AjaxResult resetPwd(@RequestBody SysUser user) { + public R resetPwd(@RequestBody SysUser user) { userService.checkUserAllowed(user); - user.setPassword(SecurityUtils.encryptPassword(user.getPassword())); + userService.checkUserDataScope(user.getUserId()); + user.setPassword(BCrypt.hashpw(user.getPassword())); return toAjax(userService.resetPwd(user)); } @@ -194,8 +197,9 @@ public class SysUserController extends BaseController { @SaCheckPermission("system:user:edit") @Log(title = "用户管理", businessType = BusinessType.UPDATE) @PutMapping("/changeStatus") - public AjaxResult changeStatus(@RequestBody SysUser user) { + public R changeStatus(@RequestBody SysUser user) { userService.checkUserAllowed(user); + userService.checkUserDataScope(user.getUserId()); return toAjax(userService.updateUserStatus(user)); } @@ -205,13 +209,13 @@ public class SysUserController extends BaseController { @ApiOperation("根据用户编号获取授权角色") @SaCheckPermission("system:user:query") @GetMapping("/authRole/{userId}") - public AjaxResult> authRole(@ApiParam("用户ID") @PathVariable("userId") Long userId) { + public R> authRole(@ApiParam("用户ID") @PathVariable("userId") Long userId) { SysUser user = userService.selectUserById(userId); List roles = roleService.selectRolesByUserId(userId); Map ajax = new HashMap<>(); ajax.put("user", user); - ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList())); - return AjaxResult.success(ajax); + ajax.put("roles", LoginHelper.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList())); + return R.ok(ajax); } /** @@ -225,8 +229,9 @@ public class SysUserController extends BaseController { @SaCheckPermission("system:user:edit") @Log(title = "用户管理", businessType = BusinessType.GRANT) @PutMapping("/authRole") - public AjaxResult insertAuthRole(Long userId, Long[] roleIds) { + public R insertAuthRole(Long userId, Long[] roleIds) { + userService.checkUserDataScope(userId); userService.insertUserAuth(userId, roleIds); - return success(); + return R.ok(); } } diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml index 8fa332c12..4f3fca117 100644 --- a/ruoyi-admin/src/main/resources/application-dev.yml +++ b/ruoyi-admin/src/main/resources/application-dev.yml @@ -9,7 +9,7 @@ spring: # 设置 Spring Boot Admin Server 地址 url: http://localhost:9090/admin instance: - prefer-ip: true # 注册实例时,优先使用 IP + service-host-type: IP username: ruoyi password: 123456 @@ -63,6 +63,23 @@ spring: url: username: password: +# oracle: +# driverClassName: oracle.jdbc.OracleDriver +# url: jdbc:oracle:thin:@//localhost:1521/XE +# username: ROOT +# password: root +# druid: +# validationQuery: SELECT 1 FROM DUAL +# postgres: +# driverClassName: org.postgresql.Driver +# url: jdbc:postgresql://localhost:5432/postgres?useUnicode=true&characterEncoding=utf8&useSSL=true&autoReconnect=true&reWriteBatchedInserts=true +# username: root +# password: root +# sqlserver: +# driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver +# url: jdbc:sqlserver://localhost:1433;DatabaseName=tempdb;SelectMethod=cursor;rewriteBatchedStatements=true +# username: SA +# password: root druid: # 初始连接数 initialSize: 5 @@ -79,7 +96,7 @@ spring: # 配置一个连接在池中最大生存的时间,单位是毫秒 maxEvictableIdleTimeMillis: 900000 # 配置检测连接是否有效 - validationQuery: SELECT 1 FROM DUAL + validationQuery: SELECT 1 testWhileIdle: true testOnBorrow: false testOnReturn: false @@ -150,11 +167,5 @@ redisson: retryAttempts: 3 # 命令重试发送时间间隔,单位:毫秒 retryInterval: 1500 - # 发布和订阅连接的最小空闲连接数 - subscriptionConnectionMinimumIdleSize: 1 # 发布和订阅连接池大小 subscriptionConnectionPoolSize: 50 - # 单个连接最大订阅数量 - subscriptionsPerConnection: 5 - # DNS监测时间间隔,单位:毫秒 - dnsMonitoringInterval: 5000 diff --git a/ruoyi-admin/src/main/resources/application-prod.yml b/ruoyi-admin/src/main/resources/application-prod.yml index cfa8c7cc4..51392215e 100644 --- a/ruoyi-admin/src/main/resources/application-prod.yml +++ b/ruoyi-admin/src/main/resources/application-prod.yml @@ -16,7 +16,7 @@ spring: # 设置 Spring Boot Admin Server 地址 url: http://172.30.0.90:9090/admin instance: - prefer-ip: true # 注册实例时,优先使用 IP + service-host-type: IP username: ruoyi password: 123456 @@ -70,6 +70,23 @@ spring: url: username: password: +# oracle: +# driverClassName: oracle.jdbc.OracleDriver +# url: jdbc:oracle:thin:@//172.30.0.36:1521/XE +# username: ROOT +# password: root +# druid: +# validationQuery: SELECT 1 FROM DUAL +# postgres: +# driverClassName: org.postgresql.Driver +# url: jdbc:postgresql://172.30.0.36:5432/postgres?useUnicode=true&characterEncoding=utf8&useSSL=true&autoReconnect=true&reWriteBatchedInserts=true +# username: root +# password: root +# sqlserver: +# driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver +# url: jdbc:sqlserver://172.30.0.36:1433;DatabaseName=tempdb;SelectMethod=cursor;rewriteBatchedStatements=true +# username: SA +# password: root druid: # 初始连接数 initialSize: 5 @@ -86,7 +103,7 @@ spring: # 配置一个连接在池中最大生存的时间,单位是毫秒 maxEvictableIdleTimeMillis: 900000 # 配置检测连接是否有效 - validationQuery: SELECT 1 FROM DUAL + validationQuery: SELECT 1 testWhileIdle: true testOnBorrow: false testOnReturn: false @@ -157,11 +174,5 @@ redisson: retryAttempts: 3 # 命令重试发送时间间隔,单位:毫秒 retryInterval: 1500 - # 发布和订阅连接的最小空闲连接数 - subscriptionConnectionMinimumIdleSize: 1 # 发布和订阅连接池大小 subscriptionConnectionPoolSize: 50 - # 单个连接最大订阅数量 - subscriptionsPerConnection: 5 - # DNS监测时间间隔,单位:毫秒 - dnsMonitoringInterval: 5000 diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 8c0b6e432..b46caabea 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -142,8 +142,6 @@ security: - /*/api-docs # druid 监控配置 - /druid/** - # 用户放行 - permit-all: # actuator 监控配置 - /actuator - /actuator/** @@ -165,25 +163,15 @@ mybatis-plus: typeAliasesPackage: com.ruoyi.**.domain # 启动时是否检查 MyBatis XML 文件的存在,默认不检查 checkConfigLocation: false - # 通过该属性可指定 MyBatis 的执行器,MyBatis 的执行器总共有三种: - # SIMPLE:每个语句创建新的预处理器 REUSE:会复用预处理器 BATCH:批量执行所有的更新 - executorType: SIMPLE configuration: # 自动驼峰命名规则(camel case)映射 mapUnderscoreToCamelCase: true - # 当设置为 true 的时候,懒加载的对象可能被任何懒属性全部加载,否则,每个属性都按需加载。需要和 lazyLoadingEnabled 一起使用。 - aggressiveLazyLoading: true # MyBatis 自动映射策略 # NONE:不启用 PARTIAL:只对非嵌套 resultMap 自动映射 FULL:对所有 resultMap 自动映射 autoMappingBehavior: PARTIAL # MyBatis 自动映射时未知列或未知属性处理策 # NONE:不做处理 WARNING:打印相关警告 FAILING:抛出异常和详细信息 autoMappingUnknownColumnBehavior: NONE - # Mybatis一级缓存,默认为 SESSION - # SESSION session级别缓存 STATEMENT 关闭一级缓存 - localCacheScope: SESSION - # 开启Mybatis二级缓存,默认为 true - cacheEnabled: false # 更详细的日志输出 会有性能损耗 org.apache.ibatis.logging.stdout.StdOutImpl # 关闭日志记录 (可单纯使用 p6spy 分析) org.apache.ibatis.logging.nologging.NoLoggingImpl # 默认日志输出 org.apache.ibatis.logging.slf4j.Slf4jImpl @@ -191,16 +179,10 @@ mybatis-plus: global-config: # 是否打印 Logo banner banner: true - # 是否初始化 SqlRunner - enableSqlRunner: false dbConfig: # 主键类型 # AUTO 自增 NONE 空 INPUT 用户输入 ASSIGN_ID 雪花 ASSIGN_UUID 唯一 UUID - idType: AUTO - # 表名是否使用驼峰转下划线命名,只对表名生效 - tableUnderline: true - # 大写命名,对表名和字段名均生效 - capitalMode: false + idType: ASSIGN_ID # 逻辑已删除值 logicDeleteValue: 2 # 逻辑未删除值 diff --git a/ruoyi-admin/src/main/resources/i18n/messages.properties b/ruoyi-admin/src/main/resources/i18n/messages.properties index 6db4b42c5..522d1bc86 100644 --- a/ruoyi-admin/src/main/resources/i18n/messages.properties +++ b/ruoyi-admin/src/main/resources/i18n/messages.properties @@ -11,12 +11,18 @@ user.blocked=对不起,您的账号:{0} 已禁用,请联系管理员 role.blocked=角色已封禁,请联系管理员 user.logout.success=退出成功 length.not.valid=长度必须在{min}到{max}个字符之间 +user.username.not.blank=用户名不能为空 user.username.not.valid=* 2到20个汉字、字母、数字或下划线组成,且必须以非数字开头 +user.username.length.valid=账户长度必须在{min}到{max}个字符之间 +user.password.not.blank=用户密码不能为空 +user.password.length.valid=用户密码长度必须在{min}到{max}个字符之间 user.password.not.valid=* 5-50个字符 user.email.not.valid=邮箱格式错误 user.mobile.phone.number.not.valid=手机号格式错误 user.login.success=登录成功 user.register.success=注册成功 +user.register.save.error=保存用户 {0} 失败,注册账号已存在 +user.register.error=注册失败,请联系系统管理人员 user.notfound=请重新登录 user.forcelogout=管理员强制退出,请重新登录 user.unknown.error=未知错误,请重新登录 @@ -30,3 +36,5 @@ no.update.permission=您没有修改数据的权限,请联系管理员添加 no.delete.permission=您没有删除数据的权限,请联系管理员添加权限 [{0}] no.export.permission=您没有导出数据的权限,请联系管理员添加权限 [{0}] no.view.permission=您没有查看数据的权限,请联系管理员添加权限 [{0}] +repeat.submit.message=不允许重复提交,请稍候再试 +rate.limiter.message=访问过于频繁,请稍候再试 diff --git a/ruoyi-admin/src/main/resources/i18n/messages_en_US.properties b/ruoyi-admin/src/main/resources/i18n/messages_en_US.properties index c67beab66..5dbdac59d 100644 --- a/ruoyi-admin/src/main/resources/i18n/messages_en_US.properties +++ b/ruoyi-admin/src/main/resources/i18n/messages_en_US.properties @@ -11,12 +11,18 @@ user.blocked=Sorry, your account: {0} has been disabled. Please contact the admi role.blocked=Role disabled,please contact administrators user.logout.success=Exit successful length.not.valid=The length must be between {min} and {max} characters +user.username.not.blank=Username cannot be blank user.username.not.valid=* 2 to 20 chinese characters, letters, numbers or underscores, and must start with a non number +user.username.length.valid=Account length must be between {min} and {max} characters +user.password.not.blank=Password cannot be empty +user.password.length.valid=Password length must be between {min} and {max} characters user.password.not.valid=* 5-50 characters user.email.not.valid=Mailbox format error user.mobile.phone.number.not.valid=Phone number format error user.login.success=Login successful user.register.success=Register successful +user.register.save.error=Failed to save user {0}, The registered account already exists +user.register.error=Register failed, please contact system administrator user.notfound=Please login again user.forcelogout=The administrator is forced to exit,please login again user.unknown.error=Unknown error, please login again @@ -30,3 +36,5 @@ no.update.permission=You do not have permission to modify data,please contact no.delete.permission=You do not have permission to delete data,please contact your administrator to add permissions [{0}] no.export.permission=You do not have permission to export data,please contact your administrator to add permissions [{0}] no.view.permission=You do not have permission to view data,please contact your administrator to add permissions [{0}] +repeat.submit.message=Repeat submit is not allowed, please try again later +rate.limiter.message=Visit too frequently, please try again later diff --git a/ruoyi-admin/src/main/resources/i18n/messages_zh_CN.properties b/ruoyi-admin/src/main/resources/i18n/messages_zh_CN.properties index 6db4b42c5..522d1bc86 100644 --- a/ruoyi-admin/src/main/resources/i18n/messages_zh_CN.properties +++ b/ruoyi-admin/src/main/resources/i18n/messages_zh_CN.properties @@ -11,12 +11,18 @@ user.blocked=对不起,您的账号:{0} 已禁用,请联系管理员 role.blocked=角色已封禁,请联系管理员 user.logout.success=退出成功 length.not.valid=长度必须在{min}到{max}个字符之间 +user.username.not.blank=用户名不能为空 user.username.not.valid=* 2到20个汉字、字母、数字或下划线组成,且必须以非数字开头 +user.username.length.valid=账户长度必须在{min}到{max}个字符之间 +user.password.not.blank=用户密码不能为空 +user.password.length.valid=用户密码长度必须在{min}到{max}个字符之间 user.password.not.valid=* 5-50个字符 user.email.not.valid=邮箱格式错误 user.mobile.phone.number.not.valid=手机号格式错误 user.login.success=登录成功 user.register.success=注册成功 +user.register.save.error=保存用户 {0} 失败,注册账号已存在 +user.register.error=注册失败,请联系系统管理人员 user.notfound=请重新登录 user.forcelogout=管理员强制退出,请重新登录 user.unknown.error=未知错误,请重新登录 @@ -30,3 +36,5 @@ no.update.permission=您没有修改数据的权限,请联系管理员添加 no.delete.permission=您没有删除数据的权限,请联系管理员添加权限 [{0}] no.export.permission=您没有导出数据的权限,请联系管理员添加权限 [{0}] no.view.permission=您没有查看数据的权限,请联系管理员添加权限 [{0}] +repeat.submit.message=不允许重复提交,请稍候再试 +rate.limiter.message=访问过于频繁,请稍候再试 diff --git a/ruoyi-admin/src/main/resources/logback.xml b/ruoyi-admin/src/main/resources/logback.xml index e8d627531..4d6b910d3 100644 --- a/ruoyi-admin/src/main/resources/logback.xml +++ b/ruoyi-admin/src/main/resources/logback.xml @@ -77,6 +77,26 @@ + + + + 0 + + 512 + + + + + + + + 0 + + 512 + + + + @@ -88,8 +108,8 @@ - - + + diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml index 91a741a4b..81a983f99 100644 --- a/ruoyi-common/pom.xml +++ b/ruoyi-common/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 3.5.0 + 4.0.1 4.0.0 @@ -40,11 +40,6 @@ sa-token-jwt - - org.springframework.security - spring-security-crypto - - org.springframework.boot diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RepeatSubmit.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RepeatSubmit.java index a87466768..d30962d0e 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RepeatSubmit.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RepeatSubmit.java @@ -22,8 +22,8 @@ public @interface RepeatSubmit { TimeUnit timeUnit() default TimeUnit.MILLISECONDS; /** - * 提示消息 + * 提示消息 支持国际化 格式为 {code} */ - String message() default "不允许重复提交,请稍候再试"; + String message() default "{repeat.submit.message}"; } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/captcha/UnsignedMathGenerator.java b/ruoyi-common/src/main/java/com/ruoyi/common/captcha/UnsignedMathGenerator.java index 7b908a24f..5dd00ec08 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/captcha/UnsignedMathGenerator.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/captcha/UnsignedMathGenerator.java @@ -41,14 +41,14 @@ public class UnsignedMathGenerator implements CodeGenerator { @Override public String generate() { final int limit = getLimit(); - int min = RandomUtil.randomInt(limit); - int max = RandomUtil.randomInt(min, limit); - String number1 = Integer.toString(max); - String number2 = Integer.toString(min); - number1 = StringUtils.rightPad(number1, this.numberLength, CharUtil.SPACE); - number2 = StringUtils.rightPad(number2, this.numberLength, CharUtil.SPACE); + int a = RandomUtil.randomInt(limit); + int b = RandomUtil.randomInt(limit); + String max = Integer.toString(Math.max(a,b)); + String min = Integer.toString(Math.min(a,b)); + max = StringUtils.rightPad(max, this.numberLength, CharUtil.SPACE); + min = StringUtils.rightPad(min, this.numberLength, CharUtil.SPACE); - return number1 + RandomUtil.randomChar(OPERATORS) + number2 + '='; + return max + RandomUtil.randomChar(OPERATORS) + min + '='; } @Override diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/config/RuoYiConfig.java b/ruoyi-common/src/main/java/com/ruoyi/common/config/RuoYiConfig.java index bcfc677bd..8ce7a8c4f 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/config/RuoYiConfig.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/config/RuoYiConfig.java @@ -2,7 +2,6 @@ package com.ruoyi.common.config; import lombok.Data; import lombok.Getter; -import lombok.experimental.Accessors; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; @@ -13,7 +12,6 @@ import org.springframework.stereotype.Component; */ @Data -@Accessors(chain = true) @Component @ConfigurationProperties(prefix = "ruoyi") public class RuoYiConfig { diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java index 5e07c96c0..e2ffebdc0 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java @@ -65,12 +65,12 @@ public interface Constants { /** * 登录用户 redis key */ - public static final String LOGIN_TOKEN_KEY = "Authorization:login:token:"; + String LOGIN_TOKEN_KEY = "Authorization:login:token:"; /** * 在线用户 redis key */ - public static final String ONLINE_TOKEN_KEY = "online_tokens:"; + String ONLINE_TOKEN_KEY = "online_tokens:"; /** * 防重提交 redis key diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/GenConstants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/GenConstants.java index 60bf88130..bb08d50a5 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/GenConstants.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/GenConstants.java @@ -181,6 +181,11 @@ public interface GenConstants { */ String QUERY_LIKE = "LIKE"; + /** + * 相等查询 + */ + String QUERY_EQ = "EQ"; + /** * 需要 */ diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/UserConstants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/UserConstants.java index eebbb4b46..9f800be2f 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/UserConstants.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/UserConstants.java @@ -22,11 +22,21 @@ public interface UserConstants { */ String EXCEPTION = "1"; + /** + * 用户正常状态 + */ + String USER_NORMAL = "0"; + /** * 用户封禁状态 */ String USER_DISABLE = "1"; + /** + * 角色正常状态 + */ + String ROLE_NORMAL = "0"; + /** * 角色封禁状态 */ @@ -62,6 +72,16 @@ public interface UserConstants { */ String NO_FRAME = "1"; + /** + * 菜单正常状态 + */ + String MENU_NORMAL = "0"; + + /** + * 菜单停用状态 + */ + String MENU_DISABLE = "1"; + /** * 菜单类型(目录) */ @@ -109,4 +129,10 @@ public interface UserConstants { */ int PASSWORD_MIN_LENGTH = 5; int PASSWORD_MAX_LENGTH = 20; + + /** + * 管理员ID + */ + Long ADMIN_ID = 1L; + } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/controller/BaseController.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/controller/BaseController.java index 26e00dff6..1e0a5d524 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/controller/BaseController.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/controller/BaseController.java @@ -1,6 +1,6 @@ package com.ruoyi.common.core.controller; -import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.helper.LoginHelper; import com.ruoyi.common.utils.StringUtils; @@ -8,46 +8,18 @@ import com.ruoyi.common.utils.StringUtils; /** * web层通用数据处理 * - * @author ruoyi + * @author Lion Li */ public class BaseController { - /** - * 返回成功 - */ - 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); - } - /** * 响应返回结果 * * @param rows 影响行数 * @return 操作结果 */ - protected AjaxResult toAjax(int rows) { - return rows > 0 ? AjaxResult.success() : AjaxResult.error(); + protected R toAjax(int rows) { + return rows > 0 ? R.ok() : R.fail(); } /** @@ -56,8 +28,8 @@ public class BaseController { * @param result 结果 * @return 操作结果 */ - protected AjaxResult toAjax(boolean result) { - return result ? success() : error(); + protected R toAjax(boolean result) { + return result ? R.ok() : R.fail(); } /** diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/AjaxResult.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/AjaxResult.java deleted file mode 100644 index 158da5fa7..000000000 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/AjaxResult.java +++ /dev/null @@ -1,134 +0,0 @@ -package com.ruoyi.common.core.domain; - -import cn.hutool.http.HttpStatus; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -/** - * 操作消息提醒 - * - * @author Lion Li - */ -@Data -@NoArgsConstructor -@AllArgsConstructor -@Accessors(chain = true) -@ApiModel("请求响应对象") -public class AjaxResult { - - private static final long serialVersionUID = 1L; - - /** - * 状态码 - */ - @ApiModelProperty("消息状态码") - private int code; - - /** - * 返回内容 - */ - @ApiModelProperty("消息内容") - private String msg; - - /** - * 数据对象 - */ - @ApiModelProperty("数据对象") - private T data; - - /** - * 初始化一个新创建的 AjaxResult 对象 - * - * @param code 状态码 - * @param msg 返回内容 - */ - public AjaxResult(int code, String msg) { - this.code = code; - this.msg = msg; - } - - /** - * 返回成功消息 - * - * @return 成功消息 - */ - public static AjaxResult success() { - return AjaxResult.success("操作成功"); - } - - /** - * 返回成功数据 - * - * @return 成功消息 - */ - public static AjaxResult success(T data) { - return AjaxResult.success("操作成功", data); - } - - /** - * 返回成功消息 - * - * @param msg 返回内容 - * @return 成功消息 - */ - public static AjaxResult success(String msg) { - return AjaxResult.success(msg, null); - } - - /** - * 返回成功消息 - * - * @param msg 返回内容 - * @param data 数据对象 - * @return 成功消息 - */ - public static AjaxResult success(String msg, T data) { - return new AjaxResult<>(HttpStatus.HTTP_OK, msg, data); - } - - /** - * 返回错误消息 - * - * @return - */ - public static AjaxResult error() { - return AjaxResult.error("操作失败"); - } - - /** - * 返回错误消息 - * - * @param msg 返回内容 - * @return 警告消息 - */ - public static AjaxResult error(String msg) { - return AjaxResult.error(msg, null); - } - - /** - * 返回错误消息 - * - * @param msg 返回内容 - * @param data 数据对象 - * @return 警告消息 - */ - public static AjaxResult error(String msg, T data) { - return new AjaxResult<>(HttpStatus.HTTP_INTERNAL_ERROR, msg, data); - } - - /** - * 返回错误消息 - * - * @param code 状态码 - * @param msg 返回内容 - * @return 警告消息 - */ - public static AjaxResult error(int code, String msg) { - return new AjaxResult<>(code, msg, null); - } - -} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java index 9c7857a56..d1ad296f6 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java @@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import lombok.experimental.Accessors; import java.io.Serializable; import java.util.Date; @@ -18,7 +17,6 @@ import java.util.Map; */ @Data -@Accessors(chain = true) public class BaseEntity implements Serializable { private static final long serialVersionUID = 1L; diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/PageQuery.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/PageQuery.java index 5ffd58892..7a61237c9 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/PageQuery.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/PageQuery.java @@ -7,7 +7,6 @@ import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.sql.SqlUtil; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import lombok.experimental.Accessors; import java.io.Serializable; @@ -18,7 +17,6 @@ import java.io.Serializable; */ @Data -@Accessors(chain = true) public class PageQuery implements Serializable { private static final long serialVersionUID = 1L; diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/R.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/R.java new file mode 100644 index 000000000..7a2420238 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/R.java @@ -0,0 +1,84 @@ +package com.ruoyi.common.core.domain; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 响应信息主体 + * + * @author Lion Li + */ +@Data +@NoArgsConstructor +@ApiModel("请求响应对象") +public class R implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 成功 + */ + public static final int SUCCESS = 200; + + /** + * 失败 + */ + public static final int FAIL = 500; + + @ApiModelProperty("消息状态码") + private int code; + + @ApiModelProperty("消息内容") + private String msg; + + @ApiModelProperty("数据对象") + private T data; + + public static R ok() { + return restResult(null, SUCCESS, "操作成功"); + } + + public static R ok(T data) { + return restResult(data, SUCCESS, "操作成功"); + } + + public static R ok(String msg) { + return restResult(null, SUCCESS, msg); + } + + public static R ok(String msg, T data) { + return restResult(data, SUCCESS, msg); + } + + public static R fail() { + return restResult(null, FAIL, "操作失败"); + } + + public static R fail(String msg) { + return restResult(null, FAIL, msg); + } + + public static R fail(T data) { + return restResult(data, FAIL, "操作失败"); + } + + public static R fail(String msg, T data) { + return restResult(data, FAIL, msg); + } + + public static R fail(int code, String msg) { + return restResult(null, code, msg); + } + + private static R restResult(T data, int code, String msg) { + R r = new R<>(); + r.setCode(code); + r.setData(data); + r.setMsg(msg); + return r; + } + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeEntity.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeEntity.java index 819e6b72a..f44eacd49 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeEntity.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeEntity.java @@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; import java.util.ArrayList; import java.util.List; @@ -17,8 +16,7 @@ import java.util.List; @Data @EqualsAndHashCode(callSuper = true) -@Accessors(chain = true) -public class TreeEntity extends BaseEntity { +public class TreeEntity extends BaseEntity { private static final long serialVersionUID = 1L; @@ -40,6 +38,6 @@ public class TreeEntity extends BaseEntity { */ @TableField(exist = false) @ApiModelProperty(value = "子部门") - private List children = new ArrayList<>(); + private List children = new ArrayList<>(); } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/dto/OperLogDTO.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/dto/OperLogDTO.java index 773858f64..26bf67440 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/dto/OperLogDTO.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/dto/OperLogDTO.java @@ -1,8 +1,6 @@ package com.ruoyi.common.core.domain.dto; import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; import java.io.Serializable; import java.util.Date; @@ -14,8 +12,6 @@ import java.util.Date; */ @Data -@NoArgsConstructor -@Accessors(chain = true) public class OperLogDTO implements Serializable { private static final long serialVersionUID = 1L; diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/dto/RoleDTO.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/dto/RoleDTO.java new file mode 100644 index 000000000..e25243f5a --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/dto/RoleDTO.java @@ -0,0 +1,38 @@ +package com.ruoyi.common.core.domain.dto; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 角色 + * + * @author Lion Li + */ + +@Data +@NoArgsConstructor +public class RoleDTO implements Serializable { + + /** + * 角色ID + */ + private Long roleId; + + /** + * 角色名称 + */ + private String roleName; + + /** + * 角色权限 + */ + private String roleKey; + + /** + * 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限) + */ + private String dataScope; + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/dto/UserOnlineDTO.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/dto/UserOnlineDTO.java index 5eb52806c..29ce1d1e7 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/dto/UserOnlineDTO.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/dto/UserOnlineDTO.java @@ -1,8 +1,8 @@ package com.ruoyi.common.core.domain.dto; +import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; import java.io.Serializable; @@ -14,7 +14,6 @@ import java.io.Serializable; @Data @NoArgsConstructor -@Accessors(chain = true) public class UserOnlineDTO implements Serializable { private static final long serialVersionUID = 1L; diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDept.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDept.java index da60bd019..2dc3bdc40 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDept.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDept.java @@ -8,7 +8,6 @@ import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; import javax.validation.constraints.Email; import javax.validation.constraints.NotBlank; @@ -23,10 +22,9 @@ import javax.validation.constraints.Size; @Data @EqualsAndHashCode(callSuper = true) -@Accessors(chain = true) @TableName("sys_dept") @ApiModel("部门业务对象") -public class SysDept extends TreeEntity { +public class SysDept extends TreeEntity { private static final long serialVersionUID = 1L; /** @@ -49,7 +47,7 @@ public class SysDept extends TreeEntity { */ @ApiModelProperty(value = "显示顺序") @NotNull(message = "显示顺序不能为空") - private Long orderNum; + private Integer orderNum; /** * 负责人 diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictData.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictData.java index 241aecd87..c61c91726 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictData.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictData.java @@ -12,7 +12,6 @@ import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; import javax.validation.constraints.NotBlank; import javax.validation.constraints.Size; @@ -25,7 +24,6 @@ import javax.validation.constraints.Size; @Data @EqualsAndHashCode(callSuper = true) -@Accessors(chain = true) @TableName("sys_dict_data") @ExcelIgnoreUnannotated @ApiModel("字典数据业务对象") @@ -44,7 +42,7 @@ public class SysDictData extends BaseEntity { */ @ApiModelProperty(value = "字典排序") @ExcelProperty(value = "字典排序") - private Long dictSort; + private Integer dictSort; /** * 字典标签 diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictType.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictType.java index 702ec09d3..082a5bee7 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictType.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictType.java @@ -24,7 +24,6 @@ import javax.validation.constraints.Size; @Data @EqualsAndHashCode(callSuper = true) -@Accessors(chain = true) @TableName("sys_dict_type") @ExcelIgnoreUnannotated @ApiModel("字典类型业务对象") diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java index 4429b3db7..cf337fbeb 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java @@ -1,14 +1,13 @@ package com.ruoyi.common.core.domain.entity; -import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonInclude; import com.ruoyi.common.core.domain.TreeEntity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; @@ -22,10 +21,9 @@ import javax.validation.constraints.Size; @Data @EqualsAndHashCode(callSuper = true) -@Accessors(chain = true) @TableName("sys_menu") @ApiModel("菜单权限业务对象") -public class SysMenu extends TreeEntity { +public class SysMenu extends TreeEntity { /** * 菜单ID @@ -47,7 +45,7 @@ public class SysMenu extends TreeEntity { */ @ApiModelProperty(value = "显示顺序") @NotNull(message = "显示顺序不能为空") - private Long orderNum; + private Integer orderNum; /** * 路由地址 @@ -67,8 +65,7 @@ public class SysMenu extends TreeEntity { * 路由参数 */ @ApiModelProperty(value = "路由参数") - @TableField("`query`") - private String query; + private String queryParam; /** * 是否为外链(0是 1否) @@ -105,6 +102,7 @@ public class SysMenu extends TreeEntity { * 权限字符串 */ @ApiModelProperty(value = "权限字符串") + @JsonInclude(JsonInclude.Include.NON_NULL) @Size(min = 0, max = 100, message = "权限标识长度不能超过100个字符") private String perms; diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRole.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRole.java index 3153e41b1..8d9166097 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRole.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRole.java @@ -7,15 +7,16 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; import com.ruoyi.common.annotation.ExcelDictFormat; +import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.convert.ExcelDictConvert; import com.ruoyi.common.core.domain.BaseEntity; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; /** @@ -27,7 +28,6 @@ import javax.validation.constraints.Size; @Data @NoArgsConstructor @EqualsAndHashCode(callSuper = true) -@Accessors(chain = true) @TableName("sys_role") @ExcelIgnoreUnannotated public class SysRole extends BaseEntity { @@ -63,8 +63,8 @@ public class SysRole extends BaseEntity { */ @ApiModelProperty(value = "角色排序") @ExcelProperty(value = "角色排序") - @NotBlank(message = "显示顺序不能为空") - private String roleSort; + @NotNull(message = "显示顺序不能为空") + private Integer roleSort; /** * 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限) @@ -78,13 +78,13 @@ public class SysRole extends BaseEntity { * 菜单树选择项是否关联显示( 0:父子不互相关联显示 1:父子互相关联显示) */ @ApiModelProperty(value = "菜单树选择项是否关联显示( 0:父子不互相关联显示 1:父子互相关联显示)") - private boolean menuCheckStrictly; + private Integer menuCheckStrictly; /** * 部门树选择项是否关联显示(0:父子不互相关联显示 1:父子互相关联显示 ) */ @ApiModelProperty(value = "部门树选择项是否关联显示(0:父子不互相关联显示 1:父子互相关联显示 )") - private boolean deptCheckStrictly; + private Integer deptCheckStrictly; /** * 角色状态(0正常 1停用) @@ -134,11 +134,7 @@ public class SysRole extends BaseEntity { @ApiModelProperty(value = "是否管理员") public boolean isAdmin() { - return isAdmin(this.roleId); - } - - public static boolean isAdmin(Long roleId) { - return roleId != null && 1L == roleId; + return UserConstants.ADMIN_ID.equals(this.roleId); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java index bc3170d3b..6885e95cf 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import com.ruoyi.common.annotation.Sensitive; +import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.domain.BaseEntity; import com.ruoyi.common.enums.SensitiveStrategy; import com.ruoyi.common.xss.Xss; @@ -12,7 +13,6 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; import javax.validation.constraints.Email; import javax.validation.constraints.NotBlank; @@ -29,7 +29,6 @@ import java.util.List; @Data @NoArgsConstructor @EqualsAndHashCode(callSuper = true) -@Accessors(chain = true) @TableName("sys_user") @ApiModel("用户信息业务对象") public class SysUser extends BaseEntity { @@ -187,11 +186,7 @@ public class SysUser extends BaseEntity { @ApiModelProperty(value = "是否管理员") public boolean isAdmin() { - return isAdmin(this.userId); - } - - public static boolean isAdmin(Long userId) { - return userId != null && 1L == userId; + return UserConstants.ADMIN_ID.equals(this.userId); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginBody.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginBody.java index d47053694..f13de9711 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginBody.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginBody.java @@ -1,43 +1,49 @@ -package com.ruoyi.common.core.domain.model; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * 用户登录对象 - * - * @author Lion Li - */ - -@Data -@Accessors(chain = true) -@ApiModel("用户登录对象") -public class LoginBody { - - /** - * 用户名 - */ - @ApiModelProperty(value = "用户名") - private String username; - - /** - * 用户密码 - */ - @ApiModelProperty(value = "用户密码") - private String password; - - /** - * 验证码 - */ - @ApiModelProperty(value = "验证码") - private String code; - - /** - * 唯一标识 - */ - @ApiModelProperty(value = "唯一标识") - private String uuid = ""; - -} +package com.ruoyi.common.core.domain.model; + +import com.ruoyi.common.constant.UserConstants; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; + +/** + * 用户登录对象 + * + * @author Lion Li + */ + +@Data +@ApiModel("用户登录对象") +public class LoginBody { + + /** + * 用户名 + */ + @NotBlank(message = "{user.username.not.blank}") + @Length(min = UserConstants.USERNAME_MIN_LENGTH, max = UserConstants.USERNAME_MAX_LENGTH, message = "{user.username.length.valid}") + @ApiModelProperty(value = "用户名") + private String username; + + /** + * 用户密码 + */ + @NotBlank(message = "{user.password.not.blank}") + @Length(min = UserConstants.PASSWORD_MIN_LENGTH, max = UserConstants.PASSWORD_MAX_LENGTH, message = "{user.password.length.valid}") + @ApiModelProperty(value = "用户密码") + private String password; + + /** + * 验证码 + */ + @ApiModelProperty(value = "验证码") + private String code; + + /** + * 唯一标识 + */ + @ApiModelProperty(value = "唯一标识") + private String uuid; + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java index c93bd1cf6..9f7186c48 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java @@ -1,11 +1,12 @@ package com.ruoyi.common.core.domain.model; +import com.ruoyi.common.core.domain.dto.RoleDTO; import com.ruoyi.common.helper.LoginHelper; import lombok.Data; import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; import java.io.Serializable; +import java.util.List; import java.util.Set; /** @@ -16,7 +17,6 @@ import java.util.Set; @Data @NoArgsConstructor -@Accessors(chain = true) public class LoginUser implements Serializable { private static final long serialVersionUID = 1L; @@ -31,6 +31,11 @@ public class LoginUser implements Serializable { */ private Long deptId; + /** + * 部门名 + */ + private String deptName; + /** * 用户唯一标识 */ @@ -86,6 +91,16 @@ public class LoginUser implements Serializable { */ private String username; + /** + * 角色对象 + */ + private List roles; + + /** + * 数据权限 当前角色ID + */ + private Long roleId; + /** * 获取登录id */ diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/RegisterBody.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/RegisterBody.java index b034dc1d4..bd9b84cca 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/RegisterBody.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/RegisterBody.java @@ -4,7 +4,6 @@ import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; /** * 用户注册对象 @@ -13,7 +12,6 @@ import lombok.experimental.Accessors; */ @Data @EqualsAndHashCode(callSuper = true) -@Accessors(chain = true) @ApiModel("用户注册对象") public class RegisterBody extends LoginBody { diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/mapper/BaseMapperPlus.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/mapper/BaseMapperPlus.java index de297935c..1ff35792f 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/mapper/BaseMapperPlus.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/mapper/BaseMapperPlus.java @@ -106,9 +106,9 @@ public interface BaseMapperPlus extends BaseMapper { Assert.notNull(tableInfo, "error: can not execute. because can not find cache of TableInfo for entity!"); String keyProperty = tableInfo.getKeyProperty(); Assert.notEmpty(keyProperty, "error: can not execute. because can not find column for id from entity!"); - return SqlHelper.saveOrUpdateBatch(this.currentModelClass(), getClass(), log, entityList, batchSize, (sqlSession, entity) -> { + return SqlHelper.saveOrUpdateBatch(this.currentModelClass(), this.currentMapperClass(), log, entityList, batchSize, (sqlSession, entity) -> { Object idVal = tableInfo.getPropertyValue(entity, keyProperty); - String sqlStatement = SqlHelper.getSqlStatement(this.currentMapperClass(), SqlMethod.INSERT_ONE); + String sqlStatement = SqlHelper.getSqlStatement(this.currentMapperClass(), SqlMethod.SELECT_BY_ID); return StringUtils.checkValNull(idVal) || CollectionUtils.isEmpty(sqlSession.selectList(sqlStatement, entity)); }, (sqlSession, entity) -> { diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableDataInfo.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableDataInfo.java index b2537c18e..48353e3e7 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableDataInfo.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableDataInfo.java @@ -19,7 +19,6 @@ import java.util.List; @Data @NoArgsConstructor -@Accessors(chain = true) @ApiModel("分页响应对象") public class TableDataInfo implements Serializable { private static final long serialVersionUID = 1L; diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/service/UserService.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/service/UserService.java deleted file mode 100644 index e637f4731..000000000 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/service/UserService.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.ruoyi.common.core.service; - -import com.ruoyi.common.core.domain.entity.SysUser; - -/** - * 通用 用户业务 - * - * @author Lion Li - */ -public interface UserService { - - /** - * 通过用户名查询用户 - * - * @param userName 用户名 - * @return 用户对象信息 - */ - SysUser selectUserByUserName(String userName); - - /** - * 通过用户ID查询用户 - * - * @param userId 用户ID - * @return 用户对象信息 - */ - SysUser selectUserById(Long userId); - -} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataBaseType.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataBaseType.java new file mode 100644 index 000000000..5d0f05ad7 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataBaseType.java @@ -0,0 +1,49 @@ +package com.ruoyi.common.enums; + +import com.ruoyi.common.utils.StringUtils; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 数据库类型 + * + * @author Lion Li + */ +@Getter +@AllArgsConstructor +public enum DataBaseType { + + /** + * MySQL + */ + MY_SQL("MySQL"), + + /** + * Oracle + */ + ORACLE("Oracle"), + + /** + * PostgreSQL + */ + POSTGRE_SQL("PostgreSQL"), + + /** + * SQL Server + */ + SQL_SERVER("Microsoft SQL Server"); + + private final String type; + + public static DataBaseType find(String databaseProductName) { + if (StringUtils.isBlank(databaseProductName)) { + return null; + } + for (DataBaseType type : values()) { + if (type.getType().equals(databaseProductName)) { + return type; + } + } + return null; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataScopeType.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataScopeType.java index 58bc76140..64324652b 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataScopeType.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataScopeType.java @@ -9,7 +9,7 @@ import lombok.Getter; *

* 语法支持 spel 模板表达式 *

- * 内置数据 user 当前用户 内容参考 SysUser + * 内置数据 user 当前用户 内容参考 LoginUser * 如需扩展数据 可使用 {@link com.ruoyi.common.helper.DataPermissionHelper} 操作 * 内置服务 sdss 系统数据权限服务 内容参考 SysDataScopeService * 如需扩展更多自定义服务 可以参考 sdss 自行编写 diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/helper/DataBaseHelper.java b/ruoyi-common/src/main/java/com/ruoyi/common/helper/DataBaseHelper.java new file mode 100644 index 000000000..196035629 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/helper/DataBaseHelper.java @@ -0,0 +1,72 @@ +package com.ruoyi.common.helper; + +import cn.hutool.core.convert.Convert; +import com.baomidou.dynamic.datasource.DynamicRoutingDataSource; +import com.ruoyi.common.enums.DataBaseType; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.spring.SpringUtils; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.SQLException; + +/** + * 数据库助手 + * + * @author Lion Li + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class DataBaseHelper { + + private static final DynamicRoutingDataSource DS = SpringUtils.getBean(DynamicRoutingDataSource.class); + + /** + * 获取当前数据库类型 + */ + public static DataBaseType getDataBaseType() { + DataSource dataSource = DS.determineDataSource(); + try (Connection conn = dataSource.getConnection()) { + DatabaseMetaData metaData = conn.getMetaData(); + String databaseProductName = metaData.getDatabaseProductName(); + return DataBaseType.find(databaseProductName); + } catch (SQLException e) { + throw new ServiceException(e.getMessage()); + } + } + + public static boolean isMySql() { + return DataBaseType.MY_SQL == getDataBaseType(); + } + + public static boolean isOracle() { + return DataBaseType.ORACLE == getDataBaseType(); + } + + public static boolean isPostgerSql() { + return DataBaseType.POSTGRE_SQL == getDataBaseType(); + } + + public static boolean isSqlServer() { + return DataBaseType.SQL_SERVER == getDataBaseType(); + } + + public static String findInSet(Object var1, String var2) { + DataBaseType dataBasyType = getDataBaseType(); + String var = Convert.toStr(var1); + if (dataBasyType == DataBaseType.SQL_SERVER) { + // charindex(',100,' , ',0,100,101,') <> 0 + return "charindex('," + var + ",' , ','+" + var2 + "+',') <> 0"; + } else if (dataBasyType == DataBaseType.POSTGRE_SQL) { + // (select position(',100,' in ',0,100,101,')) <> 0 + return "(select position('," + var + ",' in ','||" + var2 + "||',')) <> 0"; + } else if (dataBasyType == DataBaseType.ORACLE) { + // instr(',0,100,101,' , ',100,') <> 0 + return "instr(','||" + var2 + "||',' , '," + var + ",') <> 0"; + } + // find_in_set(100 , '0,100,101') + return "find_in_set(" + var + " , " + var2 + ") <> 0"; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/helper/LoginHelper.java b/ruoyi-common/src/main/java/com/ruoyi/common/helper/LoginHelper.java index 66b5854af..7875c5630 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/helper/LoginHelper.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/helper/LoginHelper.java @@ -2,6 +2,7 @@ package com.ruoyi.common.helper; import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.util.ObjectUtil; +import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.enums.DeviceType; import com.ruoyi.common.enums.UserType; @@ -12,7 +13,13 @@ import lombok.NoArgsConstructor; /** * 登录鉴权助手 - * 为适配多端登录而封装 + * + * user_type 为 用户类型 同一个用户表 可以有多种用户类型 例如 pc,app + * deivce 为 设备类型 同一个用户类型 可以有 多种设备类型 例如 web,ios + * 可以组成 用户类型与设备类型多对多的 权限灵活控制 + * + * 多用户体系 针对 多种用户类型 但权限控制不一致 + * 可以组成 多用户类型表与多设备类型 分别控制权限 * * @author Lion Li */ @@ -26,22 +33,23 @@ public class LoginHelper { /** * 登录系统 - * 针对两套用户体系 * * @param loginUser 登录用户信息 */ public static void login(LoginUser loginUser) { + LOGIN_CACHE.set(loginUser); StpUtil.login(loginUser.getLoginId()); setLoginUser(loginUser); } /** * 登录系统 基于 设备类型 - * 针对一套用户体系 + * 针对相同用户体系不同设备 * * @param loginUser 登录用户信息 */ public static void loginByDevice(LoginUser loginUser, DeviceType deviceType) { + LOGIN_CACHE.set(loginUser); StpUtil.login(loginUser.getLoginId(), deviceType.getDevice()); setLoginUser(loginUser); } @@ -51,7 +59,6 @@ public class LoginHelper { */ public static void setLoginUser(LoginUser loginUser) { StpUtil.getTokenSession().set(LOGIN_USER_KEY, loginUser); - LOGIN_CACHE.set(loginUser); } /** @@ -117,4 +124,18 @@ public class LoginHelper { return UserType.getUserType(loginId); } + /** + * 是否为管理员 + * + * @param userId 用户ID + * @return 结果 + */ + public static boolean isAdmin(Long userId) { + return UserConstants.ADMIN_ID.equals(userId); + } + + public static boolean isAdmin() { + return isAdmin(getUserId()); + } + } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/BeanCopyUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/BeanCopyUtils.java index 0bd4a55b9..23ace00f9 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/BeanCopyUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/BeanCopyUtils.java @@ -13,6 +13,10 @@ import java.util.Map; /** * bean深拷贝工具(基于 cglib 性能优异) + *

+ * 重点 cglib 不支持 拷贝到链式对象 + * 例如: 源对象 拷贝到 目标(链式对象) + * 请区分好`浅拷贝`和`深拷贝`再做使用 * * @author Lion Li */ diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java index 9d1a14cd1..e3cb9c56a 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java @@ -7,6 +7,11 @@ import org.apache.commons.lang3.time.DateFormatUtils; import java.lang.management.ManagementFactory; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.ZoneId; +import java.time.ZonedDateTime; import java.util.Date; /** @@ -116,6 +121,14 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils { return new Date(time); } + /** + * 计算相差天数 + */ + public static int differentDaysByMillisecond(Date date1, Date date2) + { + return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24))); + } + /** * 计算两个时间差 */ @@ -136,4 +149,21 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils { // long sec = diff % nd % nh % nm / ns; 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()); + } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/JsonUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/JsonUtils.java index 11004be86..446bf1b00 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/JsonUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/JsonUtils.java @@ -1,5 +1,6 @@ package com.ruoyi.common.utils; +import cn.hutool.core.lang.Dict; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjectUtil; import com.fasterxml.jackson.core.JsonProcessingException; @@ -12,7 +13,6 @@ import lombok.NoArgsConstructor; import java.io.IOException; import java.util.ArrayList; import java.util.List; -import java.util.Map; /** * JSON 工具类 @@ -72,13 +72,23 @@ public class JsonUtils { } } - public static Map parseMap(String text) { + public static Dict parseMap(String text) { if (StringUtils.isBlank(text)) { return null; } try { - return OBJECT_MAPPER.readValue(text, new TypeReference>() { - }); + return OBJECT_MAPPER.readValue(text, OBJECT_MAPPER.getTypeFactory().constructType(Dict.class)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public static List parseArrayMap(String text) { + if (StringUtils.isBlank(text)) { + return null; + } + try { + return OBJECT_MAPPER.readValue(text, OBJECT_MAPPER.getTypeFactory().constructCollectionType(List.class, Dict.class)); } catch (IOException e) { throw new RuntimeException(e); } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java deleted file mode 100644 index 72c9453c0..000000000 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.ruoyi.common.utils; - -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; - -/** - * 安全服务工具类 - * - * @author Long Li - */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class SecurityUtils { - - /** - * 生成BCryptPasswordEncoder密码 - * - * @param password 密码 - * @return 加密字符串 - */ - public static String encryptPassword(String password) { - BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); - return passwordEncoder.encode(password); - } - - /** - * 判断密码是否相同 - * - * @param rawPassword 真实密码 - * @param encodedPassword 加密后字符 - * @return 结果 - */ - public static boolean matchesPassword(String rawPassword, String encodedPassword) { - BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); - return passwordEncoder.matches(rawPassword, encodedPassword); - } - - /** - * 是否为管理员 - * - * @param userId 用户ID - * @return 结果 - */ - public static boolean isAdmin(Long userId) { - return userId != null && 1L == userId; - } -} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ServletUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ServletUtils.java index 5babaeb30..6408c8944 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ServletUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ServletUtils.java @@ -97,9 +97,8 @@ public class ServletUtils extends ServletUtil { * * @param response 渲染对象 * @param string 待渲染的字符串 - * @return null */ - public static String renderString(HttpServletResponse response, String string) { + public static void renderString(HttpServletResponse response, String string) { try { response.setStatus(HttpStatus.HTTP_OK); response.setContentType(MediaType.APPLICATION_JSON_VALUE); @@ -108,7 +107,6 @@ public class ServletUtils extends ServletUtil { } catch (IOException e) { e.printStackTrace(); } - return null; } /** @@ -119,12 +117,12 @@ public class ServletUtils extends ServletUtil { public static boolean isAjaxRequest(HttpServletRequest request) { String accept = request.getHeader("accept"); - if (accept != null && accept.indexOf("application/json") != -1) { + if (accept != null && accept.contains("application/json")) { return true; } String xRequestedWith = request.getHeader("X-Requested-With"); - if (xRequestedWith != null && xRequestedWith.indexOf("XMLHttpRequest") != -1) { + if (xRequestedWith != null && xRequestedWith.contains("XMLHttpRequest")) { return true; } @@ -134,10 +132,7 @@ public class ServletUtils extends ServletUtil { } String ajax = request.getParameter("__ajax"); - if (StringUtils.equalsAnyIgnoreCase(ajax, "json", "xml")) { - return true; - } - return false; + return StringUtils.equalsAnyIgnoreCase(ajax, "json", "xml"); } public static String getClientIP() { diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java index 77a484ec8..16f8861c1 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java @@ -86,7 +86,7 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils { * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可
* 例:
* 通常使用:format("this is {} for {}", "a", "b") -> this is a for b
- * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a
+ * 转义{}: format("this is \\{} for {}", "a", "b") -> this is {} for a
* 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b
* * @param template 文本模板,被替换的部分用 {} 表示 @@ -231,4 +231,43 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils { return matcher.match(pattern, url); } + /** + * 数字左边补齐0,使之达到指定长度。注意,如果数字转换为字符串后,长度大于size,则只保留 最后size个字符。 + * + * @param num 数字对象 + * @param size 字符串指定长度 + * @return 返回数字的字符串格式,该字符串为指定长度。 + */ + public static final String padl(final Number num, final int size) { + return padl(num.toString(), size, '0'); + } + + /** + * 字符串左补齐。如果原始字符串s长度大于size,则只保留最后size个字符。 + * + * @param s 原始字符串 + * @param size 字符串指定长度 + * @param c 用于补齐的字符 + * @return 返回指定长度的字符串,由原字符串左补齐或截取得到。 + */ + public static final String padl(final String s, final int size, final char c) { + final StringBuilder sb = new StringBuilder(size); + if (s != null) { + final int len = s.length(); + if (s.length() <= size) { + for (int i = size - len; i > 0; i--) { + sb.append(c); + } + sb.append(s); + } else { + return s.substring(len - size, len); + } + } else { + for (int i = size; i > 0; i--) { + sb.append(c); + } + } + return sb.toString(); + } + } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/TreeBuildUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/TreeBuildUtils.java index 76bf864f4..f9f8fa140 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/TreeBuildUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/TreeBuildUtils.java @@ -1,9 +1,11 @@ package com.ruoyi.common.utils; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.tree.Tree; import cn.hutool.core.lang.tree.TreeNodeConfig; import cn.hutool.core.lang.tree.TreeUtil; import cn.hutool.core.lang.tree.parser.NodeParser; +import com.ruoyi.common.utils.reflect.ReflectUtils; import lombok.AccessLevel; import lombok.NoArgsConstructor; @@ -22,8 +24,12 @@ public class TreeBuildUtils extends TreeUtil { */ public static final TreeNodeConfig DEFAULT_CONFIG = TreeNodeConfig.DEFAULT_CONFIG.setNameKey("label"); - public static List> build(List list, Long parentId, NodeParser nodeParser) { - return TreeUtil.build(list, parentId, DEFAULT_CONFIG, nodeParser); + public static List> build(List list, NodeParser nodeParser) { + if (CollUtil.isEmpty(list)) { + return null; + } + K k = ReflectUtils.invokeGetter(list.get(0), "parentId"); + return TreeUtil.build(list, k, DEFAULT_CONFIG, nodeParser); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java index 61f26005b..1ef222907 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java @@ -22,7 +22,6 @@ public class FileUtils extends FileUtil { * * @param response 响应对象 * @param realFileName 真实文件名 - * @return */ public static void setAttachmentResponseHeader(HttpServletResponse response, String realFileName) throws UnsupportedEncodingException { String percentEncodedFileName = percentEncode(realFileName); @@ -35,7 +34,6 @@ public class FileUtils extends FileUtil { .append("utf-8''") .append(percentEncodedFileName); - response.addHeader("Access-Control-Allow-Origin", "*"); response.addHeader("Access-Control-Expose-Headers", "Content-Disposition,download-filename"); response.setHeader("Content-disposition", contentDispositionValue.toString()); response.setHeader("download-filename", percentEncodedFileName); diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/AddressUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/AddressUtils.java index 1d6123055..8d3515e7f 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/AddressUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/AddressUtils.java @@ -1,5 +1,6 @@ package com.ruoyi.common.utils.ip; +import cn.hutool.core.lang.Dict; import cn.hutool.core.net.NetUtil; import cn.hutool.http.HtmlUtil; import cn.hutool.http.HttpUtil; @@ -11,8 +12,6 @@ import lombok.AccessLevel; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; -import java.util.Map; - /** * 获取地址类 * @@ -48,14 +47,14 @@ public class AddressUtils { log.error("获取地理位置异常 {}", ip); return UNKNOWN; } - Map obj = JsonUtils.parseMap(rspStr); - String region = obj.get("pro"); - String city = obj.get("city"); + Dict obj = JsonUtils.parseMap(rspStr); + String region = obj.getStr("pro"); + String city = obj.getStr("city"); return String.format("%s %s", region, city); } catch (Exception e) { log.error("获取地理位置异常 {}", ip); } } - return address; + return UNKNOWN; } } diff --git a/ruoyi-demo/pom.xml b/ruoyi-demo/pom.xml index 6b0ea78ea..329b4e7ee 100644 --- a/ruoyi-demo/pom.xml +++ b/ruoyi-demo/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 3.5.0 + 4.0.1 4.0.0 diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisCacheController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisCacheController.java index 28e380b85..98cca18c0 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisCacheController.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisCacheController.java @@ -1,6 +1,6 @@ package com.ruoyi.demo.controller; -import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.R; import com.ruoyi.common.utils.redis.RedisUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -44,8 +44,8 @@ public class RedisCacheController { @ApiOperation("测试 @Cacheable") @Cacheable(cacheNames = "redissonCacheMap", key = "#key", condition = "#key != null") @GetMapping("/test1") - public AjaxResult test1(String key, String value) { - return AjaxResult.success("操作成功", value); + public R test1(String key, String value) { + return R.ok("操作成功", value); } /** @@ -59,8 +59,8 @@ public class RedisCacheController { @ApiOperation("测试 @CachePut") @CachePut(cacheNames = "redissonCacheMap", key = "#key", condition = "#key != null") @GetMapping("/test2") - public AjaxResult test2(String key, String value) { - return AjaxResult.success("操作成功", value); + public R test2(String key, String value) { + return R.ok("操作成功", value); } /** @@ -74,8 +74,8 @@ public class RedisCacheController { @ApiOperation("测试 @CacheEvict") @CacheEvict(cacheNames = "redissonCacheMap", key = "#key", condition = "#key != null") @GetMapping("/test3") - public AjaxResult test3(String key, String value) { - return AjaxResult.success("操作成功", value); + public R test3(String key, String value) { + return R.ok("操作成功", value); } /** @@ -85,7 +85,7 @@ public class RedisCacheController { */ @ApiOperation("测试设置过期时间") @GetMapping("/test6") - public AjaxResult test6(String key, String value) { + public R test6(String key, String value) { RedisUtils.setCacheObject(key, value); boolean flag = RedisUtils.expire(key, 10, TimeUnit.SECONDS); System.out.println("***********" + flag); @@ -95,7 +95,7 @@ public class RedisCacheController { e.printStackTrace(); } Object obj = RedisUtils.getCacheObject(key); - return AjaxResult.success("操作成功", value.equals(obj)); + return R.ok(value.equals(obj)); } } diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisLockController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisLockController.java index 7d30a1871..c31925a57 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisLockController.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisLockController.java @@ -4,7 +4,7 @@ import com.baomidou.lock.LockInfo; import com.baomidou.lock.LockTemplate; import com.baomidou.lock.annotation.Lock4j; import com.baomidou.lock.executor.RedissonLockExecutor; -import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.R; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; @@ -36,7 +36,7 @@ public class RedisLockController { @ApiOperation("测试lock4j 注解") @Lock4j(keys = {"#key"}) @GetMapping("/testLock4j") - public AjaxResult testLock4j(String key, String value) { + public R testLock4j(String key, String value) { System.out.println("start:" + key + ",time:" + LocalTime.now().toString()); try { Thread.sleep(10000); @@ -44,7 +44,7 @@ public class RedisLockController { e.printStackTrace(); } System.out.println("end :" + key + ",time:" + LocalTime.now().toString()); - return AjaxResult.success("操作成功", value); + return R.ok("操作成功", value); } /** @@ -52,7 +52,7 @@ public class RedisLockController { */ @ApiOperation("测试lock4j 工具") @GetMapping("/testLock4jLockTemplate") - public AjaxResult testLock4jLockTemplate(String key, String value) { + public R testLock4jLockTemplate(String key, String value) { final LockInfo lockInfo = lockTemplate.lock(key, 30000L, 5000L, RedissonLockExecutor.class); if (null == lockInfo) { throw new RuntimeException("业务处理中,请稍后再试"); @@ -70,7 +70,7 @@ public class RedisLockController { lockTemplate.releaseLock(lockInfo); } //结束 - return AjaxResult.success("操作成功", value); + return R.ok("操作成功", value); } } diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisPubSubController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisPubSubController.java index d8b6e0c22..99c3131b4 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisPubSubController.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisPubSubController.java @@ -1,6 +1,6 @@ package com.ruoyi.demo.controller; -import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.R; import com.ruoyi.common.utils.redis.RedisUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -23,20 +23,20 @@ public class RedisPubSubController { @ApiOperation("发布消息") @GetMapping("/pub") - public AjaxResult pub(@ApiParam("通道Key") String key, @ApiParam("发送内容") String value) { + public R pub(@ApiParam("通道Key") String key, @ApiParam("发送内容") String value) { RedisUtils.publish(key, value, consumer -> { System.out.println("发布通道 => " + key + ", 发送值 => " + value); }); - return AjaxResult.success("操作成功"); + return R.ok("操作成功"); } @ApiOperation("订阅消息") @GetMapping("/sub") - public AjaxResult sub(@ApiParam("通道Key") String key) { + public R sub(@ApiParam("通道Key") String key) { RedisUtils.subscribe(key, String.class, msg -> { System.out.println("订阅通道 => " + key + ", 接收值 => " + msg); }); - return AjaxResult.success("操作成功"); + return R.ok("操作成功"); } } diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisRateLimiterController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisRateLimiterController.java index 1eeab6114..c7f48e519 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisRateLimiterController.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisRateLimiterController.java @@ -1,7 +1,7 @@ package com.ruoyi.demo.controller; import com.ruoyi.common.annotation.RateLimiter; -import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.R; import com.ruoyi.common.enums.LimitType; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -29,8 +29,8 @@ public class RedisRateLimiterController { @ApiOperation("测试全局限流") @RateLimiter(count = 2, time = 10) @GetMapping("/test") - public AjaxResult test(String value) { - return AjaxResult.success("操作成功", value); + public R test(String value) { + return R.ok("操作成功", value); } /** @@ -40,8 +40,8 @@ public class RedisRateLimiterController { @ApiOperation("测试请求IP限流") @RateLimiter(count = 2, time = 10, limitType = LimitType.IP) @GetMapping("/testip") - public AjaxResult testip(String value) { - return AjaxResult.success("操作成功", value); + public R testip(String value) { + return R.ok("操作成功", value); } /** @@ -51,8 +51,8 @@ public class RedisRateLimiterController { @ApiOperation("测试集群实例限流") @RateLimiter(count = 2, time = 10, limitType = LimitType.CLUSTER) @GetMapping("/testcluster") - public AjaxResult testcluster(String value) { - return AjaxResult.success("操作成功", value); + public R testcluster(String value) { + return R.ok("操作成功", value); } } diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/Swagger3DemoController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/Swagger3DemoController.java index 6b73d64a8..e50ce03a5 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/Swagger3DemoController.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/Swagger3DemoController.java @@ -1,6 +1,6 @@ package com.ruoyi.demo.controller; -import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.R; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; @@ -11,6 +11,8 @@ import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import java.io.File; + /** * swagger3 用法示例 * @@ -24,15 +26,14 @@ public class Swagger3DemoController { /** * 上传请求 * 必须使用 @RequestPart 注解标注为文件 - * dataType 必须为 "java.io.File" */ @ApiOperation(value = "通用上传请求") @ApiImplicitParams({ - @ApiImplicitParam(name = "file", value = "文件", dataType = "java.io.File", required = true), + @ApiImplicitParam(name = "file", value = "文件", paramType = "query", dataTypeClass = File.class, required = true) }) @PostMapping(value = "/upload") - public AjaxResult upload(@RequestPart("file") MultipartFile file) { - return AjaxResult.success("操作成功", file.getOriginalFilename()); + public R upload(@RequestPart("file") MultipartFile file) { + return R.ok("操作成功", file.getOriginalFilename()); } } diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestBatchController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestBatchController.java index 39cf3ebf7..aa1f064a0 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestBatchController.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestBatchController.java @@ -2,7 +2,7 @@ package com.ruoyi.demo.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.common.core.controller.BaseController; -import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.R; import com.ruoyi.demo.domain.TestDemo; import com.ruoyi.demo.mapper.TestDemoMapper; import io.swagger.annotations.Api; @@ -41,10 +41,14 @@ public class TestBatchController extends BaseController { @ApiOperation(value = "新增批量方法") @PostMapping("/add") // @DS("slave") - public AjaxResult add() { + public R add() { List list = new ArrayList<>(); for (int i = 0; i < 1000; i++) { - list.add(new TestDemo().setOrderNum(-1L).setTestKey("批量新增").setValue("测试新增")); + TestDemo testDemo = new TestDemo(); + testDemo.setOrderNum(-1); + testDemo.setTestKey("批量新增"); + testDemo.setValue("测试新增"); + list.add(testDemo); } return toAjax(testDemoMapper.insertBatch(list) ? 1 : 0); } @@ -57,15 +61,19 @@ public class TestBatchController extends BaseController { @ApiOperation(value = "新增或更新批量方法") @PostMapping("/addOrUpdate") // @DS("slave") - public AjaxResult addOrUpdate() { + public R addOrUpdate() { List list = new ArrayList<>(); for (int i = 0; i < 1000; i++) { - list.add(new TestDemo().setOrderNum(-1L).setTestKey("批量新增").setValue("测试新增")); - } + TestDemo testDemo = new TestDemo(); + testDemo.setOrderNum(-1); + testDemo.setTestKey("批量新增"); + testDemo.setValue("测试新增"); + list.add(testDemo); } testDemoMapper.insertBatch(list); for (int i = 0; i < list.size(); i++) { TestDemo testDemo = list.get(i); - testDemo.setTestKey("批量新增或修改").setValue("批量新增或修改"); + testDemo.setTestKey("批量新增或修改"); + testDemo.setValue("批量新增或修改"); if (i % 2 == 0) { testDemo.setId(null); } @@ -79,7 +87,7 @@ public class TestBatchController extends BaseController { @ApiOperation(value = "删除批量方法") @DeleteMapping() // @DS("slave") - public AjaxResult remove() { + public R remove() { return toAjax(testDemoMapper.delete(new LambdaQueryWrapper() .eq(TestDemo::getOrderNum, -1L))); } diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestDemoController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestDemoController.java index 39817174c..d1f994e5d 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestDemoController.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestDemoController.java @@ -5,7 +5,7 @@ import cn.hutool.core.bean.BeanUtil; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.annotation.RepeatSubmit; import com.ruoyi.common.core.controller.BaseController; -import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.validate.AddGroup; @@ -75,12 +75,12 @@ public class TestDemoController extends BaseController { @Log(title = "测试单表", businessType = BusinessType.IMPORT) @SaCheckPermission("demo:demo:import") @PostMapping("/importData") - public AjaxResult importData(@RequestPart("file") MultipartFile file) throws Exception { + public R importData(@RequestPart("file") MultipartFile file) throws Exception { ExcelResult excelResult = ExcelUtil.importExcel(file.getInputStream(), TestDemoImportVo.class, true); List volist = excelResult.getList(); List list = BeanUtil.copyToList(volist, TestDemo.class); iTestDemoService.saveBatch(list); - return AjaxResult.success(excelResult.getAnalysis()); + return R.ok(excelResult.getAnalysis()); } /** @@ -105,10 +105,10 @@ public class TestDemoController extends BaseController { @ApiOperation("获取测试单表详细信息") @SaCheckPermission("demo:demo:query") @GetMapping("/{id}") - public AjaxResult getInfo(@ApiParam("测试ID") + public R getInfo(@ApiParam("测试ID") @NotNull(message = "主键不能为空") @PathVariable("id") Long id) { - return AjaxResult.success(iTestDemoService.queryById(id)); + return R.ok(iTestDemoService.queryById(id)); } /** @@ -117,9 +117,9 @@ public class TestDemoController extends BaseController { @ApiOperation("新增测试单表") @SaCheckPermission("demo:demo:add") @Log(title = "测试单表", businessType = BusinessType.INSERT) - @RepeatSubmit(interval = 2, timeUnit = TimeUnit.SECONDS, message = "不允许重复提交") + @RepeatSubmit(interval = 2, timeUnit = TimeUnit.SECONDS, message = "{repeat.submit.message}") @PostMapping() - public AjaxResult add(@RequestBody TestDemoBo bo) { + public R add(@RequestBody TestDemoBo bo) { // 使用校验工具对标 @Validated(AddGroup.class) 注解 // 用于在非 Controller 的地方校验对象 ValidatorUtils.validate(bo, AddGroup.class); @@ -134,7 +134,7 @@ public class TestDemoController extends BaseController { @Log(title = "测试单表", businessType = BusinessType.UPDATE) @RepeatSubmit @PutMapping() - public AjaxResult edit(@Validated(EditGroup.class) @RequestBody TestDemoBo bo) { + public R edit(@Validated(EditGroup.class) @RequestBody TestDemoBo bo) { return toAjax(iTestDemoService.updateByBo(bo) ? 1 : 0); } @@ -145,7 +145,7 @@ public class TestDemoController extends BaseController { @SaCheckPermission("demo:demo:remove") @Log(title = "测试单表", businessType = BusinessType.DELETE) @DeleteMapping("/{ids}") - public AjaxResult remove(@ApiParam("测试ID串") + public R remove(@ApiParam("测试ID串") @NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) { return toAjax(iTestDemoService.deleteWithValidByIds(Arrays.asList(ids), true) ? 1 : 0); diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestI18nController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestI18nController.java index f56888219..9b3bffc09 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestI18nController.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestI18nController.java @@ -1,6 +1,6 @@ package com.ruoyi.demo.controller; -import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.R; import com.ruoyi.common.utils.MessageUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -35,8 +35,8 @@ public class TestI18nController { */ @ApiOperation("通过code获取国际化内容") @GetMapping() - public AjaxResult get(@ApiParam("国际化code") String code) { - return AjaxResult.success(MessageUtils.message(code)); + public R get(@ApiParam("国际化code") String code) { + return R.ok(MessageUtils.message(code)); } /** @@ -47,8 +47,8 @@ public class TestI18nController { */ @ApiOperation("Validator 校验国际化") @GetMapping("/test1") - public AjaxResult test1(@NotBlank(message = "{not.null}") String str) { - return AjaxResult.success(str); + public R test1(@NotBlank(message = "{not.null}") String str) { + return R.ok(str); } /** @@ -59,8 +59,8 @@ public class TestI18nController { */ @ApiOperation("Bean 校验国际化") @GetMapping("/test2") - public AjaxResult test2(@Validated TestI18nBo bo) { - return AjaxResult.success(bo); + public R test2(@Validated TestI18nBo bo) { + return R.ok(bo); } @Data diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestSensitiveController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestSensitiveController.java index 72b16e6ab..1f34f9cf4 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestSensitiveController.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestSensitiveController.java @@ -2,12 +2,11 @@ package com.ruoyi.demo.controller; import com.ruoyi.common.annotation.Sensitive; import com.ruoyi.common.core.controller.BaseController; -import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.R; import com.ruoyi.common.enums.SensitiveStrategy; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.Data; -import lombok.experimental.Accessors; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -32,18 +31,17 @@ public class TestSensitiveController extends BaseController { */ @ApiOperation("查询测试单表列表") @GetMapping("/test") - public AjaxResult test() { - TestSensitive testSensitive = new TestSensitive() - .setIdCard("210397198608215431") - .setPhone("17640125371") - .setAddress("北京市朝阳区某某四合院1203室") - .setEmail("17640125371@163.com") - .setBankCard("6226456952351452853"); - return AjaxResult.success(testSensitive); + public R test() { + TestSensitive testSensitive = new TestSensitive(); + testSensitive.setIdCard("210397198608215431"); + testSensitive.setPhone("17640125371"); + testSensitive.setAddress("北京市朝阳区某某四合院1203室"); + testSensitive.setEmail("17640125371@163.com"); + testSensitive.setBankCard("6226456952351452853"); + return R.ok(testSensitive); } @Data - @Accessors(chain = true) static class TestSensitive { /** diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestTreeController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestTreeController.java index 9b0d537bb..64f36c941 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestTreeController.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestTreeController.java @@ -4,7 +4,7 @@ import cn.dev33.satoken.annotation.SaCheckPermission; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.annotation.RepeatSubmit; import com.ruoyi.common.core.controller.BaseController; -import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.validate.AddGroup; import com.ruoyi.common.core.validate.EditGroup; import com.ruoyi.common.core.validate.QueryGroup; @@ -47,9 +47,9 @@ public class TestTreeController extends BaseController { @ApiOperation("查询测试树表列表") @SaCheckPermission("demo:tree:list") @GetMapping("/list") - public AjaxResult> list(@Validated(QueryGroup.class) TestTreeBo bo) { + public R> list(@Validated(QueryGroup.class) TestTreeBo bo) { List list = iTestTreeService.queryList(bo); - return AjaxResult.success(list); + return R.ok(list); } /** @@ -70,10 +70,10 @@ public class TestTreeController extends BaseController { @ApiOperation("获取测试树表详细信息") @SaCheckPermission("demo:tree:query") @GetMapping("/{id}") - public AjaxResult getInfo(@ApiParam("测试树ID") + public R getInfo(@ApiParam("测试树ID") @NotNull(message = "主键不能为空") @PathVariable("id") Long id) { - return AjaxResult.success(iTestTreeService.queryById(id)); + return R.ok(iTestTreeService.queryById(id)); } /** @@ -84,7 +84,7 @@ public class TestTreeController extends BaseController { @Log(title = "测试树表", businessType = BusinessType.INSERT) @RepeatSubmit @PostMapping() - public AjaxResult add(@Validated(AddGroup.class) @RequestBody TestTreeBo bo) { + public R add(@Validated(AddGroup.class) @RequestBody TestTreeBo bo) { return toAjax(iTestTreeService.insertByBo(bo) ? 1 : 0); } @@ -96,7 +96,7 @@ public class TestTreeController extends BaseController { @Log(title = "测试树表", businessType = BusinessType.UPDATE) @RepeatSubmit @PutMapping() - public AjaxResult edit(@Validated(EditGroup.class) @RequestBody TestTreeBo bo) { + public R edit(@Validated(EditGroup.class) @RequestBody TestTreeBo bo) { return toAjax(iTestTreeService.updateByBo(bo) ? 1 : 0); } @@ -107,7 +107,7 @@ public class TestTreeController extends BaseController { @SaCheckPermission("demo:tree:remove") @Log(title = "测试树表", businessType = BusinessType.DELETE) @DeleteMapping("/{ids}") - public AjaxResult remove(@ApiParam("测试树ID串") + public R remove(@ApiParam("测试树ID串") @NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) { return toAjax(iTestTreeService.deleteWithValidByIds(Arrays.asList(ids), true) ? 1 : 0); diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/BoundedQueueController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/BoundedQueueController.java index f698a140a..532c499e1 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/BoundedQueueController.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/BoundedQueueController.java @@ -1,6 +1,6 @@ package com.ruoyi.demo.controller.queue; -import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.R; import com.ruoyi.common.utils.redis.QueueUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -32,7 +32,7 @@ public class BoundedQueueController { @ApiOperation("添加队列数据") @GetMapping("/add") - public AjaxResult add(@ApiParam("队列名") String queueName, + public R add(@ApiParam("队列名") String queueName, @ApiParam("容量") int capacity) { // 用完了一定要销毁 否则会一直存在 boolean b = QueueUtils.destroyBoundedQueueObject(queueName); @@ -42,7 +42,7 @@ public class BoundedQueueController { log.info("通道: {} , 设置容量: {}", queueName, capacity); } else { log.info("通道: {} , 设置容量失败", queueName); - return AjaxResult.error("操作失败"); + return R.fail("操作失败"); } for (int i = 0; i < 11; i++) { String data = "data-" + i; @@ -53,30 +53,30 @@ public class BoundedQueueController { log.info("通道: {} , 发送数据: {}", queueName, data); } } - return AjaxResult.success("操作成功"); + return R.ok("操作成功"); } @ApiOperation("删除队列数据") @GetMapping("/remove") - public AjaxResult remove(@ApiParam("队列名") String queueName) { + public R remove(@ApiParam("队列名") String queueName) { String data = "data-" + 5; if (QueueUtils.removeBoundedQueueObject(queueName, data)) { log.info("通道: {} , 删除数据: {}", queueName, data); } else { - return AjaxResult.error("操作失败"); + return R.fail("操作失败"); } - return AjaxResult.success("操作成功"); + return R.ok("操作成功"); } @ApiOperation("获取队列数据") @GetMapping("/get") - public AjaxResult get(@ApiParam("队列名") String queueName) { + public R get(@ApiParam("队列名") String queueName) { String data; do { data = QueueUtils.getBoundedQueueObject(queueName); log.info("通道: {} , 获取数据: {}", queueName, data); } while (data != null); - return AjaxResult.success("操作成功"); + return R.ok("操作成功"); } } diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/DelayedQueueController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/DelayedQueueController.java index 77ee26812..f8777533c 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/DelayedQueueController.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/DelayedQueueController.java @@ -1,6 +1,6 @@ package com.ruoyi.demo.controller.queue; -import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.R; import com.ruoyi.common.utils.redis.QueueUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -34,45 +34,45 @@ public class DelayedQueueController { @ApiOperation("订阅队列") @GetMapping("/subscribe") - public AjaxResult subscribe(@ApiParam("队列名") String queueName) { + public R subscribe(@ApiParam("队列名") String queueName) { log.info("通道: {} 监听中......", queueName); // 项目初始化设置一次即可 QueueUtils.subscribeBlockingQueue(queueName, (String orderNum) -> { // 观察接收时间 log.info("通道: {}, 收到数据: {}", queueName, orderNum); }); - return AjaxResult.success("操作成功"); + return R.ok("操作成功"); } @ApiOperation("添加队列数据") @GetMapping("/add") - public AjaxResult add(@ApiParam("队列名") String queueName, + public R add(@ApiParam("队列名") String queueName, @ApiParam("订单号") String orderNum, @ApiParam("延迟时间(秒)") Long time) { QueueUtils.addDelayedQueueObject(queueName, orderNum, time, TimeUnit.SECONDS); // 观察发送时间 log.info("通道: {} , 发送数据: {}", queueName, orderNum); - return AjaxResult.success("操作成功"); + return R.ok("操作成功"); } @ApiOperation("删除队列数据") @GetMapping("/remove") - public AjaxResult remove(@ApiParam("队列名") String queueName, + public R remove(@ApiParam("队列名") String queueName, @ApiParam("订单号") String orderNum) { if (QueueUtils.removeDelayedQueueObject(queueName, orderNum)) { log.info("通道: {} , 删除数据: {}", queueName, orderNum); } else { - return AjaxResult.error("操作失败"); + return R.fail("操作失败"); } - return AjaxResult.success("操作成功"); + return R.ok("操作成功"); } @ApiOperation("销毁队列") @GetMapping("/destroy") - public AjaxResult destroy(@ApiParam("队列名") String queueName) { + public R destroy(@ApiParam("队列名") String queueName) { // 用完了一定要销毁 否则会一直存在 QueueUtils.destroyDelayedQueue(queueName); - return AjaxResult.success("操作成功"); + return R.ok("操作成功"); } } diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/PriorityDemo.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/PriorityDemo.java index 08576904f..80f1b1155 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/PriorityDemo.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/PriorityDemo.java @@ -2,7 +2,6 @@ package com.ruoyi.demo.controller.queue; import lombok.Data; import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; /** * 实体类 注意不允许使用内部类 否则会找不到类 @@ -11,7 +10,6 @@ import lombok.experimental.Accessors; * @version 3.6.0 */ @Data -@Accessors(chain = true) @NoArgsConstructor public class PriorityDemo { private String name; diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/PriorityQueueController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/PriorityQueueController.java index 832cbcf33..baec18440 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/PriorityQueueController.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/PriorityQueueController.java @@ -1,7 +1,7 @@ package com.ruoyi.demo.controller.queue; import cn.hutool.core.util.RandomUtil; -import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.R; import com.ruoyi.common.utils.redis.QueueUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -32,7 +32,7 @@ public class PriorityQueueController { @ApiOperation("添加队列数据") @GetMapping("/add") - public AjaxResult add(@ApiParam("队列名") String queueName) { + public R add(@ApiParam("队列名") String queueName) { // 用完了一定要销毁 否则会一直存在 boolean b = QueueUtils.destroyPriorityQueueObject(queueName); log.info("通道: {} , 删除: {}", queueName, b); @@ -42,43 +42,47 @@ public class PriorityQueueController { log.info("通道: {} , 设置比较器成功", queueName); } else { log.info("通道: {} , 设置比较器失败", queueName); - return AjaxResult.error("操作失败"); + return R.fail("操作失败"); } for (int i = 0; i < 10; i++) { int randomNum = RandomUtil.randomInt(10); - PriorityDemo data = new PriorityDemo().setName("data-" + i).setOrderNum(randomNum); + PriorityDemo data = new PriorityDemo(); + data.setName("data-" + i); + data.setOrderNum(randomNum); if (QueueUtils.addPriorityQueueObject(queueName, data)) { log.info("通道: {} , 发送数据: {}", queueName, data); } else { log.info("通道: {} , 发送数据: {}, 发送失败", queueName, data); } } - return AjaxResult.success("操作成功"); + return R.ok("操作成功"); } @ApiOperation("删除队列数据") @GetMapping("/remove") - public AjaxResult remove(@ApiParam("队列名") String queueName, + public R remove(@ApiParam("队列名") String queueName, @ApiParam("对象名") String name, @ApiParam("排序号") Integer orderNum) { - PriorityDemo data = new PriorityDemo().setName(name).setOrderNum(orderNum); + PriorityDemo data = new PriorityDemo(); + data.setName(name); + data.setOrderNum(orderNum); if (QueueUtils.removePriorityQueueObject(queueName, data)) { log.info("通道: {} , 删除数据: {}", queueName, data); } else { - return AjaxResult.error("操作失败"); + return R.fail("操作失败"); } - return AjaxResult.success("操作成功"); + return R.ok("操作成功"); } @ApiOperation("获取队列数据") @GetMapping("/get") - public AjaxResult get(@ApiParam("队列名") String queueName) { + public R get(@ApiParam("队列名") String queueName) { PriorityDemo data; do { data = QueueUtils.getPriorityQueueObject(queueName); log.info("通道: {} , 获取数据: {}", queueName, data); } while (data != null); - return AjaxResult.success("操作成功"); + return R.ok("操作成功"); } } diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/TestDemo.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/TestDemo.java index f36ae2b3f..dc19ce2c7 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/TestDemo.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/TestDemo.java @@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.annotation.*; import com.ruoyi.common.core.domain.BaseEntity; import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; /** * 测试单表对象 test_demo @@ -14,7 +13,6 @@ import lombok.experimental.Accessors; */ @Data @EqualsAndHashCode(callSuper = true) -@Accessors(chain = true) @TableName("test_demo") public class TestDemo extends BaseEntity { @@ -41,7 +39,7 @@ public class TestDemo extends BaseEntity { * 排序号 */ @OrderBy(asc = false, sort = 1) - private Long orderNum; + private Integer orderNum; /** * key键 diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/TestTree.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/TestTree.java index 7459362f5..b480aa0c1 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/TestTree.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/TestTree.java @@ -7,7 +7,6 @@ import com.baomidou.mybatisplus.annotation.Version; import com.ruoyi.common.core.domain.TreeEntity; import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; /** * 测试树表对象 test_tree @@ -17,9 +16,8 @@ import lombok.experimental.Accessors; */ @Data @EqualsAndHashCode(callSuper = true) -@Accessors(chain = true) @TableName("test_tree") -public class TestTree extends TreeEntity { +public class TestTree extends TreeEntity { private static final long serialVersionUID = 1L; diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/bo/TestTreeBo.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/bo/TestTreeBo.java index 29f4ac973..211a79f14 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/bo/TestTreeBo.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/bo/TestTreeBo.java @@ -21,7 +21,7 @@ import javax.validation.constraints.NotNull; @Data @EqualsAndHashCode(callSuper = true) @ApiModel("测试树表业务对象") -public class TestTreeBo extends TreeEntity { +public class TestTreeBo extends TreeEntity { /** * 主键 diff --git a/ruoyi-extend/pom.xml b/ruoyi-extend/pom.xml index f0ae61d49..3b80b15ca 100644 --- a/ruoyi-extend/pom.xml +++ b/ruoyi-extend/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 3.5.0 + 4.0.1 4.0.0 ruoyi-extend diff --git a/ruoyi-extend/ruoyi-monitor-admin/pom.xml b/ruoyi-extend/ruoyi-monitor-admin/pom.xml index e21cc6da8..e811fd3be 100644 --- a/ruoyi-extend/ruoyi-monitor-admin/pom.xml +++ b/ruoyi-extend/ruoyi-monitor-admin/pom.xml @@ -5,7 +5,7 @@ ruoyi-extend com.ruoyi - 3.5.0 + 4.0.1 4.0.0 jar diff --git a/ruoyi-extend/ruoyi-monitor-admin/src/main/resources/application-dev.yml b/ruoyi-extend/ruoyi-monitor-admin/src/main/resources/application-dev.yml index 829314b41..0b10bbd76 100644 --- a/ruoyi-extend/ruoyi-monitor-admin/src/main/resources/application-dev.yml +++ b/ruoyi-extend/ruoyi-monitor-admin/src/main/resources/application-dev.yml @@ -9,6 +9,6 @@ spring: # 设置 Spring Boot Admin Server 地址 url: http://localhost:9090/admin instance: - prefer-ip: true # 注册实例时,优先使用 IP + service-host-type: IP username: ruoyi password: 123456 diff --git a/ruoyi-extend/ruoyi-monitor-admin/src/main/resources/application-prod.yml b/ruoyi-extend/ruoyi-monitor-admin/src/main/resources/application-prod.yml index e8cac1369..2e020390d 100644 --- a/ruoyi-extend/ruoyi-monitor-admin/src/main/resources/application-prod.yml +++ b/ruoyi-extend/ruoyi-monitor-admin/src/main/resources/application-prod.yml @@ -9,6 +9,6 @@ spring: # 设置 Spring Boot Admin Server 地址 url: http://172.30.0.90:9090/admin instance: - prefer-ip: true # 注册实例时,优先使用 IP + service-host-type: IP username: ruoyi password: 123456 diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/pom.xml b/ruoyi-extend/ruoyi-xxl-job-admin/pom.xml index a2e640581..f59b63df4 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/pom.xml +++ b/ruoyi-extend/ruoyi-xxl-job-admin/pom.xml @@ -4,14 +4,12 @@ ruoyi-extend com.ruoyi - 3.5.0 + 4.0.1 ruoyi-xxl-job-admin jar - 2.1.4 - 8.0.23 @@ -62,13 +60,12 @@ org.mybatis.spring.boot mybatis-spring-boot-starter - ${mybatis-spring-boot-starter.version} + ${spring-boot.mybatis} mysql mysql-connector-java - ${mysql-connector-java.version} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/application-dev.yml b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/application-dev.yml index 540a3237a..09ed519fa 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/application-dev.yml +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/application-dev.yml @@ -9,7 +9,7 @@ spring: # 设置 Spring Boot Admin Server 地址 url: http://localhost:9090/admin instance: - prefer-ip: true # 注册实例时,优先使用 IP + service-host-type: IP username: ruoyi password: 123456 diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/application-prod.yml b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/application-prod.yml index bcec9d82e..401f60af9 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/application-prod.yml +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/application-prod.yml @@ -9,7 +9,7 @@ spring: # 设置 Spring Boot Admin Server 地址 url: http://172.30.0.90:9090/admin instance: - prefer-ip: true # 注册实例时,优先使用 IP + service-host-type: IP username: ruoyi password: 123456 diff --git a/ruoyi-framework/pom.xml b/ruoyi-framework/pom.xml index fe60db377..9f28913f9 100644 --- a/ruoyi-framework/pom.xml +++ b/ruoyi-framework/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 3.5.0 + 4.0.1 4.0.0 diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java index 298eb43bf..542b16bfd 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java @@ -3,6 +3,7 @@ package com.ruoyi.framework.aspectj; import com.ruoyi.common.annotation.RateLimiter; import com.ruoyi.common.enums.LimitType; import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.MessageUtils; import com.ruoyi.common.utils.ServletUtils; import com.ruoyi.common.utils.redis.RedisUtils; import lombok.extern.slf4j.Slf4j; @@ -37,7 +38,7 @@ public class RateLimiterAspect { } long number = RedisUtils.rateLimiter(combineKey, rateType, count, time); if (number == -1) { - throw new ServiceException("访问过于频繁,请稍候再试"); + throw new ServiceException(MessageUtils.message("rate.limiter.message")); } log.info("限制令牌 => {}, 剩余令牌 => {}, 缓存key => '{}'", count, number, combineKey); } catch (ServiceException e) { diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RepeatSubmitAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RepeatSubmitAspect.java index e7bbbdd6b..d0422e9d7 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RepeatSubmitAspect.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RepeatSubmitAspect.java @@ -5,8 +5,10 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.crypto.SecureUtil; import com.ruoyi.common.annotation.RepeatSubmit; import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.domain.R; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.JsonUtils; +import com.ruoyi.common.utils.MessageUtils; import com.ruoyi.common.utils.ServletUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.redis.RedisUtils; @@ -14,6 +16,8 @@ import com.ruoyi.framework.config.properties.RepeatSubmitProperties; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.AfterReturning; +import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.stereotype.Component; @@ -27,7 +31,7 @@ import java.util.Map; import java.util.concurrent.TimeUnit; /** - * 防止重复提交 + * 防止重复提交(参考美团GTIS防重系统) * * @author Lion Li */ @@ -37,6 +41,8 @@ import java.util.concurrent.TimeUnit; @Component public class RepeatSubmitAspect { + private static final ThreadLocal KEY_CACHE = new ThreadLocal<>(); + private final RepeatSubmitProperties repeatSubmitProperties; @Before("@annotation(repeatSubmit)") @@ -64,11 +70,45 @@ public class RepeatSubmitAspect { String key = RedisUtils.getCacheObject(cacheRepeatKey); if (key == null) { RedisUtils.setCacheObject(cacheRepeatKey, "", interval, TimeUnit.MILLISECONDS); + KEY_CACHE.set(cacheRepeatKey); } else { - throw new ServiceException(repeatSubmit.message()); + String message = repeatSubmit.message(); + if (StringUtils.startsWith(message, "{") && StringUtils.endsWith(message, "}")) { + message = MessageUtils.message(StringUtils.substring(message, 1, message.length() - 1)); + } + throw new ServiceException(message); } } + /** + * 处理完请求后执行 + * + * @param joinPoint 切点 + */ + @AfterReturning(pointcut = "@annotation(repeatSubmit)", returning = "jsonResult") + public void doAfterReturning(JoinPoint joinPoint, RepeatSubmit repeatSubmit, Object jsonResult) { + if (jsonResult instanceof R) { + R r = (R) jsonResult; + if (r.getCode() == R.SUCCESS) { + return; + } + RedisUtils.deleteObject(KEY_CACHE.get()); + KEY_CACHE.remove(); + } + } + + /** + * 拦截异常操作 + * + * @param joinPoint 切点 + * @param e 异常 + */ + @AfterThrowing(value = "@annotation(repeatSubmit)", throwing = "e") + public void doAfterThrowing(JoinPoint joinPoint, RepeatSubmit repeatSubmit, Exception e) { + RedisUtils.deleteObject(KEY_CACHE.get()); + KEY_CACHE.remove(); + } + /** * 参数拼装 */ diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/AsyncConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/AsyncConfig.java new file mode 100644 index 000000000..47898e3fa --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/AsyncConfig.java @@ -0,0 +1,54 @@ +package com.ruoyi.framework.config; + +import cn.hutool.core.util.ArrayUtil; +import com.ruoyi.common.exception.ServiceException; +import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.AsyncConfigurerSupport; +import org.springframework.scheduling.annotation.EnableAsync; + +import java.util.Arrays; +import java.util.concurrent.Executor; +import java.util.concurrent.ScheduledExecutorService; + +/** + * 异步配置 + * + * @author Lion Li + */ +@EnableAsync +@Configuration +public class AsyncConfig extends AsyncConfigurerSupport { + + @Autowired + @Qualifier("scheduledExecutorService") + private ScheduledExecutorService scheduledExecutorService; + + /** + * 自定义 @Async 注解使用系统线程池 + */ + @Override + public Executor getAsyncExecutor() { + return scheduledExecutorService; + } + + /** + * 异步执行异常处理 + */ + @Override + public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { + return (throwable, method, objects) -> { + throwable.printStackTrace(); + StringBuilder sb = new StringBuilder(); + sb.append("Exception message - ").append(throwable.getMessage()) + .append(", Method name - ").append(method.getName()); + if (ArrayUtil.isNotEmpty(objects)) { + sb.append(", Parameter value - ").append(Arrays.toString(objects)); + } + throw new ServiceException(sb.toString()); + }; + } + +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/RedisConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/RedisConfig.java index 6fa54e2a3..a8bec417a 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/RedisConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/RedisConfig.java @@ -11,15 +11,14 @@ import org.redisson.config.Config; import org.redisson.spring.cache.CacheConfig; import org.redisson.spring.cache.RedissonSpringCacheManager; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.data.redis.RedisProperties; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.CachingConfigurerSupport; import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; -import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -44,9 +43,9 @@ public class RedisConfig extends CachingConfigurerSupport { @Autowired private RedissonProperties redissonProperties; + @Primary @Bean(destroyMethod = "shutdown") - @ConditionalOnMissingBean(RedissonClient.class) - public RedissonClient redisson() throws IOException { + public RedissonClient redisson() { String prefix = REDIS_PROTOCOL_PREFIX; if (redisProperties.isSsl()) { prefix = REDISS_PROTOCOL_PREFIX; @@ -68,14 +67,11 @@ public class RedisConfig extends CachingConfigurerSupport { .setTimeout(singleServerConfig.getTimeout()) .setRetryAttempts(singleServerConfig.getRetryAttempts()) .setRetryInterval(singleServerConfig.getRetryInterval()) - .setSubscriptionsPerConnection(singleServerConfig.getSubscriptionsPerConnection()) .setClientName(singleServerConfig.getClientName()) .setIdleConnectionTimeout(singleServerConfig.getIdleConnectionTimeout()) - .setSubscriptionConnectionMinimumIdleSize(singleServerConfig.getSubscriptionConnectionMinimumIdleSize()) .setSubscriptionConnectionPoolSize(singleServerConfig.getSubscriptionConnectionPoolSize()) .setConnectionMinimumIdleSize(singleServerConfig.getConnectionMinimumIdleSize()) - .setConnectionPoolSize(singleServerConfig.getConnectionPoolSize()) - .setDnsMonitoringInterval(singleServerConfig.getDnsMonitoringInterval()); + .setConnectionPoolSize(singleServerConfig.getConnectionPoolSize()); } // 集群配置方式 参考下方注释 RedissonProperties.ClusterServersConfig clusterServersConfig = redissonProperties.getClusterServersConfig(); @@ -93,19 +89,14 @@ public class RedisConfig extends CachingConfigurerSupport { .setTimeout(clusterServersConfig.getTimeout()) .setRetryAttempts(clusterServersConfig.getRetryAttempts()) .setRetryInterval(clusterServersConfig.getRetryInterval()) - .setSubscriptionsPerConnection(clusterServersConfig.getSubscriptionsPerConnection()) .setClientName(clusterServersConfig.getClientName()) .setIdleConnectionTimeout(clusterServersConfig.getIdleConnectionTimeout()) .setPingConnectionInterval(clusterServersConfig.getPingConnectionInterval()) - .setSubscriptionConnectionMinimumIdleSize(clusterServersConfig.getSubscriptionConnectionMinimumIdleSize()) .setSubscriptionConnectionPoolSize(clusterServersConfig.getSubscriptionConnectionPoolSize()) .setMasterConnectionMinimumIdleSize(clusterServersConfig.getMasterConnectionMinimumIdleSize()) .setMasterConnectionPoolSize(clusterServersConfig.getMasterConnectionPoolSize()) .setSlaveConnectionMinimumIdleSize(clusterServersConfig.getSlaveConnectionMinimumIdleSize()) .setSlaveConnectionPoolSize(clusterServersConfig.getSlaveConnectionPoolSize()) - .setDnsMonitoringInterval(clusterServersConfig.getDnsMonitoringInterval()) - .setFailedSlaveReconnectionInterval(clusterServersConfig.getFailedSlaveReconnectionInterval()) - .setScanInterval(clusterServersConfig.getScanInterval()) .setReadMode(clusterServersConfig.getReadMode()) .setSubscriptionMode(clusterServersConfig.getSubscriptionMode()) .setNodeAddresses(nodes); @@ -177,18 +168,8 @@ public class RedisConfig extends CachingConfigurerSupport { * retryAttempts: 3 * # 命令重试发送时间间隔,单位:毫秒 * retryInterval: 1500 - * # 从可用服务器的内部列表中排除 Redis Slave 重新连接尝试的间隔。 - * failedSlaveReconnectionInterval: 3000 - * # 发布和订阅连接池最小空闲连接数 - * subscriptionConnectionMinimumIdleSize: 1 * # 发布和订阅连接池大小 * subscriptionConnectionPoolSize: 50 - * # 单个连接最大订阅数量 - * subscriptionsPerConnection: 5 - * # 扫描间隔 - * scanInterval: 1000 - * # DNS监测时间间隔,单位:毫秒 - * dnsMonitoringInterval: 5000 * # 读取模式 * readMode: "SLAVE" * # 订阅模式 diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/RedissonProperties.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/RedissonProperties.java index 0b9024d21..eae9e3fc8 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/RedissonProperties.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/RedissonProperties.java @@ -89,26 +89,11 @@ public class RedissonProperties { */ private int retryInterval; - /** - * 发布和订阅连接的最小空闲连接数 - */ - private int subscriptionConnectionMinimumIdleSize; - /** * 发布和订阅连接池大小 */ private int subscriptionConnectionPoolSize; - /** - * 单个连接最大订阅数量 - */ - private int subscriptionsPerConnection; - - /** - * DNS监测时间间隔,单位:毫秒 - */ - private int dnsMonitoringInterval; - } @Data @@ -165,36 +150,11 @@ public class RedissonProperties { */ private int retryInterval; - /** - * 错误重试次数 - */ - private int failedSlaveReconnectionInterval; - - /** - * 发布和订阅连接池最小空闲连接数 - */ - private int subscriptionConnectionMinimumIdleSize; - /** * 发布和订阅连接池大小 */ private int subscriptionConnectionPoolSize; - /** - * 单个连接最大订阅数量 - */ - private int subscriptionsPerConnection; - - /** - * 扫描间隔 - */ - private int scanInterval; - - /** - * DNS监测时间间隔,单位:毫秒 - */ - private int dnsMonitoringInterval; - /** * 读取模式 */ diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/SwaggerProperties.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/SwaggerProperties.java index c2b3f97b6..7293e1e90 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/SwaggerProperties.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/SwaggerProperties.java @@ -18,23 +18,27 @@ import java.util.List; public class SwaggerProperties { /** - * 验证码类型 + * 文档开关 */ private Boolean enabled; + /** * 设置请求的统一前缀 */ private String pathMapping; + /** - * 验证码类别 + * 标头 */ private String title; + /** - * 数字验证码位数 + * 描述 */ private String description; + /** - * 字符验证码长度 + * 项目版本 */ private String version; diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/handler/CreateAndUpdateMetaObjectHandler.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/handler/CreateAndUpdateMetaObjectHandler.java index 81051866c..6d7c977de 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/handler/CreateAndUpdateMetaObjectHandler.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/handler/CreateAndUpdateMetaObjectHandler.java @@ -27,26 +27,16 @@ public class CreateAndUpdateMetaObjectHandler implements MetaObjectHandler { try { if (ObjectUtil.isNotNull(metaObject) && metaObject.getOriginalObject() instanceof BaseEntity) { BaseEntity baseEntity = (BaseEntity) metaObject.getOriginalObject(); - Date current = new Date(); - // 创建时间为空 则填充 - if (ObjectUtil.isNull(baseEntity.getCreateTime())) { - baseEntity.setCreateTime(current); - } - // 更新时间为空 则填充 - if (ObjectUtil.isNull(baseEntity.getUpdateTime())) { - baseEntity.setUpdateTime(current); - } - String username = getLoginUsername(); + Date current = ObjectUtil.isNotNull(baseEntity.getCreateTime()) + ? baseEntity.getCreateTime() : new Date(); + baseEntity.setCreateTime(current); + baseEntity.setUpdateTime(current); + String username = StringUtils.isNotBlank(baseEntity.getCreateBy()) + ? baseEntity.getCreateBy() : getLoginUsername(); // 当前已登录 且 创建人为空 则填充 - if (StringUtils.isNotBlank(username) - && StringUtils.isBlank(baseEntity.getCreateBy())) { - baseEntity.setCreateBy(username); - } + baseEntity.setCreateBy(username); // 当前已登录 且 更新人为空 则填充 - if (StringUtils.isNotBlank(username) - && StringUtils.isBlank(baseEntity.getUpdateBy())) { - baseEntity.setUpdateBy(username); - } + baseEntity.setUpdateBy(username); } } catch (Exception e) { throw new ServiceException("自动注入异常 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED); diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/handler/PlusDataPermissionHandler.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/handler/PlusDataPermissionHandler.java index 5098917d6..7ecc12a3f 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/handler/PlusDataPermissionHandler.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/handler/PlusDataPermissionHandler.java @@ -7,9 +7,8 @@ import cn.hutool.core.util.ClassUtil; import cn.hutool.core.util.ObjectUtil; import com.ruoyi.common.annotation.DataColumn; import com.ruoyi.common.annotation.DataPermission; -import com.ruoyi.common.core.domain.entity.SysRole; -import com.ruoyi.common.core.domain.entity.SysUser; -import com.ruoyi.common.core.service.UserService; +import com.ruoyi.common.core.domain.dto.RoleDTO; +import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.enums.DataScopeType; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.helper.DataPermissionHelper; @@ -74,13 +73,13 @@ public class PlusDataPermissionHandler { inavlidCacheSet.add(mappedStatementId); return where; } - SysUser currentUser = DataPermissionHelper.getVariable("user"); + LoginUser currentUser = DataPermissionHelper.getVariable("user"); if (ObjectUtil.isNull(currentUser)) { - currentUser = SpringUtils.getBean(UserService.class).selectUserById(LoginHelper.getUserId()); + currentUser = LoginHelper.getLoginUser(); DataPermissionHelper.setVariable("user", currentUser); } // 如果是超级管理员,则不过滤数据 - if (ObjectUtil.isNull(currentUser) || currentUser.isAdmin()) { + if (LoginHelper.isAdmin()) { return where; } String dataFilterSql = buildDataFilter(dataColumns, isSelect); @@ -108,11 +107,11 @@ public class PlusDataPermissionHandler { StringBuilder sqlString = new StringBuilder(); // 更新或删除需满足所有条件 String joinStr = isSelect ? " OR " : " AND "; - SysUser user = DataPermissionHelper.getVariable("user"); + LoginUser user = DataPermissionHelper.getVariable("user"); StandardEvaluationContext context = new StandardEvaluationContext(); context.setBeanResolver(beanResolver); DataPermissionHelper.getContext().forEach(context::setVariable); - for (SysRole role : user.getRoles()) { + for (RoleDTO role : user.getRoles()) { user.setRoleId(role.getRoleId()); // 获取角色权限泛型 DataScopeType type = DataScopeType.findCode(role.getDataScope()); @@ -160,13 +159,13 @@ public class PlusDataPermissionHandler { DataPermission dataPermission; // 获取方法注解 for (Method method : methods) { - dataPermission = dataPermissionCacheMap.get(method.getName()); + dataPermission = dataPermissionCacheMap.get(mappedStatementId); if (ObjectUtil.isNotNull(dataPermission)) { return dataPermission.value(); } if (AnnotationUtil.hasAnnotation(method, DataPermission.class)) { dataPermission = AnnotationUtil.getAnnotation(method, DataPermission.class); - dataPermissionCacheMap.put(method.getName(), dataPermission); + dataPermissionCacheMap.put(mappedStatementId, dataPermission); return dataPermission.value(); } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/listener/UserActionListener.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/listener/UserActionListener.java index 6995fb69e..c4252b448 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/listener/UserActionListener.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/listener/UserActionListener.java @@ -4,19 +4,16 @@ import cn.dev33.satoken.config.SaTokenConfig; import cn.dev33.satoken.listener.SaTokenListener; import cn.dev33.satoken.stp.SaLoginModel; import cn.dev33.satoken.stp.StpUtil; -import cn.hutool.core.util.ObjectUtil; import cn.hutool.http.useragent.UserAgent; import cn.hutool.http.useragent.UserAgentUtil; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.domain.dto.UserOnlineDTO; -import com.ruoyi.common.core.domain.entity.SysUser; -import com.ruoyi.common.core.service.UserService; +import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.enums.UserType; import com.ruoyi.common.helper.LoginHelper; import com.ruoyi.common.utils.ServletUtils; import com.ruoyi.common.utils.ip.AddressUtils; import com.ruoyi.common.utils.redis.RedisUtils; -import com.ruoyi.common.utils.spring.SpringUtils; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -44,20 +41,18 @@ public class UserActionListener implements SaTokenListener { if (userType == UserType.SYS_USER) { UserAgent userAgent = UserAgentUtil.parse(ServletUtils.getRequest().getHeader("User-Agent")); String ip = ServletUtils.getClientIP(); - SysUser user = SpringUtils.getBean(UserService.class).selectUserById(LoginHelper.getUserId()); - String tokenValue = StpUtil.getTokenValue(); - UserOnlineDTO userOnlineDTO = new UserOnlineDTO() - .setIpaddr(ip) - .setLoginLocation(AddressUtils.getRealAddressByIP(ip)) - .setBrowser(userAgent.getBrowser().getName()) - .setOs(userAgent.getOs().getName()) - .setLoginTime(System.currentTimeMillis()) - .setTokenId(tokenValue) - .setUserName(user.getUserName()); - if (ObjectUtil.isNotNull(user.getDept())) { - userOnlineDTO.setDeptName(user.getDept().getDeptName()); - } - RedisUtils.setCacheObject(Constants.ONLINE_TOKEN_KEY + tokenValue, userOnlineDTO, tokenConfig.getTimeout(), TimeUnit.SECONDS); + LoginUser user = LoginHelper.getLoginUser(); + String tokenValue = StpUtil.getTokenValueByLoginId(loginId); + UserOnlineDTO dto = new UserOnlineDTO(); + dto.setIpaddr(ip); + dto.setLoginLocation(AddressUtils.getRealAddressByIP(ip)); + dto.setBrowser(userAgent.getBrowser().getName()); + dto.setOs(userAgent.getOs().getName()); + dto.setLoginTime(System.currentTimeMillis()); + dto.setTokenId(tokenValue); + dto.setUserName(user.getUsername()); + dto.setDeptName(user.getDeptName()); + RedisUtils.setCacheObject(Constants.ONLINE_TOKEN_KEY + tokenValue, dto, tokenConfig.getTimeout(), TimeUnit.SECONDS); log.info("user doLogin, useId:{}, token:{}", loginId, tokenValue); } else if (userType == UserType.APP_USER) { // app端 自行根据业务编写 diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java index bc58049db..90b265e27 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java @@ -5,10 +5,9 @@ import cn.dev33.satoken.exception.NotPermissionException; import cn.dev33.satoken.exception.NotRoleException; import cn.hutool.core.util.ObjectUtil; import cn.hutool.http.HttpStatus; -import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.R; import com.ruoyi.common.exception.DemoModeException; import com.ruoyi.common.exception.ServiceException; -import com.ruoyi.common.utils.StringUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.context.support.DefaultMessageSourceResolvable; import org.springframework.validation.BindException; @@ -32,115 +31,115 @@ import java.util.stream.Collectors; public class GlobalExceptionHandler { /** - * 权限校验异常 + * 权限码异常 */ @ExceptionHandler(NotPermissionException.class) - public AjaxResult handleAccessDeniedException(NotPermissionException e, HttpServletRequest request) { + public R handleNotPermissionException(NotPermissionException e, HttpServletRequest request) { String requestURI = request.getRequestURI(); - log.error("请求地址'{}',权限校验失败'{}'", requestURI, e.getMessage()); - return AjaxResult.error(HttpStatus.HTTP_FORBIDDEN, "没有权限,请联系管理员授权"); + log.error("请求地址'{}',权限码校验失败'{}'", requestURI, e.getMessage()); + return R.fail(HttpStatus.HTTP_FORBIDDEN, "没有访问权限,请联系管理员授权"); } /** - * 角色校验异常 + * 角色权限异常 */ @ExceptionHandler(NotRoleException.class) - public AjaxResult handleAccessDeniedException(NotRoleException e, HttpServletRequest request) { + public R handleNotRoleException(NotRoleException e, HttpServletRequest request) { String requestURI = request.getRequestURI(); - log.error("请求地址'{}',角色校验失败'{}'", requestURI, e.getMessage()); - return AjaxResult.error(HttpStatus.HTTP_FORBIDDEN, "没有角色,请联系管理员授权"); + log.error("请求地址'{}',角色权限校验失败'{}'", requestURI, e.getMessage()); + return R.fail(HttpStatus.HTTP_FORBIDDEN, "没有访问权限,请联系管理员授权"); } /** * 认证失败 */ @ExceptionHandler(NotLoginException.class) - public AjaxResult handleAccessDeniedException(NotLoginException e, HttpServletRequest request) { + public R handleNotLoginException(NotLoginException e, HttpServletRequest request) { String requestURI = request.getRequestURI(); log.error("请求地址'{}',认证失败'{}',无法访问系统资源", requestURI, e.getMessage()); - return AjaxResult.error(HttpStatus.HTTP_UNAUTHORIZED, StringUtils.format("请求地址'{}',认证失败'{}',无法访问系统资源", requestURI)); + return R.fail(HttpStatus.HTTP_UNAUTHORIZED, "认证失败,无法访问系统资源"); } /** * 请求方式不支持 */ @ExceptionHandler(HttpRequestMethodNotSupportedException.class) - public AjaxResult handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException e, + public R handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException e, HttpServletRequest request) { String requestURI = request.getRequestURI(); log.error("请求地址'{}',不支持'{}'请求", requestURI, e.getMethod()); - return AjaxResult.error(e.getMessage()); + return R.fail(e.getMessage()); } /** * 业务异常 */ @ExceptionHandler(ServiceException.class) - public AjaxResult handleServiceException(ServiceException e, HttpServletRequest request) { + public R handleServiceException(ServiceException e, HttpServletRequest request) { log.error(e.getMessage(), e); Integer code = e.getCode(); - return ObjectUtil.isNotNull(code) ? AjaxResult.error(code, e.getMessage()) : AjaxResult.error(e.getMessage()); + return ObjectUtil.isNotNull(code) ? R.fail(code.intValue(), e.getMessage()) : R.fail(e.getMessage()); } /** * 拦截未知的运行时异常 */ @ExceptionHandler(RuntimeException.class) - public AjaxResult handleRuntimeException(RuntimeException e, HttpServletRequest request) { + public R handleRuntimeException(RuntimeException e, HttpServletRequest request) { String requestURI = request.getRequestURI(); log.error("请求地址'{}',发生未知异常.", requestURI, e); - return AjaxResult.error(e.getMessage()); + return R.fail(e.getMessage()); } /** * 系统异常 */ @ExceptionHandler(Exception.class) - public AjaxResult handleException(Exception e, HttpServletRequest request) { + public R handleException(Exception e, HttpServletRequest request) { String requestURI = request.getRequestURI(); log.error("请求地址'{}',发生系统异常.", requestURI, e); - return AjaxResult.error(e.getMessage()); + return R.fail(e.getMessage()); } /** * 自定义验证异常 */ @ExceptionHandler(BindException.class) - public AjaxResult handleBindException(BindException e) { + public R handleBindException(BindException e) { log.error(e.getMessage(), e); String message = e.getAllErrors().stream() .map(DefaultMessageSourceResolvable::getDefaultMessage) .collect(Collectors.joining(", ")); - return AjaxResult.error(message); + return R.fail(message); } /** * 自定义验证异常 */ @ExceptionHandler(ConstraintViolationException.class) - public AjaxResult constraintViolationException(ConstraintViolationException e) { + public R constraintViolationException(ConstraintViolationException e) { log.error(e.getMessage(), e); String message = e.getConstraintViolations().stream() .map(ConstraintViolation::getMessage) .collect(Collectors.joining(", ")); - return AjaxResult.error(message); + return R.fail(message); } /** * 自定义验证异常 */ @ExceptionHandler(MethodArgumentNotValidException.class) - public AjaxResult handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { + public R handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { log.error(e.getMessage(), e); String message = e.getBindingResult().getFieldError().getDefaultMessage(); - return AjaxResult.error(message); + return R.fail(message); } /** * 演示模式异常 */ @ExceptionHandler(DemoModeException.class) - public AjaxResult handleDemoModeException(DemoModeException e) { - return AjaxResult.error("演示模式,不允许操作"); + public R handleDemoModeException(DemoModeException e) { + return R.fail("演示模式,不允许操作"); } } diff --git a/ruoyi-generator/pom.xml b/ruoyi-generator/pom.xml index 0fb2be48e..f44a9e5f1 100644 --- a/ruoyi-generator/pom.xml +++ b/ruoyi-generator/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 3.5.0 + 4.0.1 4.0.0 diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java index c0cce7241..e9e61e72b 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java @@ -5,13 +5,12 @@ import cn.hutool.core.convert.Convert; import cn.hutool.core.io.IoUtil; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; -import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.PageQuery; +import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.generator.domain.GenTable; import com.ruoyi.generator.domain.GenTableColumn; -import com.ruoyi.generator.service.IGenTableColumnService; import com.ruoyi.generator.service.IGenTableService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -38,7 +37,6 @@ import java.util.Map; public class GenController extends BaseController { private final IGenTableService genTableService; - private final IGenTableColumnService genTableColumnService; /** * 查询代码生成列表 @@ -55,16 +53,16 @@ public class GenController extends BaseController { */ @ApiOperation("修改代码生成业务") @SaCheckPermission("tool:gen:query") - @GetMapping(value = "/{talbleId}") - public AjaxResult> getInfo(@PathVariable Long talbleId) { - GenTable table = genTableService.selectGenTableById(talbleId); + @GetMapping(value = "/{tableId}") + public R> getInfo(@PathVariable Long tableId) { + GenTable table = genTableService.selectGenTableById(tableId); List tables = genTableService.selectGenTableAll(); - List list = genTableColumnService.selectGenTableColumnListByTableId(talbleId); + List list = genTableService.selectGenTableColumnListByTableId(tableId); Map map = new HashMap(); map.put("info", table); map.put("rows", list); map.put("tables", tables); - return AjaxResult.success(map); + return R.ok(map); } /** @@ -82,10 +80,10 @@ public class GenController extends BaseController { */ @ApiOperation("查询数据表字段列表") @SaCheckPermission("tool:gen:list") - @GetMapping(value = "/column/{talbleId}") + @GetMapping(value = "/column/{tableId}") public TableDataInfo columnList(Long tableId) { TableDataInfo dataInfo = new TableDataInfo<>(); - List list = genTableColumnService.selectGenTableColumnListByTableId(tableId); + List list = genTableService.selectGenTableColumnListByTableId(tableId); dataInfo.setRows(list); dataInfo.setTotal(list.size()); return dataInfo; @@ -98,12 +96,12 @@ public class GenController extends BaseController { @SaCheckPermission("tool:gen:import") @Log(title = "代码生成", businessType = BusinessType.IMPORT) @PostMapping("/importTable") - public AjaxResult importTableSave(String tables) { + public R importTableSave(String tables) { String[] tableNames = Convert.toStrArray(tables); // 查询表信息 List tableList = genTableService.selectDbTableListByNames(tableNames); genTableService.importGenTable(tableList); - return AjaxResult.success(); + return R.ok(); } /** @@ -113,10 +111,10 @@ public class GenController extends BaseController { @SaCheckPermission("tool:gen:edit") @Log(title = "代码生成", businessType = BusinessType.UPDATE) @PutMapping - public AjaxResult editSave(@Validated @RequestBody GenTable genTable) { + public R editSave(@Validated @RequestBody GenTable genTable) { genTableService.validateEdit(genTable); genTableService.updateGenTable(genTable); - return AjaxResult.success(); + return R.ok(); } /** @@ -126,9 +124,9 @@ public class GenController extends BaseController { @SaCheckPermission("tool:gen:remove") @Log(title = "代码生成", businessType = BusinessType.DELETE) @DeleteMapping("/{tableIds}") - public AjaxResult remove(@PathVariable Long[] tableIds) { + public R remove(@PathVariable Long[] tableIds) { genTableService.deleteGenTableByIds(tableIds); - return AjaxResult.success(); + return R.ok(); } /** @@ -137,9 +135,9 @@ public class GenController extends BaseController { @ApiOperation("预览代码") @SaCheckPermission("tool:gen:preview") @GetMapping("/preview/{tableId}") - public AjaxResult> preview(@PathVariable("tableId") Long tableId) throws IOException { + public R> preview(@PathVariable("tableId") Long tableId) throws IOException { Map dataMap = genTableService.previewCode(tableId); - return AjaxResult.success(dataMap); + return R.ok(dataMap); } /** @@ -161,9 +159,9 @@ public class GenController extends BaseController { @SaCheckPermission("tool:gen:code") @Log(title = "代码生成", businessType = BusinessType.GENCODE) @GetMapping("/genCode/{tableName}") - public AjaxResult genCode(@PathVariable("tableName") String tableName) { + public R genCode(@PathVariable("tableName") String tableName) { genTableService.generatorCode(tableName); - return AjaxResult.success(); + return R.ok(); } /** @@ -173,9 +171,9 @@ public class GenController extends BaseController { @SaCheckPermission("tool:gen:edit") @Log(title = "代码生成", businessType = BusinessType.UPDATE) @GetMapping("/synchDb/{tableName}") - public AjaxResult synchDb(@PathVariable("tableName") String tableName) { + public R synchDb(@PathVariable("tableName") String tableName) { genTableService.synchDb(tableName); - return AjaxResult.success(); + return R.ok(); } /** diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java index 915cf7dc5..45e9168e5 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java @@ -1,14 +1,11 @@ package com.ruoyi.generator.domain; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.*; import com.ruoyi.common.constant.GenConstants; import com.ruoyi.common.core.domain.BaseEntity; import com.ruoyi.common.utils.StringUtils; import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; import org.apache.commons.lang3.ArrayUtils; import javax.validation.Valid; @@ -23,7 +20,6 @@ import java.util.List; @Data @EqualsAndHashCode(callSuper = true) -@Accessors(chain = true) @TableName("gen_table") public class GenTable extends BaseEntity { @@ -104,6 +100,7 @@ public class GenTable extends BaseEntity { /** * 生成路径(不填默认项目路径) */ + @TableField(updateStrategy = FieldStrategy.NOT_EMPTY) private String genPath; /** @@ -153,6 +150,12 @@ public class GenTable extends BaseEntity { @TableField(exist = false) private String treeName; + /* + * 菜单id列表 + */ + @TableField(exist = false) + private List menuIds; + /** * 上级菜单ID字段 */ diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java index 1a978d4f1..1ea991796 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java @@ -8,7 +8,7 @@ import com.ruoyi.common.core.domain.BaseEntity; import com.ruoyi.common.utils.StringUtils; import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; +import org.apache.ibatis.type.JdbcType; import javax.validation.constraints.NotBlank; @@ -20,7 +20,6 @@ import javax.validation.constraints.NotBlank; @Data @EqualsAndHashCode(callSuper = true) -@Accessors(chain = true) @TableName("gen_table_column") public class GenTableColumn extends BaseEntity { @@ -43,7 +42,7 @@ public class GenTableColumn extends BaseEntity { /** * 列描述 */ - @TableField(updateStrategy = FieldStrategy.IGNORED) + @TableField(updateStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.VARCHAR) private String columnComment; /** @@ -65,43 +64,43 @@ public class GenTableColumn extends BaseEntity { /** * 是否主键(1是) */ - @TableField(updateStrategy = FieldStrategy.IGNORED) + @TableField(updateStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.VARCHAR) private String isPk; /** * 是否自增(1是) */ - @TableField(updateStrategy = FieldStrategy.IGNORED) + @TableField(updateStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.VARCHAR) private String isIncrement; /** * 是否必填(1是) */ - @TableField(updateStrategy = FieldStrategy.IGNORED) + @TableField(updateStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.VARCHAR) private String isRequired; /** * 是否为插入字段(1是) */ - @TableField(updateStrategy = FieldStrategy.IGNORED) + @TableField(updateStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.VARCHAR) private String isInsert; /** * 是否编辑字段(1是) */ - @TableField(updateStrategy = FieldStrategy.IGNORED) + @TableField(updateStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.VARCHAR) private String isEdit; /** * 是否列表字段(1是) */ - @TableField(updateStrategy = FieldStrategy.IGNORED) + @TableField(updateStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.VARCHAR) private String isList; /** * 是否查询字段(1是) */ - @TableField(updateStrategy = FieldStrategy.IGNORED) + @TableField(updateStrategy = FieldStrategy.IGNORED, jdbcType = JdbcType.VARCHAR) private String isQuery; /** diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java index cbb92fdc4..29bfe0de8 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java @@ -16,23 +16,12 @@ import java.util.List; @InterceptorIgnore(dataPermission = "true") public interface GenTableMapper extends BaseMapperPlus { - - Page selectPageGenTableList(@Param("page") Page page, @Param("genTable") GenTable genTable); - Page selectPageDbTableList(@Param("page") Page page, @Param("genTable") GenTable genTable); - /** - * 查询业务列表 - * - * @param genTable 业务信息 - * @return 业务集合 - */ - List selectGenTableList(GenTable genTable); - /** * 查询据库列表 * - * @param genTable 业务信息 + * @param genTable 查询条件 * @return 数据库表集合 */ List selectDbTableList(GenTable genTable); diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableColumnServiceImpl.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableColumnServiceImpl.java deleted file mode 100644 index 78260aa78..000000000 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableColumnServiceImpl.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.ruoyi.generator.service; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.ruoyi.generator.domain.GenTableColumn; -import com.ruoyi.generator.mapper.GenTableColumnMapper; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -import java.util.Arrays; -import java.util.List; - -/** - * 业务字段 服务层实现 - * - * @author Lion Li - */ -@RequiredArgsConstructor -@Service -public class GenTableColumnServiceImpl implements IGenTableColumnService { - - private final GenTableColumnMapper baseMapper; - - /** - * 查询业务字段列表 - * - * @param tableId 业务字段编号 - * @return 业务字段集合 - */ - @Override - public List selectGenTableColumnListByTableId(Long tableId) { - return baseMapper.selectList(new LambdaQueryWrapper() - .eq(GenTableColumn::getTableId, tableId) - .orderByAsc(GenTableColumn::getSort)); - } - - /** - * 新增业务字段 - * - * @param genTableColumn 业务字段信息 - * @return 结果 - */ - @Override - public int insertGenTableColumn(GenTableColumn genTableColumn) { - return baseMapper.insert(genTableColumn); - } - - /** - * 修改业务字段 - * - * @param genTableColumn 业务字段信息 - * @return 结果 - */ - @Override - public int updateGenTableColumn(GenTableColumn genTableColumn) { - return baseMapper.updateById(genTableColumn); - } - - /** - * 删除业务字段对象 - * - * @param ids 需要删除的数据ID - * @return 结果 - */ - @Override - public int deleteGenTableColumnByIds(String ids) { - return baseMapper.deleteBatchIds(Arrays.asList(ids.split(","))); - } -} diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java index 8f6a40fee..e988894b4 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java @@ -1,10 +1,15 @@ package com.ruoyi.generator.service; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.convert.Convert; import cn.hutool.core.io.IoUtil; +import cn.hutool.core.lang.Dict; +import cn.hutool.core.lang.Snowflake; +import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.GenConstants; @@ -28,7 +33,6 @@ import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.Velocity; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; import java.io.ByteArrayOutputStream; import java.io.File; @@ -46,6 +50,7 @@ import java.util.zip.ZipOutputStream; * * @author Lion Li */ +@DS("#header.datasource") @Slf4j @RequiredArgsConstructor @Service @@ -54,6 +59,19 @@ public class GenTableServiceImpl implements IGenTableService { private final GenTableMapper baseMapper; private final GenTableColumnMapper genTableColumnMapper; + /** + * 查询业务字段列表 + * + * @param tableId 业务字段编号 + * @return 业务字段集合 + */ + @Override + public List selectGenTableColumnListByTableId(Long tableId) { + return genTableColumnMapper.selectList(new LambdaQueryWrapper() + .eq(GenTableColumn::getTableId, tableId) + .orderByAsc(GenTableColumn::getSort)); + } + /** * 查询业务信息 * @@ -69,13 +87,7 @@ public class GenTableServiceImpl implements IGenTableService { @Override public TableDataInfo selectPageGenTableList(GenTable genTable, PageQuery pageQuery) { - Page page = baseMapper.selectPageGenTableList(pageQuery.build(), genTable); - return TableDataInfo.build(page); - } - - @Override - public TableDataInfo selectPageDbTableList(GenTable genTable, PageQuery pageQuery) { - Page page = baseMapper.selectPageDbTableList(pageQuery.build(), genTable); + Page page = baseMapper.selectPage(pageQuery.build(), this.buildGenTableQueryWrapper(genTable)); return TableDataInfo.build(page); } @@ -87,7 +99,24 @@ public class GenTableServiceImpl implements IGenTableService { */ @Override public List selectGenTableList(GenTable genTable) { - return baseMapper.selectGenTableList(genTable); + return baseMapper.selectList(this.buildGenTableQueryWrapper(genTable)); + } + + private QueryWrapper buildGenTableQueryWrapper(GenTable genTable) { + Map params = genTable.getParams(); + QueryWrapper wrapper = Wrappers.query(); + wrapper.like(StringUtils.isNotBlank(genTable.getTableName()), "lower(table_name)", StringUtils.lowerCase(genTable.getTableName())) + .like(StringUtils.isNotBlank(genTable.getTableComment()), "lower(table_comment)", StringUtils.lowerCase(genTable.getTableComment())) + .between(params.get("beginTime") != null && params.get("endTime") != null, + "create_time", params.get("beginTime"), params.get("endTime")); + return wrapper; + } + + + @Override + public TableDataInfo selectPageDbTableList(GenTable genTable, PageQuery pageQuery) { + Page page = baseMapper.selectPageDbTableList(pageQuery.build(), genTable); + return TableDataInfo.build(page); } /** @@ -129,7 +158,6 @@ public class GenTableServiceImpl implements IGenTableService { * @return 结果 */ @Override - @Transactional(rollbackFor = Exception.class) public void updateGenTable(GenTable genTable) { String options = JsonUtils.toJsonString(genTable.getParams()); genTable.setOptions(options); @@ -148,7 +176,6 @@ public class GenTableServiceImpl implements IGenTableService { * @return 结果 */ @Override - @Transactional(rollbackFor = Exception.class) public void deleteGenTableByIds(Long[] tableIds) { List ids = Arrays.asList(tableIds); baseMapper.deleteBatchIds(ids); @@ -161,7 +188,6 @@ public class GenTableServiceImpl implements IGenTableService { * @param tableList 导入表列表 */ @Override - @Transactional(rollbackFor = Exception.class) public void importGenTable(List tableList) { String operName = LoginHelper.getUsername(); try { @@ -198,6 +224,12 @@ public class GenTableServiceImpl implements IGenTableService { Map dataMap = new LinkedHashMap<>(); // 查询表信息 GenTable table = baseMapper.selectGenTableById(tableId); + Snowflake snowflake = IdUtil.getSnowflake(); + List menuIds = new ArrayList<>(); + for (int i = 0; i < 6; i++) { + menuIds.add(snowflake.nextId()); + } + table.setMenuIds(menuIds); // 设置主子表信息 setSubTable(table); // 设置主键列信息 @@ -275,7 +307,6 @@ public class GenTableServiceImpl implements IGenTableService { * @param tableName 表名称 */ @Override - @Transactional(rollbackFor = Exception.class) public void synchDb(String tableName) { GenTable table = baseMapper.selectGenTableByName(tableName); List tableColumns = table.getColumns(); @@ -294,8 +325,16 @@ public class GenTableServiceImpl implements IGenTableService { GenTableColumn prevColumn = tableColumnMap.get(column.getColumnName()); column.setColumnId(prevColumn.getColumnId()); if (column.isList()) { - // 如果是列表,继续保留字典类型 + // 如果是列表,继续保留查询方式/字典类型选项 column.setDictType(prevColumn.getDictType()); + column.setQueryType(prevColumn.getQueryType()); + } + if (StringUtils.isNotEmpty(prevColumn.getIsRequired()) && !column.isPk() + && (column.isInsert() || column.isEdit()) + && ((column.isUsableColumn()) || (!column.isSuperColumn()))) { + // 如果是(新增/修改&非主键/非忽略及父属性),继续保留必填/显示类型选项 + column.setIsRequired(prevColumn.getIsRequired()); + column.setHtmlType(prevColumn.getHtmlType()); } genTableColumnMapper.updateById(column); } else { @@ -336,6 +375,12 @@ public class GenTableServiceImpl implements IGenTableService { private void generatorCode(String tableName, ZipOutputStream zip) { // 查询表信息 GenTable table = baseMapper.selectGenTableByName(tableName); + Snowflake snowflake = IdUtil.getSnowflake(); + List menuIds = new ArrayList<>(); + for (int i = 0; i < 6; i++) { + menuIds.add(snowflake.nextId()); + } + table.setMenuIds(menuIds); // 设置主子表信息 setSubTable(table); // 设置主键列信息 @@ -373,12 +418,13 @@ public class GenTableServiceImpl implements IGenTableService { @Override public void validateEdit(GenTable genTable) { if (GenConstants.TPL_TREE.equals(genTable.getTplCategory())) { - Map paramsObj = genTable.getParams(); - if (ObjectUtil.isEmpty(paramsObj.get(GenConstants.TREE_CODE))) { + String options = JsonUtils.toJsonString(genTable.getParams()); + Dict paramsObj = JsonUtils.parseMap(options); + if (StringUtils.isEmpty(paramsObj.getStr(GenConstants.TREE_CODE))) { throw new ServiceException("树编码字段不能为空"); - } else if (ObjectUtil.isEmpty(paramsObj.get(GenConstants.TREE_PARENT_CODE))) { + } else if (StringUtils.isEmpty(paramsObj.getStr(GenConstants.TREE_PARENT_CODE))) { throw new ServiceException("树父编码字段不能为空"); - } else if (ObjectUtil.isEmpty(paramsObj.get(GenConstants.TREE_NAME))) { + } else if (StringUtils.isEmpty(paramsObj.getStr(GenConstants.TREE_NAME))) { throw new ServiceException("树名称字段不能为空"); } else if (GenConstants.TPL_SUB.equals(genTable.getTplCategory())) { if (StringUtils.isEmpty(genTable.getSubTableName())) { @@ -436,13 +482,13 @@ public class GenTableServiceImpl implements IGenTableService { * @param genTable 设置后的生成对象 */ public void setTableFromOptions(GenTable genTable) { - Map paramsObj = JsonUtils.parseMap(genTable.getOptions()); + Dict paramsObj = JsonUtils.parseMap(genTable.getOptions()); if (ObjectUtil.isNotNull(paramsObj)) { - String treeCode = Convert.toStr(paramsObj.get(GenConstants.TREE_CODE)); - String treeParentCode = Convert.toStr(paramsObj.get(GenConstants.TREE_PARENT_CODE)); - String treeName = Convert.toStr(paramsObj.get(GenConstants.TREE_NAME)); - String parentMenuId = Convert.toStr(paramsObj.get(GenConstants.PARENT_MENU_ID)); - String parentMenuName = Convert.toStr(paramsObj.get(GenConstants.PARENT_MENU_NAME)); + String treeCode = paramsObj.getStr(GenConstants.TREE_CODE); + String treeParentCode = paramsObj.getStr(GenConstants.TREE_PARENT_CODE); + String treeName = paramsObj.getStr(GenConstants.TREE_NAME); + String parentMenuId = paramsObj.getStr(GenConstants.PARENT_MENU_ID); + String parentMenuName = paramsObj.getStr(GenConstants.PARENT_MENU_NAME); genTable.setTreeCode(treeCode); genTable.setTreeParentCode(treeParentCode); @@ -467,3 +513,4 @@ public class GenTableServiceImpl implements IGenTableService { return genPath + File.separator + VelocityUtils.getFileName(template, table); } } + diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableColumnService.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableColumnService.java deleted file mode 100644 index f14f36a53..000000000 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableColumnService.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.ruoyi.generator.service; - -import com.ruoyi.generator.domain.GenTableColumn; - -import java.util.List; - -/** - * 业务字段 服务层 - * - * @author Lion Li - */ -public interface IGenTableColumnService { - /** - * 查询业务字段列表 - * - * @param tableId 业务字段编号 - * @return 业务字段集合 - */ - List selectGenTableColumnListByTableId(Long tableId); - - /** - * 新增业务字段 - * - * @param genTableColumn 业务字段信息 - * @return 结果 - */ - int insertGenTableColumn(GenTableColumn genTableColumn); - - /** - * 修改业务字段 - * - * @param genTableColumn 业务字段信息 - * @return 结果 - */ - int updateGenTableColumn(GenTableColumn genTableColumn); - - /** - * 删除业务字段信息 - * - * @param ids 需要删除的数据ID - * @return 结果 - */ - int deleteGenTableColumnByIds(String ids); -} diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java index 27fac79e3..092020a5f 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java @@ -3,6 +3,7 @@ package com.ruoyi.generator.service; import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.generator.domain.GenTable; +import com.ruoyi.generator.domain.GenTableColumn; import java.util.List; import java.util.Map; @@ -14,6 +15,14 @@ import java.util.Map; */ public interface IGenTableService { + /** + * 查询业务字段列表 + * + * @param tableId 业务字段编号 + * @return 业务字段集合 + */ + List selectGenTableColumnListByTableId(Long tableId); + TableDataInfo selectPageGenTableList(GenTable genTable, PageQuery pageQuery); diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/GenUtils.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/GenUtils.java index cb977d944..1a1d04ac3 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/GenUtils.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/GenUtils.java @@ -41,6 +41,7 @@ public class GenUtils { column.setJavaField(StringUtils.toCamelCase(columnName)); // 设置默认类型 column.setJavaType(GenConstants.TYPE_STRING); + column.setQueryType(GenConstants.QUERY_EQ); if (arraysContains(GenConstants.COLUMNTYPE_STR, dataType) || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType)) { // 字符串长度超过500设置为文本域 @@ -136,8 +137,7 @@ public class GenUtils { public static String getModuleName(String packageName) { int lastIndex = packageName.lastIndexOf("."); int nameLength = packageName.length(); - String moduleName = StringUtils.substring(packageName, lastIndex + 1, nameLength); - return moduleName; + return StringUtils.substring(packageName, lastIndex + 1, nameLength); } /** diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java index 67296b70e..746497041 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java @@ -2,8 +2,10 @@ package com.ruoyi.generator.util; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; +import cn.hutool.core.lang.Dict; import cn.hutool.core.util.ObjectUtil; import com.ruoyi.common.constant.GenConstants; +import com.ruoyi.common.helper.DataBaseHelper; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.JsonUtils; import com.ruoyi.common.utils.StringUtils; @@ -78,14 +80,14 @@ public class VelocityUtils { public static void setMenuVelocityContext(VelocityContext context, GenTable genTable) { String options = genTable.getOptions(); - Map paramsObj = JsonUtils.parseMap(options); + Dict paramsObj = JsonUtils.parseMap(options); String parentMenuId = getParentMenuId(paramsObj); context.put("parentMenuId", parentMenuId); } public static void setTreeVelocityContext(VelocityContext context, GenTable genTable) { String options = genTable.getOptions(); - Map paramsObj = JsonUtils.parseMap(options); + Dict paramsObj = JsonUtils.parseMap(options); String treeCode = getTreecode(paramsObj); String treeParentCode = getTreeParentCode(paramsObj); String treeName = getTreeName(paramsObj); @@ -134,7 +136,15 @@ public class VelocityUtils { templates.add("vm/java/serviceImpl.java.vm"); templates.add("vm/java/controller.java.vm"); templates.add("vm/xml/mapper.xml.vm"); - templates.add("vm/sql/sql.vm"); + if (DataBaseHelper.isOracle()) { + templates.add("vm/sql/oracle/sql.vm"); + } else if (DataBaseHelper.isPostgerSql()) { + templates.add("vm/sql/postgres/sql.vm"); + } else if (DataBaseHelper.isSqlServer()) { + templates.add("vm/sql/sqlserver/sql.vm"); + } else { + templates.add("vm/sql/sql.vm"); + } templates.add("vm/js/api.js.vm"); if (GenConstants.TPL_CRUD.equals(tplCategory)) { templates.add("vm/vue/index.vue.vm"); @@ -207,8 +217,7 @@ public class VelocityUtils { */ public static String getPackagePrefix(String packageName) { int lastIndex = packageName.lastIndexOf("."); - String basePackage = StringUtils.substring(packageName, 0, lastIndex); - return basePackage; + return StringUtils.substring(packageName, 0, lastIndex); } /** @@ -244,14 +253,28 @@ public class VelocityUtils { public static String getDicts(GenTable genTable) { List columns = genTable.getColumns(); Set dicts = new HashSet(); + addDicts(dicts, columns); + if (ObjectUtil.isNotNull(genTable.getSubTable())) { + List subColumns = genTable.getSubTable().getColumns(); + addDicts(dicts, subColumns); + } + return StringUtils.join(dicts, ", "); + } + + /** + * 添加字典列表 + * + * @param dicts 字典列表 + * @param columns 列集合 + */ + public static void addDicts(Set dicts, List columns) { for (GenTableColumn column : columns) { if (!column.isSuperColumn() && StringUtils.isNotEmpty(column.getDictType()) && StringUtils.equalsAny( column.getHtmlType(), - new String[]{GenConstants.HTML_SELECT, GenConstants.HTML_RADIO, GenConstants.HTML_CHECKBOX})) { + new String[] { GenConstants.HTML_SELECT, GenConstants.HTML_RADIO, GenConstants.HTML_CHECKBOX })) { dicts.add("'" + column.getDictType() + "'"); } } - return StringUtils.join(dicts, ", "); } /** @@ -271,10 +294,10 @@ public class VelocityUtils { * @param paramsObj 生成其他选项 * @return 上级菜单ID字段 */ - public static String getParentMenuId(Map paramsObj) { + public static String getParentMenuId(Dict paramsObj) { if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.PARENT_MENU_ID) - && StringUtils.isNotEmpty(Convert.toStr(paramsObj.get(GenConstants.PARENT_MENU_ID)))) { - return Convert.toStr(paramsObj.get(GenConstants.PARENT_MENU_ID)); + && StringUtils.isNotEmpty(paramsObj.getStr(GenConstants.PARENT_MENU_ID))) { + return paramsObj.getStr(GenConstants.PARENT_MENU_ID); } return DEFAULT_PARENT_MENU_ID; } @@ -298,9 +321,9 @@ public class VelocityUtils { * @param paramsObj 生成其他选项 * @return 树父编码 */ - public static String getTreeParentCode(Map paramsObj) { + public static String getTreeParentCode(Dict paramsObj) { if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) { - return StringUtils.toCamelCase(Convert.toStr(paramsObj.get(GenConstants.TREE_PARENT_CODE))); + return StringUtils.toCamelCase(paramsObj.getStr(GenConstants.TREE_PARENT_CODE)); } return StringUtils.EMPTY; } @@ -311,9 +334,9 @@ public class VelocityUtils { * @param paramsObj 生成其他选项 * @return 树名称 */ - public static String getTreeName(Map paramsObj) { + public static String getTreeName(Dict paramsObj) { if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_NAME)) { - return StringUtils.toCamelCase(Convert.toStr(paramsObj.get(GenConstants.TREE_NAME))); + return StringUtils.toCamelCase(paramsObj.getStr(GenConstants.TREE_NAME)); } return StringUtils.EMPTY; } @@ -326,8 +349,8 @@ public class VelocityUtils { */ public static int getExpandColumn(GenTable genTable) { String options = genTable.getOptions(); - Map paramsObj = JsonUtils.parseMap(options); - String treeName = Convert.toStr(paramsObj.get(GenConstants.TREE_NAME)); + Dict paramsObj = JsonUtils.parseMap(options); + String treeName = paramsObj.getStr(GenConstants.TREE_NAME); int num = 0; for (GenTableColumn column : genTable.getColumns()) { if (column.isList()) { diff --git a/ruoyi-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml b/ruoyi-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml index 7ef974458..7b1e9c5fa 100644 --- a/ruoyi-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml +++ b/ruoyi-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml @@ -30,9 +30,72 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" diff --git a/ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml b/ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml index 8f0c2690e..b66b25d80 100644 --- a/ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml +++ b/ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml @@ -53,100 +53,204 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - - select table_id, table_name, table_comment, sub_table_name, sub_table_fk_name, class_name, tpl_category, package_name, module_name, business_name, function_name, function_author, gen_type, gen_path, options, create_by, create_time, update_by, update_time, remark from gen_table - - - + + select table_name, table_comment, create_time, update_time + from information_schema.tables + where table_schema = (select database()) + AND table_name NOT LIKE 'xxl_job_%' AND table_name NOT LIKE 'gen_%' + AND table_name NOT IN (select table_name from gen_table) AND lower(table_name) like lower(concat('%', #{genTable.tableName}, '%')) AND lower(table_comment) like lower(concat('%', #{genTable.tableComment}, '%')) - - AND date_format(create_time,'%y%m%d') >= date_format(#{genTable.params.beginTime},'%y%m%d') + order by create_time desc + + + select lower(dt.table_name) as table_name, dtc.comments as table_comment, uo.created as create_time, uo.last_ddl_time as update_time + from user_tables dt, user_tab_comments dtc, user_objects uo + where dt.table_name = dtc.table_name + and dt.table_name = uo.object_name + and uo.object_type = 'TABLE' + AND dt.table_name NOT LIKE 'XXL_JOB_%' AND dt.table_name NOT LIKE 'GEN_%' + AND lower(dt.table_name) NOT IN (select table_name from gen_table) + + AND lower(dt.table_name) like lower(concat(concat('%', #{genTable.tableName}), '%')) - - AND date_format(create_time,'%y%m%d') <= date_format(#{genTable.params.endTime},'%y%m%d') + + AND lower(dtc.comments) like lower(concat(concat('%', #{genTable.tableComment}), '%')) - + order by create_time desc + + + select table_name, table_comment, create_time, update_time + from ( + SELECT c.relname AS table_name, + obj_description(c.oid) AS table_comment, + CURRENT_TIMESTAMP AS create_time, + CURRENT_TIMESTAMP AS update_time + FROM pg_class c + LEFT JOIN pg_namespace n ON n.oid = c.relnamespace + WHERE (c.relkind = ANY (ARRAY ['r'::"char", 'p'::"char"])) + AND c.relname != 'spatial_%'::text + AND n.nspname = 'public'::name + AND n.nspname ]]> ''::name + ) list_table + where table_name NOT LIKE 'xxl_job_%' AND table_name NOT LIKE 'gen_%' + AND table_name NOT IN (select table_name from gen_table) + + AND lower(table_name) like lower(concat('%', #{genTable.tableName}, '%')) + + + AND lower(table_comment) like lower(concat('%', #{genTable.tableComment}, '%')) + + order by create_time desc + + + - - - - + + select table_name, table_comment, create_time, update_time + from information_schema.tables + AND table_name NOT LIKE 'xxl_job_%' AND table_name NOT LIKE 'gen_%' + AND table_name NOT IN (select table_name from gen_table) AND lower(table_name) like lower(concat('%', #{tableName}, '%')) AND lower(table_comment) like lower(concat('%', #{tableComment}, '%')) - - AND date_format(create_time,'%y%m%d') >= date_format(#{params.beginTime},'%y%m%d') + order by create_time desc + + + select lower(dt.table_name) as table_name, dtc.comments as table_comment, uo.created as create_time, uo.last_ddl_time as update_time + from user_tables dt, user_tab_comments dtc, user_objects uo + where dt.table_name = dtc.table_name + and dt.table_name = uo.object_name + and uo.object_type = 'TABLE' + AND dt.table_name NOT LIKE 'XXL_JOB_%' AND dt.table_name NOT LIKE 'GEN_%' + AND lower(dt.table_name) NOT IN (select table_name from gen_table) + + AND lower(dt.table_name) like lower(concat(concat('%', #{tableName}), '%')) - - AND date_format(create_time,'%y%m%d') <= date_format(#{params.endTime},'%y%m%d') + + AND lower(dtc.comments) like lower(concat(concat('%', #{tableComment}), '%')) - - - -