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 cbf2da393..353e087fc 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.0-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,40 +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全方位升级(不兼容原框架) | -| satoken分支 | RuoYi-Vue-Plus-satoken | [satoken分支地址](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/tree/satoken/) | 高可读性 扩展性(推荐使用) | -| 单体分支 | 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 的高性能容器 | -| 权限认证框架 | Spring Security、Jwt | [SpringSecurity官网](https://spring.io/projects/spring-security#learn) | 支持多终端认证系统 | -| 权限认证框架 | 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 多种限流 | -| 分布式锁 | 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标准国际化方案 | ## 参考文档 @@ -74,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) ## 加群与捐献 @@ -114,40 +114,40 @@ ## 演示图例 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
-

-
+

+
diff --git a/pom.xml b/pom.xml index 7361fac28..6b518e2f6 100644 --- a/pom.xml +++ b/pom.xml @@ -2,36 +2,37 @@ - 4.0.0 + 4.0.0 com.ruoyi ruoyi-vue-plus - 3.5.0 + 4.0.0 RuoYi-Vue-Plus https://gitee.com/JavaLionLi/RuoYi-Vue-Plus RuoYi-Vue-Plus后台管理系统 - 3.5.0 - 2.5.8 + 4.0.0 + 2.6.3 UTF-8 UTF-8 1.8 - 3.2.0 + 3.2.2 1.2.8 3.0.3 1.5.22 4.1.2 - 2.2.11 + 3.0.5 3.3.0 2.3 - 3.4.3.4 + 1.29.0 + 3.5.1 3.9.1 - 5.7.18 + 5.7.20 4.9.2 - 2.5.5 - 3.16.7 + 2.6.2 + 3.16.8 2.2.1 3.5.0 1.3.6 @@ -41,10 +42,10 @@ 3.0.1 - 7.9.0 - 3.13.1 - 5.6.58 - 8.3.4 + 7.9.2 + 3.14.0 + 5.6.68 + 8.3.5 localhost @@ -67,6 +68,15 @@ import + + + cn.hutool + hutool-bom + ${hutool.version} + pom + import + + com.alibaba @@ -128,6 +138,19 @@ ${velocity.version} + + + cn.dev33 + sa-token-spring-boot-starter + ${satoken.version} + + + + cn.dev33 + sa-token-jwt + ${satoken.version} + + com.sun.xml.bind @@ -159,36 +182,6 @@ ${p6spy.version} - - cn.hutool - hutool-core - ${hutool.version} - - - - cn.hutool - hutool-http - ${hutool.version} - - - - cn.hutool - hutool-captcha - ${hutool.version} - - - - cn.hutool - hutool-extra - ${hutool.version} - - - - cn.hutool - hutool-jwt - ${hutool.version} - - com.squareup.okhttp3 okhttp @@ -251,7 +244,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.1 + 3.9.0 ${java.version} ${java.version} @@ -261,8 +254,18 @@ - src/main/resources + + false + + + src/main/resources + + + application* + bootstrap* + banner* + true diff --git a/ruoyi-extend/pom.xml b/ruoyi-extend/pom.xml index f0ae61d49..e9f343c55 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.0 4.0.0 ruoyi-extend diff --git a/ruoyi-extend/ruoyi-monitor-admin/pom.xml b/ruoyi-extend/ruoyi-monitor-admin/pom.xml index 4b0d591c9..6159ccc39 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.0 4.0.0 jar @@ -34,6 +34,11 @@ spring-boot-admin-starter-client + + org.projectlombok + lombok + + diff --git a/ruoyi-extend/ruoyi-monitor-admin/src/main/java/com/ruoyi/monitor/admin/MonitorAdminApplication.java b/ruoyi-extend/ruoyi-monitor-admin/src/main/java/com/ruoyi/monitor/admin/MonitorAdminApplication.java index 1d1cbca58..d4f038c94 100644 --- a/ruoyi-extend/ruoyi-monitor-admin/src/main/java/com/ruoyi/monitor/admin/MonitorAdminApplication.java +++ b/ruoyi-extend/ruoyi-monitor-admin/src/main/java/com/ruoyi/monitor/admin/MonitorAdminApplication.java @@ -11,9 +11,9 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class MonitorAdminApplication { - public static void main(String[] args) { - SpringApplication.run(MonitorAdminApplication.class, args); - System.out.println("Admin 监控启动成功" ); - } + public static void main(String[] args) { + SpringApplication.run(MonitorAdminApplication.class, args); + System.out.println("Admin 监控启动成功"); + } } diff --git a/ruoyi-extend/ruoyi-monitor-admin/src/main/java/com/ruoyi/monitor/admin/config/SecurityConfig.java b/ruoyi-extend/ruoyi-monitor-admin/src/main/java/com/ruoyi/monitor/admin/config/SecurityConfig.java index 04a0fdef0..2b04f712f 100644 --- a/ruoyi-extend/ruoyi-monitor-admin/src/main/java/com/ruoyi/monitor/admin/config/SecurityConfig.java +++ b/ruoyi-extend/ruoyi-monitor-admin/src/main/java/com/ruoyi/monitor/admin/config/SecurityConfig.java @@ -16,33 +16,33 @@ import org.springframework.security.web.authentication.SavedRequestAwareAuthenti @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { - private final String adminContextPath; + private final String adminContextPath; - public SecurityConfig(AdminServerProperties adminServerProperties) { - this.adminContextPath = adminServerProperties.getContextPath(); - } + public SecurityConfig(AdminServerProperties adminServerProperties) { + this.adminContextPath = adminServerProperties.getContextPath(); + } - @Override - protected void configure(HttpSecurity httpSecurity) throws Exception { - SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler(); - successHandler.setTargetUrlParameter("redirectTo"); - successHandler.setDefaultTargetUrl(adminContextPath + "/"); - // admin监控 用户鉴权 - httpSecurity.authorizeRequests() - //授予对所有静态资产和登录页面的公共访问权限。 - .antMatchers(adminContextPath + "/assets/**").permitAll() - .antMatchers(adminContextPath + "/login").permitAll() + @Override + protected void configure(HttpSecurity httpSecurity) throws Exception { + SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler(); + successHandler.setTargetUrlParameter("redirectTo"); + successHandler.setDefaultTargetUrl(adminContextPath + "/"); + // admin监控 用户鉴权 + httpSecurity.authorizeRequests() + //授予对所有静态资产和登录页面的公共访问权限。 + .antMatchers(adminContextPath + "/assets/**").permitAll() + .antMatchers(adminContextPath + "/login").permitAll() .antMatchers("/actuator").permitAll() .antMatchers("/actuator/**").permitAll() - //必须对每个其他请求进行身份验证 - .anyRequest().authenticated().and() - //配置登录和注销 - .formLogin().loginPage(adminContextPath + "/login") - .successHandler(successHandler).and() - .logout().logoutUrl(adminContextPath + "/logout").and() - //启用HTTP-Basic支持。这是Spring Boot Admin Client注册所必需的 - .httpBasic().and().csrf().disable() - .headers().frameOptions().disable(); - } + //必须对每个其他请求进行身份验证 + .anyRequest().authenticated().and() + //配置登录和注销 + .formLogin().loginPage(adminContextPath + "/login") + .successHandler(successHandler).and() + .logout().logoutUrl(adminContextPath + "/logout").and() + //启用HTTP-Basic支持。这是Spring Boot Admin Client注册所必需的 + .httpBasic().and().csrf().disable() + .headers().frameOptions().disable(); + } } diff --git a/ruoyi-extend/ruoyi-monitor-admin/src/main/java/com/ruoyi/monitor/admin/notifier/CustomNotifier.java b/ruoyi-extend/ruoyi-monitor-admin/src/main/java/com/ruoyi/monitor/admin/notifier/CustomNotifier.java new file mode 100644 index 000000000..4d0a7a034 --- /dev/null +++ b/ruoyi-extend/ruoyi-monitor-admin/src/main/java/com/ruoyi/monitor/admin/notifier/CustomNotifier.java @@ -0,0 +1,40 @@ +package com.ruoyi.monitor.admin.notifier; + +import de.codecentric.boot.admin.server.domain.entities.Instance; +import de.codecentric.boot.admin.server.domain.entities.InstanceRepository; +import de.codecentric.boot.admin.server.domain.events.InstanceEvent; +import de.codecentric.boot.admin.server.domain.events.InstanceStatusChangedEvent; +import de.codecentric.boot.admin.server.notify.AbstractEventNotifier; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import reactor.core.publisher.Mono; + +/** + * 自定义事件通知处理 + * + * @author Lion Li + */ +@Slf4j +@Component +public class CustomNotifier extends AbstractEventNotifier { + + protected CustomNotifier(InstanceRepository repository) { + super(repository); + } + + @Override + @SuppressWarnings("all") + protected Mono doNotify(InstanceEvent event, Instance instance) { + return Mono.fromRunnable(() -> { + // 实例状态改变事件 + if (event instanceof InstanceStatusChangedEvent) { + String registName = instance.getRegistration().getName(); + String instanceId = event.getInstance().getValue(); + String status = ((InstanceStatusChangedEvent) event).getStatusInfo().getStatus(); + log.info("Instance Status Change: [{}],[{}],[{}]", registName, instanceId, status); + } + + }); + } + +} 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 640628e35..f444c3123 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/pom.xml +++ b/ruoyi-extend/ruoyi-xxl-job-admin/pom.xml @@ -1,139 +1,126 @@ - 4.0.0 - + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + ruoyi-extend com.ruoyi - 3.5.0 - - ruoyi-xxl-job-admin - jar + 4.0.0 + + ruoyi-xxl-job-admin + jar - - 2.1.4 - 8.0.23 - + + 2.1.4 + 8.0.23 + - - - - org.springframework.boot - spring-boot-starter-parent - ${spring-boot.version} - pom - import - - - + + + + org.springframework.boot + spring-boot-starter-parent + ${spring-boot.version} + pom + import + + + - + - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-test - test - + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + test + - - - org.springframework.boot - spring-boot-starter-freemarker - + + + org.springframework.boot + spring-boot-starter-freemarker + - - - org.springframework.boot - spring-boot-starter-mail - + + + org.springframework.boot + spring-boot-starter-mail + - - - org.springframework.boot - spring-boot-starter-actuator - + + + org.springframework.boot + spring-boot-starter-actuator + - - - org.mybatis.spring.boot - mybatis-spring-boot-starter - ${mybatis-spring-boot-starter.version} - - - - mysql - mysql-connector-java - ${mysql-connector-java.version} - + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + ${mybatis-spring-boot-starter.version} + + + + mysql + mysql-connector-java + ${mysql-connector-java.version} + de.codecentric spring-boot-admin-starter-client - - - com.xuxueli - xxl-job-core - + + + com.xuxueli + xxl-job-core + - + - + ${project.artifactId} - - - org.springframework.boot - spring-boot-maven-plugin - ${spring-boot.version} - - - - repackage - - - - - - org.apache.maven.plugins - maven-resources-plugin - 2.6 - - - ttf - jks - woff - woff2 - - - - - - com.spotify - docker-maven-plugin - ${docker.plugin.version} - - - ${docker.namespace}/${project.artifactId}:${project.version} - ${project.basedir} - ${docker.registry.host} - ${docker.registry.url} - ${docker.registry.url} - - - / - ${project.build.directory} - ${project.build.finalName}.jar - - - - - - + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + repackage + + + + + + + com.spotify + docker-maven-plugin + ${docker.plugin.version} + + + ${docker.namespace}/${project.artifactId}:${project.version} + ${project.basedir} + ${docker.registry.host} + ${docker.registry.url} + ${docker.registry.url} + + + / + ${project.build.directory} + ${project.build.finalName}.jar + + + + + + diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/XxlJobAdminApplication.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/XxlJobAdminApplication.java index fce10a81a..95ec1c412 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/XxlJobAdminApplication.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/XxlJobAdminApplication.java @@ -9,8 +9,8 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class XxlJobAdminApplication { - public static void main(String[] args) { + public static void main(String[] args) { SpringApplication.run(XxlJobAdminApplication.class, args); - } + } -} \ No newline at end of file +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/IndexController.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/IndexController.java index eb63f0bd4..8d5495c53 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/IndexController.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/IndexController.java @@ -24,73 +24,74 @@ import java.util.Map; /** * index controller + * * @author xuxueli 2015-12-19 16:13:16 */ @Controller public class IndexController { - @Resource - private XxlJobService xxlJobService; - @Resource - private LoginService loginService; + @Resource + private XxlJobService xxlJobService; + @Resource + private LoginService loginService; - @RequestMapping("/") - public String index(Model model) { + @RequestMapping("/") + public String index(Model model) { - Map dashboardMap = xxlJobService.dashboardInfo(); - model.addAllAttributes(dashboardMap); + Map dashboardMap = xxlJobService.dashboardInfo(); + model.addAllAttributes(dashboardMap); - return "index"; - } + return "index"; + } @RequestMapping("/chartInfo") - @ResponseBody - public ReturnT> chartInfo(Date startDate, Date endDate) { + @ResponseBody + public ReturnT> chartInfo(Date startDate, Date endDate) { ReturnT> chartInfo = xxlJobService.chartInfo(startDate, endDate); return chartInfo; } - - @RequestMapping("/toLogin") - @PermissionLimit(limit=false) - public ModelAndView toLogin(HttpServletRequest request, HttpServletResponse response,ModelAndView modelAndView) { - if (loginService.ifLogin(request, response) != null) { - modelAndView.setView(new RedirectView("/",true,false)); - return modelAndView; - } - return new ModelAndView("login"); - } - - @RequestMapping(value="login", method=RequestMethod.POST) - @ResponseBody - @PermissionLimit(limit=false) - public ReturnT loginDo(HttpServletRequest request, HttpServletResponse response, String userName, String password, String ifRemember){ - boolean ifRem = (ifRemember!=null && ifRemember.trim().length()>0 && "on".equals(ifRemember))?true:false; - return loginService.login(request, response, userName, password, ifRem); - } - - @RequestMapping(value="logout", method=RequestMethod.POST) - @ResponseBody - @PermissionLimit(limit=false) - public ReturnT logout(HttpServletRequest request, HttpServletResponse response){ - return loginService.logout(request, response); - } - - @RequestMapping("/help") - public String help() { - /*if (!PermissionInterceptor.ifLogin(request)) { - return "redirect:/toLogin"; - }*/ + @RequestMapping("/toLogin") + @PermissionLimit(limit = false) + public ModelAndView toLogin(HttpServletRequest request, HttpServletResponse response, ModelAndView modelAndView) { + if (loginService.ifLogin(request, response) != null) { + modelAndView.setView(new RedirectView("/" , true, false)); + return modelAndView; + } + return new ModelAndView("login"); + } - return "help"; - } + @RequestMapping(value = "login" , method = RequestMethod.POST) + @ResponseBody + @PermissionLimit(limit = false) + public ReturnT loginDo(HttpServletRequest request, HttpServletResponse response, String userName, String password, String ifRemember) { + boolean ifRem = (ifRemember != null && ifRemember.trim().length() > 0 && "on".equals(ifRemember)) ? true : false; + return loginService.login(request, response, userName, password, ifRem); + } + + @RequestMapping(value = "logout" , method = RequestMethod.POST) + @ResponseBody + @PermissionLimit(limit = false) + public ReturnT logout(HttpServletRequest request, HttpServletResponse response) { + return loginService.logout(request, response); + } + + @RequestMapping("/help") + public String help() { + + /*if (!PermissionInterceptor.ifLogin(request)) { + return "redirect:/toLogin"; + }*/ + + return "help"; + } + + @InitBinder + public void initBinder(WebDataBinder binder) { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + dateFormat.setLenient(false); + binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true)); + } - @InitBinder - public void initBinder(WebDataBinder binder) { - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - dateFormat.setLenient(false); - binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true)); - } - } diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobCodeController.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobCodeController.java index fe4a0e848..0c8384f0f 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobCodeController.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobCodeController.java @@ -19,78 +19,79 @@ import java.util.List; /** * job code controller + * * @author xuxueli 2015-12-19 16:13:16 */ @Controller @RequestMapping("/jobcode") public class JobCodeController { - - @Resource - private XxlJobInfoDao xxlJobInfoDao; - @Resource - private XxlJobLogGlueDao xxlJobLogGlueDao; - @RequestMapping - public String index(HttpServletRequest request, Model model, int jobId) { - XxlJobInfo jobInfo = xxlJobInfoDao.loadById(jobId); - List jobLogGlues = xxlJobLogGlueDao.findByJobId(jobId); + @Resource + private XxlJobInfoDao xxlJobInfoDao; + @Resource + private XxlJobLogGlueDao xxlJobLogGlueDao; - if (jobInfo == null) { - throw new RuntimeException(I18nUtil.getString("jobinfo_glue_jobid_unvalid")); - } - if (GlueTypeEnum.BEAN == GlueTypeEnum.match(jobInfo.getGlueType())) { - throw new RuntimeException(I18nUtil.getString("jobinfo_glue_gluetype_unvalid")); - } + @RequestMapping + public String index(HttpServletRequest request, Model model, int jobId) { + XxlJobInfo jobInfo = xxlJobInfoDao.loadById(jobId); + List jobLogGlues = xxlJobLogGlueDao.findByJobId(jobId); - // valid permission - JobInfoController.validPermission(request, jobInfo.getJobGroup()); + if (jobInfo == null) { + throw new RuntimeException(I18nUtil.getString("jobinfo_glue_jobid_unvalid")); + } + if (GlueTypeEnum.BEAN == GlueTypeEnum.match(jobInfo.getGlueType())) { + throw new RuntimeException(I18nUtil.getString("jobinfo_glue_gluetype_unvalid")); + } - // Glue类型-字典 - model.addAttribute("GlueTypeEnum", GlueTypeEnum.values()); + // valid permission + JobInfoController.validPermission(request, jobInfo.getJobGroup()); - model.addAttribute("jobInfo", jobInfo); - model.addAttribute("jobLogGlues", jobLogGlues); - return "jobcode/jobcode.index"; - } - - @RequestMapping("/save") - @ResponseBody - public ReturnT save(Model model, int id, String glueSource, String glueRemark) { - // valid - if (glueRemark==null) { - return new ReturnT(500, (I18nUtil.getString("system_please_input") + I18nUtil.getString("jobinfo_glue_remark")) ); - } - if (glueRemark.length()<4 || glueRemark.length()>100) { - return new ReturnT(500, I18nUtil.getString("jobinfo_glue_remark_limit")); - } - XxlJobInfo exists_jobInfo = xxlJobInfoDao.loadById(id); - if (exists_jobInfo == null) { - return new ReturnT(500, I18nUtil.getString("jobinfo_glue_jobid_unvalid")); - } - - // update new code - exists_jobInfo.setGlueSource(glueSource); - exists_jobInfo.setGlueRemark(glueRemark); - exists_jobInfo.setGlueUpdatetime(new Date()); + // Glue类型-字典 + model.addAttribute("GlueTypeEnum" , GlueTypeEnum.values()); - exists_jobInfo.setUpdateTime(new Date()); - xxlJobInfoDao.update(exists_jobInfo); + model.addAttribute("jobInfo" , jobInfo); + model.addAttribute("jobLogGlues" , jobLogGlues); + return "jobcode/jobcode.index"; + } - // log old code - XxlJobLogGlue xxlJobLogGlue = new XxlJobLogGlue(); - xxlJobLogGlue.setJobId(exists_jobInfo.getId()); - xxlJobLogGlue.setGlueType(exists_jobInfo.getGlueType()); - xxlJobLogGlue.setGlueSource(glueSource); - xxlJobLogGlue.setGlueRemark(glueRemark); + @RequestMapping("/save") + @ResponseBody + public ReturnT save(Model model, int id, String glueSource, String glueRemark) { + // valid + if (glueRemark == null) { + return new ReturnT(500, (I18nUtil.getString("system_please_input") + I18nUtil.getString("jobinfo_glue_remark"))); + } + if (glueRemark.length() < 4 || glueRemark.length() > 100) { + return new ReturnT(500, I18nUtil.getString("jobinfo_glue_remark_limit")); + } + XxlJobInfo exists_jobInfo = xxlJobInfoDao.loadById(id); + if (exists_jobInfo == null) { + return new ReturnT(500, I18nUtil.getString("jobinfo_glue_jobid_unvalid")); + } - xxlJobLogGlue.setAddTime(new Date()); - xxlJobLogGlue.setUpdateTime(new Date()); - xxlJobLogGlueDao.save(xxlJobLogGlue); + // update new code + exists_jobInfo.setGlueSource(glueSource); + exists_jobInfo.setGlueRemark(glueRemark); + exists_jobInfo.setGlueUpdatetime(new Date()); - // remove code backup more than 30 - xxlJobLogGlueDao.removeOld(exists_jobInfo.getId(), 30); + exists_jobInfo.setUpdateTime(new Date()); + xxlJobInfoDao.update(exists_jobInfo); + + // log old code + XxlJobLogGlue xxlJobLogGlue = new XxlJobLogGlue(); + xxlJobLogGlue.setJobId(exists_jobInfo.getId()); + xxlJobLogGlue.setGlueType(exists_jobInfo.getGlueType()); + xxlJobLogGlue.setGlueSource(glueSource); + xxlJobLogGlue.setGlueRemark(glueRemark); + + xxlJobLogGlue.setAddTime(new Date()); + xxlJobLogGlue.setUpdateTime(new Date()); + xxlJobLogGlueDao.save(xxlJobLogGlue); + + // remove code backup more than 30 + xxlJobLogGlueDao.removeOld(exists_jobInfo.getId(), 30); + + return ReturnT.SUCCESS; + } - return ReturnT.SUCCESS; - } - } diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java index 4bb4b90a9..4a4620092 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java @@ -20,178 +20,179 @@ import java.util.*; /** * job group controller + * * @author xuxueli 2016-10-02 20:52:56 */ @Controller @RequestMapping("/jobgroup") public class JobGroupController { - @Resource - public XxlJobInfoDao xxlJobInfoDao; - @Resource - public XxlJobGroupDao xxlJobGroupDao; - @Resource - private XxlJobRegistryDao xxlJobRegistryDao; + @Resource + public XxlJobInfoDao xxlJobInfoDao; + @Resource + public XxlJobGroupDao xxlJobGroupDao; + @Resource + private XxlJobRegistryDao xxlJobRegistryDao; - @RequestMapping - public String index(Model model) { - return "jobgroup/jobgroup.index"; - } + @RequestMapping + public String index(Model model) { + return "jobgroup/jobgroup.index"; + } - @RequestMapping("/pageList") - @ResponseBody - public Map pageList(HttpServletRequest request, - @RequestParam(required = false, defaultValue = "0") int start, - @RequestParam(required = false, defaultValue = "10") int length, - String appname, String title) { + @RequestMapping("/pageList") + @ResponseBody + public Map pageList(HttpServletRequest request, + @RequestParam(required = false, defaultValue = "0") int start, + @RequestParam(required = false, defaultValue = "10") int length, + String appname, String title) { - // page query - List list = xxlJobGroupDao.pageList(start, length, appname, title); - int list_count = xxlJobGroupDao.pageListCount(start, length, appname, title); + // page query + List list = xxlJobGroupDao.pageList(start, length, appname, title); + int list_count = xxlJobGroupDao.pageListCount(start, length, appname, title); - // package result - Map maps = new HashMap(); - maps.put("recordsTotal", list_count); // 总记录数 - maps.put("recordsFiltered", list_count); // 过滤后的总记录数 - maps.put("data", list); // 分页列表 - return maps; - } + // package result + Map maps = new HashMap(); + maps.put("recordsTotal" , list_count); // 总记录数 + maps.put("recordsFiltered" , list_count); // 过滤后的总记录数 + maps.put("data" , list); // 分页列表 + return maps; + } - @RequestMapping("/save") - @ResponseBody - public ReturnT save(XxlJobGroup xxlJobGroup){ + @RequestMapping("/save") + @ResponseBody + public ReturnT save(XxlJobGroup xxlJobGroup) { - // valid - if (xxlJobGroup.getAppname()==null || xxlJobGroup.getAppname().trim().length()==0) { - return new ReturnT(500, (I18nUtil.getString("system_please_input")+"AppName") ); - } - if (xxlJobGroup.getAppname().length()<4 || xxlJobGroup.getAppname().length()>64) { - return new ReturnT(500, I18nUtil.getString("jobgroup_field_appname_length") ); - } - if (xxlJobGroup.getAppname().contains(">") || xxlJobGroup.getAppname().contains("<")) { - return new ReturnT(500, "AppName"+I18nUtil.getString("system_unvalid") ); - } - if (xxlJobGroup.getTitle()==null || xxlJobGroup.getTitle().trim().length()==0) { - return new ReturnT(500, (I18nUtil.getString("system_please_input") + I18nUtil.getString("jobgroup_field_title")) ); - } - if (xxlJobGroup.getTitle().contains(">") || xxlJobGroup.getTitle().contains("<")) { - return new ReturnT(500, I18nUtil.getString("jobgroup_field_title")+I18nUtil.getString("system_unvalid") ); - } - if (xxlJobGroup.getAddressType()!=0) { - if (xxlJobGroup.getAddressList()==null || xxlJobGroup.getAddressList().trim().length()==0) { - return new ReturnT(500, I18nUtil.getString("jobgroup_field_addressType_limit") ); - } - if (xxlJobGroup.getAddressList().contains(">") || xxlJobGroup.getAddressList().contains("<")) { - return new ReturnT(500, I18nUtil.getString("jobgroup_field_registryList")+I18nUtil.getString("system_unvalid") ); - } + // valid + if (xxlJobGroup.getAppname() == null || xxlJobGroup.getAppname().trim().length() == 0) { + return new ReturnT(500, (I18nUtil.getString("system_please_input") + "AppName")); + } + if (xxlJobGroup.getAppname().length() < 4 || xxlJobGroup.getAppname().length() > 64) { + return new ReturnT(500, I18nUtil.getString("jobgroup_field_appname_length")); + } + if (xxlJobGroup.getAppname().contains(">") || xxlJobGroup.getAppname().contains("<")) { + return new ReturnT(500, "AppName" + I18nUtil.getString("system_unvalid")); + } + if (xxlJobGroup.getTitle() == null || xxlJobGroup.getTitle().trim().length() == 0) { + return new ReturnT(500, (I18nUtil.getString("system_please_input") + I18nUtil.getString("jobgroup_field_title"))); + } + if (xxlJobGroup.getTitle().contains(">") || xxlJobGroup.getTitle().contains("<")) { + return new ReturnT(500, I18nUtil.getString("jobgroup_field_title") + I18nUtil.getString("system_unvalid")); + } + if (xxlJobGroup.getAddressType() != 0) { + if (xxlJobGroup.getAddressList() == null || xxlJobGroup.getAddressList().trim().length() == 0) { + return new ReturnT(500, I18nUtil.getString("jobgroup_field_addressType_limit")); + } + if (xxlJobGroup.getAddressList().contains(">") || xxlJobGroup.getAddressList().contains("<")) { + return new ReturnT(500, I18nUtil.getString("jobgroup_field_registryList") + I18nUtil.getString("system_unvalid")); + } - String[] addresss = xxlJobGroup.getAddressList().split(","); - for (String item: addresss) { - if (item==null || item.trim().length()==0) { - return new ReturnT(500, I18nUtil.getString("jobgroup_field_registryList_unvalid") ); - } - } - } + String[] addresss = xxlJobGroup.getAddressList().split(","); + for (String item : addresss) { + if (item == null || item.trim().length() == 0) { + return new ReturnT(500, I18nUtil.getString("jobgroup_field_registryList_unvalid")); + } + } + } - // process - xxlJobGroup.setUpdateTime(new Date()); + // process + xxlJobGroup.setUpdateTime(new Date()); - int ret = xxlJobGroupDao.save(xxlJobGroup); - return (ret>0)?ReturnT.SUCCESS:ReturnT.FAIL; - } + int ret = xxlJobGroupDao.save(xxlJobGroup); + return (ret > 0) ? ReturnT.SUCCESS : ReturnT.FAIL; + } - @RequestMapping("/update") - @ResponseBody - public ReturnT update(XxlJobGroup xxlJobGroup){ - // valid - if (xxlJobGroup.getAppname()==null || xxlJobGroup.getAppname().trim().length()==0) { - return new ReturnT(500, (I18nUtil.getString("system_please_input")+"AppName") ); - } - if (xxlJobGroup.getAppname().length()<4 || xxlJobGroup.getAppname().length()>64) { - return new ReturnT(500, I18nUtil.getString("jobgroup_field_appname_length") ); - } - if (xxlJobGroup.getTitle()==null || xxlJobGroup.getTitle().trim().length()==0) { - return new ReturnT(500, (I18nUtil.getString("system_please_input") + I18nUtil.getString("jobgroup_field_title")) ); - } - if (xxlJobGroup.getAddressType() == 0) { - // 0=自动注册 - List registryList = findRegistryByAppName(xxlJobGroup.getAppname()); - String addressListStr = null; - if (registryList!=null && !registryList.isEmpty()) { - Collections.sort(registryList); - addressListStr = ""; - for (String item:registryList) { - addressListStr += item + ","; - } - addressListStr = addressListStr.substring(0, addressListStr.length()-1); - } - xxlJobGroup.setAddressList(addressListStr); - } else { - // 1=手动录入 - if (xxlJobGroup.getAddressList()==null || xxlJobGroup.getAddressList().trim().length()==0) { - return new ReturnT(500, I18nUtil.getString("jobgroup_field_addressType_limit") ); - } - String[] addresss = xxlJobGroup.getAddressList().split(","); - for (String item: addresss) { - if (item==null || item.trim().length()==0) { - return new ReturnT(500, I18nUtil.getString("jobgroup_field_registryList_unvalid") ); - } - } - } + @RequestMapping("/update") + @ResponseBody + public ReturnT update(XxlJobGroup xxlJobGroup) { + // valid + if (xxlJobGroup.getAppname() == null || xxlJobGroup.getAppname().trim().length() == 0) { + return new ReturnT(500, (I18nUtil.getString("system_please_input") + "AppName")); + } + if (xxlJobGroup.getAppname().length() < 4 || xxlJobGroup.getAppname().length() > 64) { + return new ReturnT(500, I18nUtil.getString("jobgroup_field_appname_length")); + } + if (xxlJobGroup.getTitle() == null || xxlJobGroup.getTitle().trim().length() == 0) { + return new ReturnT(500, (I18nUtil.getString("system_please_input") + I18nUtil.getString("jobgroup_field_title"))); + } + if (xxlJobGroup.getAddressType() == 0) { + // 0=自动注册 + List registryList = findRegistryByAppName(xxlJobGroup.getAppname()); + String addressListStr = null; + if (registryList != null && !registryList.isEmpty()) { + Collections.sort(registryList); + addressListStr = ""; + for (String item : registryList) { + addressListStr += item + ","; + } + addressListStr = addressListStr.substring(0, addressListStr.length() - 1); + } + xxlJobGroup.setAddressList(addressListStr); + } else { + // 1=手动录入 + if (xxlJobGroup.getAddressList() == null || xxlJobGroup.getAddressList().trim().length() == 0) { + return new ReturnT(500, I18nUtil.getString("jobgroup_field_addressType_limit")); + } + String[] addresss = xxlJobGroup.getAddressList().split(","); + for (String item : addresss) { + if (item == null || item.trim().length() == 0) { + return new ReturnT(500, I18nUtil.getString("jobgroup_field_registryList_unvalid")); + } + } + } - // process - xxlJobGroup.setUpdateTime(new Date()); + // process + xxlJobGroup.setUpdateTime(new Date()); - int ret = xxlJobGroupDao.update(xxlJobGroup); - return (ret>0)?ReturnT.SUCCESS:ReturnT.FAIL; - } + int ret = xxlJobGroupDao.update(xxlJobGroup); + return (ret > 0) ? ReturnT.SUCCESS : ReturnT.FAIL; + } - private List findRegistryByAppName(String appnameParam){ - HashMap> appAddressMap = new HashMap>(); - List list = xxlJobRegistryDao.findAll(RegistryConfig.DEAD_TIMEOUT, new Date()); - if (list != null) { - for (XxlJobRegistry item: list) { - if (RegistryConfig.RegistType.EXECUTOR.name().equals(item.getRegistryGroup())) { - String appname = item.getRegistryKey(); - List registryList = appAddressMap.get(appname); - if (registryList == null) { - registryList = new ArrayList(); - } + private List findRegistryByAppName(String appnameParam) { + HashMap> appAddressMap = new HashMap>(); + List list = xxlJobRegistryDao.findAll(RegistryConfig.DEAD_TIMEOUT, new Date()); + if (list != null) { + for (XxlJobRegistry item : list) { + if (RegistryConfig.RegistType.EXECUTOR.name().equals(item.getRegistryGroup())) { + String appname = item.getRegistryKey(); + List registryList = appAddressMap.get(appname); + if (registryList == null) { + registryList = new ArrayList(); + } - if (!registryList.contains(item.getRegistryValue())) { - registryList.add(item.getRegistryValue()); - } - appAddressMap.put(appname, registryList); - } - } - } - return appAddressMap.get(appnameParam); - } + if (!registryList.contains(item.getRegistryValue())) { + registryList.add(item.getRegistryValue()); + } + appAddressMap.put(appname, registryList); + } + } + } + return appAddressMap.get(appnameParam); + } - @RequestMapping("/remove") - @ResponseBody - public ReturnT remove(int id){ + @RequestMapping("/remove") + @ResponseBody + public ReturnT remove(int id) { - // valid - int count = xxlJobInfoDao.pageListCount(0, 10, id, -1, null, null, null); - if (count > 0) { - return new ReturnT(500, I18nUtil.getString("jobgroup_del_limit_0") ); - } + // valid + int count = xxlJobInfoDao.pageListCount(0, 10, id, -1, null, null, null); + if (count > 0) { + return new ReturnT(500, I18nUtil.getString("jobgroup_del_limit_0")); + } - List allList = xxlJobGroupDao.findAll(); - if (allList.size() == 1) { - return new ReturnT(500, I18nUtil.getString("jobgroup_del_limit_1") ); - } + List allList = xxlJobGroupDao.findAll(); + if (allList.size() == 1) { + return new ReturnT(500, I18nUtil.getString("jobgroup_del_limit_1")); + } - int ret = xxlJobGroupDao.remove(id); - return (ret>0)?ReturnT.SUCCESS:ReturnT.FAIL; - } + int ret = xxlJobGroupDao.remove(id); + return (ret > 0) ? ReturnT.SUCCESS : ReturnT.FAIL; + } - @RequestMapping("/loadById") - @ResponseBody - public ReturnT loadById(int id){ - XxlJobGroup jobGroup = xxlJobGroupDao.load(id); - return jobGroup!=null?new ReturnT(jobGroup):new ReturnT(ReturnT.FAIL_CODE, null); - } + @RequestMapping("/loadById") + @ResponseBody + public ReturnT loadById(int id) { + XxlJobGroup jobGroup = xxlJobGroupDao.load(id); + return jobGroup != null ? new ReturnT(jobGroup) : new ReturnT(ReturnT.FAIL_CODE, null); + } } diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java index ea314b323..0f52bef73 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java @@ -1,6 +1,5 @@ package com.xxl.job.admin.controller; -import com.xxl.job.admin.core.cron.CronExpression; import com.xxl.job.admin.core.exception.XxlJobException; import com.xxl.job.admin.core.model.XxlJobGroup; import com.xxl.job.admin.core.model.XxlJobInfo; @@ -29,152 +28,153 @@ import org.springframework.web.bind.annotation.ResponseBody; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; -import java.text.ParseException; import java.util.*; /** * index controller + * * @author xuxueli 2015-12-19 16:13:16 */ @Controller @RequestMapping("/jobinfo") public class JobInfoController { - private static Logger logger = LoggerFactory.getLogger(JobInfoController.class); + private static Logger logger = LoggerFactory.getLogger(JobInfoController.class); - @Resource - private XxlJobGroupDao xxlJobGroupDao; - @Resource - private XxlJobService xxlJobService; - - @RequestMapping - public String index(HttpServletRequest request, Model model, @RequestParam(required = false, defaultValue = "-1") int jobGroup) { + @Resource + private XxlJobGroupDao xxlJobGroupDao; + @Resource + private XxlJobService xxlJobService; - // 枚举-字典 - model.addAttribute("ExecutorRouteStrategyEnum", ExecutorRouteStrategyEnum.values()); // 路由策略-列表 - model.addAttribute("GlueTypeEnum", GlueTypeEnum.values()); // Glue类型-字典 - model.addAttribute("ExecutorBlockStrategyEnum", ExecutorBlockStrategyEnum.values()); // 阻塞处理策略-字典 - model.addAttribute("ScheduleTypeEnum", ScheduleTypeEnum.values()); // 调度类型 - model.addAttribute("MisfireStrategyEnum", MisfireStrategyEnum.values()); // 调度过期策略 + @RequestMapping + public String index(HttpServletRequest request, Model model, @RequestParam(required = false, defaultValue = "-1") int jobGroup) { - // 执行器列表 - List jobGroupList_all = xxlJobGroupDao.findAll(); + // 枚举-字典 + model.addAttribute("ExecutorRouteStrategyEnum" , ExecutorRouteStrategyEnum.values()); // 路由策略-列表 + model.addAttribute("GlueTypeEnum" , GlueTypeEnum.values()); // Glue类型-字典 + model.addAttribute("ExecutorBlockStrategyEnum" , ExecutorBlockStrategyEnum.values()); // 阻塞处理策略-字典 + model.addAttribute("ScheduleTypeEnum" , ScheduleTypeEnum.values()); // 调度类型 + model.addAttribute("MisfireStrategyEnum" , MisfireStrategyEnum.values()); // 调度过期策略 - // filter group - List jobGroupList = filterJobGroupByRole(request, jobGroupList_all); - if (jobGroupList==null || jobGroupList.size()==0) { - throw new XxlJobException(I18nUtil.getString("jobgroup_empty")); - } + // 执行器列表 + List jobGroupList_all = xxlJobGroupDao.findAll(); - model.addAttribute("JobGroupList", jobGroupList); - model.addAttribute("jobGroup", jobGroup); + // filter group + List jobGroupList = filterJobGroupByRole(request, jobGroupList_all); + if (jobGroupList == null || jobGroupList.size() == 0) { + throw new XxlJobException(I18nUtil.getString("jobgroup_empty")); + } - return "jobinfo/jobinfo.index"; - } + model.addAttribute("JobGroupList" , jobGroupList); + model.addAttribute("jobGroup" , jobGroup); - public static List filterJobGroupByRole(HttpServletRequest request, List jobGroupList_all){ - List jobGroupList = new ArrayList<>(); - if (jobGroupList_all!=null && jobGroupList_all.size()>0) { - XxlJobUser loginUser = (XxlJobUser) request.getAttribute(LoginService.LOGIN_IDENTITY_KEY); - if (loginUser.getRole() == 1) { - jobGroupList = jobGroupList_all; - } else { - List groupIdStrs = new ArrayList<>(); - if (loginUser.getPermission()!=null && loginUser.getPermission().trim().length()>0) { - groupIdStrs = Arrays.asList(loginUser.getPermission().trim().split(",")); - } - for (XxlJobGroup groupItem:jobGroupList_all) { - if (groupIdStrs.contains(String.valueOf(groupItem.getId()))) { - jobGroupList.add(groupItem); - } - } - } - } - return jobGroupList; - } - public static void validPermission(HttpServletRequest request, int jobGroup) { - XxlJobUser loginUser = (XxlJobUser) request.getAttribute(LoginService.LOGIN_IDENTITY_KEY); - if (!loginUser.validPermission(jobGroup)) { - throw new RuntimeException(I18nUtil.getString("system_permission_limit") + "[username="+ loginUser.getUsername() +"]"); - } - } - - @RequestMapping("/pageList") - @ResponseBody - public Map pageList(@RequestParam(required = false, defaultValue = "0") int start, - @RequestParam(required = false, defaultValue = "10") int length, - int jobGroup, int triggerStatus, String jobDesc, String executorHandler, String author) { - - return xxlJobService.pageList(start, length, jobGroup, triggerStatus, jobDesc, executorHandler, author); - } - - @RequestMapping("/add") - @ResponseBody - public ReturnT add(XxlJobInfo jobInfo) { - return xxlJobService.add(jobInfo); - } - - @RequestMapping("/update") - @ResponseBody - public ReturnT update(XxlJobInfo jobInfo) { - return xxlJobService.update(jobInfo); - } - - @RequestMapping("/remove") - @ResponseBody - public ReturnT remove(int id) { - return xxlJobService.remove(id); - } - - @RequestMapping("/stop") - @ResponseBody - public ReturnT pause(int id) { - return xxlJobService.stop(id); - } - - @RequestMapping("/start") - @ResponseBody - public ReturnT start(int id) { - return xxlJobService.start(id); - } - - @RequestMapping("/trigger") - @ResponseBody - //@PermissionLimit(limit = false) - public ReturnT triggerJob(int id, String executorParam, String addressList) { - // force cover job param - if (executorParam == null) { - executorParam = ""; - } + return "jobinfo/jobinfo.index"; + } - JobTriggerPoolHelper.trigger(id, TriggerTypeEnum.MANUAL, -1, null, executorParam, addressList); - return ReturnT.SUCCESS; - } + public static List filterJobGroupByRole(HttpServletRequest request, List jobGroupList_all) { + List jobGroupList = new ArrayList<>(); + if (jobGroupList_all != null && jobGroupList_all.size() > 0) { + XxlJobUser loginUser = (XxlJobUser) request.getAttribute(LoginService.LOGIN_IDENTITY_KEY); + if (loginUser.getRole() == 1) { + jobGroupList = jobGroupList_all; + } else { + List groupIdStrs = new ArrayList<>(); + if (loginUser.getPermission() != null && loginUser.getPermission().trim().length() > 0) { + groupIdStrs = Arrays.asList(loginUser.getPermission().trim().split(",")); + } + for (XxlJobGroup groupItem : jobGroupList_all) { + if (groupIdStrs.contains(String.valueOf(groupItem.getId()))) { + jobGroupList.add(groupItem); + } + } + } + } + return jobGroupList; + } - @RequestMapping("/nextTriggerTime") - @ResponseBody - public ReturnT> nextTriggerTime(String scheduleType, String scheduleConf) { + public static void validPermission(HttpServletRequest request, int jobGroup) { + XxlJobUser loginUser = (XxlJobUser) request.getAttribute(LoginService.LOGIN_IDENTITY_KEY); + if (!loginUser.validPermission(jobGroup)) { + throw new RuntimeException(I18nUtil.getString("system_permission_limit") + "[username=" + loginUser.getUsername() + "]"); + } + } - XxlJobInfo paramXxlJobInfo = new XxlJobInfo(); - paramXxlJobInfo.setScheduleType(scheduleType); - paramXxlJobInfo.setScheduleConf(scheduleConf); + @RequestMapping("/pageList") + @ResponseBody + public Map pageList(@RequestParam(required = false, defaultValue = "0") int start, + @RequestParam(required = false, defaultValue = "10") int length, + int jobGroup, int triggerStatus, String jobDesc, String executorHandler, String author) { - List result = new ArrayList<>(); - try { - Date lastTime = new Date(); - for (int i = 0; i < 5; i++) { - lastTime = JobScheduleHelper.generateNextValidTime(paramXxlJobInfo, lastTime); - if (lastTime != null) { - result.add(DateUtil.formatDateTime(lastTime)); - } else { - break; - } - } - } catch (Exception e) { - logger.error(e.getMessage(), e); - return new ReturnT>(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type")+I18nUtil.getString("system_unvalid")) + e.getMessage()); - } - return new ReturnT>(result); + return xxlJobService.pageList(start, length, jobGroup, triggerStatus, jobDesc, executorHandler, author); + } + + @RequestMapping("/add") + @ResponseBody + public ReturnT add(XxlJobInfo jobInfo) { + return xxlJobService.add(jobInfo); + } + + @RequestMapping("/update") + @ResponseBody + public ReturnT update(XxlJobInfo jobInfo) { + return xxlJobService.update(jobInfo); + } + + @RequestMapping("/remove") + @ResponseBody + public ReturnT remove(int id) { + return xxlJobService.remove(id); + } + + @RequestMapping("/stop") + @ResponseBody + public ReturnT pause(int id) { + return xxlJobService.stop(id); + } + + @RequestMapping("/start") + @ResponseBody + public ReturnT start(int id) { + return xxlJobService.start(id); + } + + @RequestMapping("/trigger") + @ResponseBody + //@PermissionLimit(limit = false) + public ReturnT triggerJob(int id, String executorParam, String addressList) { + // force cover job param + if (executorParam == null) { + executorParam = ""; + } + + JobTriggerPoolHelper.trigger(id, TriggerTypeEnum.MANUAL, -1, null, executorParam, addressList); + return ReturnT.SUCCESS; + } + + @RequestMapping("/nextTriggerTime") + @ResponseBody + public ReturnT> nextTriggerTime(String scheduleType, String scheduleConf) { + + XxlJobInfo paramXxlJobInfo = new XxlJobInfo(); + paramXxlJobInfo.setScheduleType(scheduleType); + paramXxlJobInfo.setScheduleConf(scheduleConf); + + List result = new ArrayList<>(); + try { + Date lastTime = new Date(); + for (int i = 0; i < 5; i++) { + lastTime = JobScheduleHelper.generateNextValidTime(paramXxlJobInfo, lastTime); + if (lastTime != null) { + result.add(DateUtil.formatDateTime(lastTime)); + } else { + break; + } + } + } catch (Exception e) { + logger.error(e.getMessage(), e); + return new ReturnT>(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type") + I18nUtil.getString("system_unvalid")) + e.getMessage()); + } + return new ReturnT>(result); + + } - } - } diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java index c64049d58..141b539c1 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java @@ -1,7 +1,7 @@ package com.xxl.job.admin.controller; -import com.xxl.job.admin.core.exception.XxlJobException; import com.xxl.job.admin.core.complete.XxlJobCompleter; +import com.xxl.job.admin.core.exception.XxlJobException; import com.xxl.job.admin.core.model.XxlJobGroup; import com.xxl.job.admin.core.model.XxlJobInfo; import com.xxl.job.admin.core.model.XxlJobLog; @@ -33,201 +33,202 @@ import java.util.Map; /** * index controller + * * @author xuxueli 2015-12-19 16:13:16 */ @Controller @RequestMapping("/joblog") public class JobLogController { - private static Logger logger = LoggerFactory.getLogger(JobLogController.class); + private static Logger logger = LoggerFactory.getLogger(JobLogController.class); - @Resource - private XxlJobGroupDao xxlJobGroupDao; - @Resource - public XxlJobInfoDao xxlJobInfoDao; - @Resource - public XxlJobLogDao xxlJobLogDao; + @Resource + private XxlJobGroupDao xxlJobGroupDao; + @Resource + public XxlJobInfoDao xxlJobInfoDao; + @Resource + public XxlJobLogDao xxlJobLogDao; - @RequestMapping - public String index(HttpServletRequest request, Model model, @RequestParam(required = false, defaultValue = "0") Integer jobId) { + @RequestMapping + public String index(HttpServletRequest request, Model model, @RequestParam(required = false, defaultValue = "0") Integer jobId) { - // 执行器列表 - List jobGroupList_all = xxlJobGroupDao.findAll(); + // 执行器列表 + List jobGroupList_all = xxlJobGroupDao.findAll(); - // filter group - List jobGroupList = JobInfoController.filterJobGroupByRole(request, jobGroupList_all); - if (jobGroupList==null || jobGroupList.size()==0) { - throw new XxlJobException(I18nUtil.getString("jobgroup_empty")); - } + // filter group + List jobGroupList = JobInfoController.filterJobGroupByRole(request, jobGroupList_all); + if (jobGroupList == null || jobGroupList.size() == 0) { + throw new XxlJobException(I18nUtil.getString("jobgroup_empty")); + } - model.addAttribute("JobGroupList", jobGroupList); + model.addAttribute("JobGroupList" , jobGroupList); - // 任务 - if (jobId > 0) { - XxlJobInfo jobInfo = xxlJobInfoDao.loadById(jobId); - if (jobInfo == null) { - throw new RuntimeException(I18nUtil.getString("jobinfo_field_id") + I18nUtil.getString("system_unvalid")); - } + // 任务 + if (jobId > 0) { + XxlJobInfo jobInfo = xxlJobInfoDao.loadById(jobId); + if (jobInfo == null) { + throw new RuntimeException(I18nUtil.getString("jobinfo_field_id") + I18nUtil.getString("system_unvalid")); + } - model.addAttribute("jobInfo", jobInfo); + model.addAttribute("jobInfo" , jobInfo); - // valid permission - JobInfoController.validPermission(request, jobInfo.getJobGroup()); - } + // valid permission + JobInfoController.validPermission(request, jobInfo.getJobGroup()); + } - return "joblog/joblog.index"; - } + return "joblog/joblog.index"; + } - @RequestMapping("/getJobsByGroup") - @ResponseBody - public ReturnT> getJobsByGroup(int jobGroup){ - List list = xxlJobInfoDao.getJobsByGroup(jobGroup); - return new ReturnT>(list); - } - - @RequestMapping("/pageList") - @ResponseBody - public Map pageList(HttpServletRequest request, - @RequestParam(required = false, defaultValue = "0") int start, - @RequestParam(required = false, defaultValue = "10") int length, - int jobGroup, int jobId, int logStatus, String filterTime) { + @RequestMapping("/getJobsByGroup") + @ResponseBody + public ReturnT> getJobsByGroup(int jobGroup) { + List list = xxlJobInfoDao.getJobsByGroup(jobGroup); + return new ReturnT>(list); + } - // valid permission - JobInfoController.validPermission(request, jobGroup); // 仅管理员支持查询全部;普通用户仅支持查询有权限的 jobGroup - - // parse param - Date triggerTimeStart = null; - Date triggerTimeEnd = null; - if (filterTime!=null && filterTime.trim().length()>0) { - String[] temp = filterTime.split(" - "); - if (temp.length == 2) { - triggerTimeStart = DateUtil.parseDateTime(temp[0]); - triggerTimeEnd = DateUtil.parseDateTime(temp[1]); - } - } - - // page query - List list = xxlJobLogDao.pageList(start, length, jobGroup, jobId, triggerTimeStart, triggerTimeEnd, logStatus); - int list_count = xxlJobLogDao.pageListCount(start, length, jobGroup, jobId, triggerTimeStart, triggerTimeEnd, logStatus); - - // package result - Map maps = new HashMap(); - maps.put("recordsTotal", list_count); // 总记录数 - maps.put("recordsFiltered", list_count); // 过滤后的总记录数 - maps.put("data", list); // 分页列表 - return maps; - } + @RequestMapping("/pageList") + @ResponseBody + public Map pageList(HttpServletRequest request, + @RequestParam(required = false, defaultValue = "0") int start, + @RequestParam(required = false, defaultValue = "10") int length, + int jobGroup, int jobId, int logStatus, String filterTime) { - @RequestMapping("/logDetailPage") - public String logDetailPage(int id, Model model){ + // valid permission + JobInfoController.validPermission(request, jobGroup); // 仅管理员支持查询全部;普通用户仅支持查询有权限的 jobGroup - // base check - ReturnT logStatue = ReturnT.SUCCESS; - XxlJobLog jobLog = xxlJobLogDao.load(id); - if (jobLog == null) { + // parse param + Date triggerTimeStart = null; + Date triggerTimeEnd = null; + if (filterTime != null && filterTime.trim().length() > 0) { + String[] temp = filterTime.split(" - "); + if (temp.length == 2) { + triggerTimeStart = DateUtil.parseDateTime(temp[0]); + triggerTimeEnd = DateUtil.parseDateTime(temp[1]); + } + } + + // page query + List list = xxlJobLogDao.pageList(start, length, jobGroup, jobId, triggerTimeStart, triggerTimeEnd, logStatus); + int list_count = xxlJobLogDao.pageListCount(start, length, jobGroup, jobId, triggerTimeStart, triggerTimeEnd, logStatus); + + // package result + Map maps = new HashMap(); + maps.put("recordsTotal" , list_count); // 总记录数 + maps.put("recordsFiltered" , list_count); // 过滤后的总记录数 + maps.put("data" , list); // 分页列表 + return maps; + } + + @RequestMapping("/logDetailPage") + public String logDetailPage(int id, Model model) { + + // base check + ReturnT logStatue = ReturnT.SUCCESS; + XxlJobLog jobLog = xxlJobLogDao.load(id); + if (jobLog == null) { throw new RuntimeException(I18nUtil.getString("joblog_logid_unvalid")); - } + } - model.addAttribute("triggerCode", jobLog.getTriggerCode()); - model.addAttribute("handleCode", jobLog.getHandleCode()); - model.addAttribute("executorAddress", jobLog.getExecutorAddress()); - model.addAttribute("triggerTime", jobLog.getTriggerTime().getTime()); - model.addAttribute("logId", jobLog.getId()); - return "joblog/joblog.detail"; - } + model.addAttribute("triggerCode" , jobLog.getTriggerCode()); + model.addAttribute("handleCode" , jobLog.getHandleCode()); + model.addAttribute("executorAddress" , jobLog.getExecutorAddress()); + model.addAttribute("triggerTime" , jobLog.getTriggerTime().getTime()); + model.addAttribute("logId" , jobLog.getId()); + return "joblog/joblog.detail"; + } - @RequestMapping("/logDetailCat") - @ResponseBody - public ReturnT logDetailCat(String executorAddress, long triggerTime, long logId, int fromLineNum){ - try { - ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(executorAddress); - ReturnT logResult = executorBiz.log(new LogParam(triggerTime, logId, fromLineNum)); + @RequestMapping("/logDetailCat") + @ResponseBody + public ReturnT logDetailCat(String executorAddress, long triggerTime, long logId, int fromLineNum) { + try { + ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(executorAddress); + ReturnT logResult = executorBiz.log(new LogParam(triggerTime, logId, fromLineNum)); - // is end - if (logResult.getContent()!=null && logResult.getContent().getFromLineNum() > logResult.getContent().getToLineNum()) { + // is end + if (logResult.getContent() != null && logResult.getContent().getFromLineNum() > logResult.getContent().getToLineNum()) { XxlJobLog jobLog = xxlJobLogDao.load(logId); if (jobLog.getHandleCode() > 0) { logResult.getContent().setEnd(true); } } - return logResult; - } catch (Exception e) { - logger.error(e.getMessage(), e); - return new ReturnT(ReturnT.FAIL_CODE, e.getMessage()); - } - } + return logResult; + } catch (Exception e) { + logger.error(e.getMessage(), e); + return new ReturnT(ReturnT.FAIL_CODE, e.getMessage()); + } + } - @RequestMapping("/logKill") - @ResponseBody - public ReturnT logKill(int id){ - // base check - XxlJobLog log = xxlJobLogDao.load(id); - XxlJobInfo jobInfo = xxlJobInfoDao.loadById(log.getJobId()); - if (jobInfo==null) { - return new ReturnT(500, I18nUtil.getString("jobinfo_glue_jobid_unvalid")); - } - if (ReturnT.SUCCESS_CODE != log.getTriggerCode()) { - return new ReturnT(500, I18nUtil.getString("joblog_kill_log_limit")); - } + @RequestMapping("/logKill") + @ResponseBody + public ReturnT logKill(int id) { + // base check + XxlJobLog log = xxlJobLogDao.load(id); + XxlJobInfo jobInfo = xxlJobInfoDao.loadById(log.getJobId()); + if (jobInfo == null) { + return new ReturnT(500, I18nUtil.getString("jobinfo_glue_jobid_unvalid")); + } + if (ReturnT.SUCCESS_CODE != log.getTriggerCode()) { + return new ReturnT(500, I18nUtil.getString("joblog_kill_log_limit")); + } - // request of kill - ReturnT runResult = null; - try { - ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(log.getExecutorAddress()); - runResult = executorBiz.kill(new KillParam(jobInfo.getId())); - } catch (Exception e) { - logger.error(e.getMessage(), e); - runResult = new ReturnT(500, e.getMessage()); - } + // request of kill + ReturnT runResult = null; + try { + ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(log.getExecutorAddress()); + runResult = executorBiz.kill(new KillParam(jobInfo.getId())); + } catch (Exception e) { + logger.error(e.getMessage(), e); + runResult = new ReturnT(500, e.getMessage()); + } - if (ReturnT.SUCCESS_CODE == runResult.getCode()) { - log.setHandleCode(ReturnT.FAIL_CODE); - log.setHandleMsg( I18nUtil.getString("joblog_kill_log_byman")+":" + (runResult.getMsg()!=null?runResult.getMsg():"")); - log.setHandleTime(new Date()); - XxlJobCompleter.updateHandleInfoAndFinish(log); - return new ReturnT(runResult.getMsg()); - } else { - return new ReturnT(500, runResult.getMsg()); - } - } + if (ReturnT.SUCCESS_CODE == runResult.getCode()) { + log.setHandleCode(ReturnT.FAIL_CODE); + log.setHandleMsg(I18nUtil.getString("joblog_kill_log_byman") + ":" + (runResult.getMsg() != null ? runResult.getMsg() : "")); + log.setHandleTime(new Date()); + XxlJobCompleter.updateHandleInfoAndFinish(log); + return new ReturnT(runResult.getMsg()); + } else { + return new ReturnT(500, runResult.getMsg()); + } + } - @RequestMapping("/clearLog") - @ResponseBody - public ReturnT clearLog(int jobGroup, int jobId, int type){ + @RequestMapping("/clearLog") + @ResponseBody + public ReturnT clearLog(int jobGroup, int jobId, int type) { - Date clearBeforeTime = null; - int clearBeforeNum = 0; - if (type == 1) { - clearBeforeTime = DateUtil.addMonths(new Date(), -1); // 清理一个月之前日志数据 - } else if (type == 2) { - clearBeforeTime = DateUtil.addMonths(new Date(), -3); // 清理三个月之前日志数据 - } else if (type == 3) { - clearBeforeTime = DateUtil.addMonths(new Date(), -6); // 清理六个月之前日志数据 - } else if (type == 4) { - clearBeforeTime = DateUtil.addYears(new Date(), -1); // 清理一年之前日志数据 - } else if (type == 5) { - clearBeforeNum = 1000; // 清理一千条以前日志数据 - } else if (type == 6) { - clearBeforeNum = 10000; // 清理一万条以前日志数据 - } else if (type == 7) { - clearBeforeNum = 30000; // 清理三万条以前日志数据 - } else if (type == 8) { - clearBeforeNum = 100000; // 清理十万条以前日志数据 - } else if (type == 9) { - clearBeforeNum = 0; // 清理所有日志数据 - } else { - return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("joblog_clean_type_unvalid")); - } + Date clearBeforeTime = null; + int clearBeforeNum = 0; + if (type == 1) { + clearBeforeTime = DateUtil.addMonths(new Date(), -1); // 清理一个月之前日志数据 + } else if (type == 2) { + clearBeforeTime = DateUtil.addMonths(new Date(), -3); // 清理三个月之前日志数据 + } else if (type == 3) { + clearBeforeTime = DateUtil.addMonths(new Date(), -6); // 清理六个月之前日志数据 + } else if (type == 4) { + clearBeforeTime = DateUtil.addYears(new Date(), -1); // 清理一年之前日志数据 + } else if (type == 5) { + clearBeforeNum = 1000; // 清理一千条以前日志数据 + } else if (type == 6) { + clearBeforeNum = 10000; // 清理一万条以前日志数据 + } else if (type == 7) { + clearBeforeNum = 30000; // 清理三万条以前日志数据 + } else if (type == 8) { + clearBeforeNum = 100000; // 清理十万条以前日志数据 + } else if (type == 9) { + clearBeforeNum = 0; // 清理所有日志数据 + } else { + return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("joblog_clean_type_unvalid")); + } - List logIds = null; - do { - logIds = xxlJobLogDao.findClearLogIds(jobGroup, jobId, clearBeforeTime, clearBeforeNum, 1000); - if (logIds!=null && logIds.size()>0) { - xxlJobLogDao.clearLog(logIds); - } - } while (logIds!=null && logIds.size()>0); + List logIds = null; + do { + logIds = xxlJobLogDao.findClearLogIds(jobGroup, jobId, clearBeforeTime, clearBeforeNum, 1000); + if (logIds != null && logIds.size() > 0) { + xxlJobLogDao.clearLog(logIds); + } + } while (logIds != null && logIds.size() > 0); - return ReturnT.SUCCESS; - } + return ReturnT.SUCCESS; + } } diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/UserController.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/UserController.java index 3f4c7559b..b38e1b1b8 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/UserController.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/UserController.java @@ -40,7 +40,7 @@ public class UserController { // 执行器列表 List groupList = xxlJobGroupDao.findAll(); - model.addAttribute("groupList", groupList); + model.addAttribute("groupList" , groupList); return "user/user.index"; } @@ -57,17 +57,17 @@ public class UserController { int list_count = xxlJobUserDao.pageListCount(start, length, username, role); // filter - if (list!=null && list.size()>0) { - for (XxlJobUser item: list) { + if (list != null && list.size() > 0) { + for (XxlJobUser item : list) { item.setPassword(null); } } // package result Map maps = new HashMap(); - maps.put("recordsTotal", list_count); // 总记录数 - maps.put("recordsFiltered", list_count); // 过滤后的总记录数 - maps.put("data", list); // 分页列表 + maps.put("recordsTotal" , list_count); // 总记录数 + maps.put("recordsFiltered" , list_count); // 过滤后的总记录数 + maps.put("data" , list); // 分页列表 return maps; } @@ -78,19 +78,19 @@ public class UserController { // valid username if (!StringUtils.hasText(xxlJobUser.getUsername())) { - return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("system_please_input")+I18nUtil.getString("user_username") ); + return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("system_please_input") + I18nUtil.getString("user_username")); } xxlJobUser.setUsername(xxlJobUser.getUsername().trim()); - if (!(xxlJobUser.getUsername().length()>=4 && xxlJobUser.getUsername().length()<=20)) { - return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("system_lengh_limit")+"[4-20]" ); + if (!(xxlJobUser.getUsername().length() >= 4 && xxlJobUser.getUsername().length() <= 20)) { + return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("system_lengh_limit") + "[4-20]"); } // valid password if (!StringUtils.hasText(xxlJobUser.getPassword())) { - return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("system_please_input")+I18nUtil.getString("user_password") ); + return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("system_please_input") + I18nUtil.getString("user_password")); } xxlJobUser.setPassword(xxlJobUser.getPassword().trim()); - if (!(xxlJobUser.getPassword().length()>=4 && xxlJobUser.getPassword().length()<=20)) { - return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("system_lengh_limit")+"[4-20]" ); + if (!(xxlJobUser.getPassword().length() >= 4 && xxlJobUser.getPassword().length() <= 20)) { + return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("system_lengh_limit") + "[4-20]"); } // md5 password xxlJobUser.setPassword(DigestUtils.md5DigestAsHex(xxlJobUser.getPassword().getBytes())); @@ -98,7 +98,7 @@ public class UserController { // check repeat XxlJobUser existUser = xxlJobUserDao.loadByUserName(xxlJobUser.getUsername()); if (existUser != null) { - return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("user_username_repeat") ); + return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("user_username_repeat")); } // write @@ -120,8 +120,8 @@ public class UserController { // valid password if (StringUtils.hasText(xxlJobUser.getPassword())) { xxlJobUser.setPassword(xxlJobUser.getPassword().trim()); - if (!(xxlJobUser.getPassword().length()>=4 && xxlJobUser.getPassword().length()<=20)) { - return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("system_lengh_limit")+"[4-20]" ); + if (!(xxlJobUser.getPassword().length() >= 4 && xxlJobUser.getPassword().length() <= 20)) { + return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("system_lengh_limit") + "[4-20]"); } // md5 password xxlJobUser.setPassword(DigestUtils.md5DigestAsHex(xxlJobUser.getPassword().getBytes())); @@ -151,15 +151,15 @@ public class UserController { @RequestMapping("/updatePwd") @ResponseBody - public ReturnT updatePwd(HttpServletRequest request, String password){ + public ReturnT updatePwd(HttpServletRequest request, String password) { // valid password - if (password==null || password.trim().length()==0){ + if (password == null || password.trim().length() == 0) { return new ReturnT(ReturnT.FAIL.getCode(), "密码不可为空"); } password = password.trim(); - if (!(password.length()>=4 && password.length()<=20)) { - return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("system_lengh_limit")+"[4-20]" ); + if (!(password.length() >= 4 && password.length() <= 20)) { + return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("system_lengh_limit") + "[4-20]"); } // md5 password diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/annotation/PermissionLimit.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/annotation/PermissionLimit.java index 379efd46b..054d6ef55 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/annotation/PermissionLimit.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/annotation/PermissionLimit.java @@ -8,22 +8,23 @@ import java.lang.annotation.Target; /** * 权限限制 + * * @author xuxueli 2015-12-12 18:29:02 */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface PermissionLimit { - - /** - * 登录拦截 (默认拦截) - */ - boolean limit() default true; - /** - * 要求管理员权限 - * - * @return - */ - boolean adminuser() default false; + /** + * 登录拦截 (默认拦截) + */ + boolean limit() default true; -} \ No newline at end of file + /** + * 要求管理员权限 + * + * @return + */ + boolean adminuser() default false; + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/CookieInterceptor.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/CookieInterceptor.java index e55b890fa..6714d1eca 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/CookieInterceptor.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/CookieInterceptor.java @@ -19,25 +19,25 @@ import java.util.HashMap; @Component public class CookieInterceptor implements AsyncHandlerInterceptor { - @Override - public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, - ModelAndView modelAndView) throws Exception { + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, + ModelAndView modelAndView) throws Exception { - // cookie - if (modelAndView!=null && request.getCookies()!=null && request.getCookies().length>0) { - HashMap cookieMap = new HashMap(); - for (Cookie ck : request.getCookies()) { - cookieMap.put(ck.getName(), ck); - } - modelAndView.addObject("cookieMap", cookieMap); - } + // cookie + if (modelAndView != null && request.getCookies() != null && request.getCookies().length > 0) { + HashMap cookieMap = new HashMap(); + for (Cookie ck : request.getCookies()) { + cookieMap.put(ck.getName(), ck); + } + modelAndView.addObject("cookieMap" , cookieMap); + } - // static method - if (modelAndView != null) { - modelAndView.addObject("I18nUtil", FtlUtil.generateStaticModel(I18nUtil.class.getName())); - } + // static method + if (modelAndView != null) { + modelAndView.addObject("I18nUtil" , FtlUtil.generateStaticModel(I18nUtil.class.getName())); + } - AsyncHandlerInterceptor.super.postHandle(request, response, handler, modelAndView); - } + AsyncHandlerInterceptor.super.postHandle(request, response, handler, modelAndView); + } } diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/PermissionInterceptor.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/PermissionInterceptor.java index 19eac7355..ecaeca0ff 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/PermissionInterceptor.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/PermissionInterceptor.java @@ -20,40 +20,40 @@ import javax.servlet.http.HttpServletResponse; @Component public class PermissionInterceptor implements AsyncHandlerInterceptor { - @Resource - private LoginService loginService; + @Resource + private LoginService loginService; - @Override - public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { - if (!(handler instanceof HandlerMethod)) { - return AsyncHandlerInterceptor.super.preHandle(request, response, handler); - } + if (!(handler instanceof HandlerMethod)) { + return AsyncHandlerInterceptor.super.preHandle(request, response, handler); + } - // if need login - boolean needLogin = true; - boolean needAdminuser = false; - HandlerMethod method = (HandlerMethod)handler; - PermissionLimit permission = method.getMethodAnnotation(PermissionLimit.class); - if (permission!=null) { - needLogin = permission.limit(); - needAdminuser = permission.adminuser(); - } + // if need login + boolean needLogin = true; + boolean needAdminuser = false; + HandlerMethod method = (HandlerMethod) handler; + PermissionLimit permission = method.getMethodAnnotation(PermissionLimit.class); + if (permission != null) { + needLogin = permission.limit(); + needAdminuser = permission.adminuser(); + } - if (needLogin) { - XxlJobUser loginUser = loginService.ifLogin(request, response); - if (loginUser == null) { - response.setStatus(302); - response.setHeader("location", request.getContextPath()+"/toLogin"); - return false; - } - if (needAdminuser && loginUser.getRole()!=1) { - throw new RuntimeException(I18nUtil.getString("system_permission_limit")); - } - request.setAttribute(LoginService.LOGIN_IDENTITY_KEY, loginUser); - } + if (needLogin) { + XxlJobUser loginUser = loginService.ifLogin(request, response); + if (loginUser == null) { + response.setStatus(302); + response.setHeader("location" , request.getContextPath() + "/toLogin"); + return false; + } + if (needAdminuser && loginUser.getRole() != 1) { + throw new RuntimeException(I18nUtil.getString("system_permission_limit")); + } + request.setAttribute(LoginService.LOGIN_IDENTITY_KEY, loginUser); + } - return AsyncHandlerInterceptor.super.preHandle(request, response, handler); - } + return AsyncHandlerInterceptor.super.preHandle(request, response, handler); + } } diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/resolver/WebExceptionResolver.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/resolver/WebExceptionResolver.java index 114407b66..4cd7f193d 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/resolver/WebExceptionResolver.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/resolver/WebExceptionResolver.java @@ -1,8 +1,8 @@ package com.xxl.job.admin.controller.resolver; import com.xxl.job.admin.core.exception.XxlJobException; -import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.admin.core.util.JacksonUtil; +import com.xxl.job.core.biz.model.ReturnT; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @@ -22,45 +22,45 @@ import java.io.IOException; */ @Component public class WebExceptionResolver implements HandlerExceptionResolver { - private static transient Logger logger = LoggerFactory.getLogger(WebExceptionResolver.class); + private static transient Logger logger = LoggerFactory.getLogger(WebExceptionResolver.class); - @Override - public ModelAndView resolveException(HttpServletRequest request, - HttpServletResponse response, Object handler, Exception ex) { + @Override + public ModelAndView resolveException(HttpServletRequest request, + HttpServletResponse response, Object handler, Exception ex) { - if (!(ex instanceof XxlJobException)) { - logger.error("WebExceptionResolver:{}", ex); - } + if (!(ex instanceof XxlJobException)) { + logger.error("WebExceptionResolver:{}" , ex); + } - // if json - boolean isJson = false; - if (handler instanceof HandlerMethod) { - HandlerMethod method = (HandlerMethod)handler; - ResponseBody responseBody = method.getMethodAnnotation(ResponseBody.class); - if (responseBody != null) { - isJson = true; - } - } + // if json + boolean isJson = false; + if (handler instanceof HandlerMethod) { + HandlerMethod method = (HandlerMethod) handler; + ResponseBody responseBody = method.getMethodAnnotation(ResponseBody.class); + if (responseBody != null) { + isJson = true; + } + } - // error result - ReturnT errorResult = new ReturnT(ReturnT.FAIL_CODE, ex.toString().replaceAll("\n", "
")); + // error result + ReturnT errorResult = new ReturnT(ReturnT.FAIL_CODE, ex.toString().replaceAll("\n" , "
")); - // response - ModelAndView mv = new ModelAndView(); - if (isJson) { - try { - response.setContentType("application/json;charset=utf-8"); - response.getWriter().print(JacksonUtil.writeValueAsString(errorResult)); - } catch (IOException e) { - logger.error(e.getMessage(), e); - } - return mv; - } else { + // response + ModelAndView mv = new ModelAndView(); + if (isJson) { + try { + response.setContentType("application/json;charset=utf-8"); + response.getWriter().print(JacksonUtil.writeValueAsString(errorResult)); + } catch (IOException e) { + logger.error(e.getMessage(), e); + } + return mv; + } else { - mv.addObject("exceptionMsg", errorResult.getMsg()); - mv.setViewName("/common/common.exception"); - return mv; - } - } - -} \ No newline at end of file + mv.addObject("exceptionMsg" , errorResult.getMsg()); + mv.setViewName("/common/common.exception"); + return mv; + } + } + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobInfo.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobInfo.java index e47b6dc65..d3d2914aa 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobInfo.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobInfo.java @@ -8,230 +8,230 @@ import java.util.Date; * @author xuxueli 2016-1-12 18:25:49 */ public class XxlJobInfo { - - private int id; // 主键ID - - private int jobGroup; // 执行器主键ID - private String jobDesc; - - private Date addTime; - private Date updateTime; - - private String author; // 负责人 - private String alarmEmail; // 报警邮件 - private String scheduleType; // 调度类型 - private String scheduleConf; // 调度配置,值含义取决于调度类型 - private String misfireStrategy; // 调度过期策略 + private int id; // 主键ID - private String executorRouteStrategy; // 执行器路由策略 - private String executorHandler; // 执行器,任务Handler名称 - private String executorParam; // 执行器,任务参数 - private String executorBlockStrategy; // 阻塞处理策略 - private int executorTimeout; // 任务执行超时时间,单位秒 - private int executorFailRetryCount; // 失败重试次数 - - private String glueType; // GLUE类型 #com.xxl.job.core.glue.GlueTypeEnum - private String glueSource; // GLUE源代码 - private String glueRemark; // GLUE备注 - private Date glueUpdatetime; // GLUE更新时间 + private int jobGroup; // 执行器主键ID + private String jobDesc; - private String childJobId; // 子任务ID,多个逗号分隔 + private Date addTime; + private Date updateTime; - private int triggerStatus; // 调度状态:0-停止,1-运行 - private long triggerLastTime; // 上次调度时间 - private long triggerNextTime; // 下次调度时间 + private String author; // 负责人 + private String alarmEmail; // 报警邮件 + + private String scheduleType; // 调度类型 + private String scheduleConf; // 调度配置,值含义取决于调度类型 + private String misfireStrategy; // 调度过期策略 + + private String executorRouteStrategy; // 执行器路由策略 + private String executorHandler; // 执行器,任务Handler名称 + private String executorParam; // 执行器,任务参数 + private String executorBlockStrategy; // 阻塞处理策略 + private int executorTimeout; // 任务执行超时时间,单位秒 + private int executorFailRetryCount; // 失败重试次数 + + private String glueType; // GLUE类型 #com.xxl.job.core.glue.GlueTypeEnum + private String glueSource; // GLUE源代码 + private String glueRemark; // GLUE备注 + private Date glueUpdatetime; // GLUE更新时间 + + private String childJobId; // 子任务ID,多个逗号分隔 + + private int triggerStatus; // 调度状态:0-停止,1-运行 + private long triggerLastTime; // 上次调度时间 + private long triggerNextTime; // 下次调度时间 - public int getId() { - return id; - } + public int getId() { + return id; + } - public void setId(int id) { - this.id = id; - } + public void setId(int id) { + this.id = id; + } - public int getJobGroup() { - return jobGroup; - } + public int getJobGroup() { + return jobGroup; + } - public void setJobGroup(int jobGroup) { - this.jobGroup = jobGroup; - } + public void setJobGroup(int jobGroup) { + this.jobGroup = jobGroup; + } - public String getJobDesc() { - return jobDesc; - } + public String getJobDesc() { + return jobDesc; + } - public void setJobDesc(String jobDesc) { - this.jobDesc = jobDesc; - } + public void setJobDesc(String jobDesc) { + this.jobDesc = jobDesc; + } - public Date getAddTime() { - return addTime; - } + public Date getAddTime() { + return addTime; + } - public void setAddTime(Date addTime) { - this.addTime = addTime; - } + public void setAddTime(Date addTime) { + this.addTime = addTime; + } - public Date getUpdateTime() { - return updateTime; - } + public Date getUpdateTime() { + return updateTime; + } - public void setUpdateTime(Date updateTime) { - this.updateTime = updateTime; - } + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } - public String getAuthor() { - return author; - } + public String getAuthor() { + return author; + } - public void setAuthor(String author) { - this.author = author; - } + public void setAuthor(String author) { + this.author = author; + } - public String getAlarmEmail() { - return alarmEmail; - } + public String getAlarmEmail() { + return alarmEmail; + } - public void setAlarmEmail(String alarmEmail) { - this.alarmEmail = alarmEmail; - } + public void setAlarmEmail(String alarmEmail) { + this.alarmEmail = alarmEmail; + } - public String getScheduleType() { - return scheduleType; - } + public String getScheduleType() { + return scheduleType; + } - public void setScheduleType(String scheduleType) { - this.scheduleType = scheduleType; - } + public void setScheduleType(String scheduleType) { + this.scheduleType = scheduleType; + } - public String getScheduleConf() { - return scheduleConf; - } + public String getScheduleConf() { + return scheduleConf; + } - public void setScheduleConf(String scheduleConf) { - this.scheduleConf = scheduleConf; - } + public void setScheduleConf(String scheduleConf) { + this.scheduleConf = scheduleConf; + } - public String getMisfireStrategy() { - return misfireStrategy; - } + public String getMisfireStrategy() { + return misfireStrategy; + } - public void setMisfireStrategy(String misfireStrategy) { - this.misfireStrategy = misfireStrategy; - } + public void setMisfireStrategy(String misfireStrategy) { + this.misfireStrategy = misfireStrategy; + } - public String getExecutorRouteStrategy() { - return executorRouteStrategy; - } + public String getExecutorRouteStrategy() { + return executorRouteStrategy; + } - public void setExecutorRouteStrategy(String executorRouteStrategy) { - this.executorRouteStrategy = executorRouteStrategy; - } + public void setExecutorRouteStrategy(String executorRouteStrategy) { + this.executorRouteStrategy = executorRouteStrategy; + } - public String getExecutorHandler() { - return executorHandler; - } + public String getExecutorHandler() { + return executorHandler; + } - public void setExecutorHandler(String executorHandler) { - this.executorHandler = executorHandler; - } + public void setExecutorHandler(String executorHandler) { + this.executorHandler = executorHandler; + } - public String getExecutorParam() { - return executorParam; - } + public String getExecutorParam() { + return executorParam; + } - public void setExecutorParam(String executorParam) { - this.executorParam = executorParam; - } + public void setExecutorParam(String executorParam) { + this.executorParam = executorParam; + } - public String getExecutorBlockStrategy() { - return executorBlockStrategy; - } + public String getExecutorBlockStrategy() { + return executorBlockStrategy; + } - public void setExecutorBlockStrategy(String executorBlockStrategy) { - this.executorBlockStrategy = executorBlockStrategy; - } + public void setExecutorBlockStrategy(String executorBlockStrategy) { + this.executorBlockStrategy = executorBlockStrategy; + } - public int getExecutorTimeout() { - return executorTimeout; - } + public int getExecutorTimeout() { + return executorTimeout; + } - public void setExecutorTimeout(int executorTimeout) { - this.executorTimeout = executorTimeout; - } + public void setExecutorTimeout(int executorTimeout) { + this.executorTimeout = executorTimeout; + } - public int getExecutorFailRetryCount() { - return executorFailRetryCount; - } + public int getExecutorFailRetryCount() { + return executorFailRetryCount; + } - public void setExecutorFailRetryCount(int executorFailRetryCount) { - this.executorFailRetryCount = executorFailRetryCount; - } + public void setExecutorFailRetryCount(int executorFailRetryCount) { + this.executorFailRetryCount = executorFailRetryCount; + } - public String getGlueType() { - return glueType; - } + public String getGlueType() { + return glueType; + } - public void setGlueType(String glueType) { - this.glueType = glueType; - } + public void setGlueType(String glueType) { + this.glueType = glueType; + } - public String getGlueSource() { - return glueSource; - } + public String getGlueSource() { + return glueSource; + } - public void setGlueSource(String glueSource) { - this.glueSource = glueSource; - } + public void setGlueSource(String glueSource) { + this.glueSource = glueSource; + } - public String getGlueRemark() { - return glueRemark; - } + public String getGlueRemark() { + return glueRemark; + } - public void setGlueRemark(String glueRemark) { - this.glueRemark = glueRemark; - } + public void setGlueRemark(String glueRemark) { + this.glueRemark = glueRemark; + } - public Date getGlueUpdatetime() { - return glueUpdatetime; - } + public Date getGlueUpdatetime() { + return glueUpdatetime; + } - public void setGlueUpdatetime(Date glueUpdatetime) { - this.glueUpdatetime = glueUpdatetime; - } + public void setGlueUpdatetime(Date glueUpdatetime) { + this.glueUpdatetime = glueUpdatetime; + } - public String getChildJobId() { - return childJobId; - } + public String getChildJobId() { + return childJobId; + } - public void setChildJobId(String childJobId) { - this.childJobId = childJobId; - } + public void setChildJobId(String childJobId) { + this.childJobId = childJobId; + } - public int getTriggerStatus() { - return triggerStatus; - } + public int getTriggerStatus() { + return triggerStatus; + } - public void setTriggerStatus(int triggerStatus) { - this.triggerStatus = triggerStatus; - } + public void setTriggerStatus(int triggerStatus) { + this.triggerStatus = triggerStatus; + } - public long getTriggerLastTime() { - return triggerLastTime; - } + public long getTriggerLastTime() { + return triggerLastTime; + } - public void setTriggerLastTime(long triggerLastTime) { - this.triggerLastTime = triggerLastTime; - } + public void setTriggerLastTime(long triggerLastTime) { + this.triggerLastTime = triggerLastTime; + } - public long getTriggerNextTime() { - return triggerNextTime; - } + public long getTriggerNextTime() { + return triggerNextTime; + } - public void setTriggerNextTime(long triggerNextTime) { - this.triggerNextTime = triggerNextTime; - } + public void setTriggerNextTime(long triggerNextTime) { + this.triggerNextTime = triggerNextTime; + } } diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLog.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLog.java index 7d3072aa6..f3301af6c 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLog.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLog.java @@ -4,154 +4,155 @@ import java.util.Date; /** * xxl-job log, used to track trigger process + * * @author xuxueli 2015-12-19 23:19:09 */ public class XxlJobLog { - - private long id; - - // job info - private int jobGroup; - private int jobId; - // execute info - private String executorAddress; - private String executorHandler; - private String executorParam; - private String executorShardingParam; - private int executorFailRetryCount; - - // trigger info - private Date triggerTime; - private int triggerCode; - private String triggerMsg; - - // handle info - private Date handleTime; - private int handleCode; - private String handleMsg; + private long id; - // alarm info - private int alarmStatus; + // job info + private int jobGroup; + private int jobId; - public long getId() { - return id; - } + // execute info + private String executorAddress; + private String executorHandler; + private String executorParam; + private String executorShardingParam; + private int executorFailRetryCount; - public void setId(long id) { - this.id = id; - } + // trigger info + private Date triggerTime; + private int triggerCode; + private String triggerMsg; - public int getJobGroup() { - return jobGroup; - } + // handle info + private Date handleTime; + private int handleCode; + private String handleMsg; - public void setJobGroup(int jobGroup) { - this.jobGroup = jobGroup; - } + // alarm info + private int alarmStatus; - public int getJobId() { - return jobId; - } + public long getId() { + return id; + } - public void setJobId(int jobId) { - this.jobId = jobId; - } + public void setId(long id) { + this.id = id; + } - public String getExecutorAddress() { - return executorAddress; - } + public int getJobGroup() { + return jobGroup; + } - public void setExecutorAddress(String executorAddress) { - this.executorAddress = executorAddress; - } + public void setJobGroup(int jobGroup) { + this.jobGroup = jobGroup; + } - public String getExecutorHandler() { - return executorHandler; - } + public int getJobId() { + return jobId; + } - public void setExecutorHandler(String executorHandler) { - this.executorHandler = executorHandler; - } + public void setJobId(int jobId) { + this.jobId = jobId; + } - public String getExecutorParam() { - return executorParam; - } + public String getExecutorAddress() { + return executorAddress; + } - public void setExecutorParam(String executorParam) { - this.executorParam = executorParam; - } + public void setExecutorAddress(String executorAddress) { + this.executorAddress = executorAddress; + } - public String getExecutorShardingParam() { - return executorShardingParam; - } + public String getExecutorHandler() { + return executorHandler; + } - public void setExecutorShardingParam(String executorShardingParam) { - this.executorShardingParam = executorShardingParam; - } + public void setExecutorHandler(String executorHandler) { + this.executorHandler = executorHandler; + } - public int getExecutorFailRetryCount() { - return executorFailRetryCount; - } + public String getExecutorParam() { + return executorParam; + } - public void setExecutorFailRetryCount(int executorFailRetryCount) { - this.executorFailRetryCount = executorFailRetryCount; - } + public void setExecutorParam(String executorParam) { + this.executorParam = executorParam; + } - public Date getTriggerTime() { - return triggerTime; - } + public String getExecutorShardingParam() { + return executorShardingParam; + } - public void setTriggerTime(Date triggerTime) { - this.triggerTime = triggerTime; - } + public void setExecutorShardingParam(String executorShardingParam) { + this.executorShardingParam = executorShardingParam; + } - public int getTriggerCode() { - return triggerCode; - } + public int getExecutorFailRetryCount() { + return executorFailRetryCount; + } - public void setTriggerCode(int triggerCode) { - this.triggerCode = triggerCode; - } + public void setExecutorFailRetryCount(int executorFailRetryCount) { + this.executorFailRetryCount = executorFailRetryCount; + } - public String getTriggerMsg() { - return triggerMsg; - } + public Date getTriggerTime() { + return triggerTime; + } - public void setTriggerMsg(String triggerMsg) { - this.triggerMsg = triggerMsg; - } + public void setTriggerTime(Date triggerTime) { + this.triggerTime = triggerTime; + } - public Date getHandleTime() { - return handleTime; - } + public int getTriggerCode() { + return triggerCode; + } - public void setHandleTime(Date handleTime) { - this.handleTime = handleTime; - } + public void setTriggerCode(int triggerCode) { + this.triggerCode = triggerCode; + } - public int getHandleCode() { - return handleCode; - } + public String getTriggerMsg() { + return triggerMsg; + } - public void setHandleCode(int handleCode) { - this.handleCode = handleCode; - } + public void setTriggerMsg(String triggerMsg) { + this.triggerMsg = triggerMsg; + } - public String getHandleMsg() { - return handleMsg; - } + public Date getHandleTime() { + return handleTime; + } - public void setHandleMsg(String handleMsg) { - this.handleMsg = handleMsg; - } + public void setHandleTime(Date handleTime) { + this.handleTime = handleTime; + } - public int getAlarmStatus() { - return alarmStatus; - } + public int getHandleCode() { + return handleCode; + } - public void setAlarmStatus(int alarmStatus) { - this.alarmStatus = alarmStatus; - } + public void setHandleCode(int handleCode) { + this.handleCode = handleCode; + } + + public String getHandleMsg() { + return handleMsg; + } + + public void setHandleMsg(String handleMsg) { + this.handleMsg = handleMsg; + } + + public int getAlarmStatus() { + return alarmStatus; + } + + public void setAlarmStatus(int alarmStatus) { + this.alarmStatus = alarmStatus; + } } diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLogGlue.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLogGlue.java index 2f59ffa84..2da3c2da2 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLogGlue.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLogGlue.java @@ -4,72 +4,73 @@ import java.util.Date; /** * xxl-job log for glue, used to track job code process + * * @author xuxueli 2016-5-19 17:57:46 */ public class XxlJobLogGlue { - - private int id; - private int jobId; // 任务主键ID - private String glueType; // GLUE类型 #com.xxl.job.core.glue.GlueTypeEnum - private String glueSource; - private String glueRemark; - private Date addTime; - private Date updateTime; - public int getId() { - return id; - } + private int id; + private int jobId; // 任务主键ID + private String glueType; // GLUE类型 #com.xxl.job.core.glue.GlueTypeEnum + private String glueSource; + private String glueRemark; + private Date addTime; + private Date updateTime; - public void setId(int id) { - this.id = id; - } + public int getId() { + return id; + } - public int getJobId() { - return jobId; - } + public void setId(int id) { + this.id = id; + } - public void setJobId(int jobId) { - this.jobId = jobId; - } + public int getJobId() { + return jobId; + } - public String getGlueType() { - return glueType; - } + public void setJobId(int jobId) { + this.jobId = jobId; + } - public void setGlueType(String glueType) { - this.glueType = glueType; - } + public String getGlueType() { + return glueType; + } - public String getGlueSource() { - return glueSource; - } + public void setGlueType(String glueType) { + this.glueType = glueType; + } - public void setGlueSource(String glueSource) { - this.glueSource = glueSource; - } + public String getGlueSource() { + return glueSource; + } - public String getGlueRemark() { - return glueRemark; - } + public void setGlueSource(String glueSource) { + this.glueSource = glueSource; + } - public void setGlueRemark(String glueRemark) { - this.glueRemark = glueRemark; - } + public String getGlueRemark() { + return glueRemark; + } - public Date getAddTime() { - return addTime; - } + public void setGlueRemark(String glueRemark) { + this.glueRemark = glueRemark; + } - public void setAddTime(Date addTime) { - this.addTime = addTime; - } + public Date getAddTime() { + return addTime; + } - public Date getUpdateTime() { - return updateTime; - } + public void setAddTime(Date addTime) { + this.addTime = addTime; + } - public void setUpdateTime(Date updateTime) { - this.updateTime = updateTime; - } + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } } diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobUser.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobUser.java index db17327a8..6f696df2c 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobUser.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobUser.java @@ -6,68 +6,68 @@ import org.springframework.util.StringUtils; * @author xuxueli 2019-05-04 16:43:12 */ public class XxlJobUser { - - private int id; - private String username; // 账号 - private String password; // 密码 - private int role; // 角色:0-普通用户、1-管理员 - private String permission; // 权限:执行器ID列表,多个逗号分割 - public int getId() { - return id; - } + private int id; + private String username; // 账号 + private String password; // 密码 + private int role; // 角色:0-普通用户、1-管理员 + private String permission; // 权限:执行器ID列表,多个逗号分割 - public void setId(int id) { - this.id = id; - } + public int getId() { + return id; + } - public String getUsername() { - return username; - } + public void setId(int id) { + this.id = id; + } - public void setUsername(String username) { - this.username = username; - } + public String getUsername() { + return username; + } - public String getPassword() { - return password; - } + public void setUsername(String username) { + this.username = username; + } - public void setPassword(String password) { - this.password = password; - } + public String getPassword() { + return password; + } - public int getRole() { - return role; - } + public void setPassword(String password) { + this.password = password; + } - public void setRole(int role) { - this.role = role; - } + public int getRole() { + return role; + } - public String getPermission() { - return permission; - } + public void setRole(int role) { + this.role = role; + } - public void setPermission(String permission) { - this.permission = permission; - } + public String getPermission() { + return permission; + } - // plugin - public boolean validPermission(int jobGroup){ - if (this.role == 1) { - return true; - } else { - if (StringUtils.hasText(this.permission)) { - for (String permissionItem : this.permission.split(",")) { - if (String.valueOf(jobGroup).equals(permissionItem)) { - return true; - } - } - } - return false; - } + public void setPermission(String permission) { + this.permission = permission; + } - } + // plugin + public boolean validPermission(int jobGroup) { + if (this.role == 1) { + return true; + } else { + if (StringUtils.hasText(this.permission)) { + for (String permissionItem : this.permission.split(",")) { + if (String.valueOf(jobGroup).equals(permissionItem)) { + return true; + } + } + } + return false; + } + + } } diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobCompleteHelper.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobCompleteHelper.java index 5698926a2..95542fd03 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobCompleteHelper.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobCompleteHelper.java @@ -20,83 +20,85 @@ import java.util.concurrent.*; * @author xuxueli 2015-9-1 18:05:56 */ public class JobCompleteHelper { - private static Logger logger = LoggerFactory.getLogger(JobCompleteHelper.class); - - private static JobCompleteHelper instance = new JobCompleteHelper(); - public static JobCompleteHelper getInstance(){ - return instance; - } + private static Logger logger = LoggerFactory.getLogger(JobCompleteHelper.class); - // ---------------------- monitor ---------------------- + private static JobCompleteHelper instance = new JobCompleteHelper(); - private ThreadPoolExecutor callbackThreadPool = null; - private Thread monitorThread; - private volatile boolean toStop = false; - public void start(){ + public static JobCompleteHelper getInstance() { + return instance; + } - // for callback - callbackThreadPool = new ThreadPoolExecutor( - 2, - 20, - 30L, - TimeUnit.SECONDS, - new LinkedBlockingQueue(3000), - new ThreadFactory() { - @Override - public Thread newThread(Runnable r) { - return new Thread(r, "xxl-job, admin JobLosedMonitorHelper-callbackThreadPool-" + r.hashCode()); - } - }, - new RejectedExecutionHandler() { - @Override - public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { - r.run(); - logger.warn(">>>>>>>>>>> xxl-job, callback too fast, match threadpool rejected handler(run now)."); - } - }); + // ---------------------- monitor ---------------------- + + private ThreadPoolExecutor callbackThreadPool = null; + private Thread monitorThread; + private volatile boolean toStop = false; + + public void start() { + + // for callback + callbackThreadPool = new ThreadPoolExecutor( + 2, + 20, + 30L, + TimeUnit.SECONDS, + new LinkedBlockingQueue(3000), + new ThreadFactory() { + @Override + public Thread newThread(Runnable r) { + return new Thread(r, "xxl-job, admin JobLosedMonitorHelper-callbackThreadPool-" + r.hashCode()); + } + }, + new RejectedExecutionHandler() { + @Override + public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { + r.run(); + logger.warn(">>>>>>>>>>> xxl-job, callback too fast, match threadpool rejected handler(run now)."); + } + }); - // for monitor - monitorThread = new Thread(new Runnable() { + // for monitor + monitorThread = new Thread(new Runnable() { - @Override - public void run() { + @Override + public void run() { - // wait for JobTriggerPoolHelper-init - try { - TimeUnit.MILLISECONDS.sleep(50); - } catch (InterruptedException e) { - if (!toStop) { - logger.error(e.getMessage(), e); - } - } + // wait for JobTriggerPoolHelper-init + try { + TimeUnit.MILLISECONDS.sleep(50); + } catch (InterruptedException e) { + if (!toStop) { + logger.error(e.getMessage(), e); + } + } - // monitor - while (!toStop) { - try { - // 任务结果丢失处理:调度记录停留在 "运行中" 状态超过10min,且对应执行器心跳注册失败不在线,则将本地调度主动标记失败; - Date losedTime = DateUtil.addMinutes(new Date(), -10); - List losedJobIds = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().findLostJobIds(losedTime); + // monitor + while (!toStop) { + try { + // 任务结果丢失处理:调度记录停留在 "运行中" 状态超过10min,且对应执行器心跳注册失败不在线,则将本地调度主动标记失败; + Date losedTime = DateUtil.addMinutes(new Date(), -10); + List losedJobIds = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().findLostJobIds(losedTime); - if (losedJobIds!=null && losedJobIds.size()>0) { - for (Long logId: losedJobIds) { + if (losedJobIds != null && losedJobIds.size() > 0) { + for (Long logId : losedJobIds) { - XxlJobLog jobLog = new XxlJobLog(); - jobLog.setId(logId); + XxlJobLog jobLog = new XxlJobLog(); + jobLog.setId(logId); - jobLog.setHandleTime(new Date()); - jobLog.setHandleCode(ReturnT.FAIL_CODE); - jobLog.setHandleMsg( I18nUtil.getString("joblog_lost_fail") ); + jobLog.setHandleTime(new Date()); + jobLog.setHandleCode(ReturnT.FAIL_CODE); + jobLog.setHandleMsg(I18nUtil.getString("joblog_lost_fail")); - XxlJobCompleter.updateHandleInfoAndFinish(jobLog); - } + XxlJobCompleter.updateHandleInfoAndFinish(jobLog); + } - } - } catch (Exception e) { - if (!toStop) { - logger.error(">>>>>>>>>>> xxl-job, job fail monitor thread error:{}", e); - } - } + } + } catch (Exception e) { + if (!toStop) { + logger.error(">>>>>>>>>>> xxl-job, job fail monitor thread error:{}" , e); + } + } try { TimeUnit.SECONDS.sleep(60); @@ -108,77 +110,76 @@ public class JobCompleteHelper { } - logger.info(">>>>>>>>>>> xxl-job, JobLosedMonitorHelper stop"); + logger.info(">>>>>>>>>>> xxl-job, JobLosedMonitorHelper stop"); - } - }); - monitorThread.setDaemon(true); - monitorThread.setName("xxl-job, admin JobLosedMonitorHelper"); - monitorThread.start(); - } + } + }); + monitorThread.setDaemon(true); + monitorThread.setName("xxl-job, admin JobLosedMonitorHelper"); + monitorThread.start(); + } - public void toStop(){ - toStop = true; + public void toStop() { + toStop = true; - // stop registryOrRemoveThreadPool - callbackThreadPool.shutdownNow(); + // stop registryOrRemoveThreadPool + callbackThreadPool.shutdownNow(); - // stop monitorThread (interrupt and wait) - monitorThread.interrupt(); - try { - monitorThread.join(); - } catch (InterruptedException e) { - logger.error(e.getMessage(), e); - } - } + // stop monitorThread (interrupt and wait) + monitorThread.interrupt(); + try { + monitorThread.join(); + } catch (InterruptedException e) { + logger.error(e.getMessage(), e); + } + } - // ---------------------- helper ---------------------- + // ---------------------- helper ---------------------- - public ReturnT callback(List callbackParamList) { + public ReturnT callback(List callbackParamList) { - callbackThreadPool.execute(new Runnable() { - @Override - public void run() { - for (HandleCallbackParam handleCallbackParam: callbackParamList) { - ReturnT callbackResult = callback(handleCallbackParam); - logger.debug(">>>>>>>>> JobApiController.callback {}, handleCallbackParam={}, callbackResult={}", - (callbackResult.getCode()== ReturnT.SUCCESS_CODE?"success":"fail"), handleCallbackParam, callbackResult); - } - } - }); + callbackThreadPool.execute(new Runnable() { + @Override + public void run() { + for (HandleCallbackParam handleCallbackParam : callbackParamList) { + ReturnT callbackResult = callback(handleCallbackParam); + logger.debug(">>>>>>>>> JobApiController.callback {}, handleCallbackParam={}, callbackResult={}" , + (callbackResult.getCode() == ReturnT.SUCCESS_CODE ? "success" : "fail"), handleCallbackParam, callbackResult); + } + } + }); - return ReturnT.SUCCESS; - } + return ReturnT.SUCCESS; + } - private ReturnT callback(HandleCallbackParam handleCallbackParam) { - // valid log item - XxlJobLog log = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().load(handleCallbackParam.getLogId()); - if (log == null) { - return new ReturnT(ReturnT.FAIL_CODE, "log item not found."); - } - if (log.getHandleCode() > 0) { - return new ReturnT(ReturnT.FAIL_CODE, "log repeate callback."); // avoid repeat callback, trigger child job etc - } + private ReturnT callback(HandleCallbackParam handleCallbackParam) { + // valid log item + XxlJobLog log = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().load(handleCallbackParam.getLogId()); + if (log == null) { + return new ReturnT(ReturnT.FAIL_CODE, "log item not found."); + } + if (log.getHandleCode() > 0) { + return new ReturnT(ReturnT.FAIL_CODE, "log repeate callback."); // avoid repeat callback, trigger child job etc + } - // handle msg - StringBuffer handleMsg = new StringBuffer(); - if (log.getHandleMsg()!=null) { - handleMsg.append(log.getHandleMsg()).append("
"); - } - if (handleCallbackParam.getHandleMsg() != null) { - handleMsg.append(handleCallbackParam.getHandleMsg()); - } + // handle msg + StringBuffer handleMsg = new StringBuffer(); + if (log.getHandleMsg() != null) { + handleMsg.append(log.getHandleMsg()).append("
"); + } + if (handleCallbackParam.getHandleMsg() != null) { + handleMsg.append(handleCallbackParam.getHandleMsg()); + } - // success, save log - log.setHandleTime(new Date()); - log.setHandleCode(handleCallbackParam.getHandleCode()); - log.setHandleMsg(handleMsg.toString()); - XxlJobCompleter.updateHandleInfoAndFinish(log); - - return ReturnT.SUCCESS; - } + // success, save log + log.setHandleTime(new Date()); + log.setHandleCode(handleCallbackParam.getHandleCode()); + log.setHandleMsg(handleMsg.toString()); + XxlJobCompleter.updateHandleInfoAndFinish(log); + return ReturnT.SUCCESS; + } } diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java index 33e4d250d..82c315dba 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java @@ -17,65 +17,67 @@ import java.util.concurrent.TimeUnit; * @author xuxueli 2015-9-1 18:05:56 */ public class JobFailMonitorHelper { - private static Logger logger = LoggerFactory.getLogger(JobFailMonitorHelper.class); - - private static JobFailMonitorHelper instance = new JobFailMonitorHelper(); - public static JobFailMonitorHelper getInstance(){ - return instance; - } + private static Logger logger = LoggerFactory.getLogger(JobFailMonitorHelper.class); - // ---------------------- monitor ---------------------- + private static JobFailMonitorHelper instance = new JobFailMonitorHelper(); - private Thread monitorThread; - private volatile boolean toStop = false; - public void start(){ - monitorThread = new Thread(new Runnable() { + public static JobFailMonitorHelper getInstance() { + return instance; + } - @Override - public void run() { + // ---------------------- monitor ---------------------- - // monitor - while (!toStop) { - try { + private Thread monitorThread; + private volatile boolean toStop = false; - List failLogIds = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().findFailJobLogIds(1000); - if (failLogIds!=null && !failLogIds.isEmpty()) { - for (long failLogId: failLogIds) { + public void start() { + monitorThread = new Thread(new Runnable() { - // lock log - int lockRet = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().updateAlarmStatus(failLogId, 0, -1); - if (lockRet < 1) { - continue; - } - XxlJobLog log = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().load(failLogId); - XxlJobInfo info = XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao().loadById(log.getJobId()); + @Override + public void run() { - // 1、fail retry monitor - if (log.getExecutorFailRetryCount() > 0) { - JobTriggerPoolHelper.trigger(log.getJobId(), TriggerTypeEnum.RETRY, (log.getExecutorFailRetryCount()-1), log.getExecutorShardingParam(), log.getExecutorParam(), null); - String retryMsg = "

>>>>>>>>>>>"+ I18nUtil.getString("jobconf_trigger_type_retry") +"<<<<<<<<<<<
"; - log.setTriggerMsg(log.getTriggerMsg() + retryMsg); - XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().updateTriggerInfo(log); - } + // monitor + while (!toStop) { + try { - // 2、fail alarm monitor - int newAlarmStatus = 0; // 告警状态:0-默认、-1=锁定状态、1-无需告警、2-告警成功、3-告警失败 - if (info!=null && info.getAlarmEmail()!=null && info.getAlarmEmail().trim().length()>0) { - boolean alarmResult = XxlJobAdminConfig.getAdminConfig().getJobAlarmer().alarm(info, log); - newAlarmStatus = alarmResult?2:3; - } else { - newAlarmStatus = 1; - } + List failLogIds = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().findFailJobLogIds(1000); + if (failLogIds != null && !failLogIds.isEmpty()) { + for (long failLogId : failLogIds) { - XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().updateAlarmStatus(failLogId, -1, newAlarmStatus); - } - } + // lock log + int lockRet = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().updateAlarmStatus(failLogId, 0, -1); + if (lockRet < 1) { + continue; + } + XxlJobLog log = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().load(failLogId); + XxlJobInfo info = XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao().loadById(log.getJobId()); - } catch (Exception e) { - if (!toStop) { - logger.error(">>>>>>>>>>> xxl-job, job fail monitor thread error:{}", e); - } - } + // 1、fail retry monitor + if (log.getExecutorFailRetryCount() > 0) { + JobTriggerPoolHelper.trigger(log.getJobId(), TriggerTypeEnum.RETRY, (log.getExecutorFailRetryCount() - 1), log.getExecutorShardingParam(), log.getExecutorParam(), null); + String retryMsg = "

>>>>>>>>>>>" + I18nUtil.getString("jobconf_trigger_type_retry") + "<<<<<<<<<<<
"; + log.setTriggerMsg(log.getTriggerMsg() + retryMsg); + XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().updateTriggerInfo(log); + } + + // 2、fail alarm monitor + int newAlarmStatus = 0; // 告警状态:0-默认、-1=锁定状态、1-无需告警、2-告警成功、3-告警失败 + if (info != null && info.getAlarmEmail() != null && info.getAlarmEmail().trim().length() > 0) { + boolean alarmResult = XxlJobAdminConfig.getAdminConfig().getJobAlarmer().alarm(info, log); + newAlarmStatus = alarmResult ? 2 : 3; + } else { + newAlarmStatus = 1; + } + + XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().updateAlarmStatus(failLogId, -1, newAlarmStatus); + } + } + + } catch (Exception e) { + if (!toStop) { + logger.error(">>>>>>>>>>> xxl-job, job fail monitor thread error:{}" , e); + } + } try { TimeUnit.SECONDS.sleep(10); @@ -87,24 +89,24 @@ public class JobFailMonitorHelper { } - logger.info(">>>>>>>>>>> xxl-job, job fail monitor thread stop"); + logger.info(">>>>>>>>>>> xxl-job, job fail monitor thread stop"); - } - }); - monitorThread.setDaemon(true); - monitorThread.setName("xxl-job, admin JobFailMonitorHelper"); - monitorThread.start(); - } + } + }); + monitorThread.setDaemon(true); + monitorThread.setName("xxl-job, admin JobFailMonitorHelper"); + monitorThread.start(); + } - public void toStop(){ - toStop = true; - // interrupt and wait - monitorThread.interrupt(); - try { - monitorThread.join(); - } catch (InterruptedException e) { - logger.error(e.getMessage(), e); - } - } + public void toStop() { + toStop = true; + // interrupt and wait + monitorThread.interrupt(); + try { + monitorThread.join(); + } catch (InterruptedException e) { + logger.error(e.getMessage(), e); + } + } } diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryHelper.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryHelper.java index 37edfd985..a73fd7cd6 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryHelper.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryHelper.java @@ -15,190 +15,192 @@ import java.util.concurrent.*; /** * job registry instance + * * @author xuxueli 2016-10-02 19:10:24 */ public class JobRegistryHelper { - private static Logger logger = LoggerFactory.getLogger(JobRegistryHelper.class); + private static Logger logger = LoggerFactory.getLogger(JobRegistryHelper.class); - private static JobRegistryHelper instance = new JobRegistryHelper(); - public static JobRegistryHelper getInstance(){ - return instance; - } + private static JobRegistryHelper instance = new JobRegistryHelper(); - private ThreadPoolExecutor registryOrRemoveThreadPool = null; - private Thread registryMonitorThread; - private volatile boolean toStop = false; + public static JobRegistryHelper getInstance() { + return instance; + } - public void start(){ + private ThreadPoolExecutor registryOrRemoveThreadPool = null; + private Thread registryMonitorThread; + private volatile boolean toStop = false; - // for registry or remove - registryOrRemoveThreadPool = new ThreadPoolExecutor( - 2, - 10, - 30L, - TimeUnit.SECONDS, - new LinkedBlockingQueue(2000), - new ThreadFactory() { - @Override - public Thread newThread(Runnable r) { - return new Thread(r, "xxl-job, admin JobRegistryMonitorHelper-registryOrRemoveThreadPool-" + r.hashCode()); - } - }, - new RejectedExecutionHandler() { - @Override - public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { - r.run(); - logger.warn(">>>>>>>>>>> xxl-job, registry or remove too fast, match threadpool rejected handler(run now)."); - } - }); + public void start() { - // for monitor - registryMonitorThread = new Thread(new Runnable() { - @Override - public void run() { - while (!toStop) { - try { - // auto registry group - List groupList = XxlJobAdminConfig.getAdminConfig().getXxlJobGroupDao().findByAddressType(0); - if (groupList!=null && !groupList.isEmpty()) { + // for registry or remove + registryOrRemoveThreadPool = new ThreadPoolExecutor( + 2, + 10, + 30L, + TimeUnit.SECONDS, + new LinkedBlockingQueue(2000), + new ThreadFactory() { + @Override + public Thread newThread(Runnable r) { + return new Thread(r, "xxl-job, admin JobRegistryMonitorHelper-registryOrRemoveThreadPool-" + r.hashCode()); + } + }, + new RejectedExecutionHandler() { + @Override + public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { + r.run(); + logger.warn(">>>>>>>>>>> xxl-job, registry or remove too fast, match threadpool rejected handler(run now)."); + } + }); - // remove dead address (admin/executor) - List ids = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().findDead(RegistryConfig.DEAD_TIMEOUT, new Date()); - if (ids!=null && ids.size()>0) { - XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().removeDead(ids); - } + // for monitor + registryMonitorThread = new Thread(new Runnable() { + @Override + public void run() { + while (!toStop) { + try { + // auto registry group + List groupList = XxlJobAdminConfig.getAdminConfig().getXxlJobGroupDao().findByAddressType(0); + if (groupList != null && !groupList.isEmpty()) { - // fresh online address (admin/executor) - HashMap> appAddressMap = new HashMap>(); - List list = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().findAll(RegistryConfig.DEAD_TIMEOUT, new Date()); - if (list != null) { - for (XxlJobRegistry item: list) { - if (RegistryConfig.RegistType.EXECUTOR.name().equals(item.getRegistryGroup())) { - String appname = item.getRegistryKey(); - List registryList = appAddressMap.get(appname); - if (registryList == null) { - registryList = new ArrayList(); - } + // remove dead address (admin/executor) + List ids = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().findDead(RegistryConfig.DEAD_TIMEOUT, new Date()); + if (ids != null && ids.size() > 0) { + XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().removeDead(ids); + } - if (!registryList.contains(item.getRegistryValue())) { - registryList.add(item.getRegistryValue()); - } - appAddressMap.put(appname, registryList); - } - } - } + // fresh online address (admin/executor) + HashMap> appAddressMap = new HashMap>(); + List list = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().findAll(RegistryConfig.DEAD_TIMEOUT, new Date()); + if (list != null) { + for (XxlJobRegistry item : list) { + if (RegistryConfig.RegistType.EXECUTOR.name().equals(item.getRegistryGroup())) { + String appname = item.getRegistryKey(); + List registryList = appAddressMap.get(appname); + if (registryList == null) { + registryList = new ArrayList(); + } - // fresh group address - for (XxlJobGroup group: groupList) { - List registryList = appAddressMap.get(group.getAppname()); - String addressListStr = null; - if (registryList!=null && !registryList.isEmpty()) { - Collections.sort(registryList); - StringBuilder addressListSB = new StringBuilder(); - for (String item:registryList) { - addressListSB.append(item).append(","); - } - addressListStr = addressListSB.toString(); - addressListStr = addressListStr.substring(0, addressListStr.length()-1); - } - group.setAddressList(addressListStr); - group.setUpdateTime(new Date()); + if (!registryList.contains(item.getRegistryValue())) { + registryList.add(item.getRegistryValue()); + } + appAddressMap.put(appname, registryList); + } + } + } - XxlJobAdminConfig.getAdminConfig().getXxlJobGroupDao().update(group); - } - } - } catch (Exception e) { - if (!toStop) { - logger.error(">>>>>>>>>>> xxl-job, job registry monitor thread error:{}", e); - } - } - try { - TimeUnit.SECONDS.sleep(RegistryConfig.BEAT_TIMEOUT); - } catch (InterruptedException e) { - if (!toStop) { - logger.error(">>>>>>>>>>> xxl-job, job registry monitor thread error:{}", e); - } - } - } - logger.info(">>>>>>>>>>> xxl-job, job registry monitor thread stop"); - } - }); - registryMonitorThread.setDaemon(true); - registryMonitorThread.setName("xxl-job, admin JobRegistryMonitorHelper-registryMonitorThread"); - registryMonitorThread.start(); - } + // fresh group address + for (XxlJobGroup group : groupList) { + List registryList = appAddressMap.get(group.getAppname()); + String addressListStr = null; + if (registryList != null && !registryList.isEmpty()) { + Collections.sort(registryList); + StringBuilder addressListSB = new StringBuilder(); + for (String item : registryList) { + addressListSB.append(item).append(","); + } + addressListStr = addressListSB.toString(); + addressListStr = addressListStr.substring(0, addressListStr.length() - 1); + } + group.setAddressList(addressListStr); + group.setUpdateTime(new Date()); - public void toStop(){ - toStop = true; + XxlJobAdminConfig.getAdminConfig().getXxlJobGroupDao().update(group); + } + } + } catch (Exception e) { + if (!toStop) { + logger.error(">>>>>>>>>>> xxl-job, job registry monitor thread error:{}" , e); + } + } + try { + TimeUnit.SECONDS.sleep(RegistryConfig.BEAT_TIMEOUT); + } catch (InterruptedException e) { + if (!toStop) { + logger.error(">>>>>>>>>>> xxl-job, job registry monitor thread error:{}" , e); + } + } + } + logger.info(">>>>>>>>>>> xxl-job, job registry monitor thread stop"); + } + }); + registryMonitorThread.setDaemon(true); + registryMonitorThread.setName("xxl-job, admin JobRegistryMonitorHelper-registryMonitorThread"); + registryMonitorThread.start(); + } - // stop registryOrRemoveThreadPool - registryOrRemoveThreadPool.shutdownNow(); + public void toStop() { + toStop = true; - // stop monitir (interrupt and wait) - registryMonitorThread.interrupt(); - try { - registryMonitorThread.join(); - } catch (InterruptedException e) { - logger.error(e.getMessage(), e); - } - } + // stop registryOrRemoveThreadPool + registryOrRemoveThreadPool.shutdownNow(); + + // stop monitir (interrupt and wait) + registryMonitorThread.interrupt(); + try { + registryMonitorThread.join(); + } catch (InterruptedException e) { + logger.error(e.getMessage(), e); + } + } - // ---------------------- helper ---------------------- + // ---------------------- helper ---------------------- - public ReturnT registry(RegistryParam registryParam) { + public ReturnT registry(RegistryParam registryParam) { - // valid - if (!StringUtils.hasText(registryParam.getRegistryGroup()) - || !StringUtils.hasText(registryParam.getRegistryKey()) - || !StringUtils.hasText(registryParam.getRegistryValue())) { - return new ReturnT(ReturnT.FAIL_CODE, "Illegal Argument."); - } + // valid + if (!StringUtils.hasText(registryParam.getRegistryGroup()) + || !StringUtils.hasText(registryParam.getRegistryKey()) + || !StringUtils.hasText(registryParam.getRegistryValue())) { + return new ReturnT(ReturnT.FAIL_CODE, "Illegal Argument."); + } - // async execute - registryOrRemoveThreadPool.execute(new Runnable() { - @Override - public void run() { - int ret = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().registryUpdate(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue(), new Date()); - if (ret < 1) { - XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().registrySave(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue(), new Date()); + // async execute + registryOrRemoveThreadPool.execute(new Runnable() { + @Override + public void run() { + int ret = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().registryUpdate(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue(), new Date()); + if (ret < 1) { + XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().registrySave(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue(), new Date()); - // fresh - freshGroupRegistryInfo(registryParam); - } - } - }); + // fresh + freshGroupRegistryInfo(registryParam); + } + } + }); - return ReturnT.SUCCESS; - } + return ReturnT.SUCCESS; + } - public ReturnT registryRemove(RegistryParam registryParam) { + public ReturnT registryRemove(RegistryParam registryParam) { - // valid - if (!StringUtils.hasText(registryParam.getRegistryGroup()) - || !StringUtils.hasText(registryParam.getRegistryKey()) - || !StringUtils.hasText(registryParam.getRegistryValue())) { - return new ReturnT(ReturnT.FAIL_CODE, "Illegal Argument."); - } + // valid + if (!StringUtils.hasText(registryParam.getRegistryGroup()) + || !StringUtils.hasText(registryParam.getRegistryKey()) + || !StringUtils.hasText(registryParam.getRegistryValue())) { + return new ReturnT(ReturnT.FAIL_CODE, "Illegal Argument."); + } - // async execute - registryOrRemoveThreadPool.execute(new Runnable() { - @Override - public void run() { - int ret = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().registryDelete(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue()); - if (ret > 0) { - // fresh - freshGroupRegistryInfo(registryParam); - } - } - }); + // async execute + registryOrRemoveThreadPool.execute(new Runnable() { + @Override + public void run() { + int ret = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().registryDelete(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue()); + if (ret > 0) { + // fresh + freshGroupRegistryInfo(registryParam); + } + } + }); - return ReturnT.SUCCESS; - } + return ReturnT.SUCCESS; + } - private void freshGroupRegistryInfo(RegistryParam registryParam){ - // Under consideration, prevent affecting core tables - } + private void freshGroupRegistryInfo(RegistryParam registryParam) { + // Under consideration, prevent affecting core tables + } } diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobTriggerPoolHelper.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobTriggerPoolHelper.java index 398713dd9..775b916b1 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobTriggerPoolHelper.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobTriggerPoolHelper.java @@ -24,32 +24,32 @@ public class JobTriggerPoolHelper { private ThreadPoolExecutor fastTriggerPool = null; private ThreadPoolExecutor slowTriggerPool = null; - public void start(){ + public void start() { fastTriggerPool = new ThreadPoolExecutor( - 10, - XxlJobAdminConfig.getAdminConfig().getTriggerPoolFastMax(), - 60L, - TimeUnit.SECONDS, - new LinkedBlockingQueue(1000), - new ThreadFactory() { - @Override - public Thread newThread(Runnable r) { - return new Thread(r, "xxl-job, admin JobTriggerPoolHelper-fastTriggerPool-" + r.hashCode()); - } - }); + 10, + XxlJobAdminConfig.getAdminConfig().getTriggerPoolFastMax(), + 60L, + TimeUnit.SECONDS, + new LinkedBlockingQueue(1000), + new ThreadFactory() { + @Override + public Thread newThread(Runnable r) { + return new Thread(r, "xxl-job, admin JobTriggerPoolHelper-fastTriggerPool-" + r.hashCode()); + } + }); slowTriggerPool = new ThreadPoolExecutor( - 10, - XxlJobAdminConfig.getAdminConfig().getTriggerPoolSlowMax(), - 60L, - TimeUnit.SECONDS, - new LinkedBlockingQueue(2000), - new ThreadFactory() { - @Override - public Thread newThread(Runnable r) { - return new Thread(r, "xxl-job, admin JobTriggerPoolHelper-slowTriggerPool-" + r.hashCode()); - } - }); + 10, + XxlJobAdminConfig.getAdminConfig().getTriggerPoolSlowMax(), + 60L, + TimeUnit.SECONDS, + new LinkedBlockingQueue(2000), + new ThreadFactory() { + @Override + public Thread newThread(Runnable r) { + return new Thread(r, "xxl-job, admin JobTriggerPoolHelper-slowTriggerPool-" + r.hashCode()); + } + }); } @@ -62,7 +62,7 @@ public class JobTriggerPoolHelper { // job timeout count - private volatile long minTim = System.currentTimeMillis()/60000; // ms > min + private volatile long minTim = System.currentTimeMillis() / 60000; // ms > min private volatile ConcurrentMap jobTimeoutCountMap = new ConcurrentHashMap<>(); @@ -79,7 +79,7 @@ public class JobTriggerPoolHelper { // choose thread pool ThreadPoolExecutor triggerPool_ = fastTriggerPool; AtomicInteger jobTimeoutCount = jobTimeoutCountMap.get(jobId); - if (jobTimeoutCount!=null && jobTimeoutCount.get() > 10) { // job-timeout 10 times in 1 min + if (jobTimeoutCount != null && jobTimeoutCount.get() > 10) { // job-timeout 10 times in 1 min triggerPool_ = slowTriggerPool; } @@ -98,14 +98,14 @@ public class JobTriggerPoolHelper { } finally { // check timeout-count-map - long minTim_now = System.currentTimeMillis()/60000; + long minTim_now = System.currentTimeMillis() / 60000; if (minTim != minTim_now) { minTim = minTim_now; jobTimeoutCountMap.clear(); } // incr timeout-count-map - long cost = System.currentTimeMillis()-start; + long cost = System.currentTimeMillis() - start; if (cost > 500) { // ob-timeout threshold 500ms AtomicInteger timeoutCount = jobTimeoutCountMap.putIfAbsent(jobId, new AtomicInteger(1)); if (timeoutCount != null) { @@ -120,7 +120,6 @@ public class JobTriggerPoolHelper { } - // ---------------------- helper ---------------------- private static JobTriggerPoolHelper helper = new JobTriggerPoolHelper(); @@ -128,6 +127,7 @@ public class JobTriggerPoolHelper { public static void toStart() { helper.start(); } + public static void toStop() { helper.stop(); } @@ -135,13 +135,11 @@ public class JobTriggerPoolHelper { /** * @param jobId * @param triggerType - * @param failRetryCount - * >=0: use this param - * <0: use param from job info config + * @param failRetryCount >=0: use this param + * <0: use param from job info config * @param executorShardingParam - * @param executorParam - * null: use job param - * not null: cover job param + * @param executorParam null: use job param + * not null: cover job param */ public static void trigger(int jobId, TriggerTypeEnum triggerType, int failRetryCount, String executorShardingParam, String executorParam, String addressList) { helper.addTrigger(jobId, triggerType, failRetryCount, executorShardingParam, executorParam, addressList); diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/CookieUtil.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/CookieUtil.java index a1523aa47..297e97a38 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/CookieUtil.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/CookieUtil.java @@ -11,88 +11,88 @@ import javax.servlet.http.HttpServletResponse; */ public class CookieUtil { - // 默认缓存时间,单位/秒, 2H - private static final int COOKIE_MAX_AGE = Integer.MAX_VALUE; - // 保存路径,根路径 - private static final String COOKIE_PATH = "/"; - - /** - * 保存 - * - * @param response - * @param key - * @param value - * @param ifRemember - */ - public static void set(HttpServletResponse response, String key, String value, boolean ifRemember) { - int age = ifRemember?COOKIE_MAX_AGE:-1; - set(response, key, value, null, COOKIE_PATH, age, true); - } + // 默认缓存时间,单位/秒, 2H + private static final int COOKIE_MAX_AGE = Integer.MAX_VALUE; + // 保存路径,根路径 + private static final String COOKIE_PATH = "/"; - /** - * 保存 - * - * @param response - * @param key - * @param value - * @param maxAge - */ - private static void set(HttpServletResponse response, String key, String value, String domain, String path, int maxAge, boolean isHttpOnly) { - Cookie cookie = new Cookie(key, value); - if (domain != null) { - cookie.setDomain(domain); - } - cookie.setPath(path); - cookie.setMaxAge(maxAge); - cookie.setHttpOnly(isHttpOnly); - response.addCookie(cookie); - } - - /** - * 查询value - * - * @param request - * @param key - * @return - */ - public static String getValue(HttpServletRequest request, String key) { - Cookie cookie = get(request, key); - if (cookie != null) { - return cookie.getValue(); - } - return null; - } + /** + * 保存 + * + * @param response + * @param key + * @param value + * @param ifRemember + */ + public static void set(HttpServletResponse response, String key, String value, boolean ifRemember) { + int age = ifRemember ? COOKIE_MAX_AGE : -1; + set(response, key, value, null, COOKIE_PATH, age, true); + } - /** - * 查询Cookie - * - * @param request - * @param key - */ - private static Cookie get(HttpServletRequest request, String key) { - Cookie[] arr_cookie = request.getCookies(); - if (arr_cookie != null && arr_cookie.length > 0) { - for (Cookie cookie : arr_cookie) { - if (cookie.getName().equals(key)) { - return cookie; - } - } - } - return null; - } - - /** - * 删除Cookie - * - * @param request - * @param response - * @param key - */ - public static void remove(HttpServletRequest request, HttpServletResponse response, String key) { - Cookie cookie = get(request, key); - if (cookie != null) { - set(response, key, "", null, COOKIE_PATH, 0, true); - } - } + /** + * 保存 + * + * @param response + * @param key + * @param value + * @param maxAge + */ + private static void set(HttpServletResponse response, String key, String value, String domain, String path, int maxAge, boolean isHttpOnly) { + Cookie cookie = new Cookie(key, value); + if (domain != null) { + cookie.setDomain(domain); + } + cookie.setPath(path); + cookie.setMaxAge(maxAge); + cookie.setHttpOnly(isHttpOnly); + response.addCookie(cookie); + } -} \ No newline at end of file + /** + * 查询value + * + * @param request + * @param key + * @return + */ + public static String getValue(HttpServletRequest request, String key) { + Cookie cookie = get(request, key); + if (cookie != null) { + return cookie.getValue(); + } + return null; + } + + /** + * 查询Cookie + * + * @param request + * @param key + */ + private static Cookie get(HttpServletRequest request, String key) { + Cookie[] arr_cookie = request.getCookies(); + if (arr_cookie != null && arr_cookie.length > 0) { + for (Cookie cookie : arr_cookie) { + if (cookie.getName().equals(key)) { + return cookie; + } + } + } + return null; + } + + /** + * 删除Cookie + * + * @param request + * @param response + * @param key + */ + public static void remove(HttpServletRequest request, HttpServletResponse response, String key) { + Cookie cookie = get(request, key); + if (cookie != null) { + set(response, key, "" , null, COOKIE_PATH, 0, true); + } + } + +} diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/JacksonUtil.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/JacksonUtil.java index 4f4ea3ccb..a75595683 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/JacksonUtil.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/JacksonUtil.java @@ -12,81 +12,82 @@ import java.io.IOException; /** * Jackson util - * + *

* 1、obj need private and set/get; * 2、do not support inner class; - * + * * @author xuxueli 2015-9-25 18:02:56 */ public class JacksonUtil { - private static Logger logger = LoggerFactory.getLogger(JacksonUtil.class); + private static Logger logger = LoggerFactory.getLogger(JacksonUtil.class); private final static ObjectMapper objectMapper = new ObjectMapper(); + public static ObjectMapper getInstance() { return objectMapper; } /** * bean、array、List、Map --> json - * + * * @param obj * @return json string * @throws Exception */ public static String writeValueAsString(Object obj) { - try { - return getInstance().writeValueAsString(obj); - } catch (JsonGenerationException e) { - logger.error(e.getMessage(), e); - } catch (JsonMappingException e) { - logger.error(e.getMessage(), e); - } catch (IOException e) { - logger.error(e.getMessage(), e); - } + try { + return getInstance().writeValueAsString(obj); + } catch (JsonGenerationException e) { + logger.error(e.getMessage(), e); + } catch (JsonMappingException e) { + logger.error(e.getMessage(), e); + } catch (IOException e) { + logger.error(e.getMessage(), e); + } return null; } /** * string --> bean、Map、List(array) - * + * * @param jsonStr * @param clazz * @return obj * @throws Exception */ public static T readValue(String jsonStr, Class clazz) { - try { - return getInstance().readValue(jsonStr, clazz); - } catch (JsonParseException e) { - logger.error(e.getMessage(), e); - } catch (JsonMappingException e) { - logger.error(e.getMessage(), e); - } catch (IOException e) { - logger.error(e.getMessage(), e); - } - return null; + try { + return getInstance().readValue(jsonStr, clazz); + } catch (JsonParseException e) { + logger.error(e.getMessage(), e); + } catch (JsonMappingException e) { + logger.error(e.getMessage(), e); + } catch (IOException e) { + logger.error(e.getMessage(), e); + } + return null; } - /** - * string --> List... - * - * @param jsonStr - * @param parametrized - * @param parameterClasses - * @param - * @return - */ - public static T readValue(String jsonStr, Class parametrized, Class... parameterClasses) { - try { - JavaType javaType = getInstance().getTypeFactory().constructParametricType(parametrized, parameterClasses); - return getInstance().readValue(jsonStr, javaType); - } catch (JsonParseException e) { - logger.error(e.getMessage(), e); - } catch (JsonMappingException e) { - logger.error(e.getMessage(), e); - } catch (IOException e) { - logger.error(e.getMessage(), e); - } - return null; - } + /** + * string --> List... + * + * @param jsonStr + * @param parametrized + * @param parameterClasses + * @param + * @return + */ + public static T readValue(String jsonStr, Class parametrized, Class... parameterClasses) { + try { + JavaType javaType = getInstance().getTypeFactory().constructParametricType(parametrized, parameterClasses); + return getInstance().readValue(jsonStr, javaType); + } catch (JsonParseException e) { + logger.error(e.getMessage(), e); + } catch (JsonMappingException e) { + logger.error(e.getMessage(), e); + } catch (IOException e) { + logger.error(e.getMessage(), e); + } + return null; + } } diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobInfoDao.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobInfoDao.java index d640efffe..e01dd1121 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobInfoDao.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobInfoDao.java @@ -9,41 +9,43 @@ import java.util.List; /** * job info + * * @author xuxueli 2016-1-12 18:03:45 */ @Mapper public interface XxlJobInfoDao { - public List pageList(@Param("offset") int offset, - @Param("pagesize") int pagesize, - @Param("jobGroup") int jobGroup, - @Param("triggerStatus") int triggerStatus, - @Param("jobDesc") String jobDesc, - @Param("executorHandler") String executorHandler, - @Param("author") String author); - public int pageListCount(@Param("offset") int offset, - @Param("pagesize") int pagesize, - @Param("jobGroup") int jobGroup, - @Param("triggerStatus") int triggerStatus, - @Param("jobDesc") String jobDesc, - @Param("executorHandler") String executorHandler, - @Param("author") String author); - - public int save(XxlJobInfo info); + public List pageList(@Param("offset") int offset, + @Param("pagesize") int pagesize, + @Param("jobGroup") int jobGroup, + @Param("triggerStatus") int triggerStatus, + @Param("jobDesc") String jobDesc, + @Param("executorHandler") String executorHandler, + @Param("author") String author); - public XxlJobInfo loadById(@Param("id") int id); - - public int update(XxlJobInfo xxlJobInfo); - - public int delete(@Param("id") long id); + public int pageListCount(@Param("offset") int offset, + @Param("pagesize") int pagesize, + @Param("jobGroup") int jobGroup, + @Param("triggerStatus") int triggerStatus, + @Param("jobDesc") String jobDesc, + @Param("executorHandler") String executorHandler, + @Param("author") String author); - public List getJobsByGroup(@Param("jobGroup") int jobGroup); + public int save(XxlJobInfo info); - public int findAllCount(); + public XxlJobInfo loadById(@Param("id") int id); - public List scheduleJobQuery(@Param("maxNextTime") long maxNextTime, @Param("pagesize") int pagesize ); + public int update(XxlJobInfo xxlJobInfo); - public int scheduleUpdate(XxlJobInfo xxlJobInfo); + public int delete(@Param("id") long id); + + public List getJobsByGroup(@Param("jobGroup") int jobGroup); + + public int findAllCount(); + + public List scheduleJobQuery(@Param("maxNextTime") long maxNextTime, @Param("pagesize") int pagesize); + + public int scheduleUpdate(XxlJobInfo xxlJobInfo); } diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogDao.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogDao.java index 62fa3b4f9..7beaf7556 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogDao.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogDao.java @@ -10,53 +10,56 @@ import java.util.Map; /** * job log + * * @author xuxueli 2016-1-12 18:03:06 */ @Mapper public interface XxlJobLogDao { - // exist jobId not use jobGroup, not exist use jobGroup - public List pageList(@Param("offset") int offset, - @Param("pagesize") int pagesize, - @Param("jobGroup") int jobGroup, - @Param("jobId") int jobId, - @Param("triggerTimeStart") Date triggerTimeStart, - @Param("triggerTimeEnd") Date triggerTimeEnd, - @Param("logStatus") int logStatus); - public int pageListCount(@Param("offset") int offset, - @Param("pagesize") int pagesize, - @Param("jobGroup") int jobGroup, - @Param("jobId") int jobId, - @Param("triggerTimeStart") Date triggerTimeStart, - @Param("triggerTimeEnd") Date triggerTimeEnd, - @Param("logStatus") int logStatus); - - public XxlJobLog load(@Param("id") long id); + // exist jobId not use jobGroup, not exist use jobGroup + public List pageList(@Param("offset") int offset, + @Param("pagesize") int pagesize, + @Param("jobGroup") int jobGroup, + @Param("jobId") int jobId, + @Param("triggerTimeStart") Date triggerTimeStart, + @Param("triggerTimeEnd") Date triggerTimeEnd, + @Param("logStatus") int logStatus); - public long save(XxlJobLog xxlJobLog); + public int pageListCount(@Param("offset") int offset, + @Param("pagesize") int pagesize, + @Param("jobGroup") int jobGroup, + @Param("jobId") int jobId, + @Param("triggerTimeStart") Date triggerTimeStart, + @Param("triggerTimeEnd") Date triggerTimeEnd, + @Param("logStatus") int logStatus); - public int updateTriggerInfo(XxlJobLog xxlJobLog); + public XxlJobLog load(@Param("id") long id); - public int updateHandleInfo(XxlJobLog xxlJobLog); - - public int delete(@Param("jobId") int jobId); + public long save(XxlJobLog xxlJobLog); - public Map findLogReport(@Param("from") Date from, - @Param("to") Date to); + public int updateTriggerInfo(XxlJobLog xxlJobLog); - public List findClearLogIds(@Param("jobGroup") int jobGroup, - @Param("jobId") int jobId, - @Param("clearBeforeTime") Date clearBeforeTime, - @Param("clearBeforeNum") int clearBeforeNum, - @Param("pagesize") int pagesize); - public int clearLog(@Param("logIds") List logIds); + public int updateHandleInfo(XxlJobLog xxlJobLog); - public List findFailJobLogIds(@Param("pagesize") int pagesize); + public int delete(@Param("jobId") int jobId); - public int updateAlarmStatus(@Param("logId") long logId, - @Param("oldAlarmStatus") int oldAlarmStatus, - @Param("newAlarmStatus") int newAlarmStatus); + public Map findLogReport(@Param("from") Date from, + @Param("to") Date to); - public List findLostJobIds(@Param("losedTime") Date losedTime); + public List findClearLogIds(@Param("jobGroup") int jobGroup, + @Param("jobId") int jobId, + @Param("clearBeforeTime") Date clearBeforeTime, + @Param("clearBeforeNum") int clearBeforeNum, + @Param("pagesize") int pagesize); + + public int clearLog(@Param("logIds") List logIds); + + public List findFailJobLogIds(@Param("pagesize") int pagesize); + + public int updateAlarmStatus(@Param("logId") long logId, + @Param("oldAlarmStatus") int oldAlarmStatus, + @Param("newAlarmStatus") int newAlarmStatus); + + public List findLostJobIds(@Param("losedTime") Date losedTime); } diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogGlueDao.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogGlueDao.java index 3028aed22..8b2b414ce 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogGlueDao.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogGlueDao.java @@ -8,17 +8,18 @@ import java.util.List; /** * job log for glue + * * @author xuxueli 2016-5-19 18:04:56 */ @Mapper public interface XxlJobLogGlueDao { - - public int save(XxlJobLogGlue xxlJobLogGlue); - - public List findByJobId(@Param("jobId") int jobId); - public int removeOld(@Param("jobId") int jobId, @Param("limit") int limit); + public int save(XxlJobLogGlue xxlJobLogGlue); + + public List findByJobId(@Param("jobId") int jobId); + + public int removeOld(@Param("jobId") int jobId, @Param("limit") int limit); + + public int deleteByJobId(@Param("jobId") int jobId); - public int deleteByJobId(@Param("jobId") int jobId); - } diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogReportDao.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogReportDao.java index f4b3dc81e..d4e0381a1 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogReportDao.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogReportDao.java @@ -9,18 +9,19 @@ import java.util.List; /** * job log + * * @author xuxueli 2019-11-22 */ @Mapper public interface XxlJobLogReportDao { - public int save(XxlJobLogReport xxlJobLogReport); + public int save(XxlJobLogReport xxlJobLogReport); - public int update(XxlJobLogReport xxlJobLogReport); + public int update(XxlJobLogReport xxlJobLogReport); - public List queryLogReport(@Param("triggerDayFrom") Date triggerDayFrom, - @Param("triggerDayTo") Date triggerDayTo); + public List queryLogReport(@Param("triggerDayFrom") Date triggerDayFrom, + @Param("triggerDayTo") Date triggerDayTo); - public XxlJobLogReport queryLogReportTotal(); + public XxlJobLogReport queryLogReportTotal(); } diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobUserDao.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobUserDao.java index e84049475..064ce19f3 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobUserDao.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobUserDao.java @@ -3,6 +3,7 @@ package com.xxl.job.admin.dao; import com.xxl.job.admin.core.model.XxlJobUser; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; + import java.util.List; /** @@ -11,21 +12,22 @@ import java.util.List; @Mapper public interface XxlJobUserDao { - public List pageList(@Param("offset") int offset, + public List pageList(@Param("offset") int offset, @Param("pagesize") int pagesize, @Param("username") String username, - @Param("role") int role); - public int pageListCount(@Param("offset") int offset, - @Param("pagesize") int pagesize, - @Param("username") String username, - @Param("role") int role); + @Param("role") int role); - public XxlJobUser loadByUserName(@Param("username") String username); + public int pageListCount(@Param("offset") int offset, + @Param("pagesize") int pagesize, + @Param("username") String username, + @Param("role") int role); - public int save(XxlJobUser xxlJobUser); + public XxlJobUser loadByUserName(@Param("username") String username); - public int update(XxlJobUser xxlJobUser); - - public int delete(@Param("id") int id); + public int save(XxlJobUser xxlJobUser); + + public int update(XxlJobUser xxlJobUser); + + public int delete(@Param("id") int id); } diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/service/XxlJobService.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/service/XxlJobService.java index 61da3a27c..43c2eff64 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/service/XxlJobService.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/service/XxlJobService.java @@ -9,78 +9,79 @@ import java.util.Map; /** * core job action for xxl-job - * + * * @author xuxueli 2016-5-28 15:30:33 */ public interface XxlJobService { - /** - * page list - * - * @param start - * @param length - * @param jobGroup - * @param jobDesc - * @param executorHandler - * @param author - * @return - */ - public Map pageList(int start, int length, int jobGroup, int triggerStatus, String jobDesc, String executorHandler, String author); + /** + * page list + * + * @param start + * @param length + * @param jobGroup + * @param jobDesc + * @param executorHandler + * @param author + * @return + */ + public Map pageList(int start, int length, int jobGroup, int triggerStatus, String jobDesc, String executorHandler, String author); - /** - * add job - * - * @param jobInfo - * @return - */ - public ReturnT add(XxlJobInfo jobInfo); + /** + * add job + * + * @param jobInfo + * @return + */ + public ReturnT add(XxlJobInfo jobInfo); - /** - * update job - * - * @param jobInfo - * @return - */ - public ReturnT update(XxlJobInfo jobInfo); + /** + * update job + * + * @param jobInfo + * @return + */ + public ReturnT update(XxlJobInfo jobInfo); - /** - * remove job - * * - * @param id - * @return - */ - public ReturnT remove(int id); + /** + * remove job + * * + * + * @param id + * @return + */ + public ReturnT remove(int id); - /** - * start job - * - * @param id - * @return - */ - public ReturnT start(int id); + /** + * start job + * + * @param id + * @return + */ + public ReturnT start(int id); - /** - * stop job - * - * @param id - * @return - */ - public ReturnT stop(int id); + /** + * stop job + * + * @param id + * @return + */ + public ReturnT stop(int id); - /** - * dashboard info - * - * @return - */ - public Map dashboardInfo(); + /** + * dashboard info + * + * @return + */ + public Map dashboardInfo(); - /** - * chart info - * - * @param startDate - * @param endDate - * @return - */ - public ReturnT> chartInfo(Date startDate, Date endDate); + /** + * chart info + * + * @param startDate + * @param endDate + * @return + */ + public ReturnT> chartInfo(Date startDate, Date endDate); } diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java index 530ee41c8..f8f0b4331 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java @@ -25,410 +25,411 @@ import java.util.*; /** * core job action for xxl-job + * * @author xuxueli 2016-5-28 15:30:33 */ @Service public class XxlJobServiceImpl implements XxlJobService { - private static Logger logger = LoggerFactory.getLogger(XxlJobServiceImpl.class); + private static Logger logger = LoggerFactory.getLogger(XxlJobServiceImpl.class); - @Resource - private XxlJobGroupDao xxlJobGroupDao; - @Resource - private XxlJobInfoDao xxlJobInfoDao; - @Resource - public XxlJobLogDao xxlJobLogDao; - @Resource - private XxlJobLogGlueDao xxlJobLogGlueDao; - @Resource - private XxlJobLogReportDao xxlJobLogReportDao; - - @Override - public Map pageList(int start, int length, int jobGroup, int triggerStatus, String jobDesc, String executorHandler, String author) { + @Resource + private XxlJobGroupDao xxlJobGroupDao; + @Resource + private XxlJobInfoDao xxlJobInfoDao; + @Resource + public XxlJobLogDao xxlJobLogDao; + @Resource + private XxlJobLogGlueDao xxlJobLogGlueDao; + @Resource + private XxlJobLogReportDao xxlJobLogReportDao; - // page list - List list = xxlJobInfoDao.pageList(start, length, jobGroup, triggerStatus, jobDesc, executorHandler, author); - int list_count = xxlJobInfoDao.pageListCount(start, length, jobGroup, triggerStatus, jobDesc, executorHandler, author); - - // package result - Map maps = new HashMap(); - maps.put("recordsTotal", list_count); // 总记录数 - maps.put("recordsFiltered", list_count); // 过滤后的总记录数 - maps.put("data", list); // 分页列表 - return maps; - } + @Override + public Map pageList(int start, int length, int jobGroup, int triggerStatus, String jobDesc, String executorHandler, String author) { - @Override - public ReturnT add(XxlJobInfo jobInfo) { + // page list + List list = xxlJobInfoDao.pageList(start, length, jobGroup, triggerStatus, jobDesc, executorHandler, author); + int list_count = xxlJobInfoDao.pageListCount(start, length, jobGroup, triggerStatus, jobDesc, executorHandler, author); - // valid base - XxlJobGroup group = xxlJobGroupDao.load(jobInfo.getJobGroup()); - if (group == null) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("system_please_choose")+I18nUtil.getString("jobinfo_field_jobgroup")) ); - } - if (jobInfo.getJobDesc()==null || jobInfo.getJobDesc().trim().length()==0) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("system_please_input")+I18nUtil.getString("jobinfo_field_jobdesc")) ); - } - if (jobInfo.getAuthor()==null || jobInfo.getAuthor().trim().length()==0) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("system_please_input")+I18nUtil.getString("jobinfo_field_author")) ); - } + // package result + Map maps = new HashMap(); + maps.put("recordsTotal" , list_count); // 总记录数 + maps.put("recordsFiltered" , list_count); // 过滤后的总记录数 + maps.put("data" , list); // 分页列表 + return maps; + } - // valid trigger - ScheduleTypeEnum scheduleTypeEnum = ScheduleTypeEnum.match(jobInfo.getScheduleType(), null); - if (scheduleTypeEnum == null) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type")+I18nUtil.getString("system_unvalid")) ); - } - if (scheduleTypeEnum == ScheduleTypeEnum.CRON) { - if (jobInfo.getScheduleConf()==null || !CronExpression.isValidExpression(jobInfo.getScheduleConf())) { - return new ReturnT(ReturnT.FAIL_CODE, "Cron"+I18nUtil.getString("system_unvalid")); - } - } else if (scheduleTypeEnum == ScheduleTypeEnum.FIX_RATE/* || scheduleTypeEnum == ScheduleTypeEnum.FIX_DELAY*/) { - if (jobInfo.getScheduleConf() == null) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type")) ); - } - try { - int fixSecond = Integer.valueOf(jobInfo.getScheduleConf()); - if (fixSecond < 1) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type")+I18nUtil.getString("system_unvalid")) ); - } - } catch (Exception e) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type")+I18nUtil.getString("system_unvalid")) ); - } - } + @Override + public ReturnT add(XxlJobInfo jobInfo) { - // valid job - if (GlueTypeEnum.match(jobInfo.getGlueType()) == null) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_gluetype")+I18nUtil.getString("system_unvalid")) ); - } - if (GlueTypeEnum.BEAN==GlueTypeEnum.match(jobInfo.getGlueType()) && (jobInfo.getExecutorHandler()==null || jobInfo.getExecutorHandler().trim().length()==0) ) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("system_please_input")+"JobHandler") ); - } - // 》fix "\r" in shell - if (GlueTypeEnum.GLUE_SHELL==GlueTypeEnum.match(jobInfo.getGlueType()) && jobInfo.getGlueSource()!=null) { - jobInfo.setGlueSource(jobInfo.getGlueSource().replaceAll("\r", "")); - } + // valid base + XxlJobGroup group = xxlJobGroupDao.load(jobInfo.getJobGroup()); + if (group == null) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("system_please_choose") + I18nUtil.getString("jobinfo_field_jobgroup"))); + } + if (jobInfo.getJobDesc() == null || jobInfo.getJobDesc().trim().length() == 0) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("system_please_input") + I18nUtil.getString("jobinfo_field_jobdesc"))); + } + if (jobInfo.getAuthor() == null || jobInfo.getAuthor().trim().length() == 0) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("system_please_input") + I18nUtil.getString("jobinfo_field_author"))); + } - // valid advanced - if (ExecutorRouteStrategyEnum.match(jobInfo.getExecutorRouteStrategy(), null) == null) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_executorRouteStrategy")+I18nUtil.getString("system_unvalid")) ); - } - if (MisfireStrategyEnum.match(jobInfo.getMisfireStrategy(), null) == null) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("misfire_strategy")+I18nUtil.getString("system_unvalid")) ); - } - if (ExecutorBlockStrategyEnum.match(jobInfo.getExecutorBlockStrategy(), null) == null) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_executorBlockStrategy")+I18nUtil.getString("system_unvalid")) ); - } + // valid trigger + ScheduleTypeEnum scheduleTypeEnum = ScheduleTypeEnum.match(jobInfo.getScheduleType(), null); + if (scheduleTypeEnum == null) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type") + I18nUtil.getString("system_unvalid"))); + } + if (scheduleTypeEnum == ScheduleTypeEnum.CRON) { + if (jobInfo.getScheduleConf() == null || !CronExpression.isValidExpression(jobInfo.getScheduleConf())) { + return new ReturnT(ReturnT.FAIL_CODE, "Cron" + I18nUtil.getString("system_unvalid")); + } + } else if (scheduleTypeEnum == ScheduleTypeEnum.FIX_RATE/* || scheduleTypeEnum == ScheduleTypeEnum.FIX_DELAY*/) { + if (jobInfo.getScheduleConf() == null) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type"))); + } + try { + int fixSecond = Integer.valueOf(jobInfo.getScheduleConf()); + if (fixSecond < 1) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type") + I18nUtil.getString("system_unvalid"))); + } + } catch (Exception e) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type") + I18nUtil.getString("system_unvalid"))); + } + } - // 》ChildJobId valid - if (jobInfo.getChildJobId()!=null && jobInfo.getChildJobId().trim().length()>0) { - String[] childJobIds = jobInfo.getChildJobId().split(","); - for (String childJobIdItem: childJobIds) { - if (childJobIdItem!=null && childJobIdItem.trim().length()>0 && isNumeric(childJobIdItem)) { - XxlJobInfo childJobInfo = xxlJobInfoDao.loadById(Integer.parseInt(childJobIdItem)); - if (childJobInfo==null) { - return new ReturnT(ReturnT.FAIL_CODE, - MessageFormat.format((I18nUtil.getString("jobinfo_field_childJobId")+"({0})"+I18nUtil.getString("system_not_found")), childJobIdItem)); - } - } else { - return new ReturnT(ReturnT.FAIL_CODE, - MessageFormat.format((I18nUtil.getString("jobinfo_field_childJobId")+"({0})"+I18nUtil.getString("system_unvalid")), childJobIdItem)); - } - } + // valid job + if (GlueTypeEnum.match(jobInfo.getGlueType()) == null) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_gluetype") + I18nUtil.getString("system_unvalid"))); + } + if (GlueTypeEnum.BEAN == GlueTypeEnum.match(jobInfo.getGlueType()) && (jobInfo.getExecutorHandler() == null || jobInfo.getExecutorHandler().trim().length() == 0)) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("system_please_input") + "JobHandler")); + } + // 》fix "\r" in shell + if (GlueTypeEnum.GLUE_SHELL == GlueTypeEnum.match(jobInfo.getGlueType()) && jobInfo.getGlueSource() != null) { + jobInfo.setGlueSource(jobInfo.getGlueSource().replaceAll("\r" , "")); + } - // join , avoid "xxx,," - String temp = ""; - for (String item:childJobIds) { - temp += item + ","; - } - temp = temp.substring(0, temp.length()-1); + // valid advanced + if (ExecutorRouteStrategyEnum.match(jobInfo.getExecutorRouteStrategy(), null) == null) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_executorRouteStrategy") + I18nUtil.getString("system_unvalid"))); + } + if (MisfireStrategyEnum.match(jobInfo.getMisfireStrategy(), null) == null) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("misfire_strategy") + I18nUtil.getString("system_unvalid"))); + } + if (ExecutorBlockStrategyEnum.match(jobInfo.getExecutorBlockStrategy(), null) == null) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_executorBlockStrategy") + I18nUtil.getString("system_unvalid"))); + } - jobInfo.setChildJobId(temp); - } + // 》ChildJobId valid + if (jobInfo.getChildJobId() != null && jobInfo.getChildJobId().trim().length() > 0) { + String[] childJobIds = jobInfo.getChildJobId().split(","); + for (String childJobIdItem : childJobIds) { + if (childJobIdItem != null && childJobIdItem.trim().length() > 0 && isNumeric(childJobIdItem)) { + XxlJobInfo childJobInfo = xxlJobInfoDao.loadById(Integer.parseInt(childJobIdItem)); + if (childJobInfo == null) { + return new ReturnT(ReturnT.FAIL_CODE, + MessageFormat.format((I18nUtil.getString("jobinfo_field_childJobId") + "({0})" + I18nUtil.getString("system_not_found")), childJobIdItem)); + } + } else { + return new ReturnT(ReturnT.FAIL_CODE, + MessageFormat.format((I18nUtil.getString("jobinfo_field_childJobId") + "({0})" + I18nUtil.getString("system_unvalid")), childJobIdItem)); + } + } - // add in db - jobInfo.setAddTime(new Date()); - jobInfo.setUpdateTime(new Date()); - jobInfo.setGlueUpdatetime(new Date()); - xxlJobInfoDao.save(jobInfo); - if (jobInfo.getId() < 1) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_add")+I18nUtil.getString("system_fail")) ); - } + // join , avoid "xxx,," + String temp = ""; + for (String item : childJobIds) { + temp += item + ","; + } + temp = temp.substring(0, temp.length() - 1); - return new ReturnT(String.valueOf(jobInfo.getId())); - } + jobInfo.setChildJobId(temp); + } - private boolean isNumeric(String str){ - try { - int result = Integer.valueOf(str); - return true; - } catch (NumberFormatException e) { - return false; - } - } + // add in db + jobInfo.setAddTime(new Date()); + jobInfo.setUpdateTime(new Date()); + jobInfo.setGlueUpdatetime(new Date()); + xxlJobInfoDao.save(jobInfo); + if (jobInfo.getId() < 1) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_add") + I18nUtil.getString("system_fail"))); + } - @Override - public ReturnT update(XxlJobInfo jobInfo) { + return new ReturnT(String.valueOf(jobInfo.getId())); + } - // valid base - if (jobInfo.getJobDesc()==null || jobInfo.getJobDesc().trim().length()==0) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("system_please_input")+I18nUtil.getString("jobinfo_field_jobdesc")) ); - } - if (jobInfo.getAuthor()==null || jobInfo.getAuthor().trim().length()==0) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("system_please_input")+I18nUtil.getString("jobinfo_field_author")) ); - } + private boolean isNumeric(String str) { + try { + int result = Integer.valueOf(str); + return true; + } catch (NumberFormatException e) { + return false; + } + } - // valid trigger - ScheduleTypeEnum scheduleTypeEnum = ScheduleTypeEnum.match(jobInfo.getScheduleType(), null); - if (scheduleTypeEnum == null) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type")+I18nUtil.getString("system_unvalid")) ); - } - if (scheduleTypeEnum == ScheduleTypeEnum.CRON) { - if (jobInfo.getScheduleConf()==null || !CronExpression.isValidExpression(jobInfo.getScheduleConf())) { - return new ReturnT(ReturnT.FAIL_CODE, "Cron"+I18nUtil.getString("system_unvalid") ); - } - } else if (scheduleTypeEnum == ScheduleTypeEnum.FIX_RATE /*|| scheduleTypeEnum == ScheduleTypeEnum.FIX_DELAY*/) { - if (jobInfo.getScheduleConf() == null) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type")+I18nUtil.getString("system_unvalid")) ); - } - try { - int fixSecond = Integer.valueOf(jobInfo.getScheduleConf()); - if (fixSecond < 1) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type")+I18nUtil.getString("system_unvalid")) ); - } - } catch (Exception e) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type")+I18nUtil.getString("system_unvalid")) ); - } - } + @Override + public ReturnT update(XxlJobInfo jobInfo) { - // valid advanced - if (ExecutorRouteStrategyEnum.match(jobInfo.getExecutorRouteStrategy(), null) == null) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_executorRouteStrategy")+I18nUtil.getString("system_unvalid")) ); - } - if (MisfireStrategyEnum.match(jobInfo.getMisfireStrategy(), null) == null) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("misfire_strategy")+I18nUtil.getString("system_unvalid")) ); - } - if (ExecutorBlockStrategyEnum.match(jobInfo.getExecutorBlockStrategy(), null) == null) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_executorBlockStrategy")+I18nUtil.getString("system_unvalid")) ); - } + // valid base + if (jobInfo.getJobDesc() == null || jobInfo.getJobDesc().trim().length() == 0) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("system_please_input") + I18nUtil.getString("jobinfo_field_jobdesc"))); + } + if (jobInfo.getAuthor() == null || jobInfo.getAuthor().trim().length() == 0) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("system_please_input") + I18nUtil.getString("jobinfo_field_author"))); + } - // 》ChildJobId valid - if (jobInfo.getChildJobId()!=null && jobInfo.getChildJobId().trim().length()>0) { - String[] childJobIds = jobInfo.getChildJobId().split(","); - for (String childJobIdItem: childJobIds) { - if (childJobIdItem!=null && childJobIdItem.trim().length()>0 && isNumeric(childJobIdItem)) { - XxlJobInfo childJobInfo = xxlJobInfoDao.loadById(Integer.parseInt(childJobIdItem)); - if (childJobInfo==null) { - return new ReturnT(ReturnT.FAIL_CODE, - MessageFormat.format((I18nUtil.getString("jobinfo_field_childJobId")+"({0})"+I18nUtil.getString("system_not_found")), childJobIdItem)); - } - } else { - return new ReturnT(ReturnT.FAIL_CODE, - MessageFormat.format((I18nUtil.getString("jobinfo_field_childJobId")+"({0})"+I18nUtil.getString("system_unvalid")), childJobIdItem)); - } - } + // valid trigger + ScheduleTypeEnum scheduleTypeEnum = ScheduleTypeEnum.match(jobInfo.getScheduleType(), null); + if (scheduleTypeEnum == null) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type") + I18nUtil.getString("system_unvalid"))); + } + if (scheduleTypeEnum == ScheduleTypeEnum.CRON) { + if (jobInfo.getScheduleConf() == null || !CronExpression.isValidExpression(jobInfo.getScheduleConf())) { + return new ReturnT(ReturnT.FAIL_CODE, "Cron" + I18nUtil.getString("system_unvalid")); + } + } else if (scheduleTypeEnum == ScheduleTypeEnum.FIX_RATE /*|| scheduleTypeEnum == ScheduleTypeEnum.FIX_DELAY*/) { + if (jobInfo.getScheduleConf() == null) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type") + I18nUtil.getString("system_unvalid"))); + } + try { + int fixSecond = Integer.valueOf(jobInfo.getScheduleConf()); + if (fixSecond < 1) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type") + I18nUtil.getString("system_unvalid"))); + } + } catch (Exception e) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type") + I18nUtil.getString("system_unvalid"))); + } + } - // join , avoid "xxx,," - String temp = ""; - for (String item:childJobIds) { - temp += item + ","; - } - temp = temp.substring(0, temp.length()-1); + // valid advanced + if (ExecutorRouteStrategyEnum.match(jobInfo.getExecutorRouteStrategy(), null) == null) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_executorRouteStrategy") + I18nUtil.getString("system_unvalid"))); + } + if (MisfireStrategyEnum.match(jobInfo.getMisfireStrategy(), null) == null) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("misfire_strategy") + I18nUtil.getString("system_unvalid"))); + } + if (ExecutorBlockStrategyEnum.match(jobInfo.getExecutorBlockStrategy(), null) == null) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_executorBlockStrategy") + I18nUtil.getString("system_unvalid"))); + } - jobInfo.setChildJobId(temp); - } + // 》ChildJobId valid + if (jobInfo.getChildJobId() != null && jobInfo.getChildJobId().trim().length() > 0) { + String[] childJobIds = jobInfo.getChildJobId().split(","); + for (String childJobIdItem : childJobIds) { + if (childJobIdItem != null && childJobIdItem.trim().length() > 0 && isNumeric(childJobIdItem)) { + XxlJobInfo childJobInfo = xxlJobInfoDao.loadById(Integer.parseInt(childJobIdItem)); + if (childJobInfo == null) { + return new ReturnT(ReturnT.FAIL_CODE, + MessageFormat.format((I18nUtil.getString("jobinfo_field_childJobId") + "({0})" + I18nUtil.getString("system_not_found")), childJobIdItem)); + } + } else { + return new ReturnT(ReturnT.FAIL_CODE, + MessageFormat.format((I18nUtil.getString("jobinfo_field_childJobId") + "({0})" + I18nUtil.getString("system_unvalid")), childJobIdItem)); + } + } - // group valid - XxlJobGroup jobGroup = xxlJobGroupDao.load(jobInfo.getJobGroup()); - if (jobGroup == null) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_jobgroup")+I18nUtil.getString("system_unvalid")) ); - } + // join , avoid "xxx,," + String temp = ""; + for (String item : childJobIds) { + temp += item + ","; + } + temp = temp.substring(0, temp.length() - 1); - // stage job info - XxlJobInfo exists_jobInfo = xxlJobInfoDao.loadById(jobInfo.getId()); - if (exists_jobInfo == null) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_id")+I18nUtil.getString("system_not_found")) ); - } + jobInfo.setChildJobId(temp); + } - // next trigger time (5s后生效,避开预读周期) - long nextTriggerTime = exists_jobInfo.getTriggerNextTime(); - boolean scheduleDataNotChanged = jobInfo.getScheduleType().equals(exists_jobInfo.getScheduleType()) && jobInfo.getScheduleConf().equals(exists_jobInfo.getScheduleConf()); - if (exists_jobInfo.getTriggerStatus() == 1 && !scheduleDataNotChanged) { - try { - Date nextValidTime = JobScheduleHelper.generateNextValidTime(jobInfo, new Date(System.currentTimeMillis() + JobScheduleHelper.PRE_READ_MS)); - if (nextValidTime == null) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type")+I18nUtil.getString("system_unvalid")) ); - } - nextTriggerTime = nextValidTime.getTime(); - } catch (Exception e) { - logger.error(e.getMessage(), e); - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type")+I18nUtil.getString("system_unvalid")) ); - } - } + // group valid + XxlJobGroup jobGroup = xxlJobGroupDao.load(jobInfo.getJobGroup()); + if (jobGroup == null) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_jobgroup") + I18nUtil.getString("system_unvalid"))); + } - exists_jobInfo.setJobGroup(jobInfo.getJobGroup()); - exists_jobInfo.setJobDesc(jobInfo.getJobDesc()); - exists_jobInfo.setAuthor(jobInfo.getAuthor()); - exists_jobInfo.setAlarmEmail(jobInfo.getAlarmEmail()); - exists_jobInfo.setScheduleType(jobInfo.getScheduleType()); - exists_jobInfo.setScheduleConf(jobInfo.getScheduleConf()); - exists_jobInfo.setMisfireStrategy(jobInfo.getMisfireStrategy()); - exists_jobInfo.setExecutorRouteStrategy(jobInfo.getExecutorRouteStrategy()); - exists_jobInfo.setExecutorHandler(jobInfo.getExecutorHandler()); - exists_jobInfo.setExecutorParam(jobInfo.getExecutorParam()); - exists_jobInfo.setExecutorBlockStrategy(jobInfo.getExecutorBlockStrategy()); - exists_jobInfo.setExecutorTimeout(jobInfo.getExecutorTimeout()); - exists_jobInfo.setExecutorFailRetryCount(jobInfo.getExecutorFailRetryCount()); - exists_jobInfo.setChildJobId(jobInfo.getChildJobId()); - exists_jobInfo.setTriggerNextTime(nextTriggerTime); + // stage job info + XxlJobInfo exists_jobInfo = xxlJobInfoDao.loadById(jobInfo.getId()); + if (exists_jobInfo == null) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_id") + I18nUtil.getString("system_not_found"))); + } - exists_jobInfo.setUpdateTime(new Date()); + // next trigger time (5s后生效,避开预读周期) + long nextTriggerTime = exists_jobInfo.getTriggerNextTime(); + boolean scheduleDataNotChanged = jobInfo.getScheduleType().equals(exists_jobInfo.getScheduleType()) && jobInfo.getScheduleConf().equals(exists_jobInfo.getScheduleConf()); + if (exists_jobInfo.getTriggerStatus() == 1 && !scheduleDataNotChanged) { + try { + Date nextValidTime = JobScheduleHelper.generateNextValidTime(jobInfo, new Date(System.currentTimeMillis() + JobScheduleHelper.PRE_READ_MS)); + if (nextValidTime == null) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type") + I18nUtil.getString("system_unvalid"))); + } + nextTriggerTime = nextValidTime.getTime(); + } catch (Exception e) { + logger.error(e.getMessage(), e); + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type") + I18nUtil.getString("system_unvalid"))); + } + } + + exists_jobInfo.setJobGroup(jobInfo.getJobGroup()); + exists_jobInfo.setJobDesc(jobInfo.getJobDesc()); + exists_jobInfo.setAuthor(jobInfo.getAuthor()); + exists_jobInfo.setAlarmEmail(jobInfo.getAlarmEmail()); + exists_jobInfo.setScheduleType(jobInfo.getScheduleType()); + exists_jobInfo.setScheduleConf(jobInfo.getScheduleConf()); + exists_jobInfo.setMisfireStrategy(jobInfo.getMisfireStrategy()); + exists_jobInfo.setExecutorRouteStrategy(jobInfo.getExecutorRouteStrategy()); + exists_jobInfo.setExecutorHandler(jobInfo.getExecutorHandler()); + exists_jobInfo.setExecutorParam(jobInfo.getExecutorParam()); + exists_jobInfo.setExecutorBlockStrategy(jobInfo.getExecutorBlockStrategy()); + exists_jobInfo.setExecutorTimeout(jobInfo.getExecutorTimeout()); + exists_jobInfo.setExecutorFailRetryCount(jobInfo.getExecutorFailRetryCount()); + exists_jobInfo.setChildJobId(jobInfo.getChildJobId()); + exists_jobInfo.setTriggerNextTime(nextTriggerTime); + + exists_jobInfo.setUpdateTime(new Date()); xxlJobInfoDao.update(exists_jobInfo); - return ReturnT.SUCCESS; - } + return ReturnT.SUCCESS; + } - @Override - public ReturnT remove(int id) { - XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(id); - if (xxlJobInfo == null) { - return ReturnT.SUCCESS; - } + @Override + public ReturnT remove(int id) { + XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(id); + if (xxlJobInfo == null) { + return ReturnT.SUCCESS; + } - xxlJobInfoDao.delete(id); - xxlJobLogDao.delete(id); - xxlJobLogGlueDao.deleteByJobId(id); - return ReturnT.SUCCESS; - } + xxlJobInfoDao.delete(id); + xxlJobLogDao.delete(id); + xxlJobLogGlueDao.deleteByJobId(id); + return ReturnT.SUCCESS; + } - @Override - public ReturnT start(int id) { - XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(id); - - // valid - ScheduleTypeEnum scheduleTypeEnum = ScheduleTypeEnum.match(xxlJobInfo.getScheduleType(), ScheduleTypeEnum.NONE); - if (ScheduleTypeEnum.NONE == scheduleTypeEnum) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type_none_limit_start")) ); - } - - // next trigger time (5s后生效,避开预读周期) - long nextTriggerTime = 0; - try { - Date nextValidTime = JobScheduleHelper.generateNextValidTime(xxlJobInfo, new Date(System.currentTimeMillis() + JobScheduleHelper.PRE_READ_MS)); - if (nextValidTime == null) { - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type")+I18nUtil.getString("system_unvalid")) ); - } - nextTriggerTime = nextValidTime.getTime(); - } catch (Exception e) { - logger.error(e.getMessage(), e); - return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type")+I18nUtil.getString("system_unvalid")) ); - } - - xxlJobInfo.setTriggerStatus(1); - xxlJobInfo.setTriggerLastTime(0); - xxlJobInfo.setTriggerNextTime(nextTriggerTime); - - xxlJobInfo.setUpdateTime(new Date()); - xxlJobInfoDao.update(xxlJobInfo); - return ReturnT.SUCCESS; - } - - @Override - public ReturnT stop(int id) { + @Override + public ReturnT start(int id) { XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(id); - xxlJobInfo.setTriggerStatus(0); - xxlJobInfo.setTriggerLastTime(0); - xxlJobInfo.setTriggerNextTime(0); + // valid + ScheduleTypeEnum scheduleTypeEnum = ScheduleTypeEnum.match(xxlJobInfo.getScheduleType(), ScheduleTypeEnum.NONE); + if (ScheduleTypeEnum.NONE == scheduleTypeEnum) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type_none_limit_start"))); + } - xxlJobInfo.setUpdateTime(new Date()); - xxlJobInfoDao.update(xxlJobInfo); - return ReturnT.SUCCESS; - } + // next trigger time (5s后生效,避开预读周期) + long nextTriggerTime = 0; + try { + Date nextValidTime = JobScheduleHelper.generateNextValidTime(xxlJobInfo, new Date(System.currentTimeMillis() + JobScheduleHelper.PRE_READ_MS)); + if (nextValidTime == null) { + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type") + I18nUtil.getString("system_unvalid"))); + } + nextTriggerTime = nextValidTime.getTime(); + } catch (Exception e) { + logger.error(e.getMessage(), e); + return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type") + I18nUtil.getString("system_unvalid"))); + } - @Override - public Map dashboardInfo() { + xxlJobInfo.setTriggerStatus(1); + xxlJobInfo.setTriggerLastTime(0); + xxlJobInfo.setTriggerNextTime(nextTriggerTime); - int jobInfoCount = xxlJobInfoDao.findAllCount(); - int jobLogCount = 0; - int jobLogSuccessCount = 0; - XxlJobLogReport xxlJobLogReport = xxlJobLogReportDao.queryLogReportTotal(); - if (xxlJobLogReport != null) { - jobLogCount = xxlJobLogReport.getRunningCount() + xxlJobLogReport.getSucCount() + xxlJobLogReport.getFailCount(); - jobLogSuccessCount = xxlJobLogReport.getSucCount(); - } + xxlJobInfo.setUpdateTime(new Date()); + xxlJobInfoDao.update(xxlJobInfo); + return ReturnT.SUCCESS; + } - // executor count - Set executorAddressSet = new HashSet(); - List groupList = xxlJobGroupDao.findAll(); + @Override + public ReturnT stop(int id) { + XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(id); - if (groupList!=null && !groupList.isEmpty()) { - for (XxlJobGroup group: groupList) { - if (group.getRegistryList()!=null && !group.getRegistryList().isEmpty()) { - executorAddressSet.addAll(group.getRegistryList()); - } - } - } + xxlJobInfo.setTriggerStatus(0); + xxlJobInfo.setTriggerLastTime(0); + xxlJobInfo.setTriggerNextTime(0); - int executorCount = executorAddressSet.size(); + xxlJobInfo.setUpdateTime(new Date()); + xxlJobInfoDao.update(xxlJobInfo); + return ReturnT.SUCCESS; + } - Map dashboardMap = new HashMap(); - dashboardMap.put("jobInfoCount", jobInfoCount); - dashboardMap.put("jobLogCount", jobLogCount); - dashboardMap.put("jobLogSuccessCount", jobLogSuccessCount); - dashboardMap.put("executorCount", executorCount); - return dashboardMap; - } + @Override + public Map dashboardInfo() { - @Override - public ReturnT> chartInfo(Date startDate, Date endDate) { + int jobInfoCount = xxlJobInfoDao.findAllCount(); + int jobLogCount = 0; + int jobLogSuccessCount = 0; + XxlJobLogReport xxlJobLogReport = xxlJobLogReportDao.queryLogReportTotal(); + if (xxlJobLogReport != null) { + jobLogCount = xxlJobLogReport.getRunningCount() + xxlJobLogReport.getSucCount() + xxlJobLogReport.getFailCount(); + jobLogSuccessCount = xxlJobLogReport.getSucCount(); + } - // process - List triggerDayList = new ArrayList(); - List triggerDayCountRunningList = new ArrayList(); - List triggerDayCountSucList = new ArrayList(); - List triggerDayCountFailList = new ArrayList(); - int triggerCountRunningTotal = 0; - int triggerCountSucTotal = 0; - int triggerCountFailTotal = 0; + // executor count + Set executorAddressSet = new HashSet(); + List groupList = xxlJobGroupDao.findAll(); - List logReportList = xxlJobLogReportDao.queryLogReport(startDate, endDate); + if (groupList != null && !groupList.isEmpty()) { + for (XxlJobGroup group : groupList) { + if (group.getRegistryList() != null && !group.getRegistryList().isEmpty()) { + executorAddressSet.addAll(group.getRegistryList()); + } + } + } - if (logReportList!=null && logReportList.size()>0) { - for (XxlJobLogReport item: logReportList) { - String day = DateUtil.formatDate(item.getTriggerDay()); - int triggerDayCountRunning = item.getRunningCount(); - int triggerDayCountSuc = item.getSucCount(); - int triggerDayCountFail = item.getFailCount(); + int executorCount = executorAddressSet.size(); - triggerDayList.add(day); - triggerDayCountRunningList.add(triggerDayCountRunning); - triggerDayCountSucList.add(triggerDayCountSuc); - triggerDayCountFailList.add(triggerDayCountFail); + Map dashboardMap = new HashMap(); + dashboardMap.put("jobInfoCount" , jobInfoCount); + dashboardMap.put("jobLogCount" , jobLogCount); + dashboardMap.put("jobLogSuccessCount" , jobLogSuccessCount); + dashboardMap.put("executorCount" , executorCount); + return dashboardMap; + } - triggerCountRunningTotal += triggerDayCountRunning; - triggerCountSucTotal += triggerDayCountSuc; - triggerCountFailTotal += triggerDayCountFail; - } - } else { - for (int i = -6; i <= 0; i++) { - triggerDayList.add(DateUtil.formatDate(DateUtil.addDays(new Date(), i))); - triggerDayCountRunningList.add(0); - triggerDayCountSucList.add(0); - triggerDayCountFailList.add(0); - } - } + @Override + public ReturnT> chartInfo(Date startDate, Date endDate) { - Map result = new HashMap(); - result.put("triggerDayList", triggerDayList); - result.put("triggerDayCountRunningList", triggerDayCountRunningList); - result.put("triggerDayCountSucList", triggerDayCountSucList); - result.put("triggerDayCountFailList", triggerDayCountFailList); + // process + List triggerDayList = new ArrayList(); + List triggerDayCountRunningList = new ArrayList(); + List triggerDayCountSucList = new ArrayList(); + List triggerDayCountFailList = new ArrayList(); + int triggerCountRunningTotal = 0; + int triggerCountSucTotal = 0; + int triggerCountFailTotal = 0; - result.put("triggerCountRunningTotal", triggerCountRunningTotal); - result.put("triggerCountSucTotal", triggerCountSucTotal); - result.put("triggerCountFailTotal", triggerCountFailTotal); + List logReportList = xxlJobLogReportDao.queryLogReport(startDate, endDate); - return new ReturnT>(result); - } + if (logReportList != null && logReportList.size() > 0) { + for (XxlJobLogReport item : logReportList) { + String day = DateUtil.formatDate(item.getTriggerDay()); + int triggerDayCountRunning = item.getRunningCount(); + int triggerDayCountSuc = item.getSucCount(); + int triggerDayCountFail = item.getFailCount(); + + triggerDayList.add(day); + triggerDayCountRunningList.add(triggerDayCountRunning); + triggerDayCountSucList.add(triggerDayCountSuc); + triggerDayCountFailList.add(triggerDayCountFail); + + triggerCountRunningTotal += triggerDayCountRunning; + triggerCountSucTotal += triggerDayCountSuc; + triggerCountFailTotal += triggerDayCountFail; + } + } else { + for (int i = -6; i <= 0; i++) { + triggerDayList.add(DateUtil.formatDate(DateUtil.addDays(new Date(), i))); + triggerDayCountRunningList.add(0); + triggerDayCountSucList.add(0); + triggerDayCountFailList.add(0); + } + } + + Map result = new HashMap(); + result.put("triggerDayList" , triggerDayList); + result.put("triggerDayCountRunningList" , triggerDayCountRunningList); + result.put("triggerDayCountSucList" , triggerDayCountSucList); + result.put("triggerDayCountFailList" , triggerDayCountFailList); + + result.put("triggerCountRunningTotal" , triggerCountRunningTotal); + result.put("triggerCountSucTotal" , triggerCountSucTotal); + result.put("triggerCountFailTotal" , triggerCountFailTotal); + + return new ReturnT>(result); + } } 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-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobGroupMapper.xml b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobGroupMapper.xml index 87299f88b..ee592bb71 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobGroupMapper.xml +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobGroupMapper.xml @@ -1,91 +1,91 @@ - + - - - - - - - - - - - t.id, - t.app_name, - t.title, - t.address_type, - t.address_list, - t.update_time - + + + + + + + + - + + t.id, + t.app_name, + t.title, + t.address_type, + t.address_list, + t.update_time + - + - - INSERT INTO xxl_job_group ( `app_name`, `title`, `address_type`, `address_list`, `update_time`) - values ( #{appname}, #{title}, #{addressType}, #{addressList}, #{updateTime} ); - + - - UPDATE xxl_job_group - SET `app_name` = #{appname}, - `title` = #{title}, - `address_type` = #{addressType}, - `address_list` = #{addressList}, - `update_time` = #{updateTime} - WHERE id = #{id} - + + INSERT INTO xxl_job_group ( `app_name`, `title`, `address_type`, `address_list`, `update_time`) + values ( #{appname}, #{title}, #{addressType}, #{addressList}, #{updateTime} ); + - - DELETE FROM xxl_job_group - WHERE id = #{id} - + + UPDATE xxl_job_group + SET `app_name` = #{appname}, + `title` = #{title}, + `address_type` = #{addressType}, + `address_list` = #{addressList}, + `update_time` = #{updateTime} + WHERE id = #{id} + - + + DELETE FROM xxl_job_group + WHERE id = #{id} + - + - + - \ No newline at end of file + + + diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml index 7b3c3a3ed..c40b059d0 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml @@ -1,240 +1,240 @@ + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - + + - - + + - - + + - - + + - - - + + + - - - - - - + + + + + + - - - - + + + + - + - - - - + + + + - - t.id, - t.job_group, - t.job_desc, - t.add_time, - t.update_time, - t.author, - t.alarm_email, - t.schedule_type, - t.schedule_conf, - t.misfire_strategy, - t.executor_route_strategy, - t.executor_handler, - t.executor_param, - t.executor_block_strategy, - t.executor_timeout, - t.executor_fail_retry_count, - t.glue_type, - t.glue_source, - t.glue_remark, - t.glue_updatetime, - t.child_jobid, - t.trigger_status, - t.trigger_last_time, - t.trigger_next_time - + + t.id, + t.job_group, + t.job_desc, + t.add_time, + t.update_time, + t.author, + t.alarm_email, + t.schedule_type, + t.schedule_conf, + t.misfire_strategy, + t.executor_route_strategy, + t.executor_handler, + t.executor_param, + t.executor_block_strategy, + t.executor_timeout, + t.executor_fail_retry_count, + t.glue_type, + t.glue_source, + t.glue_remark, + t.glue_updatetime, + t.child_jobid, + t.trigger_status, + t.trigger_last_time, + t.trigger_next_time + - + SELECT + FROM xxl_job_info AS t + + + AND t.job_group = #{jobGroup} + AND t.trigger_status = #{triggerStatus} - - AND t.job_desc like CONCAT(CONCAT('%', #{jobDesc}), '%') - - - AND t.executor_handler like CONCAT(CONCAT('%', #{executorHandler}), '%') - - - AND t.author like CONCAT(CONCAT('%', #{author}), '%') - - - ORDER BY id DESC - LIMIT #{offset}, #{pagesize} - + + AND t.job_desc like CONCAT(CONCAT('%', #{jobDesc}), '%') + + + AND t.executor_handler like CONCAT(CONCAT('%', #{executorHandler}), '%') + + + AND t.author like CONCAT(CONCAT('%', #{author}), '%') + + + ORDER BY id DESC + LIMIT #{offset}, #{pagesize} + - + SELECT count(1) + FROM xxl_job_info AS t + + + AND t.job_group = #{jobGroup} + AND t.trigger_status = #{triggerStatus} - - AND t.job_desc like CONCAT(CONCAT('%', #{jobDesc}), '%') - - - AND t.executor_handler like CONCAT(CONCAT('%', #{executorHandler}), '%') - - - AND t.author like CONCAT(CONCAT('%', #{author}), '%') - - - + + AND t.job_desc like CONCAT(CONCAT('%', #{jobDesc}), '%') + + + AND t.executor_handler like CONCAT(CONCAT('%', #{executorHandler}), '%') + + + AND t.author like CONCAT(CONCAT('%', #{author}), '%') + + + - - INSERT INTO xxl_job_info ( - job_group, - job_desc, - add_time, - update_time, - author, - alarm_email, - schedule_type, - schedule_conf, - misfire_strategy, + + INSERT INTO xxl_job_info ( + job_group, + job_desc, + add_time, + update_time, + author, + alarm_email, + schedule_type, + schedule_conf, + misfire_strategy, executor_route_strategy, - executor_handler, - executor_param, - executor_block_strategy, - executor_timeout, - executor_fail_retry_count, - glue_type, - glue_source, - glue_remark, - glue_updatetime, - child_jobid, - trigger_status, - trigger_last_time, - trigger_next_time - ) VALUES ( - #{jobGroup}, - #{jobDesc}, - #{addTime}, - #{updateTime}, - #{author}, - #{alarmEmail}, - #{scheduleType}, - #{scheduleConf}, - #{misfireStrategy}, - #{executorRouteStrategy}, - #{executorHandler}, - #{executorParam}, - #{executorBlockStrategy}, - #{executorTimeout}, - #{executorFailRetryCount}, - #{glueType}, - #{glueSource}, - #{glueRemark}, - #{glueUpdatetime}, - #{childJobId}, - #{triggerStatus}, - #{triggerLastTime}, - #{triggerNextTime} - ); - - + executor_handler, + executor_param, + executor_block_strategy, + executor_timeout, + executor_fail_retry_count, + glue_type, + glue_source, + glue_remark, + glue_updatetime, + child_jobid, + trigger_status, + trigger_last_time, + trigger_next_time + ) VALUES ( + #{jobGroup}, + #{jobDesc}, + #{addTime}, + #{updateTime}, + #{author}, + #{alarmEmail}, + #{scheduleType}, + #{scheduleConf}, + #{misfireStrategy}, + #{executorRouteStrategy}, + #{executorHandler}, + #{executorParam}, + #{executorBlockStrategy}, + #{executorTimeout}, + #{executorFailRetryCount}, + #{glueType}, + #{glueSource}, + #{glueRemark}, + #{glueUpdatetime}, + #{childJobId}, + #{triggerStatus}, + #{triggerLastTime}, + #{triggerNextTime} + ); + + - + - - UPDATE xxl_job_info - SET - job_group = #{jobGroup}, - job_desc = #{jobDesc}, - update_time = #{updateTime}, - author = #{author}, - alarm_email = #{alarmEmail}, - schedule_type = #{scheduleType}, - schedule_conf = #{scheduleConf}, - misfire_strategy = #{misfireStrategy}, - executor_route_strategy = #{executorRouteStrategy}, - executor_handler = #{executorHandler}, - executor_param = #{executorParam}, - executor_block_strategy = #{executorBlockStrategy}, - executor_timeout = ${executorTimeout}, - executor_fail_retry_count = ${executorFailRetryCount}, - glue_type = #{glueType}, - glue_source = #{glueSource}, - glue_remark = #{glueRemark}, - glue_updatetime = #{glueUpdatetime}, - child_jobid = #{childJobId}, - trigger_status = #{triggerStatus}, - trigger_last_time = #{triggerLastTime}, - trigger_next_time = #{triggerNextTime} - WHERE id = #{id} - + + UPDATE xxl_job_info + SET + job_group = #{jobGroup}, + job_desc = #{jobDesc}, + update_time = #{updateTime}, + author = #{author}, + alarm_email = #{alarmEmail}, + schedule_type = #{scheduleType}, + schedule_conf = #{scheduleConf}, + misfire_strategy = #{misfireStrategy}, + executor_route_strategy = #{executorRouteStrategy}, + executor_handler = #{executorHandler}, + executor_param = #{executorParam}, + executor_block_strategy = #{executorBlockStrategy}, + executor_timeout = ${executorTimeout}, + executor_fail_retry_count = ${executorFailRetryCount}, + glue_type = #{glueType}, + glue_source = #{glueSource}, + glue_remark = #{glueRemark}, + glue_updatetime = #{glueUpdatetime}, + child_jobid = #{childJobId}, + trigger_status = #{triggerStatus}, + trigger_last_time = #{triggerLastTime}, + trigger_next_time = #{triggerNextTime} + WHERE id = #{id} + - - DELETE - FROM xxl_job_info - WHERE id = #{id} - + + DELETE + FROM xxl_job_info + WHERE id = #{id} + - + - + - + - - UPDATE xxl_job_info - SET - trigger_last_time = #{triggerLastTime}, - trigger_next_time = #{triggerNextTime}, - trigger_status = #{triggerStatus} - WHERE id = #{id} - + + UPDATE xxl_job_info + SET + trigger_last_time = #{triggerLastTime}, + trigger_next_time = #{triggerNextTime}, + trigger_status = #{triggerStatus} + WHERE id = #{id} + - \ No newline at end of file + diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogGlueMapper.xml b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogGlueMapper.xml index 699277c51..dc680f376 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogGlueMapper.xml +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogGlueMapper.xml @@ -1,71 +1,71 @@ - + - - - - - - - - - - - - t.id, - t.job_id, - t.glue_type, - t.glue_source, - t.glue_remark, - t.add_time, - t.update_time - - - - INSERT INTO xxl_job_logglue ( - `job_id`, - `glue_type`, - `glue_source`, - `glue_remark`, - `add_time`, - `update_time` - ) VALUES ( - #{jobId}, - #{glueType}, - #{glueSource}, - #{glueRemark}, - #{addTime}, - #{updateTime} - ); - - - - - - - DELETE FROM xxl_job_logglue - WHERE id NOT in( - SELECT id FROM( - SELECT id FROM xxl_job_logglue - WHERE `job_id` = #{jobId} - ORDER BY update_time desc - LIMIT 0, #{limit} - ) t1 - ) AND `job_id` = #{jobId} - - - - DELETE FROM xxl_job_logglue - WHERE `job_id` = #{jobId} - - - \ No newline at end of file + + + + + + + + + + + + t.id, + t.job_id, + t.glue_type, + t.glue_source, + t.glue_remark, + t.add_time, + t.update_time + + + + INSERT INTO xxl_job_logglue ( + `job_id`, + `glue_type`, + `glue_source`, + `glue_remark`, + `add_time`, + `update_time` + ) VALUES ( + #{jobId}, + #{glueType}, + #{glueSource}, + #{glueRemark}, + #{addTime}, + #{updateTime} + ); + + + + + + + DELETE FROM xxl_job_logglue + WHERE id NOT in( + SELECT id FROM( + SELECT id FROM xxl_job_logglue + WHERE `job_id` = #{jobId} + ORDER BY update_time desc + LIMIT 0, #{limit} + ) t1 + ) AND `job_id` = #{jobId} + + + + DELETE FROM xxl_job_logglue + WHERE `job_id` = #{jobId} + + + diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogMapper.xml b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogMapper.xml index 4155f1798..e5fa90393 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogMapper.xml +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogMapper.xml @@ -1,273 +1,273 @@ - + - - - - - + + - - - - - - - - - - - - - + + - - + + + + + - - t.id, - t.job_group, - t.job_id, - t.executor_address, - t.executor_handler, - t.executor_param, - t.executor_sharding_param, - t.executor_fail_retry_count, - t.trigger_time, - t.trigger_code, - t.trigger_msg, - t.handle_time, - t.handle_code, - t.handle_msg, - t.alarm_status - - - - - - - + + + - - - INSERT INTO xxl_job_log ( - `job_group`, - `job_id`, - `trigger_time`, - `trigger_code`, - `handle_code` - ) VALUES ( - #{jobGroup}, - #{jobId}, - #{triggerTime}, - #{triggerCode}, - #{handleCode} - ); - - + + + - - UPDATE xxl_job_log - SET - `trigger_time`= #{triggerTime}, - `trigger_code`= #{triggerCode}, - `trigger_msg`= #{triggerMsg}, - `executor_address`= #{executorAddress}, - `executor_handler`=#{executorHandler}, - `executor_param`= #{executorParam}, - `executor_sharding_param`= #{executorShardingParam}, - `executor_fail_retry_count`= #{executorFailRetryCount} - WHERE `id`= #{id} - + + - - UPDATE xxl_job_log - SET - `handle_time`= #{handleTime}, - `handle_code`= #{handleCode}, - `handle_msg`= #{handleMsg} - WHERE `id`= #{id} - - - - delete from xxl_job_log - WHERE job_id = #{jobId} - + + t.id, + t.job_group, + t.job_id, + t.executor_address, + t.executor_handler, + t.executor_param, + t.executor_sharding_param, + t.executor_fail_retry_count, + t.trigger_time, + t.trigger_code, + t.trigger_msg, + t.handle_time, + t.handle_code, + t.handle_msg, + t.alarm_status + + + + + + + + + + + INSERT INTO xxl_job_log ( + `job_group`, + `job_id`, + `trigger_time`, + `trigger_code`, + `handle_code` + ) VALUES ( + #{jobGroup}, + #{jobId}, + #{triggerTime}, + #{triggerCode}, + #{handleCode} + ); + + + + + UPDATE xxl_job_log + SET + `trigger_time`= #{triggerTime}, + `trigger_code`= #{triggerCode}, + `trigger_msg`= #{triggerMsg}, + `executor_address`= #{executorAddress}, + `executor_handler`=#{executorHandler}, + `executor_param`= #{executorParam}, + `executor_sharding_param`= #{executorShardingParam}, + `executor_fail_retry_count`= #{executorFailRetryCount} + WHERE `id`= #{id} + + + + UPDATE xxl_job_log + SET + `handle_time`= #{handleTime}, + `handle_code`= #{handleCode}, + `handle_msg`= #{handleMsg} + WHERE `id`= #{id} + + + + delete from xxl_job_log + WHERE job_id = #{jobId} + - + - - delete from xxl_job_log - WHERE id in - - #{item} - - + + delete from xxl_job_log + WHERE id in + + #{item} + + - + - - UPDATE xxl_job_log - SET - `alarm_status` = #{newAlarmStatus} - WHERE `id`= #{logId} AND `alarm_status` = #{oldAlarmStatus} - + + UPDATE xxl_job_log + SET + `alarm_status` = #{newAlarmStatus} + WHERE `id`= #{logId} AND `alarm_status` = #{oldAlarmStatus} + - - + + - \ No newline at end of file + diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogReportMapper.xml b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogReportMapper.xml index 579d5f394..a993a5bad 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogReportMapper.xml +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogReportMapper.xml @@ -1,62 +1,62 @@ - + - - - - - - - - - - t.id, - t.trigger_day, - t.running_count, - t.suc_count, - t.fail_count - - - - INSERT INTO xxl_job_log_report ( - `trigger_day`, - `running_count`, - `suc_count`, - `fail_count` - ) VALUES ( - #{triggerDay}, - #{runningCount}, - #{sucCount}, - #{failCount} - ); - - + + + + + + + - + + t.id, + t.trigger_day, + t.running_count, + t.suc_count, + t.fail_count + + + + INSERT INTO xxl_job_log_report ( + `trigger_day`, + `running_count`, + `suc_count`, + `fail_count` + ) VALUES ( + #{triggerDay}, + #{runningCount}, + #{sucCount}, + #{failCount} + ); + + + + UPDATE xxl_job_log_report SET `running_count` = #{runningCount}, - `suc_count` = #{sucCount}, - `fail_count` = #{failCount} + `suc_count` = #{sucCount}, + `fail_count` = #{failCount} WHERE `trigger_day` = #{triggerDay} - + - + - \ No newline at end of file + diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobRegistryMapper.xml b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobRegistryMapper.xml index 4cae667a2..690841fa9 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobRegistryMapper.xml +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobRegistryMapper.xml @@ -1,43 +1,43 @@ - + - - - - - - - - - - t.id, - t.registry_group, - t.registry_key, - t.registry_value, - t.update_time - + + + + + + + - - - - DELETE FROM xxl_job_registry - WHERE id in - - #{item} - - + + t.id, + t.registry_group, + t.registry_key, + t.registry_value, + t.update_time + - + + + + DELETE FROM xxl_job_registry + WHERE id in + + #{item} + + + + UPDATE xxl_job_registry @@ -52,11 +52,11 @@ VALUES( #{registryGroup} , #{registryKey} , #{registryValue}, #{updateTime}) - - DELETE FROM xxl_job_registry - WHERE registry_group = #{registryGroup} - AND registry_key = #{registryKey} - AND registry_value = #{registryValue} - + + DELETE FROM xxl_job_registry + WHERE registry_group = #{registryGroup} + AND registry_key = #{registryKey} + AND registry_value = #{registryValue} + - \ No newline at end of file + diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobUserMapper.xml b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobUserMapper.xml index 9e09b4aae..334d2c58e 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobUserMapper.xml +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobUserMapper.xml @@ -1,87 +1,87 @@ + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - - - - - - + + + + + + + - - t.id, - t.username, - t.password, - t.role, - t.permission - + + t.id, + t.username, + t.password, + t.role, + t.permission + - + - + - + - - INSERT INTO xxl_job_user ( - username, - password, - role, - permission - ) VALUES ( - #{username}, - #{password}, - #{role}, - #{permission} - ); - + + INSERT INTO xxl_job_user ( + username, + password, + role, + permission + ) VALUES ( + #{username}, + #{password}, + #{role}, + #{permission} + ); + - - UPDATE xxl_job_user - SET - - password = #{password}, - - role = #{role}, - permission = #{permission} - WHERE id = #{id} - + + UPDATE xxl_job_user + SET + + password = #{password}, + + role = #{role}, + permission = #{permission} + WHERE id = #{id} + - - DELETE - FROM xxl_job_user - WHERE id = #{id} - + + DELETE + FROM xxl_job_user + WHERE id = #{id} + - \ No newline at end of file + diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/js/user.index.1.js b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/js/user.index.1.js index 48d3f3020..1d8346148 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/js/user.index.1.js +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/static/js/user.index.1.js @@ -1,48 +1,48 @@ $(function() { - // init date tables - var userListTable = $("#user_list").dataTable({ - "deferRender": true, - "processing" : true, - "serverSide": true, - "ajax": { - url: base_url + "/user/pageList", - type:"post", - data : function ( d ) { - var obj = {}; + // init date tables + var userListTable = $("#user_list").dataTable({ + "deferRender": true, + "processing" : true, + "serverSide": true, + "ajax": { + url: base_url + "/user/pageList", + type:"post", + data : function ( d ) { + var obj = {}; obj.username = $('#username').val(); obj.role = $('#role').val(); - obj.start = d.start; - obj.length = d.length; + obj.start = d.start; + obj.length = d.length; return obj; } - }, - "searching": false, - "ordering": false, - //"scrollX": true, // scroll x,close self-adaption - "columns": [ - { - "data": 'id', - "visible" : false, - "width":'10%' - }, - { - "data": 'username', - "visible" : true, - "width":'20%' - }, - { - "data": 'password', - "visible" : false, + }, + "searching": false, + "ordering": false, + //"scrollX": true, // scroll x,close self-adaption + "columns": [ + { + "data": 'id', + "visible" : false, + "width":'10%' + }, + { + "data": 'username', + "visible" : true, + "width":'20%' + }, + { + "data": 'password', + "visible" : false, "width":'20%', "render": function ( data, type, row ) { return '*********'; } - }, - { - "data": 'role', - "visible" : true, - "width":'10%', + }, + { + "data": 'role', + "visible" : true, + "width":'10%', "render": function ( data, type, row ) { if (data == 1) { return I18n.user_role_admin @@ -50,101 +50,101 @@ $(function() { return I18n.user_role_normal } } - }, - { - "data": 'permission', - "width":'10%', - "visible" : false - }, - { - "data": I18n.system_opt , - "width":'15%', - "render": function ( data, type, row ) { - return function(){ - // html + }, + { + "data": 'permission', + "width":'10%', + "visible" : false + }, + { + "data": I18n.system_opt , + "width":'15%', + "render": function ( data, type, row ) { + return function(){ + // html tableData['key'+row.id] = row; - var html = '

'+ - ' '+ - ' '+ - '

'; + var html = '

'+ + ' '+ + ' '+ + '

'; - return html; - }; - } - } - ], - "language" : { - "sProcessing" : I18n.dataTable_sProcessing , - "sLengthMenu" : I18n.dataTable_sLengthMenu , - "sZeroRecords" : I18n.dataTable_sZeroRecords , - "sInfo" : I18n.dataTable_sInfo , - "sInfoEmpty" : I18n.dataTable_sInfoEmpty , - "sInfoFiltered" : I18n.dataTable_sInfoFiltered , - "sInfoPostFix" : "", - "sSearch" : I18n.dataTable_sSearch , - "sUrl" : "", - "sEmptyTable" : I18n.dataTable_sEmptyTable , - "sLoadingRecords" : I18n.dataTable_sLoadingRecords , - "sInfoThousands" : ",", - "oPaginate" : { - "sFirst" : I18n.dataTable_sFirst , - "sPrevious" : I18n.dataTable_sPrevious , - "sNext" : I18n.dataTable_sNext , - "sLast" : I18n.dataTable_sLast - }, - "oAria" : { - "sSortAscending" : I18n.dataTable_sSortAscending , - "sSortDescending" : I18n.dataTable_sSortDescending - } - } - }); + return html; + }; + } + } + ], + "language" : { + "sProcessing" : I18n.dataTable_sProcessing , + "sLengthMenu" : I18n.dataTable_sLengthMenu , + "sZeroRecords" : I18n.dataTable_sZeroRecords , + "sInfo" : I18n.dataTable_sInfo , + "sInfoEmpty" : I18n.dataTable_sInfoEmpty , + "sInfoFiltered" : I18n.dataTable_sInfoFiltered , + "sInfoPostFix" : "", + "sSearch" : I18n.dataTable_sSearch , + "sUrl" : "", + "sEmptyTable" : I18n.dataTable_sEmptyTable , + "sLoadingRecords" : I18n.dataTable_sLoadingRecords , + "sInfoThousands" : ",", + "oPaginate" : { + "sFirst" : I18n.dataTable_sFirst , + "sPrevious" : I18n.dataTable_sPrevious , + "sNext" : I18n.dataTable_sNext , + "sLast" : I18n.dataTable_sLast + }, + "oAria" : { + "sSortAscending" : I18n.dataTable_sSortAscending , + "sSortDescending" : I18n.dataTable_sSortDescending + } + } + }); // table data var tableData = {}; - // search btn - $('#searchBtn').on('click', function(){ + // search btn + $('#searchBtn').on('click', function(){ userListTable.fnDraw(); - }); - - // job operate - $("#user_list").on('click', '.delete',function() { - var id = $(this).parent('p').attr("id"); + }); - layer.confirm( I18n.system_ok + I18n.system_opt_del + '?', { - icon: 3, - title: I18n.system_tips , + // job operate + $("#user_list").on('click', '.delete',function() { + var id = $(this).parent('p').attr("id"); + + layer.confirm( I18n.system_ok + I18n.system_opt_del + '?', { + icon: 3, + title: I18n.system_tips , btn: [ I18n.system_ok, I18n.system_cancel ] - }, function(index){ - layer.close(index); + }, function(index){ + layer.close(index); - $.ajax({ - type : 'POST', - url : base_url + "/user/remove", - data : { - "id" : id - }, - dataType : "json", - success : function(data){ - if (data.code == 200) { + $.ajax({ + type : 'POST', + url : base_url + "/user/remove", + data : { + "id" : id + }, + dataType : "json", + success : function(data){ + if (data.code == 200) { layer.msg( I18n.system_success ); - userListTable.fnDraw(false); - } else { + userListTable.fnDraw(false); + } else { layer.msg( data.msg || I18n.system_opt_del + I18n.system_fail ); - } - } - }); - }); - }); + } + } + }); + }); + }); - // add role + // add role $("#addModal .form input[name=role]").change(function () { - var role = $(this).val(); - if (role == 1) { + var role = $(this).val(); + if (role == 1) { $("#addModal .form input[name=permission]").parents('.form-group').hide(); - } else { + } else { $("#addModal .form input[name=permission]").parents('.form-group').show(); - } + } $("#addModal .form input[name='permission']").prop("checked",false); }); @@ -154,28 +154,28 @@ $(function() { return this.optional(element) || valid.test(value); }, I18n.user_username_valid ); - // add - $(".add").click(function(){ - $('#addModal').modal({backdrop: false, keyboard: false}).modal('show'); - }); - var addModalValidate = $("#addModal .form").validate({ - errorElement : 'span', + // add + $(".add").click(function(){ + $('#addModal').modal({backdrop: false, keyboard: false}).modal('show'); + }); + var addModalValidate = $("#addModal .form").validate({ + errorElement : 'span', errorClass : 'help-block', - focusInvalid : true, + focusInvalid : true, rules : { username : { - required : true, + required : true, rangelength:[4, 20], myValid01: true - }, + }, password : { required : true, rangelength:[4, 20] } - }, + }, messages : { username : { - required : I18n.system_please_input + I18n.user_username, + required : I18n.system_please_input + I18n.user_username, rangelength: I18n.system_lengh_limit + "[4-20]" }, password : { @@ -183,15 +183,15 @@ $(function() { rangelength: I18n.system_lengh_limit + "[4-20]" } }, - highlight : function(element) { - $(element).closest('.form-group').addClass('has-error'); + highlight : function(element) { + $(element).closest('.form-group').addClass('has-error'); }, - success : function(label) { - label.closest('.form-group').removeClass('has-error'); - label.remove(); + success : function(label) { + label.closest('.form-group').removeClass('has-error'); + label.remove(); }, - errorPlacement : function(error, element) { - element.parent('div').append(error); + errorPlacement : function(error, element) { + element.parent('div').append(error); }, submitHandler : function(form) { @@ -200,38 +200,38 @@ $(function() { permissionArr.push($(this).val()); }); - var paramData = { - "username": $("#addModal .form input[name=username]").val(), + var paramData = { + "username": $("#addModal .form input[name=username]").val(), "password": $("#addModal .form input[name=password]").val(), "role": $("#addModal .form input[name=role]:checked").val(), "permission": permissionArr.join(',') - }; + }; - $.post(base_url + "/user/add", paramData, function(data, status) { - if (data.code == "200") { - $('#addModal').modal('hide'); + $.post(base_url + "/user/add", paramData, function(data, status) { + if (data.code == "200") { + $('#addModal').modal('hide'); layer.msg( I18n.system_add_suc ); userListTable.fnDraw(); - } else { - layer.open({ - title: I18n.system_tips , + } else { + layer.open({ + title: I18n.system_tips , btn: [ I18n.system_ok ], - content: (data.msg || I18n.system_add_fail), - icon: '2' - }); - } - }); - } - }); - $("#addModal").on('hide.bs.modal', function () { - $("#addModal .form")[0].reset(); - addModalValidate.resetForm(); - $("#addModal .form .form-group").removeClass("has-error"); - $(".remote_panel").show(); // remote + content: (data.msg || I18n.system_add_fail), + icon: '2' + }); + } + }); + } + }); + $("#addModal").on('hide.bs.modal', function () { + $("#addModal .form")[0].reset(); + addModalValidate.resetForm(); + $("#addModal .form .form-group").removeClass("has-error"); + $(".remote_panel").show(); // remote $("#addModal .form input[name=permission]").parents('.form-group').show(); - }); + }); // update role $("#updateModal .form input[name=role]").change(function () { @@ -244,21 +244,21 @@ $(function() { $("#updateModal .form input[name='permission']").prop("checked",false); }); - // update - $("#user_list").on('click', '.update',function() { + // update + $("#user_list").on('click', '.update',function() { var id = $(this).parent('p').attr("id"); var row = tableData['key'+id]; - // base data - $("#updateModal .form input[name='id']").val( row.id ); - $("#updateModal .form input[name='username']").val( row.username ); - $("#updateModal .form input[name='password']").val( '' ); - $("#updateModal .form input[name='role'][value='"+ row.role +"']").click(); + // base data + $("#updateModal .form input[name='id']").val( row.id ); + $("#updateModal .form input[name='username']").val( row.username ); + $("#updateModal .form input[name='password']").val( '' ); + $("#updateModal .form input[name='role'][value='"+ row.role +"']").click(); var permissionArr = []; if (row.permission) { permissionArr = row.permission.split(","); - } + } $("#updateModal .form input[name='permission']").each(function () { if($.inArray($(this).val(), permissionArr) > -1) { $(this).prop("checked",true); @@ -267,22 +267,22 @@ $(function() { } }); - // show - $('#updateModal').modal({backdrop: false, keyboard: false}).modal('show'); - }); - var updateModalValidate = $("#updateModal .form").validate({ - errorElement : 'span', + // show + $('#updateModal').modal({backdrop: false, keyboard: false}).modal('show'); + }); + var updateModalValidate = $("#updateModal .form").validate({ + errorElement : 'span', errorClass : 'help-block', focusInvalid : true, - highlight : function(element) { - $(element).closest('.form-group').addClass('has-error'); + highlight : function(element) { + $(element).closest('.form-group').addClass('has-error'); }, - success : function(label) { - label.closest('.form-group').removeClass('has-error'); - label.remove(); + success : function(label) { + label.closest('.form-group').removeClass('has-error'); + label.remove(); }, - errorPlacement : function(error, element) { - element.parent('div').append(error); + errorPlacement : function(error, element) { + element.parent('div').append(error); }, submitHandler : function(form) { @@ -314,15 +314,15 @@ $(function() { }); } }); - } - }); - $("#updateModal").on('hide.bs.modal', function () { + } + }); + $("#updateModal").on('hide.bs.modal', function () { $("#updateModal .form")[0].reset(); updateModalValidate.resetForm(); $("#updateModal .form .form-group").removeClass("has-error"); - $(".remote_panel").show(); // remote + $(".remote_panel").show(); // remote $("#updateModal .form input[name=permission]").parents('.form-group').show(); - }); + }); }); diff --git a/ruoyi-ui/package.json b/ruoyi-ui/package.json index 60529054f..3fe16b602 100644 --- a/ruoyi-ui/package.json +++ b/ruoyi-ui/package.json @@ -1,6 +1,6 @@ { "name": "ruoyi-vue-plus", - "version": "3.5.0", + "version": "4.0.0", "description": "RuoYi-Vue-Plus后台管理系统", "author": "LionLi", "license": "MIT", diff --git a/ruoyi-ui/public/index.html b/ruoyi-ui/public/index.html index 925455caf..e32e12935 100644 --- a/ruoyi-ui/public/index.html +++ b/ruoyi-ui/public/index.html @@ -8,7 +8,7 @@ <%= webpackConfig.name %> - diff --git a/ruoyi-ui/src/components/Pagination/index.vue b/ruoyi-ui/src/components/Pagination/index.vue index 5e5d89046..b09f080c9 100644 --- a/ruoyi-ui/src/components/Pagination/index.vue +++ b/ruoyi-ui/src/components/Pagination/index.vue @@ -1,6 +1,7 @@ diff --git a/ruoyi-ui/src/views/monitor/logininfor/index.vue b/ruoyi-ui/src/views/monitor/logininfor/index.vue index 98bd74357..12d2ce6c7 100644 --- a/ruoyi-ui/src/views/monitor/logininfor/index.vue +++ b/ruoyi-ui/src/views/monitor/logininfor/index.vue @@ -6,7 +6,7 @@ v-model="queryParams.ipaddr" placeholder="请输入登录地址" clearable - size="small" + size="small" style="width: 240px;" @keyup.enter.native="handleQuery" /> @@ -16,7 +16,7 @@ v-model="queryParams.userName" placeholder="请输入用户名称" clearable - size="small" + size="small" style="width: 240px;" @keyup.enter.native="handleQuery" /> diff --git a/ruoyi-ui/src/views/register.vue b/ruoyi-ui/src/views/register.vue index 759931492..c9f1efbb2 100644 --- a/ruoyi-ui/src/views/register.vue +++ b/ruoyi-ui/src/views/register.vue @@ -61,7 +61,7 @@ @@ -124,7 +124,9 @@ export default { this.$refs.registerForm.validate(valid => { if (valid) { this.loading = true; - register(this.registerForm).then(res => { + let registerForm = this.registerForm; + registerForm.userType = "sys_user" + register(registerForm).then(res => { const username = this.registerForm.username; this.$alert("恭喜你,您的账号 " + username + " 注册成功!", '系统提示', { dangerouslyUseHTMLString: true, diff --git a/ruoyi-ui/src/views/system/dept/index.vue b/ruoyi-ui/src/views/system/dept/index.vue index e215b1c8e..b57f2b9de 100644 --- a/ruoyi-ui/src/views/system/dept/index.vue +++ b/ruoyi-ui/src/views/system/dept/index.vue @@ -106,6 +106,8 @@ + + @@ -116,6 +118,8 @@ + + @@ -126,6 +130,8 @@ + + diff --git a/ruoyi-ui/src/views/system/oss/index.vue b/ruoyi-ui/src/views/system/oss/index.vue index fdfed1650..ac8b02972 100644 --- a/ruoyi-ui/src/views/system/oss/index.vue +++ b/ruoyi-ui/src/views/system/oss/index.vue @@ -187,7 +187,7 @@ "; - final String fieldSql = prepareFieldSql(tableInfo); - final String valueSql = prepareValuesSqlForMysqlBatch(tableInfo); - KeyGenerator keyGenerator = new NoKeyGenerator(); - String sqlMethod = "insertAll"; - String keyProperty = null; - String keyColumn = null; - // 表包含主键处理逻辑,如果不包含主键当普通字段处理 - if (StringUtils.isNotBlank(tableInfo.getKeyProperty())) { - if (tableInfo.getIdType() == IdType.AUTO) { - /** 自增主键 */ - keyGenerator = new Jdbc3KeyGenerator(); - keyProperty = tableInfo.getKeyProperty(); - keyColumn = tableInfo.getKeyColumn(); - } else { - if (null != tableInfo.getKeySequence()) { - keyGenerator = TableInfoHelper.genKeyGenerator(sqlMethod, tableInfo, builderAssistant); - keyProperty = tableInfo.getKeyProperty(); - keyColumn = tableInfo.getKeyColumn(); - } - } - } - final String sqlResult = String.format(sql, tableInfo.getTableName(), fieldSql, valueSql); - SqlSource sqlSource = languageDriver.createSqlSource(configuration, sqlResult, modelClass); - return this.addInsertMappedStatement(mapperClass, modelClass, sqlMethod, sqlSource, keyGenerator, keyProperty, keyColumn); - } - - private String prepareFieldSql(TableInfo tableInfo) { - StringBuilder fieldSql = new StringBuilder(); - if (StringUtils.isNotBlank(tableInfo.getKeyColumn())) { - fieldSql.append(tableInfo.getKeyColumn()).append(","); - } - tableInfo.getFieldList().forEach(x -> fieldSql.append(x.getColumn()).append(",")); - fieldSql.delete(fieldSql.length() - 1, fieldSql.length()); - fieldSql.insert(0, "("); - fieldSql.append(")"); - return fieldSql.toString(); - } - - private String prepareValuesSqlForMysqlBatch(TableInfo tableInfo) { - final StringBuilder valueSql = new StringBuilder(); - valueSql.append(""); - if (StringUtils.isNotBlank(tableInfo.getKeyColumn())) { - valueSql.append("\n#{item.").append(tableInfo.getKeyProperty()).append("},\n"); - } - List fieldList = tableInfo.getFieldList(); - int last = fieldList.size() - 1; - for (int i = 0; i < fieldList.size(); i++) { - String property = fieldList.get(i).getProperty(); - if (!StringUtils.equalsAny(property, FILL_PROPERTY)) { - valueSql.append(""); - valueSql.append("#{item.").append(property).append("}"); - if (i != last) { - valueSql.append(","); - } - valueSql.append(""); - valueSql.append(""); - valueSql.append("DEFAULT"); - if (i != last) { - valueSql.append(","); - } - valueSql.append(""); - } else { - valueSql.append("#{item.").append(property).append("}"); - if (i != last) { - valueSql.append(","); - } - } - } - valueSql.append(""); - return valueSql.toString(); - } -} - diff --git a/ruoyi/src/main/java/com/ruoyi/common/core/page/PagePlus.java b/ruoyi/src/main/java/com/ruoyi/common/core/page/PagePlus.java deleted file mode 100644 index bff381c40..000000000 --- a/ruoyi/src/main/java/com/ruoyi/common/core/page/PagePlus.java +++ /dev/null @@ -1,158 +0,0 @@ -package com.ruoyi.common.core.page; - -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.core.metadata.OrderItem; -import lombok.Data; -import lombok.experimental.Accessors; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -/** - * 分页 Page 增强对象 - * - * @param 数据库实体 - * @param vo实体 - * @author Lion Li - * @deprecated 3.6.0 删除 请使用 {@link com.ruoyi.common.core.domain.PageQuery#build()} - */ -@Data -@Accessors(chain = true) -@Deprecated -public class PagePlus implements IPage { - - /** - * domain实体列表 - */ - private List records = Collections.emptyList(); - - /** - * vo实体列表 - */ - private List recordsVo = Collections.emptyList(); - - /** - * 总数 - */ - private long total = 0L; - - /** - * 页长度 - */ - private long size = 10L; - - /** - * 当前页 - */ - private long current = 1L; - - /** - * 排序字段信息 - */ - private List orders = new ArrayList<>(); - - /** - * 自动优化 COUNT SQL - */ - private boolean optimizeCountSql = true; - - /** - * 是否进行 count 查询 - */ - private boolean isSearchCount = true; - - /** - * 是否命中count缓存 - */ - private boolean hitCount = false; - - /** - * countId - */ - private String countId; - - /** - * 最大limit - */ - private Long maxLimit; - - public PagePlus() { - } - - public PagePlus(long current, long size) { - this(current, size, 0L); - } - - public PagePlus(long current, long size, long total) { - this(current, size, total, true); - } - - public PagePlus(long current, long size, boolean isSearchCount) { - this(current, size, 0L, isSearchCount); - } - - public PagePlus(long current, long size, long total, boolean isSearchCount) { - if (current > 1L) { - this.current = current; - } - this.size = size; - this.total = total; - this.isSearchCount = isSearchCount; - } - - @Override - public String countId() { - return this.getCountId(); - } - - @Override - public Long maxLimit() { - return this.getMaxLimit(); - } - - public PagePlus addOrder(OrderItem... items) { - this.orders.addAll(Arrays.asList(items)); - return this; - } - - public PagePlus addOrder(List items) { - this.orders.addAll(items); - return this; - } - - @Override - public List orders() { - return this.getOrders(); - } - - @Override - public boolean optimizeCountSql() { - return this.optimizeCountSql; - } - - @Override - public long getPages() { - // 解决 github issues/3208 - return IPage.super.getPages(); - } - - public static PagePlus of(long current, long size) { - return of(current, size, 0); - } - - public static PagePlus of(long current, long size, long total) { - return of(current, size, total, true); - } - - public static PagePlus of(long current, long size, boolean searchCount) { - return of(current, size, 0, searchCount); - } - - public static PagePlus of(long current, long size, long total, boolean searchCount) { - return new PagePlus<>(current, size, total, searchCount); - } - -} - diff --git a/ruoyi/src/main/java/com/ruoyi/common/core/page/TableDataInfo.java b/ruoyi/src/main/java/com/ruoyi/common/core/page/TableDataInfo.java index 46b01b94d..48353e3e7 100644 --- a/ruoyi/src/main/java/com/ruoyi/common/core/page/TableDataInfo.java +++ b/ruoyi/src/main/java/com/ruoyi/common/core/page/TableDataInfo.java @@ -19,45 +19,44 @@ import java.util.List; @Data @NoArgsConstructor -@Accessors(chain = true) @ApiModel("分页响应对象") public class TableDataInfo implements Serializable { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - /** - * 总记录数 - */ - @ApiModelProperty("总记录数") - private long total; + /** + * 总记录数 + */ + @ApiModelProperty("总记录数") + private long total; - /** - * 列表数据 - */ - @ApiModelProperty("列表数据") - private List rows; + /** + * 列表数据 + */ + @ApiModelProperty("列表数据") + private List rows; - /** - * 消息状态码 - */ - @ApiModelProperty("消息状态码") - private int code; + /** + * 消息状态码 + */ + @ApiModelProperty("消息状态码") + private int code; - /** - * 消息内容 - */ - @ApiModelProperty("消息内容") - private String msg; + /** + * 消息内容 + */ + @ApiModelProperty("消息内容") + private String msg; - /** - * 分页 - * - * @param list 列表数据 - * @param total 总记录数 - */ - public TableDataInfo(List list, long total) { - this.rows = list; - this.total = total; - } + /** + * 分页 + * + * @param list 列表数据 + * @param total 总记录数 + */ + public TableDataInfo(List list, long total) { + this.rows = list; + this.total = total; + } public static TableDataInfo build(IPage page) { TableDataInfo rspData = new TableDataInfo<>(); diff --git a/ruoyi/src/main/java/com/ruoyi/common/core/service/SensitiveService.java b/ruoyi/src/main/java/com/ruoyi/common/core/service/SensitiveService.java new file mode 100644 index 000000000..7b27bb45c --- /dev/null +++ b/ruoyi/src/main/java/com/ruoyi/common/core/service/SensitiveService.java @@ -0,0 +1,18 @@ +package com.ruoyi.common.core.service; + +/** + * 脱敏服务 + * 默认管理员不过滤 + * 需自行根据业务重写实现 + * + * @author Lion Li + * @version 3.6.0 + */ +public interface SensitiveService { + + /** + * 是否脱敏 + */ + boolean isSensitive(); + +} diff --git a/ruoyi/src/main/java/com/ruoyi/common/core/service/TokenService.java b/ruoyi/src/main/java/com/ruoyi/common/core/service/TokenService.java deleted file mode 100644 index d9a9f0acf..000000000 --- a/ruoyi/src/main/java/com/ruoyi/common/core/service/TokenService.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.ruoyi.common.core.service; - -import com.ruoyi.common.core.domain.model.LoginUser; - -import javax.servlet.http.HttpServletRequest; - -/** - * token验证处理 - * - * @author Lion Li - */ -public interface TokenService { - - /** - * 获取用户身份信息 - * - * @return 用户信息 - */ - LoginUser getLoginUser(HttpServletRequest request); - - /** - * 设置用户身份信息 - */ - void setLoginUser(LoginUser loginUser); - - /** - * 删除用户身份信息 - */ - void delLoginUser(String token); - - /** - * 创建令牌 - * - * @param loginUser 用户信息 - * @return 令牌 - */ - String createToken(LoginUser loginUser); - - /** - * 验证令牌有效期,相差不足20分钟,自动刷新缓存 - * - * @param loginUser - * @return 令牌 - */ - void verifyToken(LoginUser loginUser); - - /** - * 刷新令牌有效期 - * - * @param loginUser 登录信息 - */ - void refreshToken(LoginUser loginUser); - - /** - * 设置用户代理信息 - * - * @param loginUser 登录信息 - */ - void setUserAgent(LoginUser loginUser); - - /** - * 从令牌中获取用户名 - * - * @param token 令牌 - * @return 用户名 - */ - String getUsernameFromToken(String token); - -} diff --git a/ruoyi/src/main/java/com/ruoyi/common/core/service/UserService.java b/ruoyi/src/main/java/com/ruoyi/common/core/service/UserService.java deleted file mode 100644 index e637f4731..000000000 --- a/ruoyi/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/src/main/java/com/ruoyi/common/enums/DataScopeType.java b/ruoyi/src/main/java/com/ruoyi/common/enums/DataScopeType.java index 7cf3d5e31..64324652b 100644 --- a/ruoyi/src/main/java/com/ruoyi/common/enums/DataScopeType.java +++ b/ruoyi/src/main/java/com/ruoyi/common/enums/DataScopeType.java @@ -6,10 +6,10 @@ import lombok.Getter; /** * 数据权限类型 - * + *

* 语法支持 spel 模板表达式 - * - * 内置数据 user 当前用户 内容参考 SysUser + *

+ * 内置数据 user 当前用户 内容参考 LoginUser * 如需扩展数据 可使用 {@link com.ruoyi.common.helper.DataPermissionHelper} 操作 * 内置服务 sdss 系统数据权限服务 内容参考 SysDataScopeService * 如需扩展更多自定义服务 可以参考 sdss 自行编写 @@ -44,7 +44,7 @@ public enum DataScopeType { /** * 仅本人数据权限 */ - SELF("5", " #{#userName} = #{#user.userId} " , " 1 = 0 "); + SELF("5", " #{#userName} = #{#user.userId} ", " 1 = 0 "); private final String code; diff --git a/ruoyi/src/main/java/com/ruoyi/common/enums/DataSourceType.java b/ruoyi/src/main/java/com/ruoyi/common/enums/DataSourceType.java deleted file mode 100644 index afa4e14f0..000000000 --- a/ruoyi/src/main/java/com/ruoyi/common/enums/DataSourceType.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.ruoyi.common.enums; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 数据源 - * - * @author Lion Li - * @deprecated 3.6.0 移除 - */ -@AllArgsConstructor -@Deprecated -public enum DataSourceType { - /** - * 主库 - */ - MASTER("master"), - - /** - * 从库 - */ - SLAVE("slave"); - - @Getter - private final String source; -} diff --git a/ruoyi/src/main/java/com/ruoyi/common/enums/DeviceType.java b/ruoyi/src/main/java/com/ruoyi/common/enums/DeviceType.java new file mode 100644 index 000000000..e6ac849df --- /dev/null +++ b/ruoyi/src/main/java/com/ruoyi/common/enums/DeviceType.java @@ -0,0 +1,27 @@ +package com.ruoyi.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 设备类型 + * 针对一套 用户体系 + * + * @author Lion Li + */ +@Getter +@AllArgsConstructor +public enum DeviceType { + + /** + * pc端 + */ + PC("pc"), + + /** + * app端 + */ + APP("app"); + + private final String device; +} diff --git a/ruoyi/src/main/java/com/ruoyi/common/enums/SensitiveStrategy.java b/ruoyi/src/main/java/com/ruoyi/common/enums/SensitiveStrategy.java new file mode 100644 index 000000000..f667173c6 --- /dev/null +++ b/ruoyi/src/main/java/com/ruoyi/common/enums/SensitiveStrategy.java @@ -0,0 +1,49 @@ +package com.ruoyi.common.enums; + +import cn.hutool.core.util.DesensitizedUtil; +import lombok.AllArgsConstructor; + +import java.util.function.Function; + +/** + * 脱敏策略 + * + * @author Yjoioooo + * @version 3.6.0 + */ +@AllArgsConstructor +public enum SensitiveStrategy { + + /** + * 身份证脱敏 + */ + ID_CARD(s -> DesensitizedUtil.idCardNum(s, 3, 4)), + + /** + * 手机号脱敏 + */ + PHONE(DesensitizedUtil::mobilePhone), + + /** + * 地址脱敏 + */ + ADDRESS(s -> DesensitizedUtil.address(s, 8)), + + /** + * 邮箱脱敏 + */ + EMAIL(DesensitizedUtil::email), + + /** + * 银行卡 + */ + BANK_CARD(DesensitizedUtil::bankCard); + + //可自行添加其他脱敏策略 + + private final Function desensitizer; + + public Function desensitizer() { + return desensitizer; + } +} diff --git a/ruoyi/src/main/java/com/ruoyi/common/enums/UserType.java b/ruoyi/src/main/java/com/ruoyi/common/enums/UserType.java new file mode 100644 index 000000000..ec6510d98 --- /dev/null +++ b/ruoyi/src/main/java/com/ruoyi/common/enums/UserType.java @@ -0,0 +1,37 @@ +package com.ruoyi.common.enums; + +import com.ruoyi.common.utils.StringUtils; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 设备类型 + * 针对多套 用户体系 + * + * @author Lion Li + */ +@Getter +@AllArgsConstructor +public enum UserType { + + /** + * pc端 + */ + SYS_USER("sys_user"), + + /** + * app端 + */ + APP_USER("app_user"); + + private final String userType; + + public static UserType getUserType(String str) { + for (UserType value : values()) { + if (StringUtils.contains(str, value.getUserType())) { + return value; + } + } + throw new RuntimeException("'UserType' not found By " + str); + } +} diff --git a/ruoyi/src/main/java/com/ruoyi/common/exception/base/BaseException.java b/ruoyi/src/main/java/com/ruoyi/common/exception/base/BaseException.java index 13c0d2fef..dc0b84bf6 100644 --- a/ruoyi/src/main/java/com/ruoyi/common/exception/base/BaseException.java +++ b/ruoyi/src/main/java/com/ruoyi/common/exception/base/BaseException.java @@ -2,7 +2,9 @@ package com.ruoyi.common.exception.base; import com.ruoyi.common.utils.MessageUtils; import com.ruoyi.common.utils.StringUtils; -import lombok.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; /** * 基础异常 diff --git a/ruoyi/src/main/java/com/ruoyi/common/filter/RepeatableFilter.java b/ruoyi/src/main/java/com/ruoyi/common/filter/RepeatableFilter.java index 0e4b2658b..8927366e0 100644 --- a/ruoyi/src/main/java/com/ruoyi/common/filter/RepeatableFilter.java +++ b/ruoyi/src/main/java/com/ruoyi/common/filter/RepeatableFilter.java @@ -20,10 +20,10 @@ public class RepeatableFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) - throws IOException, ServletException { + throws IOException, ServletException { ServletRequest requestWrapper = null; if (request instanceof HttpServletRequest - && StringUtils.startsWithIgnoreCase(request.getContentType(), MediaType.APPLICATION_JSON_VALUE)) { + && StringUtils.startsWithIgnoreCase(request.getContentType(), MediaType.APPLICATION_JSON_VALUE)) { requestWrapper = new RepeatedlyRequestWrapper((HttpServletRequest) request, response); } if (null == requestWrapper) { diff --git a/ruoyi/src/main/java/com/ruoyi/common/filter/XssFilter.java b/ruoyi/src/main/java/com/ruoyi/common/filter/XssFilter.java index f397de1ec..72a8f2740 100644 --- a/ruoyi/src/main/java/com/ruoyi/common/filter/XssFilter.java +++ b/ruoyi/src/main/java/com/ruoyi/common/filter/XssFilter.java @@ -33,7 +33,7 @@ public class XssFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) - throws IOException, ServletException { + throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse resp = (HttpServletResponse) response; if (handleExcludeURL(req, resp)) { diff --git a/ruoyi/src/main/java/com/ruoyi/common/helper/DataPermissionHelper.java b/ruoyi/src/main/java/com/ruoyi/common/helper/DataPermissionHelper.java index 96f5425f1..ec4d56767 100644 --- a/ruoyi/src/main/java/com/ruoyi/common/helper/DataPermissionHelper.java +++ b/ruoyi/src/main/java/com/ruoyi/common/helper/DataPermissionHelper.java @@ -2,6 +2,8 @@ package com.ruoyi.common.helper; import cn.hutool.core.util.ObjectUtil; import com.ruoyi.common.utils.ServletUtils; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; import javax.servlet.http.HttpServletRequest; import java.util.HashMap; @@ -13,6 +15,7 @@ import java.util.Map; * @author Lion Li * @version 3.5.0 */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) @SuppressWarnings("unchecked cast") public class DataPermissionHelper { @@ -24,7 +27,6 @@ public class DataPermissionHelper { } - public static void setVariable(String key, Object value) { Map context = getContext(); context.put(key, value); diff --git a/ruoyi/src/main/java/com/ruoyi/common/helper/LoginHelper.java b/ruoyi/src/main/java/com/ruoyi/common/helper/LoginHelper.java new file mode 100644 index 000000000..a15220859 --- /dev/null +++ b/ruoyi/src/main/java/com/ruoyi/common/helper/LoginHelper.java @@ -0,0 +1,136 @@ +package com.ruoyi.common.helper; + +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.util.ObjectUtil; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.enums.DeviceType; +import com.ruoyi.common.enums.UserType; +import com.ruoyi.common.exception.UtilException; +import com.ruoyi.common.utils.StringUtils; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +/** + * 登录鉴权助手 + * 为适配多端登录而封装 + * + * @author Lion Li + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class LoginHelper { + + public static final String JOIN_CODE = ":"; + public static final String LOGIN_USER_KEY = "loginUser"; + + private static final ThreadLocal LOGIN_CACHE = new ThreadLocal<>(); + + /** + * 登录系统 + * 针对两套用户体系 + * + * @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); + } + + /** + * 设置用户数据(多级缓存) + */ + public static void setLoginUser(LoginUser loginUser) { + StpUtil.getTokenSession().set(LOGIN_USER_KEY, loginUser); + } + + /** + * 获取用户(多级缓存) + */ + public static LoginUser getLoginUser() { + LoginUser loginUser = LOGIN_CACHE.get(); + if (loginUser != null) { + return loginUser; + } + return (LoginUser) StpUtil.getTokenSession().get(LOGIN_USER_KEY); + } + + /** + * 清除一级缓存 防止内存问题 + */ + public static void clearCache() { + LOGIN_CACHE.remove(); + } + + /** + * 获取用户id + */ + public static Long getUserId() { + LoginUser loginUser = getLoginUser(); + if (ObjectUtil.isNull(loginUser)) { + String loginId = StpUtil.getLoginIdAsString(); + String userId = null; + for (UserType value : UserType.values()) { + if (StringUtils.contains(loginId, value.getUserType())) { + String[] strs = StringUtils.split(loginId, JOIN_CODE); + // 用户id在总是在最后 + userId = strs[strs.length - 1]; + } + } + if (StringUtils.isBlank(userId)) { + throw new UtilException("登录用户: LoginId异常 => " + loginId); + } + return Long.parseLong(userId); + } + return loginUser.getUserId(); + } + + /** + * 获取部门ID + */ + public static Long getDeptId() { + return getLoginUser().getDeptId(); + } + + /** + * 获取用户账户 + */ + public static String getUsername() { + return getLoginUser().getUsername(); + } + + /** + * 获取用户类型 + */ + public static UserType getUserType() { + String loginId = StpUtil.getLoginIdAsString(); + return UserType.getUserType(loginId); + } + + /** + * 是否为管理员 + * + * @param userId 用户ID + * @return 结果 + */ + public static boolean isAdmin(Long userId) { + return userId != null && 1L == userId; + } + + public static boolean isAdmin() { + Long userId = getUserId(); + return userId != null && 1L == userId; + } + +} diff --git a/ruoyi/src/main/java/com/ruoyi/common/jackson/SensitiveJsonSerializer.java b/ruoyi/src/main/java/com/ruoyi/common/jackson/SensitiveJsonSerializer.java new file mode 100644 index 000000000..55c4e6a7d --- /dev/null +++ b/ruoyi/src/main/java/com/ruoyi/common/jackson/SensitiveJsonSerializer.java @@ -0,0 +1,46 @@ +package com.ruoyi.common.jackson; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.BeanProperty; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.ContextualSerializer; +import com.ruoyi.common.annotation.Sensitive; +import com.ruoyi.common.core.service.SensitiveService; +import com.ruoyi.common.enums.SensitiveStrategy; +import com.ruoyi.common.utils.spring.SpringUtils; + +import java.io.IOException; +import java.util.Objects; + +/** + * 数据脱敏json序列化工具 + * + * @author Yjoioooo + */ +public class SensitiveJsonSerializer extends JsonSerializer implements ContextualSerializer { + + private SensitiveStrategy strategy; + + @Override + public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + SensitiveService sensitiveService = SpringUtils.getBean(SensitiveService.class); + if (sensitiveService.isSensitive()) { + gen.writeString(value); + } else { + gen.writeString(strategy.desensitizer().apply(value)); + } + + } + + @Override + public JsonSerializer createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException { + Sensitive annotation = property.getAnnotation(Sensitive.class); + if (Objects.nonNull(annotation) && Objects.equals(String.class, property.getType().getRawClass())) { + this.strategy = annotation.strategy(); + return this; + } + return prov.findValueSerializer(property.getType(), property); + } +} diff --git a/ruoyi/src/main/java/com/ruoyi/common/properties/TokenProperties.java b/ruoyi/src/main/java/com/ruoyi/common/properties/TokenProperties.java deleted file mode 100644 index 927a9413d..000000000 --- a/ruoyi/src/main/java/com/ruoyi/common/properties/TokenProperties.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.ruoyi.common.properties; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -/** - * token 配置属性 - * - * @author Lion Li - */ -@Data -@Component -@ConfigurationProperties(prefix = "token") -public class TokenProperties { - - /** - * 令牌自定义标识 - */ - private String header; - - /** - * 令牌秘钥 - */ - private String secret; - - /** - * 令牌有效期(默认30分钟) - */ - private int expireTime; -} diff --git a/ruoyi/src/main/java/com/ruoyi/common/utils/BeanCopyUtils.java b/ruoyi/src/main/java/com/ruoyi/common/utils/BeanCopyUtils.java index 0bd4a55b9..23ace00f9 100644 --- a/ruoyi/src/main/java/com/ruoyi/common/utils/BeanCopyUtils.java +++ b/ruoyi/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/src/main/java/com/ruoyi/common/utils/DateUtils.java b/ruoyi/src/main/java/com/ruoyi/common/utils/DateUtils.java index bc38eedd5..9d1a14cd1 100644 --- a/ruoyi/src/main/java/com/ruoyi/common/utils/DateUtils.java +++ b/ruoyi/src/main/java/com/ruoyi/common/utils/DateUtils.java @@ -28,9 +28,9 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils { public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss"; private static String[] parsePatterns = { - "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", - "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM", - "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"}; + "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", + "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM", + "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"}; /** * 获取当前Date型日期 diff --git a/ruoyi/src/main/java/com/ruoyi/common/utils/JsonUtils.java b/ruoyi/src/main/java/com/ruoyi/common/utils/JsonUtils.java index 1c01912a3..446bf1b00 100644 --- a/ruoyi/src/main/java/com/ruoyi/common/utils/JsonUtils.java +++ b/ruoyi/src/main/java/com/ruoyi/common/utils/JsonUtils.java @@ -1,6 +1,8 @@ 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; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; @@ -11,7 +13,6 @@ import lombok.NoArgsConstructor; import java.io.IOException; import java.util.ArrayList; import java.util.List; -import java.util.Map; /** * JSON 工具类 @@ -28,7 +29,7 @@ public class JsonUtils { } public static String toJsonString(Object object) { - if (StringUtils.isNull(object)) { + if (ObjectUtil.isNull(object)) { return null; } try { @@ -71,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/src/main/java/com/ruoyi/common/utils/PageUtils.java b/ruoyi/src/main/java/com/ruoyi/common/utils/PageUtils.java deleted file mode 100644 index 5042de401..000000000 --- a/ruoyi/src/main/java/com/ruoyi/common/utils/PageUtils.java +++ /dev/null @@ -1,193 +0,0 @@ -package com.ruoyi.common.utils; - -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.http.HttpStatus; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.core.metadata.OrderItem; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.ruoyi.common.core.domain.PageQuery; -import com.ruoyi.common.core.page.PagePlus; -import com.ruoyi.common.core.page.TableDataInfo; -import com.ruoyi.common.utils.sql.SqlUtil; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; - -import java.util.List; - -/** - * 分页工具 - * - * @author Lion Li - * @deprecated 3.6.0 删除 请使用 {@link PageQuery} 与 {@link TableDataInfo} - */ -@Deprecated -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class PageUtils { - - /** - * 当前记录起始索引 - */ - @Deprecated - public static final String PAGE_NUM = "pageNum"; - - /** - * 每页显示记录数 - */ - @Deprecated - public static final String PAGE_SIZE = "pageSize"; - - /** - * 排序列 - */ - @Deprecated - public static final String ORDER_BY_COLUMN = "orderByColumn"; - - /** - * 排序的方向 "desc" 或者 "asc". - */ - @Deprecated - public static final String IS_ASC = "isAsc"; - - /** - * 当前记录起始索引 默认值 - */ - @Deprecated - public static final int DEFAULT_PAGE_NUM = 1; - - /** - * 每页显示记录数 默认值 默认查全部 - */ - @Deprecated - public static final int DEFAULT_PAGE_SIZE = Integer.MAX_VALUE; - - /** - * 构建 plus 分页对象 - * - * @param domain 实体 - * @param vo 实体 - * @return 分页对象 - * @deprecated 3.6.0 删除 请使用 {@link PageQuery#build()} - * 由于使用 Servlet 获取只能从 param 获取 灵活性降低 故将传参操作交给用户 - */ - @Deprecated - public static PagePlus buildPagePlus() { - Integer pageNum = ServletUtils.getParameterToInt(PAGE_NUM, DEFAULT_PAGE_NUM); - Integer pageSize = ServletUtils.getParameterToInt(PAGE_SIZE, DEFAULT_PAGE_SIZE); - String orderByColumn = ServletUtils.getParameter(ORDER_BY_COLUMN); - String isAsc = ServletUtils.getParameter(IS_ASC); - if (pageNum <= 0) { - pageNum = DEFAULT_PAGE_NUM; - } - PagePlus page = new PagePlus<>(pageNum, pageSize); - OrderItem orderItem = buildOrderItem(orderByColumn, isAsc); - if (ObjectUtil.isNotNull(orderItem)) { - page.addOrder(orderItem); - } - return page; - } - - @Deprecated - public static Page buildPage() { - return buildPage(null, null); - } - - /** - * 构建 MP 普通分页对象 - * - * @param domain 实体 - * @return 分页对象 - * @deprecated 3.6.0 删除 请使用 {@link PageQuery#build()} - * 由于使用 Servlet 获取只能从 param 获取 灵活性降低 故将传参操作交给用户 - */ - @Deprecated - public static Page buildPage(String defaultOrderByColumn, String defaultIsAsc) { - Integer pageNum = ServletUtils.getParameterToInt(PAGE_NUM, DEFAULT_PAGE_NUM); - Integer pageSize = ServletUtils.getParameterToInt(PAGE_SIZE, DEFAULT_PAGE_SIZE); - String orderByColumn = ServletUtils.getParameter(ORDER_BY_COLUMN, defaultOrderByColumn); - String isAsc = ServletUtils.getParameter(IS_ASC, defaultIsAsc); - if (pageNum <= 0) { - pageNum = DEFAULT_PAGE_NUM; - } - Page page = new Page<>(pageNum, pageSize); - OrderItem orderItem = buildOrderItem(orderByColumn, isAsc); - if (ObjectUtil.isNotNull(orderItem)) { - page.addOrder(orderItem); - } - return page; - } - - private static OrderItem buildOrderItem(String orderByColumn, String isAsc) { - // 兼容前端排序类型 - if ("ascending".equals(isAsc)) { - isAsc = "asc"; - } else if ("descending".equals(isAsc)) { - isAsc = "desc"; - } - if (StringUtils.isNotBlank(orderByColumn)) { - String orderBy = SqlUtil.escapeOrderBySql(orderByColumn); - orderBy = StringUtils.toUnderScoreCase(orderBy); - if ("asc".equals(isAsc)) { - return OrderItem.asc(orderBy); - } else if ("desc".equals(isAsc)) { - return OrderItem.desc(orderBy); - } - } - return null; - } - - /** - * 构建 MP 普通分页对象 - * - * @param domain 实体 - * @return 分页对象 - * @deprecated 3.6.0 删除 请使用 {@link PageQuery#build()} - * 由于使用 Servlet 获取只能从 param 获取 灵活性降低 故将传参操作交给用户 - */ - @Deprecated - public static TableDataInfo buildDataInfo(PagePlus page) { - TableDataInfo rspData = new TableDataInfo<>(); - rspData.setCode(HttpStatus.HTTP_OK); - rspData.setMsg("查询成功"); - rspData.setRows(page.getRecordsVo()); - rspData.setTotal(page.getTotal()); - return rspData; - } - - /** - * @deprecated 3.6.0 删除 请使用 {@link TableDataInfo#build(IPage)} - */ - @Deprecated - public static TableDataInfo buildDataInfo(Page page) { - TableDataInfo rspData = new TableDataInfo<>(); - rspData.setCode(HttpStatus.HTTP_OK); - rspData.setMsg("查询成功"); - rspData.setRows(page.getRecords()); - rspData.setTotal(page.getTotal()); - return rspData; - } - - /** - * @deprecated 3.6.0 删除 请使用 {@link TableDataInfo#build(List)} - */ - @Deprecated - public static TableDataInfo buildDataInfo(List list) { - TableDataInfo rspData = new TableDataInfo<>(); - rspData.setCode(HttpStatus.HTTP_OK); - rspData.setMsg("查询成功"); - rspData.setRows(list); - rspData.setTotal(list.size()); - return rspData; - } - - /** - * @deprecated 3.6.0 删除 请使用 {@link TableDataInfo#build()} - */ - @Deprecated - public static TableDataInfo buildDataInfo() { - TableDataInfo rspData = new TableDataInfo<>(); - rspData.setCode(HttpStatus.HTTP_OK); - rspData.setMsg("查询成功"); - return rspData; - } - -} diff --git a/ruoyi/src/main/java/com/ruoyi/common/utils/SecurityUtils.java b/ruoyi/src/main/java/com/ruoyi/common/utils/SecurityUtils.java deleted file mode 100644 index 43cb8fe17..000000000 --- a/ruoyi/src/main/java/com/ruoyi/common/utils/SecurityUtils.java +++ /dev/null @@ -1,103 +0,0 @@ -package com.ruoyi.common.utils; - -import cn.hutool.http.HttpStatus; -import com.ruoyi.common.core.domain.model.LoginUser; -import com.ruoyi.common.exception.ServiceException; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; - -/** - * 安全服务工具类 - * - * @author ruoyi - */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class SecurityUtils { - - /** - * 用户ID - **/ - public static Long getUserId() { - try { - return getLoginUser().getUserId(); - } catch (Exception e) { - throw new ServiceException("获取用户ID异常", HttpStatus.HTTP_UNAUTHORIZED); - } - } - - /** - * 获取部门ID - **/ - public static Long getDeptId() { - try { - return getLoginUser().getDeptId(); - } catch (Exception e) { - throw new ServiceException("获取部门ID异常", HttpStatus.HTTP_UNAUTHORIZED); - } - } - - /** - * 获取用户账户 - **/ - public static String getUsername() { - try { - return getLoginUser().getUsername(); - } catch (Exception e) { - throw new ServiceException("获取用户账户异常", HttpStatus.HTTP_UNAUTHORIZED); - } - } - - /** - * 获取用户 - **/ - public static LoginUser getLoginUser() { - try { - return (LoginUser) getAuthentication().getPrincipal(); - } catch (Exception e) { - throw new ServiceException("获取用户信息异常", HttpStatus.HTTP_UNAUTHORIZED); - } - } - - /** - * 获取Authentication - */ - public static Authentication getAuthentication() { - return SecurityContextHolder.getContext().getAuthentication(); - } - - /** - * 生成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/src/main/java/com/ruoyi/common/utils/ServletUtils.java b/ruoyi/src/main/java/com/ruoyi/common/utils/ServletUtils.java index 5babaeb30..6408c8944 100644 --- a/ruoyi/src/main/java/com/ruoyi/common/utils/ServletUtils.java +++ b/ruoyi/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/src/main/java/com/ruoyi/common/utils/StringUtils.java b/ruoyi/src/main/java/com/ruoyi/common/utils/StringUtils.java index f96c1e5a5..77a484ec8 100644 --- a/ruoyi/src/main/java/com/ruoyi/common/utils/StringUtils.java +++ b/ruoyi/src/main/java/com/ruoyi/common/utils/StringUtils.java @@ -2,15 +2,15 @@ package com.ruoyi.common.utils; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Validator; -import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.ReUtil; import cn.hutool.core.util.StrUtil; import lombok.AccessLevel; import lombok.NoArgsConstructor; +import org.springframework.util.AntPathMatcher; -import java.util.*; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; /** * 字符串工具类 @@ -20,338 +20,215 @@ import java.util.*; @NoArgsConstructor(access = AccessLevel.PRIVATE) public class StringUtils extends org.apache.commons.lang3.StringUtils { - /** - * 获取参数不为空值 - * - * @param value defaultValue 要判断的value - * @return value 返回值 - */ - public static T nvl(T value, T defaultValue) { - return ObjectUtil.defaultIfNull(value, defaultValue); - } + /** + * 获取参数不为空值 + * + * @param str defaultValue 要判断的value + * @return value 返回值 + */ + public static String blankToDefault(String str, String defaultValue) { + return StrUtil.blankToDefault(str, defaultValue); + } - /** - * 获取参数不为空值 - * - * @param str defaultValue 要判断的value - * @return value 返回值 - */ - public static String blankToDefault(String str, String defaultValue) { - return StrUtil.blankToDefault(str, defaultValue); - } + /** + * * 判断一个字符串是否为空串 + * + * @param str String + * @return true:为空 false:非空 + */ + public static boolean isEmpty(String str) { + return StrUtil.isEmpty(str); + } - /** - * * 判断一个Collection是否为空, 包含List,Set,Queue - * - * @param coll 要判断的Collection - * @return true:为空 false:非空 - */ - public static boolean isEmpty(Collection coll) { - return CollUtil.isEmpty(coll); - } + /** + * * 判断一个字符串是否为非空串 + * + * @param str String + * @return true:非空串 false:空串 + */ + public static boolean isNotEmpty(String str) { + return !isEmpty(str); + } - /** - * * 判断一个Collection是否非空,包含List,Set,Queue - * - * @param coll 要判断的Collection - * @return true:非空 false:空 - */ - public static boolean isNotEmpty(Collection coll) { - return !isEmpty(coll); - } + /** + * 去空格 + */ + public static String trim(String str) { + return StrUtil.trim(str); + } - /** - * * 判断一个对象数组是否为空 - * - * @param objects 要判断的对象数组 - * * @return true:为空 false:非空 - */ - public static boolean isEmpty(Object[] objects) { - return ArrayUtil.isEmpty(objects); - } + /** + * 截取字符串 + * + * @param str 字符串 + * @param start 开始 + * @return 结果 + */ + public static String substring(final String str, int start) { + return substring(str, start, str.length()); + } - /** - * * 判断一个对象数组是否非空 - * - * @param objects 要判断的对象数组 - * @return true:非空 false:空 - */ - public static boolean isNotEmpty(Object[] objects) { - return !isEmpty(objects); - } + /** + * 截取字符串 + * + * @param str 字符串 + * @param start 开始 + * @param end 结束 + * @return 结果 + */ + public static String substring(final String str, int start, int end) { + return StrUtil.sub(str, start, end); + } - /** - * * 判断一个对象是否为空 - * - * @param object 要判断的对象数组 - * * @return true:为空 false:非空 - */ - public static boolean isEmpty(Object object) { - return ObjectUtil.isEmpty(object); - } + /** + * 格式化文本, {} 表示占位符
+ * 此方法只是简单将占位符 {} 按照顺序替换为参数
+ * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可
+ * 例:
+ * 通常使用: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 \a for b
+ * + * @param template 文本模板,被替换的部分用 {} 表示 + * @param params 参数值 + * @return 格式化后的文本 + */ + public static String format(String template, Object... params) { + return StrUtil.format(template, params); + } - /** - * * 判断一个对象是否非空 - * - * @param object 要判断的对象数组 - * @return true:非空 false:空 - */ - public static boolean isNotEmpty(Object object) { - return !isEmpty(object); - } + /** + * 是否为http(s)://开头 + * + * @param link 链接 + * @return 结果 + */ + public static boolean ishttp(String link) { + return Validator.isUrl(link); + } - /** - * * 判断一个Map是否为空 - * - * @param map 要判断的Map - * @return true:为空 false:非空 - */ - public static boolean isEmpty(Map map) { - return MapUtil.isEmpty(map); - } + /** + * 字符串转set + * + * @param str 字符串 + * @param sep 分隔符 + * @return set集合 + */ + public static Set str2Set(String str, String sep) { + return new HashSet<>(str2List(str, sep, true, false)); + } - /** - * * 判断一个Map是否为空 - * - * @param map 要判断的Map - * @return true:非空 false:空 - */ - public static boolean isNotEmpty(Map map) { - return !isEmpty(map); - } + /** + * 字符串转list + * + * @param str 字符串 + * @param sep 分隔符 + * @param filterBlank 过滤纯空白 + * @param trim 去掉首尾空白 + * @return list集合 + */ + public static List str2List(String str, String sep, boolean filterBlank, boolean trim) { + List list = new ArrayList<>(); + if (isEmpty(str)) { + return list; + } - /** - * * 判断一个字符串是否为空串 - * - * @param str String - * @return true:为空 false:非空 - */ - public static boolean isEmpty(String str) { - return StrUtil.isEmpty(str); - } + // 过滤空白字符串 + if (filterBlank && isBlank(str)) { + return list; + } + String[] split = str.split(sep); + for (String string : split) { + if (filterBlank && isBlank(string)) { + continue; + } + if (trim) { + string = trim(string); + } + list.add(string); + } - /** - * * 判断一个字符串是否为非空串 - * - * @param str String - * @return true:非空串 false:空串 - */ - public static boolean isNotEmpty(String str) { - return !isEmpty(str); - } + return list; + } - /** - * * 判断一个对象是否为空 - * - * @param object Object - * @return true:为空 false:非空 - */ - public static boolean isNull(Object object) { - return ObjectUtil.isNull(object); - } + /** + * 查找指定字符串是否包含指定字符串列表中的任意一个字符串同时串忽略大小写 + * + * @param cs 指定字符串 + * @param searchCharSequences 需要检查的字符串数组 + * @return 是否包含任意一个字符串 + */ + public static boolean containsAnyIgnoreCase(CharSequence cs, CharSequence... searchCharSequences) { + return StrUtil.containsAnyIgnoreCase(cs, searchCharSequences); + } - /** - * * 判断一个对象是否非空 - * - * @param object Object - * @return true:非空 false:空 - */ - public static boolean isNotNull(Object object) { - return !isNull(object); - } + /** + * 驼峰转下划线命名 + */ + public static String toUnderScoreCase(String str) { + return StrUtil.toUnderlineCase(str); + } - /** - * * 判断一个对象是否是数组类型(Java基本型别的数组) - * - * @param object 对象 - * @return true:是数组 false:不是数组 - */ - public static boolean isArray(Object object) { - return ArrayUtil.isArray(object); - } + /** + * 是否包含字符串 + * + * @param str 验证字符串 + * @param strs 字符串组 + * @return 包含返回true + */ + public static boolean inStringIgnoreCase(String str, String... strs) { + return StrUtil.equalsAnyIgnoreCase(str, strs); + } - /** - * 去空格 - */ - public static String trim(String str) { - return StrUtil.trim(str); - } + /** + * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 例如:HELLO_WORLD->HelloWorld + * + * @param name 转换前的下划线大写方式命名的字符串 + * @return 转换后的驼峰式命名的字符串 + */ + public static String convertToCamelCase(String name) { + return StrUtil.upperFirst(StrUtil.toCamelCase(name)); + } - /** - * 截取字符串 - * - * @param str 字符串 - * @param start 开始 - * @return 结果 - */ - public static String substring(final String str, int start) { - return substring(str, start, str.length()); - } + /** + * 驼峰式命名法 例如:user_name->userName + */ + public static String toCamelCase(String s) { + return StrUtil.toCamelCase(s); + } - /** - * 截取字符串 - * - * @param str 字符串 - * @param start 开始 - * @param end 结束 - * @return 结果 - */ - public static String substring(final String str, int start, int end) { - return StrUtil.sub(str, start, end); - } + /** + * 查找指定字符串是否匹配指定字符串列表中的任意一个字符串 + * + * @param str 指定字符串 + * @param strs 需要检查的字符串数组 + * @return 是否匹配 + */ + public static boolean matches(String str, List strs) { + if (isEmpty(str) || CollUtil.isEmpty(strs)) { + return false; + } + for (String pattern : strs) { + if (isMatch(pattern, str)) { + return true; + } + } + return false; + } - /** - * 格式化文本, {} 表示占位符
- * 此方法只是简单将占位符 {} 按照顺序替换为参数
- * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可
- * 例:
- * 通常使用: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 \a for b
- * - * @param template 文本模板,被替换的部分用 {} 表示 - * @param params 参数值 - * @return 格式化后的文本 - */ - public static String format(String template, Object... params) { - return StrUtil.format(template, params); - } + /** + * 判断url是否与规则配置: + * ? 表示单个字符; + * * 表示一层路径内的任意字符串,不可跨层级; + * ** 表示任意层路径; + * + * @param pattern 匹配规则 + * @param url 需要匹配的url + * @return + */ + public static boolean isMatch(String pattern, String url) { + AntPathMatcher matcher = new AntPathMatcher(); + return matcher.match(pattern, url); + } - /** - * 是否为http(s)://开头 - * - * @param link 链接 - * @return 结果 - */ - public static boolean ishttp(String link) { - return Validator.isUrl(link); - } - - /** - * 字符串转set - * - * @param str 字符串 - * @param sep 分隔符 - * @return set集合 - */ - public static Set str2Set(String str, String sep) { - return new HashSet<>(str2List(str, sep, true, false)); - } - - /** - * 字符串转list - * - * @param str 字符串 - * @param sep 分隔符 - * @param filterBlank 过滤纯空白 - * @param trim 去掉首尾空白 - * @return list集合 - */ - public static List str2List(String str, String sep, boolean filterBlank, boolean trim) { - List list = new ArrayList<>(); - if (isEmpty(str)) { - return list; - } - - // 过滤空白字符串 - if (filterBlank && isBlank(str)) { - return list; - } - String[] split = str.split(sep); - for (String string : split) { - if (filterBlank && isBlank(string)) { - continue; - } - if (trim) { - string = trim(string); - } - list.add(string); - } - - return list; - } - - /** - * 查找指定字符串是否包含指定字符串列表中的任意一个字符串同时串忽略大小写 - * - * @param cs 指定字符串 - * @param searchCharSequences 需要检查的字符串数组 - * @return 是否包含任意一个字符串 - */ - public static boolean containsAnyIgnoreCase(CharSequence cs, CharSequence... searchCharSequences) { - return StrUtil.containsAnyIgnoreCase(cs, searchCharSequences); - } - - /** - * 驼峰转下划线命名 - */ - public static String toUnderScoreCase(String str) { - return StrUtil.toUnderlineCase(str); - } - - /** - * 是否包含字符串 - * - * @param str 验证字符串 - * @param strs 字符串组 - * @return 包含返回true - */ - public static boolean inStringIgnoreCase(String str, String... strs) { - return StrUtil.equalsAnyIgnoreCase(str, strs); - } - - /** - * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 例如:HELLO_WORLD->HelloWorld - * - * @param name 转换前的下划线大写方式命名的字符串 - * @return 转换后的驼峰式命名的字符串 - */ - public static String convertToCamelCase(String name) { - return StrUtil.upperFirst(StrUtil.toCamelCase(name)); - } - - /** - * 驼峰式命名法 例如:user_name->userName - */ - public static String toCamelCase(String s) { - return StrUtil.toCamelCase(s); - } - - /** - * 查找指定字符串是否匹配指定字符串列表中的任意一个字符串 - * - * @param str 指定字符串 - * @param strs 需要检查的字符串数组 - * @return 是否匹配 - */ - public static boolean matches(String str, List strs) { - if (isEmpty(str) || isEmpty(strs)) { - return false; - } - for (String pattern : strs) { - if (isMatch(pattern, str)) { - return true; - } - } - return false; - } - - /** - * 判断url是否与规则配置: - * ? 表示单个字符; - * * 表示一层路径内的任意字符串,不可跨层级; - * ** 表示任意层路径; - * - * @param pattern 匹配规则 - * @param url 需要匹配的url - * @return - */ - public static boolean isMatch(String pattern, String url) { - return ReUtil.isMatch(pattern, url); - } - - @SuppressWarnings("unchecked") - public static T cast(Object obj) { - return (T) obj; - } } diff --git a/ruoyi/src/main/java/com/ruoyi/common/utils/TreeBuildUtils.java b/ruoyi/src/main/java/com/ruoyi/common/utils/TreeBuildUtils.java index 76bf864f4..f9f8fa140 100644 --- a/ruoyi/src/main/java/com/ruoyi/common/utils/TreeBuildUtils.java +++ b/ruoyi/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/src/main/java/com/ruoyi/common/utils/ValidatorUtils.java b/ruoyi/src/main/java/com/ruoyi/common/utils/ValidatorUtils.java index 522b989b9..1fe2eaf64 100644 --- a/ruoyi/src/main/java/com/ruoyi/common/utils/ValidatorUtils.java +++ b/ruoyi/src/main/java/com/ruoyi/common/utils/ValidatorUtils.java @@ -17,9 +17,9 @@ import java.util.Set; @NoArgsConstructor(access = AccessLevel.PRIVATE) public class ValidatorUtils { - private static final Validator VALID = SpringUtils.getBean(Validator.class); + private static final Validator VALID = SpringUtils.getBean(Validator.class); - public static void validate(T object, Class... groups) { + public static void validate(T object, Class... groups) { Set> validate = VALID.validate(object, groups); if (!validate.isEmpty()) { throw new ConstraintViolationException("参数校验异常", validate); diff --git a/ruoyi/src/main/java/com/ruoyi/common/utils/file/FileUtils.java b/ruoyi/src/main/java/com/ruoyi/common/utils/file/FileUtils.java index 5118d5169..61f26005b 100644 --- a/ruoyi/src/main/java/com/ruoyi/common/utils/file/FileUtils.java +++ b/ruoyi/src/main/java/com/ruoyi/common/utils/file/FileUtils.java @@ -29,11 +29,11 @@ public class FileUtils extends FileUtil { StringBuilder contentDispositionValue = new StringBuilder(); contentDispositionValue.append("attachment; filename=") - .append(percentEncodedFileName) - .append(";") - .append("filename*=") - .append("utf-8''") - .append(percentEncodedFileName); + .append(percentEncodedFileName) + .append(";") + .append("filename*=") + .append("utf-8''") + .append(percentEncodedFileName); response.addHeader("Access-Control-Allow-Origin", "*"); response.addHeader("Access-Control-Expose-Headers", "Content-Disposition,download-filename"); diff --git a/ruoyi/src/main/java/com/ruoyi/common/utils/ip/AddressUtils.java b/ruoyi/src/main/java/com/ruoyi/common/utils/ip/AddressUtils.java index b519226bb..8d3515e7f 100644 --- a/ruoyi/src/main/java/com/ruoyi/common/utils/ip/AddressUtils.java +++ b/ruoyi/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; - /** * 获取地址类 * @@ -41,21 +40,21 @@ public class AddressUtils { if (RuoYiConfig.isAddressEnabled()) { try { String rspStr = HttpUtil.createGet(IP_URL) - .body("ip=" + ip + "&json=true", Constants.GBK) - .execute() - .body(); + .body("ip=" + ip + "&json=true", Constants.GBK) + .execute() + .body(); if (StringUtils.isEmpty(rspStr)) { 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/src/main/java/com/ruoyi/common/utils/redis/QueueUtils.java b/ruoyi/src/main/java/com/ruoyi/common/utils/redis/QueueUtils.java new file mode 100644 index 000000000..7850e016d --- /dev/null +++ b/ruoyi/src/main/java/com/ruoyi/common/utils/redis/QueueUtils.java @@ -0,0 +1,222 @@ +package com.ruoyi.common.utils.redis; + +import com.ruoyi.common.utils.spring.SpringUtils; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.redisson.api.*; + +import java.util.Comparator; +import java.util.concurrent.TimeUnit; +import java.util.function.Consumer; + +/** + * 分布式队列工具 + * 轻量级队列 重量级数据量 请使用 MQ + * 要求 redis 5.X 以上 + * + * @author Lion Li + * @version 3.6.0 新增 + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class QueueUtils { + + private static final RedissonClient CLIENT = SpringUtils.getBean(RedissonClient.class); + + + /** + * 获取客户端实例 + */ + public static RedissonClient getClient() { + return CLIENT; + } + + /** + * 添加延迟队列数据 默认毫秒 + * + * @param queueName 队列名 + * @param data 数据 + * @param time 延迟时间 + */ + public static void addDelayedQueueObject(String queueName, T data, long time) { + addDelayedQueueObject(queueName, data, time, TimeUnit.MILLISECONDS); + } + + /** + * 添加延迟队列数据 + * + * @param queueName 队列名 + * @param data 数据 + * @param time 延迟时间 + * @param timeUnit 单位 + */ + public static void addDelayedQueueObject(String queueName, T data, long time, TimeUnit timeUnit) { + RBlockingQueue queue = CLIENT.getBlockingQueue(queueName); + RDelayedQueue delayedQueue = CLIENT.getDelayedQueue(queue); + delayedQueue.offer(data, time, timeUnit); + } + + /** + * 获取一个延迟队列数据 没有数据返回 null + * + * @param queueName 队列名 + */ + public static T getDelayedQueueObject(String queueName) { + RBlockingQueue queue = CLIENT.getBlockingQueue(queueName); + RDelayedQueue delayedQueue = CLIENT.getDelayedQueue(queue); + return delayedQueue.poll(); + } + + /** + * 删除延迟队列数据 + */ + public static boolean removeDelayedQueueObject(String queueName, T data) { + RBlockingQueue queue = CLIENT.getBlockingQueue(queueName); + RDelayedQueue delayedQueue = CLIENT.getDelayedQueue(queue); + return delayedQueue.remove(data); + } + + /** + * 销毁延迟队列 所有阻塞监听 报错 + */ + public static void destroyDelayedQueue(String queueName) { + RBlockingQueue queue = CLIENT.getBlockingQueue(queueName); + RDelayedQueue delayedQueue = CLIENT.getDelayedQueue(queue); + delayedQueue.destroy(); + } + + /** + * 尝试设置 优先队列比较器 用于排序优先级 + * + * @param queueName 队列名 + * @param comparator 比较器 + */ + public static boolean trySetPriorityQueueComparator(String queueName, Comparator comparator) { + RPriorityBlockingQueue priorityBlockingQueue = CLIENT.getPriorityBlockingQueue(queueName); + return priorityBlockingQueue.trySetComparator(comparator); + } + + /** + * 尝试设置 优先队列比较器 用于排序优先级 + * + * @param queueName 队列名 + * @param comparator 比较器 + * @param destroy 已存在是否销毁 + */ + public static boolean trySetPriorityQueueComparator(String queueName, Comparator comparator, boolean destroy) { + RPriorityBlockingQueue priorityBlockingQueue = CLIENT.getPriorityBlockingQueue(queueName); + if (priorityBlockingQueue.isExists() && destroy) { + destroyPriorityQueueObject(queueName); + } + return priorityBlockingQueue.trySetComparator(comparator); + } + + /** + * 添加优先队列数据 + * + * @param queueName 队列名 + * @param data 数据 + */ + public static boolean addPriorityQueueObject(String queueName, T data) { + RPriorityBlockingQueue priorityBlockingQueue = CLIENT.getPriorityBlockingQueue(queueName); + return priorityBlockingQueue.offer(data); + } + + /** + * 获取一个优先队列数据 没有数据返回 null + * + * @param queueName 队列名 + */ + public static T getPriorityQueueObject(String queueName) { + RPriorityBlockingQueue priorityBlockingQueue = CLIENT.getPriorityBlockingQueue(queueName); + return priorityBlockingQueue.poll(); + } + + /** + * 删除优先队列数据 + */ + public static boolean removePriorityQueueObject(String queueName, T data) { + RPriorityBlockingQueue priorityBlockingQueue = CLIENT.getPriorityBlockingQueue(queueName); + return priorityBlockingQueue.remove(data); + } + + /** + * 销毁优先队列 + */ + public static boolean destroyPriorityQueueObject(String queueName) { + RPriorityBlockingQueue priorityBlockingQueue = CLIENT.getPriorityBlockingQueue(queueName); + return priorityBlockingQueue.delete(); + } + + /** + * 尝试设置 有界队列 容量 用于限制数量 + * + * @param queueName 队列名 + * @param capacity 容量 + */ + public static boolean trySetBoundedQueueCapacity(String queueName, int capacity) { + RBoundedBlockingQueue boundedBlockingQueue = CLIENT.getBoundedBlockingQueue(queueName); + return boundedBlockingQueue.trySetCapacity(capacity); + } + + /** + * 尝试设置 有界队列 容量 用于限制数量 + * + * @param queueName 队列名 + * @param capacity 容量 + * @param destroy 已存在是否销毁 + */ + public static boolean trySetBoundedQueueCapacity(String queueName, int capacity, boolean destroy) { + RBoundedBlockingQueue boundedBlockingQueue = CLIENT.getBoundedBlockingQueue(queueName); + if (boundedBlockingQueue.isExists() && destroy) { + destroyBoundedQueueObject(queueName); + } + return boundedBlockingQueue.trySetCapacity(capacity); + } + + /** + * 添加有界队列数据 + * + * @param queueName 队列名 + * @param data 数据 + * @return 添加成功 true 已达到界限 false + */ + public static boolean addBoundedQueueObject(String queueName, T data) { + RBoundedBlockingQueue boundedBlockingQueue = CLIENT.getBoundedBlockingQueue(queueName); + return boundedBlockingQueue.offer(data); + } + + /** + * 获取一个有界队列数据 没有数据返回 null + * + * @param queueName 队列名 + */ + public static T getBoundedQueueObject(String queueName) { + RBoundedBlockingQueue boundedBlockingQueue = CLIENT.getBoundedBlockingQueue(queueName); + return boundedBlockingQueue.poll(); + } + + /** + * 删除有界队列数据 + */ + public static boolean removeBoundedQueueObject(String queueName, T data) { + RBoundedBlockingQueue boundedBlockingQueue = CLIENT.getBoundedBlockingQueue(queueName); + return boundedBlockingQueue.remove(data); + } + + /** + * 销毁有界队列 + */ + public static boolean destroyBoundedQueueObject(String queueName) { + RBoundedBlockingQueue boundedBlockingQueue = CLIENT.getBoundedBlockingQueue(queueName); + return boundedBlockingQueue.delete(); + } + + /** + * 订阅阻塞队列(可订阅所有实现类 例如: 延迟 优先 有界 等) + */ + public static void subscribeBlockingQueue(String queueName, Consumer consumer) { + RBlockingQueue queue = CLIENT.getBlockingQueue(queueName); + queue.subscribeOnElements(consumer); + } + +} diff --git a/ruoyi/src/main/java/com/ruoyi/common/utils/RedisUtils.java b/ruoyi/src/main/java/com/ruoyi/common/utils/redis/RedisUtils.java similarity index 97% rename from ruoyi/src/main/java/com/ruoyi/common/utils/RedisUtils.java rename to ruoyi/src/main/java/com/ruoyi/common/utils/redis/RedisUtils.java index 0ccbe0fa5..5a15d46b7 100644 --- a/ruoyi/src/main/java/com/ruoyi/common/utils/RedisUtils.java +++ b/ruoyi/src/main/java/com/ruoyi/common/utils/redis/RedisUtils.java @@ -1,4 +1,4 @@ -package com.ruoyi.common.utils; +package com.ruoyi.common.utils.redis; import cn.hutool.core.collection.IterUtil; import com.ruoyi.common.utils.spring.SpringUtils; @@ -130,7 +130,7 @@ public class RedisUtils { /** * 注册对象监听器 - * + *

* key 监听器需开启 `notify-keyspace-events` 等 redis 相关配置 * * @param key 缓存的键值 @@ -223,7 +223,7 @@ public class RedisUtils { /** * 注册List监听器 - * + *

* key 监听器需开启 `notify-keyspace-events` 等 redis 相关配置 * * @param key 缓存的键值 @@ -259,7 +259,7 @@ public class RedisUtils { /** * 注册Set监听器 - * + *

* key 监听器需开启 `notify-keyspace-events` 等 redis 相关配置 * * @param key 缓存的键值 @@ -296,7 +296,7 @@ public class RedisUtils { /** * 注册Map监听器 - * + *

* key 监听器需开启 `notify-keyspace-events` 等 redis 相关配置 * * @param key 缓存的键值 @@ -376,4 +376,14 @@ public class RedisUtils { Iterable iterable = CLIENT.getKeys().getKeysByPattern(pattern); return IterUtil.toList(iterable); } + + /** + * 检查redis中是否存在key + * + * @param key 键 + */ + public static Boolean hasKey(String key) { + RKeys rKeys = CLIENT.getKeys(); + return rKeys.countExists(key) > 0; + } } diff --git a/ruoyi/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java b/ruoyi/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java index 5829a1e91..789149615 100644 --- a/ruoyi/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java +++ b/ruoyi/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java @@ -16,7 +16,7 @@ public class SqlUtil { /** * 定义常用的 sql关键字 */ - public static String SQL_REGEX = "select |insert |delete |update |drop |count |exec |chr |mid |master |truncate |char |and |declare "; + public static final String SQL_REGEX = "select |insert |delete |update |drop |count |exec |chr |mid |master |truncate |char |and |declare "; /** * 仅支持字母、数字、下划线、空格、逗号、小数点(支持多个字段排序) diff --git a/ruoyi/src/main/java/com/ruoyi/demo/controller/RedisCacheController.java b/ruoyi/src/main/java/com/ruoyi/demo/controller/RedisCacheController.java index e01b542e0..98cca18c0 100644 --- a/ruoyi/src/main/java/com/ruoyi/demo/controller/RedisCacheController.java +++ b/ruoyi/src/main/java/com/ruoyi/demo/controller/RedisCacheController.java @@ -1,11 +1,10 @@ package com.ruoyi.demo.controller; -import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.common.utils.RedisUtils; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.utils.redis.RedisUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.CachePut; import org.springframework.cache.annotation.Cacheable; @@ -23,7 +22,7 @@ import java.util.concurrent.TimeUnit; // 类级别 缓存统一配置 //@CacheConfig(cacheNames = "redissonCacheMap") @Api(value = "spring-cache 演示案例", tags = {"spring-cache 演示案例"}) -@RequiredArgsConstructor(onConstructor_ = @Autowired) +@RequiredArgsConstructor @RestController @RequestMapping("/demo/cache") public class RedisCacheController { @@ -45,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); } /** @@ -60,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); } /** @@ -75,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); } /** @@ -86,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); @@ -96,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/src/main/java/com/ruoyi/demo/controller/RedisLockController.java b/ruoyi/src/main/java/com/ruoyi/demo/controller/RedisLockController.java index 94ad3c3a3..c31925a57 100644 --- a/ruoyi/src/main/java/com/ruoyi/demo/controller/RedisLockController.java +++ b/ruoyi/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,15 +44,15 @@ public class RedisLockController { e.printStackTrace(); } System.out.println("end :" + key + ",time:" + LocalTime.now().toString()); - return AjaxResult.success("操作成功", value); + return R.ok("操作成功", value); } /** * 测试lock4j 工具 */ @ApiOperation("测试lock4j 工具") - @GetMapping("/testLock4jLockTemaplate") - public AjaxResult testLock4jLockTemaplate(String key, String value) { + @GetMapping("/testLock4jLockTemplate") + 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/src/main/java/com/ruoyi/demo/controller/RedisPubSubController.java b/ruoyi/src/main/java/com/ruoyi/demo/controller/RedisPubSubController.java index 619a69028..99c3131b4 100644 --- a/ruoyi/src/main/java/com/ruoyi/demo/controller/RedisPubSubController.java +++ b/ruoyi/src/main/java/com/ruoyi/demo/controller/RedisPubSubController.java @@ -1,12 +1,11 @@ package com.ruoyi.demo.controller; -import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.common.utils.RedisUtils; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.utils.redis.RedisUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -17,27 +16,27 @@ import org.springframework.web.bind.annotation.RestController; * @author Lion Li */ @Api(value = "Redis发布订阅 演示案例", tags = {"Redis发布订阅"}) -@RequiredArgsConstructor(onConstructor_ = @Autowired) +@RequiredArgsConstructor @RestController @RequestMapping("/demo/redis/pubsub") 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/src/main/java/com/ruoyi/demo/controller/RedisRateLimiterController.java b/ruoyi/src/main/java/com/ruoyi/demo/controller/RedisRateLimiterController.java index 1eeab6114..c7f48e519 100644 --- a/ruoyi/src/main/java/com/ruoyi/demo/controller/RedisRateLimiterController.java +++ b/ruoyi/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/src/main/java/com/ruoyi/demo/controller/Swagger3DemoController.java b/ruoyi/src/main/java/com/ruoyi/demo/controller/Swagger3DemoController.java index 6b73d64a8..e50ce03a5 100644 --- a/ruoyi/src/main/java/com/ruoyi/demo/controller/Swagger3DemoController.java +++ b/ruoyi/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/src/main/java/com/ruoyi/demo/controller/TestBatchController.java b/ruoyi/src/main/java/com/ruoyi/demo/controller/TestBatchController.java index 54cd4484d..1bb9d9fa0 100644 --- a/ruoyi/src/main/java/com/ruoyi/demo/controller/TestBatchController.java +++ b/ruoyi/src/main/java/com/ruoyi/demo/controller/TestBatchController.java @@ -2,13 +2,12 @@ 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.service.ITestDemoService; +import com.ruoyi.demo.mapper.TestDemoMapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -24,51 +23,62 @@ import java.util.List; * @date 2021-05-30 */ @Api(value = "测试批量方法", tags = {"测试批量方法"}) -@RequiredArgsConstructor(onConstructor_ = @Autowired) +@RequiredArgsConstructor @RestController @RequestMapping("/demo/batch") public class TestBatchController extends BaseController { - private final ITestDemoService iTestDemoService; + /** + * 为了便于测试 直接引入mapper + */ + private final TestDemoMapper testDemoMapper; /** * 新增批量方法 可完美替代 saveBatch 秒级插入上万数据 (对mysql负荷较大) - * + *

* 3.5.0 版本 增加 rewriteBatchedStatements=true 批处理参数 使 MP 原生批处理可以达到同样的速度 */ @ApiOperation(value = "新增批量方法") @PostMapping("/add") -// @DS("slave") - public AjaxResult add() { +// @DS("slave") + 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(-1L); + testDemo.setTestKey("批量新增"); + testDemo.setValue("测试新增"); + list.add(testDemo); } - return toAjax(iTestDemoService.saveAll(list) ? 1 : 0); + return toAjax(testDemoMapper.insertBatch(list) ? 1 : 0); } /** * 新增或更新 可完美替代 saveOrUpdateBatch 高性能 - * + *

* 3.5.0 版本 增加 rewriteBatchedStatements=true 批处理参数 使 MP 原生批处理可以达到同样的速度 */ @ApiOperation(value = "新增或更新批量方法") @PostMapping("/addOrUpdate") -// @DS("slave") - public AjaxResult addOrUpdate() { +// @DS("slave") + public R addOrUpdate() { List list = new ArrayList<>(); for (int i = 0; i < 1000; i++) { - list.add(new TestDemo().setOrderNum(-1L).setTestKey("批量新增").setValue("测试新增")); - } - iTestDemoService.saveAll(list); + TestDemo testDemo = new TestDemo(); + testDemo.setOrderNum(-1L); + 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); } } - return toAjax(iTestDemoService.saveOrUpdateAll(list) ? 1 : 0); + return toAjax(testDemoMapper.insertOrUpdateBatch(list) ? 1 : 0); } /** @@ -76,10 +86,10 @@ public class TestBatchController extends BaseController { */ @ApiOperation(value = "删除批量方法") @DeleteMapping() -// @DS("slave") - public AjaxResult remove() { - return toAjax(iTestDemoService.remove(new LambdaQueryWrapper() - .eq(TestDemo::getOrderNum, -1L)) ? 1 : 0); +// @DS("slave") + public R remove() { + return toAjax(testDemoMapper.delete(new LambdaQueryWrapper() + .eq(TestDemo::getOrderNum, -1L))); } } diff --git a/ruoyi/src/main/java/com/ruoyi/demo/controller/TestDemoController.java b/ruoyi/src/main/java/com/ruoyi/demo/controller/TestDemoController.java index 2d0f43a49..593f22adf 100644 --- a/ruoyi/src/main/java/com/ruoyi/demo/controller/TestDemoController.java +++ b/ruoyi/src/main/java/com/ruoyi/demo/controller/TestDemoController.java @@ -1,18 +1,19 @@ package com.ruoyi.demo.controller; +import cn.dev33.satoken.annotation.SaCheckPermission; 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; import com.ruoyi.common.core.validate.EditGroup; import com.ruoyi.common.core.validate.QueryGroup; import com.ruoyi.common.enums.BusinessType; -import com.ruoyi.common.utils.ValidatorUtils; import com.ruoyi.common.excel.ExcelResult; +import com.ruoyi.common.utils.ValidatorUtils; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.demo.domain.TestDemo; import com.ruoyi.demo.domain.bo.TestDemoBo; @@ -21,8 +22,6 @@ import com.ruoyi.demo.domain.vo.TestDemoVo; import com.ruoyi.demo.service.ITestDemoService; import io.swagger.annotations.*; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -42,7 +41,7 @@ import java.util.concurrent.TimeUnit; */ @Validated @Api(value = "测试单表控制器", tags = {"测试单表管理"}) -@RequiredArgsConstructor(onConstructor_ = @Autowired) +@RequiredArgsConstructor @RestController @RequestMapping("/demo/demo") public class TestDemoController extends BaseController { @@ -53,7 +52,7 @@ public class TestDemoController extends BaseController { * 查询测试单表列表 */ @ApiOperation("查询测试单表列表") - @PreAuthorize("@ss.hasPermi('demo:demo:list')") + @SaCheckPermission("demo:demo:list") @GetMapping("/list") public TableDataInfo list(@Validated(QueryGroup.class) TestDemoBo bo, PageQuery pageQuery) { return iTestDemoService.queryPageList(bo, pageQuery); @@ -63,7 +62,7 @@ public class TestDemoController extends BaseController { * 自定义分页查询 */ @ApiOperation("自定义分页查询") - @PreAuthorize("@ss.hasPermi('demo:demo:list')") + @SaCheckPermission("demo:demo:list") @GetMapping("/page") public TableDataInfo page(@Validated(QueryGroup.class) TestDemoBo bo, PageQuery pageQuery) { return iTestDemoService.customPageList(bo, pageQuery); @@ -74,29 +73,29 @@ public class TestDemoController extends BaseController { @ApiImplicitParam(name = "file", value = "导入文件", dataType = "java.io.File", required = true), }) @Log(title = "测试单表", businessType = BusinessType.IMPORT) - @PreAuthorize("@ss.hasPermi('demo:demo: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.saveAll(list); - return AjaxResult.success(excelResult.getAnalysis()); + iTestDemoService.saveBatch(list); + return R.ok(excelResult.getAnalysis()); } /** * 导出测试单表列表 */ @ApiOperation("导出测试单表列表") - @PreAuthorize("@ss.hasPermi('demo:demo:export')") + @SaCheckPermission("demo:demo:export") @Log(title = "测试单表", businessType = BusinessType.EXPORT) @PostMapping("/export") public void export(@Validated TestDemoBo bo, HttpServletResponse response) { List list = iTestDemoService.queryList(bo); // 测试雪花id导出 // for (TestDemoVo vo : list) { -// vo.setId(1234567891234567893L); -// } +// vo.setId(1234567891234567893L); +// } ExcelUtil.exportExcel(list, "测试单表", TestDemoVo.class, response); } @@ -104,23 +103,23 @@ public class TestDemoController extends BaseController { * 获取测试单表详细信息 */ @ApiOperation("获取测试单表详细信息") - @PreAuthorize("@ss.hasPermi('demo:demo:query')") + @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)); } /** * 新增测试单表 */ @ApiOperation("新增测试单表") - @PreAuthorize("@ss.hasPermi('demo:demo:add')") + @SaCheckPermission("demo:demo:add") @Log(title = "测试单表", businessType = BusinessType.INSERT) @RepeatSubmit(interval = 2, timeUnit = TimeUnit.SECONDS, message = "不允许重复提交") @PostMapping() - public AjaxResult add(@RequestBody TestDemoBo bo) { + public R add(@RequestBody TestDemoBo bo) { // 使用校验工具对标 @Validated(AddGroup.class) 注解 // 用于在非 Controller 的地方校验对象 ValidatorUtils.validate(bo, AddGroup.class); @@ -131,11 +130,11 @@ public class TestDemoController extends BaseController { * 修改测试单表 */ @ApiOperation("修改测试单表") - @PreAuthorize("@ss.hasPermi('demo:demo:edit')") + @SaCheckPermission("demo:demo:edit") @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); } @@ -143,10 +142,10 @@ public class TestDemoController extends BaseController { * 删除测试单表 */ @ApiOperation("删除测试单表") - @PreAuthorize("@ss.hasPermi('demo:demo:remove')") + @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/src/main/java/com/ruoyi/demo/controller/TestI18nController.java b/ruoyi/src/main/java/com/ruoyi/demo/controller/TestI18nController.java index 40b031b51..9b3bffc09 100644 --- a/ruoyi/src/main/java/com/ruoyi/demo/controller/TestI18nController.java +++ b/ruoyi/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; @@ -27,40 +27,40 @@ import javax.validation.constraints.NotNull; @RequestMapping("/demo/i18n") public class TestI18nController { - /** - * 通过code获取国际化内容 - * code为 messages.properties 中的 key - * - * 测试使用 user.register.success - */ - @ApiOperation("通过code获取国际化内容") - @GetMapping() - public AjaxResult get(@ApiParam("国际化code") String code) { - return AjaxResult.success(MessageUtils.message(code)); - } + /** + * 通过code获取国际化内容 + * code为 messages.properties 中的 key + *

+ * 测试使用 user.register.success + */ + @ApiOperation("通过code获取国际化内容") + @GetMapping() + public R get(@ApiParam("国际化code") String code) { + return R.ok(MessageUtils.message(code)); + } /** * Validator 校验国际化 * 不传值 分别查看异常返回 - * + *

* 测试使用 not.null */ @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); } /** * Bean 校验国际化 * 不传值 分别查看异常返回 - * + *

* 测试使用 not.null */ @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/src/main/java/com/ruoyi/demo/controller/TestSensitiveController.java b/ruoyi/src/main/java/com/ruoyi/demo/controller/TestSensitiveController.java new file mode 100644 index 000000000..1f34f9cf4 --- /dev/null +++ b/ruoyi/src/main/java/com/ruoyi/demo/controller/TestSensitiveController.java @@ -0,0 +1,79 @@ +package com.ruoyi.demo.controller; + +import com.ruoyi.common.annotation.Sensitive; +import com.ruoyi.common.core.controller.BaseController; +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 org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 测试数据脱敏控制器 + *

+ * 默认管理员不过滤 + * 需自行根据业务重写实现 + * + * @author Lion Li + * @version 3.6.0 + * @see com.ruoyi.common.core.service.SensitiveService + */ +@Api(value = "测试数据脱敏控制器", tags = {"测试数据脱敏管理"}) +@RestController +@RequestMapping("/demo/sensitive") +public class TestSensitiveController extends BaseController { + + /** + * 测试数据脱敏 + */ + @ApiOperation("查询测试单表列表") + @GetMapping("/test") + 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 + static class TestSensitive { + + /** + * 身份证 + */ + @Sensitive(strategy = SensitiveStrategy.ID_CARD) + private String idCard; + + /** + * 电话 + */ + @Sensitive(strategy = SensitiveStrategy.PHONE) + private String phone; + + /** + * 地址 + */ + @Sensitive(strategy = SensitiveStrategy.ADDRESS) + private String address; + + /** + * 邮箱 + */ + @Sensitive(strategy = SensitiveStrategy.EMAIL) + private String email; + + /** + * 银行卡 + */ + @Sensitive(strategy = SensitiveStrategy.BANK_CARD) + private String bankCard; + + } + +} diff --git a/ruoyi/src/main/java/com/ruoyi/demo/controller/TestTreeController.java b/ruoyi/src/main/java/com/ruoyi/demo/controller/TestTreeController.java index 463ea3bf6..64f36c941 100644 --- a/ruoyi/src/main/java/com/ruoyi/demo/controller/TestTreeController.java +++ b/ruoyi/src/main/java/com/ruoyi/demo/controller/TestTreeController.java @@ -1,9 +1,10 @@ package com.ruoyi.demo.controller; +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; @@ -16,8 +17,6 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -35,7 +34,7 @@ import java.util.List; */ @Validated @Api(value = "测试树表控制器", tags = {"测试树表管理"}) -@RequiredArgsConstructor(onConstructor_ = @Autowired) +@RequiredArgsConstructor @RestController @RequestMapping("/demo/tree") public class TestTreeController extends BaseController { @@ -46,18 +45,18 @@ public class TestTreeController extends BaseController { * 查询测试树表列表 */ @ApiOperation("查询测试树表列表") - @PreAuthorize("@ss.hasPermi('demo:tree:list')") + @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); } /** * 导出测试树表列表 */ @ApiOperation("导出测试树表列表") - @PreAuthorize("@ss.hasPermi('demo:tree:export')") + @SaCheckPermission("demo:tree:export") @Log(title = "测试树表", businessType = BusinessType.EXPORT) @GetMapping("/export") public void export(@Validated TestTreeBo bo, HttpServletResponse response) { @@ -69,23 +68,23 @@ public class TestTreeController extends BaseController { * 获取测试树表详细信息 */ @ApiOperation("获取测试树表详细信息") - @PreAuthorize("@ss.hasPermi('demo:tree:query')") + @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)); } /** * 新增测试树表 */ @ApiOperation("新增测试树表") - @PreAuthorize("@ss.hasPermi('demo:tree:add')") + @SaCheckPermission("demo:tree:add") @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); } @@ -93,11 +92,11 @@ public class TestTreeController extends BaseController { * 修改测试树表 */ @ApiOperation("修改测试树表") - @PreAuthorize("@ss.hasPermi('demo:tree:edit')") + @SaCheckPermission("demo:tree:edit") @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); } @@ -105,10 +104,10 @@ public class TestTreeController extends BaseController { * 删除测试树表 */ @ApiOperation("删除测试树表") - @PreAuthorize("@ss.hasPermi('demo:tree:remove')") + @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/src/main/java/com/ruoyi/demo/controller/queue/BoundedQueueController.java b/ruoyi/src/main/java/com/ruoyi/demo/controller/queue/BoundedQueueController.java new file mode 100644 index 000000000..532c499e1 --- /dev/null +++ b/ruoyi/src/main/java/com/ruoyi/demo/controller/queue/BoundedQueueController.java @@ -0,0 +1,82 @@ +package com.ruoyi.demo.controller.queue; + +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.utils.redis.QueueUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 有界队列 演示案例 + *

+ * 轻量级队列 重量级数据量 请使用 MQ + *

+ * 集群测试通过 同一个数据只会被消费一次 做好事务补偿 + * 集群测试流程 在其中一台发送数据 两端分别调用获取接口 一次获取一条 + * + * @author Lion Li + * @version 3.6.0 + */ +@Slf4j +@Api(value = "有界队列 演示案例", tags = {"有界队列"}) +@RequiredArgsConstructor +@RestController +@RequestMapping("/demo/queue/bounded") +public class BoundedQueueController { + + + @ApiOperation("添加队列数据") + @GetMapping("/add") + public R add(@ApiParam("队列名") String queueName, + @ApiParam("容量") int capacity) { + // 用完了一定要销毁 否则会一直存在 + boolean b = QueueUtils.destroyBoundedQueueObject(queueName); + log.info("通道: {} , 删除: {}", queueName, b); + // 初始化设置一次即可 + if (QueueUtils.trySetBoundedQueueCapacity(queueName, capacity)) { + log.info("通道: {} , 设置容量: {}", queueName, capacity); + } else { + log.info("通道: {} , 设置容量失败", queueName); + return R.fail("操作失败"); + } + for (int i = 0; i < 11; i++) { + String data = "data-" + i; + boolean flag = QueueUtils.addBoundedQueueObject(queueName, data); + if (flag == false) { + log.info("通道: {} , 发送数据: {} 失败, 通道已满", queueName, data); + } else { + log.info("通道: {} , 发送数据: {}", queueName, data); + } + } + return R.ok("操作成功"); + } + + @ApiOperation("删除队列数据") + @GetMapping("/remove") + public R remove(@ApiParam("队列名") String queueName) { + String data = "data-" + 5; + if (QueueUtils.removeBoundedQueueObject(queueName, data)) { + log.info("通道: {} , 删除数据: {}", queueName, data); + } else { + return R.fail("操作失败"); + } + return R.ok("操作成功"); + } + + @ApiOperation("获取队列数据") + @GetMapping("/get") + public R get(@ApiParam("队列名") String queueName) { + String data; + do { + data = QueueUtils.getBoundedQueueObject(queueName); + log.info("通道: {} , 获取数据: {}", queueName, data); + } while (data != null); + return R.ok("操作成功"); + } + +} diff --git a/ruoyi/src/main/java/com/ruoyi/demo/controller/queue/DelayedQueueController.java b/ruoyi/src/main/java/com/ruoyi/demo/controller/queue/DelayedQueueController.java new file mode 100644 index 000000000..f8777533c --- /dev/null +++ b/ruoyi/src/main/java/com/ruoyi/demo/controller/queue/DelayedQueueController.java @@ -0,0 +1,78 @@ +package com.ruoyi.demo.controller.queue; + +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.utils.redis.QueueUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.concurrent.TimeUnit; + +/** + * 延迟队列 演示案例 + *

+ * 轻量级队列 重量级数据量 请使用 MQ + * 例如: 创建订单30分钟后过期处理 + *

+ * 集群测试通过 同一个数据只会被消费一次 做好事务补偿 + * 集群测试流程 两台集群分别开启订阅 在其中一台发送数据 观察接收消息的规律 + * + * @author Lion Li + * @version 3.6.0 + */ +@Slf4j +@Api(value = "延迟队列 演示案例", tags = {"延迟队列"}) +@RequiredArgsConstructor +@RestController +@RequestMapping("/demo/queue/delayed") +public class DelayedQueueController { + + @ApiOperation("订阅队列") + @GetMapping("/subscribe") + public R subscribe(@ApiParam("队列名") String queueName) { + log.info("通道: {} 监听中......", queueName); + // 项目初始化设置一次即可 + QueueUtils.subscribeBlockingQueue(queueName, (String orderNum) -> { + // 观察接收时间 + log.info("通道: {}, 收到数据: {}", queueName, orderNum); + }); + return R.ok("操作成功"); + } + + @ApiOperation("添加队列数据") + @GetMapping("/add") + public R add(@ApiParam("队列名") String queueName, + @ApiParam("订单号") String orderNum, + @ApiParam("延迟时间(秒)") Long time) { + QueueUtils.addDelayedQueueObject(queueName, orderNum, time, TimeUnit.SECONDS); + // 观察发送时间 + log.info("通道: {} , 发送数据: {}", queueName, orderNum); + return R.ok("操作成功"); + } + + @ApiOperation("删除队列数据") + @GetMapping("/remove") + public R remove(@ApiParam("队列名") String queueName, + @ApiParam("订单号") String orderNum) { + if (QueueUtils.removeDelayedQueueObject(queueName, orderNum)) { + log.info("通道: {} , 删除数据: {}", queueName, orderNum); + } else { + return R.fail("操作失败"); + } + return R.ok("操作成功"); + } + + @ApiOperation("销毁队列") + @GetMapping("/destroy") + public R destroy(@ApiParam("队列名") String queueName) { + // 用完了一定要销毁 否则会一直存在 + QueueUtils.destroyDelayedQueue(queueName); + return R.ok("操作成功"); + } + +} diff --git a/ruoyi/src/main/java/com/ruoyi/demo/controller/queue/PriorityDemo.java b/ruoyi/src/main/java/com/ruoyi/demo/controller/queue/PriorityDemo.java new file mode 100644 index 000000000..80f1b1155 --- /dev/null +++ b/ruoyi/src/main/java/com/ruoyi/demo/controller/queue/PriorityDemo.java @@ -0,0 +1,17 @@ +package com.ruoyi.demo.controller.queue; + +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 实体类 注意不允许使用内部类 否则会找不到类 + * + * @author Lion Li + * @version 3.6.0 + */ +@Data +@NoArgsConstructor +public class PriorityDemo { + private String name; + private Integer orderNum; +} diff --git a/ruoyi/src/main/java/com/ruoyi/demo/controller/queue/PriorityDemoComparator.java b/ruoyi/src/main/java/com/ruoyi/demo/controller/queue/PriorityDemoComparator.java new file mode 100644 index 000000000..f72e6950d --- /dev/null +++ b/ruoyi/src/main/java/com/ruoyi/demo/controller/queue/PriorityDemoComparator.java @@ -0,0 +1,16 @@ +package com.ruoyi.demo.controller.queue; + +import java.util.Comparator; + +/** + * 比较器 注意不允许使用 内部类或匿名类或lambda表达式 会找不到类 + * + * @author Lion Li + * @version 3.6.0 + */ +public class PriorityDemoComparator implements Comparator { + @Override + public int compare(PriorityDemo pd1, PriorityDemo pd2) { + return Integer.compare(pd1.getOrderNum(), pd2.getOrderNum()); + } +} diff --git a/ruoyi/src/main/java/com/ruoyi/demo/controller/queue/PriorityQueueController.java b/ruoyi/src/main/java/com/ruoyi/demo/controller/queue/PriorityQueueController.java new file mode 100644 index 000000000..baec18440 --- /dev/null +++ b/ruoyi/src/main/java/com/ruoyi/demo/controller/queue/PriorityQueueController.java @@ -0,0 +1,88 @@ +package com.ruoyi.demo.controller.queue; + +import cn.hutool.core.util.RandomUtil; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.utils.redis.QueueUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 优先队列 演示案例 + *

+ * 轻量级队列 重量级数据量 请使用 MQ + *

+ * 集群测试通过 同一个消息只会被消费一次 做好事务补偿 + * 集群测试流程 在其中一台发送数据 两端分别调用获取接口 一次获取一条 + * + * @author Lion Li + * @version 3.6.0 + */ +@Slf4j +@Api(value = "优先队列 演示案例", tags = {"优先队列"}) +@RequiredArgsConstructor +@RestController +@RequestMapping("/demo/queue/priority") +public class PriorityQueueController { + + @ApiOperation("添加队列数据") + @GetMapping("/add") + public R add(@ApiParam("队列名") String queueName) { + // 用完了一定要销毁 否则会一直存在 + boolean b = QueueUtils.destroyPriorityQueueObject(queueName); + log.info("通道: {} , 删除: {}", queueName, b); + // 初始化设置一次即可 此处注意 不允许用内部类或匿名类 + boolean flag = QueueUtils.trySetPriorityQueueComparator(queueName, new PriorityDemoComparator()); + if (flag) { + log.info("通道: {} , 设置比较器成功", queueName); + } else { + log.info("通道: {} , 设置比较器失败", queueName); + return R.fail("操作失败"); + } + for (int i = 0; i < 10; i++) { + int randomNum = RandomUtil.randomInt(10); + 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 R.ok("操作成功"); + } + + @ApiOperation("删除队列数据") + @GetMapping("/remove") + public R remove(@ApiParam("队列名") String queueName, + @ApiParam("对象名") String name, + @ApiParam("排序号") Integer orderNum) { + PriorityDemo data = new PriorityDemo(); + data.setName(name); + data.setOrderNum(orderNum); + if (QueueUtils.removePriorityQueueObject(queueName, data)) { + log.info("通道: {} , 删除数据: {}", queueName, data); + } else { + return R.fail("操作失败"); + } + return R.ok("操作成功"); + } + + @ApiOperation("获取队列数据") + @GetMapping("/get") + public R get(@ApiParam("队列名") String queueName) { + PriorityDemo data; + do { + data = QueueUtils.getPriorityQueueObject(queueName); + log.info("通道: {} , 获取数据: {}", queueName, data); + } while (data != null); + return R.ok("操作成功"); + } + +} diff --git a/ruoyi/src/main/java/com/ruoyi/demo/domain/TestDemo.java b/ruoyi/src/main/java/com/ruoyi/demo/domain/TestDemo.java index 74b57d991..c079d122b 100644 --- a/ruoyi/src/main/java/com/ruoyi/demo/domain/TestDemo.java +++ b/ruoyi/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,16 +13,15 @@ import lombok.experimental.Accessors; */ @Data @EqualsAndHashCode(callSuper = true) -@Accessors(chain = true) @TableName("test_demo") public class TestDemo extends BaseEntity { - private static final long serialVersionUID=1L; + private static final long serialVersionUID = 1L; - /** - * 主键 - */ + /** + * 主键 + */ @TableId(value = "id") private Long id; @@ -40,7 +38,7 @@ public class TestDemo extends BaseEntity { /** * 排序号 */ - @OrderBy(asc = false, sort = 1) + @OrderBy(asc = false, sort = 1) private Long orderNum; /** diff --git a/ruoyi/src/main/java/com/ruoyi/demo/domain/TestTree.java b/ruoyi/src/main/java/com/ruoyi/demo/domain/TestTree.java index 92e005b85..1ca4a7ad4 100644 --- a/ruoyi/src/main/java/com/ruoyi/demo/domain/TestTree.java +++ b/ruoyi/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,11 +16,10 @@ import lombok.experimental.Accessors; */ @Data @EqualsAndHashCode(callSuper = true) -@Accessors(chain = true) @TableName("test_tree") public class TestTree extends TreeEntity { - private static final long serialVersionUID=1L; + private static final long serialVersionUID = 1L; /** diff --git a/ruoyi/src/main/java/com/ruoyi/demo/domain/bo/TestDemoBo.java b/ruoyi/src/main/java/com/ruoyi/demo/domain/bo/TestDemoBo.java index 63d28368b..5c41204d7 100644 --- a/ruoyi/src/main/java/com/ruoyi/demo/domain/bo/TestDemoBo.java +++ b/ruoyi/src/main/java/com/ruoyi/demo/domain/bo/TestDemoBo.java @@ -26,43 +26,43 @@ public class TestDemoBo extends BaseEntity { /** * 主键 */ - @ApiModelProperty("主键") - @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + @ApiModelProperty("主键") + @NotNull(message = "主键不能为空", groups = {EditGroup.class}) private Long id; /** * 部门id */ - @ApiModelProperty("部门id") - @NotNull(message = "部门id不能为空", groups = { AddGroup.class, EditGroup.class }) + @ApiModelProperty("部门id") + @NotNull(message = "部门id不能为空", groups = {AddGroup.class, EditGroup.class}) private Long deptId; /** * 用户id */ - @ApiModelProperty("用户id") - @NotNull(message = "用户id不能为空", groups = { AddGroup.class, EditGroup.class }) + @ApiModelProperty("用户id") + @NotNull(message = "用户id不能为空", groups = {AddGroup.class, EditGroup.class}) private Long userId; /** * 排序号 */ - @ApiModelProperty("排序号") - @NotNull(message = "排序号不能为空", groups = { AddGroup.class, EditGroup.class }) + @ApiModelProperty("排序号") + @NotNull(message = "排序号不能为空", groups = {AddGroup.class, EditGroup.class}) private Long orderNum; /** * key键 */ - @ApiModelProperty("key键") - @NotBlank(message = "key键不能为空", groups = { AddGroup.class, EditGroup.class }) + @ApiModelProperty("key键") + @NotBlank(message = "key键不能为空", groups = {AddGroup.class, EditGroup.class}) private String testKey; /** * 值 */ - @ApiModelProperty("值") - @NotBlank(message = "值不能为空", groups = { AddGroup.class, EditGroup.class }) + @ApiModelProperty("值") + @NotBlank(message = "值不能为空", groups = {AddGroup.class, EditGroup.class}) private String value; } diff --git a/ruoyi/src/main/java/com/ruoyi/demo/domain/bo/TestTreeBo.java b/ruoyi/src/main/java/com/ruoyi/demo/domain/bo/TestTreeBo.java index c561dd7a1..29f4ac973 100644 --- a/ruoyi/src/main/java/com/ruoyi/demo/domain/bo/TestTreeBo.java +++ b/ruoyi/src/main/java/com/ruoyi/demo/domain/bo/TestTreeBo.java @@ -26,29 +26,29 @@ public class TestTreeBo extends TreeEntity { /** * 主键 */ - @ApiModelProperty("主键") - @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + @ApiModelProperty("主键") + @NotNull(message = "主键不能为空", groups = {EditGroup.class}) private Long id; /** * 部门id */ - @ApiModelProperty("部门id") - @NotNull(message = "部门id不能为空", groups = { AddGroup.class, EditGroup.class }) + @ApiModelProperty("部门id") + @NotNull(message = "部门id不能为空", groups = {AddGroup.class, EditGroup.class}) private Long deptId; /** * 用户id */ - @ApiModelProperty("用户id") - @NotNull(message = "用户id不能为空", groups = { AddGroup.class, EditGroup.class }) + @ApiModelProperty("用户id") + @NotNull(message = "用户id不能为空", groups = {AddGroup.class, EditGroup.class}) private Long userId; /** * 树节点名 */ - @ApiModelProperty("树节点名") - @NotBlank(message = "树节点名不能为空", groups = { AddGroup.class, EditGroup.class }) + @ApiModelProperty("树节点名") + @NotBlank(message = "树节点名不能为空", groups = {AddGroup.class, EditGroup.class}) private String treeName; } diff --git a/ruoyi/src/main/java/com/ruoyi/demo/domain/vo/TestDemoVo.java b/ruoyi/src/main/java/com/ruoyi/demo/domain/vo/TestDemoVo.java index 4919bbde2..ef26ff325 100644 --- a/ruoyi/src/main/java/com/ruoyi/demo/domain/vo/TestDemoVo.java +++ b/ruoyi/src/main/java/com/ruoyi/demo/domain/vo/TestDemoVo.java @@ -9,7 +9,6 @@ import lombok.Data; import java.util.Date; - /** * 测试单表视图对象 test_demo * @@ -21,77 +20,77 @@ import java.util.Date; @ExcelIgnoreUnannotated public class TestDemoVo { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - /** - * 主键 + /** + * 主键 */ - @ExcelProperty(value = "主键") - @ApiModelProperty("主键") - private Long id; + @ExcelProperty(value = "主键") + @ApiModelProperty("主键") + private Long id; /** * 部门id */ - @ExcelProperty(value = "部门id") - @ApiModelProperty("部门id") - private Long deptId; + @ExcelProperty(value = "部门id") + @ApiModelProperty("部门id") + private Long deptId; /** * 用户id */ - @ExcelProperty(value = "用户id") - @ApiModelProperty("用户id") - private Long userId; + @ExcelProperty(value = "用户id") + @ApiModelProperty("用户id") + private Long userId; /** * 排序号 */ - @ExcelProperty(value = "排序号") - @ApiModelProperty("排序号") - private Long orderNum; + @ExcelProperty(value = "排序号") + @ApiModelProperty("排序号") + private Long orderNum; /** * key键 */ - @ExcelProperty(value = "key键") - @ApiModelProperty("key键") - private String testKey; + @ExcelProperty(value = "key键") + @ApiModelProperty("key键") + private String testKey; /** * 值 */ - @ExcelProperty(value = "值") - @ApiModelProperty("值") - private String value; + @ExcelProperty(value = "值") + @ApiModelProperty("值") + private String value; /** * 创建时间 */ - @ExcelProperty(value = "创建时间") - @ApiModelProperty("创建时间") - private Date createTime; + @ExcelProperty(value = "创建时间") + @ApiModelProperty("创建时间") + private Date createTime; /** * 创建人 */ - @ExcelProperty(value = "创建人") - @ApiModelProperty("创建人") - private String createBy; + @ExcelProperty(value = "创建人") + @ApiModelProperty("创建人") + private String createBy; /** * 更新时间 */ - @ExcelProperty(value = "更新时间") - @ApiModelProperty("更新时间") - private Date updateTime; + @ExcelProperty(value = "更新时间") + @ApiModelProperty("更新时间") + private Date updateTime; /** * 更新人 */ - @ExcelProperty(value = "更新人") - @ApiModelProperty("更新人") - private String updateBy; + @ExcelProperty(value = "更新人") + @ApiModelProperty("更新人") + private String updateBy; } diff --git a/ruoyi/src/main/java/com/ruoyi/demo/domain/vo/TestTreeVo.java b/ruoyi/src/main/java/com/ruoyi/demo/domain/vo/TestTreeVo.java index dab816243..309a0ae4e 100644 --- a/ruoyi/src/main/java/com/ruoyi/demo/domain/vo/TestTreeVo.java +++ b/ruoyi/src/main/java/com/ruoyi/demo/domain/vo/TestTreeVo.java @@ -9,7 +9,6 @@ import lombok.Data; import java.util.Date; - /** * 测试树表视图对象 test_tree * @@ -21,48 +20,48 @@ import java.util.Date; @ExcelIgnoreUnannotated public class TestTreeVo { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - /** - * 主键 + /** + * 主键 */ - @ApiModelProperty("主键") - private Long id; + @ApiModelProperty("主键") + private Long id; /** * 父id */ - @ExcelProperty(value = "父id") - @ApiModelProperty("父id") - private Long parentId; + @ExcelProperty(value = "父id") + @ApiModelProperty("父id") + private Long parentId; /** * 部门id */ - @ExcelProperty(value = "部门id") - @ApiModelProperty("部门id") - private Long deptId; + @ExcelProperty(value = "部门id") + @ApiModelProperty("部门id") + private Long deptId; /** * 用户id */ - @ExcelProperty(value = "用户id") - @ApiModelProperty("用户id") - private Long userId; + @ExcelProperty(value = "用户id") + @ApiModelProperty("用户id") + private Long userId; /** * 树节点名 */ - @ExcelProperty(value = "树节点名") - @ApiModelProperty("树节点名") - private String treeName; + @ExcelProperty(value = "树节点名") + @ApiModelProperty("树节点名") + private String treeName; /** * 创建时间 */ - @ExcelProperty(value = "创建时间") - @ApiModelProperty("创建时间") - private Date createTime; + @ExcelProperty(value = "创建时间") + @ApiModelProperty("创建时间") + private Date createTime; } diff --git a/ruoyi/src/main/java/com/ruoyi/demo/mapper/TestDemoMapper.java b/ruoyi/src/main/java/com/ruoyi/demo/mapper/TestDemoMapper.java index 7a3cb62d6..b1b80d26e 100644 --- a/ruoyi/src/main/java/com/ruoyi/demo/mapper/TestDemoMapper.java +++ b/ruoyi/src/main/java/com/ruoyi/demo/mapper/TestDemoMapper.java @@ -6,12 +6,11 @@ import com.baomidou.mybatisplus.core.toolkit.Constants; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.annotation.DataColumn; import com.ruoyi.common.annotation.DataPermission; -import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus; +import com.ruoyi.common.core.mapper.BaseMapperPlus; import com.ruoyi.demo.domain.TestDemo; import com.ruoyi.demo.domain.vo.TestDemoVo; import org.apache.ibatis.annotations.Param; -import java.io.Serializable; import java.util.Collection; import java.util.List; @@ -21,7 +20,7 @@ import java.util.List; * @author Lion Li * @date 2021-07-26 */ -public interface TestDemoMapper extends BaseMapperPlus { +public interface TestDemoMapper extends BaseMapperPlus { @DataPermission({ @DataColumn(key = "deptName", value = "dept_id"), @@ -55,5 +54,5 @@ public interface TestDemoMapper extends BaseMapperPlus { @DataColumn(key = "deptName", value = "dept_id"), @DataColumn(key = "userName", value = "user_id") }) - int deleteBatchIds(@Param(Constants.COLLECTION) Collection idList); + int deleteBatchIds(@Param(Constants.COLLECTION) Collection idList); } diff --git a/ruoyi/src/main/java/com/ruoyi/demo/mapper/TestTreeMapper.java b/ruoyi/src/main/java/com/ruoyi/demo/mapper/TestTreeMapper.java index 0a7936cfe..e37a9a75e 100644 --- a/ruoyi/src/main/java/com/ruoyi/demo/mapper/TestTreeMapper.java +++ b/ruoyi/src/main/java/com/ruoyi/demo/mapper/TestTreeMapper.java @@ -2,8 +2,9 @@ package com.ruoyi.demo.mapper; import com.ruoyi.common.annotation.DataColumn; import com.ruoyi.common.annotation.DataPermission; -import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus; +import com.ruoyi.common.core.mapper.BaseMapperPlus; import com.ruoyi.demo.domain.TestTree; +import com.ruoyi.demo.domain.vo.TestTreeVo; /** * 测试树表Mapper接口 @@ -15,6 +16,6 @@ import com.ruoyi.demo.domain.TestTree; @DataColumn(key = "deptName", value = "dept_id"), @DataColumn(key = "userName", value = "user_id") }) -public interface TestTreeMapper extends BaseMapperPlus { +public interface TestTreeMapper extends BaseMapperPlus { } diff --git a/ruoyi/src/main/java/com/ruoyi/demo/service/ITestDemoService.java b/ruoyi/src/main/java/com/ruoyi/demo/service/ITestDemoService.java index 12834d300..f6b82fd6d 100644 --- a/ruoyi/src/main/java/com/ruoyi/demo/service/ITestDemoService.java +++ b/ruoyi/src/main/java/com/ruoyi/demo/service/ITestDemoService.java @@ -1,11 +1,10 @@ package com.ruoyi.demo.service; import com.ruoyi.common.core.domain.PageQuery; -import com.ruoyi.demo.domain.TestDemo; -import com.ruoyi.demo.domain.vo.TestDemoVo; -import com.ruoyi.demo.domain.bo.TestDemoBo; -import com.ruoyi.common.core.mybatisplus.core.IServicePlus; import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.demo.domain.TestDemo; +import com.ruoyi.demo.domain.bo.TestDemoBo; +import com.ruoyi.demo.domain.vo.TestDemoVo; import java.util.Collection; import java.util.List; @@ -16,48 +15,57 @@ import java.util.List; * @author Lion Li * @date 2021-07-26 */ -public interface ITestDemoService extends IServicePlus { - - /** - * 查询单个 - * @return - */ - TestDemoVo queryById(Long id); - - /** - * 查询列表 - */ - TableDataInfo queryPageList(TestDemoBo bo, PageQuery pageQuery); - - /** - * 自定义分页查询 - */ - TableDataInfo customPageList(TestDemoBo bo, PageQuery pageQuery); +public interface ITestDemoService { /** - * 查询列表 - */ - List queryList(TestDemoBo bo); + * 查询单个 + * + * @return + */ + TestDemoVo queryById(Long id); - /** - * 根据新增业务对象插入测试单表 - * @param bo 测试单表新增业务对象 - * @return - */ - Boolean insertByBo(TestDemoBo bo); + /** + * 查询列表 + */ + TableDataInfo queryPageList(TestDemoBo bo, PageQuery pageQuery); - /** - * 根据编辑业务对象修改测试单表 - * @param bo 测试单表编辑业务对象 - * @return - */ - Boolean updateByBo(TestDemoBo bo); + /** + * 自定义分页查询 + */ + TableDataInfo customPageList(TestDemoBo bo, PageQuery pageQuery); - /** - * 校验并删除数据 - * @param ids 主键集合 - * @param isValid 是否校验,true-删除前校验,false-不校验 - * @return - */ - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + /** + * 查询列表 + */ + List queryList(TestDemoBo bo); + + /** + * 根据新增业务对象插入测试单表 + * + * @param bo 测试单表新增业务对象 + * @return + */ + Boolean insertByBo(TestDemoBo bo); + + /** + * 根据编辑业务对象修改测试单表 + * + * @param bo 测试单表编辑业务对象 + * @return + */ + Boolean updateByBo(TestDemoBo bo); + + /** + * 校验并删除数据 + * + * @param ids 主键集合 + * @param isValid 是否校验,true-删除前校验,false-不校验 + * @return + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 批量保存 + */ + Boolean saveBatch(List list); } diff --git a/ruoyi/src/main/java/com/ruoyi/demo/service/ITestTreeService.java b/ruoyi/src/main/java/com/ruoyi/demo/service/ITestTreeService.java index 9b8acb9c6..366e51508 100644 --- a/ruoyi/src/main/java/com/ruoyi/demo/service/ITestTreeService.java +++ b/ruoyi/src/main/java/com/ruoyi/demo/service/ITestTreeService.java @@ -1,9 +1,7 @@ package com.ruoyi.demo.service; -import com.ruoyi.demo.domain.TestTree; -import com.ruoyi.demo.domain.vo.TestTreeVo; import com.ruoyi.demo.domain.bo.TestTreeBo; -import com.ruoyi.common.core.mybatisplus.core.IServicePlus; +import com.ruoyi.demo.domain.vo.TestTreeVo; import java.util.Collection; import java.util.List; @@ -14,37 +12,41 @@ import java.util.List; * @author Lion Li * @date 2021-07-26 */ -public interface ITestTreeService extends IServicePlus { - /** - * 查询单个 - * @return - */ - TestTreeVo queryById(Long id); +public interface ITestTreeService { + /** + * 查询单个 + * + * @return + */ + TestTreeVo queryById(Long id); - /** - * 查询列表 - */ - List queryList(TestTreeBo bo); + /** + * 查询列表 + */ + List queryList(TestTreeBo bo); - /** - * 根据新增业务对象插入测试树表 - * @param bo 测试树表新增业务对象 - * @return - */ - Boolean insertByBo(TestTreeBo bo); + /** + * 根据新增业务对象插入测试树表 + * + * @param bo 测试树表新增业务对象 + * @return + */ + Boolean insertByBo(TestTreeBo bo); - /** - * 根据编辑业务对象修改测试树表 - * @param bo 测试树表编辑业务对象 - * @return - */ - Boolean updateByBo(TestTreeBo bo); + /** + * 根据编辑业务对象修改测试树表 + * + * @param bo 测试树表编辑业务对象 + * @return + */ + Boolean updateByBo(TestTreeBo bo); - /** - * 校验并删除数据 - * @param ids 主键集合 - * @param isValid 是否校验,true-删除前校验,false-不校验 - * @return - */ - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + /** + * 校验并删除数据 + * + * @param ids 主键集合 + * @param isValid 是否校验,true-删除前校验,false-不校验 + * @return + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); } diff --git a/ruoyi/src/main/java/com/ruoyi/demo/service/impl/TestDemoServiceImpl.java b/ruoyi/src/main/java/com/ruoyi/demo/service/impl/TestDemoServiceImpl.java index a647d241a..7ed7cd5b2 100644 --- a/ruoyi/src/main/java/com/ruoyi/demo/service/impl/TestDemoServiceImpl.java +++ b/ruoyi/src/main/java/com/ruoyi/demo/service/impl/TestDemoServiceImpl.java @@ -5,7 +5,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.core.domain.PageQuery; -import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.demo.domain.TestDemo; @@ -13,6 +12,7 @@ import com.ruoyi.demo.domain.bo.TestDemoBo; import com.ruoyi.demo.domain.vo.TestDemoVo; import com.ruoyi.demo.mapper.TestDemoMapper; import com.ruoyi.demo.service.ITestDemoService; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.Collection; @@ -25,78 +25,86 @@ import java.util.Map; * @author Lion Li * @date 2021-07-26 */ +@RequiredArgsConstructor @Service -public class TestDemoServiceImpl extends ServicePlusImpl implements ITestDemoService { +public class TestDemoServiceImpl implements ITestDemoService { - @Override - public TestDemoVo queryById(Long id) { - return getVoById(id); - } + private final TestDemoMapper baseMapper; - @Override - public TableDataInfo queryPageList(TestDemoBo bo, PageQuery pageQuery) { + @Override + public TestDemoVo queryById(Long id) { + return baseMapper.selectVoById(id); + } + + @Override + public TableDataInfo queryPageList(TestDemoBo bo, PageQuery pageQuery) { LambdaQueryWrapper lqw = buildQueryWrapper(bo); - Page result = pageVo(pageQuery.build(), lqw); - return TableDataInfo.build(result); - } + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } - /** - * 自定义分页查询 - */ - @Override - public TableDataInfo customPageList(TestDemoBo bo, PageQuery pageQuery) { + /** + * 自定义分页查询 + */ + @Override + public TableDataInfo customPageList(TestDemoBo bo, PageQuery pageQuery) { LambdaQueryWrapper lqw = buildQueryWrapper(bo); - Page result = baseMapper.customPageList(pageQuery.build(), lqw); - return TableDataInfo.build(result); - } + Page result = baseMapper.customPageList(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } - @Override - public List queryList(TestDemoBo bo) { - return listVo(buildQueryWrapper(bo)); - } + @Override + public List queryList(TestDemoBo bo) { + return baseMapper.selectVoList(buildQueryWrapper(bo)); + } - private LambdaQueryWrapper buildQueryWrapper(TestDemoBo bo) { - Map params = bo.getParams(); - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.like(StringUtils.isNotBlank(bo.getTestKey()), TestDemo::getTestKey, bo.getTestKey()); - lqw.eq(StringUtils.isNotBlank(bo.getValue()), TestDemo::getValue, bo.getValue()); - lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null, - TestDemo::getCreateTime, params.get("beginCreateTime"), params.get("endCreateTime")); - return lqw; - } + private LambdaQueryWrapper buildQueryWrapper(TestDemoBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getTestKey()), TestDemo::getTestKey, bo.getTestKey()); + lqw.eq(StringUtils.isNotBlank(bo.getValue()), TestDemo::getValue, bo.getValue()); + lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null, + TestDemo::getCreateTime, params.get("beginCreateTime"), params.get("endCreateTime")); + return lqw; + } - @Override - public Boolean insertByBo(TestDemoBo bo) { - TestDemo add = BeanUtil.toBean(bo, TestDemo.class); - validEntityBeforeSave(add); - boolean flag = save(add); - if (flag) { - bo.setId(add.getId()); - } - return flag; - } + @Override + public Boolean insertByBo(TestDemoBo bo) { + TestDemo add = BeanUtil.toBean(bo, TestDemo.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } - @Override - public Boolean updateByBo(TestDemoBo bo) { - TestDemo update = BeanUtil.toBean(bo, TestDemo.class); - validEntityBeforeSave(update); - return updateById(update); - } + @Override + public Boolean updateByBo(TestDemoBo bo) { + TestDemo update = BeanUtil.toBean(bo, TestDemo.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } - /** - * 保存前的数据校验 - * - * @param entity 实体类数据 - */ - private void validEntityBeforeSave(TestDemo entity) { - //TODO 做一些数据校验,如唯一约束 - } + /** + * 保存前的数据校验 + * + * @param entity 实体类数据 + */ + private void validEntityBeforeSave(TestDemo entity) { + //TODO 做一些数据校验,如唯一约束 + } - @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if (isValid) { - //TODO 做一些业务上的校验,判断是否需要校验 - } - return removeByIds(ids); - } + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + public Boolean saveBatch(List list) { + return baseMapper.insertBatch(list); + } } diff --git a/ruoyi/src/main/java/com/ruoyi/demo/service/impl/TestTreeServiceImpl.java b/ruoyi/src/main/java/com/ruoyi/demo/service/impl/TestTreeServiceImpl.java index c4097e667..3e7fa20d7 100644 --- a/ruoyi/src/main/java/com/ruoyi/demo/service/impl/TestTreeServiceImpl.java +++ b/ruoyi/src/main/java/com/ruoyi/demo/service/impl/TestTreeServiceImpl.java @@ -3,13 +3,13 @@ package com.ruoyi.demo.service.impl; import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.demo.domain.TestTree; import com.ruoyi.demo.domain.bo.TestTreeBo; import com.ruoyi.demo.domain.vo.TestTreeVo; import com.ruoyi.demo.mapper.TestTreeMapper; import com.ruoyi.demo.service.ITestTreeService; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.Collection; @@ -23,62 +23,65 @@ import java.util.Map; * @date 2021-07-26 */ // @DS("slave") // 切换从库查询 +@RequiredArgsConstructor @Service -public class TestTreeServiceImpl extends ServicePlusImpl implements ITestTreeService { +public class TestTreeServiceImpl implements ITestTreeService { - @Override - public TestTreeVo queryById(Long id) { - return getVoById(id); - } + private final TestTreeMapper baseMapper; -// @DS("slave") // 切换从库查询 - @Override - public List queryList(TestTreeBo bo) { + @Override + public TestTreeVo queryById(Long id) { + return baseMapper.selectVoById(id); + } + + // @DS("slave") // 切换从库查询 + @Override + public List queryList(TestTreeBo bo) { LambdaQueryWrapper lqw = buildQueryWrapper(bo); - return listVo(lqw); - } + return baseMapper.selectVoList(lqw); + } - private LambdaQueryWrapper buildQueryWrapper(TestTreeBo bo) { - Map params = bo.getParams(); - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.like(StringUtils.isNotBlank(bo.getTreeName()), TestTree::getTreeName, bo.getTreeName()); - lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null, - TestTree::getCreateTime, params.get("beginCreateTime"), params.get("endCreateTime")); - return lqw; - } + private LambdaQueryWrapper buildQueryWrapper(TestTreeBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getTreeName()), TestTree::getTreeName, bo.getTreeName()); + lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null, + TestTree::getCreateTime, params.get("beginCreateTime"), params.get("endCreateTime")); + return lqw; + } - @Override - public Boolean insertByBo(TestTreeBo bo) { - TestTree add = BeanUtil.toBean(bo, TestTree.class); - validEntityBeforeSave(add); - boolean flag = save(add); - if (flag) { - bo.setId(add.getId()); - } - return flag; - } + @Override + public Boolean insertByBo(TestTreeBo bo) { + TestTree add = BeanUtil.toBean(bo, TestTree.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } - @Override - public Boolean updateByBo(TestTreeBo bo) { - TestTree update = BeanUtil.toBean(bo, TestTree.class); - validEntityBeforeSave(update); - return updateById(update); - } + @Override + public Boolean updateByBo(TestTreeBo bo) { + TestTree update = BeanUtil.toBean(bo, TestTree.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } - /** - * 保存前的数据校验 - * - * @param entity 实体类数据 - */ - private void validEntityBeforeSave(TestTree entity) { - //TODO 做一些数据校验,如唯一约束 - } + /** + * 保存前的数据校验 + * + * @param entity 实体类数据 + */ + private void validEntityBeforeSave(TestTree entity) { + //TODO 做一些数据校验,如唯一约束 + } - @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if (isValid) { - //TODO 做一些业务上的校验,判断是否需要校验 - } - return removeByIds(ids); - } + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } } diff --git a/ruoyi/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java b/ruoyi/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java deleted file mode 100644 index 1a0d8e042..000000000 --- a/ruoyi/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java +++ /dev/null @@ -1,142 +0,0 @@ -package com.ruoyi.framework.aspectj; - -import com.ruoyi.common.annotation.DataScope; -import com.ruoyi.common.core.domain.BaseEntity; -import com.ruoyi.common.core.domain.entity.SysRole; -import com.ruoyi.common.core.domain.entity.SysUser; -import com.ruoyi.common.core.domain.model.LoginUser; -import com.ruoyi.common.core.service.UserService; -import com.ruoyi.common.utils.SecurityUtils; -import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.common.utils.spring.SpringUtils; -import org.aspectj.lang.JoinPoint; -import org.aspectj.lang.annotation.Aspect; -import org.aspectj.lang.annotation.Before; -import org.springframework.stereotype.Component; - -/** - * 数据过滤处理 - * - * @author Lion Li - * @deprecated 3.6.0 移除 {@link com.ruoyi.framework.handler.PlusDataPermissionHandler} - */ -@Aspect -@Component -@Deprecated -public class DataScopeAspect { - - /** - * 全部数据权限 - */ - public static final String DATA_SCOPE_ALL = "1"; - - /** - * 自定数据权限 - */ - public static final String DATA_SCOPE_CUSTOM = "2"; - - /** - * 部门数据权限 - */ - public static final String DATA_SCOPE_DEPT = "3"; - - /** - * 部门及以下数据权限 - */ - public static final String DATA_SCOPE_DEPT_AND_CHILD = "4"; - - /** - * 仅本人数据权限 - */ - public static final String DATA_SCOPE_SELF = "5"; - - /** - * 数据权限过滤关键字 - */ - public static final String DATA_SCOPE = "dataScope"; - - @Before("@annotation(controllerDataScope)") - public void doBefore(JoinPoint point, DataScope controllerDataScope) throws Throwable { - clearDataScope(point); - handleDataScope(point, controllerDataScope); - } - - protected void handleDataScope(final JoinPoint joinPoint, DataScope controllerDataScope) { - // 获取当前的用户 - LoginUser loginUser = SecurityUtils.getLoginUser(); - if (StringUtils.isNotNull(loginUser)) { - SysUser currentUser = SpringUtils.getBean(UserService.class).selectUserById(loginUser.getUserId()); - // 如果是超级管理员,则不过滤数据 - if (StringUtils.isNotNull(currentUser) && !currentUser.isAdmin()) { - dataScopeFilter(joinPoint, currentUser, controllerDataScope.deptAlias(), - controllerDataScope.userAlias(), controllerDataScope.isUser()); - } - } - } - - /** - * 数据范围过滤 - * - * @param joinPoint 切点 - * @param user 用户 - * @param userAlias 别名 - */ - public static void dataScopeFilter(JoinPoint joinPoint, SysUser user, String deptAlias, String userAlias, boolean isUser) { - StringBuilder sqlString = new StringBuilder(); - - // 将 "." 提取出,不写别名为单表查询,写别名为多表查询 - deptAlias = StringUtils.isNotBlank(deptAlias) ? deptAlias + "." : ""; - userAlias = StringUtils.isNotBlank(userAlias) ? userAlias + "." : ""; - - for (SysRole role : user.getRoles()) { - String dataScope = role.getDataScope(); - if (DATA_SCOPE_ALL.equals(dataScope)) { - sqlString = new StringBuilder(); - break; - } else if (DATA_SCOPE_CUSTOM.equals(dataScope)) { - sqlString.append(StringUtils.format( - " OR {}dept_id IN ( SELECT dept_id FROM sys_role_dept WHERE role_id = {} ) ", - deptAlias, role.getRoleId())); - } else if (DATA_SCOPE_DEPT.equals(dataScope)) { - sqlString.append(StringUtils.format(" OR {}dept_id = {} ", - deptAlias, user.getDeptId())); - } else if (DATA_SCOPE_DEPT_AND_CHILD.equals(dataScope)) { - sqlString.append(StringUtils.format( - " OR {}dept_id IN ( SELECT dept_id FROM sys_dept WHERE dept_id = {} or find_in_set( {} , ancestors ) )", - deptAlias, user.getDeptId(), user.getDeptId())); - } else if (DATA_SCOPE_SELF.equals(dataScope)) { - if (isUser) { - sqlString.append(StringUtils.format(" OR {}user_id = {} ", - userAlias, user.getUserId())); - } else { - // 数据权限为仅本人且没有userAlias别名不查询任何数据 - sqlString.append(" OR 1=0 "); - } - } - } - - if (StringUtils.isNotBlank(sqlString.toString())) { - putDataScope(joinPoint, sqlString.substring(4)); - } - } - - /** - * 拼接权限sql前先清空params.dataScope参数防止注入 - */ - private void clearDataScope(final JoinPoint joinPoint) { - Object params = joinPoint.getArgs()[0]; - if (StringUtils.isNotNull(params)) { - putDataScope(joinPoint, ""); - } - } - - private static void putDataScope(JoinPoint joinPoint, String sql) { - Object params = joinPoint.getArgs()[0]; - if (StringUtils.isNotNull(params)) { - if (params instanceof BaseEntity) { - BaseEntity baseEntity = (BaseEntity) params; - baseEntity.getParams().put(DATA_SCOPE, sql); - } - } - } -} diff --git a/ruoyi/src/main/java/com/ruoyi/framework/aspectj/DataSourceAspect.java b/ruoyi/src/main/java/com/ruoyi/framework/aspectj/DataSourceAspect.java deleted file mode 100644 index 0b1c898b3..000000000 --- a/ruoyi/src/main/java/com/ruoyi/framework/aspectj/DataSourceAspect.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.ruoyi.framework.aspectj; - -import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; -import com.ruoyi.common.annotation.DataSource; -import com.ruoyi.common.utils.StringUtils; -import org.aspectj.lang.ProceedingJoinPoint; -import org.aspectj.lang.annotation.Around; -import org.aspectj.lang.annotation.Aspect; -import org.aspectj.lang.annotation.Pointcut; -import org.aspectj.lang.reflect.MethodSignature; -import org.springframework.core.annotation.AnnotationUtils; -import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Component; - -import java.util.Objects; - -/** - * 多数据源处理 - * - * @author Lion Li - * @deprecated 3.6.0 移除 使用原生方法处理 功能更全 - */ -@Aspect -@Order(-500) -@Component -@Deprecated -public class DataSourceAspect { - - @Pointcut("@annotation(com.ruoyi.common.annotation.DataSource)" - + "|| @within(com.ruoyi.common.annotation.DataSource)") - public void dsPointCut() { - } - - @Around("dsPointCut()") - public Object around(ProceedingJoinPoint point) throws Throwable { - DataSource dataSource = getDataSource(point); - - if (StringUtils.isNotNull(dataSource)) { - DynamicDataSourceContextHolder.poll(); - String source = dataSource.value().getSource(); - DynamicDataSourceContextHolder.push(source); - } - - try { - return point.proceed(); - } finally { - // 销毁数据源 在执行方法之后 - DynamicDataSourceContextHolder.clear(); - } - } - - /** - * 获取需要切换的数据源 - */ - public DataSource getDataSource(ProceedingJoinPoint point) { - MethodSignature signature = (MethodSignature) point.getSignature(); - DataSource dataSource = AnnotationUtils.findAnnotation(signature.getMethod(), DataSource.class); - if (Objects.nonNull(dataSource)) { - return dataSource; - } - - return AnnotationUtils.findAnnotation(signature.getDeclaringType(), DataSource.class); - } - -} diff --git a/ruoyi/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java b/ruoyi/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java index 642076d9e..551a1ece3 100644 --- a/ruoyi/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java +++ b/ruoyi/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java @@ -1,13 +1,13 @@ package com.ruoyi.framework.aspectj; +import cn.hutool.core.util.ObjectUtil; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.domain.dto.OperLogDTO; -import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.core.service.OperLogService; import com.ruoyi.common.enums.BusinessStatus; import com.ruoyi.common.enums.HttpMethod; +import com.ruoyi.common.helper.LoginHelper; import com.ruoyi.common.utils.JsonUtils; -import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.ServletUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.spring.SpringUtils; @@ -60,9 +60,6 @@ public class LogAspect { protected void handleLog(final JoinPoint joinPoint, Log controllerLog, final Exception e, Object jsonResult) { try { - // 获取当前的用户 - LoginUser loginUser = SecurityUtils.getLoginUser(); - // *========数据库日志=========*// OperLogDTO operLog = new OperLogDTO(); operLog.setStatus(BusinessStatus.SUCCESS.ordinal()); @@ -70,9 +67,7 @@ public class LogAspect { String ip = ServletUtils.getClientIP(); operLog.setOperIp(ip); operLog.setOperUrl(ServletUtils.getRequest().getRequestURI()); - if (loginUser != null) { - operLog.setOperName(loginUser.getUsername()); - } + operLog.setOperName(LoginHelper.getUsername()); if (e != null) { operLog.setStatus(BusinessStatus.FAIL.ordinal()); @@ -116,7 +111,7 @@ public class LogAspect { setRequestValue(joinPoint, operLog); } // 是否需要保存response,参数和值 - if (log.isSaveResponseData() && StringUtils.isNotNull(jsonResult)) { + if (log.isSaveResponseData() && ObjectUtil.isNotNull(jsonResult)) { operLog.setJsonResult(StringUtils.substring(JsonUtils.toJsonString(jsonResult), 0, 2000)); } } @@ -145,7 +140,7 @@ public class LogAspect { StringBuilder params = new StringBuilder(); if (paramsArray != null && paramsArray.length > 0) { for (Object o : paramsArray) { - if (StringUtils.isNotNull(o) && !isFilterObject(o)) { + if (ObjectUtil.isNotNull(o) && !isFilterObject(o)) { try { params.append(JsonUtils.toJsonString(o)).append(" "); } catch (Exception e) { @@ -181,6 +176,6 @@ public class LogAspect { } } return o instanceof MultipartFile || o instanceof HttpServletRequest || o instanceof HttpServletResponse - || o instanceof BindingResult; + || o instanceof BindingResult; } } diff --git a/ruoyi/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java b/ruoyi/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java index ce3de2bea..298eb43bf 100644 --- a/ruoyi/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java +++ b/ruoyi/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java @@ -3,8 +3,8 @@ 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.RedisUtils; import com.ruoyi.common.utils.ServletUtils; +import com.ruoyi.common.utils.redis.RedisUtils; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; @@ -52,7 +52,7 @@ public class RateLimiterAspect { if (rateLimiter.limitType() == LimitType.IP) { // 获取请求ip stringBuffer.append(ServletUtils.getClientIP()).append("-"); - } else if (rateLimiter.limitType() == LimitType.CLUSTER){ + } else if (rateLimiter.limitType() == LimitType.CLUSTER) { // 获取客户端实例id stringBuffer.append(RedisUtils.getClient().getId()).append("-"); } diff --git a/ruoyi/src/main/java/com/ruoyi/framework/aspectj/RepeatSubmitAspect.java b/ruoyi/src/main/java/com/ruoyi/framework/aspectj/RepeatSubmitAspect.java index f8f5c370b..e7bbbdd6b 100644 --- a/ruoyi/src/main/java/com/ruoyi/framework/aspectj/RepeatSubmitAspect.java +++ b/ruoyi/src/main/java/com/ruoyi/framework/aspectj/RepeatSubmitAspect.java @@ -1,21 +1,21 @@ package com.ruoyi.framework.aspectj; +import cn.dev33.satoken.SaManager; +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.exception.ServiceException; -import com.ruoyi.common.properties.TokenProperties; import com.ruoyi.common.utils.JsonUtils; -import com.ruoyi.common.utils.RedisUtils; import com.ruoyi.common.utils.ServletUtils; import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.redis.RedisUtils; 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.Aspect; import org.aspectj.lang.annotation.Before; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.validation.BindingResult; import org.springframework.web.multipart.MultipartFile; @@ -32,12 +32,11 @@ import java.util.concurrent.TimeUnit; * @author Lion Li */ @Slf4j -@RequiredArgsConstructor(onConstructor_ = @Autowired) +@RequiredArgsConstructor @Aspect @Component public class RepeatSubmitAspect { - private final TokenProperties tokenProperties; private final RepeatSubmitProperties repeatSubmitProperties; @Before("@annotation(repeatSubmit)") @@ -57,13 +56,11 @@ public class RepeatSubmitAspect { String url = request.getRequestURI(); // 唯一值(没有消息头则使用请求地址) - String submitKey = request.getHeader(tokenProperties.getHeader()); - if (StringUtils.isEmpty(submitKey)) { - submitKey = url; - } + String submitKey = StringUtils.trimToEmpty(request.getHeader(SaManager.getConfig().getTokenName())); + submitKey = SecureUtil.md5(submitKey + ":" + nowParams); - // 唯一标识(指定key + 消息头) - String cacheRepeatKey = Constants.REPEAT_SUBMIT_KEY + submitKey; + // 唯一标识(指定key + url + 消息头) + String cacheRepeatKey = Constants.REPEAT_SUBMIT_KEY + url + submitKey; String key = RedisUtils.getCacheObject(cacheRepeatKey); if (key == null) { RedisUtils.setCacheObject(cacheRepeatKey, "", interval, TimeUnit.MILLISECONDS); @@ -79,7 +76,7 @@ public class RepeatSubmitAspect { StringBuilder params = new StringBuilder(); if (paramsArray != null && paramsArray.length > 0) { for (Object o : paramsArray) { - if (StringUtils.isNotNull(o) && !isFilterObject(o)) { + if (ObjectUtil.isNotNull(o) && !isFilterObject(o)) { try { params.append(JsonUtils.toJsonString(o)).append(" "); } catch (Exception e) { diff --git a/ruoyi/src/main/java/com/ruoyi/framework/config/AsyncConfig.java b/ruoyi/src/main/java/com/ruoyi/framework/config/AsyncConfig.java deleted file mode 100644 index 95f3c9b73..000000000 --- a/ruoyi/src/main/java/com/ruoyi/framework/config/AsyncConfig.java +++ /dev/null @@ -1,55 +0,0 @@ -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 org.springframework.security.concurrent.DelegatingSecurityContextExecutorService; - -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; - - /** - * 异步执行需要使用权限框架自带的包装线程池 保证权限信息的传递 - */ - @Override - public Executor getAsyncExecutor() { - return new DelegatingSecurityContextExecutorService(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/src/main/java/com/ruoyi/framework/config/DruidConfig.java b/ruoyi/src/main/java/com/ruoyi/framework/config/DruidConfig.java index 735f7e35e..6f7a82ecc 100644 --- a/ruoyi/src/main/java/com/ruoyi/framework/config/DruidConfig.java +++ b/ruoyi/src/main/java/com/ruoyi/framework/config/DruidConfig.java @@ -21,11 +21,10 @@ public class DruidConfig { /** * 去除监控页面底部的广告 */ - @SuppressWarnings({ "rawtypes", "unchecked" }) + @SuppressWarnings({"rawtypes", "unchecked"}) @Bean @ConditionalOnProperty(name = "spring.datasource.druid.statViewServlet.enabled", havingValue = "true") - public FilterRegistrationBean removeDruidFilterRegistrationBean(DruidStatProperties properties) - { + public FilterRegistrationBean removeDruidFilterRegistrationBean(DruidStatProperties properties) { // 获取web监控页面的参数 DruidStatProperties.StatViewServlet config = properties.getStatViewServlet(); // 提取common.js的配置路径 @@ -33,16 +32,14 @@ public class DruidConfig { String commonJsPattern = pattern.replaceAll("\\*", "js/common.js"); final String filePath = "support/http/resources/js/common.js"; // 创建filter进行过滤 - Filter filter = new Filter() - { + Filter filter = new Filter() { @Override - public void init(javax.servlet.FilterConfig filterConfig) throws ServletException - { + public void init(javax.servlet.FilterConfig filterConfig) throws ServletException { } + @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) - throws IOException, ServletException - { + throws IOException, ServletException { chain.doFilter(request, response); // 重置缓冲区,响应头不会被重置 // response.resetBuffer(); @@ -53,9 +50,9 @@ public class DruidConfig { text = text.replaceAll("powered.*?shrek.wang", ""); response.getWriter().write(text); } + @Override - public void destroy() - { + public void destroy() { } }; FilterRegistrationBean registrationBean = new FilterRegistrationBean(); diff --git a/ruoyi/src/main/java/com/ruoyi/framework/config/I18nConfig.java b/ruoyi/src/main/java/com/ruoyi/framework/config/I18nConfig.java index 20b52a8e2..e64fa3a7f 100644 --- a/ruoyi/src/main/java/com/ruoyi/framework/config/I18nConfig.java +++ b/ruoyi/src/main/java/com/ruoyi/framework/config/I18nConfig.java @@ -17,30 +17,30 @@ import java.util.Locale; @Configuration public class I18nConfig { - @Bean - public LocaleResolver localeResolver() { - return new I18nLocaleResolver(); - } + @Bean + public LocaleResolver localeResolver() { + return new I18nLocaleResolver(); + } - /** - * 获取请求头国际化信息 - */ - static class I18nLocaleResolver implements LocaleResolver { + /** + * 获取请求头国际化信息 + */ + static class I18nLocaleResolver implements LocaleResolver { - @Override - public Locale resolveLocale(HttpServletRequest httpServletRequest) { - String language = httpServletRequest.getHeader("content-language"); - Locale locale = Locale.getDefault(); - if (StrUtil.isNotBlank(language)) { - String[] split = language.split("_"); - locale = new Locale(split[0], split[1]); - } - return locale; - } + @Override + public Locale resolveLocale(HttpServletRequest httpServletRequest) { + String language = httpServletRequest.getHeader("content-language"); + Locale locale = Locale.getDefault(); + if (StrUtil.isNotBlank(language)) { + String[] split = language.split("_"); + locale = new Locale(split[0], split[1]); + } + return locale; + } - @Override - public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) { + @Override + public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) { - } - } + } + } } diff --git a/ruoyi/src/main/java/com/ruoyi/framework/config/JacksonConfig.java b/ruoyi/src/main/java/com/ruoyi/framework/config/JacksonConfig.java index 55756d49b..a5d637165 100644 --- a/ruoyi/src/main/java/com/ruoyi/framework/config/JacksonConfig.java +++ b/ruoyi/src/main/java/com/ruoyi/framework/config/JacksonConfig.java @@ -28,23 +28,23 @@ import java.util.TimeZone; @Configuration public class JacksonConfig { - @Primary - @Bean - public ObjectMapper getObjectMapper(Jackson2ObjectMapperBuilder builder, JacksonProperties jacksonProperties) { - ObjectMapper objectMapper = builder.createXmlMapper(false).build(); - // 全局配置序列化返回 JSON 处理 - SimpleModule simpleModule = new SimpleModule(); - simpleModule.addSerializer(Long.class, BigNumberSerializer.INSTANCE); - simpleModule.addSerializer(Long.TYPE, BigNumberSerializer.INSTANCE); - simpleModule.addSerializer(BigInteger.class, BigNumberSerializer.INSTANCE); - simpleModule.addSerializer(BigDecimal.class, ToStringSerializer.instance); - DateTimeFormatter formatter = DateTimeFormatter.ofPattern(jacksonProperties.getDateFormat()); - simpleModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(formatter)); - simpleModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(formatter)); - objectMapper.registerModule(simpleModule); - objectMapper.setTimeZone(TimeZone.getDefault()); - log.info("初始化 jackson 配置"); - return objectMapper; - } + @Primary + @Bean + public ObjectMapper getObjectMapper(Jackson2ObjectMapperBuilder builder, JacksonProperties jacksonProperties) { + ObjectMapper objectMapper = builder.createXmlMapper(false).build(); + // 全局配置序列化返回 JSON 处理 + SimpleModule simpleModule = new SimpleModule(); + simpleModule.addSerializer(Long.class, BigNumberSerializer.INSTANCE); + simpleModule.addSerializer(Long.TYPE, BigNumberSerializer.INSTANCE); + simpleModule.addSerializer(BigInteger.class, BigNumberSerializer.INSTANCE); + simpleModule.addSerializer(BigDecimal.class, ToStringSerializer.instance); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern(jacksonProperties.getDateFormat()); + simpleModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(formatter)); + simpleModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(formatter)); + objectMapper.registerModule(simpleModule); + objectMapper.setTimeZone(TimeZone.getDefault()); + log.info("初始化 jackson 配置"); + return objectMapper; + } } diff --git a/ruoyi/src/main/java/com/ruoyi/framework/config/MybatisPlusConfig.java b/ruoyi/src/main/java/com/ruoyi/framework/config/MybatisPlusConfig.java index 5daaa9acd..ffd2c1553 100644 --- a/ruoyi/src/main/java/com/ruoyi/framework/config/MybatisPlusConfig.java +++ b/ruoyi/src/main/java/com/ruoyi/framework/config/MybatisPlusConfig.java @@ -4,14 +4,9 @@ import cn.hutool.core.net.NetUtil; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator; import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator; -import com.baomidou.mybatisplus.core.injector.AbstractMethod; -import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector; -import com.baomidou.mybatisplus.core.injector.ISqlInjector; -import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; -import com.ruoyi.common.core.mybatisplus.methods.InsertAll; import com.ruoyi.framework.handler.CreateAndUpdateMetaObjectHandler; import com.ruoyi.framework.interceptor.PlusDataPermissionInterceptor; import org.mybatis.spring.annotation.MapperScan; @@ -19,8 +14,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.transaction.annotation.EnableTransactionManagement; -import java.util.List; - /** * mybatis-plus配置类(下方注释有插件介绍) * @@ -31,17 +24,17 @@ import java.util.List; @MapperScan("${mybatis-plus.mapperPackage}") public class MybatisPlusConfig { - @Bean - public MybatisPlusInterceptor mybatisPlusInterceptor() { - MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); // 数据权限处理 interceptor.addInnerInterceptor(dataPermissionInterceptor()); - // 分页插件 - interceptor.addInnerInterceptor(paginationInnerInterceptor()); - // 乐观锁插件 - interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor()); - return interceptor; - } + // 分页插件 + interceptor.addInnerInterceptor(paginationInnerInterceptor()); + // 乐观锁插件 + interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor()); + return interceptor; + } /** * 数据权限拦截器 @@ -50,47 +43,32 @@ public class MybatisPlusConfig { return new PlusDataPermissionInterceptor(); } - /** - * 分页插件,自动识别数据库类型 - */ - public PaginationInnerInterceptor paginationInnerInterceptor() { - PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(); - // 设置最大单页限制数量,默认 500 条,-1 不受限制 - paginationInnerInterceptor.setMaxLimit(-1L); - // 分页合理化 - paginationInnerInterceptor.setOverflow(true); - return paginationInnerInterceptor; - } + /** + * 分页插件,自动识别数据库类型 + */ + public PaginationInnerInterceptor paginationInnerInterceptor() { + PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(); + // 设置最大单页限制数量,默认 500 条,-1 不受限制 + paginationInnerInterceptor.setMaxLimit(-1L); + // 分页合理化 + paginationInnerInterceptor.setOverflow(true); + return paginationInnerInterceptor; + } - /** - * 乐观锁插件 - */ - public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor() { - return new OptimisticLockerInnerInterceptor(); - } + /** + * 乐观锁插件 + */ + public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor() { + return new OptimisticLockerInnerInterceptor(); + } - /** - * 元对象字段填充控制器 - */ - @Bean - public MetaObjectHandler metaObjectHandler() { - return new CreateAndUpdateMetaObjectHandler(); - } - - /** - * sql注入器配置 - */ - @Bean - public ISqlInjector sqlInjector() { - return new DefaultSqlInjector() { - @Override - public List getMethodList(Class mapperClass, TableInfo tableInfo) { - List methodList = super.getMethodList(mapperClass, tableInfo); - methodList.add(new InsertAll()); - return methodList; - } - }; - } + /** + * 元对象字段填充控制器 + */ + @Bean + public MetaObjectHandler metaObjectHandler() { + return new CreateAndUpdateMetaObjectHandler(); + } /** * 使用网卡信息绑定雪花生成器 @@ -101,24 +79,24 @@ public class MybatisPlusConfig { return new DefaultIdentifierGenerator(NetUtil.getLocalhost()); } - /** - * PaginationInnerInterceptor 分页插件,自动识别数据库类型 - * https://baomidou.com/pages/97710a/ - * OptimisticLockerInnerInterceptor 乐观锁插件 - * https://baomidou.com/pages/0d93c0/ - * MetaObjectHandler 元对象字段填充控制器 - * https://baomidou.com/pages/4c6bcf/ - * ISqlInjector sql注入器 - * https://baomidou.com/pages/42ea4a/ - * BlockAttackInnerInterceptor 如果是对全表的删除或更新操作,就会终止该操作 - * https://baomidou.com/pages/f9a237/ - * IllegalSQLInnerInterceptor sql性能规范插件(垃圾SQL拦截) - * IdentifierGenerator 自定义主键策略 - * https://baomidou.com/pages/568eb2/ - * TenantLineInnerInterceptor 多租户插件 - * https://baomidou.com/pages/aef2f2/ - * DynamicTableNameInnerInterceptor 动态表名插件 - * https://baomidou.com/pages/2a45ff/ - */ + /** + * PaginationInnerInterceptor 分页插件,自动识别数据库类型 + * https://baomidou.com/pages/97710a/ + * OptimisticLockerInnerInterceptor 乐观锁插件 + * https://baomidou.com/pages/0d93c0/ + * MetaObjectHandler 元对象字段填充控制器 + * https://baomidou.com/pages/4c6bcf/ + * ISqlInjector sql注入器 + * https://baomidou.com/pages/42ea4a/ + * BlockAttackInnerInterceptor 如果是对全表的删除或更新操作,就会终止该操作 + * https://baomidou.com/pages/f9a237/ + * IllegalSQLInnerInterceptor sql性能规范插件(垃圾SQL拦截) + * IdentifierGenerator 自定义主键策略 + * https://baomidou.com/pages/568eb2/ + * TenantLineInnerInterceptor 多租户插件 + * https://baomidou.com/pages/aef2f2/ + * DynamicTableNameInnerInterceptor 动态表名插件 + * https://baomidou.com/pages/2a45ff/ + */ } diff --git a/ruoyi/src/main/java/com/ruoyi/framework/config/RedisConfig.java b/ruoyi/src/main/java/com/ruoyi/framework/config/RedisConfig.java index 6fa54e2a3..a8bec417a 100644 --- a/ruoyi/src/main/java/com/ruoyi/framework/config/RedisConfig.java +++ b/ruoyi/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/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java b/ruoyi/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java index 83565b6ec..f43ecab7d 100644 --- a/ruoyi/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java +++ b/ruoyi/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java @@ -19,10 +19,6 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class ResourcesConfig implements WebMvcConfigurer { - @Override - public void addResourceHandlers(ResourceHandlerRegistry registry) { - } - @Override public void addInterceptors(InterceptorRegistry registry) { // 全局链路跟踪拦截器 @@ -31,6 +27,10 @@ public class ResourcesConfig implements WebMvcConfigurer { registry.addInterceptor(new PlusWebInvokeTimeInterceptor()); } + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + } + /** * 跨域配置 */ diff --git a/ruoyi/src/main/java/com/ruoyi/framework/config/SaTokenConfig.java b/ruoyi/src/main/java/com/ruoyi/framework/config/SaTokenConfig.java new file mode 100644 index 000000000..54f373bea --- /dev/null +++ b/ruoyi/src/main/java/com/ruoyi/framework/config/SaTokenConfig.java @@ -0,0 +1,72 @@ +package com.ruoyi.framework.config; + +import cn.dev33.satoken.interceptor.SaAnnotationInterceptor; +import cn.dev33.satoken.interceptor.SaRouteInterceptor; +import cn.dev33.satoken.jwt.StpLogicJwtForStyle; +import cn.dev33.satoken.router.SaRouter; +import cn.dev33.satoken.stp.StpLogic; +import cn.hutool.core.util.ObjectUtil; +import com.ruoyi.common.helper.LoginHelper; +import com.ruoyi.framework.config.properties.SecurityProperties; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * sa-token 配置 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Slf4j +@Configuration +public class SaTokenConfig implements WebMvcConfigurer { + + private final SecurityProperties securityProperties; + + /** + * 注册sa-token的拦截器 + */ + @Override + public void addInterceptors(InterceptorRegistry registry) { + // 注册路由拦截器,自定义验证规则 + registry.addInterceptor(new SaRouteInterceptor((request, response, handler) -> { + // 登录验证 -- 排除多个路径 + SaRouter + // 获取所有的 + .match("/**") + // 排除下不需要拦截的 + .notMatch(securityProperties.getExcludes()) + .check(() -> { + Long userId = LoginHelper.getUserId(); + if (ObjectUtil.isNotNull(userId)) { + // 有效率影响 用于临时测试 + // if (log.isDebugEnabled()) { + // log.debug("剩余有效时间: {}", StpUtil.getTokenTimeout()); + // log.debug("临时有效时间: {}", StpUtil.getTokenActivityTimeout()); + // } + } + }); + }) { + @SuppressWarnings("all") + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + LoginHelper.clearCache(); + } + }).addPathPatterns("/**"); + registry.addInterceptor(new SaAnnotationInterceptor()).addPathPatterns("/**"); + } + + @Bean + public StpLogic getStpLogicJwt() { + // Sa-Token 整合 jwt (Style模式) + return new StpLogicJwtForStyle(); + } + +} diff --git a/ruoyi/src/main/java/com/ruoyi/framework/config/SecurityConfig.java b/ruoyi/src/main/java/com/ruoyi/framework/config/SecurityConfig.java deleted file mode 100644 index 450eccd45..000000000 --- a/ruoyi/src/main/java/com/ruoyi/framework/config/SecurityConfig.java +++ /dev/null @@ -1,137 +0,0 @@ -package com.ruoyi.framework.config; - -import com.ruoyi.framework.config.properties.SecurityProperties; -import com.ruoyi.framework.security.filter.JwtAuthenticationTokenFilter; -import com.ruoyi.framework.security.handle.AuthenticationEntryPointImpl; -import com.ruoyi.framework.security.handle.LogoutSuccessHandlerImpl; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Bean; -import org.springframework.http.HttpMethod; -import org.springframework.security.authentication.AuthenticationManager; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; -import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; -import org.springframework.security.config.http.SessionCreationPolicy; -import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; -import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; -import org.springframework.security.web.authentication.logout.LogoutFilter; -import org.springframework.web.filter.CorsFilter; - -/** - * spring security配置 - * - * @author ruoyi - */ -@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) -public class SecurityConfig extends WebSecurityConfigurerAdapter { - /** - * 自定义用户认证逻辑 - */ - @Autowired - private UserDetailsService userDetailsService; - - /** - * 认证失败处理类 - */ - @Autowired - private AuthenticationEntryPointImpl unauthorizedHandler; - - /** - * 退出处理类 - */ - @Autowired - private LogoutSuccessHandlerImpl logoutSuccessHandler; - - /** - * token认证过滤器 - */ - @Autowired - private JwtAuthenticationTokenFilter authenticationTokenFilter; - - /** - * 跨域过滤器 - */ - @Autowired - private CorsFilter corsFilter; - - @Autowired - private SecurityProperties securityProperties; - - /** - * 解决 无法直接注入 AuthenticationManager - * - * @return - * @throws Exception - */ - @Bean - @Override - public AuthenticationManager authenticationManagerBean() throws Exception { - return super.authenticationManagerBean(); - } - - /** - * anyRequest | 匹配所有请求路径 - * access | SpringEl表达式结果为true时可以访问 - * anonymous | 匿名可以访问 - * denyAll | 用户不能访问 - * fullyAuthenticated | 用户完全认证可以访问(非remember-me下自动登录) - * hasAnyAuthority | 如果有参数,参数表示权限,则其中任何一个权限可以访问 - * hasAnyRole | 如果有参数,参数表示角色,则其中任何一个角色可以访问 - * hasAuthority | 如果有参数,参数表示权限,则其权限可以访问 - * hasIpAddress | 如果有参数,参数表示IP地址,如果用户IP和参数匹配,则可以访问 - * hasRole | 如果有参数,参数表示角色,则其角色可以访问 - * permitAll | 用户可以任意访问 - * rememberMe | 允许通过remember-me登录的用户访问 - * authenticated | 用户登录后可访问 - */ - @Override - protected void configure(HttpSecurity httpSecurity) throws Exception { - httpSecurity - // CSRF禁用,因为不使用session - .csrf().disable() - // 认证失败处理类 - .exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and() - // 基于token,所以不需要session - .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and() - // 过滤请求 - .authorizeRequests() - .antMatchers( - HttpMethod.GET, - "/", - "/*.html", - "/**/*.html", - "/**/*.css", - "/**/*.js" - ).permitAll() - .antMatchers(securityProperties.getAnonymous()).anonymous() - .antMatchers(securityProperties.getPermitAll()).permitAll() - // 除上面外的所有请求全部需要鉴权认证 - .anyRequest().authenticated() - .and() - .headers().frameOptions().disable(); - httpSecurity.logout().logoutUrl(securityProperties.getLogoutUrl()).logoutSuccessHandler(logoutSuccessHandler); - // 添加JWT filter - httpSecurity.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class); - // 添加CORS filter - httpSecurity.addFilterBefore(corsFilter, JwtAuthenticationTokenFilter.class); - httpSecurity.addFilterBefore(corsFilter, LogoutFilter.class); - } - - /** - * 强散列哈希加密实现 - */ - @Bean - public BCryptPasswordEncoder bCryptPasswordEncoder() { - return new BCryptPasswordEncoder(); - } - - /** - * 身份认证接口 - */ - @Override - protected void configure(AuthenticationManagerBuilder auth) throws Exception { - auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder()); - } -} diff --git a/ruoyi/src/main/java/com/ruoyi/framework/config/SwaggerConfig.java b/ruoyi/src/main/java/com/ruoyi/framework/config/SwaggerConfig.java index bf6bc8f9f..22ef7c1b5 100644 --- a/ruoyi/src/main/java/com/ruoyi/framework/config/SwaggerConfig.java +++ b/ruoyi/src/main/java/com/ruoyi/framework/config/SwaggerConfig.java @@ -1,14 +1,19 @@ package com.ruoyi.framework.config; +import cn.dev33.satoken.config.SaTokenConfig; import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; import com.github.xiaoymin.knife4j.spring.extension.OpenApiExtensionResolver; -import com.ruoyi.common.properties.TokenProperties; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.framework.config.properties.SwaggerProperties; import io.swagger.models.auth.In; -import org.springframework.beans.factory.annotation.Autowired; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.util.ReflectionUtils; +import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; @@ -16,8 +21,11 @@ import springfox.documentation.service.*; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spi.service.contexts.SecurityContext; import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.spring.web.plugins.WebFluxRequestHandlerProvider; +import springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider; import javax.annotation.PostConstruct; +import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; @@ -26,48 +34,75 @@ import java.util.List; * * @author Lion Li */ +@RequiredArgsConstructor @Configuration @EnableKnife4j public class SwaggerConfig { - @Autowired - private SwaggerProperties swaggerProperties; + private final SwaggerProperties swaggerProperties; + private final SaTokenConfig saTokenConfig; + private final OpenApiExtensionResolver openApiExtensionResolver; - @Autowired - private TokenProperties tokenProperties; + /** + * 用于适配springboot 2.6 + */ + @Bean + @SuppressWarnings("all") + public BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() { + return new BeanPostProcessor() { + @Override + public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { + if (bean instanceof WebMvcRequestHandlerProvider || bean instanceof WebFluxRequestHandlerProvider) { + customizeSpringfoxHandlerMappings(getHandlerMappings(bean)); + } + return bean; + } - @Autowired - private OpenApiExtensionResolver openApiExtensionResolver; + private void customizeSpringfoxHandlerMappings(List mappings) { + mappings.removeIf(mapping -> mapping.getPatternParser() != null); + } + + private List getHandlerMappings(Object bean) { + try { + Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings"); + field.setAccessible(true); + return (List) field.get(bean); + } catch (IllegalArgumentException | IllegalAccessException e) { + throw new IllegalStateException(e); + } + } + }; + } /** * 创建API */ @PostConstruct public void createRestApi() { - for (SwaggerProperties.Groups group : swaggerProperties.getGroups()) { - String basePackage = group.getBasePackage(); - Docket docket = new Docket(DocumentationType.OAS_30) - .enable(swaggerProperties.getEnabled()) - // 用来创建该API的基本信息,展示在文档的页面中(自定义展示的信息) - .apiInfo(apiInfo()) - // 设置哪些接口暴露给Swagger展示 - .select() - // 扫描所有有注解的api,用这种方式更灵活 - //.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) - // 扫描指定包中的swagger注解 - .apis(RequestHandlerSelectors.basePackage(basePackage)) - // 扫描所有 .apis(RequestHandlerSelectors.any()) - .paths(PathSelectors.any()) - .build() - .groupName(group.getName()) - // 设置安全模式,swagger可以设置访问token - .securitySchemes(securitySchemes()) - .securityContexts(securityContexts()) - .extensions(openApiExtensionResolver.buildExtensions(group.getName())) - .pathMapping(swaggerProperties.getPathMapping()); - String beanName = StringUtils.substringAfterLast(basePackage, ".") + "Docket"; - SpringUtils.registerBean(beanName, docket); - } + for (SwaggerProperties.Groups group : swaggerProperties.getGroups()) { + String basePackage = group.getBasePackage(); + Docket docket = new Docket(DocumentationType.OAS_30) + .enable(swaggerProperties.getEnabled()) + // 用来创建该API的基本信息,展示在文档的页面中(自定义展示的信息) + .apiInfo(apiInfo()) + // 设置哪些接口暴露给Swagger展示 + .select() + // 扫描所有有注解的api,用这种方式更灵活 + //.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) + // 扫描指定包中的swagger注解 + .apis(RequestHandlerSelectors.basePackage(basePackage)) + // 扫描所有 .apis(RequestHandlerSelectors.any()) + .paths(PathSelectors.any()) + .build() + .groupName(group.getName()) + // 设置安全模式,swagger可以设置访问token + .securitySchemes(securitySchemes()) + .securityContexts(securityContexts()) + .extensions(openApiExtensionResolver.buildExtensions(group.getName())) + .pathMapping(swaggerProperties.getPathMapping()); + String beanName = StringUtils.substringAfterLast(basePackage, ".") + "Docket"; + SpringUtils.registerBean(beanName, docket); + } } /** @@ -75,8 +110,8 @@ public class SwaggerConfig { */ private List securitySchemes() { List apiKeyList = new ArrayList(); - String header = tokenProperties.getHeader(); - apiKeyList.add(new ApiKey(header, header, In.HEADER.toValue())); + String header = saTokenConfig.getTokenName(); + apiKeyList.add(new ApiKey(header, header, In.HEADER.toValue())); return apiKeyList; } @@ -86,10 +121,10 @@ public class SwaggerConfig { private List securityContexts() { List securityContexts = new ArrayList<>(); securityContexts.add( - SecurityContext.builder() - .securityReferences(defaultAuth()) - .operationSelector(o -> o.requestMappingPattern().matches("/.*")) - .build()); + SecurityContext.builder() + .securityReferences(defaultAuth()) + .operationSelector(o -> o.requestMappingPattern().matches("/.*")) + .build()); return securityContexts; } @@ -101,7 +136,7 @@ public class SwaggerConfig { AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; authorizationScopes[0] = authorizationScope; List securityReferences = new ArrayList<>(); - securityReferences.add(new SecurityReference(tokenProperties.getHeader(), authorizationScopes)); + securityReferences.add(new SecurityReference(saTokenConfig.getTokenName(), authorizationScopes)); return securityReferences; } @@ -112,14 +147,14 @@ public class SwaggerConfig { // 用ApiInfoBuilder进行定制 SwaggerProperties.Contact contact = swaggerProperties.getContact(); return new ApiInfoBuilder() - // 设置标题 - .title(swaggerProperties.getTitle()) - // 描述 - .description(swaggerProperties.getDescription()) - // 作者信息 - .contact(new Contact(contact.getName(), contact.getUrl(), contact.getEmail())) - // 版本 - .version(swaggerProperties.getVersion()) - .build(); + // 设置标题 + .title(swaggerProperties.getTitle()) + // 描述 + .description(swaggerProperties.getDescription()) + // 作者信息 + .contact(new Contact(contact.getName(), contact.getUrl(), contact.getEmail())) + // 版本 + .version(swaggerProperties.getVersion()) + .build(); } } diff --git a/ruoyi/src/main/java/com/ruoyi/framework/config/ThreadPoolConfig.java b/ruoyi/src/main/java/com/ruoyi/framework/config/ThreadPoolConfig.java index 5dd2b5f64..f6e07fedc 100644 --- a/ruoyi/src/main/java/com/ruoyi/framework/config/ThreadPoolConfig.java +++ b/ruoyi/src/main/java/com/ruoyi/framework/config/ThreadPoolConfig.java @@ -13,6 +13,7 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import java.util.concurrent.RejectedExecutionHandler; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadPoolExecutor; /** * 线程池配置 @@ -44,7 +45,8 @@ public class ThreadPoolConfig { @Bean(name = "scheduledExecutorService") protected ScheduledExecutorService scheduledExecutorService() { return new ScheduledThreadPoolExecutor(threadPoolProperties.getCorePoolSize(), - new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build()) { + new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build(), + new ThreadPoolExecutor.CallerRunsPolicy()) { @Override protected void afterExecute(Runnable r, Throwable t) { super.afterExecute(r, t); diff --git a/ruoyi/src/main/java/com/ruoyi/framework/config/properties/CaptchaProperties.java b/ruoyi/src/main/java/com/ruoyi/framework/config/properties/CaptchaProperties.java index 354d8c304..1b41c66cf 100644 --- a/ruoyi/src/main/java/com/ruoyi/framework/config/properties/CaptchaProperties.java +++ b/ruoyi/src/main/java/com/ruoyi/framework/config/properties/CaptchaProperties.java @@ -16,23 +16,23 @@ import org.springframework.stereotype.Component; @ConfigurationProperties(prefix = "captcha") public class CaptchaProperties { - /** - * 验证码类型 - */ + /** + * 验证码类型 + */ private CaptchaType type; - /** - * 验证码类别 - */ + /** + * 验证码类别 + */ private CaptchaCategory category; - /** - * 数字验证码位数 - */ + /** + * 数字验证码位数 + */ private Integer numberLength; - /** - * 字符验证码长度 - */ + /** + * 字符验证码长度 + */ private Integer charLength; } diff --git a/ruoyi/src/main/java/com/ruoyi/framework/config/properties/RedissonProperties.java b/ruoyi/src/main/java/com/ruoyi/framework/config/properties/RedissonProperties.java index 4516da269..eae9e3fc8 100644 --- a/ruoyi/src/main/java/com/ruoyi/framework/config/properties/RedissonProperties.java +++ b/ruoyi/src/main/java/com/ruoyi/framework/config/properties/RedissonProperties.java @@ -20,217 +20,177 @@ import java.util.List; @ConfigurationProperties(prefix = "redisson") public class RedissonProperties { - /** - * 线程池数量,默认值 = 当前处理核数量 * 2 - */ - private int threads; + /** + * 线程池数量,默认值 = 当前处理核数量 * 2 + */ + private int threads; - /** - * Netty线程池数量,默认值 = 当前处理核数量 * 2 - */ - private int nettyThreads; + /** + * Netty线程池数量,默认值 = 当前处理核数量 * 2 + */ + private int nettyThreads; - /** - * 传输模式 - */ - private TransportMode transportMode; + /** + * 传输模式 + */ + private TransportMode transportMode; - /** - * 单机服务配置 - */ - private SingleServerConfig singleServerConfig; + /** + * 单机服务配置 + */ + private SingleServerConfig singleServerConfig; - /** - * 集群服务配置 - */ - private ClusterServersConfig clusterServersConfig; + /** + * 集群服务配置 + */ + private ClusterServersConfig clusterServersConfig; - /** - * 缓存组 - */ - private List cacheGroup; + /** + * 缓存组 + */ + private List cacheGroup; - @Data - @NoArgsConstructor - public static class SingleServerConfig { + @Data + @NoArgsConstructor + public static class SingleServerConfig { - /** - * 客户端名称 - */ - private String clientName; + /** + * 客户端名称 + */ + private String clientName; - /** - * 最小空闲连接数 - */ - private int connectionMinimumIdleSize; + /** + * 最小空闲连接数 + */ + private int connectionMinimumIdleSize; - /** - * 连接池大小 - */ - private int connectionPoolSize; + /** + * 连接池大小 + */ + private int connectionPoolSize; - /** - * 连接空闲超时,单位:毫秒 - */ - private int idleConnectionTimeout; + /** + * 连接空闲超时,单位:毫秒 + */ + private int idleConnectionTimeout; - /** - * 命令等待超时,单位:毫秒 - */ - private int timeout; + /** + * 命令等待超时,单位:毫秒 + */ + private int timeout; - /** - * 如果尝试在此限制之内发送成功,则开始启用 timeout 计时。 - */ - private int retryAttempts; + /** + * 如果尝试在此限制之内发送成功,则开始启用 timeout 计时。 + */ + private int retryAttempts; - /** - * 命令重试发送时间间隔,单位:毫秒 - */ - private int retryInterval; + /** + * 命令重试发送时间间隔,单位:毫秒 + */ + private int retryInterval; - /** - * 发布和订阅连接的最小空闲连接数 - */ - private int subscriptionConnectionMinimumIdleSize; + /** + * 发布和订阅连接池大小 + */ + private int subscriptionConnectionPoolSize; - /** - * 发布和订阅连接池大小 - */ - private int subscriptionConnectionPoolSize; + } - /** - * 单个连接最大订阅数量 - */ - private int subscriptionsPerConnection; + @Data + @NoArgsConstructor + public static class ClusterServersConfig { - /** - * DNS监测时间间隔,单位:毫秒 - */ - private int dnsMonitoringInterval; + /** + * 客户端名称 + */ + private String clientName; - } + /** + * master最小空闲连接数 + */ + private int masterConnectionMinimumIdleSize; - @Data - @NoArgsConstructor - public static class ClusterServersConfig { + /** + * master连接池大小 + */ + private int masterConnectionPoolSize; - /** - * 客户端名称 - */ - private String clientName; + /** + * slave最小空闲连接数 + */ + private int slaveConnectionMinimumIdleSize; - /** - * master最小空闲连接数 - */ - private int masterConnectionMinimumIdleSize; + /** + * slave连接池大小 + */ + private int slaveConnectionPoolSize; - /** - * master连接池大小 - */ - private int masterConnectionPoolSize; + /** + * 连接空闲超时,单位:毫秒 + */ + private int idleConnectionTimeout; - /** - * slave最小空闲连接数 - */ - private int slaveConnectionMinimumIdleSize; + /** + * ping超时 + */ + private int pingConnectionInterval; - /** - * slave连接池大小 - */ - private int slaveConnectionPoolSize; + /** + * 命令等待超时,单位:毫秒 + */ + private int timeout; - /** - * 连接空闲超时,单位:毫秒 - */ - private int idleConnectionTimeout; + /** + * 如果尝试在此限制之内发送成功,则开始启用 timeout 计时。 + */ + private int retryAttempts; - /** - * ping超时 - */ - private int pingConnectionInterval; + /** + * 命令重试发送时间间隔,单位:毫秒 + */ + private int retryInterval; - /** - * 命令等待超时,单位:毫秒 - */ - private int timeout; + /** + * 发布和订阅连接池大小 + */ + private int subscriptionConnectionPoolSize; - /** - * 如果尝试在此限制之内发送成功,则开始启用 timeout 计时。 - */ - private int retryAttempts; + /** + * 读取模式 + */ + private ReadMode readMode; - /** - * 命令重试发送时间间隔,单位:毫秒 - */ - private int retryInterval; + /** + * 订阅模式 + */ + private SubscriptionMode subscriptionMode; - /** - * 错误重试次数 - */ - private int failedSlaveReconnectionInterval; + } - /** - * 发布和订阅连接池最小空闲连接数 - */ - private int subscriptionConnectionMinimumIdleSize; + @Data + @NoArgsConstructor + public static class CacheGroup { - /** - * 发布和订阅连接池大小 - */ - private int subscriptionConnectionPoolSize; + /** + * 组id + */ + private String groupId; - /** - * 单个连接最大订阅数量 - */ - private int subscriptionsPerConnection; + /** + * 组过期时间 + */ + private long ttl; - /** - * 扫描间隔 - */ - private int scanInterval; + /** + * 组最大空闲时间 + */ + private long maxIdleTime; - /** - * DNS监测时间间隔,单位:毫秒 - */ - private int dnsMonitoringInterval; + /** + * 组最大长度 + */ + private int maxSize; - /** - * 读取模式 - */ - private ReadMode readMode; - - /** - * 订阅模式 - */ - private SubscriptionMode subscriptionMode; - - } - - @Data - @NoArgsConstructor - public static class CacheGroup { - - /** - * 组id - */ - private String groupId; - - /** - * 组过期时间 - */ - private long ttl; - - /** - * 组最大空闲时间 - */ - private long maxIdleTime; - - /** - * 组最大长度 - */ - private int maxSize; - - } + } } diff --git a/ruoyi/src/main/java/com/ruoyi/framework/config/properties/SecurityProperties.java b/ruoyi/src/main/java/com/ruoyi/framework/config/properties/SecurityProperties.java index c83ffccbe..b37418181 100644 --- a/ruoyi/src/main/java/com/ruoyi/framework/config/properties/SecurityProperties.java +++ b/ruoyi/src/main/java/com/ruoyi/framework/config/properties/SecurityProperties.java @@ -15,18 +15,9 @@ import org.springframework.stereotype.Component; public class SecurityProperties { /** - * 退出登录url + * 排除路径 */ - private String logoutUrl; + private String[] excludes; - /** - * 匿名放行路径 - */ - private String[] anonymous; - - /** - * 用户任意访问放行路径 - */ - private String[] permitAll; } diff --git a/ruoyi/src/main/java/com/ruoyi/framework/config/properties/SwaggerProperties.java b/ruoyi/src/main/java/com/ruoyi/framework/config/properties/SwaggerProperties.java index 9c4cd238c..7293e1e90 100644 --- a/ruoyi/src/main/java/com/ruoyi/framework/config/properties/SwaggerProperties.java +++ b/ruoyi/src/main/java/com/ruoyi/framework/config/properties/SwaggerProperties.java @@ -18,71 +18,75 @@ import java.util.List; public class SwaggerProperties { /** - * 验证码类型 + * 文档开关 */ private Boolean enabled; - /** - * 设置请求的统一前缀 - */ - private String pathMapping; + /** - * 验证码类别 + * 设置请求的统一前缀 + */ + private String pathMapping; + + /** + * 标头 */ private String title; + /** - * 数字验证码位数 + * 描述 */ private String description; + /** - * 字符验证码长度 + * 项目版本 */ private String version; - /** - * 联系方式 - */ + /** + * 联系方式 + */ private Contact contact; - /** - * 组配置 - */ - private List groups; + /** + * 组配置 + */ + private List groups; @Data - @NoArgsConstructor - public static class Contact { + @NoArgsConstructor + public static class Contact { - /** - * 联系人 - */ - private String name; + /** + * 联系人 + */ + private String name; - /** - * 联系人url - */ - private String url; + /** + * 联系人url + */ + private String url; - /** - * 联系人email - */ - private String email; + /** + * 联系人email + */ + private String email; - } + } - @Data - @NoArgsConstructor - public static class Groups { + @Data + @NoArgsConstructor + public static class Groups { - /** - * 组名 - */ - private String name; + /** + * 组名 + */ + private String name; - /** - * 基础包路径 - */ - private String basePackage; + /** + * 基础包路径 + */ + private String basePackage; - } + } } diff --git a/ruoyi/src/main/java/com/ruoyi/framework/handler/CreateAndUpdateMetaObjectHandler.java b/ruoyi/src/main/java/com/ruoyi/framework/handler/CreateAndUpdateMetaObjectHandler.java index 7cf64c46b..6d7c977de 100644 --- a/ruoyi/src/main/java/com/ruoyi/framework/handler/CreateAndUpdateMetaObjectHandler.java +++ b/ruoyi/src/main/java/com/ruoyi/framework/handler/CreateAndUpdateMetaObjectHandler.java @@ -6,7 +6,7 @@ import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import com.ruoyi.common.core.domain.BaseEntity; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.exception.ServiceException; -import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.helper.LoginHelper; import com.ruoyi.common.utils.StringUtils; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.reflection.MetaObject; @@ -22,43 +22,33 @@ import java.util.Date; @Slf4j public class CreateAndUpdateMetaObjectHandler implements MetaObjectHandler { - @Override - public void insertFill(MetaObject metaObject) { - 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(); - // 当前已登录 且 创建人为空 则填充 - if (StringUtils.isNotBlank(username) - && StringUtils.isBlank(baseEntity.getCreateBy())) { - baseEntity.setCreateBy(username); - } - // 当前已登录 且 更新人为空 则填充 - if (StringUtils.isNotBlank(username) - && StringUtils.isBlank(baseEntity.getUpdateBy())) { - baseEntity.setUpdateBy(username); - } - } - } catch (Exception e) { - throw new ServiceException("自动注入异常 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED); - } - } + @Override + public void insertFill(MetaObject metaObject) { + try { + if (ObjectUtil.isNotNull(metaObject) && metaObject.getOriginalObject() instanceof BaseEntity) { + BaseEntity baseEntity = (BaseEntity) metaObject.getOriginalObject(); + 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(); + // 当前已登录 且 创建人为空 则填充 + baseEntity.setCreateBy(username); + // 当前已登录 且 更新人为空 则填充 + baseEntity.setUpdateBy(username); + } + } catch (Exception e) { + throw new ServiceException("自动注入异常 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED); + } + } - @Override - public void updateFill(MetaObject metaObject) { - try { - if (ObjectUtil.isNotNull(metaObject) && metaObject.getOriginalObject() instanceof BaseEntity) { - BaseEntity baseEntity = (BaseEntity) metaObject.getOriginalObject(); - Date current = new Date(); + @Override + public void updateFill(MetaObject metaObject) { + try { + if (ObjectUtil.isNotNull(metaObject) && metaObject.getOriginalObject() instanceof BaseEntity) { + BaseEntity baseEntity = (BaseEntity) metaObject.getOriginalObject(); + Date current = new Date(); // 更新时间填充(不管为不为空) baseEntity.setUpdateTime(current); String username = getLoginUsername(); @@ -66,24 +56,24 @@ public class CreateAndUpdateMetaObjectHandler implements MetaObjectHandler { if (StringUtils.isNotBlank(username)) { baseEntity.setUpdateBy(username); } - } - } catch (Exception e) { - throw new ServiceException("自动注入异常 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED); - } - } + } + } catch (Exception e) { + throw new ServiceException("自动注入异常 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED); + } + } - /** - * 获取登录用户名 - */ - private String getLoginUsername() { - LoginUser loginUser; - try { - loginUser = SecurityUtils.getLoginUser(); - } catch (Exception e) { - log.warn("自动注入警告 => 用户未登录"); - return null; - } - return loginUser.getUsername(); - } + /** + * 获取登录用户名 + */ + private String getLoginUsername() { + LoginUser loginUser; + try { + loginUser = LoginHelper.getLoginUser(); + } catch (Exception e) { + log.warn("自动注入警告 => 用户未登录"); + return null; + } + return loginUser.getUsername(); + } } diff --git a/ruoyi/src/main/java/com/ruoyi/framework/handler/PlusDataPermissionHandler.java b/ruoyi/src/main/java/com/ruoyi/framework/handler/PlusDataPermissionHandler.java index d5f4f5832..f2a60a415 100644 --- a/ruoyi/src/main/java/com/ruoyi/framework/handler/PlusDataPermissionHandler.java +++ b/ruoyi/src/main/java/com/ruoyi/framework/handler/PlusDataPermissionHandler.java @@ -7,13 +7,12 @@ 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; -import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.helper.LoginHelper; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.spring.SpringUtils; import lombok.extern.slf4j.Slf4j; @@ -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(SecurityUtils.getUserId()); + currentUser = LoginHelper.getLoginUser(); DataPermissionHelper.setVariable("user", currentUser); } // 如果是超级管理员,则不过滤数据 - if (ObjectUtil.isNull(currentUser) || currentUser.isAdmin()) { + if (ObjectUtil.isNull(currentUser) || LoginHelper.isAdmin(currentUser.getUserId())) { 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/src/main/java/com/ruoyi/framework/jackson/BigNumberSerializer.java b/ruoyi/src/main/java/com/ruoyi/framework/jackson/BigNumberSerializer.java index 1781b94be..a4aee1552 100644 --- a/ruoyi/src/main/java/com/ruoyi/framework/jackson/BigNumberSerializer.java +++ b/ruoyi/src/main/java/com/ruoyi/framework/jackson/BigNumberSerializer.java @@ -15,28 +15,28 @@ import java.io.IOException; @JacksonStdImpl public class BigNumberSerializer extends NumberSerializer { - /** - * 根据 JS Number.MAX_SAFE_INTEGER 与 Number.MIN_SAFE_INTEGER 得来 - */ - private static final long MAX_SAFE_INTEGER = 9007199254740991L; - private static final long MIN_SAFE_INTEGER = -9007199254740991L; + /** + * 根据 JS Number.MAX_SAFE_INTEGER 与 Number.MIN_SAFE_INTEGER 得来 + */ + private static final long MAX_SAFE_INTEGER = 9007199254740991L; + private static final long MIN_SAFE_INTEGER = -9007199254740991L; - /** - * 提供实例 - */ - public static final BigNumberSerializer INSTANCE = new BigNumberSerializer(Number.class); + /** + * 提供实例 + */ + public static final BigNumberSerializer INSTANCE = new BigNumberSerializer(Number.class); - public BigNumberSerializer(Class rawType) { - super(rawType); - } + public BigNumberSerializer(Class rawType) { + super(rawType); + } - @Override - public void serialize(Number value, JsonGenerator gen, SerializerProvider provider) throws IOException { - // 超出范围 序列化位字符串 - if (value.longValue() > MIN_SAFE_INTEGER && value.longValue() < MAX_SAFE_INTEGER) { - super.serialize(value, gen, provider); - } else { - gen.writeString(value.toString()); - } - } + @Override + public void serialize(Number value, JsonGenerator gen, SerializerProvider provider) throws IOException { + // 超出范围 序列化位字符串 + if (value.longValue() > MIN_SAFE_INTEGER && value.longValue() < MAX_SAFE_INTEGER) { + super.serialize(value, gen, provider); + } else { + gen.writeString(value.toString()); + } + } } diff --git a/ruoyi/src/main/java/com/ruoyi/framework/listener/UserActionListener.java b/ruoyi/src/main/java/com/ruoyi/framework/listener/UserActionListener.java new file mode 100644 index 000000000..c4252b448 --- /dev/null +++ b/ruoyi/src/main/java/com/ruoyi/framework/listener/UserActionListener.java @@ -0,0 +1,118 @@ +package com.ruoyi.framework.listener; + +import cn.dev33.satoken.config.SaTokenConfig; +import cn.dev33.satoken.listener.SaTokenListener; +import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.StpUtil; +import cn.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.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 lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.concurrent.TimeUnit; + +/** + * 用户行为 侦听器的实现 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Component +@Slf4j +public class UserActionListener implements SaTokenListener { + + private final SaTokenConfig tokenConfig; + + /** + * 每次登录时触发 + */ + @Override + public void doLogin(String loginType, Object loginId, SaLoginModel loginModel) { + UserType userType = UserType.getUserType(loginId.toString()); + if (userType == UserType.SYS_USER) { + UserAgent userAgent = UserAgentUtil.parse(ServletUtils.getRequest().getHeader("User-Agent")); + String ip = ServletUtils.getClientIP(); + 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端 自行根据业务编写 + } + } + + /** + * 每次注销时触发 + */ + @Override + public void doLogout(String loginType, Object loginId, String tokenValue) { + RedisUtils.deleteObject(Constants.ONLINE_TOKEN_KEY + tokenValue); + log.info("user doLogout, useId:{}, token:{}", loginId, tokenValue); + } + + /** + * 每次被踢下线时触发 + */ + @Override + public void doKickout(String loginType, Object loginId, String tokenValue) { + RedisUtils.deleteObject(Constants.ONLINE_TOKEN_KEY + tokenValue); + log.info("user doLogoutByLoginId, useId:{}, token:{}", loginId, tokenValue); + } + + /** + * 每次被顶下线时触发 + */ + @Override + public void doReplaced(String loginType, Object loginId, String tokenValue) { + RedisUtils.deleteObject(Constants.ONLINE_TOKEN_KEY + tokenValue); + log.info("user doReplaced, useId:{}, token:{}", loginId, tokenValue); + } + + /** + * 每次被封禁时触发 + */ + @Override + public void doDisable(String loginType, Object loginId, long disableTime) { + } + + /** + * 每次被解封时触发 + */ + @Override + public void doUntieDisable(String loginType, Object loginId) { + } + + /** + * 每次创建Session时触发 + */ + @Override + public void doCreateSession(String id) { + } + + /** + * 每次注销Session时触发 + */ + @Override + public void doLogoutSession(String id) { + } + + +} diff --git a/ruoyi/src/main/java/com/ruoyi/framework/manager/ShutdownManager.java b/ruoyi/src/main/java/com/ruoyi/framework/manager/ShutdownManager.java index ef77a219a..9d27874e9 100644 --- a/ruoyi/src/main/java/com/ruoyi/framework/manager/ShutdownManager.java +++ b/ruoyi/src/main/java/com/ruoyi/framework/manager/ShutdownManager.java @@ -18,24 +18,24 @@ import java.util.concurrent.ScheduledExecutorService; @Component public class ShutdownManager { - @Autowired - @Qualifier("scheduledExecutorService") - private ScheduledExecutorService scheduledExecutorService; + @Autowired + @Qualifier("scheduledExecutorService") + private ScheduledExecutorService scheduledExecutorService; - @PreDestroy - public void destroy() { - shutdownAsyncManager(); - } + @PreDestroy + public void destroy() { + shutdownAsyncManager(); + } - /** - * 停止异步执行任务 - */ - private void shutdownAsyncManager() { - try { - log.info("====关闭后台任务任务线程池===="); - Threads.shutdownAndAwaitTermination(scheduledExecutorService); - } catch (Exception e) { - log.error(e.getMessage(), e); - } - } + /** + * 停止异步执行任务 + */ + private void shutdownAsyncManager() { + try { + log.info("====关闭后台任务任务线程池===="); + Threads.shutdownAndAwaitTermination(scheduledExecutorService); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + } } diff --git a/ruoyi/src/main/java/com/ruoyi/framework/satoken/dao/PlusSaTokenDao.java b/ruoyi/src/main/java/com/ruoyi/framework/satoken/dao/PlusSaTokenDao.java new file mode 100644 index 000000000..f78e81415 --- /dev/null +++ b/ruoyi/src/main/java/com/ruoyi/framework/satoken/dao/PlusSaTokenDao.java @@ -0,0 +1,177 @@ +package com.ruoyi.framework.satoken.dao; + +import cn.dev33.satoken.dao.SaTokenDao; +import cn.dev33.satoken.util.SaFoxUtil; +import com.ruoyi.common.utils.redis.RedisUtils; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * Sa-Token持久层接口(使用框架自带RedisUtils实现 协议统一) + * + * @author Lion Li + */ +@Component +public class PlusSaTokenDao implements SaTokenDao { + + /** + * 获取Value,如无返空 + */ + @Override + public String get(String key) { + return RedisUtils.getCacheObject(key); + } + + /** + * 写入Value,并设定存活时间 (单位: 秒) + */ + @Override + public void set(String key, String value, long timeout) { + if (timeout == 0 || timeout <= SaTokenDao.NOT_VALUE_EXPIRE) { + return; + } + // 判断是否为永不过期 + if (timeout == SaTokenDao.NEVER_EXPIRE) { + RedisUtils.setCacheObject(key, value); + } else { + RedisUtils.setCacheObject(key, value, timeout, TimeUnit.SECONDS); + } + } + + /** + * 修修改指定key-value键值对 (过期时间不变) + */ + @Override + public void update(String key, String value) { + long expire = getTimeout(key); + // -2 = 无此键 + if (expire == SaTokenDao.NOT_VALUE_EXPIRE) { + return; + } + this.set(key, value, expire); + } + + /** + * 删除Value + */ + @Override + public void delete(String key) { + RedisUtils.deleteObject(key); + } + + /** + * 获取Value的剩余存活时间 (单位: 秒) + */ + @Override + public long getTimeout(String key) { + return RedisUtils.getTimeToLive(key) / 1000; + } + + /** + * 修改Value的剩余存活时间 (单位: 秒) + */ + @Override + public void updateTimeout(String key, long timeout) { + // 判断是否想要设置为永久 + if (timeout == SaTokenDao.NEVER_EXPIRE) { + long expire = getTimeout(key); + if (expire == SaTokenDao.NEVER_EXPIRE) { + // 如果其已经被设置为永久,则不作任何处理 + } else { + // 如果尚未被设置为永久,那么再次set一次 + this.set(key, this.get(key), timeout); + } + return; + } + RedisUtils.expire(key, timeout, TimeUnit.SECONDS); + } + + + /** + * 获取Object,如无返空 + */ + @Override + public Object getObject(String key) { + return RedisUtils.getCacheObject(key); + } + + /** + * 写入Object,并设定存活时间 (单位: 秒) + */ + @Override + public void setObject(String key, Object object, long timeout) { + if (timeout == 0 || timeout <= SaTokenDao.NOT_VALUE_EXPIRE) { + return; + } + // 判断是否为永不过期 + if (timeout == SaTokenDao.NEVER_EXPIRE) { + RedisUtils.setCacheObject(key, object); + } else { + RedisUtils.setCacheObject(key, object, timeout, TimeUnit.SECONDS); + } + } + + /** + * 更新Object (过期时间不变) + */ + @Override + public void updateObject(String key, Object object) { + long expire = getObjectTimeout(key); + // -2 = 无此键 + if (expire == SaTokenDao.NOT_VALUE_EXPIRE) { + return; + } + this.setObject(key, object, expire); + } + + /** + * 删除Object + */ + @Override + public void deleteObject(String key) { + RedisUtils.deleteObject(key); + } + + /** + * 获取Object的剩余存活时间 (单位: 秒) + */ + @Override + public long getObjectTimeout(String key) { + return RedisUtils.getTimeToLive(key) / 1000; + } + + /** + * 修改Object的剩余存活时间 (单位: 秒) + */ + @Override + public void updateObjectTimeout(String key, long timeout) { + // 判断是否想要设置为永久 + if (timeout == SaTokenDao.NEVER_EXPIRE) { + long expire = getObjectTimeout(key); + if (expire == SaTokenDao.NEVER_EXPIRE) { + // 如果其已经被设置为永久,则不作任何处理 + } else { + // 如果尚未被设置为永久,那么再次set一次 + this.setObject(key, this.getObject(key), timeout); + } + return; + } + RedisUtils.expire(key, timeout, TimeUnit.SECONDS); + } + + + /** + * 搜索数据 + */ + @Override + public List searchData(String prefix, String keyword, int start, int size) { + Collection keys = RedisUtils.keys(prefix + "*" + keyword + "*"); + List list = new ArrayList<>(keys); + return SaFoxUtil.searchList(list, start, size); + } + +} diff --git a/ruoyi/src/main/java/com/ruoyi/framework/satoken/service/SaInterfaceImpl.java b/ruoyi/src/main/java/com/ruoyi/framework/satoken/service/SaInterfaceImpl.java new file mode 100644 index 000000000..8e97d0578 --- /dev/null +++ b/ruoyi/src/main/java/com/ruoyi/framework/satoken/service/SaInterfaceImpl.java @@ -0,0 +1,38 @@ +package com.ruoyi.framework.satoken.service; + +import cn.dev33.satoken.stp.StpInterface; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.enums.UserType; +import com.ruoyi.common.helper.LoginHelper; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +@Component +public class SaInterfaceImpl implements StpInterface { + + @Override + public List getPermissionList(Object loginId, String loginType) { + LoginUser loginUser = LoginHelper.getLoginUser(); + UserType userType = UserType.getUserType(loginUser.getUserType()); + if (userType == UserType.SYS_USER) { + return new ArrayList<>(loginUser.getMenuPermission()); + } else if (userType == UserType.APP_USER) { + // app端权限返回 自行根据业务编写 + } + return new ArrayList<>(); + } + + @Override + public List getRoleList(Object loginId, String loginType) { + LoginUser loginUser = LoginHelper.getLoginUser(); + UserType userType = UserType.getUserType(loginUser.getUserType()); + if (userType == UserType.SYS_USER) { + return new ArrayList<>(loginUser.getRolePermission()); + } else if (userType == UserType.APP_USER) { + // app端权限返回 自行根据业务编写 + } + return new ArrayList<>(); + } +} diff --git a/ruoyi/src/main/java/com/ruoyi/framework/security/filter/JwtAuthenticationTokenFilter.java b/ruoyi/src/main/java/com/ruoyi/framework/security/filter/JwtAuthenticationTokenFilter.java deleted file mode 100644 index 4ebb4aaea..000000000 --- a/ruoyi/src/main/java/com/ruoyi/framework/security/filter/JwtAuthenticationTokenFilter.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.ruoyi.framework.security.filter; - -import com.ruoyi.common.core.domain.model.LoginUser; -import com.ruoyi.common.core.service.TokenService; -import com.ruoyi.common.utils.SecurityUtils; -import com.ruoyi.common.utils.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; -import org.springframework.stereotype.Component; -import org.springframework.web.filter.OncePerRequestFilter; - -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; - -/** - * token过滤器 验证token有效性 - * - * @author ruoyi - */ -@Component -public class JwtAuthenticationTokenFilter extends OncePerRequestFilter { - - @Autowired - private TokenService tokenService; - - @Override - protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) - throws ServletException, IOException { - LoginUser loginUser = tokenService.getLoginUser(request); - if (StringUtils.isNotNull(loginUser) && StringUtils.isNull(SecurityUtils.getAuthentication())) { - tokenService.verifyToken(loginUser); - UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities()); - authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); - SecurityContextHolder.getContext().setAuthentication(authenticationToken); - } - chain.doFilter(request, response); - } -} diff --git a/ruoyi/src/main/java/com/ruoyi/framework/security/handle/AuthenticationEntryPointImpl.java b/ruoyi/src/main/java/com/ruoyi/framework/security/handle/AuthenticationEntryPointImpl.java deleted file mode 100644 index 35b0f921c..000000000 --- a/ruoyi/src/main/java/com/ruoyi/framework/security/handle/AuthenticationEntryPointImpl.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.ruoyi.framework.security.handle; - -import cn.hutool.http.HttpStatus; -import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.common.utils.JsonUtils; -import com.ruoyi.common.utils.ServletUtils; -import com.ruoyi.common.utils.StringUtils; -import org.springframework.security.core.AuthenticationException; -import org.springframework.security.web.AuthenticationEntryPoint; -import org.springframework.stereotype.Component; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.io.Serializable; - -/** - * 认证失败处理类 返回未授权 - * - * @author ruoyi - */ -@Component -public class AuthenticationEntryPointImpl implements AuthenticationEntryPoint, Serializable { - private static final long serialVersionUID = -8970718410437077606L; - - @Override - public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException e) - throws IOException { - int code = HttpStatus.HTTP_UNAUTHORIZED; - String msg = StringUtils.format("请求访问:{},认证失败,无法访问系统资源", request.getRequestURI()); - ServletUtils.renderString(response, JsonUtils.toJsonString(AjaxResult.error(code, msg))); - } -} diff --git a/ruoyi/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java b/ruoyi/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java deleted file mode 100644 index 76d8090c8..000000000 --- a/ruoyi/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.ruoyi.framework.security.handle; - -import cn.hutool.http.HttpStatus; -import com.ruoyi.common.constant.Constants; -import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.common.core.domain.model.LoginUser; -import com.ruoyi.common.core.service.LogininforService; -import com.ruoyi.common.core.service.TokenService; -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 org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.core.Authentication; -import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; - -/** - * 自定义退出处理类 返回成功 - * - * @author ruoyi - */ -@Configuration -public class LogoutSuccessHandlerImpl implements LogoutSuccessHandler { - - @Autowired - private TokenService tokenService; - - @Autowired - private LogininforService asyncService; - - /** - * 退出处理 - */ - @Override - public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) - throws IOException, ServletException { - LoginUser loginUser = tokenService.getLoginUser(request); - String message = MessageUtils.message("user.logout.success"); - if (StringUtils.isNotNull(loginUser)) { - String userName = loginUser.getUsername(); - // 删除用户缓存记录 - tokenService.delLoginUser(loginUser.getToken()); - // 记录用户退出日志 - asyncService.recordLogininfor(userName, Constants.LOGOUT, message, request); - } - ServletUtils.renderString(response, JsonUtils.toJsonString(AjaxResult.error(HttpStatus.HTTP_OK, message))); - } - -} diff --git a/ruoyi/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java b/ruoyi/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java index 4c642c2d7..90b265e27 100644 --- a/ruoyi/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java +++ b/ruoyi/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java @@ -1,13 +1,15 @@ package com.ruoyi.framework.web.exception; +import cn.dev33.satoken.exception.NotLoginException; +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.security.access.AccessDeniedException; import org.springframework.validation.BindException; import org.springframework.web.HttpRequestMethodNotSupportedException; import org.springframework.web.bind.MethodArgumentNotValidException; @@ -29,95 +31,115 @@ import java.util.stream.Collectors; public class GlobalExceptionHandler { /** - * 权限校验异常 + * 权限码异常 */ - @ExceptionHandler(AccessDeniedException.class) - public AjaxResult handleAccessDeniedException(AccessDeniedException e, HttpServletRequest request) { + @ExceptionHandler(NotPermissionException.class) + 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 R handleNotRoleException(NotRoleException e, HttpServletRequest request) { + String requestURI = request.getRequestURI(); + log.error("请求地址'{}',角色权限校验失败'{}'", requestURI, e.getMessage()); + return R.fail(HttpStatus.HTTP_FORBIDDEN, "没有访问权限,请联系管理员授权"); + } + + /** + * 认证失败 + */ + @ExceptionHandler(NotLoginException.class) + public R handleNotLoginException(NotLoginException e, HttpServletRequest request) { + String requestURI = request.getRequestURI(); + log.error("请求地址'{}',认证失败'{}',无法访问系统资源", requestURI, e.getMessage()); + return R.fail(HttpStatus.HTTP_UNAUTHORIZED, "认证失败,无法访问系统资源"); } /** * 请求方式不支持 */ @ExceptionHandler(HttpRequestMethodNotSupportedException.class) - public AjaxResult handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException e, - HttpServletRequest request) { + 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 StringUtils.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/src/main/java/com/ruoyi/framework/web/service/PermissionService.java b/ruoyi/src/main/java/com/ruoyi/framework/web/service/PermissionService.java deleted file mode 100644 index 0e97b92f0..000000000 --- a/ruoyi/src/main/java/com/ruoyi/framework/web/service/PermissionService.java +++ /dev/null @@ -1,156 +0,0 @@ -package com.ruoyi.framework.web.service; - -import com.ruoyi.common.core.domain.model.LoginUser; -import com.ruoyi.common.utils.SecurityUtils; -import com.ruoyi.common.utils.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.CollectionUtils; - -import java.util.Set; - -/** - * RuoYi首创 自定义权限实现,ss取自SpringSecurity首字母 - * - * @author ruoyi - */ -@Service("ss") -public class PermissionService { - /** - * 所有权限标识 - */ - private static final String ALL_PERMISSION = "*:*:*"; - - /** - * 管理员角色权限标识 - */ - private static final String SUPER_ADMIN = "admin"; - - private static final String ROLE_DELIMETER = ","; - - private static final String PERMISSION_DELIMETER = ","; - - /** - * 验证用户是否具备某权限 - * - * @param permission 权限字符串 - * @return 用户是否具备某权限 - */ - public boolean hasPermi(String permission) { - if (StringUtils.isEmpty(permission)) { - return false; - } - LoginUser loginUser = SecurityUtils.getLoginUser(); - if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getMenuPermissions())) { - return false; - } - return hasPermissions(loginUser.getMenuPermissions(), permission); - } - - /** - * 验证用户是否不具备某权限,与 hasPermi逻辑相反 - * - * @param permission 权限字符串 - * @return 用户是否不具备某权限 - */ - public boolean lacksPermi(String permission) { - return hasPermi(permission) != true; - } - - /** - * 验证用户是否具有以下任意一个权限 - * - * @param permissions 以 PERMISSION_NAMES_DELIMETER 为分隔符的权限列表 - * @return 用户是否具有以下任意一个权限 - */ - public boolean hasAnyPermi(String permissions) { - if (StringUtils.isEmpty(permissions)) { - return false; - } - LoginUser loginUser = SecurityUtils.getLoginUser(); - if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getMenuPermissions())) { - return false; - } - Set authorities = loginUser.getMenuPermissions(); - for (String permission : permissions.split(PERMISSION_DELIMETER)) { - if (permission != null && hasPermissions(authorities, permission)) { - return true; - } - } - return false; - } - - /** - * 判断用户是否拥有某个角色 - * - * @param role 角色字符串 - * @return 用户是否具备某角色 - */ - public boolean hasRole(String role) { - if (StringUtils.isEmpty(role)) { - return false; - } - LoginUser loginUser = SecurityUtils.getLoginUser(); - if (StringUtils.isNull(loginUser)) { - return false; - } - Set rolePermissions = loginUser.getRolePermissions(); - if (CollectionUtils.isEmpty(rolePermissions)) { - return false; - } - for (String roleKey : rolePermissions) { - if (SUPER_ADMIN.equals(roleKey) || roleKey.equals(StringUtils.trim(role))) { - return true; - } - } - return false; - } - - /** - * 验证用户是否不具备某角色,与 isRole逻辑相反。 - * - * @param role 角色名称 - * @return 用户是否不具备某角色 - */ - public boolean lacksRole(String role) { - return hasRole(role) != true; - } - - /** - * 验证用户是否具有以下任意一个角色 - * - * @param roles 以 ROLE_NAMES_DELIMETER 为分隔符的角色列表 - * @return 用户是否具有以下任意一个角色 - */ - public boolean hasAnyRoles(String roles) { - if (StringUtils.isEmpty(roles)) { - return false; - } - LoginUser loginUser = SecurityUtils.getLoginUser(); - if (StringUtils.isNull(loginUser)) { - return false; - } - Set rolePermissions = loginUser.getRolePermissions(); - if (CollectionUtils.isEmpty(rolePermissions)) { - return false; - } - for (String role : roles.split(ROLE_DELIMETER)) { - for (String roleKey : rolePermissions) { - if (SUPER_ADMIN.equals(roleKey) || roleKey.equals(StringUtils.trim(role))) { - return true; - } - } - } - return false; - } - - /** - * 判断是否包含权限 - * - * @param permissions 权限列表 - * @param permission 权限字符串 - * @return 用户是否具备某权限 - */ - private boolean hasPermissions(Set permissions, String permission) { - return permissions.contains(ALL_PERMISSION) || permissions.contains(StringUtils.trim(permission)); - } -} diff --git a/ruoyi/src/main/java/com/ruoyi/generator/controller/GenController.java b/ruoyi/src/main/java/com/ruoyi/generator/controller/GenController.java index 685a5bbc0..09bf1aeb1 100644 --- a/ruoyi/src/main/java/com/ruoyi/generator/controller/GenController.java +++ b/ruoyi/src/main/java/com/ruoyi/generator/controller/GenController.java @@ -1,10 +1,11 @@ package com.ruoyi.generator.controller; +import cn.dev33.satoken.annotation.SaCheckPermission; 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.R; import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; @@ -15,8 +16,6 @@ import com.ruoyi.generator.service.IGenTableService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -33,7 +32,7 @@ import java.util.Map; */ @Validated @Api(value = "代码生成", tags = {"代码生成管理"}) -@RequiredArgsConstructor(onConstructor_ = @Autowired) +@RequiredArgsConstructor @RestController @RequestMapping("/tool/gen") public class GenController extends BaseController { @@ -45,7 +44,7 @@ public class GenController extends BaseController { * 查询代码生成列表 */ @ApiOperation("查询代码生成列表") - @PreAuthorize("@ss.hasPermi('tool:gen:list')") + @SaCheckPermission("tool:gen:list") @GetMapping("/list") public TableDataInfo genList(GenTable genTable, PageQuery pageQuery) { return genTableService.selectPageGenTableList(genTable, pageQuery); @@ -55,9 +54,9 @@ public class GenController extends BaseController { * 修改代码生成业务 */ @ApiOperation("修改代码生成业务") - @PreAuthorize("@ss.hasPermi('tool:gen:query')") + @SaCheckPermission("tool:gen:query") @GetMapping(value = "/{talbleId}") - public AjaxResult> getInfo(@PathVariable Long talbleId) { + public R> getInfo(@PathVariable Long talbleId) { GenTable table = genTableService.selectGenTableById(talbleId); List tables = genTableService.selectGenTableAll(); List list = genTableColumnService.selectGenTableColumnListByTableId(talbleId); @@ -65,14 +64,14 @@ public class GenController extends BaseController { map.put("info", table); map.put("rows", list); map.put("tables", tables); - return AjaxResult.success(map); + return R.ok(map); } /** * 查询数据库列表 */ @ApiOperation("查询数据库列表") - @PreAuthorize("@ss.hasPermi('tool:gen:list')") + @SaCheckPermission("tool:gen:list") @GetMapping("/db/list") public TableDataInfo dataList(GenTable genTable, PageQuery pageQuery) { return genTableService.selectPageDbTableList(genTable, pageQuery); @@ -82,7 +81,7 @@ public class GenController extends BaseController { * 查询数据表字段列表 */ @ApiOperation("查询数据表字段列表") - @PreAuthorize("@ss.hasPermi('tool:gen:list')") + @SaCheckPermission("tool:gen:list") @GetMapping(value = "/column/{talbleId}") public TableDataInfo columnList(Long tableId) { TableDataInfo dataInfo = new TableDataInfo<>(); @@ -96,58 +95,58 @@ public class GenController extends BaseController { * 导入表结构(保存) */ @ApiOperation("导入表结构(保存)") - @PreAuthorize("@ss.hasPermi('tool:gen:import')") + @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(); } /** * 修改保存代码生成业务 */ @ApiOperation("修改保存代码生成业务") - @PreAuthorize("@ss.hasPermi('tool:gen:edit')") + @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(); } /** * 删除代码生成 */ @ApiOperation("删除代码生成") - @PreAuthorize("@ss.hasPermi('tool:gen:remove')") + @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(); } /** * 预览代码 */ @ApiOperation("预览代码") - @PreAuthorize("@ss.hasPermi('tool:gen:preview')") + @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); } /** * 生成代码(下载方式) */ @ApiOperation("生成代码(下载方式)") - @PreAuthorize("@ss.hasPermi('tool:gen:code')") + @SaCheckPermission("tool:gen:code") @Log(title = "代码生成", businessType = BusinessType.GENCODE) @GetMapping("/download/{tableName}") public void download(HttpServletResponse response, @PathVariable("tableName") String tableName) throws IOException { @@ -159,31 +158,31 @@ public class GenController extends BaseController { * 生成代码(自定义路径) */ @ApiOperation("生成代码(自定义路径)") - @PreAuthorize("@ss.hasPermi('tool:gen:code')") + @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(); } /** * 同步数据库 */ @ApiOperation("同步数据库") - @PreAuthorize("@ss.hasPermi('tool:gen:edit')") + @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(); } /** * 批量生成代码 */ @ApiOperation("批量生成代码") - @PreAuthorize("@ss.hasPermi('tool:gen:code')") + @SaCheckPermission("tool:gen:code") @Log(title = "代码生成", businessType = BusinessType.GENCODE) @GetMapping("/batchGenCode") public void batchGenCode(HttpServletResponse response, String tables) throws IOException { diff --git a/ruoyi/src/main/java/com/ruoyi/generator/domain/GenTable.java b/ruoyi/src/main/java/com/ruoyi/generator/domain/GenTable.java index 252f32cb6..965c9f34c 100644 --- a/ruoyi/src/main/java/com/ruoyi/generator/domain/GenTable.java +++ b/ruoyi/src/main/java/com/ruoyi/generator/domain/GenTable.java @@ -8,7 +8,6 @@ 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 +22,6 @@ import java.util.List; @Data @EqualsAndHashCode(callSuper = true) -@Accessors(chain = true) @TableName("gen_table") public class GenTable extends BaseEntity { @@ -196,7 +194,7 @@ public class GenTable extends BaseEntity { public static boolean isSuperColumn(String tplCategory, String javaField) { if (isTree(tplCategory)) { return StringUtils.equalsAnyIgnoreCase(javaField, - ArrayUtils.addAll(GenConstants.TREE_ENTITY, GenConstants.BASE_ENTITY)); + ArrayUtils.addAll(GenConstants.TREE_ENTITY, GenConstants.BASE_ENTITY)); } return StringUtils.equalsAnyIgnoreCase(javaField, GenConstants.BASE_ENTITY); } diff --git a/ruoyi/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java b/ruoyi/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java index 8c08d543c..763acd74c 100644 --- a/ruoyi/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java +++ b/ruoyi/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java @@ -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 { @@ -190,10 +189,10 @@ public class GenTableColumn extends BaseEntity { public static boolean isSuperColumn(String javaField) { return StringUtils.equalsAnyIgnoreCase(javaField, - // BaseEntity - "createBy", "createTime", "updateBy", "updateTime", - // TreeEntity - "parentName", "parentId"); + // BaseEntity + "createBy", "createTime", "updateBy", "updateTime", + // TreeEntity + "parentName", "parentId"); } public boolean isUsableColumn() { diff --git a/ruoyi/src/main/java/com/ruoyi/generator/mapper/GenTableColumnMapper.java b/ruoyi/src/main/java/com/ruoyi/generator/mapper/GenTableColumnMapper.java index d81a45adc..93578f2e9 100644 --- a/ruoyi/src/main/java/com/ruoyi/generator/mapper/GenTableColumnMapper.java +++ b/ruoyi/src/main/java/com/ruoyi/generator/mapper/GenTableColumnMapper.java @@ -1,7 +1,7 @@ package com.ruoyi.generator.mapper; import com.baomidou.mybatisplus.annotation.InterceptorIgnore; -import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus; +import com.ruoyi.common.core.mapper.BaseMapperPlus; import com.ruoyi.generator.domain.GenTableColumn; import java.util.List; @@ -12,7 +12,7 @@ import java.util.List; * @author Lion Li */ @InterceptorIgnore(dataPermission = "true") -public interface GenTableColumnMapper extends BaseMapperPlus { +public interface GenTableColumnMapper extends BaseMapperPlus { /** * 根据表名称查询列信息 * diff --git a/ruoyi/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java b/ruoyi/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java index 8ea66a2ef..cbb92fdc4 100644 --- a/ruoyi/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java +++ b/ruoyi/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java @@ -2,7 +2,7 @@ package com.ruoyi.generator.mapper; import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus; +import com.ruoyi.common.core.mapper.BaseMapperPlus; import com.ruoyi.generator.domain.GenTable; import org.apache.ibatis.annotations.Param; @@ -14,7 +14,7 @@ import java.util.List; * @author Lion Li */ @InterceptorIgnore(dataPermission = "true") -public interface GenTableMapper extends BaseMapperPlus { +public interface GenTableMapper extends BaseMapperPlus { Page selectPageGenTableList(@Param("page") Page page, @Param("genTable") GenTable genTable); diff --git a/ruoyi/src/main/java/com/ruoyi/generator/service/GenTableColumnServiceImpl.java b/ruoyi/src/main/java/com/ruoyi/generator/service/GenTableColumnServiceImpl.java index cd4d87547..78260aa78 100644 --- a/ruoyi/src/main/java/com/ruoyi/generator/service/GenTableColumnServiceImpl.java +++ b/ruoyi/src/main/java/com/ruoyi/generator/service/GenTableColumnServiceImpl.java @@ -1,9 +1,9 @@ package com.ruoyi.generator.service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.generator.domain.GenTableColumn; import com.ruoyi.generator.mapper.GenTableColumnMapper; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.Arrays; @@ -14,8 +14,11 @@ import java.util.List; * * @author Lion Li */ +@RequiredArgsConstructor @Service -public class GenTableColumnServiceImpl extends ServicePlusImpl implements IGenTableColumnService { +public class GenTableColumnServiceImpl implements IGenTableColumnService { + + private final GenTableColumnMapper baseMapper; /** * 查询业务字段列表 @@ -25,9 +28,9 @@ public class GenTableColumnServiceImpl extends ServicePlusImpl selectGenTableColumnListByTableId(Long tableId) { - return list(new LambdaQueryWrapper() - .eq(GenTableColumn::getTableId, tableId) - .orderByAsc(GenTableColumn::getSort)); + return baseMapper.selectList(new LambdaQueryWrapper() + .eq(GenTableColumn::getTableId, tableId) + .orderByAsc(GenTableColumn::getSort)); } /** diff --git a/ruoyi/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java b/ruoyi/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java index d571468ac..154f02630 100644 --- a/ruoyi/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java +++ b/ruoyi/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java @@ -1,18 +1,18 @@ 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.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.GenConstants; import com.ruoyi.common.core.domain.PageQuery; -import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.helper.LoginHelper; import com.ruoyi.common.utils.JsonUtils; -import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.file.FileUtils; import com.ruoyi.generator.domain.GenTable; @@ -22,12 +22,11 @@ import com.ruoyi.generator.mapper.GenTableMapper; import com.ruoyi.generator.util.GenUtils; import com.ruoyi.generator.util.VelocityInitializer; import com.ruoyi.generator.util.VelocityUtils; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.apache.poi.util.IOUtils; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.Velocity; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -37,6 +36,7 @@ import java.io.IOException; import java.io.StringWriter; import java.nio.charset.StandardCharsets; import java.util.*; +import java.util.function.Function; import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; @@ -47,11 +47,12 @@ import java.util.zip.ZipOutputStream; * @author Lion Li */ @Slf4j +@RequiredArgsConstructor @Service -public class GenTableServiceImpl extends ServicePlusImpl implements IGenTableService { +public class GenTableServiceImpl implements IGenTableService { - @Autowired - private GenTableColumnMapper genTableColumnMapper; + private final GenTableMapper baseMapper; + private final GenTableColumnMapper genTableColumnMapper; /** * 查询业务信息 @@ -150,7 +151,7 @@ public class GenTableServiceImpl extends ServicePlusImpl ids = Arrays.asList(tableIds); - removeByIds(ids); + baseMapper.deleteBatchIds(ids); genTableColumnMapper.delete(new LambdaQueryWrapper().in(GenTableColumn::getTableId, ids)); } @@ -162,7 +163,7 @@ public class GenTableServiceImpl extends ServicePlusImpl tableList) { - String operName = SecurityUtils.getUsername(); + String operName = LoginHelper.getUsername(); try { for (GenTable table : tableList) { String tableName = table.getTableName(); @@ -177,7 +178,7 @@ public class GenTableServiceImpl extends ServicePlusImpl tableColumns = table.getColumns(); - List tableColumnNames = tableColumns.stream().map(GenTableColumn::getColumnName).collect(Collectors.toList()); + Map tableColumnMap = tableColumns.stream().collect(Collectors.toMap(GenTableColumn::getColumnName, Function.identity())); List dbTableColumns = genTableColumnMapper.selectDbTableColumnsByName(tableName); - if (StringUtils.isEmpty(dbTableColumns)) { + if (CollUtil.isEmpty(dbTableColumns)) { throw new ServiceException("同步数据失败,原表结构不存在"); } List dbTableColumnNames = dbTableColumns.stream().map(GenTableColumn::getColumnName).collect(Collectors.toList()); List saveColumns = new ArrayList<>(); dbTableColumns.forEach(column -> { - if (!tableColumnNames.contains(column.getColumnName())) { - GenUtils.initColumnField(column, table); - saveColumns.add(column); + GenUtils.initColumnField(column, table); + if (tableColumnMap.containsKey(column.getColumnName())) { + 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 { + genTableColumnMapper.insert(column); } }); if (CollUtil.isNotEmpty(saveColumns)) { - genTableColumnMapper.insertAll(saveColumns); + genTableColumnMapper.insertBatch(saveColumns); } List delColumns = tableColumns.stream().filter(column -> !dbTableColumnNames.contains(column.getColumnName())).collect(Collectors.toList()); @@ -317,7 +335,7 @@ public class GenTableServiceImpl extends ServicePlusImpl paramsObj = genTable.getParams(); - if (StringUtils.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 (StringUtils.isEmpty(paramsObj.get(GenConstants.TREE_PARENT_CODE))) { + } else if (StringUtils.isEmpty(paramsObj.getStr(GenConstants.TREE_PARENT_CODE))) { throw new ServiceException("树父编码字段不能为空"); - } else if (StringUtils.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())) { @@ -393,7 +412,7 @@ public class GenTableServiceImpl extends ServicePlusImpl paramsObj = JsonUtils.parseMap(genTable.getOptions()); - if (StringUtils.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)); + Dict paramsObj = JsonUtils.parseMap(genTable.getOptions()); + if (ObjectUtil.isNotNull(paramsObj)) { + 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); diff --git a/ruoyi/src/main/java/com/ruoyi/generator/service/IGenTableColumnService.java b/ruoyi/src/main/java/com/ruoyi/generator/service/IGenTableColumnService.java index d1b5bae5e..f14f36a53 100644 --- a/ruoyi/src/main/java/com/ruoyi/generator/service/IGenTableColumnService.java +++ b/ruoyi/src/main/java/com/ruoyi/generator/service/IGenTableColumnService.java @@ -1,6 +1,5 @@ package com.ruoyi.generator.service; -import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.generator.domain.GenTableColumn; import java.util.List; @@ -10,7 +9,7 @@ import java.util.List; * * @author Lion Li */ -public interface IGenTableColumnService extends IService { +public interface IGenTableColumnService { /** * 查询业务字段列表 * diff --git a/ruoyi/src/main/java/com/ruoyi/generator/service/IGenTableService.java b/ruoyi/src/main/java/com/ruoyi/generator/service/IGenTableService.java index 2f7832e47..27fac79e3 100644 --- a/ruoyi/src/main/java/com/ruoyi/generator/service/IGenTableService.java +++ b/ruoyi/src/main/java/com/ruoyi/generator/service/IGenTableService.java @@ -1,6 +1,5 @@ package com.ruoyi.generator.service; -import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.generator.domain.GenTable; @@ -13,7 +12,7 @@ import java.util.Map; * * @author Lion Li */ -public interface IGenTableService extends IService { +public interface IGenTableService { TableDataInfo selectPageGenTableList(GenTable genTable, PageQuery pageQuery); diff --git a/ruoyi/src/main/java/com/ruoyi/generator/util/GenUtils.java b/ruoyi/src/main/java/com/ruoyi/generator/util/GenUtils.java index c434ca88d..1a1d04ac3 100644 --- a/ruoyi/src/main/java/com/ruoyi/generator/util/GenUtils.java +++ b/ruoyi/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设置为文本域 @@ -99,7 +100,7 @@ public class GenUtils { } // 类型&性别字段设置下拉框 else if (StringUtils.endsWithIgnoreCase(columnName, "type") - || StringUtils.endsWithIgnoreCase(columnName, "sex")) { + || StringUtils.endsWithIgnoreCase(columnName, "sex")) { column.setHtmlType(GenConstants.HTML_SELECT); } // 图片字段设置图片上传控件 @@ -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/src/main/java/com/ruoyi/generator/util/VelocityUtils.java b/ruoyi/src/main/java/com/ruoyi/generator/util/VelocityUtils.java index 13f7d8997..9a07ec45b 100644 --- a/ruoyi/src/main/java/com/ruoyi/generator/util/VelocityUtils.java +++ b/ruoyi/src/main/java/com/ruoyi/generator/util/VelocityUtils.java @@ -1,6 +1,9 @@ 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.utils.DateUtils; import com.ruoyi.common.utils.JsonUtils; @@ -76,14 +79,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); @@ -205,8 +208,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); } /** @@ -219,7 +221,7 @@ public class VelocityUtils { List columns = genTable.getColumns(); GenTable subGenTable = genTable.getSubTable(); HashSet importList = new HashSet(); - if (StringUtils.isNotNull(subGenTable)) { + if (ObjectUtil.isNotNull(subGenTable)) { importList.add("java.util.List"); } for (GenTableColumn column : columns) { @@ -244,8 +246,8 @@ public class VelocityUtils { Set dicts = new HashSet(); 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 })) { + column.getHtmlType(), + new String[]{GenConstants.HTML_SELECT, GenConstants.HTML_RADIO, GenConstants.HTML_CHECKBOX})) { dicts.add("'" + column.getDictType() + "'"); } } @@ -269,10 +271,10 @@ public class VelocityUtils { * @param paramsObj 生成其他选项 * @return 上级菜单ID字段 */ - public static String getParentMenuId(Map paramsObj) { - if (StringUtils.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)); + public static String getParentMenuId(Dict paramsObj) { + if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.PARENT_MENU_ID) + && StringUtils.isNotEmpty(paramsObj.getStr(GenConstants.PARENT_MENU_ID))) { + return paramsObj.getStr(GenConstants.PARENT_MENU_ID); } return DEFAULT_PARENT_MENU_ID; } @@ -284,7 +286,7 @@ public class VelocityUtils { * @return 树编码 */ public static String getTreecode(Map paramsObj) { - if (StringUtils.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_CODE)) { + if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_CODE)) { return StringUtils.toCamelCase(Convert.toStr(paramsObj.get(GenConstants.TREE_CODE))); } return StringUtils.EMPTY; @@ -296,9 +298,9 @@ public class VelocityUtils { * @param paramsObj 生成其他选项 * @return 树父编码 */ - public static String getTreeParentCode(Map paramsObj) { - if (StringUtils.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) { - return StringUtils.toCamelCase(Convert.toStr(paramsObj.get(GenConstants.TREE_PARENT_CODE))); + public static String getTreeParentCode(Dict paramsObj) { + if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) { + return StringUtils.toCamelCase(paramsObj.getStr(GenConstants.TREE_PARENT_CODE)); } return StringUtils.EMPTY; } @@ -309,9 +311,9 @@ public class VelocityUtils { * @param paramsObj 生成其他选项 * @return 树名称 */ - public static String getTreeName(Map paramsObj) { - if (StringUtils.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_NAME)) { - return StringUtils.toCamelCase(Convert.toStr(paramsObj.get(GenConstants.TREE_NAME))); + public static String getTreeName(Dict paramsObj) { + if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_NAME)) { + return StringUtils.toCamelCase(paramsObj.getStr(GenConstants.TREE_NAME)); } return StringUtils.EMPTY; } @@ -324,8 +326,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/src/main/java/com/ruoyi/oss/constant/OssConstant.java b/ruoyi/src/main/java/com/ruoyi/oss/constant/OssConstant.java index b5236bfe7..6c00cd8db 100644 --- a/ruoyi/src/main/java/com/ruoyi/oss/constant/OssConstant.java +++ b/ruoyi/src/main/java/com/ruoyi/oss/constant/OssConstant.java @@ -8,31 +8,36 @@ import java.util.List; * * @author Lion Li */ -public class OssConstant { +public interface OssConstant { - /** - * OSS模块KEY - */ - public static final String SYS_OSS_KEY = "sys_oss:"; + /** + * OSS模块KEY + */ + String SYS_OSS_KEY = "sys_oss:"; - /** - * 对象存储配置KEY - */ - public static final String OSS_CONFIG_KEY = "OssConfig"; + /** + * 对象存储配置KEY + */ + String OSS_CONFIG_KEY = "OssConfig"; - /** - * 缓存配置KEY - */ - public static final String CACHE_CONFIG_KEY = SYS_OSS_KEY + OSS_CONFIG_KEY; + /** + * 缓存配置KEY + */ + String CACHE_CONFIG_KEY = SYS_OSS_KEY + OSS_CONFIG_KEY; - /** - * 预览列表资源开关Key - */ - public static final String PEREVIEW_LIST_RESOURCE_KEY = "sys.oss.previewListResource"; + /** + * 预览列表资源开关Key + */ + String PEREVIEW_LIST_RESOURCE_KEY = "sys.oss.previewListResource"; - /** - * 系统数据ids - */ - public static final List SYSTEM_DATA_IDS = Arrays.asList(1, 2, 3, 4); + /** + * 系统数据ids + */ + List SYSTEM_DATA_IDS = Arrays.asList(1, 2, 3, 4); + + /** + * https 状态 + */ + String IS_HTTPS = "Y"; } diff --git a/ruoyi/src/main/java/com/ruoyi/oss/entity/UploadResult.java b/ruoyi/src/main/java/com/ruoyi/oss/entity/UploadResult.java index cb4f62054..379d283c8 100644 --- a/ruoyi/src/main/java/com/ruoyi/oss/entity/UploadResult.java +++ b/ruoyi/src/main/java/com/ruoyi/oss/entity/UploadResult.java @@ -1,8 +1,7 @@ package com.ruoyi.oss.entity; +import lombok.Builder; import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; /** * 上传返回体 @@ -10,17 +9,16 @@ import lombok.experimental.Accessors; * @author Lion Li */ @Data -@NoArgsConstructor -@Accessors(chain = true) +@Builder public class UploadResult { - /** - * 文件路径 - */ - private String url; + /** + * 文件路径 + */ + private String url; - /** - * 文件名 - */ - private String filename; + /** + * 文件名 + */ + private String filename; } diff --git a/ruoyi/src/main/java/com/ruoyi/oss/enumd/OssEnumd.java b/ruoyi/src/main/java/com/ruoyi/oss/enumd/OssEnumd.java index 4defca40e..e16a67338 100644 --- a/ruoyi/src/main/java/com/ruoyi/oss/enumd/OssEnumd.java +++ b/ruoyi/src/main/java/com/ruoyi/oss/enumd/OssEnumd.java @@ -1,6 +1,5 @@ package com.ruoyi.oss.enumd; -import com.ruoyi.common.utils.StringUtils; import com.ruoyi.oss.service.impl.AliyunOssStrategy; import com.ruoyi.oss.service.impl.MinioOssStrategy; import com.ruoyi.oss.service.impl.QcloudOssStrategy; @@ -17,47 +16,37 @@ import lombok.Getter; @AllArgsConstructor public enum OssEnumd { - /** - * 七牛云 - */ - QINIU("qiniu", QiniuOssStrategy.class), + /** + * 七牛云 + */ + QINIU("qiniu", QiniuOssStrategy.class), - /** - * 阿里云 - */ - ALIYUN("aliyun", AliyunOssStrategy.class), + /** + * 阿里云 + */ + ALIYUN("aliyun", AliyunOssStrategy.class), - /** - * 腾讯云 - */ - QCLOUD("qcloud", QcloudOssStrategy.class), + /** + * 腾讯云 + */ + QCLOUD("qcloud", QcloudOssStrategy.class), - /** - * minio - */ - MINIO("minio", MinioOssStrategy.class); + /** + * minio + */ + MINIO("minio", MinioOssStrategy.class); - private final String value; + private final String value; - private final Class serviceClass; - - public static Class getServiceClass(String value) { - for (OssEnumd clazz : values()) { - if (clazz.getValue().equals(value)) { - return clazz.getServiceClass(); - } - } - return null; - } - - public static String getServiceName(String value) { - for (OssEnumd clazz : values()) { - if (clazz.getValue().equals(value)) { - return StringUtils.uncapitalize(clazz.getServiceClass().getSimpleName()); - } - } - return null; - } + private final Class beanClass; + public static OssEnumd find(String value) { + for (OssEnumd enumd : values()) { + if (enumd.getValue().equals(value)) { + return enumd; + } + } + return null; + } } diff --git a/ruoyi/src/main/java/com/ruoyi/oss/enumd/PolicyType.java b/ruoyi/src/main/java/com/ruoyi/oss/enumd/PolicyType.java index c10dceb06..e1925dcfb 100644 --- a/ruoyi/src/main/java/com/ruoyi/oss/enumd/PolicyType.java +++ b/ruoyi/src/main/java/com/ruoyi/oss/enumd/PolicyType.java @@ -28,24 +28,24 @@ import lombok.Getter; @AllArgsConstructor public enum PolicyType { - /** - * 只读 - */ - READ("read-only"), + /** + * 只读 + */ + READ("read-only"), - /** - * 只写 - */ - WRITE("write-only"), + /** + * 只写 + */ + WRITE("write-only"), - /** - * 读写 - */ - READ_WRITE("read-write"); + /** + * 读写 + */ + READ_WRITE("read-write"); - /** - * 类型 - */ - private final String type; + /** + * 类型 + */ + private final String type; } diff --git a/ruoyi/src/main/java/com/ruoyi/oss/exception/OssException.java b/ruoyi/src/main/java/com/ruoyi/oss/exception/OssException.java index 48ab618ae..540b1cc0b 100644 --- a/ruoyi/src/main/java/com/ruoyi/oss/exception/OssException.java +++ b/ruoyi/src/main/java/com/ruoyi/oss/exception/OssException.java @@ -7,10 +7,10 @@ package com.ruoyi.oss.exception; */ public class OssException extends RuntimeException { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - public OssException(String msg) { - super(msg); - } + public OssException(String msg) { + super(msg); + } } diff --git a/ruoyi/src/main/java/com/ruoyi/oss/factory/OssFactory.java b/ruoyi/src/main/java/com/ruoyi/oss/factory/OssFactory.java index 169159602..9ac887e65 100644 --- a/ruoyi/src/main/java/com/ruoyi/oss/factory/OssFactory.java +++ b/ruoyi/src/main/java/com/ruoyi/oss/factory/OssFactory.java @@ -1,9 +1,9 @@ package com.ruoyi.oss.factory; import com.ruoyi.common.utils.JsonUtils; -import com.ruoyi.common.utils.RedisUtils; import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.common.utils.reflect.ReflectUtils; +import com.ruoyi.common.utils.redis.RedisUtils; +import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.oss.constant.OssConstant; import com.ruoyi.oss.enumd.OssEnumd; import com.ruoyi.oss.exception.OssException; @@ -12,9 +12,6 @@ import com.ruoyi.oss.service.IOssStrategy; import com.ruoyi.oss.service.abstractd.AbstractOssStrategy; import lombok.extern.slf4j.Slf4j; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - /** * 文件上传Factory * @@ -23,59 +20,60 @@ import java.util.concurrent.ConcurrentHashMap; @Slf4j public class OssFactory { - /** - * 服务实例缓存 - */ - private static final Map SERVICES = new ConcurrentHashMap<>(); - /** * 初始化工厂 */ public static void init() { log.info("初始化OSS工厂"); RedisUtils.subscribe(OssConstant.CACHE_CONFIG_KEY, String.class, type -> { - // 没有的实例不处理 - if (SERVICES.containsKey(type)) { - refreshService(type); + AbstractOssStrategy strategy = getStrategy(type); + // 未初始化不处理 + if (strategy.isInit) { + refresh(type); log.info("订阅刷新OSS配置 => " + type); } }); } - /** - * 获取默认实例 - */ - public static IOssStrategy instance() { - // 获取redis 默认类型 - String type = RedisUtils.getCacheObject(OssConstant.CACHE_CONFIG_KEY); - if (StringUtils.isEmpty(type)) { - throw new OssException("文件存储服务类型无法找到!"); - } - return instance(type); - } + /** + * 获取默认实例 + */ + public static IOssStrategy instance() { + // 获取redis 默认类型 + String type = RedisUtils.getCacheObject(OssConstant.CACHE_CONFIG_KEY); + if (StringUtils.isEmpty(type)) { + throw new OssException("文件存储服务类型无法找到!"); + } + return instance(type); + } - /** - * 根据类型获取实例 - */ - public static IOssStrategy instance(String type) { - IOssStrategy service = SERVICES.get(type); - if (service == null) { - refreshService(type); - service = SERVICES.get(type); - } - return service; - } + /** + * 根据类型获取实例 + */ + public static IOssStrategy instance(String type) { + OssEnumd enumd = OssEnumd.find(type); + if (enumd == null) { + throw new OssException("文件存储服务类型无法找到!"); + } + AbstractOssStrategy strategy = getStrategy(type); + if (!strategy.isInit) { + refresh(type); + } + return strategy; + } - private static void refreshService(String type) { - Object json = RedisUtils.getCacheObject(OssConstant.SYS_OSS_KEY + type); + private static void refresh(String type) { + Object json = RedisUtils.getCacheObject(OssConstant.SYS_OSS_KEY + type); OssProperties properties = JsonUtils.parseObject(json.toString(), OssProperties.class); - if (properties == null) { - throw new OssException("系统异常, '" + type + "'配置信息不存在!"); - } - // 获取redis配置信息 创建对象 并缓存 - IOssStrategy service = (IOssStrategy) ReflectUtils.newInstance(OssEnumd.getServiceClass(type)); - ((AbstractOssStrategy)service).init(properties); - SERVICES.put(type, service); - } + if (properties == null) { + throw new OssException("系统异常, '" + type + "'配置信息不存在!"); + } + getStrategy(type).init(properties); + } + + private static AbstractOssStrategy getStrategy(String type) { + OssEnumd enumd = OssEnumd.find(type); + return (AbstractOssStrategy) SpringUtils.getBean(enumd.getBeanClass()); + } } diff --git a/ruoyi/src/main/java/com/ruoyi/oss/properties/OssProperties.java b/ruoyi/src/main/java/com/ruoyi/oss/properties/OssProperties.java index 48a478b7a..d09bfdb69 100644 --- a/ruoyi/src/main/java/com/ruoyi/oss/properties/OssProperties.java +++ b/ruoyi/src/main/java/com/ruoyi/oss/properties/OssProperties.java @@ -10,39 +10,39 @@ import lombok.Data; @Data public class OssProperties { - /** - * 域名 - */ - private String endpoint; + /** + * 域名 + */ + private String endpoint; - /** - * 前缀 - */ - private String prefix; + /** + * 前缀 + */ + private String prefix; - /** - * ACCESS_KEY - */ - private String accessKey; + /** + * ACCESS_KEY + */ + private String accessKey; - /** - * SECRET_KEY - */ - private String secretKey; + /** + * SECRET_KEY + */ + private String secretKey; - /** - * 存储空间名 - */ - private String bucketName; + /** + * 存储空间名 + */ + private String bucketName; - /** - * 存储区域 - */ - private String region; + /** + * 存储区域 + */ + private String region; - /** - * 是否https(Y=是,N=否) - */ - private String isHttps; + /** + * 是否https(Y=是,N=否) + */ + private String isHttps; } diff --git a/ruoyi/src/main/java/com/ruoyi/oss/service/IOssStrategy.java b/ruoyi/src/main/java/com/ruoyi/oss/service/IOssStrategy.java index 34d25e477..c6661e7c9 100644 --- a/ruoyi/src/main/java/com/ruoyi/oss/service/IOssStrategy.java +++ b/ruoyi/src/main/java/com/ruoyi/oss/service/IOssStrategy.java @@ -1,6 +1,7 @@ package com.ruoyi.oss.service; import com.ruoyi.oss.entity.UploadResult; +import com.ruoyi.oss.enumd.OssEnumd; import java.io.InputStream; @@ -11,54 +12,55 @@ import java.io.InputStream; */ public interface IOssStrategy { - void createBucket(); + void createBucket(); - /** - * 获取服务商类型 - */ - String getServiceType(); + /** + * 获取服务商类型 + * @return + */ + OssEnumd getServiceType(); - /** - * 文件上传 - * - * @param data 文件字节数组 - * @param path 文件路径,包含文件名 - * @return 返回http地址 - */ - UploadResult upload(byte[] data, String path, String contentType); + /** + * 文件上传 + * + * @param data 文件字节数组 + * @param path 文件路径,包含文件名 + * @return 返回http地址 + */ + UploadResult upload(byte[] data, String path, String contentType); - /** - * 文件删除 - * - * @param path 文件路径,包含文件名 - */ - void delete(String path); + /** + * 文件删除 + * + * @param path 文件路径,包含文件名 + */ + void delete(String path); - /** - * 文件上传 - * - * @param data 文件字节数组 - * @param suffix 后缀 - * @return 返回http地址 - */ - UploadResult uploadSuffix(byte[] data, String suffix, String contentType); + /** + * 文件上传 + * + * @param data 文件字节数组 + * @param suffix 后缀 + * @return 返回http地址 + */ + UploadResult uploadSuffix(byte[] data, String suffix, String contentType); - /** - * 文件上传 - * - * @param inputStream 字节流 - * @param path 文件路径,包含文件名 - * @return 返回http地址 - */ - UploadResult upload(InputStream inputStream, String path, String contentType); + /** + * 文件上传 + * + * @param inputStream 字节流 + * @param path 文件路径,包含文件名 + * @return 返回http地址 + */ + UploadResult upload(InputStream inputStream, String path, String contentType); - /** - * 文件上传 - * - * @param inputStream 字节流 - * @param suffix 后缀 - * @return 返回http地址 - */ - UploadResult uploadSuffix(InputStream inputStream, String suffix, String contentType); + /** + * 文件上传 + * + * @param inputStream 字节流 + * @param suffix 后缀 + * @return 返回http地址 + */ + UploadResult uploadSuffix(InputStream inputStream, String suffix, String contentType); } diff --git a/ruoyi/src/main/java/com/ruoyi/oss/service/abstractd/AbstractOssStrategy.java b/ruoyi/src/main/java/com/ruoyi/oss/service/abstractd/AbstractOssStrategy.java index 9fa52acb4..e4928cdb6 100644 --- a/ruoyi/src/main/java/com/ruoyi/oss/service/abstractd/AbstractOssStrategy.java +++ b/ruoyi/src/main/java/com/ruoyi/oss/service/abstractd/AbstractOssStrategy.java @@ -5,6 +5,7 @@ import cn.hutool.core.util.IdUtil; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.oss.entity.UploadResult; +import com.ruoyi.oss.enumd.OssEnumd; import com.ruoyi.oss.properties.OssProperties; import com.ruoyi.oss.service.IOssStrategy; @@ -17,44 +18,47 @@ import java.io.InputStream; */ public abstract class AbstractOssStrategy implements IOssStrategy { - protected OssProperties properties; + protected OssProperties properties; + public boolean isInit = false; - public abstract void init(OssProperties properties); + public void init(OssProperties properties) { + this.properties = properties; + } - @Override - public abstract void createBucket(); + @Override + public abstract void createBucket(); - @Override - public abstract String getServiceType(); + @Override + public abstract OssEnumd getServiceType(); - public String getPath(String prefix, String suffix) { - // 生成uuid - String uuid = IdUtil.fastSimpleUUID(); - // 文件路径 - String path = DateUtils.datePath() + "/" + uuid; - if (StringUtils.isNotBlank(prefix)) { - path = prefix + "/" + path; - } - return path + suffix; - } + public String getPath(String prefix, String suffix) { + // 生成uuid + String uuid = IdUtil.fastSimpleUUID(); + // 文件路径 + String path = DateUtils.datePath() + "/" + uuid; + if (StringUtils.isNotBlank(prefix)) { + path = prefix + "/" + path; + } + return path + suffix; + } - @Override - public abstract UploadResult upload(byte[] data, String path, String contentType); + @Override + public abstract UploadResult upload(byte[] data, String path, String contentType); - @Override - public abstract void delete(String path); + @Override + public abstract void delete(String path); - @Override - public UploadResult upload(InputStream inputStream, String path, String contentType) { - byte[] data = IoUtil.readBytes(inputStream); - return this.upload(data, path, contentType); - } + @Override + public UploadResult upload(InputStream inputStream, String path, String contentType) { + byte[] data = IoUtil.readBytes(inputStream); + return this.upload(data, path, contentType); + } - @Override - public abstract UploadResult uploadSuffix(byte[] data, String suffix, String contentType); + @Override + public abstract UploadResult uploadSuffix(byte[] data, String suffix, String contentType); - @Override - public abstract UploadResult uploadSuffix(InputStream inputStream, String suffix, String contentType); + @Override + public abstract UploadResult uploadSuffix(InputStream inputStream, String suffix, String contentType); - public abstract String getEndpointLink(); + public abstract String getEndpointLink(); } diff --git a/ruoyi/src/main/java/com/ruoyi/oss/service/impl/AliyunOssStrategy.java b/ruoyi/src/main/java/com/ruoyi/oss/service/impl/AliyunOssStrategy.java index db9ad910e..62c29228f 100644 --- a/ruoyi/src/main/java/com/ruoyi/oss/service/impl/AliyunOssStrategy.java +++ b/ruoyi/src/main/java/com/ruoyi/oss/service/impl/AliyunOssStrategy.java @@ -3,16 +3,19 @@ package com.ruoyi.oss.service.impl; import com.aliyun.oss.ClientConfiguration; import com.aliyun.oss.OSSClient; import com.aliyun.oss.common.auth.DefaultCredentialProvider; +import com.aliyun.oss.common.comm.Protocol; import com.aliyun.oss.model.CannedAccessControlList; import com.aliyun.oss.model.CreateBucketRequest; import com.aliyun.oss.model.ObjectMetadata; import com.aliyun.oss.model.PutObjectRequest; import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.oss.constant.OssConstant; import com.ruoyi.oss.entity.UploadResult; import com.ruoyi.oss.enumd.OssEnumd; import com.ruoyi.oss.exception.OssException; import com.ruoyi.oss.properties.OssProperties; import com.ruoyi.oss.service.abstractd.AbstractOssStrategy; +import org.springframework.stereotype.Component; import java.io.ByteArrayInputStream; import java.io.InputStream; @@ -22,92 +25,96 @@ import java.io.InputStream; * * @author Lion Li */ +@Component public class AliyunOssStrategy extends AbstractOssStrategy { - private OSSClient client; + private OSSClient client; - @Override - public void init(OssProperties cloudStorageProperties) { - properties = cloudStorageProperties; - try { - ClientConfiguration configuration = new ClientConfiguration(); - DefaultCredentialProvider credentialProvider = new DefaultCredentialProvider( - properties.getAccessKey(), properties.getSecretKey()); - client = new OSSClient(properties.getEndpoint(), credentialProvider, configuration); - createBucket(); - } catch (Exception e) { - throw new OssException("阿里云存储配置错误! 请检查系统配置:[" + e.getMessage() + "]"); - } - } + @Override + public void init(OssProperties ossProperties) { + super.init(ossProperties); + try { + ClientConfiguration configuration = new ClientConfiguration(); + if (OssConstant.IS_HTTPS.equals(ossProperties.getIsHttps())) { + configuration.setProtocol(Protocol.HTTPS); + } + DefaultCredentialProvider credentialProvider = new DefaultCredentialProvider( + properties.getAccessKey(), properties.getSecretKey()); + client = new OSSClient(properties.getEndpoint(), credentialProvider, configuration); + createBucket(); + } catch (Exception e) { + throw new OssException("阿里云存储配置错误! 请检查系统配置:[" + e.getMessage() + "]"); + } + isInit = true; + } - @Override - public void createBucket() { - try { - String bucketName = properties.getBucketName(); - if (client.doesBucketExist(bucketName)) { - return; - } - CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName); - createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead); - client.createBucket(createBucketRequest); - } catch (Exception e) { - throw new OssException("创建Bucket失败, 请核对阿里云配置信息:[" + e.getMessage() + "]"); - } - } + @Override + public void createBucket() { + try { + String bucketName = properties.getBucketName(); + if (client.doesBucketExist(bucketName)) { + return; + } + CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName); + createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead); + client.createBucket(createBucketRequest); + } catch (Exception e) { + throw new OssException("创建Bucket失败, 请核对阿里云配置信息:[" + e.getMessage() + "]"); + } + } - @Override - public String getServiceType() { - return OssEnumd.ALIYUN.getValue(); - } + @Override + public OssEnumd getServiceType() { + return OssEnumd.ALIYUN; + } - @Override - public UploadResult upload(byte[] data, String path, String contentType) { - return upload(new ByteArrayInputStream(data), path, contentType); - } + @Override + public UploadResult upload(byte[] data, String path, String contentType) { + return upload(new ByteArrayInputStream(data), path, contentType); + } - @Override - public UploadResult upload(InputStream inputStream, String path, String contentType) { - try { - ObjectMetadata metadata = new ObjectMetadata(); - metadata.setContentType(contentType); - client.putObject(new PutObjectRequest(properties.getBucketName(), path, inputStream, metadata)); - } catch (Exception e) { - throw new OssException("上传文件失败,请检查阿里云配置信息:[" + e.getMessage() + "]"); - } - return new UploadResult().setUrl(getEndpointLink() + "/" + path).setFilename(path); - } + @Override + public UploadResult upload(InputStream inputStream, String path, String contentType) { + try { + ObjectMetadata metadata = new ObjectMetadata(); + metadata.setContentType(contentType); + client.putObject(new PutObjectRequest(properties.getBucketName(), path, inputStream, metadata)); + } catch (Exception e) { + throw new OssException("上传文件失败,请检查阿里云配置信息:[" + e.getMessage() + "]"); + } + return UploadResult.builder().url(getEndpointLink() + "/" + path).filename(path).build(); } - @Override - public void delete(String path) { - path = path.replace(getEndpointLink() + "/", ""); - try { - client.deleteObject(properties.getBucketName(), path); - } catch (Exception e) { - throw new OssException("上传文件失败,请检查阿里云配置信息:[" + e.getMessage() + "]"); - } - } + @Override + public void delete(String path) { + path = path.replace(getEndpointLink() + "/", ""); + try { + client.deleteObject(properties.getBucketName(), path); + } catch (Exception e) { + throw new OssException("上传文件失败,请检查阿里云配置信息:[" + e.getMessage() + "]"); + } + } - @Override - public UploadResult uploadSuffix(byte[] data, String suffix, String contentType) { - return upload(data, getPath(properties.getPrefix(), suffix), contentType); - } + @Override + public UploadResult uploadSuffix(byte[] data, String suffix, String contentType) { + return upload(data, getPath(properties.getPrefix(), suffix), contentType); + } - @Override - public UploadResult uploadSuffix(InputStream inputStream, String suffix, String contentType) { - return upload(inputStream, getPath(properties.getPrefix(), suffix), contentType); - } + @Override + public UploadResult uploadSuffix(InputStream inputStream, String suffix, String contentType) { + return upload(inputStream, getPath(properties.getPrefix(), suffix), contentType); + } - @Override - public String getEndpointLink() { - String endpoint = properties.getEndpoint(); - StringBuilder sb = new StringBuilder(endpoint); - if (StringUtils.containsAnyIgnoreCase(endpoint, "http://")) { - sb.insert(7, properties.getBucketName() + "."); - } else if (StringUtils.containsAnyIgnoreCase(endpoint, "https://")) { - sb.insert(8, properties.getBucketName() + "."); - } else { - throw new OssException("Endpoint配置错误"); - } - return sb.toString(); - } + @Override + public String getEndpointLink() { + String endpoint = properties.getEndpoint(); + StringBuilder sb = new StringBuilder(endpoint); + if (StringUtils.containsAnyIgnoreCase(endpoint, "http://")) { + sb.insert(7, properties.getBucketName() + "."); + } else if (StringUtils.containsAnyIgnoreCase(endpoint, "https://")) { + sb.insert(8, properties.getBucketName() + "."); + } else { + throw new OssException("Endpoint配置错误"); + } + return sb.toString(); + } } diff --git a/ruoyi/src/main/java/com/ruoyi/oss/service/impl/MinioOssStrategy.java b/ruoyi/src/main/java/com/ruoyi/oss/service/impl/MinioOssStrategy.java index 0423dcc8a..eb2e77042 100644 --- a/ruoyi/src/main/java/com/ruoyi/oss/service/impl/MinioOssStrategy.java +++ b/ruoyi/src/main/java/com/ruoyi/oss/service/impl/MinioOssStrategy.java @@ -1,6 +1,7 @@ package com.ruoyi.oss.service.impl; import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.oss.constant.OssConstant; import com.ruoyi.oss.entity.UploadResult; import com.ruoyi.oss.enumd.OssEnumd; import com.ruoyi.oss.enumd.PolicyType; @@ -9,6 +10,7 @@ import com.ruoyi.oss.properties.OssProperties; import com.ruoyi.oss.service.abstractd.AbstractOssStrategy; import io.minio.*; import org.springframework.http.MediaType; +import org.springframework.stereotype.Component; import java.io.ByteArrayInputStream; import java.io.InputStream; @@ -18,164 +20,166 @@ import java.io.InputStream; * * @author Lion Li */ +@Component public class MinioOssStrategy extends AbstractOssStrategy { - private MinioClient minioClient; + private MinioClient minioClient; - @Override - public void init(OssProperties cloudStorageProperties) { - properties = cloudStorageProperties; - try { - minioClient = MinioClient.builder() - .endpoint(properties.getEndpoint()) - .credentials(properties.getAccessKey(), properties.getSecretKey()) - .build(); - createBucket(); - } catch (Exception e) { - throw new OssException("Minio存储配置错误! 请检查系统配置:[" + e.getMessage() + "]"); - } - } + @Override + public void init(OssProperties ossProperties) { + super.init(ossProperties); + try { + minioClient = MinioClient.builder() + .endpoint(properties.getEndpoint(), 443, OssConstant.IS_HTTPS.equals(ossProperties.getIsHttps())) + .credentials(properties.getAccessKey(), properties.getSecretKey()) + .build(); + createBucket(); + } catch (Exception e) { + throw new OssException("Minio存储配置错误! 请检查系统配置:[" + e.getMessage() + "]"); + } + isInit = true; + } - @Override - public void createBucket() { - try { - String bucketName = properties.getBucketName(); - boolean exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build()); - if (exists) { - return; - } - // 不存在就创建桶 - minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build()); - minioClient.setBucketPolicy(SetBucketPolicyArgs.builder() - .bucket(bucketName) - .config(getPolicy(bucketName, PolicyType.READ)) - .build()); - } catch (Exception e) { - throw new OssException("创建Bucket失败, 请核对Minio配置信息:[" + e.getMessage() + "]"); - } - } + @Override + public void createBucket() { + try { + String bucketName = properties.getBucketName(); + boolean exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build()); + if (exists) { + return; + } + // 不存在就创建桶 + minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build()); + minioClient.setBucketPolicy(SetBucketPolicyArgs.builder() + .bucket(bucketName) + .config(getPolicy(bucketName, PolicyType.READ)) + .build()); + } catch (Exception e) { + throw new OssException("创建Bucket失败, 请核对Minio配置信息:[" + e.getMessage() + "]"); + } + } - @Override - public String getServiceType() { - return OssEnumd.MINIO.getValue(); - } + @Override + public OssEnumd getServiceType() { + return OssEnumd.MINIO; + } - @Override - public UploadResult upload(byte[] data, String path, String contentType) { - return upload(new ByteArrayInputStream(data), path, contentType); - } + @Override + public UploadResult upload(byte[] data, String path, String contentType) { + return upload(new ByteArrayInputStream(data), path, contentType); + } - @Override - public UploadResult upload(InputStream inputStream, String path, String contentType) { - try { - minioClient.putObject(PutObjectArgs.builder() - .bucket(properties.getBucketName()) - .object(path) - .contentType(StringUtils.blankToDefault(contentType, MediaType.APPLICATION_OCTET_STREAM_VALUE)) - .stream(inputStream, inputStream.available(), -1) - .build()); - } catch (Exception e) { - throw new OssException("上传文件失败,请核对Minio配置信息:[" + e.getMessage() + "]"); - } - return new UploadResult().setUrl(getEndpointLink() + "/" + path).setFilename(path); - } + @Override + public UploadResult upload(InputStream inputStream, String path, String contentType) { + try { + minioClient.putObject(PutObjectArgs.builder() + .bucket(properties.getBucketName()) + .object(path) + .contentType(StringUtils.blankToDefault(contentType, MediaType.APPLICATION_OCTET_STREAM_VALUE)) + .stream(inputStream, inputStream.available(), -1) + .build()); + } catch (Exception e) { + throw new OssException("上传文件失败,请核对Minio配置信息:[" + e.getMessage() + "]"); + } + return UploadResult.builder().url(getEndpointLink() + "/" + path).filename(path).build(); + } - @Override - public void delete(String path) { - path = path.replace(getEndpointLink() + "/", ""); - try { - minioClient.removeObject(RemoveObjectArgs.builder() - .bucket(properties.getBucketName()) - .object(path) - .build()); - } catch (Exception e) { - throw new OssException(e.getMessage()); - } - } + @Override + public void delete(String path) { + path = path.replace(getEndpointLink() + "/", ""); + try { + minioClient.removeObject(RemoveObjectArgs.builder() + .bucket(properties.getBucketName()) + .object(path) + .build()); + } catch (Exception e) { + throw new OssException(e.getMessage()); + } + } - @Override - public UploadResult uploadSuffix(byte[] data, String suffix, String contentType) { - return upload(data, getPath(properties.getPrefix(), suffix), contentType); - } + @Override + public UploadResult uploadSuffix(byte[] data, String suffix, String contentType) { + return upload(data, getPath(properties.getPrefix(), suffix), contentType); + } - @Override - public UploadResult uploadSuffix(InputStream inputStream, String suffix, String contentType) { - return upload(inputStream, getPath(properties.getPrefix(), suffix), contentType); - } + @Override + public UploadResult uploadSuffix(InputStream inputStream, String suffix, String contentType) { + return upload(inputStream, getPath(properties.getPrefix(), suffix), contentType); + } - @Override - public String getEndpointLink() { - return properties.getEndpoint() + "/" + properties.getBucketName(); - } + @Override + public String getEndpointLink() { + return properties.getEndpoint() + "/" + properties.getBucketName(); + } - private String getPolicy(String bucketName, PolicyType policyType) { - StringBuilder builder = new StringBuilder(); - builder.append("{\n"); - builder.append(" \"Statement\": [\n"); - builder.append(" {\n"); - builder.append(" \"Action\": [\n"); - if (policyType == PolicyType.WRITE) { - builder.append(" \"s3:GetBucketLocation\",\n"); - builder.append(" \"s3:ListBucketMultipartUploads\"\n"); - } else if (policyType == PolicyType.READ_WRITE) { - builder.append(" \"s3:GetBucketLocation\",\n"); - builder.append(" \"s3:ListBucket\",\n"); - builder.append(" \"s3:ListBucketMultipartUploads\"\n"); - } else { - builder.append(" \"s3:GetBucketLocation\"\n"); - } - builder.append(" ],\n"); - builder.append(" \"Effect\": \"Allow\",\n"); - builder.append(" \"Principal\": \"*\",\n"); - builder.append(" \"Resource\": \"arn:aws:s3:::"); - builder.append(bucketName); - builder.append("\"\n"); - builder.append(" },\n"); - if (PolicyType.READ.equals(policyType)) { - builder.append(" {\n"); - builder.append(" \"Action\": [\n"); - builder.append(" \"s3:ListBucket\"\n"); - builder.append(" ],\n"); - builder.append(" \"Effect\": \"Deny\",\n"); - builder.append(" \"Principal\": \"*\",\n"); - builder.append(" \"Resource\": \"arn:aws:s3:::"); - builder.append(bucketName); - builder.append("\"\n"); - builder.append(" },\n"); - } - builder.append(" {\n"); - builder.append(" \"Action\": "); - switch (policyType) { - case WRITE: - builder.append("[\n"); - builder.append(" \"s3:AbortMultipartUpload\",\n"); - builder.append(" \"s3:DeleteObject\",\n"); - builder.append(" \"s3:ListMultipartUploadParts\",\n"); - builder.append(" \"s3:PutObject\"\n"); - builder.append(" ],\n"); - break; - case READ_WRITE: - builder.append("[\n"); - builder.append(" \"s3:AbortMultipartUpload\",\n"); - builder.append(" \"s3:DeleteObject\",\n"); - builder.append(" \"s3:GetObject\",\n"); - builder.append(" \"s3:ListMultipartUploadParts\",\n"); - builder.append(" \"s3:PutObject\"\n"); - builder.append(" ],\n"); - break; - default: - builder.append("\"s3:GetObject\",\n"); - break; - } - builder.append(" \"Effect\": \"Allow\",\n"); - builder.append(" \"Principal\": \"*\",\n"); - builder.append(" \"Resource\": \"arn:aws:s3:::"); - builder.append(bucketName); - builder.append("/*\"\n"); - builder.append(" }\n"); - builder.append(" ],\n"); - builder.append(" \"Version\": \"2012-10-17\"\n"); - builder.append("}\n"); - return builder.toString(); - } + private String getPolicy(String bucketName, PolicyType policyType) { + StringBuilder builder = new StringBuilder(); + builder.append("{\n"); + builder.append(" \"Statement\": [\n"); + builder.append(" {\n"); + builder.append(" \"Action\": [\n"); + if (policyType == PolicyType.WRITE) { + builder.append(" \"s3:GetBucketLocation\",\n"); + builder.append(" \"s3:ListBucketMultipartUploads\"\n"); + } else if (policyType == PolicyType.READ_WRITE) { + builder.append(" \"s3:GetBucketLocation\",\n"); + builder.append(" \"s3:ListBucket\",\n"); + builder.append(" \"s3:ListBucketMultipartUploads\"\n"); + } else { + builder.append(" \"s3:GetBucketLocation\"\n"); + } + builder.append(" ],\n"); + builder.append(" \"Effect\": \"Allow\",\n"); + builder.append(" \"Principal\": \"*\",\n"); + builder.append(" \"Resource\": \"arn:aws:s3:::"); + builder.append(bucketName); + builder.append("\"\n"); + builder.append(" },\n"); + if (PolicyType.READ.equals(policyType)) { + builder.append(" {\n"); + builder.append(" \"Action\": [\n"); + builder.append(" \"s3:ListBucket\"\n"); + builder.append(" ],\n"); + builder.append(" \"Effect\": \"Deny\",\n"); + builder.append(" \"Principal\": \"*\",\n"); + builder.append(" \"Resource\": \"arn:aws:s3:::"); + builder.append(bucketName); + builder.append("\"\n"); + builder.append(" },\n"); + } + builder.append(" {\n"); + builder.append(" \"Action\": "); + switch (policyType) { + case WRITE: + builder.append("[\n"); + builder.append(" \"s3:AbortMultipartUpload\",\n"); + builder.append(" \"s3:DeleteObject\",\n"); + builder.append(" \"s3:ListMultipartUploadParts\",\n"); + builder.append(" \"s3:PutObject\"\n"); + builder.append(" ],\n"); + break; + case READ_WRITE: + builder.append("[\n"); + builder.append(" \"s3:AbortMultipartUpload\",\n"); + builder.append(" \"s3:DeleteObject\",\n"); + builder.append(" \"s3:GetObject\",\n"); + builder.append(" \"s3:ListMultipartUploadParts\",\n"); + builder.append(" \"s3:PutObject\"\n"); + builder.append(" ],\n"); + break; + default: + builder.append("\"s3:GetObject\",\n"); + break; + } + builder.append(" \"Effect\": \"Allow\",\n"); + builder.append(" \"Principal\": \"*\",\n"); + builder.append(" \"Resource\": \"arn:aws:s3:::"); + builder.append(bucketName); + builder.append("/*\"\n"); + builder.append(" }\n"); + builder.append(" ],\n"); + builder.append(" \"Version\": \"2012-10-17\"\n"); + builder.append("}\n"); + return builder.toString(); + } } diff --git a/ruoyi/src/main/java/com/ruoyi/oss/service/impl/QcloudOssStrategy.java b/ruoyi/src/main/java/com/ruoyi/oss/service/impl/QcloudOssStrategy.java index 156eb24c5..756462e4d 100644 --- a/ruoyi/src/main/java/com/ruoyi/oss/service/impl/QcloudOssStrategy.java +++ b/ruoyi/src/main/java/com/ruoyi/oss/service/impl/QcloudOssStrategy.java @@ -8,11 +8,13 @@ import com.qcloud.cos.http.HttpProtocol; import com.qcloud.cos.model.*; import com.qcloud.cos.region.Region; import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.oss.constant.OssConstant; import com.ruoyi.oss.entity.UploadResult; import com.ruoyi.oss.enumd.OssEnumd; import com.ruoyi.oss.exception.OssException; import com.ruoyi.oss.properties.OssProperties; import com.ruoyi.oss.service.abstractd.AbstractOssStrategy; +import org.springframework.stereotype.Component; import java.io.ByteArrayInputStream; import java.io.InputStream; @@ -22,100 +24,102 @@ import java.io.InputStream; * * @author Lion Li */ +@Component public class QcloudOssStrategy extends AbstractOssStrategy { - private COSClient client; + private COSClient client; - @Override - public void init(OssProperties cloudStorageProperties) { - properties = cloudStorageProperties; - try { - COSCredentials credentials = new BasicCOSCredentials( - properties.getAccessKey(), properties.getSecretKey()); - // 初始化客户端配置 - ClientConfig clientConfig = new ClientConfig(); - // 设置bucket所在的区域,华南:gz 华北:tj 华东:sh - clientConfig.setRegion(new Region(properties.getRegion())); - if ("Y".equals(properties.getIsHttps())) { - clientConfig.setHttpProtocol(HttpProtocol.https); - } else { - clientConfig.setHttpProtocol(HttpProtocol.http); - } - client = new COSClient(credentials, clientConfig); - createBucket(); - } catch (Exception e) { - throw new OssException("腾讯云存储配置错误! 请检查系统配置:[" + e.getMessage() + "]"); - } - } + @Override + public void init(OssProperties ossProperties) { + super.init(ossProperties); + try { + COSCredentials credentials = new BasicCOSCredentials( + properties.getAccessKey(), properties.getSecretKey()); + // 初始化客户端配置 + ClientConfig clientConfig = new ClientConfig(); + // 设置bucket所在的区域,华南:gz 华北:tj 华东:sh + clientConfig.setRegion(new Region(properties.getRegion())); + if (OssConstant.IS_HTTPS.equals(properties.getIsHttps())) { + clientConfig.setHttpProtocol(HttpProtocol.https); + } else { + clientConfig.setHttpProtocol(HttpProtocol.http); + } + client = new COSClient(credentials, clientConfig); + createBucket(); + } catch (Exception e) { + throw new OssException("腾讯云存储配置错误! 请检查系统配置:[" + e.getMessage() + "]"); + } + isInit = true; + } - @Override - public void createBucket() { - try { - String bucketName = properties.getBucketName(); - if (client.doesBucketExist(bucketName)) { - return; - } - CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName); - createBucketRequest.setCannedAcl(CannedAccessControlList.PublicRead); - client.createBucket(createBucketRequest); - } catch (Exception e) { - throw new OssException("创建Bucket失败, 请核对腾讯云配置信息:[" + e.getMessage() + "]"); - } - } + @Override + public void createBucket() { + try { + String bucketName = properties.getBucketName(); + if (client.doesBucketExist(bucketName)) { + return; + } + CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName); + createBucketRequest.setCannedAcl(CannedAccessControlList.PublicRead); + client.createBucket(createBucketRequest); + } catch (Exception e) { + throw new OssException("创建Bucket失败, 请核对腾讯云配置信息:[" + e.getMessage() + "]"); + } + } - @Override - public String getServiceType() { - return OssEnumd.QCLOUD.getValue(); - } + @Override + public OssEnumd getServiceType() { + return OssEnumd.QCLOUD; + } - @Override - public UploadResult upload(byte[] data, String path, String contentType) { - return upload(new ByteArrayInputStream(data), path, contentType); - } + @Override + public UploadResult upload(byte[] data, String path, String contentType) { + return upload(new ByteArrayInputStream(data), path, contentType); + } - @Override - public UploadResult upload(InputStream inputStream, String path, String contentType) { - try { - ObjectMetadata metadata = new ObjectMetadata(); - metadata.setContentType(contentType); - client.putObject(new PutObjectRequest(properties.getBucketName(), path, inputStream, metadata)); - } catch (Exception e) { - throw new OssException("上传文件失败,请检查腾讯云配置信息:[" + e.getMessage() + "]"); - } - return new UploadResult().setUrl(getEndpointLink() + "/" + path).setFilename(path); - } + @Override + public UploadResult upload(InputStream inputStream, String path, String contentType) { + try { + ObjectMetadata metadata = new ObjectMetadata(); + metadata.setContentType(contentType); + client.putObject(new PutObjectRequest(properties.getBucketName(), path, inputStream, metadata)); + } catch (Exception e) { + throw new OssException("上传文件失败,请检查腾讯云配置信息:[" + e.getMessage() + "]"); + } + return UploadResult.builder().url(getEndpointLink() + "/" + path).filename(path).build(); + } - @Override - public void delete(String path) { - path = path.replace(getEndpointLink() + "/", ""); - try { - client.deleteObject(new DeleteObjectRequest(properties.getBucketName(), path)); - } catch (Exception e) { - throw new OssException("上传文件失败,请检腾讯云查配置信息:[" + e.getMessage() + "]"); - } - } + @Override + public void delete(String path) { + path = path.replace(getEndpointLink() + "/", ""); + try { + client.deleteObject(new DeleteObjectRequest(properties.getBucketName(), path)); + } catch (Exception e) { + throw new OssException("上传文件失败,请检腾讯云查配置信息:[" + e.getMessage() + "]"); + } + } - @Override - public UploadResult uploadSuffix(byte[] data, String suffix, String contentType) { - return upload(data, getPath(properties.getPrefix(), suffix), contentType); - } + @Override + public UploadResult uploadSuffix(byte[] data, String suffix, String contentType) { + return upload(data, getPath(properties.getPrefix(), suffix), contentType); + } - @Override - public UploadResult uploadSuffix(InputStream inputStream, String suffix, String contentType) { - return upload(inputStream, getPath(properties.getPrefix(), suffix), contentType); - } + @Override + public UploadResult uploadSuffix(InputStream inputStream, String suffix, String contentType) { + return upload(inputStream, getPath(properties.getPrefix(), suffix), contentType); + } - @Override - public String getEndpointLink() { - String endpoint = properties.getEndpoint(); - StringBuilder sb = new StringBuilder(endpoint); - if (StringUtils.containsAnyIgnoreCase(endpoint, "http://")) { - sb.insert(7, properties.getBucketName() + "."); - } else if (StringUtils.containsAnyIgnoreCase(endpoint, "https://")) { - sb.insert(8, properties.getBucketName() + "."); - } else { - throw new OssException("Endpoint配置错误"); - } - return sb.toString(); - } + @Override + public String getEndpointLink() { + String endpoint = properties.getEndpoint(); + StringBuilder sb = new StringBuilder(endpoint); + if (StringUtils.containsAnyIgnoreCase(endpoint, "http://")) { + sb.insert(7, properties.getBucketName() + "."); + } else if (StringUtils.containsAnyIgnoreCase(endpoint, "https://")) { + sb.insert(8, properties.getBucketName() + "."); + } else { + throw new OssException("Endpoint配置错误"); + } + return sb.toString(); + } } diff --git a/ruoyi/src/main/java/com/ruoyi/oss/service/impl/QiniuOssStrategy.java b/ruoyi/src/main/java/com/ruoyi/oss/service/impl/QiniuOssStrategy.java index bf90aa824..20f13eca1 100644 --- a/ruoyi/src/main/java/com/ruoyi/oss/service/impl/QiniuOssStrategy.java +++ b/ruoyi/src/main/java/com/ruoyi/oss/service/impl/QiniuOssStrategy.java @@ -7,11 +7,13 @@ import com.qiniu.storage.Configuration; import com.qiniu.storage.Region; import com.qiniu.storage.UploadManager; import com.qiniu.util.Auth; +import com.ruoyi.oss.constant.OssConstant; import com.ruoyi.oss.entity.UploadResult; import com.ruoyi.oss.enumd.OssEnumd; import com.ruoyi.oss.exception.OssException; import com.ruoyi.oss.properties.OssProperties; import com.ruoyi.oss.service.abstractd.AbstractOssStrategy; +import org.springframework.stereotype.Component; import java.io.InputStream; @@ -20,108 +22,106 @@ import java.io.InputStream; * * @author Lion Li */ +@Component public class QiniuOssStrategy extends AbstractOssStrategy { - private UploadManager uploadManager; - private BucketManager bucketManager; - private Auth auth; + private UploadManager uploadManager; + private BucketManager bucketManager; + private Auth auth; - @Override - public void init(OssProperties cloudStorageProperties) { - properties = cloudStorageProperties; - try { - Configuration config = new Configuration(getRegion(properties.getRegion())); - // https设置 - config.useHttpsDomains = false; - config.useHttpsDomains = "Y".equals(properties.getIsHttps()); - uploadManager = new UploadManager(config); - auth = Auth.create(properties.getAccessKey(), properties.getSecretKey()); - String bucketName = properties.getBucketName(); - bucketManager = new BucketManager(auth, config); - if (!ArrayUtil.contains(bucketManager.buckets(), bucketName)) { - bucketManager.createBucket(bucketName, properties.getRegion()); - } - } catch (Exception e) { - throw new OssException("七牛云存储配置错误! 请检查系统配置:[" + e.getMessage() + "]"); - } - } + @Override + public void init(OssProperties ossProperties) { + super.init(ossProperties); + try { + Configuration config = new Configuration(getRegion(properties.getRegion())); + // https设置 + config.useHttpsDomains = OssConstant.IS_HTTPS.equals(properties.getIsHttps()); + uploadManager = new UploadManager(config); + auth = Auth.create(properties.getAccessKey(), properties.getSecretKey()); + bucketManager = new BucketManager(auth, config); + createBucket(); + } catch (Exception e) { + throw new OssException("七牛云存储配置错误! 请检查系统配置:[" + e.getMessage() + "]"); + } + isInit = true; + } - @Override - public void createBucket() { - try { - String bucketName = properties.getBucketName(); - if (ArrayUtil.contains(bucketManager.buckets(), bucketName)) { - return; - } - bucketManager.createBucket(bucketName, properties.getRegion()); - } catch (Exception e) { - throw new OssException("创建Bucket失败, 请核对七牛云配置信息:[" + e.getMessage() + "]"); - } - } + @Override + public void createBucket() { + try { + String bucketName = properties.getBucketName(); + if (ArrayUtil.contains(bucketManager.buckets(), bucketName)) { + return; + } + bucketManager.createBucket(bucketName, properties.getRegion()); + } catch (Exception e) { + throw new OssException("创建Bucket失败, 请核对七牛云配置信息:[" + e.getMessage() + "]"); + } + } - @Override - public String getServiceType() { - return OssEnumd.QINIU.getValue(); - } + @Override + public OssEnumd getServiceType() { + return OssEnumd.QINIU; + } - @Override - public UploadResult upload(byte[] data, String path, String contentType) { - try { + @Override + public UploadResult upload(byte[] data, String path, String contentType) { + try { String token = auth.uploadToken(properties.getBucketName()); Response res = uploadManager.put(data, path, token, null, contentType, false); - if (!res.isOK()) { - throw new RuntimeException("上传七牛出错:" + res.error); - } - } catch (Exception e) { - throw new OssException("上传文件失败,请核对七牛配置信息:[" + e.getMessage() + "]"); - } - return new UploadResult().setUrl(getEndpointLink() + "/" + path).setFilename(path); - } + if (!res.isOK()) { + throw new RuntimeException("上传七牛出错:" + res.error); + } + } catch (Exception e) { + throw new OssException("上传文件失败,请核对七牛配置信息:[" + e.getMessage() + "]"); + } + return UploadResult.builder().url(getEndpointLink() + "/" + path).filename(path).build(); + } - @Override - public void delete(String path) { - try { - path = path.replace(getEndpointLink() + "/", ""); - Response res = bucketManager.delete(properties.getBucketName(), path); - if (!res.isOK()) { - throw new RuntimeException("删除七牛文件出错:" + res.error); - } - } catch (Exception e) { - throw new OssException(e.getMessage()); - } - } + @Override + public void delete(String path) { + try { + path = path.replace(getEndpointLink() + "/", ""); + Response res = bucketManager.delete(properties.getBucketName(), path); + if (!res.isOK()) { + throw new RuntimeException("删除七牛文件出错:" + res.error); + } + } catch (Exception e) { + throw new OssException(e.getMessage()); + } + } - @Override - public UploadResult uploadSuffix(byte[] data, String suffix, String contentType) { - return upload(data, getPath(properties.getPrefix(), suffix), contentType); - } + @Override + public UploadResult uploadSuffix(byte[] data, String suffix, String contentType) { + return upload(data, getPath(properties.getPrefix(), suffix), contentType); + } - @Override - public UploadResult uploadSuffix(InputStream inputStream, String suffix, String contentType) { - return upload(inputStream, getPath(properties.getPrefix(), suffix), contentType); - } + @Override + public UploadResult uploadSuffix(InputStream inputStream, String suffix, String contentType) { + return upload(inputStream, getPath(properties.getPrefix(), suffix), contentType); + } - @Override - public String getEndpointLink() { - return properties.getEndpoint(); - } + @Override + public String getEndpointLink() { + return properties.getEndpoint(); + } - private Region getRegion(String region) { - switch (region) { - case "z0": - return Region.region0(); - case "z1": - return Region.region1(); - case "z2": - return Region.region2(); - case "na0": - return Region.regionNa0(); - case "as0": - return Region.regionAs0(); - default: - return Region.autoRegion(); - } - } + private Region getRegion(String region) { + switch (region) { + case "z0": + return Region.region0(); + case "z1": + return Region.region1(); + case "z2": + return Region.region2(); + case "na0": + return Region.regionNa0(); + case "as0": + return Region.regionAs0(); + default: + return Region.autoRegion(); + } + } } diff --git a/ruoyi/src/main/java/com/ruoyi/system/domain/SysConfig.java b/ruoyi/src/main/java/com/ruoyi/system/domain/SysConfig.java index 3b9fce0b5..b1091b458 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/domain/SysConfig.java +++ b/ruoyi/src/main/java/com/ruoyi/system/domain/SysConfig.java @@ -11,7 +11,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; @@ -24,7 +23,6 @@ import javax.validation.constraints.Size; @Data @EqualsAndHashCode(callSuper = true) -@Accessors(chain = true) @TableName("sys_config") @ExcelIgnoreUnannotated @ApiModel("参数配置业务对象") @@ -70,7 +68,7 @@ public class SysConfig extends BaseEntity { */ @ApiModelProperty(value = "系统内置(Y是 N否)") @ExcelProperty(value = "系统内置", converter = ExcelDictConvert.class) - @ExcelDictFormat(dictType = "sys_yes_no") + @ExcelDictFormat(dictType = "sys_yes_no") private String configType; /** diff --git a/ruoyi/src/main/java/com/ruoyi/system/domain/SysLogininfor.java b/ruoyi/src/main/java/com/ruoyi/system/domain/SysLogininfor.java index a1575378d..de095ec38 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/domain/SysLogininfor.java +++ b/ruoyi/src/main/java/com/ruoyi/system/domain/SysLogininfor.java @@ -10,7 +10,6 @@ import com.ruoyi.common.convert.ExcelDictConvert; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import lombok.experimental.Accessors; import java.io.Serializable; import java.util.Date; @@ -24,7 +23,6 @@ import java.util.Map; */ @Data -@Accessors(chain = true) @TableName("sys_logininfor") @ExcelIgnoreUnannotated @ApiModel("系统访问记录业务对象") diff --git a/ruoyi/src/main/java/com/ruoyi/system/domain/SysNotice.java b/ruoyi/src/main/java/com/ruoyi/system/domain/SysNotice.java index aa855a326..2371bb7e5 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/domain/SysNotice.java +++ b/ruoyi/src/main/java/com/ruoyi/system/domain/SysNotice.java @@ -7,7 +7,6 @@ import com.ruoyi.common.xss.Xss; 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; @@ -20,7 +19,6 @@ import javax.validation.constraints.Size; */ @Data @EqualsAndHashCode(callSuper = true) -@Accessors(chain = true) @TableName("sys_notice") public class SysNotice extends BaseEntity { diff --git a/ruoyi/src/main/java/com/ruoyi/system/domain/SysOperLog.java b/ruoyi/src/main/java/com/ruoyi/system/domain/SysOperLog.java index 84ab555ec..f6f373776 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/domain/SysOperLog.java +++ b/ruoyi/src/main/java/com/ruoyi/system/domain/SysOperLog.java @@ -10,7 +10,6 @@ import com.ruoyi.common.convert.ExcelDictConvert; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import lombok.experimental.Accessors; import java.io.Serializable; import java.util.Date; @@ -24,7 +23,6 @@ import java.util.Map; */ @Data -@Accessors(chain = true) @TableName("sys_oper_log") @ExcelIgnoreUnannotated @ApiModel("操作日志记录业务对象") @@ -52,7 +50,7 @@ public class SysOperLog implements Serializable { */ @ApiModelProperty(value = "业务类型(0其它 1新增 2修改 3删除)") @ExcelProperty(value = "业务类型", converter = ExcelDictConvert.class) - @ExcelDictFormat(dictType = "sys_oper_type") + @ExcelDictFormat(dictType = "sys_oper_type") private Integer businessType; /** @@ -81,7 +79,7 @@ public class SysOperLog implements Serializable { */ @ApiModelProperty(value = "操作类别(0其它 1后台用户 2手机端用户)") @ExcelProperty(value = "操作类别", converter = ExcelDictConvert.class) - @ExcelDictFormat(readConverterExp = "0=其它,1=后台用户,2=手机端用户") + @ExcelDictFormat(readConverterExp = "0=其它,1=后台用户,2=手机端用户") private Integer operatorType; /** @@ -138,7 +136,7 @@ public class SysOperLog implements Serializable { */ @ApiModelProperty(value = "操作状态(0正常 1异常)") @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) - @ExcelDictFormat(dictType = "sys_common_status") + @ExcelDictFormat(dictType = "sys_common_status") private Integer status; /** diff --git a/ruoyi/src/main/java/com/ruoyi/system/domain/SysOss.java b/ruoyi/src/main/java/com/ruoyi/system/domain/SysOss.java index 0793d04fe..711dd8361 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/domain/SysOss.java +++ b/ruoyi/src/main/java/com/ruoyi/system/domain/SysOss.java @@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.annotation.TableName; import com.ruoyi.common.core.domain.BaseEntity; import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; /** * OSS对象存储对象 @@ -15,39 +14,38 @@ import lombok.experimental.Accessors; */ @Data @EqualsAndHashCode(callSuper = true) -@Accessors(chain = true) @TableName("sys_oss") public class SysOss extends BaseEntity { - /** - * 对象存储主键 - */ - @TableId(value = "oss_id", type = IdType.AUTO) - private Long ossId; + /** + * 对象存储主键 + */ + @TableId(value = "oss_id", type = IdType.AUTO) + private Long ossId; - /** - * 文件名 - */ - private String fileName; + /** + * 文件名 + */ + private String fileName; - /** - * 原名 - */ - private String originalName; + /** + * 原名 + */ + private String originalName; - /** - * 文件后缀名 - */ - private String fileSuffix; + /** + * 文件后缀名 + */ + private String fileSuffix; - /** - * URL地址 - */ - private String url; + /** + * URL地址 + */ + private String url; - /** - * 服务商 - */ - private String service; + /** + * 服务商 + */ + private String service; } diff --git a/ruoyi/src/main/java/com/ruoyi/system/domain/SysOssConfig.java b/ruoyi/src/main/java/com/ruoyi/system/domain/SysOssConfig.java index 775da2ba8..a8340df77 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/domain/SysOssConfig.java +++ b/ruoyi/src/main/java/com/ruoyi/system/domain/SysOssConfig.java @@ -14,7 +14,6 @@ import lombok.experimental.Accessors; */ @Data @EqualsAndHashCode(callSuper = true) -@Accessors(chain = true) @TableName("sys_oss_config") public class SysOssConfig extends BaseEntity { diff --git a/ruoyi/src/main/java/com/ruoyi/system/domain/SysPost.java b/ruoyi/src/main/java/com/ruoyi/system/domain/SysPost.java index b0b8a11e5..80bf275c1 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/domain/SysPost.java +++ b/ruoyi/src/main/java/com/ruoyi/system/domain/SysPost.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_post") @ExcelIgnoreUnannotated @ApiModel("岗位信息业务对象") @@ -69,8 +67,8 @@ public class SysPost extends BaseEntity { * 状态(0正常 1停用) */ @ApiModelProperty(value = "状态(0正常 1停用)") - @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) - @ExcelDictFormat(dictType = "sys_common_status") + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_common_status") private String status; /** diff --git a/ruoyi/src/main/java/com/ruoyi/system/domain/SysRoleDept.java b/ruoyi/src/main/java/com/ruoyi/system/domain/SysRoleDept.java index 8c93badab..c3043c253 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/domain/SysRoleDept.java +++ b/ruoyi/src/main/java/com/ruoyi/system/domain/SysRoleDept.java @@ -1,10 +1,11 @@ package com.ruoyi.system.domain; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import lombok.experimental.Accessors; /** * 角色和部门关联 sys_role_dept @@ -13,7 +14,6 @@ import lombok.experimental.Accessors; */ @Data -@Accessors(chain = true) @TableName("sys_role_dept") @ApiModel("角色和部门关联") public class SysRoleDept { @@ -21,6 +21,7 @@ public class SysRoleDept { /** * 角色ID */ + @TableId(type = IdType.INPUT) @ApiModelProperty(value = "角色ID") private Long roleId; diff --git a/ruoyi/src/main/java/com/ruoyi/system/domain/SysRoleMenu.java b/ruoyi/src/main/java/com/ruoyi/system/domain/SysRoleMenu.java index aa819c706..f3e4dd7c2 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/domain/SysRoleMenu.java +++ b/ruoyi/src/main/java/com/ruoyi/system/domain/SysRoleMenu.java @@ -1,10 +1,11 @@ package com.ruoyi.system.domain; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import lombok.experimental.Accessors; /** * 角色和菜单关联 sys_role_menu @@ -13,7 +14,6 @@ import lombok.experimental.Accessors; */ @Data -@Accessors(chain = true) @TableName("sys_role_menu") @ApiModel("角色和菜单关联") public class SysRoleMenu { @@ -21,6 +21,7 @@ public class SysRoleMenu { /** * 角色ID */ + @TableId(type = IdType.INPUT) @ApiModelProperty(value = "角色ID") private Long roleId; diff --git a/ruoyi/src/main/java/com/ruoyi/system/domain/SysUserOnline.java b/ruoyi/src/main/java/com/ruoyi/system/domain/SysUserOnline.java index f81508c8c..605d1645b 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/domain/SysUserOnline.java +++ b/ruoyi/src/main/java/com/ruoyi/system/domain/SysUserOnline.java @@ -3,7 +3,6 @@ package com.ruoyi.system.domain; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import lombok.experimental.Accessors; /** * 当前在线会话 @@ -12,7 +11,6 @@ import lombok.experimental.Accessors; */ @Data -@Accessors(chain = true) @ApiModel("当前在线会话业务对象") public class SysUserOnline { diff --git a/ruoyi/src/main/java/com/ruoyi/system/domain/SysUserPost.java b/ruoyi/src/main/java/com/ruoyi/system/domain/SysUserPost.java index f6694e37d..243e3c8ae 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/domain/SysUserPost.java +++ b/ruoyi/src/main/java/com/ruoyi/system/domain/SysUserPost.java @@ -1,10 +1,11 @@ package com.ruoyi.system.domain; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import lombok.experimental.Accessors; /** * 用户和岗位关联 sys_user_post @@ -13,7 +14,6 @@ import lombok.experimental.Accessors; */ @Data -@Accessors(chain = true) @TableName("sys_user_post") @ApiModel("用户和岗位关联") public class SysUserPost { @@ -21,6 +21,7 @@ public class SysUserPost { /** * 用户ID */ + @TableId(type = IdType.INPUT) @ApiModelProperty(value = "用户ID") private Long userId; diff --git a/ruoyi/src/main/java/com/ruoyi/system/domain/SysUserRole.java b/ruoyi/src/main/java/com/ruoyi/system/domain/SysUserRole.java index fd4e2e5b0..5fa712a4b 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/domain/SysUserRole.java +++ b/ruoyi/src/main/java/com/ruoyi/system/domain/SysUserRole.java @@ -1,10 +1,11 @@ package com.ruoyi.system.domain; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import lombok.experimental.Accessors; /** * 用户和角色关联 sys_user_role @@ -13,7 +14,6 @@ import lombok.experimental.Accessors; */ @Data -@Accessors(chain = true) @TableName("sys_user_role") @ApiModel("用户和角色关联") public class SysUserRole { @@ -21,6 +21,7 @@ public class SysUserRole { /** * 用户ID */ + @TableId(type = IdType.INPUT) @ApiModelProperty(value = "用户ID") private Long userId; diff --git a/ruoyi/src/main/java/com/ruoyi/system/domain/vo/MetaVo.java b/ruoyi/src/main/java/com/ruoyi/system/domain/vo/MetaVo.java index 6a3798adb..d3e1a353a 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/domain/vo/MetaVo.java +++ b/ruoyi/src/main/java/com/ruoyi/system/domain/vo/MetaVo.java @@ -4,7 +4,6 @@ import com.ruoyi.common.utils.StringUtils; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import lombok.experimental.Accessors; /** * 路由显示信息 @@ -13,7 +12,6 @@ import lombok.experimental.Accessors; */ @Data -@Accessors(chain = true) @ApiModel("路由显示信息") public class MetaVo { diff --git a/ruoyi/src/main/java/com/ruoyi/system/domain/vo/RouterVo.java b/ruoyi/src/main/java/com/ruoyi/system/domain/vo/RouterVo.java index 05ba451d7..a451bb95b 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/domain/vo/RouterVo.java +++ b/ruoyi/src/main/java/com/ruoyi/system/domain/vo/RouterVo.java @@ -4,7 +4,6 @@ import com.fasterxml.jackson.annotation.JsonInclude; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import lombok.experimental.Accessors; import java.util.List; @@ -14,7 +13,6 @@ import java.util.List; * @author Lion Li */ @Data -@Accessors(chain = true) @JsonInclude(JsonInclude.Include.NON_EMPTY) @ApiModel("路由配置信息") public class RouterVo { diff --git a/ruoyi/src/main/java/com/ruoyi/system/domain/vo/SysUserExportVo.java b/ruoyi/src/main/java/com/ruoyi/system/domain/vo/SysUserExportVo.java index c43c8a5c3..683cb83fa 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/domain/vo/SysUserExportVo.java +++ b/ruoyi/src/main/java/com/ruoyi/system/domain/vo/SysUserExportVo.java @@ -5,7 +5,6 @@ import com.ruoyi.common.annotation.ExcelDictFormat; import com.ruoyi.common.convert.ExcelDictConvert; import lombok.Data; import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; import java.io.Serializable; import java.util.Date; @@ -18,7 +17,6 @@ import java.util.Date; @Data @NoArgsConstructor -@Accessors(chain = true) public class SysUserExportVo implements Serializable { private static final long serialVersionUID = 1L; diff --git a/ruoyi/src/main/java/com/ruoyi/system/listener/SysUserImportListener.java b/ruoyi/src/main/java/com/ruoyi/system/listener/SysUserImportListener.java index 3b700d48c..58f2f3136 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/listener/SysUserImportListener.java +++ b/ruoyi/src/main/java/com/ruoyi/system/listener/SysUserImportListener.java @@ -1,14 +1,15 @@ package com.ruoyi.system.listener; +import cn.dev33.satoken.secure.BCrypt; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.excel.ExcelListener; import com.ruoyi.common.excel.ExcelResult; import com.ruoyi.common.exception.ServiceException; -import com.ruoyi.common.utils.SecurityUtils; -import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.helper.LoginHelper; import com.ruoyi.common.utils.ValidatorUtils; import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.system.domain.vo.SysUserImportVo; @@ -42,9 +43,9 @@ public class SysUserImportListener extends AnalysisEventListener { +public interface SysConfigMapper extends BaseMapperPlus { } diff --git a/ruoyi/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java b/ruoyi/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java index 317be7e3c..5c7e68b96 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java +++ b/ruoyi/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java @@ -3,7 +3,7 @@ package com.ruoyi.system.mapper; import com.ruoyi.common.annotation.DataColumn; import com.ruoyi.common.annotation.DataPermission; import com.ruoyi.common.core.domain.entity.SysDept; -import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus; +import com.ruoyi.common.core.mapper.BaseMapperPlus; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -13,7 +13,7 @@ import java.util.List; * * @author Lion Li */ -public interface SysDeptMapper extends BaseMapperPlus { +public interface SysDeptMapper extends BaseMapperPlus { /** * 查询部门管理数据 diff --git a/ruoyi/src/main/java/com/ruoyi/system/mapper/SysDictDataMapper.java b/ruoyi/src/main/java/com/ruoyi/system/mapper/SysDictDataMapper.java index e45c198d0..0d506bc06 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/mapper/SysDictDataMapper.java +++ b/ruoyi/src/main/java/com/ruoyi/system/mapper/SysDictDataMapper.java @@ -1,8 +1,9 @@ package com.ruoyi.system.mapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.domain.entity.SysDictData; -import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus; +import com.ruoyi.common.core.mapper.BaseMapperPlus; import java.util.List; @@ -11,13 +12,13 @@ import java.util.List; * * @author Lion Li */ -public interface SysDictDataMapper extends BaseMapperPlus { +public interface SysDictDataMapper extends BaseMapperPlus { default List selectDictDataByType(String dictType) { return selectList( - new LambdaQueryWrapper() - .eq(SysDictData::getStatus, "0") - .eq(SysDictData::getDictType, dictType) - .orderByAsc(SysDictData::getDictSort)); + new LambdaQueryWrapper() + .eq(SysDictData::getStatus, UserConstants.DICT_NORMAL) + .eq(SysDictData::getDictType, dictType) + .orderByAsc(SysDictData::getDictSort)); } } diff --git a/ruoyi/src/main/java/com/ruoyi/system/mapper/SysDictTypeMapper.java b/ruoyi/src/main/java/com/ruoyi/system/mapper/SysDictTypeMapper.java index 7e03a2504..7107aedc8 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/mapper/SysDictTypeMapper.java +++ b/ruoyi/src/main/java/com/ruoyi/system/mapper/SysDictTypeMapper.java @@ -1,13 +1,13 @@ package com.ruoyi.system.mapper; import com.ruoyi.common.core.domain.entity.SysDictType; -import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus; +import com.ruoyi.common.core.mapper.BaseMapperPlus; /** * 字典表 数据层 * * @author Lion Li */ -public interface SysDictTypeMapper extends BaseMapperPlus { +public interface SysDictTypeMapper extends BaseMapperPlus { } diff --git a/ruoyi/src/main/java/com/ruoyi/system/mapper/SysLogininforMapper.java b/ruoyi/src/main/java/com/ruoyi/system/mapper/SysLogininforMapper.java index fe47417f0..b74f3ff54 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/mapper/SysLogininforMapper.java +++ b/ruoyi/src/main/java/com/ruoyi/system/mapper/SysLogininforMapper.java @@ -1,6 +1,6 @@ package com.ruoyi.system.mapper; -import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus; +import com.ruoyi.common.core.mapper.BaseMapperPlus; import com.ruoyi.system.domain.SysLogininfor; /** @@ -8,6 +8,6 @@ import com.ruoyi.system.domain.SysLogininfor; * * @author Lion Li */ -public interface SysLogininforMapper extends BaseMapperPlus { +public interface SysLogininforMapper extends BaseMapperPlus { } diff --git a/ruoyi/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java b/ruoyi/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java index f1a018ff6..3b37ae97d 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java +++ b/ruoyi/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java @@ -1,7 +1,7 @@ package com.ruoyi.system.mapper; import com.ruoyi.common.core.domain.entity.SysMenu; -import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus; +import com.ruoyi.common.core.mapper.BaseMapperPlus; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -11,7 +11,7 @@ import java.util.List; * * @author Lion Li */ -public interface SysMenuMapper extends BaseMapperPlus { +public interface SysMenuMapper extends BaseMapperPlus { /** * 根据用户所有权限 diff --git a/ruoyi/src/main/java/com/ruoyi/system/mapper/SysNoticeMapper.java b/ruoyi/src/main/java/com/ruoyi/system/mapper/SysNoticeMapper.java index de972ff1f..69fa3baf4 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/mapper/SysNoticeMapper.java +++ b/ruoyi/src/main/java/com/ruoyi/system/mapper/SysNoticeMapper.java @@ -1,6 +1,6 @@ package com.ruoyi.system.mapper; -import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus; +import com.ruoyi.common.core.mapper.BaseMapperPlus; import com.ruoyi.system.domain.SysNotice; /** @@ -8,6 +8,6 @@ import com.ruoyi.system.domain.SysNotice; * * @author Lion Li */ -public interface SysNoticeMapper extends BaseMapperPlus { +public interface SysNoticeMapper extends BaseMapperPlus { } diff --git a/ruoyi/src/main/java/com/ruoyi/system/mapper/SysOperLogMapper.java b/ruoyi/src/main/java/com/ruoyi/system/mapper/SysOperLogMapper.java index c1c3b5411..bbb265dd6 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/mapper/SysOperLogMapper.java +++ b/ruoyi/src/main/java/com/ruoyi/system/mapper/SysOperLogMapper.java @@ -1,6 +1,6 @@ package com.ruoyi.system.mapper; -import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus; +import com.ruoyi.common.core.mapper.BaseMapperPlus; import com.ruoyi.system.domain.SysOperLog; /** @@ -8,6 +8,6 @@ import com.ruoyi.system.domain.SysOperLog; * * @author Lion Li */ -public interface SysOperLogMapper extends BaseMapperPlus { +public interface SysOperLogMapper extends BaseMapperPlus { } diff --git a/ruoyi/src/main/java/com/ruoyi/system/mapper/SysOssConfigMapper.java b/ruoyi/src/main/java/com/ruoyi/system/mapper/SysOssConfigMapper.java index db63709ba..72f29a7e3 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/mapper/SysOssConfigMapper.java +++ b/ruoyi/src/main/java/com/ruoyi/system/mapper/SysOssConfigMapper.java @@ -1,7 +1,8 @@ package com.ruoyi.system.mapper; -import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus; +import com.ruoyi.common.core.mapper.BaseMapperPlus; import com.ruoyi.system.domain.SysOssConfig; +import com.ruoyi.system.domain.vo.SysOssConfigVo; /** * 对象存储配置Mapper接口 @@ -10,6 +11,6 @@ import com.ruoyi.system.domain.SysOssConfig; * @author 孤舟烟雨 * @date 2021-08-13 */ -public interface SysOssConfigMapper extends BaseMapperPlus { +public interface SysOssConfigMapper extends BaseMapperPlus { } diff --git a/ruoyi/src/main/java/com/ruoyi/system/mapper/SysOssMapper.java b/ruoyi/src/main/java/com/ruoyi/system/mapper/SysOssMapper.java index 8eee53b63..edbaed6f4 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/mapper/SysOssMapper.java +++ b/ruoyi/src/main/java/com/ruoyi/system/mapper/SysOssMapper.java @@ -1,12 +1,13 @@ package com.ruoyi.system.mapper; -import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus; +import com.ruoyi.common.core.mapper.BaseMapperPlus; import com.ruoyi.system.domain.SysOss; +import com.ruoyi.system.domain.vo.SysOssVo; /** * 文件上传 数据层 * * @author Lion Li */ -public interface SysOssMapper extends BaseMapperPlus { +public interface SysOssMapper extends BaseMapperPlus { } diff --git a/ruoyi/src/main/java/com/ruoyi/system/mapper/SysPostMapper.java b/ruoyi/src/main/java/com/ruoyi/system/mapper/SysPostMapper.java index 2e305cf05..733049412 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/mapper/SysPostMapper.java +++ b/ruoyi/src/main/java/com/ruoyi/system/mapper/SysPostMapper.java @@ -1,6 +1,6 @@ package com.ruoyi.system.mapper; -import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus; +import com.ruoyi.common.core.mapper.BaseMapperPlus; import com.ruoyi.system.domain.SysPost; import java.util.List; @@ -10,7 +10,7 @@ import java.util.List; * * @author Lion Li */ -public interface SysPostMapper extends BaseMapperPlus { +public interface SysPostMapper extends BaseMapperPlus { /** * 根据用户ID获取岗位选择框列表 diff --git a/ruoyi/src/main/java/com/ruoyi/system/mapper/SysRoleDeptMapper.java b/ruoyi/src/main/java/com/ruoyi/system/mapper/SysRoleDeptMapper.java index bf91a9273..0428d9841 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/mapper/SysRoleDeptMapper.java +++ b/ruoyi/src/main/java/com/ruoyi/system/mapper/SysRoleDeptMapper.java @@ -1,6 +1,6 @@ package com.ruoyi.system.mapper; -import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus; +import com.ruoyi.common.core.mapper.BaseMapperPlus; import com.ruoyi.system.domain.SysRoleDept; /** @@ -8,6 +8,6 @@ import com.ruoyi.system.domain.SysRoleDept; * * @author Lion Li */ -public interface SysRoleDeptMapper extends BaseMapperPlus { +public interface SysRoleDeptMapper extends BaseMapperPlus { } diff --git a/ruoyi/src/main/java/com/ruoyi/system/mapper/SysRoleMapper.java b/ruoyi/src/main/java/com/ruoyi/system/mapper/SysRoleMapper.java index d2721ee4d..e37116d9a 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/mapper/SysRoleMapper.java +++ b/ruoyi/src/main/java/com/ruoyi/system/mapper/SysRoleMapper.java @@ -4,7 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 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.mybatisplus.core.BaseMapperPlus; +import com.ruoyi.common.core.mapper.BaseMapperPlus; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -14,7 +14,7 @@ import java.util.List; * * @author Lion Li */ -public interface SysRoleMapper extends BaseMapperPlus { +public interface SysRoleMapper extends BaseMapperPlus { @DataPermission({ @DataColumn(key = "deptName", value = "d.dept_id") diff --git a/ruoyi/src/main/java/com/ruoyi/system/mapper/SysRoleMenuMapper.java b/ruoyi/src/main/java/com/ruoyi/system/mapper/SysRoleMenuMapper.java index f92ebbb0f..e9987cce1 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/mapper/SysRoleMenuMapper.java +++ b/ruoyi/src/main/java/com/ruoyi/system/mapper/SysRoleMenuMapper.java @@ -1,6 +1,6 @@ package com.ruoyi.system.mapper; -import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus; +import com.ruoyi.common.core.mapper.BaseMapperPlus; import com.ruoyi.system.domain.SysRoleMenu; /** @@ -8,6 +8,6 @@ import com.ruoyi.system.domain.SysRoleMenu; * * @author Lion Li */ -public interface SysRoleMenuMapper extends BaseMapperPlus { +public interface SysRoleMenuMapper extends BaseMapperPlus { } diff --git a/ruoyi/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java b/ruoyi/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java index 1a07f7f92..74b2943f8 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java +++ b/ruoyi/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java @@ -4,7 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.annotation.DataColumn; import com.ruoyi.common.annotation.DataPermission; import com.ruoyi.common.core.domain.entity.SysUser; -import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus; +import com.ruoyi.common.core.mapper.BaseMapperPlus; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -14,7 +14,7 @@ import java.util.List; * * @author Lion Li */ -public interface SysUserMapper extends BaseMapperPlus { +public interface SysUserMapper extends BaseMapperPlus { @DataPermission({ @DataColumn(key = "deptName", value = "d.dept_id"), @@ -35,7 +35,7 @@ public interface SysUserMapper extends BaseMapperPlus { List selectUserList(SysUser sysUser); /** - * 根据条件分页查询未已配用户角色列表 + * 根据条件分页查询已配用户角色列表 * * @param user 用户信息 * @return 用户信息集合信息 diff --git a/ruoyi/src/main/java/com/ruoyi/system/mapper/SysUserPostMapper.java b/ruoyi/src/main/java/com/ruoyi/system/mapper/SysUserPostMapper.java index e0f1bb049..1af9b2459 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/mapper/SysUserPostMapper.java +++ b/ruoyi/src/main/java/com/ruoyi/system/mapper/SysUserPostMapper.java @@ -1,6 +1,6 @@ package com.ruoyi.system.mapper; -import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus; +import com.ruoyi.common.core.mapper.BaseMapperPlus; import com.ruoyi.system.domain.SysUserPost; /** @@ -8,6 +8,6 @@ import com.ruoyi.system.domain.SysUserPost; * * @author Lion Li */ -public interface SysUserPostMapper extends BaseMapperPlus { +public interface SysUserPostMapper extends BaseMapperPlus { } diff --git a/ruoyi/src/main/java/com/ruoyi/system/mapper/SysUserRoleMapper.java b/ruoyi/src/main/java/com/ruoyi/system/mapper/SysUserRoleMapper.java index 052599cf7..f9dd16789 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/mapper/SysUserRoleMapper.java +++ b/ruoyi/src/main/java/com/ruoyi/system/mapper/SysUserRoleMapper.java @@ -1,6 +1,6 @@ package com.ruoyi.system.mapper; -import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus; +import com.ruoyi.common.core.mapper.BaseMapperPlus; import com.ruoyi.system.domain.SysUserRole; /** @@ -8,6 +8,6 @@ import com.ruoyi.system.domain.SysUserRole; * * @author Lion Li */ -public interface SysUserRoleMapper extends BaseMapperPlus { +public interface SysUserRoleMapper extends BaseMapperPlus { } diff --git a/ruoyi/src/main/java/com/ruoyi/system/runner/SystemApplicationRunner.java b/ruoyi/src/main/java/com/ruoyi/system/runner/SystemApplicationRunner.java index 4080a1ac3..e9ad6ee15 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/runner/SystemApplicationRunner.java +++ b/ruoyi/src/main/java/com/ruoyi/system/runner/SystemApplicationRunner.java @@ -6,7 +6,6 @@ import com.ruoyi.system.service.ISysDictTypeService; import com.ruoyi.system.service.ISysOssConfigService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.stereotype.Component; @@ -17,7 +16,7 @@ import org.springframework.stereotype.Component; * @author Lion Li */ @Slf4j -@RequiredArgsConstructor(onConstructor_ = @Autowired) +@RequiredArgsConstructor @Component public class SystemApplicationRunner implements ApplicationRunner { @@ -30,7 +29,7 @@ public class SystemApplicationRunner implements ApplicationRunner { public void run(ApplicationArguments args) throws Exception { ossConfigService.init(); log.info("初始化OSS配置成功"); - if (ruoyiConfig.isCacheLazy()){ + if (ruoyiConfig.isCacheLazy()) { return; } configService.loadingConfigCache(); diff --git a/ruoyi/src/main/java/com/ruoyi/system/service/ISysConfigService.java b/ruoyi/src/main/java/com/ruoyi/system/service/ISysConfigService.java index b7233896e..10c4acdd7 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/service/ISysConfigService.java +++ b/ruoyi/src/main/java/com/ruoyi/system/service/ISysConfigService.java @@ -1,6 +1,5 @@ package com.ruoyi.system.service; -import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.system.domain.SysConfig; @@ -12,7 +11,7 @@ import java.util.List; * * @author Lion Li */ -public interface ISysConfigService extends IService { +public interface ISysConfigService { TableDataInfo selectPageConfigList(SysConfig config, PageQuery pageQuery); @@ -68,7 +67,6 @@ public interface ISysConfigService extends IService { * 批量删除参数信息 * * @param configIds 需要删除的参数ID - * @return 结果 */ void deleteConfigByIds(Long[] configIds); @@ -94,4 +92,7 @@ public interface ISysConfigService extends IService { * @return 结果 */ String checkConfigKeyUnique(SysConfig config); + + SysConfig getOne(SysConfig config); + } diff --git a/ruoyi/src/main/java/com/ruoyi/system/service/SysDataScopeService.java b/ruoyi/src/main/java/com/ruoyi/system/service/ISysDataScopeService.java similarity index 88% rename from ruoyi/src/main/java/com/ruoyi/system/service/SysDataScopeService.java rename to ruoyi/src/main/java/com/ruoyi/system/service/ISysDataScopeService.java index 34e2ea33c..4ad4e45d3 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/service/SysDataScopeService.java +++ b/ruoyi/src/main/java/com/ruoyi/system/service/ISysDataScopeService.java @@ -5,10 +5,11 @@ package com.ruoyi.system.service; * * @author Lion Li */ -public interface SysDataScopeService { +public interface ISysDataScopeService { /** * 获取角色自定义权限 + * * @param roleId 角色id * @return 部门id组 */ @@ -16,6 +17,7 @@ public interface SysDataScopeService { /** * 获取部门及以下权限 + * * @param deptId 部门id * @return 部门id组 */ diff --git a/ruoyi/src/main/java/com/ruoyi/system/service/ISysDeptService.java b/ruoyi/src/main/java/com/ruoyi/system/service/ISysDeptService.java index 292d43c7b..8508d4f86 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/service/ISysDeptService.java +++ b/ruoyi/src/main/java/com/ruoyi/system/service/ISysDeptService.java @@ -1,7 +1,6 @@ package com.ruoyi.system.service; import cn.hutool.core.lang.tree.Tree; -import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.common.core.domain.entity.SysDept; import java.util.List; @@ -11,7 +10,7 @@ import java.util.List; * * @author Lion Li */ -public interface ISysDeptService extends IService { +public interface ISysDeptService { /** * 查询部门管理数据 * @@ -45,7 +44,7 @@ public interface ISysDeptService extends IService { SysDept selectDeptById(Long deptId); /** - * 根据ID查询所有子部门(正常状态) + * 根据ID查询所有子部门数(正常状态) * * @param deptId 部门ID * @return 子部门数 diff --git a/ruoyi/src/main/java/com/ruoyi/system/service/ISysDictDataService.java b/ruoyi/src/main/java/com/ruoyi/system/service/ISysDictDataService.java index 22259c39e..504032ee1 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/service/ISysDictDataService.java +++ b/ruoyi/src/main/java/com/ruoyi/system/service/ISysDictDataService.java @@ -1,6 +1,5 @@ package com.ruoyi.system.service; -import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.entity.SysDictData; import com.ruoyi.common.core.page.TableDataInfo; @@ -12,7 +11,7 @@ import java.util.List; * * @author Lion Li */ -public interface ISysDictDataService extends IService { +public interface ISysDictDataService { TableDataInfo selectPageDictDataList(SysDictData dictData, PageQuery pageQuery); @@ -46,7 +45,6 @@ public interface ISysDictDataService extends IService { * 批量删除字典数据信息 * * @param dictCodes 需要删除的字典数据ID - * @return 结果 */ void deleteDictDataByIds(Long[] dictCodes); diff --git a/ruoyi/src/main/java/com/ruoyi/system/service/ISysDictTypeService.java b/ruoyi/src/main/java/com/ruoyi/system/service/ISysDictTypeService.java index ba2739835..5966e08c0 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/service/ISysDictTypeService.java +++ b/ruoyi/src/main/java/com/ruoyi/system/service/ISysDictTypeService.java @@ -1,6 +1,5 @@ package com.ruoyi.system.service; -import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.entity.SysDictData; import com.ruoyi.common.core.domain.entity.SysDictType; @@ -13,7 +12,7 @@ import java.util.List; * * @author Lion Li */ -public interface ISysDictTypeService extends IService { +public interface ISysDictTypeService { TableDataInfo selectPageDictTypeList(SysDictType dictType, PageQuery pageQuery); @@ -61,7 +60,6 @@ public interface ISysDictTypeService extends IService { * 批量删除字典信息 * * @param dictIds 需要删除的字典ID - * @return 结果 */ void deleteDictTypeByIds(Long[] dictIds); diff --git a/ruoyi/src/main/java/com/ruoyi/system/service/ISysLogininforService.java b/ruoyi/src/main/java/com/ruoyi/system/service/ISysLogininforService.java index 892a5afbc..f63c7dd1c 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/service/ISysLogininforService.java +++ b/ruoyi/src/main/java/com/ruoyi/system/service/ISysLogininforService.java @@ -1,6 +1,5 @@ package com.ruoyi.system.service; -import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.system.domain.SysLogininfor; @@ -12,7 +11,7 @@ import java.util.List; * * @author Lion Li */ -public interface ISysLogininforService extends IService { +public interface ISysLogininforService { TableDataInfo selectPageLogininforList(SysLogininfor logininfor, PageQuery pageQuery); @@ -36,7 +35,7 @@ public interface ISysLogininforService extends IService { * 批量删除系统登录日志 * * @param infoIds 需要删除的登录日志ID - * @return + * @return 结果 */ int deleteLogininforByIds(Long[] infoIds); diff --git a/ruoyi/src/main/java/com/ruoyi/system/service/ISysMenuService.java b/ruoyi/src/main/java/com/ruoyi/system/service/ISysMenuService.java index 9424052d6..e7b5c9b37 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/service/ISysMenuService.java +++ b/ruoyi/src/main/java/com/ruoyi/system/service/ISysMenuService.java @@ -1,7 +1,6 @@ package com.ruoyi.system.service; import cn.hutool.core.lang.tree.Tree; -import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.common.core.domain.entity.SysMenu; import com.ruoyi.system.domain.vo.RouterVo; @@ -13,7 +12,7 @@ import java.util.Set; * * @author Lion Li */ -public interface ISysMenuService extends IService { +public interface ISysMenuService { /** * 根据用户查询系统菜单列表 diff --git a/ruoyi/src/main/java/com/ruoyi/system/service/ISysNoticeService.java b/ruoyi/src/main/java/com/ruoyi/system/service/ISysNoticeService.java index 6cd946824..a6dbcbf62 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/service/ISysNoticeService.java +++ b/ruoyi/src/main/java/com/ruoyi/system/service/ISysNoticeService.java @@ -1,6 +1,5 @@ package com.ruoyi.system.service; -import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.system.domain.SysNotice; @@ -12,7 +11,7 @@ import java.util.List; * * @author Lion Li */ -public interface ISysNoticeService extends IService { +public interface ISysNoticeService { TableDataInfo selectPageNoticeList(SysNotice notice, PageQuery pageQuery); diff --git a/ruoyi/src/main/java/com/ruoyi/system/service/ISysOperLogService.java b/ruoyi/src/main/java/com/ruoyi/system/service/ISysOperLogService.java index b23f129ec..14ffcfd29 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/service/ISysOperLogService.java +++ b/ruoyi/src/main/java/com/ruoyi/system/service/ISysOperLogService.java @@ -1,6 +1,5 @@ package com.ruoyi.system.service; -import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.system.domain.SysOperLog; @@ -12,7 +11,7 @@ import java.util.List; * * @author Lion Li */ -public interface ISysOperLogService extends IService { +public interface ISysOperLogService { TableDataInfo selectPageOperLogList(SysOperLog operLog, PageQuery pageQuery); diff --git a/ruoyi/src/main/java/com/ruoyi/system/service/ISysOssConfigService.java b/ruoyi/src/main/java/com/ruoyi/system/service/ISysOssConfigService.java index f29b65d66..e62e2d31a 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/service/ISysOssConfigService.java +++ b/ruoyi/src/main/java/com/ruoyi/system/service/ISysOssConfigService.java @@ -1,9 +1,7 @@ package com.ruoyi.system.service; import com.ruoyi.common.core.domain.PageQuery; -import com.ruoyi.common.core.mybatisplus.core.IServicePlus; import com.ruoyi.common.core.page.TableDataInfo; -import com.ruoyi.system.domain.SysOssConfig; import com.ruoyi.system.domain.bo.SysOssConfigBo; import com.ruoyi.system.domain.vo.SysOssConfigVo; @@ -16,7 +14,7 @@ import java.util.Collection; * @author 孤舟烟雨 * @date 2021-08-13 */ -public interface ISysOssConfigService extends IServicePlus { +public interface ISysOssConfigService { /** * 初始化OSS配置 diff --git a/ruoyi/src/main/java/com/ruoyi/system/service/ISysOssService.java b/ruoyi/src/main/java/com/ruoyi/system/service/ISysOssService.java index 866f2c4bd..b444e6d06 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/service/ISysOssService.java +++ b/ruoyi/src/main/java/com/ruoyi/system/service/ISysOssService.java @@ -1,7 +1,6 @@ package com.ruoyi.system.service; import com.ruoyi.common.core.domain.PageQuery; -import com.ruoyi.common.core.mybatisplus.core.IServicePlus; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.system.domain.SysOss; import com.ruoyi.system.domain.bo.SysOssBo; @@ -15,11 +14,14 @@ import java.util.Collection; * * @author Lion Li */ -public interface ISysOssService extends IServicePlus { +public interface ISysOssService { TableDataInfo queryPageList(SysOssBo sysOss, PageQuery pageQuery); + SysOss getById(Long ossId); + SysOss upload(MultipartFile file); Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + } diff --git a/ruoyi/src/main/java/com/ruoyi/system/service/ISysPostService.java b/ruoyi/src/main/java/com/ruoyi/system/service/ISysPostService.java index 97a0e0621..9c3b78cd7 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/service/ISysPostService.java +++ b/ruoyi/src/main/java/com/ruoyi/system/service/ISysPostService.java @@ -1,6 +1,5 @@ package com.ruoyi.system.service; -import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.system.domain.SysPost; @@ -12,7 +11,7 @@ import java.util.List; * * @author Lion Li */ -public interface ISysPostService extends IService { +public interface ISysPostService { TableDataInfo selectPagePostList(SysPost post, PageQuery pageQuery); @@ -85,7 +84,6 @@ public interface ISysPostService extends IService { * * @param postIds 需要删除的岗位ID * @return 结果 - * @throws Exception 异常 */ int deletePostByIds(Long[] postIds); diff --git a/ruoyi/src/main/java/com/ruoyi/system/service/ISysRoleService.java b/ruoyi/src/main/java/com/ruoyi/system/service/ISysRoleService.java index 37f007174..5b726b2e0 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/service/ISysRoleService.java +++ b/ruoyi/src/main/java/com/ruoyi/system/service/ISysRoleService.java @@ -1,6 +1,5 @@ package com.ruoyi.system.service; -import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.page.TableDataInfo; @@ -14,7 +13,7 @@ import java.util.Set; * * @author Lion Li */ -public interface ISysRoleService extends IService { +public interface ISysRoleService { TableDataInfo selectPageRoleList(SysRole role, PageQuery pageQuery); diff --git a/ruoyi/src/main/java/com/ruoyi/system/service/ISysUserOnlineService.java b/ruoyi/src/main/java/com/ruoyi/system/service/ISysUserOnlineService.java deleted file mode 100644 index aefc3c745..000000000 --- a/ruoyi/src/main/java/com/ruoyi/system/service/ISysUserOnlineService.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.ruoyi.system.service; - -import com.ruoyi.common.core.domain.model.LoginUser; -import com.ruoyi.system.domain.SysUserOnline; - -/** - * 在线用户 服务层 - * - * @author Lion Li - */ -public interface ISysUserOnlineService { - /** - * 通过登录地址查询信息 - * - * @param ipaddr 登录地址 - * @param user 用户信息 - * @return 在线用户信息 - */ - SysUserOnline selectOnlineByIpaddr(String ipaddr, LoginUser user); - - /** - * 通过用户名称查询信息 - * - * @param userName 用户名称 - * @param user 用户信息 - * @return 在线用户信息 - */ - SysUserOnline selectOnlineByUserName(String userName, LoginUser user); - - /** - * 通过登录地址/用户名称查询信息 - * - * @param ipaddr 登录地址 - * @param userName 用户名称 - * @param user 用户信息 - * @return 在线用户信息 - */ - SysUserOnline selectOnlineByInfo(String ipaddr, String userName, LoginUser user); - - /** - * 设置在线用户信息 - * - * @param user 用户信息 - * @return 在线用户 - */ - SysUserOnline loginUserToUserOnline(LoginUser user); -} diff --git a/ruoyi/src/main/java/com/ruoyi/system/service/ISysUserService.java b/ruoyi/src/main/java/com/ruoyi/system/service/ISysUserService.java index 508f3c44b..741ae4bc0 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/service/ISysUserService.java +++ b/ruoyi/src/main/java/com/ruoyi/system/service/ISysUserService.java @@ -1,10 +1,8 @@ package com.ruoyi.system.service; -import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.page.TableDataInfo; -import com.ruoyi.common.core.service.UserService; import java.util.List; @@ -13,7 +11,7 @@ import java.util.List; * * @author Lion Li */ -public interface ISysUserService extends IService, UserService { +public interface ISysUserService { TableDataInfo selectPageUserList(SysUser user, PageQuery pageQuery); @@ -48,7 +46,6 @@ public interface ISysUserService extends IService, UserService { * @param userName 用户名 * @return 用户对象信息 */ - @Override SysUser selectUserByUserName(String userName); /** @@ -57,7 +54,6 @@ public interface ISysUserService extends IService, UserService { * @param userId 用户ID * @return 用户对象信息 */ - @Override SysUser selectUserById(Long userId); /** diff --git a/ruoyi/src/main/java/com/ruoyi/system/service/SysLoginService.java b/ruoyi/src/main/java/com/ruoyi/system/service/SysLoginService.java index 6add556fe..522e32b74 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/service/SysLoginService.java +++ b/ruoyi/src/main/java/com/ruoyi/system/service/SysLoginService.java @@ -1,28 +1,31 @@ package com.ruoyi.system.service; +import cn.dev33.satoken.secure.BCrypt; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.domain.dto.RoleDTO; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.core.service.LogininforService; -import com.ruoyi.common.core.service.TokenService; -import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.enums.DeviceType; +import com.ruoyi.common.enums.UserStatus; import com.ruoyi.common.exception.user.CaptchaException; import com.ruoyi.common.exception.user.CaptchaExpireException; import com.ruoyi.common.exception.user.UserException; +import com.ruoyi.common.helper.LoginHelper; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.MessageUtils; -import com.ruoyi.common.utils.RedisUtils; import com.ruoyi.common.utils.ServletUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.authentication.AuthenticationManager; -import org.springframework.security.authentication.BadCredentialsException; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.Authentication; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.redis.RedisUtils; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; +import java.util.List; import java.util.concurrent.TimeUnit; /** @@ -30,23 +33,15 @@ import java.util.concurrent.TimeUnit; * * @author Lion Li */ +@RequiredArgsConstructor +@Slf4j @Service public class SysLoginService { - @Autowired - private TokenService tokenService; - - @Resource - private AuthenticationManager authenticationManager; - - @Autowired - private ISysUserService userService; - - @Autowired - private ISysConfigService configService; - - @Autowired - private LogininforService asyncService; + private final ISysUserService userService; + private final ISysConfigService configService; + private final LogininforService asyncService; + private final SysPermissionService permissionService; /** * 登录验证 @@ -71,39 +66,35 @@ public class SysLoginService { asyncService.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.retry.limit.exceed", Constants.LOGIN_ERROR_LIMIT_TIME), request); throw new UserException("user.password.retry.limit.exceed", Constants.LOGIN_ERROR_LIMIT_TIME); } - // 用户验证 - Authentication authentication = null; - try { - // 该方法会去调用UserDetailsServiceImpl.loadUserByUsername - authentication = authenticationManager - .authenticate(new UsernamePasswordAuthenticationToken(username, password)); - } catch (Exception e) { - if (e instanceof BadCredentialsException) { - // 是否第一次 - errorNumber = ObjectUtil.isNull(errorNumber) ? 1 : errorNumber + 1; - // 达到规定错误次数 则锁定登录 - if (errorNumber.equals(Constants.LOGIN_ERROR_NUMBER)) { - RedisUtils.setCacheObject(Constants.LOGIN_ERROR + username, errorNumber, Constants.LOGIN_ERROR_LIMIT_TIME, TimeUnit.MINUTES); - asyncService.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.retry.limit.exceed", Constants.LOGIN_ERROR_LIMIT_TIME), request); - throw new UserException("user.password.retry.limit.exceed", Constants.LOGIN_ERROR_LIMIT_TIME); - } else { - // 未达到规定错误次数 则递增 - RedisUtils.setCacheObject(Constants.LOGIN_ERROR + username, errorNumber); - asyncService.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.retry.limit.count", errorNumber), request); - throw new UserException("user.password.retry.limit.count", errorNumber); - } + + SysUser user = loadUserByUsername(username); + + if (!BCrypt.checkpw(password, user.getPassword())) { + // 是否第一次 + errorNumber = ObjectUtil.isNull(errorNumber) ? 1 : errorNumber + 1; + // 达到规定错误次数 则锁定登录 + if (errorNumber.equals(Constants.LOGIN_ERROR_NUMBER)) { + RedisUtils.setCacheObject(Constants.LOGIN_ERROR + username, errorNumber, Constants.LOGIN_ERROR_LIMIT_TIME, TimeUnit.MINUTES); + asyncService.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.retry.limit.exceed", Constants.LOGIN_ERROR_LIMIT_TIME), request); + throw new UserException("user.password.retry.limit.exceed", Constants.LOGIN_ERROR_LIMIT_TIME); } else { - asyncService.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage(), request); - throw new ServiceException(e.getMessage()); + // 未达到规定错误次数 则递增 + RedisUtils.setCacheObject(Constants.LOGIN_ERROR + username, errorNumber); + asyncService.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.retry.limit.count", errorNumber), request); + throw new UserException("user.password.retry.limit.count", errorNumber); } } + // 登录成功 清空错误次数 RedisUtils.deleteObject(Constants.LOGIN_ERROR + username); asyncService.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"), request); - LoginUser loginUser = (LoginUser) authentication.getPrincipal(); - recordLoginInfo(loginUser.getUserId(), username); + recordLoginInfo(user.getUserId(), username); + + LoginUser loginUser = buildLoginUser(user); + // 生成token - return tokenService.createToken(loginUser); + LoginHelper.loginByDevice(loginUser, DeviceType.PC); + return StpUtil.getTokenValue(); } /** @@ -112,10 +103,9 @@ public class SysLoginService { * @param username 用户名 * @param code 验证码 * @param uuid 唯一标识 - * @return 结果 */ public void validateCaptcha(String username, String code, String uuid, HttpServletRequest request) { - String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid; + String verifyKey = Constants.CAPTCHA_CODE_KEY + StringUtils.defaultString(uuid, ""); String captcha = RedisUtils.getCacheObject(verifyKey); RedisUtils.deleteObject(verifyKey); if (captcha == null) { @@ -128,6 +118,38 @@ public class SysLoginService { } } + private SysUser loadUserByUsername(String username) { + SysUser user = userService.selectUserByUserName(username); + if (ObjectUtil.isNull(user)) { + log.info("登录用户:{} 不存在.", username); + throw new UserException("user.not.exists", username); + } else if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) { + log.info("登录用户:{} 已被删除.", username); + throw new UserException("user.password.delete", username); + } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) { + log.info("登录用户:{} 已被停用.", username); + throw new UserException("user.blocked", username); + } + return user; + } + + /** + * 构建登录用户 + */ + private LoginUser buildLoginUser(SysUser user) { + LoginUser loginUser = new LoginUser(); + loginUser.setUserId(user.getUserId()); + loginUser.setDeptId(user.getDeptId()); + loginUser.setUsername(user.getUserName()); + loginUser.setUserType(user.getUserType()); + loginUser.setMenuPermission(permissionService.getMenuPermission(user)); + loginUser.setRolePermission(permissionService.getRolePermission(user)); + loginUser.setDeptName(user.getDept().getDeptName()); + List roles = BeanUtil.copyToList(user.getRoles(), RoleDTO.class); + loginUser.setRoles(roles); + return loginUser; + } + /** * 记录登录信息 * diff --git a/ruoyi/src/main/java/com/ruoyi/system/service/SysPermissionService.java b/ruoyi/src/main/java/com/ruoyi/system/service/SysPermissionService.java index 095b3b566..a255fe818 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/service/SysPermissionService.java +++ b/ruoyi/src/main/java/com/ruoyi/system/service/SysPermissionService.java @@ -1,7 +1,7 @@ package com.ruoyi.system.service; import com.ruoyi.common.core.domain.entity.SysUser; -import org.springframework.beans.factory.annotation.Autowired; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.HashSet; @@ -12,14 +12,12 @@ import java.util.Set; * * @author ruoyi */ +@RequiredArgsConstructor @Service public class SysPermissionService { - @Autowired - private ISysRoleService roleService; - - @Autowired - private ISysMenuService menuService; + private final ISysRoleService roleService; + private final ISysMenuService menuService; /** * 获取角色数据权限 diff --git a/ruoyi/src/main/java/com/ruoyi/system/service/SysRegisterService.java b/ruoyi/src/main/java/com/ruoyi/system/service/SysRegisterService.java index 171224976..8c7274ef8 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/service/SysRegisterService.java +++ b/ruoyi/src/main/java/com/ruoyi/system/service/SysRegisterService.java @@ -1,71 +1,66 @@ package com.ruoyi.system.service; +import cn.dev33.satoken.secure.BCrypt; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.model.RegisterBody; import com.ruoyi.common.core.service.LogininforService; +import com.ruoyi.common.enums.UserType; import com.ruoyi.common.exception.user.CaptchaException; import com.ruoyi.common.exception.user.CaptchaExpireException; -import com.ruoyi.common.utils.*; -import org.springframework.beans.factory.annotation.Autowired; +import com.ruoyi.common.exception.user.UserException; +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; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import javax.servlet.http.HttpServletRequest; + /** * 注册校验方法 * * @author Lion Li */ +@RequiredArgsConstructor @Service public class SysRegisterService { - @Autowired - private ISysUserService userService; - - @Autowired - private ISysConfigService configService; - - @Autowired - private LogininforService asyncService; + private final ISysUserService userService; + private final ISysConfigService configService; + private final LogininforService asyncService; /** * 注册 */ - public String register(RegisterBody registerBody) { - String msg = "", username = registerBody.getUsername(), password = registerBody.getPassword(); + public void register(RegisterBody registerBody) { + HttpServletRequest request = ServletUtils.getRequest(); + String username = registerBody.getUsername(); + String password = registerBody.getPassword(); + // 校验用户类型是否存在 + String userType = UserType.getUserType(registerBody.getUserType()).getUserType(); boolean captchaOnOff = configService.selectCaptchaOnOff(); // 验证码开关 if (captchaOnOff) { - validateCaptcha(username, registerBody.getCode(), registerBody.getUuid()); + validateCaptcha(username, registerBody.getCode(), registerBody.getUuid(), request); } - if (StringUtils.isEmpty(username)) { - msg = "用户名不能为空"; - } else if (StringUtils.isEmpty(password)) { - msg = "用户密码不能为空"; - } else if (username.length() < UserConstants.USERNAME_MIN_LENGTH - || username.length() > UserConstants.USERNAME_MAX_LENGTH) { - msg = "账户长度必须在2到20个字符之间"; - } else if (password.length() < UserConstants.PASSWORD_MIN_LENGTH - || password.length() > UserConstants.PASSWORD_MAX_LENGTH) { - msg = "密码长度必须在5到20个字符之间"; - } else if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(username))) { - msg = "保存用户'" + username + "'失败,注册账号已存在"; - } else { - SysUser sysUser = new SysUser(); - sysUser.setUserName(username); - sysUser.setNickName(username); - sysUser.setPassword(SecurityUtils.encryptPassword(registerBody.getPassword())); - boolean regFlag = userService.registerUser(sysUser); - if (!regFlag) { - msg = "注册失败,请联系系统管理人员"; - } else { - asyncService.recordLogininfor(username, Constants.REGISTER, - MessageUtils.message("user.register.success"), ServletUtils.getRequest()); - } + if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(username))) { + throw new UserException("user.register.save.error", username); } - return msg; + SysUser sysUser = new SysUser(); + sysUser.setUserName(username); + sysUser.setNickName(username); + sysUser.setPassword(BCrypt.hashpw(password)); + sysUser.setUserType(userType); + boolean regFlag = userService.registerUser(sysUser); + if (!regFlag) { + throw new UserException("user.register.error"); + } + asyncService.recordLogininfor(username, Constants.REGISTER, MessageUtils.message("user.register.success"), request); } /** @@ -76,14 +71,16 @@ public class SysRegisterService { * @param uuid 唯一标识 * @return 结果 */ - public void validateCaptcha(String username, String code, String uuid) { - String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid; + public void validateCaptcha(String username, String code, String uuid, HttpServletRequest request) { + String verifyKey = Constants.CAPTCHA_CODE_KEY + StringUtils.defaultString(uuid, ""); String captcha = RedisUtils.getCacheObject(verifyKey); RedisUtils.deleteObject(verifyKey); if (captcha == null) { + asyncService.recordLogininfor(username, Constants.REGISTER, MessageUtils.message("user.jcaptcha.expire"), request); throw new CaptchaExpireException(); } if (!code.equalsIgnoreCase(captcha)) { + asyncService.recordLogininfor(username, Constants.REGISTER, MessageUtils.message("user.jcaptcha.error"), request); throw new CaptchaException(); } } diff --git a/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java b/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java index 0b16029e1..070d1daed 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java +++ b/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java @@ -1,21 +1,22 @@ package com.ruoyi.system.service.impl; import cn.hutool.core.convert.Convert; +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.extension.plugins.pagination.Page; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.domain.PageQuery; -import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.service.ConfigService; import com.ruoyi.common.exception.ServiceException; -import com.ruoyi.common.utils.RedisUtils; import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.redis.RedisUtils; import com.ruoyi.system.domain.SysConfig; import com.ruoyi.system.mapper.SysConfigMapper; import com.ruoyi.system.service.ISysConfigService; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.Arrays; @@ -28,8 +29,11 @@ import java.util.Map; * * @author Lion Li */ +@RequiredArgsConstructor @Service -public class SysConfigServiceImpl extends ServicePlusImpl implements ISysConfigService, ConfigService { +public class SysConfigServiceImpl implements ISysConfigService, ConfigService { + + private final SysConfigMapper baseMapper; @Override public TableDataInfo selectPageConfigList(SysConfig config, PageQuery pageQuery) { @@ -40,7 +44,7 @@ public class SysConfigServiceImpl extends ServicePlusImpl page = page(pageQuery.build(), lqw); + Page page = baseMapper.selectPage(pageQuery.build(), lqw); return TableDataInfo.build(page); } @@ -70,7 +74,7 @@ public class SysConfigServiceImpl extends ServicePlusImpl() .eq(SysConfig::getConfigKey, configKey)); - if (StringUtils.isNotNull(retConfig)) { + if (ObjectUtil.isNotNull(retConfig)) { RedisUtils.setCacheObject(getCacheKey(configKey), retConfig.getConfigValue()); return retConfig.getConfigValue(); } @@ -132,7 +136,13 @@ public class SysConfigServiceImpl extends ServicePlusImpl() + .eq(SysConfig::getConfigKey, config.getConfigKey())); + } if (row > 0) { RedisUtils.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue()); } @@ -143,7 +153,6 @@ public class SysConfigServiceImpl extends ServicePlusImpl().eq(SysConfig::getConfigKey, config.getConfigKey())); - if (StringUtils.isNotNull(info) && info.getConfigId().longValue() != configId.longValue()) { + if (ObjectUtil.isNotNull(info) && info.getConfigId().longValue() != configId.longValue()) { return UserConstants.NOT_UNIQUE; } return UserConstants.UNIQUE; } + @Override + public SysConfig getOne(SysConfig config) { + return baseMapper.selectOne(new LambdaQueryWrapper<>(config)); + } + /** * 根据参数 key 获取参数值 * diff --git a/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysDataScopeServiceImpl.java b/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysDataScopeServiceImpl.java index 84399585b..2803a59ed 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysDataScopeServiceImpl.java +++ b/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysDataScopeServiceImpl.java @@ -7,20 +7,19 @@ import com.ruoyi.common.core.domain.entity.SysDept; import com.ruoyi.system.domain.SysRoleDept; import com.ruoyi.system.mapper.SysDeptMapper; import com.ruoyi.system.mapper.SysRoleDeptMapper; -import com.ruoyi.system.service.SysDataScopeService; -import org.springframework.beans.factory.annotation.Autowired; +import com.ruoyi.system.service.ISysDataScopeService; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.List; import java.util.stream.Collectors; +@RequiredArgsConstructor @Service("sdss") -public class SysDataScopeServiceImpl implements SysDataScopeService { +public class SysDataScopeServiceImpl implements ISysDataScopeService { - @Autowired - private SysRoleDeptMapper roleDeptMapper; - @Autowired - private SysDeptMapper deptMapper; + private final SysRoleDeptMapper roleDeptMapper; + private final SysDeptMapper deptMapper; @Override public String getRoleCustom(Long roleId) { diff --git a/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java b/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java index 0f8897fe4..621dc078d 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java +++ b/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java @@ -3,15 +3,15 @@ package com.ruoyi.system.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.lang.tree.Tree; +import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.ruoyi.common.constant.UserConstants; 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.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.exception.ServiceException; -import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.helper.LoginHelper; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.TreeBuildUtils; import com.ruoyi.common.utils.spring.SpringUtils; @@ -19,7 +19,7 @@ import com.ruoyi.system.mapper.SysDeptMapper; import com.ruoyi.system.mapper.SysRoleMapper; import com.ruoyi.system.mapper.SysUserMapper; import com.ruoyi.system.service.ISysDeptService; -import org.springframework.beans.factory.annotation.Autowired; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.Arrays; @@ -30,14 +30,13 @@ import java.util.List; * * @author Lion Li */ +@RequiredArgsConstructor @Service -public class SysDeptServiceImpl extends ServicePlusImpl implements ISysDeptService { +public class SysDeptServiceImpl implements ISysDeptService { - @Autowired - private SysRoleMapper roleMapper; - - @Autowired - private SysUserMapper userMapper; + private final SysDeptMapper baseMapper; + private final SysRoleMapper roleMapper; + private final SysUserMapper userMapper; /** * 查询部门管理数据 @@ -47,8 +46,6 @@ public class SysDeptServiceImpl extends ServicePlusImpl selectDeptList(SysDept dept) { -// return baseMapper.selectList(); -// return baseMapper.selectList(new LambdaQueryWrapper<>()); return baseMapper.selectDeptList(dept); } @@ -63,8 +60,7 @@ public class SysDeptServiceImpl extends ServicePlusImpl + return TreeBuildUtils.build(depts, (dept, tree) -> tree.setId(dept.getDeptId()) .setParentId(dept.getParentId()) .setName(dept.getDeptName()) @@ -91,19 +87,19 @@ public class SysDeptServiceImpl extends ServicePlusImpl() - .eq(SysDept::getStatus, 0) + return baseMapper.selectCount(new LambdaQueryWrapper() + .eq(SysDept::getStatus, UserConstants.DEPT_NORMAL) .apply("find_in_set({0}, ancestors)", deptId)); } @@ -115,9 +111,8 @@ public class SysDeptServiceImpl extends ServicePlusImpl() + return baseMapper.exists(new LambdaQueryWrapper() .eq(SysDept::getParentId, deptId)); - return result > 0; } /** @@ -128,9 +123,8 @@ public class SysDeptServiceImpl extends ServicePlusImpl() + return userMapper.exists(new LambdaQueryWrapper() .eq(SysUser::getDeptId, deptId)); - return result > 0; } /** @@ -141,12 +135,11 @@ public class SysDeptServiceImpl extends ServicePlusImpl() + boolean exist = baseMapper.exists(new LambdaQueryWrapper() .eq(SysDept::getDeptName, dept.getDeptName()) .eq(SysDept::getParentId, dept.getParentId()) - .ne(SysDept::getDeptId, deptId)); - if (count > 0) { + .ne(ObjectUtil.isNotNull(dept.getDeptId()), SysDept::getDeptId, dept.getDeptId())); + if (exist) { return UserConstants.NOT_UNIQUE; } return UserConstants.UNIQUE; @@ -159,11 +152,11 @@ public class SysDeptServiceImpl extends ServicePlusImpl depts = SpringUtils.getAopProxy(this).selectDeptList(dept); - if (StringUtils.isEmpty(depts)) { + if (CollUtil.isEmpty(depts)) { throw new ServiceException("没有权限访问部门数据!"); } } @@ -177,7 +170,7 @@ public class SysDeptServiceImpl extends ServicePlusImpl() - .set(SysDept::getStatus, "0") + baseMapper.update(null, new LambdaUpdateWrapper() + .set(SysDept::getStatus, UserConstants.DEPT_NORMAL) .in(SysDept::getDeptId, Arrays.asList(deptIds))); } @@ -232,7 +225,7 @@ public class SysDeptServiceImpl extends ServicePlusImpl children = list(new LambdaQueryWrapper() + List children = baseMapper.selectList(new LambdaQueryWrapper() .apply("find_in_set({0},ancestors)", deptId)); for (SysDept child : children) { child.setAncestors(child.getAncestors().replaceFirst(oldAncestors, newAncestors)); diff --git a/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysDictDataServiceImpl.java b/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysDictDataServiceImpl.java index 7726ee010..03de7c5e4 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysDictDataServiceImpl.java +++ b/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysDictDataServiceImpl.java @@ -5,12 +5,12 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.entity.SysDictData; -import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; -import com.ruoyi.common.utils.RedisUtils; import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.redis.RedisUtils; import com.ruoyi.system.mapper.SysDictDataMapper; import com.ruoyi.system.service.ISysDictDataService; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.List; @@ -20,17 +20,20 @@ import java.util.List; * * @author Lion Li */ +@RequiredArgsConstructor @Service -public class SysDictDataServiceImpl extends ServicePlusImpl implements ISysDictDataService { +public class SysDictDataServiceImpl implements ISysDictDataService { + + private final SysDictDataMapper baseMapper; @Override public TableDataInfo selectPageDictDataList(SysDictData dictData, PageQuery pageQuery) { LambdaQueryWrapper lqw = new LambdaQueryWrapper() - .eq(StringUtils.isNotBlank(dictData.getDictType()), SysDictData::getDictType, dictData.getDictType()) - .like(StringUtils.isNotBlank(dictData.getDictLabel()), SysDictData::getDictLabel, dictData.getDictLabel()) - .eq(StringUtils.isNotBlank(dictData.getStatus()), SysDictData::getStatus, dictData.getStatus()) - .orderByAsc(SysDictData::getDictSort); - Page page = page(pageQuery.build(), lqw); + .eq(StringUtils.isNotBlank(dictData.getDictType()), SysDictData::getDictType, dictData.getDictType()) + .like(StringUtils.isNotBlank(dictData.getDictLabel()), SysDictData::getDictLabel, dictData.getDictLabel()) + .eq(StringUtils.isNotBlank(dictData.getStatus()), SysDictData::getStatus, dictData.getStatus()) + .orderByAsc(SysDictData::getDictSort); + Page page = baseMapper.selectPage(pageQuery.build(), lqw); return TableDataInfo.build(page); } @@ -42,11 +45,11 @@ public class SysDictDataServiceImpl extends ServicePlusImpl selectDictDataList(SysDictData dictData) { - return list(new LambdaQueryWrapper() - .eq(StringUtils.isNotBlank(dictData.getDictType()), SysDictData::getDictType, dictData.getDictType()) - .like(StringUtils.isNotBlank(dictData.getDictLabel()), SysDictData::getDictLabel, dictData.getDictLabel()) - .eq(StringUtils.isNotBlank(dictData.getStatus()), SysDictData::getStatus, dictData.getStatus()) - .orderByAsc(SysDictData::getDictSort)); + return baseMapper.selectList(new LambdaQueryWrapper() + .eq(StringUtils.isNotBlank(dictData.getDictType()), SysDictData::getDictType, dictData.getDictType()) + .like(StringUtils.isNotBlank(dictData.getDictLabel()), SysDictData::getDictLabel, dictData.getDictLabel()) + .eq(StringUtils.isNotBlank(dictData.getStatus()), SysDictData::getStatus, dictData.getStatus()) + .orderByAsc(SysDictData::getDictSort)); } /** @@ -58,11 +61,11 @@ public class SysDictDataServiceImpl extends ServicePlusImpl() + return baseMapper.selectOne(new LambdaQueryWrapper() .select(SysDictData::getDictLabel) .eq(SysDictData::getDictType, dictType) .eq(SysDictData::getDictValue, dictValue)) - .getDictLabel(); + .getDictLabel(); } /** @@ -73,20 +76,19 @@ public class SysDictDataServiceImpl extends ServicePlusImpl dictDatas = baseMapper.selectDictDataByType(data.getDictType()); RedisUtils.setCacheObject(getCacheKey(data.getDictType()), dictDatas); } diff --git a/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java b/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java index 1934f2085..61d178865 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java +++ b/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java @@ -1,6 +1,7 @@ package com.ruoyi.system.service.impl; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -9,34 +10,32 @@ import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.entity.SysDictData; import com.ruoyi.common.core.domain.entity.SysDictType; -import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.service.DictService; import com.ruoyi.common.exception.ServiceException; -import com.ruoyi.common.utils.RedisUtils; import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.redis.RedisUtils; import com.ruoyi.system.mapper.SysDictDataMapper; import com.ruoyi.system.mapper.SysDictTypeMapper; import com.ruoyi.system.service.ISysDictTypeService; -import org.springframework.beans.factory.annotation.Autowired; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; -import java.util.Map; +import java.util.*; +import java.util.stream.Collectors; /** * 字典 业务层处理 * * @author Lion Li */ +@RequiredArgsConstructor @Service -public class SysDictTypeServiceImpl extends ServicePlusImpl implements ISysDictTypeService, DictService { +public class SysDictTypeServiceImpl implements ISysDictTypeService, DictService { - @Autowired - private SysDictDataMapper dictDataMapper; + private final SysDictTypeMapper baseMapper; + private final SysDictDataMapper dictDataMapper; @Override public TableDataInfo selectPageDictTypeList(SysDictType dictType, PageQuery pageQuery) { @@ -47,7 +46,7 @@ public class SysDictTypeServiceImpl extends ServicePlusImpl page = page(pageQuery.build(), lqw); + Page page = baseMapper.selectPage(pageQuery.build(), lqw); return TableDataInfo.build(page); } @@ -60,7 +59,7 @@ public class SysDictTypeServiceImpl extends ServicePlusImpl selectDictTypeList(SysDictType dictType) { Map params = dictType.getParams(); - return list(new LambdaQueryWrapper() + return baseMapper.selectList(new LambdaQueryWrapper() .like(StringUtils.isNotBlank(dictType.getDictName()), SysDictType::getDictName, dictType.getDictName()) .eq(StringUtils.isNotBlank(dictType.getStatus()), SysDictType::getStatus, dictType.getStatus()) .like(StringUtils.isNotBlank(dictType.getDictType()), SysDictType::getDictType, dictType.getDictType()) @@ -75,7 +74,7 @@ public class SysDictTypeServiceImpl extends ServicePlusImpl selectDictTypeAll() { - return list(); + return baseMapper.selectList(); } /** @@ -87,7 +86,7 @@ public class SysDictTypeServiceImpl extends ServicePlusImpl selectDictDataByType(String dictType) { List dictDatas = RedisUtils.getCacheObject(getCacheKey(dictType)); - if (StringUtils.isNotEmpty(dictDatas)) { + if (CollUtil.isNotEmpty(dictDatas)) { return dictDatas; } dictDatas = dictDataMapper.selectDictDataByType(dictType); @@ -106,7 +105,7 @@ public class SysDictTypeServiceImpl extends ServicePlusImpl().eq(SysDictType::getDictType, dictType)); + return baseMapper.selectById(new LambdaQueryWrapper().eq(SysDictType::getDictType, dictType)); } /** * 批量删除字典类型信息 * * @param dictIds 需要删除的字典ID - * @return 结果 */ @Override public void deleteDictTypeByIds(Long[] dictIds) { for (Long dictId : dictIds) { SysDictType dictType = selectDictTypeById(dictId); - if (dictDataMapper.selectCount(new LambdaQueryWrapper() - .eq(SysDictData::getDictType, dictType.getDictType())) > 0) { + if (dictDataMapper.exists(new LambdaQueryWrapper() + .eq(SysDictData::getDictType, dictType.getDictType()))) { throw new ServiceException(String.format("%1$s已分配,不能删除", dictType.getDictName())); } RedisUtils.deleteObject(getCacheKey(dictType.getDictType())); @@ -144,11 +142,16 @@ public class SysDictTypeServiceImpl extends ServicePlusImpl dictTypeList = list(); - for (SysDictType dictType : dictTypeList) { - List dictDatas = dictDataMapper.selectDictDataByType(dictType.getDictType()); - RedisUtils.setCacheObject(getCacheKey(dictType.getDictType()), dictDatas); - } + List dictDataList = dictDataMapper.selectList( + new LambdaQueryWrapper().eq(SysDictData::getStatus, UserConstants.DICT_NORMAL)); + Map> dictDataMap = dictDataList.stream().collect(Collectors.groupingBy(SysDictData::getDictType)); + dictDataMap.forEach((k,v) -> { + String dictKey = getCacheKey(k); + List dictList = v.stream() + .sorted(Comparator.comparing(SysDictData::getDictSort)) + .collect(Collectors.toList()); + RedisUtils.setCacheObject(dictKey, dictList); + }); } /** @@ -193,7 +196,7 @@ public class SysDictTypeServiceImpl extends ServicePlusImpl() .set(SysDictData::getDictType, dict.getDictType()) .eq(SysDictData::getDictType, oldDict.getDictType())); @@ -213,11 +216,10 @@ public class SysDictTypeServiceImpl extends ServicePlusImpl() + boolean exist = baseMapper.exists(new LambdaQueryWrapper() .eq(SysDictType::getDictType, dict.getDictType()) - .ne(SysDictType::getDictId, dictId)); - if (count > 0) { + .ne(ObjectUtil.isNotNull(dict.getDictId()), SysDictType::getDictId, dict.getDictId())); + if (exist) { return UserConstants.NOT_UNIQUE; } return UserConstants.UNIQUE; diff --git a/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysLogininforServiceImpl.java b/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysLogininforServiceImpl.java index 487e811ea..159db624e 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysLogininforServiceImpl.java +++ b/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysLogininforServiceImpl.java @@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.domain.PageQuery; -import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.service.LogininforService; import com.ruoyi.common.utils.ServletUtils; @@ -15,6 +14,7 @@ import com.ruoyi.common.utils.ip.AddressUtils; import com.ruoyi.system.domain.SysLogininfor; import com.ruoyi.system.mapper.SysLogininforMapper; import com.ruoyi.system.service.ISysLogininforService; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; @@ -30,9 +30,12 @@ import java.util.Map; * * @author Lion Li */ +@RequiredArgsConstructor @Slf4j @Service -public class SysLogininforServiceImpl extends ServicePlusImpl implements ISysLogininforService, LogininforService { +public class SysLogininforServiceImpl implements ISysLogininforService, LogininforService { + + private final SysLogininforMapper baseMapper; /** * 记录登录信息 @@ -96,10 +99,11 @@ public class SysLogininforServiceImpl extends ServicePlusImpl page = page(pageQuery.build(), lqw); + Page page = baseMapper.selectPage(pageQuery.build(), lqw); return TableDataInfo.build(page); } @@ -111,7 +115,7 @@ public class SysLogininforServiceImpl extends ServicePlusImpl selectLogininforList(SysLogininfor logininfor) { Map params = logininfor.getParams(); - return list(new LambdaQueryWrapper() + return baseMapper.selectList(new LambdaQueryWrapper() .like(StringUtils.isNotBlank(logininfor.getIpaddr()), SysLogininfor::getIpaddr, logininfor.getIpaddr()) .eq(StringUtils.isNotBlank(logininfor.getStatus()), SysLogininfor::getStatus, logininfor.getStatus()) .like(StringUtils.isNotBlank(logininfor.getUserName()), SysLogininfor::getUserName, logininfor.getUserName()) @@ -136,7 +140,7 @@ public class SysLogininforServiceImpl extends ServicePlusImpl()); + baseMapper.delete(new LambdaQueryWrapper<>()); } } diff --git a/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java b/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java index a604a12b7..0029ecd36 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java +++ b/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java @@ -2,14 +2,14 @@ package com.ruoyi.system.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.tree.Tree; +import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.domain.entity.SysMenu; import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.domain.entity.SysUser; -import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; -import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.helper.LoginHelper; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.TreeBuildUtils; import com.ruoyi.system.domain.SysRoleMenu; @@ -19,7 +19,7 @@ import com.ruoyi.system.mapper.SysMenuMapper; import com.ruoyi.system.mapper.SysRoleMapper; import com.ruoyi.system.mapper.SysRoleMenuMapper; import com.ruoyi.system.service.ISysMenuService; -import org.springframework.beans.factory.annotation.Autowired; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.*; @@ -29,14 +29,13 @@ import java.util.*; * * @author Lion Li */ +@RequiredArgsConstructor @Service -public class SysMenuServiceImpl extends ServicePlusImpl implements ISysMenuService { +public class SysMenuServiceImpl implements ISysMenuService { - @Autowired - private SysRoleMapper roleMapper; - - @Autowired - private SysRoleMenuMapper roleMenuMapper; + private final SysMenuMapper baseMapper; + private final SysRoleMapper roleMapper; + private final SysRoleMenuMapper roleMenuMapper; /** * 根据用户查询系统菜单列表 @@ -60,7 +59,7 @@ public class SysMenuServiceImpl extends ServicePlusImpl menuList = null; // 管理员显示所有菜单信息 if (SysUser.isAdmin(userId)) { - menuList = list(new LambdaQueryWrapper() + menuList = baseMapper.selectList(new LambdaQueryWrapper() .like(StringUtils.isNotBlank(menu.getMenuName()), SysMenu::getMenuName, menu.getMenuName()) .eq(StringUtils.isNotBlank(menu.getVisible()), SysMenu::getVisible, menu.getVisible()) .eq(StringUtils.isNotBlank(menu.getStatus()), SysMenu::getStatus, menu.getStatus()) @@ -100,7 +99,7 @@ public class SysMenuServiceImpl extends ServicePlusImpl selectMenuTreeByUserId(Long userId) { List menus = null; - if (SecurityUtils.isAdmin(userId)) { + if (LoginHelper.isAdmin(userId)) { menus = baseMapper.selectMenuTreeAll(); } else { menus = baseMapper.selectMenuTreeByUserId(userId); @@ -182,8 +181,7 @@ public class SysMenuServiceImpl extends ServicePlusImpl + return TreeBuildUtils.build(menus, (menu, tree) -> tree.setId(menu.getMenuId()) .setParentId(menu.getParentId()) .setName(menu.getMenuName()) @@ -198,7 +196,7 @@ public class SysMenuServiceImpl extends ServicePlusImpl().eq(SysMenu::getParentId, menuId)); - return result > 0; + return baseMapper.exists(new LambdaQueryWrapper().eq(SysMenu::getParentId, menuId)); } /** @@ -221,8 +218,7 @@ public class SysMenuServiceImpl extends ServicePlusImpl().eq(SysRoleMenu::getMenuId, menuId)); - return result > 0; + return roleMenuMapper.exists(new LambdaQueryWrapper().eq(SysRoleMenu::getMenuId, menuId)); } /** @@ -266,12 +262,11 @@ public class SysMenuServiceImpl extends ServicePlusImpl() + boolean exist = baseMapper.exists(new LambdaQueryWrapper() .eq(SysMenu::getMenuName, menu.getMenuName()) .eq(SysMenu::getParentId, menu.getParentId()) - .ne(SysMenu::getMenuId, menuId)); - if (count > 0) { + .ne(ObjectUtil.isNotNull(menu.getMenuId()), SysMenu::getMenuId, menu.getMenuId())); + if (exist) { return UserConstants.NOT_UNIQUE; } return UserConstants.UNIQUE; @@ -426,9 +421,8 @@ public class SysMenuServiceImpl extends ServicePlusImpl implements ISysNoticeService { +public class SysNoticeServiceImpl implements ISysNoticeService { + + private final SysNoticeMapper baseMapper; @Override public TableDataInfo selectPageNoticeList(SysNotice notice, PageQuery pageQuery) { LambdaQueryWrapper lqw = new LambdaQueryWrapper() - .like(StringUtils.isNotBlank(notice.getNoticeTitle()), SysNotice::getNoticeTitle, notice.getNoticeTitle()) - .eq(StringUtils.isNotBlank(notice.getNoticeType()), SysNotice::getNoticeType, notice.getNoticeType()) - .like(StringUtils.isNotBlank(notice.getCreateBy()), SysNotice::getCreateBy, notice.getCreateBy()); - Page page = page(pageQuery.build(), lqw); + .like(StringUtils.isNotBlank(notice.getNoticeTitle()), SysNotice::getNoticeTitle, notice.getNoticeTitle()) + .eq(StringUtils.isNotBlank(notice.getNoticeType()), SysNotice::getNoticeType, notice.getNoticeType()) + .like(StringUtils.isNotBlank(notice.getCreateBy()), SysNotice::getCreateBy, notice.getCreateBy()); + Page page = baseMapper.selectPage(pageQuery.build(), lqw); return TableDataInfo.build(page); } @@ -40,7 +43,7 @@ public class SysNoticeServiceImpl extends ServicePlusImpl selectNoticeList(SysNotice notice) { - return list(new LambdaQueryWrapper() - .like(StringUtils.isNotBlank(notice.getNoticeTitle()), SysNotice::getNoticeTitle, notice.getNoticeTitle()) - .eq(StringUtils.isNotBlank(notice.getNoticeType()), SysNotice::getNoticeType, notice.getNoticeType()) - .like(StringUtils.isNotBlank(notice.getCreateBy()), SysNotice::getCreateBy, notice.getCreateBy())); + return baseMapper.selectList(new LambdaQueryWrapper() + .like(StringUtils.isNotBlank(notice.getNoticeTitle()), SysNotice::getNoticeTitle, notice.getNoticeTitle()) + .eq(StringUtils.isNotBlank(notice.getNoticeType()), SysNotice::getNoticeType, notice.getNoticeType()) + .like(StringUtils.isNotBlank(notice.getCreateBy()), SysNotice::getCreateBy, notice.getCreateBy())); } /** diff --git a/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysOperLogServiceImpl.java b/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysOperLogServiceImpl.java index 9371d5a2a..8610d974f 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysOperLogServiceImpl.java +++ b/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysOperLogServiceImpl.java @@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.dto.OperLogDTO; -import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.service.OperLogService; import com.ruoyi.common.utils.StringUtils; @@ -14,6 +13,7 @@ import com.ruoyi.common.utils.ip.AddressUtils; import com.ruoyi.system.domain.SysOperLog; import com.ruoyi.system.mapper.SysOperLogMapper; import com.ruoyi.system.service.ISysOperLogService; +import lombok.RequiredArgsConstructor; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; @@ -27,8 +27,11 @@ import java.util.Map; * * @author Lion Li */ +@RequiredArgsConstructor @Service -public class SysOperLogServiceImpl extends ServicePlusImpl implements ISysOperLogService, OperLogService { +public class SysOperLogServiceImpl implements ISysOperLogService, OperLogService { + + private final SysOperLogMapper baseMapper; /** * 操作日志记录 @@ -61,10 +64,11 @@ public class SysOperLogServiceImpl extends ServicePlusImpl page = page(pageQuery.build(), lqw); + Page page = baseMapper.selectPage(pageQuery.build(), lqw); return TableDataInfo.build(page); } @@ -76,7 +80,7 @@ public class SysOperLogServiceImpl extends ServicePlusImpl selectOperLogList(SysOperLog operLog) { Map params = operLog.getParams(); - return list(new LambdaQueryWrapper() + return baseMapper.selectList(new LambdaQueryWrapper() .like(StringUtils.isNotBlank(operLog.getTitle()), SysOperLog::getTitle, operLog.getTitle()) .eq(operLog.getBusinessType() != null && operLog.getBusinessType() > 0, SysOperLog::getBusinessType, operLog.getBusinessType()) @@ -124,7 +128,7 @@ public class SysOperLogServiceImpl extends ServicePlusImpl()); + baseMapper.delete(new LambdaQueryWrapper<>()); } } diff --git a/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysOssConfigServiceImpl.java b/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysOssConfigServiceImpl.java index 9c2830108..86ba97d13 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysOssConfigServiceImpl.java +++ b/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysOssConfigServiceImpl.java @@ -2,6 +2,7 @@ package com.ruoyi.system.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; @@ -9,12 +10,11 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.google.common.collect.Lists; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.domain.PageQuery; -import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.JsonUtils; -import com.ruoyi.common.utils.RedisUtils; import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.redis.RedisUtils; import com.ruoyi.oss.constant.OssConstant; import com.ruoyi.oss.factory.OssFactory; import com.ruoyi.system.domain.SysOssConfig; @@ -24,7 +24,6 @@ import com.ruoyi.system.mapper.SysOssConfigMapper; import com.ruoyi.system.service.ISysOssConfigService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -39,16 +38,18 @@ import java.util.List; * @date 2021-08-13 */ @Slf4j -@RequiredArgsConstructor(onConstructor_ = @Autowired) +@RequiredArgsConstructor @Service -public class SysOssConfigServiceImpl extends ServicePlusImpl implements ISysOssConfigService { +public class SysOssConfigServiceImpl implements ISysOssConfigService { + + private final SysOssConfigMapper baseMapper; /** * 项目启动时,初始化参数到缓存,加载配置类 */ @Override public void init() { - List list = list(); + List list = baseMapper.selectList(); // 加载OSS初始化配置 for (SysOssConfig config : list) { String configKey = config.getConfigKey(); @@ -63,13 +64,13 @@ public class SysOssConfigServiceImpl extends ServicePlusImpl queryPageList(SysOssConfigBo bo, PageQuery pageQuery) { LambdaQueryWrapper lqw = buildQueryWrapper(bo); - Page result = pageVo(pageQuery.build(), lqw); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); return TableDataInfo.build(result); } @@ -86,7 +87,7 @@ public class SysOssConfigServiceImpl extends ServicePlusImpl 0, config); } @Override @@ -98,7 +99,7 @@ public class SysOssConfigServiceImpl extends ServicePlusImpl 0, config); } /** @@ -106,7 +107,7 @@ public class SysOssConfigServiceImpl extends ServicePlusImpl list = Lists.newArrayList(); for (Long configId : ids) { - SysOssConfig config = getById(configId); + SysOssConfig config = baseMapper.selectById(configId); list.add(config); } - boolean flag = removeByIds(ids); + boolean flag = baseMapper.deleteBatchIds(ids) > 0; if (flag) { list.stream().forEach(sysOssConfig -> { RedisUtils.deleteObject(getCacheKey(sysOssConfig.getConfigKey())); @@ -136,11 +137,11 @@ public class SysOssConfigServiceImpl extends ServicePlusImpl() - .select(SysOssConfig::getOssConfigId, SysOssConfig::getConfigKey) - .eq(SysOssConfig::getConfigKey, sysOssConfig.getConfigKey())); - if (StringUtils.isNotNull(info) && info.getOssConfigId() != ossConfigId) { + long ossConfigId = ObjectUtil.isNull(sysOssConfig.getOssConfigId()) ? -1L : sysOssConfig.getOssConfigId(); + SysOssConfig info = baseMapper.selectOne(new LambdaQueryWrapper() + .select(SysOssConfig::getOssConfigId, SysOssConfig::getConfigKey) + .eq(SysOssConfig::getConfigKey, sysOssConfig.getConfigKey())); + if (ObjectUtil.isNotNull(info) && info.getOssConfigId() != ossConfigId) { return UserConstants.NOT_UNIQUE; } return UserConstants.UNIQUE; @@ -154,7 +155,7 @@ public class SysOssConfigServiceImpl extends ServicePlusImpl() - .set(SysOssConfig::getStatus, "1")); + .set(SysOssConfig::getStatus, "1")); row += baseMapper.updateById(sysOssConfig); if (row > 0) { RedisUtils.setCacheObject(OssConstant.CACHE_CONFIG_KEY, sysOssConfig.getConfigKey()); @@ -182,8 +183,8 @@ public class SysOssConfigServiceImpl extends ServicePlusImpl { log.info("发布刷新OSS配置 => " + msg); }); diff --git a/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysOssServiceImpl.java b/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysOssServiceImpl.java index e062fbcf2..19423f404 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysOssServiceImpl.java +++ b/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysOssServiceImpl.java @@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.core.domain.PageQuery; -import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.StringUtils; @@ -16,6 +15,7 @@ import com.ruoyi.system.domain.bo.SysOssBo; import com.ruoyi.system.domain.vo.SysOssVo; import com.ruoyi.system.mapper.SysOssMapper; import com.ruoyi.system.service.ISysOssService; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; @@ -29,13 +29,16 @@ import java.util.Map; * * @author Lion Li */ +@RequiredArgsConstructor @Service -public class SysOssServiceImpl extends ServicePlusImpl implements ISysOssService { +public class SysOssServiceImpl implements ISysOssService { + + private final SysOssMapper baseMapper; @Override public TableDataInfo queryPageList(SysOssBo bo, PageQuery pageQuery) { LambdaQueryWrapper lqw = buildQueryWrapper(bo); - Page result = pageVo(pageQuery.build(), lqw); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); return TableDataInfo.build(result); } @@ -47,12 +50,17 @@ public class SysOssServiceImpl extends ServicePlusImpl list = listByIds(ids); + List list = baseMapper.selectBatchIds(ids); for (SysOss sysOss : list) { IOssStrategy storage = OssFactory.instance(sysOss.getService()); storage.delete(sysOss.getUrl()); } - return removeByIds(ids); + return baseMapper.deleteBatchIds(ids) > 0; } } diff --git a/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysPostServiceImpl.java b/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysPostServiceImpl.java index 058d7edd4..7e2a56c2b 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysPostServiceImpl.java +++ b/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysPostServiceImpl.java @@ -1,10 +1,10 @@ package com.ruoyi.system.service.impl; +import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.domain.PageQuery; -import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.StringUtils; @@ -13,7 +13,7 @@ import com.ruoyi.system.domain.SysUserPost; import com.ruoyi.system.mapper.SysPostMapper; import com.ruoyi.system.mapper.SysUserPostMapper; import com.ruoyi.system.service.ISysPostService; -import org.springframework.beans.factory.annotation.Autowired; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.Arrays; @@ -24,19 +24,20 @@ import java.util.List; * * @author Lion Li */ +@RequiredArgsConstructor @Service -public class SysPostServiceImpl extends ServicePlusImpl implements ISysPostService { +public class SysPostServiceImpl implements ISysPostService { - @Autowired - private SysUserPostMapper userPostMapper; + private final SysPostMapper baseMapper; + private final SysUserPostMapper userPostMapper; @Override public TableDataInfo selectPagePostList(SysPost post, PageQuery pageQuery) { LambdaQueryWrapper lqw = new LambdaQueryWrapper() - .like(StringUtils.isNotBlank(post.getPostCode()), SysPost::getPostCode, post.getPostCode()) - .eq(StringUtils.isNotBlank(post.getStatus()), SysPost::getStatus, post.getStatus()) - .like(StringUtils.isNotBlank(post.getPostName()), SysPost::getPostName, post.getPostName()); - Page page = page(pageQuery.build(), lqw); + .like(StringUtils.isNotBlank(post.getPostCode()), SysPost::getPostCode, post.getPostCode()) + .eq(StringUtils.isNotBlank(post.getStatus()), SysPost::getStatus, post.getStatus()) + .like(StringUtils.isNotBlank(post.getPostName()), SysPost::getPostName, post.getPostName()); + Page page = baseMapper.selectPage(pageQuery.build(), lqw); return TableDataInfo.build(page); } @@ -48,10 +49,10 @@ public class SysPostServiceImpl extends ServicePlusImpl selectPostList(SysPost post) { - return list(new LambdaQueryWrapper() - .like(StringUtils.isNotBlank(post.getPostCode()), SysPost::getPostCode, post.getPostCode()) - .eq(StringUtils.isNotBlank(post.getStatus()), SysPost::getStatus, post.getStatus()) - .like(StringUtils.isNotBlank(post.getPostName()), SysPost::getPostName, post.getPostName())); + return baseMapper.selectList(new LambdaQueryWrapper() + .like(StringUtils.isNotBlank(post.getPostCode()), SysPost::getPostCode, post.getPostCode()) + .eq(StringUtils.isNotBlank(post.getStatus()), SysPost::getStatus, post.getStatus()) + .like(StringUtils.isNotBlank(post.getPostName()), SysPost::getPostName, post.getPostName())); } /** @@ -61,7 +62,7 @@ public class SysPostServiceImpl extends ServicePlusImpl selectPostAll() { - return list(); + return baseMapper.selectList(); } /** @@ -72,7 +73,7 @@ public class SysPostServiceImpl extends ServicePlusImpl() - .eq(SysPost::getPostName, post.getPostName()) - .ne(SysPost::getPostId, postId)); - if (count > 0) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysPost::getPostName, post.getPostName()) + .ne(ObjectUtil.isNotNull(post.getPostId()), SysPost::getPostId, post.getPostId())); + if (exist) { return UserConstants.NOT_UNIQUE; } return UserConstants.UNIQUE; @@ -112,11 +112,10 @@ public class SysPostServiceImpl extends ServicePlusImpl() - .eq(SysPost::getPostCode, post.getPostCode()) - .ne(SysPost::getPostId, postId)); - if (count > 0) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysPost::getPostCode, post.getPostCode()) + .ne(ObjectUtil.isNotNull(post.getPostId()), SysPost::getPostId, post.getPostId())); + if (exist) { return UserConstants.NOT_UNIQUE; } return UserConstants.UNIQUE; @@ -149,7 +148,6 @@ public class SysPostServiceImpl extends ServicePlusImpl implements ISysRoleService { +public class SysRoleServiceImpl implements ISysRoleService { - @Autowired - private SysRoleMenuMapper roleMenuMapper; - - @Autowired - private SysUserRoleMapper userRoleMapper; - - @Autowired - private SysRoleDeptMapper roleDeptMapper; + private final SysRoleMapper baseMapper; + private final SysRoleMenuMapper roleMenuMapper; + private final SysUserRoleMapper userRoleMapper; + private final SysRoleDeptMapper roleDeptMapper; @Override public TableDataInfo selectPageRoleList(SysRole role, PageQuery pageQuery) { @@ -92,7 +89,7 @@ public class SysRoleServiceImpl extends ServicePlusImpl perms = baseMapper.selectRolePermissionByUserId(userId); Set permsSet = new HashSet<>(); for (SysRole perm : perms) { - if (StringUtils.isNotNull(perm)) { + if (ObjectUtil.isNotNull(perm)) { permsSet.addAll(Arrays.asList(perm.getRoleKey().trim().split(","))); } } @@ -128,7 +125,7 @@ public class SysRoleServiceImpl extends ServicePlusImpl() - .eq(SysRole::getRoleName, role.getRoleName()) - .ne(SysRole::getRoleId, roleId)); - if (count > 0) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysRole::getRoleName, role.getRoleName()) + .ne(ObjectUtil.isNotNull(role.getRoleId()), SysRole::getRoleId, role.getRoleId())); + if (exist) { return UserConstants.NOT_UNIQUE; } return UserConstants.UNIQUE; @@ -157,11 +153,10 @@ public class SysRoleServiceImpl extends ServicePlusImpl() - .eq(SysRole::getRoleKey, role.getRoleKey()) - .ne(SysRole::getRoleId, roleId)); - if (count > 0) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysRole::getRoleKey, role.getRoleKey()) + .ne(ObjectUtil.isNotNull(role.getRoleId()), SysRole::getRoleId, role.getRoleId())); + if (exist) { return UserConstants.NOT_UNIQUE; } return UserConstants.UNIQUE; @@ -174,7 +169,7 @@ public class SysRoleServiceImpl extends ServicePlusImpl roles = SpringUtils.getAopProxy(this).selectRoleList(role); - if (StringUtils.isEmpty(roles)) { + if (CollUtil.isEmpty(roles)) { throw new ServiceException("没有权限访问角色数据!"); } } @@ -281,7 +276,7 @@ public class SysRoleServiceImpl extends ServicePlusImpl 0) { - rows = roleMenuMapper.insertAll(list); + rows = roleMenuMapper.insertBatch(list) ? list.size() : 0; } return rows; } @@ -302,7 +297,7 @@ public class SysRoleServiceImpl extends ServicePlusImpl 0) { - rows = roleDeptMapper.insertAll(list); + rows = roleDeptMapper.insertBatch(list) ? list.size() : 0; } return rows; } @@ -334,6 +329,7 @@ public class SysRoleServiceImpl extends ServicePlusImpl 0) { throw new ServiceException(String.format("%1$s已分配,不能删除", role.getRoleName())); @@ -356,8 +352,8 @@ public class SysRoleServiceImpl extends ServicePlusImpl() - .eq(SysUserRole::getRoleId, userRole.getRoleId()) - .eq(SysUserRole::getUserId, userRole.getUserId())); + .eq(SysUserRole::getRoleId, userRole.getRoleId()) + .eq(SysUserRole::getUserId, userRole.getUserId())); } /** @@ -370,15 +366,15 @@ public class SysRoleServiceImpl extends ServicePlusImpl() - .eq(SysUserRole::getRoleId, roleId) - .in(SysUserRole::getUserId, Arrays.asList(userIds))); + .eq(SysUserRole::getRoleId, roleId) + .in(SysUserRole::getUserId, Arrays.asList(userIds))); } /** * 批量选择授权用户角色 * * @param roleId 角色ID - * @param userIds 需要删除的用户数据ID + * @param userIds 需要授权的用户数据ID * @return 结果 */ @Override @@ -393,7 +389,7 @@ public class SysRoleServiceImpl extends ServicePlusImpl 0) { - rows = userRoleMapper.insertAll(list); + rows = userRoleMapper.insertBatch(list) ? list.size() : 0; } return rows; } diff --git a/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysSensitiveServiceImpl.java b/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysSensitiveServiceImpl.java new file mode 100644 index 000000000..08d4cc4f9 --- /dev/null +++ b/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysSensitiveServiceImpl.java @@ -0,0 +1,26 @@ +package com.ruoyi.system.service.impl; + +import com.ruoyi.common.core.service.SensitiveService; +import com.ruoyi.common.helper.LoginHelper; +import org.springframework.stereotype.Service; + +/** + * 脱敏服务 + * 默认管理员不过滤 + * 需自行根据业务重写实现 + * + * @author Lion Li + * @version 3.6.0 + */ +@Service +public class SysSensitiveServiceImpl implements SensitiveService { + + /** + * 是否脱敏 + */ + @Override + public boolean isSensitive() { + return LoginHelper.isAdmin(); + } + +} diff --git a/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysUserOnlineServiceImpl.java b/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysUserOnlineServiceImpl.java deleted file mode 100644 index 874f76ccd..000000000 --- a/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysUserOnlineServiceImpl.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.ruoyi.system.service.impl; - -import com.ruoyi.common.core.domain.entity.SysUser; -import com.ruoyi.common.core.domain.model.LoginUser; -import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.system.domain.SysUserOnline; -import com.ruoyi.system.service.ISysUserOnlineService; -import com.ruoyi.system.service.ISysUserService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -/** - * 在线用户 服务层处理 - * - * @author Lion Li - */ -@Service -public class SysUserOnlineServiceImpl implements ISysUserOnlineService { - - @Autowired - private ISysUserService userService; - - /** - * 通过登录地址查询信息 - * - * @param ipaddr 登录地址 - * @param user 用户信息 - * @return 在线用户信息 - */ - @Override - public SysUserOnline selectOnlineByIpaddr(String ipaddr, LoginUser user) { - if (StringUtils.equals(ipaddr, user.getIpaddr())) { - return loginUserToUserOnline(user); - } - return null; - } - - /** - * 通过用户名称查询信息 - * - * @param userName 用户名称 - * @param user 用户信息 - * @return 在线用户信息 - */ - @Override - public SysUserOnline selectOnlineByUserName(String userName, LoginUser user) { - if (StringUtils.equals(userName, user.getUsername())) { - return loginUserToUserOnline(user); - } - return null; - } - - /** - * 通过登录地址/用户名称查询信息 - * - * @param ipaddr 登录地址 - * @param userName 用户名称 - * @param user 用户信息 - * @return 在线用户信息 - */ - @Override - public SysUserOnline selectOnlineByInfo(String ipaddr, String userName, LoginUser user) { - if (StringUtils.equals(ipaddr, user.getIpaddr()) && StringUtils.equals(userName, user.getUsername())) { - return loginUserToUserOnline(user); - } - return null; - } - - /** - * 设置在线用户信息 - * - * @param user 用户信息 - * @return 在线用户 - */ - @Override - public SysUserOnline loginUserToUserOnline(LoginUser user) { - if (StringUtils.isNull(user)) { - return null; - } - SysUser sysUser = userService.selectUserById(user.getUserId()); - SysUserOnline sysUserOnline = new SysUserOnline(); - sysUserOnline.setTokenId(user.getToken()); - sysUserOnline.setUserName(user.getUsername()); - sysUserOnline.setIpaddr(user.getIpaddr()); - sysUserOnline.setLoginLocation(user.getLoginLocation()); - sysUserOnline.setBrowser(user.getBrowser()); - sysUserOnline.setOs(user.getOs()); - sysUserOnline.setLoginTime(user.getLoginTime()); - if (StringUtils.isNotNull(sysUser.getDept())) { - sysUserOnline.setDeptName(sysUser.getDept().getDeptName()); - } - return sysUserOnline; - } -} diff --git a/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java b/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java index a31b43a4d..00e999138 100644 --- a/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java @@ -1,6 +1,7 @@ package com.ruoyi.system.service.impl; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -8,11 +9,9 @@ import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.domain.entity.SysUser; -import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; -import com.ruoyi.common.core.service.UserService; import com.ruoyi.common.exception.ServiceException; -import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.helper.LoginHelper; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.system.domain.SysPost; @@ -20,8 +19,8 @@ import com.ruoyi.system.domain.SysUserPost; import com.ruoyi.system.domain.SysUserRole; import com.ruoyi.system.mapper.*; import com.ruoyi.system.service.ISysUserService; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -36,20 +35,15 @@ import java.util.stream.Collectors; * @author Lion Li */ @Slf4j +@RequiredArgsConstructor @Service -public class SysUserServiceImpl extends ServicePlusImpl implements ISysUserService, UserService { +public class SysUserServiceImpl implements ISysUserService { - @Autowired - private SysRoleMapper roleMapper; - - @Autowired - private SysPostMapper postMapper; - - @Autowired - private SysUserRoleMapper userRoleMapper; - - @Autowired - private SysUserPostMapper userPostMapper; + private final SysUserMapper baseMapper; + private final SysRoleMapper roleMapper; + private final SysPostMapper postMapper; + private final SysUserRoleMapper userRoleMapper; + private final SysUserPostMapper userPostMapper; @Override public TableDataInfo selectPageUserList(SysUser user, PageQuery pageQuery) { @@ -152,8 +146,8 @@ public class SysUserServiceImpl extends ServicePlusImpl().eq(SysUser::getUserName, userName)); - if (count > 0) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper().eq(SysUser::getUserName, userName)); + if (exist) { return UserConstants.NOT_UNIQUE; } return UserConstants.UNIQUE; @@ -167,11 +161,10 @@ public class SysUserServiceImpl extends ServicePlusImpl() - .eq(SysUser::getPhonenumber, user.getPhonenumber()) - .ne(SysUser::getUserId, userId)); - if (count > 0) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysUser::getPhonenumber, user.getPhonenumber()) + .ne(ObjectUtil.isNotNull(user.getUserId()), SysUser::getUserId, user.getUserId())); + if (exist) { return UserConstants.NOT_UNIQUE; } return UserConstants.UNIQUE; @@ -185,11 +178,10 @@ public class SysUserServiceImpl extends ServicePlusImpl() - .eq(SysUser::getEmail, user.getEmail()) - .ne(SysUser::getUserId, userId)); - if (count > 0) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysUser::getEmail, user.getEmail()) + .ne(ObjectUtil.isNotNull(user.getUserId()), SysUser::getUserId, user.getUserId())); + if (exist) { return UserConstants.NOT_UNIQUE; } return UserConstants.UNIQUE; @@ -202,7 +194,7 @@ public class SysUserServiceImpl extends ServicePlusImpl users = SpringUtils.getAopProxy(this).selectUserList(user); - if (StringUtils.isEmpty(users)) { + if (CollUtil.isEmpty(users)) { throw new ServiceException("没有权限访问用户数据!"); } } @@ -250,6 +242,8 @@ public class SysUserServiceImpl extends ServicePlusImpl 0; } @@ -284,7 +278,7 @@ public class SysUserServiceImpl extends ServicePlusImpl() - .eq(SysUserRole::getUserId, userId)); + .eq(SysUserRole::getUserId, userId)); insertUserRole(userId, roleIds); } @@ -320,9 +314,9 @@ public class SysUserServiceImpl extends ServicePlusImpl() - .set(SysUser::getAvatar, avatar) - .eq(SysUser::getUserName, userName)) > 0; + new LambdaUpdateWrapper() + .set(SysUser::getAvatar, avatar) + .eq(SysUser::getUserName, userName)) > 0; } /** @@ -346,9 +340,9 @@ public class SysUserServiceImpl extends ServicePlusImpl() - .set(SysUser::getPassword, password) - .eq(SysUser::getUserName, userName)); + new LambdaUpdateWrapper() + .set(SysUser::getPassword, password) + .eq(SysUser::getUserName, userName)); } /** @@ -358,7 +352,7 @@ public class SysUserServiceImpl extends ServicePlusImpl list = new ArrayList(); for (Long roleId : roles) { @@ -368,7 +362,7 @@ public class SysUserServiceImpl extends ServicePlusImpl 0) { - userRoleMapper.insertAll(list); + userRoleMapper.insertBatch(list); } } } @@ -380,7 +374,7 @@ public class SysUserServiceImpl extends ServicePlusImpl list = new ArrayList(); for (Long postId : posts) { @@ -390,7 +384,7 @@ public class SysUserServiceImpl extends ServicePlusImpl 0) { - userPostMapper.insertAll(list); + userPostMapper.insertBatch(list); } } } @@ -402,7 +396,7 @@ public class SysUserServiceImpl extends ServicePlusImpl list = new ArrayList(); for (Long roleId : roleIds) { @@ -412,7 +406,7 @@ public class SysUserServiceImpl extends ServicePlusImpl 0) { - userRoleMapper.insertAll(list); + userRoleMapper.insertBatch(list); } } } @@ -444,6 +438,7 @@ public class SysUserServiceImpl extends ServicePlusImpl ids = Arrays.asList(userIds); // 删除用户与角色关联 diff --git a/ruoyi/src/main/java/com/ruoyi/system/service/impl/TokenServiceImpl.java b/ruoyi/src/main/java/com/ruoyi/system/service/impl/TokenServiceImpl.java deleted file mode 100644 index eaf878650..000000000 --- a/ruoyi/src/main/java/com/ruoyi/system/service/impl/TokenServiceImpl.java +++ /dev/null @@ -1,202 +0,0 @@ -package com.ruoyi.system.service.impl; - -import cn.hutool.core.util.IdUtil; -import cn.hutool.http.useragent.UserAgent; -import cn.hutool.http.useragent.UserAgentUtil; -import cn.hutool.json.JSONObject; -import cn.hutool.jwt.JWTUtil; -import cn.hutool.jwt.signers.JWTSigner; -import cn.hutool.jwt.signers.JWTSignerUtil; -import com.ruoyi.common.constant.Constants; -import com.ruoyi.common.core.domain.model.LoginUser; -import com.ruoyi.common.core.service.TokenService; -import com.ruoyi.common.properties.TokenProperties; -import com.ruoyi.common.utils.RedisUtils; -import com.ruoyi.common.utils.ServletUtils; -import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.common.utils.ip.AddressUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import javax.servlet.http.HttpServletRequest; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.TimeUnit; - -/** - * token验证处理 - * - * @author Lion Li - */ -@Service -public class TokenServiceImpl implements TokenService { - - protected static final long MILLIS_SECOND = 1000; - - protected static final long MILLIS_MINUTE = 60 * MILLIS_SECOND; - - private static final Long MILLIS_MINUTE_TEN = 20 * 60 * 1000L; - - @Autowired - private TokenProperties tokenProperties; - - /** - * 获取用户身份信息 - * - * @return 用户信息 - */ - @Override - public LoginUser getLoginUser(HttpServletRequest request) { - // 获取请求携带的令牌 - String token = getToken(request); - if (StringUtils.isNotEmpty(token)) { - try { - JSONObject claims = parseToken(token); - // 解析对应的权限以及用户信息 - String uuid = claims.getStr(Constants.LOGIN_USER_KEY); - String userKey = getTokenKey(uuid); - LoginUser user = RedisUtils.getCacheObject(userKey); - return user; - } catch (Exception e) { - - } - } - return null; - } - - /** - * 设置用户身份信息 - */ - @Override - public void setLoginUser(LoginUser loginUser) { - if (StringUtils.isNotNull(loginUser) && StringUtils.isNotEmpty(loginUser.getToken())) { - refreshToken(loginUser); - } - } - - /** - * 删除用户身份信息 - */ - @Override - public void delLoginUser(String token) { - if (StringUtils.isNotEmpty(token)) { - String userKey = getTokenKey(token); - RedisUtils.deleteObject(userKey); - } - } - - /** - * 创建令牌 - * - * @param loginUser 用户信息 - * @return 令牌 - */ - @Override - public String createToken(LoginUser loginUser) { - String token = IdUtil.fastUUID(); - loginUser.setToken(token); - setUserAgent(loginUser); - refreshToken(loginUser); - - Map claims = new HashMap<>(); - claims.put(Constants.LOGIN_USER_KEY, token); - return createToken(claims); - } - - /** - * 验证令牌有效期,相差不足20分钟,自动刷新缓存 - * - * @param loginUser - * @return 令牌 - */ - @Override - public void verifyToken(LoginUser loginUser) { - long expireTime = loginUser.getExpireTime(); - long currentTime = System.currentTimeMillis(); - if (expireTime - currentTime <= MILLIS_MINUTE_TEN) { - refreshToken(loginUser); - } - } - - /** - * 刷新令牌有效期 - * - * @param loginUser 登录信息 - */ - @Override - public void refreshToken(LoginUser loginUser) { - loginUser.setLoginTime(System.currentTimeMillis()); - loginUser.setExpireTime(loginUser.getLoginTime() + tokenProperties.getExpireTime() * MILLIS_MINUTE); - // 根据uuid将loginUser缓存 - String userKey = getTokenKey(loginUser.getToken()); - RedisUtils.setCacheObject(userKey, loginUser, tokenProperties.getExpireTime(), TimeUnit.MINUTES); - } - - /** - * 设置用户代理信息 - * - * @param loginUser 登录信息 - */ - @Override - public void setUserAgent(LoginUser loginUser) { - UserAgent userAgent = UserAgentUtil.parse(ServletUtils.getRequest().getHeader("User-Agent")); - String ip = ServletUtils.getClientIP(); - loginUser.setIpaddr(ip); - loginUser.setLoginLocation(AddressUtils.getRealAddressByIP(ip)); - loginUser.setBrowser(userAgent.getBrowser().getName()); - loginUser.setOs(userAgent.getOs().getName()); - } - - /** - * 从数据声明生成令牌 - * - * @param claims 数据声明 - * @return 令牌 - */ - private String createToken(Map claims) { - JWTSigner signer = JWTSignerUtil.hs512(tokenProperties.getSecret().getBytes()); - String token = JWTUtil.createToken(claims, signer); - return token; - } - - /** - * 从令牌中获取数据声明 - * - * @param token 令牌 - * @return 数据声明 - */ - private JSONObject parseToken(String token) { - JWTSigner signer = JWTSignerUtil.hs512(tokenProperties.getSecret().getBytes()); - return JWTUtil.parseToken(token).setSigner(signer).getPayload().getClaimsJson(); - } - - /** - * 从令牌中获取用户名 - * - * @param token 令牌 - * @return 用户名 - */ - @Override - public String getUsernameFromToken(String token) { - JSONObject claims = parseToken(token); - return claims.getStr("sub"); - } - - /** - * 获取请求token - * - * @param request - * @return token - */ - private String getToken(HttpServletRequest request) { - String token = request.getHeader(tokenProperties.getHeader()); - if (StringUtils.isNotEmpty(token) && token.startsWith(Constants.TOKEN_PREFIX)) { - token = token.replace(Constants.TOKEN_PREFIX, ""); - } - return token; - } - - private String getTokenKey(String uuid) { - return Constants.LOGIN_TOKEN_KEY + uuid; - } -} diff --git a/ruoyi/src/main/java/com/ruoyi/system/service/impl/UserDetailsServiceImpl.java b/ruoyi/src/main/java/com/ruoyi/system/service/impl/UserDetailsServiceImpl.java deleted file mode 100644 index d4e30958d..000000000 --- a/ruoyi/src/main/java/com/ruoyi/system/service/impl/UserDetailsServiceImpl.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.ruoyi.system.service.impl; - -import com.ruoyi.common.core.domain.entity.SysUser; -import com.ruoyi.common.core.domain.model.LoginUser; -import com.ruoyi.common.enums.UserStatus; -import com.ruoyi.common.exception.user.UserException; -import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.system.service.ISysUserService; -import com.ruoyi.system.service.SysPermissionService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.security.core.userdetails.UsernameNotFoundException; -import org.springframework.stereotype.Service; - -/** - * 用户验证处理 - * - * @author ruoyi - */ -@Slf4j -@Service -public class UserDetailsServiceImpl implements UserDetailsService { - - @Autowired - private ISysUserService userService; - - @Autowired - private SysPermissionService permissionService; - - @Override - public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { - SysUser user = userService.selectUserByUserName(username); - if (StringUtils.isNull(user)) { - log.info("登录用户:{} 不存在.", username); - throw new UserException("user.not.exists", username); - } else if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) { - log.info("登录用户:{} 已被删除.", username); - throw new UserException("user.password.delete", username); - } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) { - log.info("登录用户:{} 已被停用.", username); - throw new UserException("user.blocked", username); - } - - return createLoginUser(user); - } - - public UserDetails createLoginUser(SysUser user) { - return new LoginUser() - .setUserId(user.getUserId()) - .setDeptId(user.getDeptId()) - .setUsername(user.getUserName()) - .setPassword(user.getPassword()) - .setMenuPermissions(permissionService.getMenuPermission(user)) - .setRolePermissions(permissionService.getRolePermission(user)); - } -} diff --git a/ruoyi/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java b/ruoyi/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java index 4a2bf30d7..a19be65ea 100644 --- a/ruoyi/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java +++ b/ruoyi/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java @@ -5,10 +5,10 @@ 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.RedisUtils; import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.redis.RedisUtils; import com.ruoyi.common.utils.reflect.ReflectUtils; import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.framework.config.properties.CaptchaProperties; @@ -16,7 +16,6 @@ import com.ruoyi.system.service.ISysConfigService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @@ -30,7 +29,7 @@ import java.util.concurrent.TimeUnit; * @author Lion Li */ @Api(value = "验证码操作处理", tags = {"验证码管理"}) -@RequiredArgsConstructor(onConstructor_ = @Autowired) +@RequiredArgsConstructor @RestController public class CaptchaController { @@ -42,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(); @@ -64,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/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java b/ruoyi/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java index ef81c99a3..21fbd201f 100644 --- a/ruoyi/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java +++ b/ruoyi/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java @@ -1,15 +1,14 @@ package com.ruoyi.web.controller.monitor; -import com.ruoyi.common.core.domain.AjaxResult; +import cn.dev33.satoken.annotation.SaCheckPermission; +import com.ruoyi.common.core.domain.R; import com.ruoyi.common.utils.StringUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.connection.RedisServerCommands; import org.springframework.data.redis.core.RedisCallback; import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -22,7 +21,7 @@ import java.util.*; * @author Lion Li */ @Api(value = "缓存监控", tags = {"缓存监控管理"}) -@RequiredArgsConstructor(onConstructor_ = @Autowired) +@RequiredArgsConstructor @RestController @RequestMapping("/monitor/cache") public class CacheController { @@ -30,9 +29,9 @@ public class CacheController { private final RedisTemplate redisTemplate; @ApiOperation("获取缓存监控详细信息") - @PreAuthorize("@ss.hasPermi('monitor:cache:list')") + @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); @@ -52,6 +51,6 @@ public class CacheController { }); } result.put("commandStats", pieList); - return AjaxResult.success(result); + return R.ok(result); } } diff --git a/ruoyi/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java b/ruoyi/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java index 106605ae3..5bec15169 100644 --- a/ruoyi/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java +++ b/ruoyi/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java @@ -1,8 +1,9 @@ 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; @@ -12,8 +13,6 @@ import com.ruoyi.system.service.ISysLogininforService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -27,7 +26,7 @@ import java.util.List; */ @Validated @Api(value = "系统访问记录", tags = {"系统访问记录管理"}) -@RequiredArgsConstructor(onConstructor_ = @Autowired) +@RequiredArgsConstructor @RestController @RequestMapping("/monitor/logininfor") public class SysLogininforController extends BaseController { @@ -35,7 +34,7 @@ public class SysLogininforController extends BaseController { private final ISysLogininforService logininforService; @ApiOperation("查询系统访问记录列表") - @PreAuthorize("@ss.hasPermi('monitor:logininfor:list')") + @SaCheckPermission("monitor:logininfor:list") @GetMapping("/list") public TableDataInfo list(SysLogininfor logininfor, PageQuery pageQuery) { return logininforService.selectPageLogininforList(logininfor, pageQuery); @@ -43,7 +42,7 @@ public class SysLogininforController extends BaseController { @ApiOperation("导出系统访问记录列表") @Log(title = "登录日志", businessType = BusinessType.EXPORT) - @PreAuthorize("@ss.hasPermi('monitor:logininfor:export')") + @SaCheckPermission("monitor:logininfor:export") @PostMapping("/export") public void export(SysLogininfor logininfor, HttpServletResponse response) { List list = logininforService.selectLogininforList(logininfor); @@ -51,19 +50,19 @@ public class SysLogininforController extends BaseController { } @ApiOperation("删除系统访问记录") - @PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')") + @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)); } @ApiOperation("清空系统访问记录") - @PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')") + @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/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java b/ruoyi/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java index 8af583277..8145bc66e 100644 --- a/ruoyi/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java +++ b/ruoyi/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java @@ -1,8 +1,9 @@ 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; @@ -12,8 +13,6 @@ import com.ruoyi.system.service.ISysOperLogService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -27,7 +26,7 @@ import java.util.List; */ @Validated @Api(value = "操作日志记录", tags = {"操作日志记录管理"}) -@RequiredArgsConstructor(onConstructor_ = @Autowired) +@RequiredArgsConstructor @RestController @RequestMapping("/monitor/operlog") public class SysOperlogController extends BaseController { @@ -35,7 +34,7 @@ public class SysOperlogController extends BaseController { private final ISysOperLogService operLogService; @ApiOperation("查询操作日志记录列表") - @PreAuthorize("@ss.hasPermi('monitor:operlog:list')") + @SaCheckPermission("monitor:operlog:list") @GetMapping("/list") public TableDataInfo list(SysOperLog operLog, PageQuery pageQuery) { return operLogService.selectPageOperLogList(operLog, pageQuery); @@ -43,7 +42,7 @@ public class SysOperlogController extends BaseController { @ApiOperation("导出操作日志记录列表") @Log(title = "操作日志", businessType = BusinessType.EXPORT) - @PreAuthorize("@ss.hasPermi('monitor:operlog:export')") + @SaCheckPermission("monitor:operlog:export") @PostMapping("/export") public void export(SysOperLog operLog, HttpServletResponse response) { List list = operLogService.selectOperLogList(operLog); @@ -52,18 +51,18 @@ public class SysOperlogController extends BaseController { @ApiOperation("删除操作日志记录") @Log(title = "操作日志", businessType = BusinessType.DELETE) - @PreAuthorize("@ss.hasPermi('monitor:operlog:remove')") + @SaCheckPermission("monitor:operlog:remove") @DeleteMapping("/{operIds}") - public AjaxResult remove(@PathVariable Long[] operIds) { + public R remove(@PathVariable Long[] operIds) { return toAjax(operLogService.deleteOperLogByIds(operIds)); } @ApiOperation("清空操作日志记录") @Log(title = "操作日志", businessType = BusinessType.CLEAN) - @PreAuthorize("@ss.hasPermi('monitor:operlog:remove')") + @SaCheckPermission("monitor:operlog:remove") @DeleteMapping("/clean") - public AjaxResult clean() { + public R clean() { operLogService.cleanOperLog(); - return AjaxResult.success(); + return R.ok(); } } diff --git a/ruoyi/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java b/ruoyi/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java index 05917807f..2ad51e315 100644 --- a/ruoyi/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java +++ b/ruoyi/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java @@ -1,27 +1,28 @@ package com.ruoyi.web.controller.monitor; +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.exception.NotLoginException; +import cn.dev33.satoken.stp.StpUtil; +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.model.LoginUser; +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; -import com.ruoyi.common.utils.RedisUtils; import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.redis.RedisUtils; import com.ruoyi.system.domain.SysUserOnline; -import com.ruoyi.system.service.ISysUserOnlineService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; /** * 在线用户监控 @@ -29,39 +30,43 @@ import java.util.List; * @author Lion Li */ @Api(value = "在线用户监控", tags = {"在线用户监控管理"}) -@RequiredArgsConstructor(onConstructor_ = @Autowired) +@RequiredArgsConstructor @RestController @RequestMapping("/monitor/online") public class SysUserOnlineController extends BaseController { - private final ISysUserOnlineService userOnlineService; - @ApiOperation("在线用户列表") - @PreAuthorize("@ss.hasPermi('monitor:online:list')") + @SaCheckPermission("monitor:online:list") @GetMapping("/list") public TableDataInfo list(String ipaddr, String userName) { - Collection keys = RedisUtils.keys(Constants.LOGIN_TOKEN_KEY + "*"); - List userOnlineList = new ArrayList(); + // 获取所有未过期的 token + List keys = StpUtil.searchTokenValue("", -1, 0); + List userOnlineDTOList = new ArrayList<>(); for (String key : keys) { - LoginUser user = RedisUtils.getCacheObject(key); - if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(userName)) { - if (StringUtils.equals(ipaddr, user.getIpaddr()) && StringUtils.equals(userName, user.getUsername())) { - userOnlineList.add(userOnlineService.selectOnlineByInfo(ipaddr, userName, user)); - } - } else if (StringUtils.isNotEmpty(ipaddr)) { - if (StringUtils.equals(ipaddr, user.getIpaddr())) { - userOnlineList.add(userOnlineService.selectOnlineByIpaddr(ipaddr, user)); - } - } else if (StringUtils.isNotEmpty(userName)) { - if (StringUtils.equals(userName, user.getUsername())) { - userOnlineList.add(userOnlineService.selectOnlineByUserName(userName, user)); - } - } else { - userOnlineList.add(userOnlineService.loginUserToUserOnline(user)); + String token = key.replace(Constants.LOGIN_TOKEN_KEY, ""); + // 如果已经过期则踢下线 + if (StpUtil.stpLogic.getTokenActivityTimeoutByToken(token) < 0) { + continue; } + userOnlineDTOList.add(RedisUtils.getCacheObject(Constants.ONLINE_TOKEN_KEY + token)); } - Collections.reverse(userOnlineList); - userOnlineList.removeAll(Collections.singleton(null)); + if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(userName)) { + userOnlineDTOList = userOnlineDTOList.stream().filter(userOnline -> + StringUtils.equals(ipaddr, userOnline.getIpaddr()) && + StringUtils.equals(userName, userOnline.getUserName()) + ).collect(Collectors.toList()); + } else if (StringUtils.isNotEmpty(ipaddr)) { + userOnlineDTOList = userOnlineDTOList.stream().filter(userOnline -> + StringUtils.equals(ipaddr, userOnline.getIpaddr())) + .collect(Collectors.toList()); + } else if (StringUtils.isNotEmpty(userName)) { + userOnlineDTOList = userOnlineDTOList.stream().filter(userOnline -> + StringUtils.equals(userName, userOnline.getUserName()) + ).collect(Collectors.toList()); + } + Collections.reverse(userOnlineDTOList); + userOnlineDTOList.removeAll(Collections.singleton(null)); + List userOnlineList = BeanUtil.copyToList(userOnlineDTOList, SysUserOnline.class); return TableDataInfo.build(userOnlineList); } @@ -69,11 +74,14 @@ public class SysUserOnlineController extends BaseController { * 强退用户 */ @ApiOperation("强退用户") - @PreAuthorize("@ss.hasPermi('monitor:online:forceLogout')") + @SaCheckPermission("monitor:online:forceLogout") @Log(title = "在线用户", businessType = BusinessType.FORCE) @DeleteMapping("/{tokenId}") - public AjaxResult forceLogout(@PathVariable String tokenId) { - RedisUtils.deleteObject(Constants.LOGIN_TOKEN_KEY + tokenId); - return AjaxResult.success(); + public R forceLogout(@PathVariable String tokenId) { + try { + StpUtil.kickoutByTokenValue(tokenId); + } catch (NotLoginException e) { + } + return R.ok(); } } diff --git a/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java b/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java index e646b9a86..2dcb84375 100644 --- a/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java +++ b/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java @@ -1,9 +1,10 @@ package com.ruoyi.web.controller.system; +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; @@ -14,8 +15,6 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -29,7 +28,7 @@ import java.util.List; */ @Validated @Api(value = "参数配置控制器", tags = {"参数配置管理"}) -@RequiredArgsConstructor(onConstructor_ = @Autowired) +@RequiredArgsConstructor @RestController @RequestMapping("/system/config") public class SysConfigController extends BaseController { @@ -40,7 +39,7 @@ public class SysConfigController extends BaseController { * 获取参数配置列表 */ @ApiOperation("获取参数配置列表") - @PreAuthorize("@ss.hasPermi('system:config:list')") + @SaCheckPermission("system:config:list") @GetMapping("/list") public TableDataInfo list(SysConfig config, PageQuery pageQuery) { return configService.selectPageConfigList(config, pageQuery); @@ -48,7 +47,7 @@ public class SysConfigController extends BaseController { @ApiOperation("导出参数配置列表") @Log(title = "参数管理", businessType = BusinessType.EXPORT) - @PreAuthorize("@ss.hasPermi('system:config:export')") + @SaCheckPermission("system:config:export") @PostMapping("/export") public void export(SysConfig config, HttpServletResponse response) { List list = configService.selectConfigList(config); @@ -59,10 +58,10 @@ public class SysConfigController extends BaseController { * 根据参数编号获取详细信息 */ @ApiOperation("根据参数编号获取详细信息") - @PreAuthorize("@ss.hasPermi('system:config:query')") + @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)); } /** @@ -70,20 +69,20 @@ 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)); } /** * 新增参数配置 */ @ApiOperation("新增参数配置") - @PreAuthorize("@ss.hasPermi('system:config:add')") + @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)); } @@ -92,37 +91,48 @@ public class SysConfigController extends BaseController { * 修改参数配置 */ @ApiOperation("修改参数配置") - @PreAuthorize("@ss.hasPermi('system:config:edit')") + @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)); + } + /** * 删除参数配置 */ @ApiOperation("删除参数配置") - @PreAuthorize("@ss.hasPermi('system:config:remove')") + @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(); } /** * 刷新参数缓存 */ @ApiOperation("刷新参数缓存") - @PreAuthorize("@ss.hasPermi('system:config:remove')") + @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/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java b/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java index e47b1e885..475cdb7e4 100644 --- a/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java +++ b/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java @@ -1,11 +1,12 @@ package com.ruoyi.web.controller.system; +import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.lang.tree.Tree; 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; @@ -14,8 +15,6 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -30,7 +29,7 @@ import java.util.Map; */ @Validated @Api(value = "部门控制器", tags = {"部门管理"}) -@RequiredArgsConstructor(onConstructor_ = @Autowired) +@RequiredArgsConstructor @RestController @RequestMapping("/system/dept") public class SysDeptController extends BaseController { @@ -41,35 +40,35 @@ public class SysDeptController extends BaseController { * 获取部门列表 */ @ApiOperation("获取部门列表") - @PreAuthorize("@ss.hasPermi('system:dept:list')") + @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); } /** * 查询部门列表(排除节点) */ @ApiOperation("查询部门列表(排除节点)") - @PreAuthorize("@ss.hasPermi('system:dept:list')") + @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); + || ArrayUtil.contains(StringUtils.split(d.getAncestors(), ","), deptId + "")); + return R.ok(depts); } /** * 根据部门编号获取详细信息 */ @ApiOperation("根据部门编号获取详细信息") - @PreAuthorize("@ss.hasPermi('system:dept:query')") + @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)); } /** @@ -77,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)); } /** @@ -87,24 +86,24 @@ 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); } /** * 新增部门 */ @ApiOperation("新增部门") - @PreAuthorize("@ss.hasPermi('system:dept:add')") + @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)); } @@ -113,17 +112,19 @@ public class SysDeptController extends BaseController { * 修改部门 */ @ApiOperation("修改部门") - @PreAuthorize("@ss.hasPermi('system:dept:edit')") + @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)); } @@ -132,16 +133,17 @@ public class SysDeptController extends BaseController { * 删除部门 */ @ApiOperation("删除部门") - @PreAuthorize("@ss.hasPermi('system:dept:remove')") + @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/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java b/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java index 07cb74e03..060e980e4 100644 --- a/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java +++ b/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java @@ -1,13 +1,14 @@ package com.ruoyi.web.controller.system; +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; import com.ruoyi.common.enums.BusinessType; -import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.system.service.ISysDictDataService; import com.ruoyi.system.service.ISysDictTypeService; @@ -15,8 +16,6 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -31,7 +30,7 @@ import java.util.List; */ @Validated @Api(value = "数据字典信息控制器", tags = {"数据字典信息管理"}) -@RequiredArgsConstructor(onConstructor_ = @Autowired) +@RequiredArgsConstructor @RestController @RequestMapping("/system/dict/data") public class SysDictDataController extends BaseController { @@ -40,7 +39,7 @@ public class SysDictDataController extends BaseController { private final ISysDictTypeService dictTypeService; @ApiOperation("查询字典数据列表") - @PreAuthorize("@ss.hasPermi('system:dict:list')") + @SaCheckPermission("system:dict:list") @GetMapping("/list") public TableDataInfo list(SysDictData dictData, PageQuery pageQuery) { return dictDataService.selectPageDictDataList(dictData, pageQuery); @@ -48,7 +47,7 @@ public class SysDictDataController extends BaseController { @ApiOperation("导出字典数据列表") @Log(title = "字典数据", businessType = BusinessType.EXPORT) - @PreAuthorize("@ss.hasPermi('system:dict:export')") + @SaCheckPermission("system:dict:export") @PostMapping("/export") public void export(SysDictData dictData, HttpServletResponse response) { List list = dictDataService.selectDictDataList(dictData); @@ -59,10 +58,10 @@ public class SysDictDataController extends BaseController { * 查询字典数据详细 */ @ApiOperation("查询字典数据详细") - @PreAuthorize("@ss.hasPermi('system:dict:query')") + @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)); } /** @@ -70,22 +69,22 @@ 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 (StringUtils.isNull(data)) { + if (ObjectUtil.isNull(data)) { data = new ArrayList<>(); } - return AjaxResult.success(data); + return R.ok(data); } /** * 新增字典类型 */ @ApiOperation("新增字典类型") - @PreAuthorize("@ss.hasPermi('system:dict:add')") + @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)); } @@ -93,10 +92,10 @@ public class SysDictDataController extends BaseController { * 修改保存字典类型 */ @ApiOperation("修改保存字典类型") - @PreAuthorize("@ss.hasPermi('system:dict:edit')") + @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)); } @@ -104,11 +103,11 @@ public class SysDictDataController extends BaseController { * 删除字典类型 */ @ApiOperation("删除字典类型") - @PreAuthorize("@ss.hasPermi('system:dict:remove')") + @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/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java b/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java index ca43783b2..c8ebd49be 100644 --- a/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java +++ b/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java @@ -1,9 +1,10 @@ package com.ruoyi.web.controller.system; +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; @@ -14,8 +15,6 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -29,7 +28,7 @@ import java.util.List; */ @Validated @Api(value = "数据字典信息控制器", tags = {"数据字典信息管理"}) -@RequiredArgsConstructor(onConstructor_ = @Autowired) +@RequiredArgsConstructor @RestController @RequestMapping("/system/dict/type") public class SysDictTypeController extends BaseController { @@ -37,7 +36,7 @@ public class SysDictTypeController extends BaseController { private final ISysDictTypeService dictTypeService; @ApiOperation("查询字典类型列表") - @PreAuthorize("@ss.hasPermi('system:dict:list')") + @SaCheckPermission("system:dict:list") @GetMapping("/list") public TableDataInfo list(SysDictType dictType, PageQuery pageQuery) { return dictTypeService.selectPageDictTypeList(dictType, pageQuery); @@ -45,7 +44,7 @@ public class SysDictTypeController extends BaseController { @ApiOperation("导出字典类型列表") @Log(title = "字典类型", businessType = BusinessType.EXPORT) - @PreAuthorize("@ss.hasPermi('system:dict:export')") + @SaCheckPermission("system:dict:export") @PostMapping("/export") public void export(SysDictType dictType, HttpServletResponse response) { List list = dictTypeService.selectDictTypeList(dictType); @@ -56,22 +55,22 @@ public class SysDictTypeController extends BaseController { * 查询字典类型详细 */ @ApiOperation("查询字典类型详细") - @PreAuthorize("@ss.hasPermi('system:dict:query')") + @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)); } /** * 新增字典类型 */ @ApiOperation("新增字典类型") - @PreAuthorize("@ss.hasPermi('system:dict:add')") + @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)); } @@ -80,12 +79,12 @@ public class SysDictTypeController extends BaseController { * 修改字典类型 */ @ApiOperation("修改字典类型") - @PreAuthorize("@ss.hasPermi('system:dict:edit')") + @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)); } @@ -94,24 +93,24 @@ public class SysDictTypeController extends BaseController { * 删除字典类型 */ @ApiOperation("删除字典类型") - @PreAuthorize("@ss.hasPermi('system:dict:remove')") + @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(); } /** * 刷新字典缓存 */ @ApiOperation("刷新字典缓存") - @PreAuthorize("@ss.hasPermi('system:dict:remove')") + @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(); } /** @@ -119,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/src/main/java/com/ruoyi/web/controller/system/SysIndexController.java b/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysIndexController.java index 541333698..c68891997 100644 --- a/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysIndexController.java +++ b/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysIndexController.java @@ -5,7 +5,6 @@ import com.ruoyi.common.utils.StringUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @@ -15,7 +14,7 @@ import org.springframework.web.bind.annotation.RestController; * @author Lion Li */ @Api(value = "首页控制器", tags = {"首页管理"}) -@RequiredArgsConstructor(onConstructor_ = @Autowired) +@RequiredArgsConstructor @RestController public class SysIndexController { diff --git a/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java b/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java index 9e518234d..3a033e517 100644 --- a/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java +++ b/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java @@ -1,11 +1,13 @@ 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.utils.SecurityUtils; +import com.ruoyi.common.helper.LoginHelper; import com.ruoyi.system.domain.vo.RouterVo; import com.ruoyi.system.service.ISysMenuService; import com.ruoyi.system.service.ISysUserService; @@ -14,7 +16,6 @@ import com.ruoyi.system.service.SysPermissionService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; @@ -33,7 +34,7 @@ import java.util.Set; */ @Validated @Api(value = "登录验证控制器", tags = {"登录验证管理"}) -@RequiredArgsConstructor(onConstructor_ = @Autowired) +@RequiredArgsConstructor @RestController public class SysLoginController { @@ -50,13 +51,23 @@ 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()); + loginBody.getUuid()); ajax.put(Constants.TOKEN, token); - return AjaxResult.success(ajax); + return R.ok(ajax); + } + + @ApiOperation("登出方法") + @PostMapping("/logout") + public R logout() { + try { + StpUtil.logout(); + } catch (NotLoginException e) { + } + return R.ok("退出成功"); } /** @@ -66,8 +77,8 @@ public class SysLoginController { */ @ApiOperation("获取用户信息") @GetMapping("getInfo") - public AjaxResult> getInfo() { - SysUser user = userService.selectUserById(SecurityUtils.getUserId()); + public R> getInfo() { + SysUser user = userService.selectUserById(LoginHelper.getUserId()); // 角色集合 Set roles = permissionService.getRolePermission(user); // 权限集合 @@ -76,7 +87,7 @@ public class SysLoginController { ajax.put("user", user); ajax.put("roles", roles); ajax.put("permissions", permissions); - return AjaxResult.success(ajax); + return R.ok(ajax); } /** @@ -86,9 +97,9 @@ public class SysLoginController { */ @ApiOperation("获取路由信息") @GetMapping("getRouters") - public AjaxResult> getRouters() { - Long userId = SecurityUtils.getUserId(); + 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/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java b/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java index a525ac422..030363e00 100644 --- a/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java +++ b/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java @@ -1,10 +1,11 @@ package com.ruoyi.web.controller.system; +import cn.dev33.satoken.annotation.SaCheckPermission; 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; @@ -13,8 +14,6 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -29,7 +28,7 @@ import java.util.Map; */ @Validated @Api(value = "菜单信息控制器", tags = {"菜单信息管理"}) -@RequiredArgsConstructor(onConstructor_ = @Autowired) +@RequiredArgsConstructor @RestController @RequestMapping("/system/menu") public class SysMenuController extends BaseController { @@ -40,21 +39,21 @@ public class SysMenuController extends BaseController { * 获取菜单列表 */ @ApiOperation("获取菜单列表") - @PreAuthorize("@ss.hasPermi('system:menu:list')") + @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); } /** * 根据菜单编号获取详细信息 */ @ApiOperation("根据菜单编号获取详细信息") - @PreAuthorize("@ss.hasPermi('system:menu:query')") + @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)); } /** @@ -62,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)); } /** @@ -72,26 +71,26 @@ 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); } /** * 新增菜单 */ @ApiOperation("新增菜单") - @PreAuthorize("@ss.hasPermi('system:menu:add')") + @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)); } @@ -100,16 +99,16 @@ public class SysMenuController extends BaseController { * 修改菜单 */ @ApiOperation("修改菜单") - @PreAuthorize("@ss.hasPermi('system:menu:edit')") + @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)); } @@ -118,15 +117,15 @@ public class SysMenuController extends BaseController { * 删除菜单 */ @ApiOperation("删除菜单") - @PreAuthorize("@ss.hasPermi('system:menu:remove')") + @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/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java b/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java index 337bf32a3..6febd3e3f 100644 --- a/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java +++ b/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java @@ -1,8 +1,9 @@ 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; @@ -12,8 +13,6 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -24,7 +23,7 @@ import org.springframework.web.bind.annotation.*; */ @Validated @Api(value = "公告信息控制器", tags = {"公告信息管理"}) -@RequiredArgsConstructor(onConstructor_ = @Autowired) +@RequiredArgsConstructor @RestController @RequestMapping("/system/notice") public class SysNoticeController extends BaseController { @@ -35,7 +34,7 @@ public class SysNoticeController extends BaseController { * 获取通知公告列表 */ @ApiOperation("获取通知公告列表") - @PreAuthorize("@ss.hasPermi('system:notice:list')") + @SaCheckPermission("system:notice:list") @GetMapping("/list") public TableDataInfo list(SysNotice notice, PageQuery pageQuery) { return noticeService.selectPageNoticeList(notice, pageQuery); @@ -45,20 +44,20 @@ public class SysNoticeController extends BaseController { * 根据通知公告编号获取详细信息 */ @ApiOperation("根据通知公告编号获取详细信息") - @PreAuthorize("@ss.hasPermi('system:notice:query')") + @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)); } /** * 新增通知公告 */ @ApiOperation("新增通知公告") - @PreAuthorize("@ss.hasPermi('system:notice:add')") + @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)); } @@ -66,10 +65,10 @@ public class SysNoticeController extends BaseController { * 修改通知公告 */ @ApiOperation("修改通知公告") - @PreAuthorize("@ss.hasPermi('system:notice:edit')") + @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)); } @@ -77,10 +76,10 @@ public class SysNoticeController extends BaseController { * 删除通知公告 */ @ApiOperation("删除通知公告") - @PreAuthorize("@ss.hasPermi('system:notice:remove')") + @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/src/main/java/com/ruoyi/web/controller/system/SysOssConfigController.java b/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysOssConfigController.java index 803f95ece..e344dea98 100644 --- a/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysOssConfigController.java +++ b/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysOssConfigController.java @@ -1,9 +1,10 @@ package com.ruoyi.web.controller.system; +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; @@ -17,8 +18,6 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -35,7 +34,7 @@ import java.util.Arrays; */ @Validated @Api(value = "对象存储配置控制器", tags = {"对象存储配置管理"}) -@RequiredArgsConstructor(onConstructor_ = @Autowired) +@RequiredArgsConstructor @RestController @RequestMapping("/system/oss/config") public class SysOssConfigController extends BaseController { @@ -46,7 +45,7 @@ public class SysOssConfigController extends BaseController { * 查询对象存储配置列表 */ @ApiOperation("查询对象存储配置列表") - @PreAuthorize("@ss.hasPermi('system:oss:list')") + @SaCheckPermission("system:oss:list") @GetMapping("/list") public TableDataInfo list(@Validated(QueryGroup.class) SysOssConfigBo bo, PageQuery pageQuery) { return iSysOssConfigService.queryPageList(bo, pageQuery); @@ -56,23 +55,23 @@ public class SysOssConfigController extends BaseController { * 获取对象存储配置详细信息 */ @ApiOperation("获取对象存储配置详细信息") - @PreAuthorize("@ss.hasPermi('system:oss:query')") + @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)); } /** * 新增对象存储配置 */ @ApiOperation("新增对象存储配置") - @PreAuthorize("@ss.hasPermi('system:oss:add')") + @SaCheckPermission("system:oss:add") @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); } @@ -80,11 +79,11 @@ public class SysOssConfigController extends BaseController { * 修改对象存储配置 */ @ApiOperation("修改对象存储配置") - @PreAuthorize("@ss.hasPermi('system:oss:edit')") + @SaCheckPermission("system:oss:edit") @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); } @@ -92,10 +91,10 @@ public class SysOssConfigController extends BaseController { * 删除对象存储配置 */ @ApiOperation("删除对象存储配置") - @PreAuthorize("@ss.hasPermi('system:oss:remove')") + @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); @@ -105,10 +104,10 @@ public class SysOssConfigController extends BaseController { * 状态修改 */ @ApiOperation("状态修改") - @PreAuthorize("@ss.hasPermi('system:oss:edit')") + @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/src/main/java/com/ruoyi/web/controller/system/SysOssController.java b/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysOssController.java index 01e1bd049..55fb73b9a 100644 --- a/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysOssController.java +++ b/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysOssController.java @@ -1,24 +1,21 @@ package com.ruoyi.web.controller.system; +import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.ObjectUtil; import cn.hutool.http.HttpException; import cn.hutool.http.HttpUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 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; @@ -26,9 +23,7 @@ import com.ruoyi.system.service.ISysConfigService; import com.ruoyi.system.service.ISysOssService; import io.swagger.annotations.*; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -47,8 +42,8 @@ import java.util.Map; * @author Lion Li */ @Validated -@Api(value = "OSS对象存储控制器", tags = {"OSS对象存储管理"}) -@RequiredArgsConstructor(onConstructor_ = @Autowired) +@Api(value = "对象存储控制器", tags = {"对象存储管理"}) +@RequiredArgsConstructor @RestController @RequestMapping("/system/oss") public class SysOssController extends BaseController { @@ -60,7 +55,7 @@ public class SysOssController extends BaseController { * 查询OSS对象存储列表 */ @ApiOperation("查询OSS对象存储列表") - @PreAuthorize("@ss.hasPermi('system:oss:list')") + @SaCheckPermission("system:oss:list") @GetMapping("/list") public TableDataInfo list(@Validated(QueryGroup.class) SysOssBo bo, PageQuery pageQuery) { return iSysOssService.queryPageList(bo, pageQuery); @@ -71,13 +66,13 @@ 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) }) - @PreAuthorize("@ss.hasPermi('system:oss:upload')") + @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("上传文件不能为空"); } @@ -85,11 +80,11 @@ 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对象存储") - @PreAuthorize("@ss.hasPermi('system:oss:download')") + @SaCheckPermission("system:oss:download") @GetMapping("/download/{ossId}") public void download(@ApiParam("OSS对象ID") @PathVariable Long ossId, HttpServletResponse response) throws IOException { SysOss sysOss = iSysOssService.getById(ossId); @@ -116,28 +111,13 @@ public class SysOssController extends BaseController { * 删除OSS对象存储 */ @ApiOperation("删除OSS对象存储") - @PreAuthorize("@ss.hasPermi('system:oss:remove')") + @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("变更图片列表预览状态") - @PreAuthorize("@ss.hasPermi('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 LambdaQueryWrapper() - .eq(SysConfig::getConfigKey, OssConstant.PEREVIEW_LIST_RESOURCE_KEY)); - config.setConfigValue(map.get("previewListResource").toString()); - return toAjax(iSysConfigService.updateConfig(config)); - } - } diff --git a/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysPostController.java b/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysPostController.java index 4f119e411..7e08698f9 100644 --- a/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysPostController.java +++ b/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysPostController.java @@ -1,9 +1,10 @@ package com.ruoyi.web.controller.system; +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; @@ -14,8 +15,6 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -29,7 +28,7 @@ import java.util.List; */ @Validated @Api(value = "岗位信息控制器", tags = {"岗位信息管理"}) -@RequiredArgsConstructor(onConstructor_ = @Autowired) +@RequiredArgsConstructor @RestController @RequestMapping("/system/post") public class SysPostController extends BaseController { @@ -40,7 +39,7 @@ public class SysPostController extends BaseController { * 获取岗位列表 */ @ApiOperation("获取岗位列表") - @PreAuthorize("@ss.hasPermi('system:post:list')") + @SaCheckPermission("system:post:list") @GetMapping("/list") public TableDataInfo list(SysPost post, PageQuery pageQuery) { return postService.selectPagePostList(post, pageQuery); @@ -48,7 +47,7 @@ public class SysPostController extends BaseController { @ApiOperation("导出岗位列表") @Log(title = "岗位管理", businessType = BusinessType.EXPORT) - @PreAuthorize("@ss.hasPermi('system:post:export')") + @SaCheckPermission("system:post:export") @PostMapping("/export") public void export(SysPost post, HttpServletResponse response) { List list = postService.selectPostList(post); @@ -59,24 +58,24 @@ public class SysPostController extends BaseController { * 根据岗位编号获取详细信息 */ @ApiOperation("根据岗位编号获取详细信息") - @PreAuthorize("@ss.hasPermi('system:post:query')") + @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)); } /** * 新增岗位 */ @ApiOperation("新增岗位") - @PreAuthorize("@ss.hasPermi('system:post:add')") + @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)); } @@ -85,14 +84,14 @@ public class SysPostController extends BaseController { * 修改岗位 */ @ApiOperation("修改岗位") - @PreAuthorize("@ss.hasPermi('system:post:edit')") + @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)); } @@ -101,10 +100,10 @@ public class SysPostController extends BaseController { * 删除岗位 */ @ApiOperation("删除岗位") - @PreAuthorize("@ss.hasPermi('system:post:remove')") + @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)); } @@ -113,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/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java b/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java index ce5af78a1..84d4c0b3d 100644 --- a/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java +++ b/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java @@ -1,14 +1,13 @@ 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.domain.model.LoginUser; -import com.ruoyi.common.core.service.TokenService; import com.ruoyi.common.enums.BusinessType; -import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.helper.LoginHelper; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.system.domain.SysOss; import com.ruoyi.system.service.ISysOssService; @@ -18,7 +17,6 @@ import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -34,13 +32,12 @@ import java.util.Map; */ @Validated @Api(value = "个人信息控制器", tags = {"个人信息管理"}) -@RequiredArgsConstructor(onConstructor_ = @Autowired) +@RequiredArgsConstructor @RestController @RequestMapping("/system/user/profile") public class SysProfileController extends BaseController { private final ISysUserService userService; - private final TokenService tokenService; private final ISysOssService iSysOssService; /** @@ -48,14 +45,13 @@ public class SysProfileController extends BaseController { */ @ApiOperation("个人信息") @GetMapping - public AjaxResult> profile() { - LoginUser loginUser = getLoginUser(); - SysUser user = userService.selectUserById(loginUser.getUserId()); + public R> profile() { + SysUser user = userService.selectUserById(getUserId()); Map ajax = new HashMap<>(); ajax.put("user", user); - ajax.put("roleGroup", userService.selectUserRoleGroup(loginUser.getUsername())); - ajax.put("postGroup", userService.selectUserPostGroup(loginUser.getUsername())); - return AjaxResult.success(ajax); + ajax.put("roleGroup", userService.selectUserRoleGroup(user.getUserName())); + ajax.put("postGroup", userService.selectUserPostGroup(user.getUserName())); + return R.ok(ajax); } /** @@ -64,24 +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() + "'失败,手机号码已存在"); + && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) { + return R.fail("修改用户'" + user.getUserName() + "'失败,手机号码已存在"); } if (StringUtils.isNotEmpty(user.getEmail()) - && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) { - return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在"); + && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) { + return R.fail("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在"); } - LoginUser loginUser = getLoginUser(); - SysUser sysUser = userService.selectUserById(loginUser.getUserId()); - user.setUserId(sysUser.getUserId()); + 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("修改个人信息异常,请联系管理员"); } /** @@ -94,20 +88,21 @@ public class SysProfileController extends BaseController { }) @Log(title = "个人信息", businessType = BusinessType.UPDATE) @PutMapping("/updatePwd") - public AjaxResult updatePwd(String oldPassword, String newPassword) { - SysUser user = userService.selectUserById(SecurityUtils.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("修改密码异常,请联系管理员"); } /** @@ -115,21 +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()) { - LoginUser loginUser = getLoginUser(); SysOss oss = iSysOssService.upload(file); String avatar = oss.getUrl(); - if (userService.updateUserAvatar(loginUser.getUsername(), avatar)) { + 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/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java b/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java index 11dc6ebc4..6595f06df 100644 --- a/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java +++ b/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java @@ -1,15 +1,13 @@ 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; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -22,7 +20,7 @@ import org.springframework.web.bind.annotation.RestController; */ @Validated @Api(value = "注册验证控制器", tags = {"注册验证管理"}) -@RequiredArgsConstructor(onConstructor_ = @Autowired) +@RequiredArgsConstructor @RestController public class SysRegisterController extends BaseController { @@ -31,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/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java b/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java index 9ddb2178d..5d9a20615 100644 --- a/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java +++ b/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java @@ -1,17 +1,18 @@ package com.ruoyi.web.controller.system; +import cn.dev33.satoken.annotation.SaCheckPermission; +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; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.core.page.TableDataInfo; -import com.ruoyi.common.core.service.TokenService; import com.ruoyi.common.enums.BusinessType; -import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.helper.LoginHelper; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.system.domain.SysUserRole; import com.ruoyi.system.service.ISysRoleService; @@ -19,8 +20,6 @@ import com.ruoyi.system.service.ISysUserService; import com.ruoyi.system.service.SysPermissionService; import io.swagger.annotations.*; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -34,18 +33,17 @@ import java.util.List; */ @Validated @Api(value = "角色信息控制器", tags = {"角色信息管理"}) -@RequiredArgsConstructor(onConstructor_ = @Autowired) +@RequiredArgsConstructor @RestController @RequestMapping("/system/role") public class SysRoleController extends BaseController { private final ISysRoleService roleService; - private final TokenService tokenService; private final ISysUserService userService; private final SysPermissionService permissionService; @ApiOperation("查询角色信息列表") - @PreAuthorize("@ss.hasPermi('system:role:list')") + @SaCheckPermission("system:role:list") @GetMapping("/list") public TableDataInfo list(SysRole role, PageQuery pageQuery) { return roleService.selectPageRoleList(role, pageQuery); @@ -53,7 +51,7 @@ public class SysRoleController extends BaseController { @ApiOperation("导出角色信息列表") @Log(title = "角色管理", businessType = BusinessType.EXPORT) - @PreAuthorize("@ss.hasPermi('system:role:export')") + @SaCheckPermission("system:role:export") @PostMapping("/export") public void export(SysRole role, HttpServletResponse response) { List list = roleService.selectRoleList(role); @@ -64,25 +62,25 @@ public class SysRoleController extends BaseController { * 根据角色编号获取详细信息 */ @ApiOperation("根据角色编号获取详细信息") - @PreAuthorize("@ss.hasPermi('system:role:query')") + @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)); } /** * 新增角色 */ @ApiOperation("新增角色") - @PreAuthorize("@ss.hasPermi('system:role:add')") + @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)); @@ -92,39 +90,41 @@ public class SysRoleController extends BaseController { * 修改保存角色 */ @ApiOperation("修改保存角色") - @PreAuthorize("@ss.hasPermi('system:role:edit')") + @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) { // 更新缓存用户权限 LoginUser loginUser = getLoginUser(); SysUser sysUser = userService.selectUserById(loginUser.getUserId()); - if (StringUtils.isNotNull(sysUser) && !sysUser.isAdmin()) { - loginUser.setMenuPermissions(permissionService.getMenuPermission(sysUser)); - tokenService.setLoginUser(loginUser); + if (ObjectUtil.isNotNull(sysUser) && !sysUser.isAdmin()) { + loginUser.setMenuPermission(permissionService.getMenuPermission(sysUser)); + LoginHelper.setLoginUser(loginUser); } - return AjaxResult.success(); + return R.ok(); } - return AjaxResult.error("修改角色'" + role.getRoleName() + "'失败,请联系管理员"); + return R.fail("修改角色'" + role.getRoleName() + "'失败,请联系管理员"); } /** * 修改保存数据权限 */ @ApiOperation("修改保存数据权限") - @PreAuthorize("@ss.hasPermi('system:role:edit')") + @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)); } @@ -132,11 +132,12 @@ public class SysRoleController extends BaseController { * 状态修改 */ @ApiOperation("状态修改") - @PreAuthorize("@ss.hasPermi('system:role:edit')") + @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)); } @@ -144,10 +145,10 @@ public class SysRoleController extends BaseController { * 删除角色 */ @ApiOperation("删除角色") - @PreAuthorize("@ss.hasPermi('system:role:remove')") + @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,17 +156,17 @@ public class SysRoleController extends BaseController { * 获取角色选择框列表 */ @ApiOperation("获取角色选择框列表") - @PreAuthorize("@ss.hasPermi('system:role:query')") + @SaCheckPermission("system:role:query") @GetMapping("/optionselect") - public AjaxResult> optionselect() { - return AjaxResult.success(roleService.selectRoleAll()); + public R> optionselect() { + return R.ok(roleService.selectRoleAll()); } /** * 查询已分配用户角色列表 */ @ApiOperation("查询已分配用户角色列表") - @PreAuthorize("@ss.hasPermi('system:role:list')") + @SaCheckPermission("system:role:list") @GetMapping("/authUser/allocatedList") public TableDataInfo allocatedList(SysUser user, PageQuery pageQuery) { return userService.selectAllocatedList(user, pageQuery); @@ -175,7 +176,7 @@ public class SysRoleController extends BaseController { * 查询未分配用户角色列表 */ @ApiOperation("查询未分配用户角色列表") - @PreAuthorize("@ss.hasPermi('system:role:list')") + @SaCheckPermission("system:role:list") @GetMapping("/authUser/unallocatedList") public TableDataInfo unallocatedList(SysUser user, PageQuery pageQuery) { return userService.selectUnallocatedList(user, pageQuery); @@ -185,10 +186,10 @@ public class SysRoleController extends BaseController { * 取消授权用户 */ @ApiOperation("取消授权用户") - @PreAuthorize("@ss.hasPermi('system:role:edit')") + @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)); } @@ -200,10 +201,10 @@ public class SysRoleController extends BaseController { @ApiImplicitParam(name = "roleId", value = "角色ID", paramType = "query", dataTypeClass = String.class), @ApiImplicitParam(name = "userIds", value = "用户ID串", paramType = "query", dataTypeClass = String.class) }) - @PreAuthorize("@ss.hasPermi('system:role:edit')") + @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)); } @@ -215,10 +216,11 @@ public class SysRoleController extends BaseController { @ApiImplicitParam(name = "roleId", value = "角色ID", paramType = "query", dataTypeClass = String.class), @ApiImplicitParam(name = "userIds", value = "用户ID串", paramType = "query", dataTypeClass = String.class) }) - @PreAuthorize("@ss.hasPermi('system:role:edit')") + @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/src/main/java/com/ruoyi/web/controller/system/SysUserController.java b/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysUserController.java index c517b5d10..0c2e9e022 100644 --- a/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysUserController.java +++ b/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysUserController.java @@ -1,20 +1,21 @@ 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.utils.StringUtils; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.system.domain.vo.SysUserExportVo; @@ -25,8 +26,6 @@ import com.ruoyi.system.service.ISysRoleService; import com.ruoyi.system.service.ISysUserService; import io.swagger.annotations.*; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -45,7 +44,7 @@ import java.util.stream.Collectors; */ @Validated @Api(value = "用户信息控制器", tags = {"用户信息管理"}) -@RequiredArgsConstructor(onConstructor_ = @Autowired) +@RequiredArgsConstructor @RestController @RequestMapping("/system/user") public class SysUserController extends BaseController { @@ -58,7 +57,7 @@ public class SysUserController extends BaseController { * 获取用户列表 */ @ApiOperation("获取用户列表") - @PreAuthorize("@ss.hasPermi('system:user:list')") + @SaCheckPermission("system:user:list") @GetMapping("/list") public TableDataInfo list(SysUser user, PageQuery pageQuery) { return userService.selectPageUserList(user, pageQuery); @@ -66,7 +65,7 @@ public class SysUserController extends BaseController { @ApiOperation("导出用户列表") @Log(title = "用户管理", businessType = BusinessType.EXPORT) - @PreAuthorize("@ss.hasPermi('system:user:export')") + @SaCheckPermission("system:user:export") @PostMapping("/export") public void export(SysUser user, HttpServletResponse response) { List list = userService.selectUserList(user); @@ -84,14 +83,14 @@ public class SysUserController extends BaseController { @ApiOperation("导入用户列表") @ApiImplicitParams({ - @ApiImplicitParam(name = "file", value = "导入文件", dataType = "java.io.File", required = true), + @ApiImplicitParam(name = "file", value = "导入文件", dataType = "java.io.File", required = true), }) @Log(title = "用户管理", businessType = BusinessType.IMPORT) - @PreAuthorize("@ss.hasPermi('system:user: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("下载导入模板") @@ -104,40 +103,41 @@ public class SysUserController extends BaseController { * 根据用户编号获取详细信息 */ @ApiOperation("根据用户编号获取详细信息") - @PreAuthorize("@ss.hasPermi('system:user:query')") + @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("posts", postService.selectPostAll()); - if (StringUtils.isNotNull(userId)) { - ajax.put("user", userService.selectUserById(userId)); + if (ObjectUtil.isNotNull(userId)) { + SysUser sysUser = userService.selectUserById(userId); + ajax.put("user", sysUser); ajax.put("postIds", postService.selectPostListByUserId(userId)); - ajax.put("roleIds", roleService.selectRoleListByUserId(userId)); + ajax.put("roleIds", sysUser.getRoles().stream().map(SysRole::getRoleId).collect(Collectors.toList())); } - return AjaxResult.success(ajax); + return R.ok(ajax); } /** * 新增用户 */ @ApiOperation("新增用户") - @PreAuthorize("@ss.hasPermi('system:user:add')") + @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() + "'失败,手机号码已存在"); + && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) { + return R.fail("新增用户'" + user.getUserName() + "'失败,手机号码已存在"); } else if (StringUtils.isNotEmpty(user.getEmail()) - && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) { - return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在"); + && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) { + return R.fail("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在"); } - user.setPassword(SecurityUtils.encryptPassword(user.getPassword())); + user.setPassword(BCrypt.hashpw(user.getPassword())); return toAjax(userService.insertUser(user)); } @@ -145,17 +145,18 @@ public class SysUserController extends BaseController { * 修改用户 */ @ApiOperation("修改用户") - @PreAuthorize("@ss.hasPermi('system:user:edit')") + @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() + "'失败,手机号码已存在"); + && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) { + return R.fail("修改用户'" + user.getUserName() + "'失败,手机号码已存在"); } else if (StringUtils.isNotEmpty(user.getEmail()) - && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) { - return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在"); + && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) { + return R.fail("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在"); } return toAjax(userService.updateUser(user)); } @@ -164,12 +165,12 @@ public class SysUserController extends BaseController { * 删除用户 */ @ApiOperation("删除用户") - @PreAuthorize("@ss.hasPermi('system:user:remove')") + @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)); } @@ -178,12 +179,13 @@ public class SysUserController extends BaseController { * 重置密码 */ @ApiOperation("重置密码") - @PreAuthorize("@ss.hasPermi('system:user:resetPwd')") + @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)); } @@ -191,11 +193,12 @@ public class SysUserController extends BaseController { * 状态修改 */ @ApiOperation("状态修改") - @PreAuthorize("@ss.hasPermi('system:user:edit')") + @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)); } @@ -203,15 +206,15 @@ public class SysUserController extends BaseController { * 根据用户编号获取授权角色 */ @ApiOperation("根据用户编号获取授权角色") - @PreAuthorize("@ss.hasPermi('system:user:query')") + @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); + return R.ok(ajax); } /** @@ -222,11 +225,12 @@ public class SysUserController extends BaseController { @ApiImplicitParam(name = "userId", value = "用户Id", paramType = "query", dataTypeClass = String.class), @ApiImplicitParam(name = "roleIds", value = "角色ID串", paramType = "query", dataTypeClass = String.class) }) - @PreAuthorize("@ss.hasPermi('system:user:edit')") + @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/src/main/resources/application-dev.yml b/ruoyi/src/main/resources/application-dev.yml index c9b246b23..ba38be663 100644 --- a/ruoyi/src/main/resources/application-dev.yml +++ b/ruoyi/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 @@ -129,9 +129,9 @@ spring: redisson: # 线程池数量 - threads: 16 + threads: 4 # Netty线程池数量 - nettyThreads: 32 + nettyThreads: 8 # 传输模式 transportMode: "NIO" # 单节点配置 @@ -139,9 +139,9 @@ redisson: # 客户端名称 clientName: ${ruoyi.name} # 最小空闲连接数 - connectionMinimumIdleSize: 32 + connectionMinimumIdleSize: 8 # 连接池大小 - connectionPoolSize: 64 + connectionPoolSize: 32 # 连接空闲超时,单位:毫秒 idleConnectionTimeout: 10000 # 命令等待超时,单位:毫秒 @@ -150,11 +150,5 @@ redisson: retryAttempts: 3 # 命令重试发送时间间隔,单位:毫秒 retryInterval: 1500 - # 发布和订阅连接的最小空闲连接数 - subscriptionConnectionMinimumIdleSize: 1 # 发布和订阅连接池大小 subscriptionConnectionPoolSize: 50 - # 单个连接最大订阅数量 - subscriptionsPerConnection: 5 - # DNS监测时间间隔,单位:毫秒 - dnsMonitoringInterval: 5000 diff --git a/ruoyi/src/main/resources/application-prod.yml b/ruoyi/src/main/resources/application-prod.yml index cfa8c7cc4..493ce547f 100644 --- a/ruoyi/src/main/resources/application-prod.yml +++ b/ruoyi/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 @@ -157,11 +157,5 @@ redisson: retryAttempts: 3 # 命令重试发送时间间隔,单位:毫秒 retryInterval: 1500 - # 发布和订阅连接的最小空闲连接数 - subscriptionConnectionMinimumIdleSize: 1 # 发布和订阅连接池大小 subscriptionConnectionPoolSize: 50 - # 单个连接最大订阅数量 - subscriptionsPerConnection: 5 - # DNS监测时间间隔,单位:毫秒 - dnsMonitoringInterval: 5000 diff --git a/ruoyi/src/main/resources/application.yml b/ruoyi/src/main/resources/application.yml index ae361f402..8c0b6e432 100644 --- a/ruoyi/src/main/resources/application.yml +++ b/ruoyi/src/main/resources/application.yml @@ -5,7 +5,7 @@ ruoyi: # 版本 version: ${ruoyi-vue-plus.version} # 版权年份 - copyrightYear: 2021 + copyrightYear: 2022 # 实例演示开关 demoEnabled: true # 获取ip地址开关 @@ -79,6 +79,10 @@ spring: thymeleaf: # 将系统模板放置到最前面 否则会与 springboot-admin 页面冲突 template-resolver-order: 1 + mvc: + pathmatch: + # 适配 boot 2.6 路由与 springfox 兼容 + matching-strategy: ANT_PATH_MATCHER jackson: # 日期格式化 date-format: yyyy-MM-dd HH:mm:ss @@ -91,24 +95,46 @@ spring: # 允许对象忽略json中不存在的属性 fail_on_unknown_properties: false -# token配置 -token: - # 令牌自定义标识 - header: Authorization - # 令牌密钥 - secret: abcdefghijklmnopqrstuvwxyz - # 令牌有效期(默认30分钟) - expireTime: 30 +# Sa-Token配置 +sa-token: + # token名称 (同时也是cookie名称) + token-name: Authorization + # token有效期 设为一天 (必定过期) 单位: 秒 + timeout: 86400 + # token临时有效期 (指定时间无操作就过期) 单位: 秒 + activity-timeout: 1800 + # 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录) + is-concurrent: true + # 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token) + is-share: false + # 是否尝试从请求体里读取token + is-read-body: false + # 是否尝试从header里读取token + is-read-head: true + # 是否尝试从cookie里读取token + is-read-cookie: false + # token前缀 + token-prefix: "Bearer" + # token风格 + token-style: uuid + # jwt秘钥 + jwt-secret-key: abcdefghijklmnopqrstuvwxyz + # 是否输出操作日志 + is-log: true # security配置 security: - # 登出路径 - logout-url: /logout - # 匿名路径 - anonymous: + # 排除路径 + excludes: - /login + - /logout - /register - /captchaImage + # 静态资源 + - /*.html + - /**/*.html + - /**/*.css + - /**/*.js # swagger 文档配置 - /doc.html - /swagger-resources/** @@ -217,6 +243,10 @@ knife4j: enable: true # 是否开启生产环境保护策略 production: @knife4j.production@ + basic: + enable: true + username: ruoyi + password: 123456 # 前端Ui的个性化配置属性 setting: # 默认语言 diff --git a/ruoyi/src/main/resources/i18n/messages.properties b/ruoyi/src/main/resources/i18n/messages.properties index 6db4b42c5..ee68c98c1 100644 --- a/ruoyi/src/main/resources/i18n/messages.properties +++ b/ruoyi/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=未知错误,请重新登录 diff --git a/ruoyi/src/main/resources/i18n/messages_en_US.properties b/ruoyi/src/main/resources/i18n/messages_en_US.properties index c67beab66..960538a55 100644 --- a/ruoyi/src/main/resources/i18n/messages_en_US.properties +++ b/ruoyi/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 diff --git a/ruoyi/src/main/resources/i18n/messages_zh_CN.properties b/ruoyi/src/main/resources/i18n/messages_zh_CN.properties index 6db4b42c5..ee68c98c1 100644 --- a/ruoyi/src/main/resources/i18n/messages_zh_CN.properties +++ b/ruoyi/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=未知错误,请重新登录 diff --git a/ruoyi/src/main/resources/logback.xml b/ruoyi/src/main/resources/logback.xml index 6e3280fb3..e8d627531 100644 --- a/ruoyi/src/main/resources/logback.xml +++ b/ruoyi/src/main/resources/logback.xml @@ -5,13 +5,13 @@ value="%red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}%n) - %msg%n"/> - - + + - ${console.log.pattern} + ${console.log.pattern} utf-8 - - + + @@ -32,20 +32,20 @@ - - - ${log.path}/sys-info.log + + + ${log.path}/sys-info.log - + - ${log.path}/sys-info.%d{yyyy-MM-dd}.log - - 60 - + ${log.path}/sys-info.%d{yyyy-MM-dd}.log + + 60 + - ${log.pattern} - - + ${log.pattern} + + INFO @@ -53,16 +53,16 @@ DENY - + - - ${log.path}/sys-error.log + + ${log.path}/sys-error.log ${log.path}/sys-error.%d{yyyy-MM-dd}.log - - 60 + + 60 ${log.pattern} @@ -70,23 +70,23 @@ ERROR - + ACCEPT - + DENY - - - - + + + + - - - + + + - + diff --git a/ruoyi/src/main/resources/mapper/generator/GenTableColumnMapper.xml b/ruoyi/src/main/resources/mapper/generator/GenTableColumnMapper.xml index be07a9cb4..7ef974458 100644 --- a/ruoyi/src/main/resources/mapper/generator/GenTableColumnMapper.xml +++ b/ruoyi/src/main/resources/mapper/generator/GenTableColumnMapper.xml @@ -3,7 +3,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - + @@ -28,11 +28,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - - - \ No newline at end of file + + + diff --git a/ruoyi/src/main/resources/mapper/generator/GenTableMapper.xml b/ruoyi/src/main/resources/mapper/generator/GenTableMapper.xml index 1aa9ea592..8f0c2690e 100644 --- a/ruoyi/src/main/resources/mapper/generator/GenTableMapper.xml +++ b/ruoyi/src/main/resources/mapper/generator/GenTableMapper.xml @@ -4,31 +4,31 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - + @@ -53,124 +53,124 @@ 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') + + + AND date_format(create_time,'%y%m%d') <= date_format(#{genTable.params.endTime},'%y%m%d') + order by create_time desc - + - + + + + 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') + + + AND date_format(create_time,'%y%m%d') <= date_format(#{params.endTime},'%y%m%d') + + + + + + + + - + - + - + - + diff --git a/ruoyi/src/main/resources/mapper/system/SysDeptMapper.xml b/ruoyi/src/main/resources/mapper/system/SysDeptMapper.xml index 8e9d1d758..b1ce3f829 100644 --- a/ruoyi/src/main/resources/mapper/system/SysDeptMapper.xml +++ b/ruoyi/src/main/resources/mapper/system/SysDeptMapper.xml @@ -30,9 +30,9 @@ diff --git a/ruoyi/src/main/resources/mapper/system/SysMenuMapper.xml b/ruoyi/src/main/resources/mapper/system/SysMenuMapper.xml index d441c73af..9cb6f7f99 100644 --- a/ruoyi/src/main/resources/mapper/system/SysMenuMapper.xml +++ b/ruoyi/src/main/resources/mapper/system/SysMenuMapper.xml @@ -12,8 +12,8 @@ - - + + @@ -33,8 +33,8 @@ m.menu_name, m.path, m.component, - m.`query`, - m.visible, + m.`query`, + m.visible, m.status, ifnull(m.perms, '') as perms, m.is_frame, @@ -75,7 +75,7 @@ m.menu_name, m.path, m.component, - m.`query`, + m.`query`, m.visible, m.status, ifnull(m.perms, '') as perms, diff --git a/ruoyi/src/main/resources/mapper/system/SysRoleMapper.xml b/ruoyi/src/main/resources/mapper/system/SysRoleMapper.xml index c13bd68bb..15f94f312 100644 --- a/ruoyi/src/main/resources/mapper/system/SysRoleMapper.xml +++ b/ruoyi/src/main/resources/mapper/system/SysRoleMapper.xml @@ -60,10 +60,6 @@ and date_format(r.create_time,'%y%m%d') <= date_format(#{role.params.endTime},'%y%m%d') - - - - order by r.role_sort @@ -88,10 +84,6 @@ and date_format(r.create_time,'%y%m%d') <= date_format(#{params.endTime},'%y%m%d') - - - - order by r.role_sort diff --git a/ruoyi/src/main/resources/mapper/system/SysUserMapper.xml b/ruoyi/src/main/resources/mapper/system/SysUserMapper.xml index c430cbb20..7f12db7f6 100644 --- a/ruoyi/src/main/resources/mapper/system/SysUserMapper.xml +++ b/ruoyi/src/main/resources/mapper/system/SysUserMapper.xml @@ -9,6 +9,7 @@ + @@ -50,6 +51,7 @@ u.dept_id, u.user_name, u.nick_name, + u.user_type, u.email, u.avatar, u.phonenumber, @@ -75,9 +77,9 @@ r.data_scope, r.status as role_status from sys_user u - left join sys_dept d on u.dept_id = d.dept_id - left join sys_user_role ur on u.user_id = ur.user_id - left join sys_role r on r.role_id = ur.role_id + left join sys_dept d on u.dept_id = d.dept_id + left join sys_user_role ur on u.user_id = ur.user_id + left join sys_role r on r.role_id = ur.role_id