diff --git a/.editorconfig b/.editorconfig
index 672defc11..25b312ef3 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -10,7 +10,7 @@ end_of_line = lf
trim_trailing_whitespace = true
insert_final_newline = true
-[*.{json,yml}]
+[*.{json,yml,yaml}]
indent_size = 2
[*.md]
diff --git a/.run/ruoyi-monitor-admin.run.xml b/.run/ruoyi-monitor-admin.run.xml
new file mode 100644
index 000000000..0eb44eec6
--- /dev/null
+++ b/.run/ruoyi-monitor-admin.run.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.run/ruoyi-server.run.xml b/.run/ruoyi-server.run.xml
new file mode 100644
index 000000000..c75e92af0
--- /dev/null
+++ b/.run/ruoyi-server.run.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.run/ruoyi-xxl-job-admin.run.xml b/.run/ruoyi-xxl-job-admin.run.xml
new file mode 100644
index 000000000..2a30437f1
--- /dev/null
+++ b/.run/ruoyi-xxl-job-admin.run.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/README.md b/README.md
index d2e514751..1fd86c0c4 100644
--- a/README.md
+++ b/README.md
@@ -4,14 +4,17 @@
[](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/blob/master/LICENSE)
[](https://www.jetbrains.com/?from=RuoYi-Vue-Plus)
-[](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus)
-[]()
+[](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus)
+[]()
[]()
[]()
> RuoYi-Vue-Plus 是重写 RuoYi-Vue 针对 `分布式集群` 场景全方位升级(不兼容原框架)
-> 系统演示: [传送门](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/系统演示?sort_id=4836388)
+> 项目代码、文档 均开源免费可商用 遵循开源协议在项目中保留开源协议文件即可
+活到老写到老 为兴趣而开源 为学习而开源 为让大家真正可以学到技术而开源
+
+> 系统演示: [传送门](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/pages?sort_id=4836388&doc_id=1469725)
| 功能介绍 | 使用技术 | 文档地址 | 特性注意事项 |
|----------|---------------------|---------------------------------------------------------------------------------------------------|----------------------------|
@@ -38,7 +41,7 @@
| 分布式队列 | 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) | 支持跟踪链路日志记录、性能分析、链路排查 |
+| 分布式链路追踪 | Apache SkyWalking | [Apache SkyWalking文档](https://skywalking.apache.org/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) | 云存储 |
@@ -46,9 +49,9 @@
| 监控框架 | 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/) | 美化接口文档 |
+| 文档框架 | SpringDoc、javadoc | [接口文档](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/pages?sort_id=5805266&doc_id=1469725) | 无注解零入侵基于java注释 |
| 工具类框架 | Hutool、Lombok | [Hutool文档](https://www.hutool.cn/docs/) | 减少代码冗余 增加安全性 |
-| 代码生成器 | 适配MP、Knife4j规范化代码 | [Hutool文档](https://www.hutool.cn/docs/) | 一键生成前后端代码 |
+| 代码生成器 | 适配MP、SpringDoc规范化代码 | [代码生成文档](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/pages?sort_id=5522329&doc_id=1469725) | 一键生成前后端代码 |
| 部署方式 | Docker | [Docker文档](https://docs.docker.com/) | 容器编排 一键部署业务集群 |
| 国际化 | SpringMessage | [SpringMVC文档](https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc) | Spring标准国际化方案 |
@@ -56,11 +59,14 @@
使用框架前请仔细阅读文档重点注意事项
->[初始化项目 必看](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/关于初始化项目?sort_id=4164117)
->>[https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/关于初始化项目?sort_id=4164117](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/关于初始化项目?sort_id=4164117)
->
->[部署项目 必看](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/关于应用部署?sort_id=4219382)
->>[https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/关于应用部署?sort_id=4219382](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/关于应用部署?sort_id=4219382)
+>[初始化项目 必看](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/pages?sort_id=4164117&doc_id=1469725)
+>>[https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/pages?sort_id=4164117&doc_id=1469725](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/pages?sort_id=4164117&doc_id=1469725)
+>
+>[专栏与视频 入门必看](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/pages?sort_id=5473272&doc_id=1469725)
+>>[https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/pages?sort_id=5473272&doc_id=1469725](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/pages?sort_id=5473272&doc_id=1469725)
+>
+>[部署项目 必看](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/pages?sort_id=4219382&doc_id=1469725)
+>>[https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/pages?sort_id=4219382&doc_id=1469725](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/pages?sort_id=4219382&doc_id=1469725)
>
>[参考文档 Wiki](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/pages)
>>[https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/pages](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/pages)
diff --git a/pom.xml b/pom.xml
index 9f1963baf..3de969cfd 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,53 +6,47 @@
com.ruoyi
ruoyi-vue-plus
- 4.2.0
+ 4.4.0
RuoYi-Vue-Plus
https://gitee.com/JavaLionLi/RuoYi-Vue-Plus
RuoYi-Vue-Plus后台管理系统
- 4.2.0
- 2.6.9
+ 4.4.0
+ 2.7.6
UTF-8
UTF-8
1.8
3.2.2
2.2.2
- 1.2.11
- 3.0.3
- 1.5.22
- 5.2.2
- 3.1.1
+ 1.6.13
+ 5.2.3
+ 3.1.3
2.3
- 1.30.0
+ 1.33.0
3.5.2
3.9.1
- 5.8.3
- 4.9.3
- 2.6.7
- 3.17.4
- 2.2.1
- 3.5.1
- 1.4.3
+ 5.8.10
+ 4.10.0
+ 2.7.7
+ 3.18.0
+ 2.2.3
+ 3.5.2
+ 2.14.2
2.3.1
+ 1.18.24
- 30.0-jre
+ 31.1-jre
+
+ 1.32
- 1.12.248
+ 1.12.349
- 2.0.9
- 3.1.537
-
-
- localhost
- http://${docker.registry.url}:2375
- ruoyi
- 1.2.2
-
+ 2.0.22
+ 3.1.635
@@ -77,29 +71,22 @@
import
-
- com.alibaba
- druid-spring-boot-starter
- ${druid.version}
+ org.springdoc
+ springdoc-openapi-webmvc-core
+ ${springdoc.version}
- com.github.xiaoymin
- knife4j-spring-boot-starter
- ${knife4j.version}
-
-
- swagger-annotations
- io.swagger
-
-
+ org.springdoc
+ springdoc-openapi-javadoc
+ ${springdoc.version}
- io.swagger
- swagger-annotations
- ${swagger-annotations.version}
+ org.projectlombok
+ lombok
+ ${lombok.version}
@@ -142,6 +129,12 @@
cn.dev33
sa-token-jwt
${satoken.version}
+
+
+ cn.hutool
+ hutool-all
+
+
@@ -188,7 +181,7 @@
com.tencentcloudapi
- tencentcloud-sdk-java
+ tencentcloud-sdk-java-sms
${tencent.sms.version}
@@ -223,29 +216,9 @@
- com.yomahub
- tlog-web-spring-boot-starter
- ${tlog.version}
-
-
- log4j
- log4j
-
-
- dom4j
- dom4j
-
-
- commons-beanutils
- commons-beanutils
-
-
-
-
-
- com.yomahub
- tlog-xxljob-spring-boot-starter
- ${tlog.version}
+ com.alibaba
+ transmittable-thread-local
+ ${alibaba-ttl.version}
@@ -255,6 +228,13 @@
${guava.version}
+
+
+ org.yaml
+ snakeyaml
+ ${snakeyaml.version}
+
+
com.ruoyi
@@ -338,6 +318,36 @@
${java.version}
${java.version}
${project.build.sourceEncoding}
+
+
+ com.github.therapi
+ therapi-runtime-javadoc-scribe
+ 0.15.0
+
+
+ org.projectlombok
+ lombok
+ ${lombok.version}
+
+
+ org.springframework.boot
+ spring-boot-configuration-processor
+ ${spring-boot.version}
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ 2.22.2
+
+ -Dfile.encoding=UTF-8
+
+ ${profiles.active}
+
+ exclude
@@ -364,8 +374,8 @@
public
- aliyun nexus
- https://maven.aliyun.com/repository/public/
+ huawei nexus
+ https://mirrors.huaweicloud.com/repository/maven/
true
@@ -375,8 +385,8 @@
public
- aliyun nexus
- https://maven.aliyun.com/repository/public/
+ huawei nexus
+ https://mirrors.huaweicloud.com/repository/maven/
true
@@ -393,8 +403,6 @@
local
debug
- false
- '*'
@@ -403,8 +411,6 @@
dev
debug
- false
- '*'
@@ -416,10 +422,10 @@
prod
warn
- true
- health, info, logfile
+
+
diff --git a/ruoyi-admin/Dockerfile b/ruoyi-admin/Dockerfile
index 1bbd2ccf6..6033f7e8c 100644
--- a/ruoyi-admin/Dockerfile
+++ b/ruoyi-admin/Dockerfile
@@ -2,14 +2,22 @@ FROM anapsix/alpine-java:8_server-jre_unlimited
MAINTAINER Lion Li
-RUN mkdir -p /ruoyi/server
-RUN mkdir -p /ruoyi/server/logs
-RUN mkdir -p /ruoyi/server/temp
+RUN mkdir -p /ruoyi/server/logs \
+ /ruoyi/server/temp \
+ /ruoyi/skywalking/agent
WORKDIR /ruoyi/server
-EXPOSE 8080
+ENV SERVER_PORT=8080
+
+EXPOSE ${SERVER_PORT}
ADD ./target/ruoyi-admin.jar ./app.jar
-ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "app.jar"]
+ENTRYPOINT ["java", \
+ "-Djava.security.egd=file:/dev/./urandom", \
+ "-Dserver.port=${SERVER_PORT}", \
+ # 应用名称 如果想区分集群节点监控 改成不同的名称即可
+# "-Dskywalking.agent.service_name=ruoyi-server", \
+# "-javaagent:/ruoyi/skywalking/agent/skywalking-agent.jar", \
+ "-jar", "app.jar"]
diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml
index a3d2da6f1..a588f62da 100644
--- a/ruoyi-admin/pom.xml
+++ b/ruoyi-admin/pom.xml
@@ -5,7 +5,7 @@
ruoyi-vue-plus
com.ruoyi
- 4.2.0
+ 4.4.0
4.0.0
jar
@@ -26,8 +26,8 @@
- mysql
- mysql-connector-java
+ com.mysql
+ mysql-connector-j
@@ -78,6 +78,24 @@
ruoyi-demo
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -107,25 +125,6 @@
${project.artifactId}
-
- com.spotify
- docker-maven-plugin
- ${docker.plugin.version}
-
- ${docker.namespace}/ruoyi-server:${project.version}
- ${project.basedir}
- ${docker.registry.host}
- ${docker.registry.url}
- ${docker.registry.url}
-
-
- /
- ${project.build.directory}
- ${project.build.finalName}.jar
-
-
-
-
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java
index 0889aabc7..94630e2e9 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java
@@ -1,11 +1,12 @@
package com.ruoyi.web.controller.common;
+import cn.dev33.satoken.annotation.SaIgnore;
import cn.hutool.captcha.AbstractCaptcha;
import cn.hutool.captcha.generator.CodeGenerator;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.RandomUtil;
-import com.ruoyi.common.annotation.Anonymous;
+import com.ruoyi.common.constant.CacheConstants;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.enums.CaptchaType;
@@ -18,9 +19,6 @@ import com.ruoyi.sms.config.properties.SmsProperties;
import com.ruoyi.sms.core.SmsTemplate;
import com.ruoyi.sms.entity.SmsResult;
import com.ruoyi.system.service.ISysConfigService;
-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.validation.annotation.Validated;
@@ -37,10 +35,9 @@ import java.util.Map;
*
* @author Lion Li
*/
-@Anonymous
+@SaIgnore
@Slf4j
@Validated
-@Api(value = "验证码操作处理", tags = {"验证码管理"})
@RequiredArgsConstructor
@RestController
public class CaptchaController {
@@ -51,16 +48,16 @@ public class CaptchaController {
/**
* 短信验证码
+ *
+ * @param phonenumber 用户手机号
*/
- @ApiOperation("短信验证码")
@GetMapping("/captchaSms")
- public R smsCaptcha(@ApiParam("用户手机号")
- @NotBlank(message = "{user.phonenumber.not.blank}")
+ public R smsCaptcha(@NotBlank(message = "{user.phonenumber.not.blank}")
String phonenumber) {
- if (smsProperties.getEnabled()) {
- R.fail("当前系统没有开启短信功能!");
+ if (!smsProperties.getEnabled()) {
+ return R.fail("当前系统没有开启短信功能!");
}
- String key = Constants.CAPTCHA_CODE_KEY + phonenumber;
+ String key = CacheConstants.CAPTCHA_CODE_KEY + phonenumber;
String code = RandomUtil.randomNumbers(4);
RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION));
// 验证码模板id 自行处理 (查数据库或写死均可)
@@ -79,18 +76,17 @@ public class CaptchaController {
/**
* 生成验证码
*/
- @ApiOperation("生成验证码")
@GetMapping("/captchaImage")
public R
- com.github.xiaoymin
- knife4j-spring-boot-starter
+ org.springdoc
+ springdoc-openapi-webmvc-core
- io.swagger
- swagger-annotations
+ org.springdoc
+ springdoc-openapi-javadoc
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Anonymous.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Anonymous.java
deleted file mode 100644
index fe2810083..000000000
--- a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Anonymous.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.ruoyi.common.annotation;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * 匿名访问不鉴权注解
- *
- * @author ruoyi
- */
-@Target({ElementType.METHOD, ElementType.TYPE})
-@Retention(RetentionPolicy.RUNTIME)
-@Documented
-public @interface Anonymous {
-}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataColumn.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataColumn.java
index bd2ddece1..df416edc8 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataColumn.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataColumn.java
@@ -5,6 +5,8 @@ import java.lang.annotation.*;
/**
* 数据权限
*
+ * 一个注解只能对应一个模板
+ *
* @author Lion Li
* @version 3.5.0
*/
@@ -16,11 +18,11 @@ public @interface DataColumn {
/**
* 占位符关键字
*/
- String key() default "deptName";
+ String[] key() default "deptName";
/**
* 占位符替换值
*/
- String value() default "dept_id";
+ String[] value() default "dept_id";
}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DictDataMapper.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DictDataMapper.java
new file mode 100644
index 000000000..5c14a5520
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DictDataMapper.java
@@ -0,0 +1,27 @@
+package com.ruoyi.common.annotation;
+
+import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.ruoyi.common.jackson.DictDataJsonSerializer;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 字典数据映射注解
+ *
+ * @author itino
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.FIELD, ElementType.METHOD})
+@JacksonAnnotationsInside
+@JsonSerialize(using = DictDataJsonSerializer.class)
+public @interface DictDataMapper {
+
+ /**
+ * 设置字典的type值 (如: sys_user_sex)
+ */
+ String dictType() default "";
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RateLimiter.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RateLimiter.java
index 90db9d776..2e3ff7a82 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RateLimiter.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RateLimiter.java
@@ -1,36 +1,36 @@
-package com.ruoyi.common.annotation;
-
-import com.ruoyi.common.constant.Constants;
-import com.ruoyi.common.enums.LimitType;
-
-import java.lang.annotation.*;
-
-/**
- * 限流注解
- *
- * @author Lion Li
- */
-@Target(ElementType.METHOD)
-@Retention(RetentionPolicy.RUNTIME)
-@Documented
-public @interface RateLimiter {
- /**
- * 限流key
- */
- String key() default Constants.RATE_LIMIT_KEY;
-
- /**
- * 限流时间,单位秒
- */
- int time() default 60;
-
- /**
- * 限流次数
- */
- int count() default 100;
-
- /**
- * 限流类型
- */
- LimitType limitType() default LimitType.DEFAULT;
-}
+package com.ruoyi.common.annotation;
+
+import com.ruoyi.common.constant.CacheConstants;
+import com.ruoyi.common.enums.LimitType;
+
+import java.lang.annotation.*;
+
+/**
+ * 限流注解
+ *
+ * @author Lion Li
+ */
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface RateLimiter {
+ /**
+ * 限流key
+ */
+ String key() default CacheConstants.RATE_LIMIT_KEY;
+
+ /**
+ * 限流时间,单位秒
+ */
+ int time() default 60;
+
+ /**
+ * 限流次数
+ */
+ int count() default 100;
+
+ /**
+ * 限流类型
+ */
+ LimitType limitType() default LimitType.DEFAULT;
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java
new file mode 100644
index 000000000..1cdf07eec
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java
@@ -0,0 +1,49 @@
+package com.ruoyi.common.constant;
+
+/**
+ * 缓存的key 常量
+ *
+ * @author ruoyi
+ */
+public interface CacheConstants {
+
+ /**
+ * 登录用户 redis key
+ */
+ String LOGIN_TOKEN_KEY = "Authorization:login:token:";
+
+ /**
+ * 在线用户 redis key
+ */
+ String ONLINE_TOKEN_KEY = "online_tokens:";
+
+ /**
+ * 验证码 redis key
+ */
+ String CAPTCHA_CODE_KEY = "captcha_codes:";
+
+ /**
+ * 参数管理 cache key
+ */
+ String SYS_CONFIG_KEY = "sys_config:";
+
+ /**
+ * 字典管理 cache key
+ */
+ String SYS_DICT_KEY = "sys_dict:";
+
+ /**
+ * 防重提交 redis key
+ */
+ String REPEAT_SUBMIT_KEY = "repeat_submit:";
+
+ /**
+ * 限流 redis key
+ */
+ String RATE_LIMIT_KEY = "rate_limit:";
+
+ /**
+ * 登录账户密码错误次数 redis key
+ */
+ String PWD_ERR_CNT_KEY = "pwd_err_cnt:";
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheNames.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheNames.java
new file mode 100644
index 000000000..591ca2546
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheNames.java
@@ -0,0 +1,48 @@
+package com.ruoyi.common.constant;
+
+/**
+ * 缓存组名称常量
+ *
+ * key 格式为 cacheNames#ttl#maxIdleTime#maxSize
+ *
+ * ttl 过期时间 如果设置为0则不过期 默认为0
+ * maxIdleTime 最大空闲时间 根据LRU算法清理空闲数据 如果设置为0则不检测 默认为0
+ * maxSize 组最大长度 根据LRU算法清理溢出数据 如果设置为0则无限长 默认为0
+ *
+ * 例子: test#60s、test#0#60s、test#0#1m#1000、test#1h#0#500
+ *
+ * @author Lion Li
+ */
+public interface CacheNames {
+
+ /**
+ * 演示案例
+ */
+ String DEMO_CACHE = "demo:cache#60s#10m#20";
+
+ /**
+ * 系统配置
+ */
+ String SYS_CONFIG = "sys_config";
+
+ /**
+ * 数据字典
+ */
+ String SYS_DICT = "sys_dict";
+
+ /**
+ * OSS内容
+ */
+ String SYS_OSS = "sys_oss#30d";
+
+ /**
+ * OSS配置
+ */
+ String SYS_OSS_CONFIG = "sys_oss_config";
+
+ /**
+ * 在线用户
+ */
+ String ONLINE_TOKEN = "online_tokens";
+
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java
index e2ffebdc0..e634ed297 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java
@@ -17,6 +17,11 @@ public interface Constants {
*/
String GBK = "GBK";
+ /**
+ * www主域
+ */
+ String WWW = "www.";
+
/**
* http请求
*/
@@ -57,70 +62,15 @@ public interface Constants {
*/
String LOGIN_FAIL = "Error";
- /**
- * 验证码 redis key
- */
- String CAPTCHA_CODE_KEY = "captcha_codes:";
-
- /**
- * 登录用户 redis key
- */
- String LOGIN_TOKEN_KEY = "Authorization:login:token:";
-
- /**
- * 在线用户 redis key
- */
- String ONLINE_TOKEN_KEY = "online_tokens:";
-
- /**
- * 防重提交 redis key
- */
- String REPEAT_SUBMIT_KEY = "repeat_submit:";
-
- /**
- * 限流 redis key
- */
- String RATE_LIMIT_KEY = "rate_limit:";
-
/**
* 验证码有效期(分钟)
*/
Integer CAPTCHA_EXPIRATION = 2;
- /**
- * 登陆错误 redis key
- */
- String LOGIN_ERROR = "login_error:";
-
- /**
- * 登录错误次数
- */
- Integer LOGIN_ERROR_NUMBER = 5;
-
- /**
- * 登录错误限制时间(分钟)
- */
- Integer LOGIN_ERROR_LIMIT_TIME = 10;
-
/**
* 令牌
*/
String TOKEN = "token";
- /**
- * 令牌前缀
- */
- String LOGIN_USER_KEY = "login_user_key";
-
- /**
- * 参数管理 cache key
- */
- String SYS_CONFIG_KEY = "sys_config:";
-
- /**
- * 字典管理 cache key
- */
- String SYS_DICT_KEY = "sys_dict:";
-
}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/HttpStatus.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/HttpStatus.java
new file mode 100644
index 000000000..f007b8c83
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/HttpStatus.java
@@ -0,0 +1,93 @@
+package com.ruoyi.common.constant;
+
+/**
+ * 返回状态码
+ *
+ * @author Lion Li
+ */
+public interface HttpStatus {
+ /**
+ * 操作成功
+ */
+ int SUCCESS = 200;
+
+ /**
+ * 对象创建成功
+ */
+ int CREATED = 201;
+
+ /**
+ * 请求已经被接受
+ */
+ int ACCEPTED = 202;
+
+ /**
+ * 操作已经执行成功,但是没有返回数据
+ */
+ int NO_CONTENT = 204;
+
+ /**
+ * 资源已被移除
+ */
+ int MOVED_PERM = 301;
+
+ /**
+ * 重定向
+ */
+ int SEE_OTHER = 303;
+
+ /**
+ * 资源没有被修改
+ */
+ int NOT_MODIFIED = 304;
+
+ /**
+ * 参数列表错误(缺少,格式不匹配)
+ */
+ int BAD_REQUEST = 400;
+
+ /**
+ * 未授权
+ */
+ int UNAUTHORIZED = 401;
+
+ /**
+ * 访问受限,授权过期
+ */
+ int FORBIDDEN = 403;
+
+ /**
+ * 资源,服务未找到
+ */
+ int NOT_FOUND = 404;
+
+ /**
+ * 不允许的http方法
+ */
+ int BAD_METHOD = 405;
+
+ /**
+ * 资源冲突,或者资源被锁
+ */
+ int CONFLICT = 409;
+
+ /**
+ * 不支持的数据,媒体类型
+ */
+ int UNSUPPORTED_TYPE = 415;
+
+ /**
+ * 系统内部错误
+ */
+ int ERROR = 500;
+
+ /**
+ * 接口未实现
+ */
+ int NOT_IMPLEMENTED = 501;
+
+ /**
+ * 系统警告消息
+ */
+ int WARN = 601;
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java
index d1ad296f6..bd316079a 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java
@@ -2,7 +2,8 @@ package com.ruoyi.common.core.domain;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
-import io.swagger.annotations.ApiModelProperty;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
import java.io.Serializable;
@@ -24,42 +25,38 @@ public class BaseEntity implements Serializable {
/**
* 搜索值
*/
- @ApiModelProperty(value = "搜索值")
+ @JsonIgnore
@TableField(exist = false)
private String searchValue;
/**
* 创建者
*/
- @ApiModelProperty(value = "创建者")
@TableField(fill = FieldFill.INSERT)
private String createBy;
/**
* 创建时间
*/
- @ApiModelProperty(value = "创建时间")
@TableField(fill = FieldFill.INSERT)
private Date createTime;
/**
* 更新者
*/
- @ApiModelProperty(value = "更新者")
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updateBy;
/**
* 更新时间
*/
- @ApiModelProperty(value = "更新时间")
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
/**
* 请求参数
*/
- @ApiModelProperty(value = "请求参数")
+ @JsonInclude(JsonInclude.Include.NON_EMPTY)
@TableField(exist = false)
private Map params = new HashMap<>();
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/PageQuery.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/PageQuery.java
index 7a61237c9..60abde623 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/PageQuery.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/PageQuery.java
@@ -1,14 +1,17 @@
package com.ruoyi.common.core.domain;
+import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.sql.SqlUtil;
-import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
/**
* 分页查询实体类
@@ -24,25 +27,21 @@ public class PageQuery implements Serializable {
/**
* 分页大小
*/
- @ApiModelProperty("分页大小")
private Integer pageSize;
/**
* 当前页数
*/
- @ApiModelProperty("当前页数")
private Integer pageNum;
/**
* 排序列
*/
- @ApiModelProperty("排序列")
private String orderByColumn;
/**
* 排序的方向desc或者asc
*/
- @ApiModelProperty(value = "排序的方向", example = "asc,desc")
private String isAsc;
/**
@@ -62,30 +61,52 @@ public class PageQuery implements Serializable {
pageNum = DEFAULT_PAGE_NUM;
}
Page page = new Page<>(pageNum, pageSize);
- OrderItem orderItem = buildOrderItem();
- if (ObjectUtil.isNotNull(orderItem)) {
- page.addOrder(orderItem);
+ List orderItems = buildOrderItem();
+ if (CollUtil.isNotEmpty(orderItems)) {
+ page.addOrder(orderItems);
}
return page;
}
- private OrderItem buildOrderItem() {
- // 兼容前端排序类型
- if ("ascending".equals(isAsc)) {
- isAsc = "asc";
- } else if ("descending".equals(isAsc)) {
- isAsc = "desc";
+ /**
+ * 构建排序
+ *
+ * 支持的用法如下:
+ * {isAsc:"asc",orderByColumn:"id"} order by id asc
+ * {isAsc:"asc",orderByColumn:"id,createTime"} order by id asc,create_time asc
+ * {isAsc:"desc",orderByColumn:"id,createTime"} order by id desc,create_time desc
+ * {isAsc:"asc,desc",orderByColumn:"id,createTime"} order by id asc,create_time desc
+ */
+ private List buildOrderItem() {
+ if (StringUtils.isBlank(orderByColumn) || StringUtils.isBlank(isAsc)) {
+ return null;
}
- 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);
+ String orderBy = SqlUtil.escapeOrderBySql(orderByColumn);
+ orderBy = StringUtils.toUnderScoreCase(orderBy);
+
+ // 兼容前端排序类型
+ isAsc = StringUtils.replaceEach(isAsc, new String[]{"ascending", "descending"}, new String[]{"asc", "desc"});
+
+ String[] orderByArr = orderBy.split(",");
+ String[] isAscArr = isAsc.split(",");
+ if (isAscArr.length != 1 && isAscArr.length != orderByArr.length) {
+ throw new ServiceException("排序参数有误");
+ }
+
+ List list = new ArrayList<>();
+ // 每个字段各自排序
+ for (int i = 0; i < orderByArr.length; i++) {
+ String orderByStr = orderByArr[i];
+ String isAscStr = isAscArr.length == 1 ? isAscArr[0] : isAscArr[i];
+ if ("asc".equals(isAscStr)) {
+ list.add(OrderItem.asc(orderByStr));
+ } else if ("desc".equals(isAscStr)) {
+ list.add(OrderItem.desc(orderByStr));
+ } else {
+ throw new ServiceException("排序参数有误");
}
}
- return null;
+ return list;
}
}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/R.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/R.java
index 7a2420238..381a6f602 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/R.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/R.java
@@ -1,7 +1,6 @@
package com.ruoyi.common.core.domain;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
+import com.ruoyi.common.constant.HttpStatus;
import lombok.Data;
import lombok.NoArgsConstructor;
@@ -14,7 +13,6 @@ import java.io.Serializable;
*/
@Data
@NoArgsConstructor
-@ApiModel("请求响应对象")
public class R implements Serializable {
private static final long serialVersionUID = 1L;
@@ -28,13 +26,10 @@ public class R implements Serializable {
*/
public static final int FAIL = 500;
- @ApiModelProperty("消息状态码")
private int code;
- @ApiModelProperty("消息内容")
private String msg;
- @ApiModelProperty("数据对象")
private T data;
public static R ok() {
@@ -73,6 +68,27 @@ public class R implements Serializable {
return restResult(null, code, msg);
}
+ /**
+ * 返回警告消息
+ *
+ * @param msg 返回内容
+ * @return 警告消息
+ */
+ public static R warn(String msg) {
+ return restResult(null, HttpStatus.WARN, msg);
+ }
+
+ /**
+ * 返回警告消息
+ *
+ * @param msg 返回内容
+ * @param data 数据对象
+ * @return 警告消息
+ */
+ public static R warn(String msg, T data) {
+ return restResult(data, HttpStatus.WARN, msg);
+ }
+
private static R restResult(T data, int code, String msg) {
R r = new R<>();
r.setCode(code);
@@ -81,4 +97,11 @@ public class R implements Serializable {
return r;
}
+ public static Boolean isError(R ret) {
+ return !isSuccess(ret);
+ }
+
+ public static Boolean isSuccess(R ret) {
+ return R.SUCCESS == ret.getCode();
+ }
}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeEntity.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeEntity.java
index f44eacd49..c7bb9b4ff 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeEntity.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeEntity.java
@@ -1,7 +1,6 @@
package com.ruoyi.common.core.domain;
import com.baomidou.mybatisplus.annotation.TableField;
-import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -24,20 +23,17 @@ public class TreeEntity extends BaseEntity {
* 父菜单名称
*/
@TableField(exist = false)
- @ApiModelProperty(value = "父菜单名称")
private String parentName;
/**
* 父菜单ID
*/
- @ApiModelProperty(value = "父菜单ID")
private Long parentId;
/**
* 子部门
*/
@TableField(exist = false)
- @ApiModelProperty(value = "子部门")
private List children = new ArrayList<>();
}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDept.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDept.java
index 2dc3bdc40..857f9b8db 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDept.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDept.java
@@ -4,8 +4,6 @@ import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.core.domain.TreeEntity;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -23,21 +21,18 @@ import javax.validation.constraints.Size;
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("sys_dept")
-@ApiModel("部门业务对象")
public class SysDept extends TreeEntity {
private static final long serialVersionUID = 1L;
/**
* 部门ID
*/
- @ApiModelProperty(value = "部门id")
@TableId(value = "dept_id")
private Long deptId;
/**
* 部门名称
*/
- @ApiModelProperty(value = "部门名称")
@NotBlank(message = "部门名称不能为空")
@Size(min = 0, max = 30, message = "部门名称长度不能超过30个字符")
private String deptName;
@@ -45,27 +40,23 @@ public class SysDept extends TreeEntity {
/**
* 显示顺序
*/
- @ApiModelProperty(value = "显示顺序")
@NotNull(message = "显示顺序不能为空")
private Integer orderNum;
/**
* 负责人
*/
- @ApiModelProperty(value = "负责人")
private String leader;
/**
* 联系电话
*/
- @ApiModelProperty(value = "联系电话")
@Size(min = 0, max = 11, message = "联系电话长度不能超过11个字符")
private String phone;
/**
* 邮箱
*/
- @ApiModelProperty(value = "邮箱")
@Email(message = "邮箱格式不正确")
@Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符")
private String email;
@@ -73,20 +64,17 @@ public class SysDept extends TreeEntity {
/**
* 部门状态:0正常,1停用
*/
- @ApiModelProperty(value = "部门状态:0正常,1停用")
private String status;
/**
* 删除标志(0代表存在 2代表删除)
*/
- @ApiModelProperty(value = "删除标志(0代表存在 2代表删除)")
@TableLogic
private String delFlag;
/**
* 祖级列表
*/
- @ApiModelProperty(value = "祖级列表")
private String ancestors;
}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictData.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictData.java
index c61c91726..e20f96aa7 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictData.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictData.java
@@ -8,8 +8,6 @@ import com.ruoyi.common.annotation.ExcelDictFormat;
import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.convert.ExcelDictConvert;
import com.ruoyi.common.core.domain.BaseEntity;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -26,13 +24,11 @@ import javax.validation.constraints.Size;
@EqualsAndHashCode(callSuper = true)
@TableName("sys_dict_data")
@ExcelIgnoreUnannotated
-@ApiModel("字典数据业务对象")
public class SysDictData extends BaseEntity {
/**
* 字典编码
*/
- @ApiModelProperty(value = "字典编码")
@ExcelProperty(value = "字典编码")
@TableId(value = "dict_code")
private Long dictCode;
@@ -40,14 +36,12 @@ public class SysDictData extends BaseEntity {
/**
* 字典排序
*/
- @ApiModelProperty(value = "字典排序")
@ExcelProperty(value = "字典排序")
private Integer dictSort;
/**
* 字典标签
*/
- @ApiModelProperty(value = "字典标签")
@ExcelProperty(value = "字典标签")
@NotBlank(message = "字典标签不能为空")
@Size(min = 0, max = 100, message = "字典标签长度不能超过100个字符")
@@ -56,7 +50,6 @@ public class SysDictData extends BaseEntity {
/**
* 字典键值
*/
- @ApiModelProperty(value = "字典键值")
@ExcelProperty(value = "字典键值")
@NotBlank(message = "字典键值不能为空")
@Size(min = 0, max = 100, message = "字典键值长度不能超过100个字符")
@@ -65,7 +58,6 @@ public class SysDictData extends BaseEntity {
/**
* 字典类型
*/
- @ApiModelProperty(value = "字典类型")
@ExcelProperty(value = "字典类型")
@NotBlank(message = "字典类型不能为空")
@Size(min = 0, max = 100, message = "字典类型长度不能超过100个字符")
@@ -74,20 +66,17 @@ public class SysDictData extends BaseEntity {
/**
* 样式属性(其他样式扩展)
*/
- @ApiModelProperty(value = "样式属性(其他样式扩展)")
@Size(min = 0, max = 100, message = "样式属性长度不能超过100个字符")
private String cssClass;
/**
* 表格字典样式
*/
- @ApiModelProperty(value = "表格字典样式")
private String listClass;
/**
* 是否默认(Y是 N否)
*/
- @ApiModelProperty(value = "是否默认(Y是 N否)")
@ExcelProperty(value = "是否默认", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "sys_yes_no")
private String isDefault;
@@ -95,7 +84,6 @@ public class SysDictData extends BaseEntity {
/**
* 状态(0正常 1停用)
*/
- @ApiModelProperty(value = "状态(0正常 1停用)")
@ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "sys_normal_disable")
private String status;
@@ -103,7 +91,6 @@ public class SysDictData extends BaseEntity {
/**
* 备注
*/
- @ApiModelProperty(value = "备注")
private String remark;
public boolean getDefault() {
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictType.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictType.java
index 942c2f97b..36e38a971 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictType.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictType.java
@@ -7,11 +7,8 @@ import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.annotation.ExcelDictFormat;
import com.ruoyi.common.convert.ExcelDictConvert;
import com.ruoyi.common.core.domain.BaseEntity;
-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.Pattern;
@@ -27,13 +24,11 @@ import javax.validation.constraints.Size;
@EqualsAndHashCode(callSuper = true)
@TableName("sys_dict_type")
@ExcelIgnoreUnannotated
-@ApiModel("字典类型业务对象")
public class SysDictType extends BaseEntity {
/**
* 字典主键
*/
- @ApiModelProperty(value = "字典主键")
@ExcelProperty(value = "字典主键")
@TableId(value = "dict_id")
private Long dictId;
@@ -41,7 +36,6 @@ public class SysDictType extends BaseEntity {
/**
* 字典名称
*/
- @ApiModelProperty(value = "字典名称")
@ExcelProperty(value = "字典名称")
@NotBlank(message = "字典名称不能为空")
@Size(min = 0, max = 100, message = "字典类型名称长度不能超过100个字符")
@@ -50,7 +44,6 @@ public class SysDictType extends BaseEntity {
/**
* 字典类型
*/
- @ApiModelProperty(value = "字典类型")
@ExcelProperty(value = "字典类型")
@NotBlank(message = "字典类型不能为空")
@Size(min = 0, max = 100, message = "字典类型类型长度不能超过100个字符")
@@ -60,7 +53,6 @@ public class SysDictType extends BaseEntity {
/**
* 状态(0正常 1停用)
*/
- @ApiModelProperty(value = "状态(0正常 1停用)")
@ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "sys_normal_disable")
private String status;
@@ -68,7 +60,6 @@ public class SysDictType extends BaseEntity {
/**
* 备注
*/
- @ApiModelProperty(value = "备注")
private String remark;
}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java
index cf337fbeb..201605f96 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java
@@ -4,8 +4,6 @@ import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.ruoyi.common.core.domain.TreeEntity;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -22,20 +20,17 @@ import javax.validation.constraints.Size;
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("sys_menu")
-@ApiModel("菜单权限业务对象")
public class SysMenu extends TreeEntity {
/**
* 菜单ID
*/
- @ApiModelProperty(value = "菜单ID")
@TableId(value = "menu_id")
private Long menuId;
/**
* 菜单名称
*/
- @ApiModelProperty(value = "菜单名称")
@NotBlank(message = "菜单名称不能为空")
@Size(min = 0, max = 50, message = "菜单名称长度不能超过50个字符")
private String menuName;
@@ -43,65 +38,55 @@ public class SysMenu extends TreeEntity {
/**
* 显示顺序
*/
- @ApiModelProperty(value = "显示顺序")
@NotNull(message = "显示顺序不能为空")
private Integer orderNum;
/**
* 路由地址
*/
- @ApiModelProperty(value = "路由地址")
@Size(min = 0, max = 200, message = "路由地址不能超过200个字符")
private String path;
/**
* 组件路径
*/
- @ApiModelProperty(value = "组件路径")
@Size(min = 0, max = 200, message = "组件路径不能超过255个字符")
private String component;
/**
* 路由参数
*/
- @ApiModelProperty(value = "路由参数")
private String queryParam;
/**
* 是否为外链(0是 1否)
*/
- @ApiModelProperty(value = "是否为外链(0是 1否)")
private String isFrame;
/**
* 是否缓存(0缓存 1不缓存)
*/
- @ApiModelProperty(value = "是否缓存(0缓存 1不缓存)")
private String isCache;
/**
* 类型(M目录 C菜单 F按钮)
*/
- @ApiModelProperty(value = "类型(M目录 C菜单 F按钮)")
@NotBlank(message = "菜单类型不能为空")
private String menuType;
/**
* 显示状态(0显示 1隐藏)
*/
- @ApiModelProperty(value = "显示状态(0显示 1隐藏)")
private String visible;
/**
- * 菜单状态(0显示 1隐藏)
+ * 菜单状态(0正常 1停用)
*/
- @ApiModelProperty(value = "菜单状态(0显示 1隐藏)")
private String status;
/**
* 权限字符串
*/
- @ApiModelProperty(value = "权限字符串")
@JsonInclude(JsonInclude.Include.NON_NULL)
@Size(min = 0, max = 100, message = "权限标识长度不能超过100个字符")
private String perms;
@@ -109,13 +94,11 @@ public class SysMenu extends TreeEntity {
/**
* 菜单图标
*/
- @ApiModelProperty(value = "菜单图标")
private String icon;
/**
* 备注
*/
- @ApiModelProperty(value = "备注")
private String remark;
}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRole.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRole.java
index 804815738..52682894a 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRole.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRole.java
@@ -10,7 +10,6 @@ import com.ruoyi.common.annotation.ExcelDictFormat;
import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.convert.ExcelDictConvert;
import com.ruoyi.common.core.domain.BaseEntity;
-import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
@@ -18,6 +17,7 @@ import lombok.NoArgsConstructor;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
+import java.util.Set;
/**
* 角色表 sys_role
@@ -35,7 +35,6 @@ public class SysRole extends BaseEntity {
/**
* 角色ID
*/
- @ApiModelProperty(value = "角色ID")
@ExcelProperty(value = "角色序号")
@TableId(value = "role_id")
private Long roleId;
@@ -43,7 +42,6 @@ public class SysRole extends BaseEntity {
/**
* 角色名称
*/
- @ApiModelProperty(value = "角色名称")
@ExcelProperty(value = "角色名称")
@NotBlank(message = "角色名称不能为空")
@Size(min = 0, max = 30, message = "角色名称长度不能超过30个字符")
@@ -52,7 +50,6 @@ public class SysRole extends BaseEntity {
/**
* 角色权限
*/
- @ApiModelProperty(value = "角色权限")
@ExcelProperty(value = "角色权限")
@NotBlank(message = "权限字符不能为空")
@Size(min = 0, max = 100, message = "权限字符长度不能超过100个字符")
@@ -61,7 +58,6 @@ public class SysRole extends BaseEntity {
/**
* 角色排序
*/
- @ApiModelProperty(value = "角色排序")
@ExcelProperty(value = "角色排序")
@NotNull(message = "显示顺序不能为空")
private Integer roleSort;
@@ -69,7 +65,6 @@ public class SysRole extends BaseEntity {
/**
* 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限)
*/
- @ApiModelProperty(value = "数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限)")
@ExcelProperty(value = "数据范围", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "1=所有数据权限,2=自定义数据权限,3=本部门数据权限,4=本部门及以下数据权限,5=仅本人数据权限")
private String dataScope;
@@ -77,62 +72,59 @@ public class SysRole extends BaseEntity {
/**
* 菜单树选择项是否关联显示( 0:父子不互相关联显示 1:父子互相关联显示)
*/
- @ApiModelProperty(value = "菜单树选择项是否关联显示( 0:父子不互相关联显示 1:父子互相关联显示)")
private Boolean menuCheckStrictly;
/**
* 部门树选择项是否关联显示(0:父子不互相关联显示 1:父子互相关联显示 )
*/
- @ApiModelProperty(value = "部门树选择项是否关联显示(0:父子不互相关联显示 1:父子互相关联显示 )")
private Boolean deptCheckStrictly;
/**
* 角色状态(0正常 1停用)
*/
- @ApiModelProperty(value = "角色状态(0正常 1停用)")
@ExcelProperty(value = "角色状态", converter = ExcelDictConvert.class)
- @ExcelDictFormat(dictType = "sys_common_status")
+ @ExcelDictFormat(dictType = "sys_normal_disable")
private String status;
/**
* 删除标志(0代表存在 2代表删除)
*/
- @ApiModelProperty(value = "删除标志(0代表存在 2代表删除)")
@TableLogic
private String delFlag;
/**
* 备注
*/
- @ApiModelProperty(value = "备注")
private String remark;
/**
* 用户是否存在此角色标识 默认不存在
*/
- @ApiModelProperty(value = "用户是否存在此角色标识 默认不存在")
@TableField(exist = false)
private boolean flag = false;
/**
* 菜单组
*/
- @ApiModelProperty(value = "菜单组")
@TableField(exist = false)
private Long[] menuIds;
/**
* 部门组(数据权限)
*/
- @ApiModelProperty(value = "部门组(数据权限)")
@TableField(exist = false)
private Long[] deptIds;
+ /**
+ * 角色菜单权限
+ */
+ @TableField(exist = false)
+ private Set permissions;
+
public SysRole(Long roleId) {
this.roleId = roleId;
}
- @ApiModelProperty(value = "是否管理员")
public boolean isAdmin() {
return UserConstants.ADMIN_ID.equals(this.roleId);
}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java
index 9aa75f7a4..f2d961b7a 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java
@@ -1,15 +1,11 @@
package com.ruoyi.common.core.domain.entity;
import com.baomidou.mybatisplus.annotation.*;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonProperty;
import com.ruoyi.common.annotation.Sensitive;
import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.common.enums.SensitiveStrategy;
import com.ruoyi.common.xss.Xss;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
@@ -30,26 +26,22 @@ import java.util.List;
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
@TableName("sys_user")
-@ApiModel("用户信息业务对象")
public class SysUser extends BaseEntity {
/**
* 用户ID
*/
- @ApiModelProperty(value = "用户ID")
@TableId(value = "user_id")
private Long userId;
/**
* 部门ID
*/
- @ApiModelProperty(value = "部门ID")
private Long deptId;
/**
* 用户账号
*/
- @ApiModelProperty(value = "用户账号")
@Xss(message = "用户账号不能包含脚本字符")
@NotBlank(message = "用户账号不能为空")
@Size(min = 0, max = 30, message = "用户账号长度不能超过30个字符")
@@ -58,7 +50,6 @@ public class SysUser extends BaseEntity {
/**
* 用户昵称
*/
- @ApiModelProperty(value = "用户昵称")
@Xss(message = "用户昵称不能包含脚本字符")
@Size(min = 0, max = 30, message = "用户昵称长度不能超过30个字符")
private String nickName;
@@ -66,14 +57,12 @@ public class SysUser extends BaseEntity {
/**
* 用户类型(sys_user系统用户)
*/
- @ApiModelProperty(value = "用户类型")
private String userType;
/**
* 用户邮箱
*/
@Sensitive(strategy = SensitiveStrategy.EMAIL)
- @ApiModelProperty(value = "用户邮箱")
@Email(message = "邮箱格式不正确")
@Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符")
private String email;
@@ -82,25 +71,21 @@ public class SysUser extends BaseEntity {
* 手机号码
*/
@Sensitive(strategy = SensitiveStrategy.PHONE)
- @ApiModelProperty(value = "手机号码")
private String phonenumber;
/**
* 用户性别
*/
- @ApiModelProperty(value = "用户性别")
private String sex;
/**
* 用户头像
*/
- @ApiModelProperty(value = "用户头像")
private String avatar;
/**
* 密码
*/
- @ApiModelProperty(value = "密码")
@TableField(
insertStrategy = FieldStrategy.NOT_EMPTY,
updateStrategy = FieldStrategy.NOT_EMPTY,
@@ -111,66 +96,56 @@ public class SysUser extends BaseEntity {
/**
* 帐号状态(0正常 1停用)
*/
- @ApiModelProperty(value = "帐号状态(0正常 1停用)")
private String status;
/**
* 删除标志(0代表存在 2代表删除)
*/
- @ApiModelProperty(value = "删除标志(0代表存在 2代表删除)")
@TableLogic
private String delFlag;
/**
* 最后登录IP
*/
- @ApiModelProperty(value = "最后登录IP")
private String loginIp;
/**
* 最后登录时间
*/
- @ApiModelProperty(value = "最后登录时间")
private Date loginDate;
/**
* 备注
*/
- @ApiModelProperty(value = "备注")
private String remark;
/**
* 部门对象
*/
- @ApiModelProperty(value = "部门对象")
@TableField(exist = false)
private SysDept dept;
/**
* 角色对象
*/
- @ApiModelProperty(value = "角色对象")
@TableField(exist = false)
private List roles;
/**
* 角色组
*/
- @ApiModelProperty(value = "角色组")
@TableField(exist = false)
private Long[] roleIds;
/**
* 岗位组
*/
- @ApiModelProperty(value = "岗位组")
@TableField(exist = false)
private Long[] postIds;
/**
* 数据权限 当前角色ID
*/
- @ApiModelProperty(value = "角色ID")
@TableField(exist = false)
private Long roleId;
@@ -178,7 +153,6 @@ public class SysUser extends BaseEntity {
this.userId = userId;
}
- @ApiModelProperty(value = "是否管理员")
public boolean isAdmin() {
return UserConstants.ADMIN_ID.equals(this.userId);
}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginBody.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginBody.java
index f13de9711..4a4cfb518 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginBody.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginBody.java
@@ -1,8 +1,6 @@
package com.ruoyi.common.core.domain.model;
import com.ruoyi.common.constant.UserConstants;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
@@ -15,7 +13,6 @@ import javax.validation.constraints.NotBlank;
*/
@Data
-@ApiModel("用户登录对象")
public class LoginBody {
/**
@@ -23,7 +20,6 @@ public class LoginBody {
*/
@NotBlank(message = "{user.username.not.blank}")
@Length(min = UserConstants.USERNAME_MIN_LENGTH, max = UserConstants.USERNAME_MAX_LENGTH, message = "{user.username.length.valid}")
- @ApiModelProperty(value = "用户名")
private String username;
/**
@@ -31,19 +27,16 @@ public class LoginBody {
*/
@NotBlank(message = "{user.password.not.blank}")
@Length(min = UserConstants.PASSWORD_MIN_LENGTH, max = UserConstants.PASSWORD_MAX_LENGTH, message = "{user.password.length.valid}")
- @ApiModelProperty(value = "用户密码")
private String password;
/**
* 验证码
*/
- @ApiModelProperty(value = "验证码")
private String code;
/**
* 唯一标识
*/
- @ApiModelProperty(value = "唯一标识")
private String uuid;
}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java
index 9f7186c48..c93b9efe1 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java
@@ -105,6 +105,12 @@ public class LoginUser implements Serializable {
* 获取登录id
*/
public String getLoginId() {
+ if (userType == null) {
+ throw new IllegalArgumentException("用户类型不能为空");
+ }
+ if (userId == null) {
+ throw new IllegalArgumentException("用户ID不能为空");
+ }
return userType + LoginHelper.JOIN_CODE + userId;
}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/RegisterBody.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/RegisterBody.java
index bd9b84cca..88367e7b0 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/RegisterBody.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/RegisterBody.java
@@ -1,7 +1,5 @@
package com.ruoyi.common.core.domain.model;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -12,10 +10,8 @@ import lombok.EqualsAndHashCode;
*/
@Data
@EqualsAndHashCode(callSuper = true)
-@ApiModel("用户注册对象")
public class RegisterBody extends LoginBody {
- @ApiModelProperty(value = "用户类型")
private String userType;
}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/SmsLoginBody.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/SmsLoginBody.java
index f3ef445c5..ce774ac7e 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/SmsLoginBody.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/SmsLoginBody.java
@@ -1,7 +1,5 @@
package com.ruoyi.common.core.domain.model;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@@ -13,21 +11,18 @@ import javax.validation.constraints.NotBlank;
*/
@Data
-@ApiModel("短信登录对象")
public class SmsLoginBody {
/**
* 用户名
*/
@NotBlank(message = "{user.phonenumber.not.blank}")
- @ApiModelProperty(value = "用户手机号")
private String phonenumber;
/**
* 用户密码
*/
@NotBlank(message = "{sms.code.not.blank}")
- @ApiModelProperty(value = "短信验证码")
private String smsCode;
}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/mapper/BaseMapperPlus.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/mapper/BaseMapperPlus.java
index 1ff35792f..862887d16 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/core/mapper/BaseMapperPlus.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/mapper/BaseMapperPlus.java
@@ -149,7 +149,7 @@ public interface BaseMapperPlus extends BaseMapper {
return BeanCopyUtils.copy(obj, voClass);
}
- default List selectVoById(Collection extends Serializable> idList) {
+ default List selectVoBatchIds(Collection extends Serializable> idList) {
return selectVoBatchIds(idList, this.currentVoClass());
}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableDataInfo.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableDataInfo.java
index 48353e3e7..5f3f2d1ad 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableDataInfo.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableDataInfo.java
@@ -2,11 +2,8 @@ package com.ruoyi.common.core.page;
import cn.hutool.http.HttpStatus;
import com.baomidou.mybatisplus.core.metadata.IPage;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
-import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.List;
@@ -19,32 +16,27 @@ import java.util.List;
@Data
@NoArgsConstructor
-@ApiModel("分页响应对象")
public class TableDataInfo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 总记录数
*/
- @ApiModelProperty("总记录数")
private long total;
/**
* 列表数据
*/
- @ApiModelProperty("列表数据")
private List rows;
/**
* 消息状态码
*/
- @ApiModelProperty("消息状态码")
private int code;
/**
* 消息内容
*/
- @ApiModelProperty("消息内容")
private String msg;
/**
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/excel/DefaultExcelListener.java b/ruoyi-common/src/main/java/com/ruoyi/common/excel/DefaultExcelListener.java
index 9936f6762..6cd6d2816 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/excel/DefaultExcelListener.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/excel/DefaultExcelListener.java
@@ -6,6 +6,7 @@ import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.exception.ExcelAnalysisException;
import com.alibaba.excel.exception.ExcelDataConvertException;
import com.ruoyi.common.utils.JsonUtils;
+import com.ruoyi.common.utils.StreamUtils;
import com.ruoyi.common.utils.ValidatorUtils;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -14,7 +15,6 @@ import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import java.util.Map;
import java.util.Set;
-import java.util.stream.Collectors;
/**
* Excel 导入监听
@@ -69,9 +69,7 @@ public class DefaultExcelListener extends AnalysisEventListener implements
if (exception instanceof ConstraintViolationException) {
ConstraintViolationException constraintViolationException = (ConstraintViolationException) exception;
Set> constraintViolations = constraintViolationException.getConstraintViolations();
- String constraintViolationsMsg = constraintViolations.stream()
- .map(ConstraintViolation::getMessage)
- .collect(Collectors.joining(", "));
+ String constraintViolationsMsg = StreamUtils.join(constraintViolations, ConstraintViolation::getMessage, ", ");
errMsg = StrUtil.format("第{}行数据校验异常: {}", context.readRowHolder().getRowIndex() + 1, constraintViolationsMsg);
if (log.isDebugEnabled()) {
log.error(errMsg);
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/exception/GlobalException.java b/ruoyi-common/src/main/java/com/ruoyi/common/exception/GlobalException.java
index 5584cbce3..080785c9f 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/exception/GlobalException.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/exception/GlobalException.java
@@ -1,52 +1,52 @@
-package com.ruoyi.common.exception;
-
-/**
- * 全局异常
- *
- * @author ruoyi
- */
-public class GlobalException extends RuntimeException {
-
- private static final long serialVersionUID = 1L;
-
- /**
- * 错误提示
- */
- private String message;
-
- /**
- * 错误明细,内部调试错误
- *
- * 和 {@link CommonResult#getDetailMessage()} 一致的设计
- */
- private String detailMessage;
-
- /**
- * 空构造方法,避免反序列化问题
- */
- public GlobalException() {
- }
-
- public GlobalException(String message) {
- this.message = message;
- }
-
- public String getDetailMessage() {
- return detailMessage;
- }
-
- public GlobalException setDetailMessage(String detailMessage) {
- this.detailMessage = detailMessage;
- return this;
- }
-
- @Override
- public String getMessage() {
- return message;
- }
-
- public GlobalException setMessage(String message) {
- this.message = message;
- return this;
- }
-}
\ No newline at end of file
+package com.ruoyi.common.exception;
+
+/**
+ * 全局异常
+ *
+ * @author ruoyi
+ */
+public class GlobalException extends RuntimeException {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 错误提示
+ */
+ private String message;
+
+ /**
+ * 错误明细,内部调试错误
+ *
+ * 和 {@link CommonResult#getDetailMessage()} 一致的设计
+ */
+ private String detailMessage;
+
+ /**
+ * 空构造方法,避免反序列化问题
+ */
+ public GlobalException() {
+ }
+
+ public GlobalException(String message) {
+ this.message = message;
+ }
+
+ public String getDetailMessage() {
+ return detailMessage;
+ }
+
+ public GlobalException setDetailMessage(String detailMessage) {
+ this.detailMessage = detailMessage;
+ return this;
+ }
+
+ @Override
+ public String getMessage() {
+ return message;
+ }
+
+ public GlobalException setMessage(String message) {
+ this.message = message;
+ return this;
+ }
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/exception/ServiceException.java b/ruoyi-common/src/main/java/com/ruoyi/common/exception/ServiceException.java
index 95ce6d84c..53f41b3b9 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/exception/ServiceException.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/exception/ServiceException.java
@@ -1,65 +1,65 @@
-package com.ruoyi.common.exception;
-
-/**
- * 业务异常
- *
- * @author ruoyi
- */
-public final class ServiceException extends RuntimeException {
- private static final long serialVersionUID = 1L;
-
- /**
- * 错误码
- */
- private Integer code;
-
- /**
- * 错误提示
- */
- private String message;
-
- /**
- * 错误明细,内部调试错误
- *
- * 和 {@link CommonResult#getDetailMessage()} 一致的设计
- */
- private String detailMessage;
-
- /**
- * 空构造方法,避免反序列化问题
- */
- public ServiceException() {
- }
-
- public ServiceException(String message) {
- this.message = message;
- }
-
- public ServiceException(String message, Integer code) {
- this.message = message;
- this.code = code;
- }
-
- public String getDetailMessage() {
- return detailMessage;
- }
-
- @Override
- public String getMessage() {
- return message;
- }
-
- public Integer getCode() {
- return code;
- }
-
- public ServiceException setMessage(String message) {
- this.message = message;
- return this;
- }
-
- public ServiceException setDetailMessage(String detailMessage) {
- this.detailMessage = detailMessage;
- return this;
- }
-}
\ No newline at end of file
+package com.ruoyi.common.exception;
+
+/**
+ * 业务异常
+ *
+ * @author ruoyi
+ */
+public final class ServiceException extends RuntimeException {
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 错误码
+ */
+ private Integer code;
+
+ /**
+ * 错误提示
+ */
+ private String message;
+
+ /**
+ * 错误明细,内部调试错误
+ *
+ * 和 {@link CommonResult#getDetailMessage()} 一致的设计
+ */
+ private String detailMessage;
+
+ /**
+ * 空构造方法,避免反序列化问题
+ */
+ public ServiceException() {
+ }
+
+ public ServiceException(String message) {
+ this.message = message;
+ }
+
+ public ServiceException(String message, Integer code) {
+ this.message = message;
+ this.code = code;
+ }
+
+ public String getDetailMessage() {
+ return detailMessage;
+ }
+
+ @Override
+ public String getMessage() {
+ return message;
+ }
+
+ public Integer getCode() {
+ return code;
+ }
+
+ public ServiceException setMessage(String message) {
+ this.message = message;
+ return this;
+ }
+
+ public ServiceException setDetailMessage(String detailMessage) {
+ this.detailMessage = detailMessage;
+ return this;
+ }
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserPasswordRetryLimitExceedException.java b/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserPasswordRetryLimitExceedException.java
new file mode 100644
index 000000000..3d2b640e0
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserPasswordRetryLimitExceedException.java
@@ -0,0 +1,16 @@
+package com.ruoyi.common.exception.user;
+
+/**
+ * 用户错误最大次数异常类
+ *
+ * @author ruoyi
+ */
+public class UserPasswordRetryLimitExceedException extends UserException {
+
+ private static final long serialVersionUID = 1L;
+
+ public UserPasswordRetryLimitExceedException(int retryLimitCount, int lockTime) {
+ super("user.password.retry.limit.exceed", retryLimitCount, lockTime);
+ }
+
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatedlyRequestWrapper.java b/ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatedlyRequestWrapper.java
index b6fd0b65a..c1cbe3f2f 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatedlyRequestWrapper.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/filter/RepeatedlyRequestWrapper.java
@@ -1,6 +1,7 @@
package com.ruoyi.common.filter;
import cn.hutool.core.io.IoUtil;
+import com.ruoyi.common.constant.Constants;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
@@ -11,7 +12,6 @@ import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
-import java.nio.charset.StandardCharsets;
/**
* 构建可重复读取inputStream的request
@@ -23,10 +23,10 @@ public class RepeatedlyRequestWrapper extends HttpServletRequestWrapper {
public RepeatedlyRequestWrapper(HttpServletRequest request, ServletResponse response) throws IOException {
super(request);
- request.setCharacterEncoding("UTF-8");
- response.setCharacterEncoding("UTF-8");
+ request.setCharacterEncoding(Constants.UTF8);
+ response.setCharacterEncoding(Constants.UTF8);
- body = IoUtil.readUtf8(request.getInputStream()).getBytes(StandardCharsets.UTF_8);
+ body = IoUtil.readBytes(request.getInputStream(), false);
}
@Override
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/filter/XssFilter.java b/ruoyi-common/src/main/java/com/ruoyi/common/filter/XssFilter.java
index 72a8f2740..5a0879472 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/filter/XssFilter.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/filter/XssFilter.java
@@ -1,5 +1,6 @@
package com.ruoyi.common.filter;
+import com.ruoyi.common.enums.HttpMethod;
import com.ruoyi.common.utils.StringUtils;
import javax.servlet.*;
@@ -48,7 +49,7 @@ public class XssFilter implements Filter {
String url = request.getServletPath();
String method = request.getMethod();
// GET DELETE 不过滤
- if (method == null || method.matches("GET") || method.matches("DELETE")) {
+ if (method == null || HttpMethod.GET.matches(method) || HttpMethod.DELETE.matches(method)) {
return true;
}
return StringUtils.matches(url, excludes);
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/filter/XssHttpServletRequestWrapper.java b/ruoyi-common/src/main/java/com/ruoyi/common/filter/XssHttpServletRequestWrapper.java
index a8ffd66cc..3646f1fee 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/filter/XssHttpServletRequestWrapper.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/filter/XssHttpServletRequestWrapper.java
@@ -1,6 +1,7 @@
package com.ruoyi.common.filter;
import cn.hutool.core.io.IoUtil;
+import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HtmlUtil;
import com.ruoyi.common.utils.StringUtils;
import org.springframework.http.HttpHeaders;
@@ -50,7 +51,7 @@ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
}
// 为空,直接返回
- String json = IoUtil.read(super.getInputStream(), StandardCharsets.UTF_8);
+ String json = StrUtil.str(IoUtil.readBytes(super.getInputStream(), false), StandardCharsets.UTF_8);
if (StringUtils.isEmpty(json)) {
return super.getInputStream();
}
@@ -88,11 +89,9 @@ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
/**
* 是否是Json请求
- *
- * @param request
*/
public boolean isJsonRequest() {
String header = super.getHeader(HttpHeaders.CONTENT_TYPE);
return StringUtils.startsWithIgnoreCase(header, MediaType.APPLICATION_JSON_VALUE);
}
-}
\ No newline at end of file
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/helper/LoginHelper.java b/ruoyi-common/src/main/java/com/ruoyi/common/helper/LoginHelper.java
index 09e1dc757..1cef0278b 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/helper/LoginHelper.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/helper/LoginHelper.java
@@ -2,6 +2,7 @@ package com.ruoyi.common.helper;
import cn.dev33.satoken.context.SaHolder;
import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjectUtil;
import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.domain.model.LoginUser;
@@ -80,18 +81,12 @@ public class LoginHelper {
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)) {
+ String[] strs = StringUtils.split(loginId, JOIN_CODE);
+ if (!ArrayUtil.containsAny(strs, UserType.values())) {
throw new UtilException("登录用户: LoginId异常 => " + loginId);
}
- return Long.parseLong(userId);
+ // 用户id在总是在最后
+ return Long.parseLong(strs[strs.length - 1]);
}
return loginUser.getUserId();
}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/jackson/DictDataJsonSerializer.java b/ruoyi-common/src/main/java/com/ruoyi/common/jackson/DictDataJsonSerializer.java
new file mode 100644
index 000000000..caa059b92
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/jackson/DictDataJsonSerializer.java
@@ -0,0 +1,56 @@
+package com.ruoyi.common.jackson;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+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.DictDataMapper;
+import com.ruoyi.common.core.service.DictService;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.spring.SpringUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeansException;
+
+import java.io.IOException;
+import java.util.Objects;
+
+/**
+ * 字典数据json序列化工具
+ *
+ * @author itino
+ */
+@Slf4j
+public class DictDataJsonSerializer extends JsonSerializer implements ContextualSerializer {
+
+ private String dictType;
+
+ @Override
+ public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
+ try {
+ DictService dictService = SpringUtils.getBean(DictService.class);
+ if (ObjectUtil.isNotNull(dictService)) {
+ String label = dictService.getDictLabel(dictType, value);
+ gen.writeString(StringUtils.isNotBlank(label) ? label : value);
+ } else {
+ gen.writeString(value);
+ }
+ } catch (BeansException e) {
+ log.error("字典数据未查到, 采用默认处理 => {}", e.getMessage());
+ gen.writeString(value);
+ }
+ }
+
+ @Override
+ public JsonSerializer> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException {
+ DictDataMapper anno = property.getAnnotation(DictDataMapper.class);
+ if (Objects.nonNull(anno) && StrUtil.isNotBlank(anno.dictType())) {
+ this.dictType = anno.dictType();
+ return this;
+ }
+ return prov.findValueSerializer(property.getType(), property);
+ }
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/jackson/SensitiveJsonSerializer.java b/ruoyi-common/src/main/java/com/ruoyi/common/jackson/SensitiveJsonSerializer.java
index 404f393fe..41e578163 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/jackson/SensitiveJsonSerializer.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/jackson/SensitiveJsonSerializer.java
@@ -1,5 +1,6 @@
package com.ruoyi.common.jackson;
+import cn.hutool.core.util.ObjectUtil;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.BeanProperty;
import com.fasterxml.jackson.databind.JsonMappingException;
@@ -10,6 +11,8 @@ 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 lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeansException;
import java.io.IOException;
import java.util.Objects;
@@ -19,19 +22,24 @@ import java.util.Objects;
*
* @author Yjoioooo
*/
+@Slf4j
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(strategy.desensitizer().apply(value));
- } else {
+ try {
+ SensitiveService sensitiveService = SpringUtils.getBean(SensitiveService.class);
+ if (ObjectUtil.isNotNull(sensitiveService) && sensitiveService.isSensitive()) {
+ gen.writeString(strategy.desensitizer().apply(value));
+ } else {
+ gen.writeString(value);
+ }
+ } catch (BeansException e) {
+ log.error("脱敏实现不存在, 采用默认处理 => {}", e.getMessage());
gen.writeString(value);
}
-
}
@Override
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/BeanCopyUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/BeanCopyUtils.java
index 93906046d..88161daac 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/BeanCopyUtils.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/BeanCopyUtils.java
@@ -14,7 +14,6 @@ import org.springframework.cglib.core.Converter;
import java.util.List;
import java.util.Map;
-import java.util.stream.Collectors;
/**
* bean深拷贝工具(基于 cglib 性能优异)
@@ -79,11 +78,11 @@ public class BeanCopyUtils {
if (CollUtil.isEmpty(sourceList)) {
return CollUtil.newArrayList();
}
- return sourceList.stream().map(source -> {
+ return StreamUtils.toList(sourceList, source -> {
V target = ReflectUtil.newInstanceIfPossible(desc);
copy(source, target);
return target;
- }).collect(Collectors.toList());
+ });
}
/**
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/JsonUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/JsonUtils.java
index 446bf1b00..e5c471e55 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/JsonUtils.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/JsonUtils.java
@@ -6,6 +6,7 @@ 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;
+import com.fasterxml.jackson.databind.exc.MismatchedInputException;
import com.ruoyi.common.utils.spring.SpringUtils;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
@@ -78,6 +79,9 @@ public class JsonUtils {
}
try {
return OBJECT_MAPPER.readValue(text, OBJECT_MAPPER.getTypeFactory().constructType(Dict.class));
+ } catch (MismatchedInputException e) {
+ // 类型不匹配说明不是json
+ return null;
} catch (IOException e) {
throw new RuntimeException(e);
}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ServletUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ServletUtils.java
index 6408c8944..91ddd3f66 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ServletUtils.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ServletUtils.java
@@ -3,6 +3,7 @@ package com.ruoyi.common.utils;
import cn.hutool.core.convert.Convert;
import cn.hutool.extra.servlet.ServletUtil;
import cn.hutool.http.HttpStatus;
+import com.ruoyi.common.constant.Constants;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.springframework.http.MediaType;
@@ -10,11 +11,18 @@ import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
+import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
/**
* 客户端工具类
@@ -66,6 +74,31 @@ public class ServletUtils extends ServletUtil {
return Convert.toBool(getRequest().getParameter(name), defaultValue);
}
+ /**
+ * 获得所有请求参数
+ *
+ * @param request 请求对象{@link ServletRequest}
+ * @return Map
+ */
+ public static Map getParams(ServletRequest request) {
+ final Map map = request.getParameterMap();
+ return Collections.unmodifiableMap(map);
+ }
+
+ /**
+ * 获得所有请求参数
+ *
+ * @param request 请求对象{@link ServletRequest}
+ * @return Map
+ */
+ public static Map getParamMap(ServletRequest request) {
+ Map params = new HashMap<>();
+ for (Map.Entry entry : getParams(request).entrySet()) {
+ params.put(entry.getKey(), StringUtils.join(entry.getValue(), ","));
+ }
+ return params;
+ }
+
/**
* 获取request
*/
@@ -117,7 +150,7 @@ public class ServletUtils extends ServletUtil {
public static boolean isAjaxRequest(HttpServletRequest request) {
String accept = request.getHeader("accept");
- if (accept != null && accept.contains("application/json")) {
+ if (accept != null && accept.contains(MediaType.APPLICATION_JSON_VALUE)) {
return true;
}
@@ -139,4 +172,32 @@ public class ServletUtils extends ServletUtil {
return getClientIP(getRequest());
}
+ /**
+ * 内容编码
+ *
+ * @param str 内容
+ * @return 编码后的内容
+ */
+ public static String urlEncode(String str) {
+ try {
+ return URLEncoder.encode(str, Constants.UTF8);
+ } catch (UnsupportedEncodingException e) {
+ return StringUtils.EMPTY;
+ }
+ }
+
+ /**
+ * 内容解码
+ *
+ * @param str 内容
+ * @return 解码后的内容
+ */
+ public static String urlDecode(String str) {
+ try {
+ return URLDecoder.decode(str, Constants.UTF8);
+ } catch (UnsupportedEncodingException e) {
+ return StringUtils.EMPTY;
+ }
+ }
+
}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/StreamUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/StreamUtils.java
new file mode 100644
index 000000000..fccd9e3d1
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/StreamUtils.java
@@ -0,0 +1,251 @@
+package com.ruoyi.common.utils;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.map.MapUtil;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+
+import java.util.*;
+import java.util.function.BiFunction;
+import java.util.function.Function;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+
+/**
+ * stream 流工具类
+ *
+ * @author Lion Li
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public class StreamUtils {
+
+ /**
+ * 将collection过滤
+ *
+ * @param collection 需要转化的集合
+ * @param function 过滤方法
+ * @return 过滤后的list
+ */
+ public static List filter(Collection collection, Predicate function) {
+ if (CollUtil.isEmpty(collection)) {
+ return CollUtil.newArrayList();
+ }
+ return collection.stream().filter(function).collect(Collectors.toList());
+ }
+
+ /**
+ * 将collection拼接
+ *
+ * @param collection 需要转化的集合
+ * @param function 拼接方法
+ * @return 拼接后的list
+ */
+ public static String join(Collection collection, Function function) {
+ return join(collection, function, ",");
+ }
+
+ /**
+ * 将collection拼接
+ *
+ * @param collection 需要转化的集合
+ * @param function 拼接方法
+ * @param delimiter 拼接符
+ * @return 拼接后的list
+ */
+ public static String join(Collection collection, Function function, CharSequence delimiter) {
+ if (CollUtil.isEmpty(collection)) {
+ return StringUtils.EMPTY;
+ }
+ return collection.stream().map(function).filter(Objects::nonNull).collect(Collectors.joining(delimiter));
+ }
+
+ /**
+ * 将collection排序
+ *
+ * @param collection 需要转化的集合
+ * @param comparing 排序方法
+ * @return 排序后的list
+ */
+ public static List sorted(Collection collection, Comparator comparing) {
+ if (CollUtil.isEmpty(collection)) {
+ return CollUtil.newArrayList();
+ }
+ return collection.stream().sorted(comparing).collect(Collectors.toList());
+ }
+
+ /**
+ * 将collection转化为类型不变的map
+ * {@code Collection ----> Map}
+ *
+ * @param collection 需要转化的集合
+ * @param key V类型转化为K类型的lambda方法
+ * @param collection中的泛型
+ * @param map中的key类型
+ * @return 转化后的map
+ */
+ public static Map toIdentityMap(Collection collection, Function key) {
+ if (CollUtil.isEmpty(collection)) {
+ return MapUtil.newHashMap();
+ }
+ return collection.stream().collect(Collectors.toMap(key, Function.identity(), (l, r) -> l));
+ }
+
+ /**
+ * 将Collection转化为map(value类型与collection的泛型不同)
+ * {@code Collection -----> Map }
+ *
+ * @param collection 需要转化的集合
+ * @param key E类型转化为K类型的lambda方法
+ * @param value E类型转化为V类型的lambda方法
+ * @param collection中的泛型
+ * @param map中的key类型
+ * @param map中的value类型
+ * @return 转化后的map
+ */
+ public static Map toMap(Collection collection, Function key, Function value) {
+ if (CollUtil.isEmpty(collection)) {
+ return MapUtil.newHashMap();
+ }
+ return collection.stream().collect(Collectors.toMap(key, value, (l, r) -> l));
+ }
+
+ /**
+ * 将collection按照规则(比如有相同的班级id)分类成map
+ * {@code Collection -------> Map> }
+ *
+ * @param collection 需要分类的集合
+ * @param key 分类的规则
+ * @param collection中的泛型
+ * @param map中的key类型
+ * @return 分类后的map
+ */
+ public static Map> groupByKey(Collection collection, Function key) {
+ if (CollUtil.isEmpty(collection)) {
+ return MapUtil.newHashMap();
+ }
+ return collection
+ .stream()
+ .collect(Collectors.groupingBy(key, LinkedHashMap::new, Collectors.toList()));
+ }
+
+ /**
+ * 将collection按照两个规则(比如有相同的年级id,班级id)分类成双层map
+ * {@code Collection ---> Map>> }
+ *
+ * @param collection 需要分类的集合
+ * @param key1 第一个分类的规则
+ * @param key2 第二个分类的规则
+ * @param 集合元素类型
+ * @param 第一个map中的key类型
+ * @param 第二个map中的key类型
+ * @return 分类后的map
+ */
+ public static Map>> groupBy2Key(Collection collection, Function key1, Function key2) {
+ if (CollUtil.isEmpty(collection)) {
+ return MapUtil.newHashMap();
+ }
+ return collection
+ .stream()
+ .collect(Collectors.groupingBy(key1, LinkedHashMap::new, Collectors.groupingBy(key2, LinkedHashMap::new, Collectors.toList())));
+ }
+
+ /**
+ * 将collection按照两个规则(比如有相同的年级id,班级id)分类成双层map
+ * {@code Collection ---> Map> }
+ *
+ * @param collection 需要分类的集合
+ * @param key1 第一个分类的规则
+ * @param key2 第二个分类的规则
+ * @param 第一个map中的key类型
+ * @param 第二个map中的key类型
+ * @param collection中的泛型
+ * @return 分类后的map
+ */
+ public static Map> group2Map(Collection collection, Function key1, Function key2) {
+ if (CollUtil.isEmpty(collection) || key1 == null || key2 == null) {
+ return MapUtil.newHashMap();
+ }
+ return collection
+ .stream()
+ .collect(Collectors.groupingBy(key1, LinkedHashMap::new, Collectors.toMap(key2, Function.identity(), (l, r) -> l)));
+ }
+
+ /**
+ * 将collection转化为List集合,但是两者的泛型不同
+ * {@code Collection ------> List }
+ *
+ * @param collection 需要转化的集合
+ * @param function collection中的泛型转化为list泛型的lambda表达式
+ * @param collection中的泛型
+ * @param List中的泛型
+ * @return 转化后的list
+ */
+ public static List toList(Collection collection, Function function) {
+ if (CollUtil.isEmpty(collection)) {
+ return CollUtil.newArrayList();
+ }
+ return collection
+ .stream()
+ .map(function)
+ .filter(Objects::nonNull)
+ .collect(Collectors.toList());
+ }
+
+ /**
+ * 将collection转化为Set集合,但是两者的泛型不同
+ * {@code Collection ------> Set }
+ *
+ * @param collection 需要转化的集合
+ * @param function collection中的泛型转化为set泛型的lambda表达式
+ * @param collection中的泛型
+ * @param Set中的泛型
+ * @return 转化后的Set
+ */
+ public static Set toSet(Collection collection, Function function) {
+ if (CollUtil.isEmpty(collection) || function == null) {
+ return CollUtil.newHashSet();
+ }
+ return collection
+ .stream()
+ .map(function)
+ .filter(Objects::nonNull)
+ .collect(Collectors.toSet());
+ }
+
+
+ /**
+ * 合并两个相同key类型的map
+ *
+ * @param map1 第一个需要合并的 map
+ * @param map2 第二个需要合并的 map
+ * @param merge 合并的lambda,将key value1 value2合并成最终的类型,注意value可能为空的情况
+ * @param map中的key类型
+ * @param 第一个 map的value类型
+ * @param 第二个 map的value类型
+ * @param 最终map的value类型
+ * @return 合并后的map
+ */
+ public static Map merge(Map map1, Map map2, BiFunction merge) {
+ if (MapUtil.isEmpty(map1) && MapUtil.isEmpty(map2)) {
+ return MapUtil.newHashMap();
+ } else if (MapUtil.isEmpty(map1)) {
+ map1 = MapUtil.newHashMap();
+ } else if (MapUtil.isEmpty(map2)) {
+ map2 = MapUtil.newHashMap();
+ }
+ Set key = new HashSet<>();
+ key.addAll(map1.keySet());
+ key.addAll(map2.keySet());
+ Map map = new HashMap<>();
+ for (K t : key) {
+ X x = map1.get(t);
+ Y y = map2.get(t);
+ V z = merge.apply(x, y);
+ if (z != null) {
+ map.put(t, z);
+ }
+ }
+ return map;
+ }
+
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java
index e6a67b26b..3ff8fec40 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java
@@ -194,7 +194,6 @@ public class ExcelUtil {
*/
private static void resetResponse(String sheetName, HttpServletResponse response) throws UnsupportedEncodingException {
String filename = encodingFilename(sheetName);
- response.reset();
FileUtils.setAttachmentResponseHeader(response, filename);
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8");
}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/redis/CacheUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/redis/CacheUtils.java
new file mode 100644
index 000000000..9e0b09b07
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/redis/CacheUtils.java
@@ -0,0 +1,75 @@
+package com.ruoyi.common.utils.redis;
+
+import com.ruoyi.common.utils.spring.SpringUtils;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import org.redisson.api.RMap;
+import org.springframework.cache.Cache;
+import org.springframework.cache.CacheManager;
+
+import java.util.Set;
+
+/**
+ * 缓存操作工具类 {@link }
+ *
+ * @author Michelle.Chung
+ * @date 2022/8/13
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+@SuppressWarnings(value = {"unchecked"})
+public class CacheUtils {
+
+ private static final CacheManager CACHE_MANAGER = SpringUtils.getBean(CacheManager.class);
+
+ /**
+ * 获取缓存组内所有的KEY
+ *
+ * @param cacheNames 缓存组名称
+ */
+ public static Set keys(String cacheNames) {
+ RMap rmap = (RMap) CACHE_MANAGER.getCache(cacheNames).getNativeCache();
+ return rmap.keySet();
+ }
+
+ /**
+ * 获取缓存值
+ *
+ * @param cacheNames 缓存组名称
+ * @param key 缓存key
+ */
+ public static T get(String cacheNames, Object key) {
+ Cache.ValueWrapper wrapper = CACHE_MANAGER.getCache(cacheNames).get(key);
+ return wrapper != null ? (T) wrapper.get() : null;
+ }
+
+ /**
+ * 保存缓存值
+ *
+ * @param cacheNames 缓存组名称
+ * @param key 缓存key
+ * @param value 缓存值
+ */
+ public static void put(String cacheNames, Object key, Object value) {
+ CACHE_MANAGER.getCache(cacheNames).put(key, value);
+ }
+
+ /**
+ * 删除缓存值
+ *
+ * @param cacheNames 缓存组名称
+ * @param key 缓存key
+ */
+ public static void evict(String cacheNames, Object key) {
+ CACHE_MANAGER.getCache(cacheNames).evict(key);
+ }
+
+ /**
+ * 清空缓存值
+ *
+ * @param cacheNames 缓存组名称
+ */
+ public static void clear(String cacheNames) {
+ CACHE_MANAGER.getCache(cacheNames).clear();
+ }
+
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/redis/QueueUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/redis/QueueUtils.java
index 7850e016d..7a4bce4b3 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/redis/QueueUtils.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/redis/QueueUtils.java
@@ -5,7 +5,6 @@ import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.redisson.api.*;
-import java.util.Comparator;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;
@@ -30,6 +29,43 @@ public class QueueUtils {
return CLIENT;
}
+ /**
+ * 添加普通队列数据
+ *
+ * @param queueName 队列名
+ * @param data 数据
+ */
+ public static boolean addQueueObject(String queueName, T data) {
+ RBlockingQueue queue = CLIENT.getBlockingQueue(queueName);
+ return queue.offer(data);
+ }
+
+ /**
+ * 通用获取一个队列数据 没有数据返回 null(不支持延迟队列)
+ *
+ * @param queueName 队列名
+ */
+ public static T getQueueObject(String queueName) {
+ RBlockingQueue queue = CLIENT.getBlockingQueue(queueName);
+ return queue.poll();
+ }
+
+ /**
+ * 通用删除队列数据(不支持延迟队列)
+ */
+ public static boolean removeQueueObject(String queueName, T data) {
+ RBlockingQueue queue = CLIENT.getBlockingQueue(queueName);
+ return queue.remove(data);
+ }
+
+ /**
+ * 通用销毁队列 所有阻塞监听 报错(不支持延迟队列)
+ */
+ public static boolean destroyQueue(String queueName) {
+ RBlockingQueue queue = CLIENT.getBlockingQueue(queueName);
+ return queue.delete();
+ }
+
/**
* 添加延迟队列数据 默认毫秒
*
@@ -84,32 +120,6 @@ public class QueueUtils {
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);
- }
-
/**
* 添加优先队列数据
*
@@ -121,32 +131,6 @@ public class QueueUtils {
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();
- }
-
/**
* 尝试设置 有界队列 容量 用于限制数量
*
@@ -168,7 +152,7 @@ public class QueueUtils {
public static boolean trySetBoundedQueueCapacity(String queueName, int capacity, boolean destroy) {
RBoundedBlockingQueue boundedBlockingQueue = CLIENT.getBoundedBlockingQueue(queueName);
if (boundedBlockingQueue.isExists() && destroy) {
- destroyBoundedQueueObject(queueName);
+ destroyQueue(queueName);
}
return boundedBlockingQueue.trySetCapacity(capacity);
}
@@ -185,32 +169,6 @@ public class QueueUtils {
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();
- }
-
/**
* 订阅阻塞队列(可订阅所有实现类 例如: 延迟 优先 有界 等)
*/
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/redis/RedisUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/redis/RedisUtils.java
index 7ed3b2827..80f5f5281 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/redis/RedisUtils.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/redis/RedisUtils.java
@@ -1,10 +1,10 @@
package com.ruoyi.common.utils.redis;
-import cn.hutool.core.collection.IterUtil;
import com.ruoyi.common.utils.spring.SpringUtils;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.redisson.api.*;
+import org.redisson.config.Config;
import java.time.Duration;
import java.util.Collection;
@@ -12,6 +12,8 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Consumer;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
/**
* redis 工具类
@@ -25,6 +27,14 @@ public class RedisUtils {
private static final RedissonClient CLIENT = SpringUtils.getBean(RedissonClient.class);
+ public static NameMapper getNameMapper() {
+ Config config = CLIENT.getConfig();
+ if (config.isClusterConfig()) {
+ return config.useClusterServers().getNameMapper();
+ }
+ return config.useSingleServer().getNameMapper();
+ }
+
/**
* 限流
*
@@ -100,14 +110,13 @@ public class RedisUtils {
* @since Redis 6.X 以上使用 setAndKeepTTL 兼容 5.X 方案
*/
public static void setCacheObject(final String key, final T value, final boolean isSaveTtl) {
- RBucket bucket = CLIENT.getBucket(key);
+ RBucket bucket = CLIENT.getBucket(key);
if (isSaveTtl) {
try {
bucket.setAndKeepTTL(value);
} catch (Exception e) {
long timeToLive = bucket.remainTimeToLive();
- bucket.set(value);
- bucket.expire(Duration.ofMillis(timeToLive));
+ setCacheObject(key, value, Duration.ofMillis(timeToLive));
}
} else {
bucket.set(value);
@@ -122,9 +131,11 @@ public class RedisUtils {
* @param duration 时间
*/
public static void setCacheObject(final String key, final T value, final Duration duration) {
- RBucket result = CLIENT.getBucket(key);
- result.set(value);
- result.expire(duration);
+ RBatch batch = CLIENT.createBatch();
+ RBucketAsync bucket = batch.getBucket(key);
+ bucket.setAsync(value);
+ bucket.expireAsync(duration);
+ batch.execute();
}
/**
@@ -316,6 +327,17 @@ public class RedisUtils {
return rMap.getAll(rMap.keySet());
}
+ /**
+ * 获得缓存Map的key列表
+ *
+ * @param key 缓存的键值
+ * @return key列表
+ */
+ public static Set getCacheMapKeySet(final String key) {
+ RMap rMap = CLIENT.getMap(key);
+ return rMap.keySet();
+ }
+
/**
* 往Hash中存入数据
*
@@ -415,8 +437,17 @@ public class RedisUtils {
* @return 对象列表
*/
public static Collection keys(final String pattern) {
- Iterable iterable = CLIENT.getKeys().getKeysByPattern(pattern);
- return IterUtil.toList(iterable);
+ Stream stream = CLIENT.getKeys().getKeysStreamByPattern(getNameMapper().map(pattern));
+ return stream.map(key -> getNameMapper().unmap(key)).collect(Collectors.toList());
+ }
+
+ /**
+ * 删除缓存的基本对象列表
+ *
+ * @param pattern 字符串前缀
+ */
+ public static void deleteKeys(final String pattern) {
+ CLIENT.getKeys().deleteByPattern(getNameMapper().map(pattern));
}
/**
@@ -426,6 +457,6 @@ public class RedisUtils {
*/
public static Boolean hasKey(String key) {
RKeys rKeys = CLIENT.getKeys();
- return rKeys.countExists(key) > 0;
+ return rKeys.countExists(getNameMapper().map(key)) > 0;
}
}
diff --git a/ruoyi-demo/pom.xml b/ruoyi-demo/pom.xml
index bbcf0fe2b..46b45981d 100644
--- a/ruoyi-demo/pom.xml
+++ b/ruoyi-demo/pom.xml
@@ -5,7 +5,7 @@
ruoyi-vue-plus
com.ruoyi
- 4.2.0
+ 4.4.0
4.0.0
@@ -36,7 +36,7 @@
-
+
diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/MailController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/MailController.java
index 6dabe5132..6db4dc4e7 100644
--- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/MailController.java
+++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/MailController.java
@@ -2,9 +2,6 @@ package com.ruoyi.demo.controller;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.utils.email.MailUtils;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
@@ -20,27 +17,34 @@ import java.io.File;
* @author Michelle.Chung
*/
@Validated
-@Api(value = "邮件发送案例", tags = {"邮件发送案例"})
@RequiredArgsConstructor
@RestController
@RequestMapping("/demo/mail")
public class MailController {
- @ApiOperation("发送邮件")
+ /**
+ * 发送邮件
+ *
+ * @param to 接收人
+ * @param subject 标题
+ * @param text 内容
+ */
@GetMapping("/sendSimpleMessage")
- public R sendSimpleMessage(@ApiParam("接收人") String to,
- @ApiParam("标题") String subject,
- @ApiParam("内容") String text) {
+ public R sendSimpleMessage(String to, String subject, String text) {
MailUtils.sendText(to, subject, text);
return R.ok();
}
- @ApiOperation("发送邮件(带附件)")
+ /**
+ * 发送邮件(带附件)
+ *
+ * @param to 接收人
+ * @param subject 标题
+ * @param text 内容
+ * @param filePath 附件路径
+ */
@GetMapping("/sendMessageWithAttachment")
- public R sendMessageWithAttachment(@ApiParam("接收人") String to,
- @ApiParam("标题") String subject,
- @ApiParam("内容") String text,
- @ApiParam("附件路径") String filePath) {
+ public R sendMessageWithAttachment(String to, String subject, String text, String filePath) {
MailUtils.sendText(to, subject, text, new File(filePath));
return R.ok();
}
diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisCacheController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisCacheController.java
index 9fc93074f..7342cba98 100644
--- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisCacheController.java
+++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisCacheController.java
@@ -1,9 +1,8 @@
package com.ruoyi.demo.controller;
+import com.ruoyi.common.constant.CacheNames;
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.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
@@ -20,8 +19,7 @@ import java.time.Duration;
* @author Lion Li
*/
// 类级别 缓存统一配置
-//@CacheConfig(cacheNames = "redissonCacheMap")
-@Api(value = "spring-cache 演示案例", tags = {"spring-cache 演示案例"})
+//@CacheConfig(cacheNames = CacheNames.DEMO_CACHE)
@RequiredArgsConstructor
@RestController
@RequestMapping("/demo/cache")
@@ -39,10 +37,9 @@ public class RedisCacheController {
* 重点说明: 缓存注解严谨与其他筛选数据功能一起使用
* 例如: 数据权限注解 会造成 缓存击穿 与 数据不一致问题
*
- * cacheNames 为配置文件内 groupId
+ * cacheNames 命名规则 查看 {@link CacheNames} 注释 支持多参数
*/
- @ApiOperation("测试 @Cacheable")
- @Cacheable(cacheNames = "redissonCacheMap", key = "#key", condition = "#key != null")
+ @Cacheable(cacheNames = "demo:cache#60s#10m#20", key = "#key", condition = "#key != null")
@GetMapping("/test1")
public R test1(String key, String value) {
return R.ok("操作成功", value);
@@ -52,12 +49,11 @@ public class RedisCacheController {
* 测试 @CachePut
*
* 加了@CachePut注解的方法,会把方法的返回值put到缓存里面缓存起来,供其它地方使用
- * 它「通常用在新增方法上」
+ * 它「通常用在新增或者实时更新方法上」
*
- * cacheNames 为 配置文件内 groupId
+ * cacheNames 命名规则 查看 {@link CacheNames} 注释 支持多参数
*/
- @ApiOperation("测试 @CachePut")
- @CachePut(cacheNames = "redissonCacheMap", key = "#key", condition = "#key != null")
+ @CachePut(cacheNames = CacheNames.DEMO_CACHE, key = "#key", condition = "#key != null")
@GetMapping("/test2")
public R test2(String key, String value) {
return R.ok("操作成功", value);
@@ -67,12 +63,11 @@ public class RedisCacheController {
* 测试 @CacheEvict
*
* 使用了CacheEvict注解的方法,会清空指定缓存
- * 「一般用在更新或者删除的方法上」
+ * 「一般用在删除的方法上」
*
- * cacheNames 为 配置文件内 groupId
+ * cacheNames 命名规则 查看 {@link CacheNames} 注释 支持多参数
*/
- @ApiOperation("测试 @CacheEvict")
- @CacheEvict(cacheNames = "redissonCacheMap", key = "#key", condition = "#key != null")
+ @CacheEvict(cacheNames = CacheNames.DEMO_CACHE, key = "#key", condition = "#key != null")
@GetMapping("/test3")
public R test3(String key, String value) {
return R.ok("操作成功", value);
@@ -83,7 +78,6 @@ public class RedisCacheController {
* 手动设置过期时间10秒
* 11秒后获取 判断是否相等
*/
- @ApiOperation("测试设置过期时间")
@GetMapping("/test6")
public R test6(String key, String value) {
RedisUtils.setCacheObject(key, value);
diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisLockController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisLockController.java
index c31925a57..ebc923d1b 100644
--- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisLockController.java
+++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisLockController.java
@@ -5,8 +5,6 @@ import com.baomidou.lock.LockTemplate;
import com.baomidou.lock.annotation.Lock4j;
import com.baomidou.lock.executor.RedissonLockExecutor;
import com.ruoyi.common.core.domain.R;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
@@ -21,7 +19,6 @@ import java.time.LocalTime;
*
* @author shenxinquan
*/
-@Api(value = "测试分布式锁的样例", tags = {"测试分布式锁的样例"})
@Slf4j
@RestController
@RequestMapping("/demo/redisLock")
@@ -33,7 +30,6 @@ public class RedisLockController {
/**
* 测试lock4j 注解
*/
- @ApiOperation("测试lock4j 注解")
@Lock4j(keys = {"#key"})
@GetMapping("/testLock4j")
public R testLock4j(String key, String value) {
@@ -50,7 +46,6 @@ public class RedisLockController {
/**
* 测试lock4j 工具
*/
- @ApiOperation("测试lock4j 工具")
@GetMapping("/testLock4jLockTemplate")
public R testLock4jLockTemplate(String key, String value) {
final LockInfo lockInfo = lockTemplate.lock(key, 30000L, 5000L, RedissonLockExecutor.class);
diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisPubSubController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisPubSubController.java
index 99c3131b4..0c2af3951 100644
--- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisPubSubController.java
+++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisPubSubController.java
@@ -2,9 +2,6 @@ package com.ruoyi.demo.controller;
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.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -15,24 +12,32 @@ import org.springframework.web.bind.annotation.RestController;
*
* @author Lion Li
*/
-@Api(value = "Redis发布订阅 演示案例", tags = {"Redis发布订阅"})
@RequiredArgsConstructor
@RestController
@RequestMapping("/demo/redis/pubsub")
public class RedisPubSubController {
- @ApiOperation("发布消息")
+ /**
+ * 发布消息
+ *
+ * @param key 通道Key
+ * @param value 发送内容
+ */
@GetMapping("/pub")
- public R pub(@ApiParam("通道Key") String key, @ApiParam("发送内容") String value) {
+ public R pub(String key, String value) {
RedisUtils.publish(key, value, consumer -> {
System.out.println("发布通道 => " + key + ", 发送值 => " + value);
});
return R.ok("操作成功");
}
- @ApiOperation("订阅消息")
+ /**
+ * 订阅消息
+ *
+ * @param key 通道Key
+ */
@GetMapping("/sub")
- public R sub(@ApiParam("通道Key") String key) {
+ public R sub(String key) {
RedisUtils.subscribe(key, String.class, msg -> {
System.out.println("订阅通道 => " + key + ", 接收值 => " + msg);
});
diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisRateLimiterController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisRateLimiterController.java
index c7f48e519..ee2e530ba 100644
--- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisRateLimiterController.java
+++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/RedisRateLimiterController.java
@@ -3,8 +3,6 @@ package com.ruoyi.demo.controller;
import com.ruoyi.common.annotation.RateLimiter;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.enums.LimitType;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -16,7 +14,6 @@ import org.springframework.web.bind.annotation.RestController;
*
* @author Lion Li
*/
-@Api(value = "测试分布式限流样例", tags = {"测试分布式限流样例"})
@Slf4j
@RestController
@RequestMapping("/demo/rateLimiter")
@@ -26,7 +23,6 @@ public class RedisRateLimiterController {
* 测试全局限流
* 全局影响
*/
- @ApiOperation("测试全局限流")
@RateLimiter(count = 2, time = 10)
@GetMapping("/test")
public R test(String value) {
@@ -37,7 +33,6 @@ public class RedisRateLimiterController {
* 测试请求IP限流
* 同一IP请求受影响
*/
- @ApiOperation("测试请求IP限流")
@RateLimiter(count = 2, time = 10, limitType = LimitType.IP)
@GetMapping("/testip")
public R testip(String value) {
@@ -48,7 +43,6 @@ public class RedisRateLimiterController {
* 测试集群实例限流
* 启动两个后端服务互不影响
*/
- @ApiOperation("测试集群实例限流")
@RateLimiter(count = 2, time = 10, limitType = LimitType.CLUSTER)
@GetMapping("/testcluster")
public R testcluster(String value) {
diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/SmsController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/SmsController.java
index b92078624..cc6012f44 100644
--- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/SmsController.java
+++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/SmsController.java
@@ -4,9 +4,6 @@ import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.sms.config.properties.SmsProperties;
import com.ruoyi.sms.core.SmsTemplate;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
@@ -24,7 +21,6 @@ import java.util.Map;
* @version 4.2.0
*/
@Validated
-@Api(value = "短信演示案例", tags = {"短信演示案例"})
@RequiredArgsConstructor
@RestController
@RequestMapping("/demo/sms")
@@ -34,10 +30,14 @@ public class SmsController {
// private final SmsTemplate smsTemplate; // 可以使用spring注入
// private final AliyunSmsTemplate smsTemplate; // 也可以注入某个厂家的模板工具
- @ApiOperation("发送短信Aliyun")
+ /**
+ * 发送短信Aliyun
+ *
+ * @param phones 电话号
+ * @param templateId 模板ID
+ */
@GetMapping("/sendAliyun")
- public R sendAliyun(@ApiParam("电话号") String phones,
- @ApiParam("模板ID") String templateId) {
+ public R sendAliyun(String phones, String templateId) {
if (!smsProperties.getEnabled()) {
return R.fail("当前系统没有开启短信功能!");
}
@@ -51,10 +51,14 @@ public class SmsController {
return R.ok(send);
}
- @ApiOperation("发送短信Tencent")
+ /**
+ * 发送短信Tencent
+ *
+ * @param phones 电话号
+ * @param templateId 模板ID
+ */
@GetMapping("/sendTencent")
- public R sendTencent(@ApiParam("电话号") String phones,
- @ApiParam("模板ID") String templateId) {
+ public R sendTencent(String phones, String templateId) {
if (!smsProperties.getEnabled()) {
return R.fail("当前系统没有开启短信功能!");
}
diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/Swagger3DemoController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/Swagger3DemoController.java
index e50ce03a5..0398b14d5 100644
--- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/Swagger3DemoController.java
+++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/Swagger3DemoController.java
@@ -1,24 +1,18 @@
package com.ruoyi.demo.controller;
import com.ruoyi.common.core.domain.R;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiImplicitParams;
-import io.swagger.annotations.ApiOperation;
+import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
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 用法示例
*
* @author Lion Li
*/
-@Api(value = "演示swagger3控制器", tags = {"演示swagger3接口"})
@RestController
@RequestMapping("/swagger/demo")
public class Swagger3DemoController {
@@ -26,12 +20,10 @@ public class Swagger3DemoController {
/**
* 上传请求
* 必须使用 @RequestPart 注解标注为文件
+ *
+ * @param file 文件
*/
- @ApiOperation(value = "通用上传请求")
- @ApiImplicitParams({
- @ApiImplicitParam(name = "file", value = "文件", paramType = "query", dataTypeClass = File.class, required = true)
- })
- @PostMapping(value = "/upload")
+ @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public R upload(@RequestPart("file") MultipartFile file) {
return R.ok("操作成功", file.getOriginalFilename());
}
diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestBatchController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestBatchController.java
index aa1f064a0..3bd2867ee 100644
--- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestBatchController.java
+++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestBatchController.java
@@ -5,8 +5,6 @@ import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.demo.domain.TestDemo;
import com.ruoyi.demo.mapper.TestDemoMapper;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PostMapping;
@@ -22,7 +20,6 @@ import java.util.List;
* @author Lion Li
* @date 2021-05-30
*/
-@Api(value = "测试批量方法", tags = {"测试批量方法"})
@RequiredArgsConstructor
@RestController
@RequestMapping("/demo/batch")
@@ -38,7 +35,6 @@ public class TestBatchController extends BaseController {
*
* 3.5.0 版本 增加 rewriteBatchedStatements=true 批处理参数 使 MP 原生批处理可以达到同样的速度
*/
- @ApiOperation(value = "新增批量方法")
@PostMapping("/add")
// @DS("slave")
public R add() {
@@ -50,7 +46,7 @@ public class TestBatchController extends BaseController {
testDemo.setValue("测试新增");
list.add(testDemo);
}
- return toAjax(testDemoMapper.insertBatch(list) ? 1 : 0);
+ return toAjax(testDemoMapper.insertBatch(list));
}
/**
@@ -58,7 +54,6 @@ public class TestBatchController extends BaseController {
*
* 3.5.0 版本 增加 rewriteBatchedStatements=true 批处理参数 使 MP 原生批处理可以达到同样的速度
*/
- @ApiOperation(value = "新增或更新批量方法")
@PostMapping("/addOrUpdate")
// @DS("slave")
public R addOrUpdate() {
@@ -68,7 +63,8 @@ public class TestBatchController extends BaseController {
testDemo.setOrderNum(-1);
testDemo.setTestKey("批量新增");
testDemo.setValue("测试新增");
- list.add(testDemo); }
+ list.add(testDemo);
+ }
testDemoMapper.insertBatch(list);
for (int i = 0; i < list.size(); i++) {
TestDemo testDemo = list.get(i);
@@ -78,13 +74,12 @@ public class TestBatchController extends BaseController {
testDemo.setId(null);
}
}
- return toAjax(testDemoMapper.insertOrUpdateBatch(list) ? 1 : 0);
+ return toAjax(testDemoMapper.insertOrUpdateBatch(list));
}
/**
* 删除批量方法
*/
- @ApiOperation(value = "删除批量方法")
@DeleteMapping()
// @DS("slave")
public R remove() {
diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestDemoController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestDemoController.java
index 9f00c0770..873facc3b 100644
--- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestDemoController.java
+++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestDemoController.java
@@ -5,8 +5,8 @@ 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.R;
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.AddGroup;
import com.ruoyi.common.core.validate.EditGroup;
@@ -20,8 +20,8 @@ import com.ruoyi.demo.domain.bo.TestDemoBo;
import com.ruoyi.demo.domain.bo.TestDemoImportVo;
import com.ruoyi.demo.domain.vo.TestDemoVo;
import com.ruoyi.demo.service.ITestDemoService;
-import io.swagger.annotations.*;
import lombok.RequiredArgsConstructor;
+import org.springframework.http.MediaType;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -29,7 +29,6 @@ import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
-import java.io.File;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.TimeUnit;
@@ -41,7 +40,6 @@ import java.util.concurrent.TimeUnit;
* @date 2021-07-26
*/
@Validated
-@Api(value = "测试单表控制器", tags = {"测试单表管理"})
@RequiredArgsConstructor
@RestController
@RequestMapping("/demo/demo")
@@ -52,7 +50,6 @@ public class TestDemoController extends BaseController {
/**
* 查询测试单表列表
*/
- @ApiOperation("查询测试单表列表")
@SaCheckPermission("demo:demo:list")
@GetMapping("/list")
public TableDataInfo list(@Validated(QueryGroup.class) TestDemoBo bo, PageQuery pageQuery) {
@@ -62,20 +59,20 @@ public class TestDemoController extends BaseController {
/**
* 自定义分页查询
*/
- @ApiOperation("自定义分页查询")
@SaCheckPermission("demo:demo:list")
@GetMapping("/page")
public TableDataInfo page(@Validated(QueryGroup.class) TestDemoBo bo, PageQuery pageQuery) {
return iTestDemoService.customPageList(bo, pageQuery);
}
- @ApiOperation("导入测试-校验")
- @ApiImplicitParams({
- @ApiImplicitParam(name = "file", value = "导入文件", paramType = "query", dataTypeClass = File.class, required = true),
- })
+ /**
+ * 导入数据
+ *
+ * @param file 导入文件
+ */
@Log(title = "测试单表", businessType = BusinessType.IMPORT)
@SaCheckPermission("demo:demo:import")
- @PostMapping("/importData")
+ @PostMapping(value = "/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public R importData(@RequestPart("file") MultipartFile file) throws Exception {
ExcelResult excelResult = ExcelUtil.importExcel(file.getInputStream(), TestDemoImportVo.class, true);
List volist = excelResult.getList();
@@ -87,7 +84,6 @@ public class TestDemoController extends BaseController {
/**
* 导出测试单表列表
*/
- @ApiOperation("导出测试单表列表")
@SaCheckPermission("demo:demo:export")
@Log(title = "测试单表", businessType = BusinessType.EXPORT)
@PostMapping("/export")
@@ -102,20 +98,19 @@ public class TestDemoController extends BaseController {
/**
* 获取测试单表详细信息
+ *
+ * @param id 测试ID
*/
- @ApiOperation("获取测试单表详细信息")
@SaCheckPermission("demo:demo:query")
@GetMapping("/{id}")
- public R getInfo(@ApiParam("测试ID")
- @NotNull(message = "主键不能为空")
- @PathVariable("id") Long id) {
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable("id") Long id) {
return R.ok(iTestDemoService.queryById(id));
}
/**
* 新增测试单表
*/
- @ApiOperation("新增测试单表")
@SaCheckPermission("demo:demo:add")
@Log(title = "测试单表", businessType = BusinessType.INSERT)
@RepeatSubmit(interval = 2, timeUnit = TimeUnit.SECONDS, message = "{repeat.submit.message}")
@@ -124,31 +119,30 @@ public class TestDemoController extends BaseController {
// 使用校验工具对标 @Validated(AddGroup.class) 注解
// 用于在非 Controller 的地方校验对象
ValidatorUtils.validate(bo, AddGroup.class);
- return toAjax(iTestDemoService.insertByBo(bo) ? 1 : 0);
+ return toAjax(iTestDemoService.insertByBo(bo));
}
/**
* 修改测试单表
*/
- @ApiOperation("修改测试单表")
@SaCheckPermission("demo:demo:edit")
@Log(title = "测试单表", businessType = BusinessType.UPDATE)
@RepeatSubmit
@PutMapping()
public R edit(@Validated(EditGroup.class) @RequestBody TestDemoBo bo) {
- return toAjax(iTestDemoService.updateByBo(bo) ? 1 : 0);
+ return toAjax(iTestDemoService.updateByBo(bo));
}
/**
* 删除测试单表
+ *
+ * @param ids 测试ID串
*/
- @ApiOperation("删除测试单表")
@SaCheckPermission("demo:demo:remove")
@Log(title = "测试单表", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
- public R remove(@ApiParam("测试ID串")
- @NotEmpty(message = "主键不能为空")
- @PathVariable Long[] ids) {
- return toAjax(iTestDemoService.deleteWithValidByIds(Arrays.asList(ids), true) ? 1 : 0);
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable Long[] ids) {
+ return toAjax(iTestDemoService.deleteWithValidByIds(Arrays.asList(ids), true));
}
}
diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestExcelController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestExcelController.java
index a318b4658..51b81c582 100644
--- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestExcelController.java
+++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestExcelController.java
@@ -2,8 +2,6 @@ package com.ruoyi.demo.controller;
import cn.hutool.core.collection.CollUtil;
import com.ruoyi.common.utils.poi.ExcelUtil;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import lombok.Data;
import org.springframework.web.bind.annotation.GetMapping;
@@ -21,7 +19,6 @@ import java.util.Map;
*
* @author Lion Li
*/
-@Api(value = "测试Excel功能", tags = {"测试Excel功能"})
@RestController
@RequestMapping("/demo/excel")
public class TestExcelController {
@@ -29,35 +26,33 @@ public class TestExcelController {
/**
* 单列表多数据
*/
- @ApiOperation(value = "单列表多数据")
@GetMapping("/exportTemplateOne")
public void exportTemplateOne(HttpServletResponse response) {
- Map map = new HashMap<>();
- map.put("title","单列表多数据");
- map.put("test1","数据测试1");
- map.put("test2","数据测试2");
- map.put("test3","数据测试3");
- map.put("test4","数据测试4");
- map.put("testTest","666");
+ Map map = new HashMap<>();
+ map.put("title", "单列表多数据");
+ map.put("test1", "数据测试1");
+ map.put("test2", "数据测试2");
+ map.put("test3", "数据测试3");
+ map.put("test4", "数据测试4");
+ map.put("testTest", "666");
List list = new ArrayList<>();
list.add(new TestObj("单列表测试1", "列表测试1", "列表测试2", "列表测试3", "列表测试4"));
list.add(new TestObj("单列表测试2", "列表测试5", "列表测试6", "列表测试7", "列表测试8"));
list.add(new TestObj("单列表测试3", "列表测试9", "列表测试10", "列表测试11", "列表测试12"));
- ExcelUtil.exportTemplate(CollUtil.newArrayList(map,list),"单列表.xlsx", "excel/单列表.xlsx", response);
+ ExcelUtil.exportTemplate(CollUtil.newArrayList(map, list), "单列表.xlsx", "excel/单列表.xlsx", response);
}
/**
* 多列表多数据
*/
- @ApiOperation(value = "多列表多数据")
@GetMapping("/exportTemplateMuliti")
public void exportTemplateMuliti(HttpServletResponse response) {
- Map map = new HashMap<>();
- map.put("title1","标题1");
- map.put("title2","标题2");
- map.put("title3","标题3");
- map.put("title4","标题4");
- map.put("author","Lion Li");
+ Map map = new HashMap<>();
+ map.put("title1", "标题1");
+ map.put("title2", "标题2");
+ map.put("title3", "标题3");
+ map.put("title4", "标题4");
+ map.put("author", "Lion Li");
List list1 = new ArrayList<>();
list1.add(new TestObj1("list1测试1", "list1测试2", "list1测试3"));
list1.add(new TestObj1("list1测试4", "list1测试5", "list1测试6"));
@@ -72,12 +67,12 @@ public class TestExcelController {
list4.add(new TestObj1("list4测试4", "list4测试5", "list4测试6"));
list4.add(new TestObj1("list4测试7", "list4测试8", "list4测试9"));
list4.add(new TestObj1("list4测试10", "list4测试11", "list4测试12"));
- Map multiListMap = new HashMap<>();
- multiListMap.put("map",map);
- multiListMap.put("data1",list1);
- multiListMap.put("data2",list2);
- multiListMap.put("data3",list3);
- multiListMap.put("data4",list4);
+ Map multiListMap = new HashMap<>();
+ multiListMap.put("map", map);
+ multiListMap.put("data1", list1);
+ multiListMap.put("data2", list2);
+ multiListMap.put("data3", list3);
+ multiListMap.put("data4", list4);
ExcelUtil.exportTemplateMultiList(multiListMap, "多列表.xlsx", "excel/多列表.xlsx", response);
}
diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestI18nController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestI18nController.java
index 9b3bffc09..0cc529a61 100644
--- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestI18nController.java
+++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestI18nController.java
@@ -2,9 +2,6 @@ package com.ruoyi.demo.controller;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.utils.MessageUtils;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
import lombok.Data;
import org.hibernate.validator.constraints.Range;
import org.springframework.validation.annotation.Validated;
@@ -22,7 +19,6 @@ import javax.validation.constraints.NotNull;
* @author Lion Li
*/
@Validated
-@Api(value = "测试国际化控制器", tags = {"测试国际化管理"})
@RestController
@RequestMapping("/demo/i18n")
public class TestI18nController {
@@ -32,10 +28,11 @@ public class TestI18nController {
* code为 messages.properties 中的 key
*
* 测试使用 user.register.success
+ *
+ * @param code 国际化code
*/
- @ApiOperation("通过code获取国际化内容")
@GetMapping()
- public R get(@ApiParam("国际化code") String code) {
+ public R get(String code) {
return R.ok(MessageUtils.message(code));
}
@@ -45,7 +42,6 @@ public class TestI18nController {
*
* 测试使用 not.null
*/
- @ApiOperation("Validator 校验国际化")
@GetMapping("/test1")
public R test1(@NotBlank(message = "{not.null}") String str) {
return R.ok(str);
@@ -57,7 +53,6 @@ public class TestI18nController {
*
* 测试使用 not.null
*/
- @ApiOperation("Bean 校验国际化")
@GetMapping("/test2")
public R test2(@Validated TestI18nBo bo) {
return R.ok(bo);
diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestSensitiveController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestSensitiveController.java
index 1f34f9cf4..6bf904caf 100644
--- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestSensitiveController.java
+++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestSensitiveController.java
@@ -4,8 +4,6 @@ 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;
@@ -21,7 +19,6 @@ import org.springframework.web.bind.annotation.RestController;
* @version 3.6.0
* @see com.ruoyi.common.core.service.SensitiveService
*/
-@Api(value = "测试数据脱敏控制器", tags = {"测试数据脱敏管理"})
@RestController
@RequestMapping("/demo/sensitive")
public class TestSensitiveController extends BaseController {
@@ -29,7 +26,6 @@ public class TestSensitiveController extends BaseController {
/**
* 测试数据脱敏
*/
- @ApiOperation("查询测试单表列表")
@GetMapping("/test")
public R test() {
TestSensitive testSensitive = new TestSensitive();
diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestTreeController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestTreeController.java
index 64f36c941..db54230c6 100644
--- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestTreeController.java
+++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestTreeController.java
@@ -13,9 +13,6 @@ import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.demo.domain.bo.TestTreeBo;
import com.ruoyi.demo.domain.vo.TestTreeVo;
import com.ruoyi.demo.service.ITestTreeService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@@ -33,7 +30,6 @@ import java.util.List;
* @date 2021-07-26
*/
@Validated
-@Api(value = "测试树表控制器", tags = {"测试树表管理"})
@RequiredArgsConstructor
@RestController
@RequestMapping("/demo/tree")
@@ -44,7 +40,6 @@ public class TestTreeController extends BaseController {
/**
* 查询测试树表列表
*/
- @ApiOperation("查询测试树表列表")
@SaCheckPermission("demo:tree:list")
@GetMapping("/list")
public R> list(@Validated(QueryGroup.class) TestTreeBo bo) {
@@ -55,7 +50,6 @@ public class TestTreeController extends BaseController {
/**
* 导出测试树表列表
*/
- @ApiOperation("导出测试树表列表")
@SaCheckPermission("demo:tree:export")
@Log(title = "测试树表", businessType = BusinessType.EXPORT)
@GetMapping("/export")
@@ -66,50 +60,48 @@ public class TestTreeController extends BaseController {
/**
* 获取测试树表详细信息
+ *
+ * @param id 测试树ID
*/
- @ApiOperation("获取测试树表详细信息")
@SaCheckPermission("demo:tree:query")
@GetMapping("/{id}")
- public R getInfo(@ApiParam("测试树ID")
- @NotNull(message = "主键不能为空")
- @PathVariable("id") Long id) {
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable("id") Long id) {
return R.ok(iTestTreeService.queryById(id));
}
/**
* 新增测试树表
*/
- @ApiOperation("新增测试树表")
@SaCheckPermission("demo:tree:add")
@Log(title = "测试树表", businessType = BusinessType.INSERT)
@RepeatSubmit
@PostMapping()
public R add(@Validated(AddGroup.class) @RequestBody TestTreeBo bo) {
- return toAjax(iTestTreeService.insertByBo(bo) ? 1 : 0);
+ return toAjax(iTestTreeService.insertByBo(bo));
}
/**
* 修改测试树表
*/
- @ApiOperation("修改测试树表")
@SaCheckPermission("demo:tree:edit")
@Log(title = "测试树表", businessType = BusinessType.UPDATE)
@RepeatSubmit
@PutMapping()
public R edit(@Validated(EditGroup.class) @RequestBody TestTreeBo bo) {
- return toAjax(iTestTreeService.updateByBo(bo) ? 1 : 0);
+ return toAjax(iTestTreeService.updateByBo(bo));
}
/**
* 删除测试树表
+ *
+ * @param ids 测试树ID串
*/
- @ApiOperation("删除测试树表")
@SaCheckPermission("demo:tree:remove")
@Log(title = "测试树表", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
- public R remove(@ApiParam("测试树ID串")
- @NotEmpty(message = "主键不能为空")
- @PathVariable Long[] ids) {
- return toAjax(iTestTreeService.deleteWithValidByIds(Arrays.asList(ids), true) ? 1 : 0);
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable Long[] ids) {
+ return toAjax(iTestTreeService.deleteWithValidByIds(Arrays.asList(ids), true));
}
}
diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/BoundedQueueController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/BoundedQueueController.java
index 532c499e1..968a4193f 100644
--- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/BoundedQueueController.java
+++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/BoundedQueueController.java
@@ -2,9 +2,6 @@ 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;
@@ -23,19 +20,22 @@ import org.springframework.web.bind.annotation.RestController;
* @version 3.6.0
*/
@Slf4j
-@Api(value = "有界队列 演示案例", tags = {"有界队列"})
@RequiredArgsConstructor
@RestController
@RequestMapping("/demo/queue/bounded")
public class BoundedQueueController {
- @ApiOperation("添加队列数据")
+ /**
+ * 添加队列数据
+ *
+ * @param queueName 队列名
+ * @param capacity 容量
+ */
@GetMapping("/add")
- public R add(@ApiParam("队列名") String queueName,
- @ApiParam("容量") int capacity) {
+ public R add(String queueName, int capacity) {
// 用完了一定要销毁 否则会一直存在
- boolean b = QueueUtils.destroyBoundedQueueObject(queueName);
+ boolean b = QueueUtils.destroyQueue(queueName);
log.info("通道: {} , 删除: {}", queueName, b);
// 初始化设置一次即可
if (QueueUtils.trySetBoundedQueueCapacity(queueName, capacity)) {
@@ -56,11 +56,15 @@ public class BoundedQueueController {
return R.ok("操作成功");
}
- @ApiOperation("删除队列数据")
+ /**
+ * 删除队列数据
+ *
+ * @param queueName 队列名
+ */
@GetMapping("/remove")
- public R remove(@ApiParam("队列名") String queueName) {
+ public R remove(String queueName) {
String data = "data-" + 5;
- if (QueueUtils.removeBoundedQueueObject(queueName, data)) {
+ if (QueueUtils.removeQueueObject(queueName, data)) {
log.info("通道: {} , 删除数据: {}", queueName, data);
} else {
return R.fail("操作失败");
@@ -68,12 +72,16 @@ public class BoundedQueueController {
return R.ok("操作成功");
}
- @ApiOperation("获取队列数据")
+ /**
+ * 获取队列数据
+ *
+ * @param queueName 队列名
+ */
@GetMapping("/get")
- public R get(@ApiParam("队列名") String queueName) {
+ public R get(String queueName) {
String data;
do {
- data = QueueUtils.getBoundedQueueObject(queueName);
+ data = QueueUtils.getQueueObject(queueName);
log.info("通道: {} , 获取数据: {}", queueName, data);
} while (data != null);
return R.ok("操作成功");
diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/DelayedQueueController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/DelayedQueueController.java
index f8777533c..e6dbee863 100644
--- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/DelayedQueueController.java
+++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/DelayedQueueController.java
@@ -2,9 +2,6 @@ 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;
@@ -26,15 +23,18 @@ import java.util.concurrent.TimeUnit;
* @version 3.6.0
*/
@Slf4j
-@Api(value = "延迟队列 演示案例", tags = {"延迟队列"})
@RequiredArgsConstructor
@RestController
@RequestMapping("/demo/queue/delayed")
public class DelayedQueueController {
- @ApiOperation("订阅队列")
+ /**
+ * 订阅队列
+ *
+ * @param queueName 队列名
+ */
@GetMapping("/subscribe")
- public R subscribe(@ApiParam("队列名") String queueName) {
+ public R subscribe(String queueName) {
log.info("通道: {} 监听中......", queueName);
// 项目初始化设置一次即可
QueueUtils.subscribeBlockingQueue(queueName, (String orderNum) -> {
@@ -44,21 +44,29 @@ public class DelayedQueueController {
return R.ok("操作成功");
}
- @ApiOperation("添加队列数据")
+ /**
+ * 添加队列数据
+ *
+ * @param queueName 队列名
+ * @param orderNum 订单号
+ * @param time 延迟时间(秒)
+ */
@GetMapping("/add")
- public R add(@ApiParam("队列名") String queueName,
- @ApiParam("订单号") String orderNum,
- @ApiParam("延迟时间(秒)") Long time) {
+ public R add(String queueName, String orderNum, Long time) {
QueueUtils.addDelayedQueueObject(queueName, orderNum, time, TimeUnit.SECONDS);
// 观察发送时间
log.info("通道: {} , 发送数据: {}", queueName, orderNum);
return R.ok("操作成功");
}
- @ApiOperation("删除队列数据")
+ /**
+ * 删除队列数据
+ *
+ * @param queueName 队列名
+ * @param orderNum 订单号
+ */
@GetMapping("/remove")
- public R remove(@ApiParam("队列名") String queueName,
- @ApiParam("订单号") String orderNum) {
+ public R remove(String queueName, String orderNum) {
if (QueueUtils.removeDelayedQueueObject(queueName, orderNum)) {
log.info("通道: {} , 删除数据: {}", queueName, orderNum);
} else {
@@ -67,9 +75,13 @@ public class DelayedQueueController {
return R.ok("操作成功");
}
- @ApiOperation("销毁队列")
+ /**
+ * 销毁队列
+ *
+ * @param queueName 队列名
+ */
@GetMapping("/destroy")
- public R destroy(@ApiParam("队列名") String queueName) {
+ public R destroy(String queueName) {
// 用完了一定要销毁 否则会一直存在
QueueUtils.destroyDelayedQueue(queueName);
return R.ok("操作成功");
diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/PriorityDemo.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/PriorityDemo.java
index 80f1b1155..320a640da 100644
--- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/PriorityDemo.java
+++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/PriorityDemo.java
@@ -2,6 +2,7 @@ package com.ruoyi.demo.controller.queue;
import lombok.Data;
import lombok.NoArgsConstructor;
+import org.jetbrains.annotations.NotNull;
/**
* 实体类 注意不允许使用内部类 否则会找不到类
@@ -11,7 +12,12 @@ import lombok.NoArgsConstructor;
*/
@Data
@NoArgsConstructor
-public class PriorityDemo {
+public class PriorityDemo implements Comparable {
private String name;
private Integer orderNum;
+
+ @Override
+ public int compareTo(@NotNull PriorityDemo other) {
+ return Integer.compare(getOrderNum(), other.getOrderNum());
+ }
}
diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/PriorityDemoComparator.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/PriorityDemoComparator.java
deleted file mode 100644
index f72e6950d..000000000
--- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/PriorityDemoComparator.java
+++ /dev/null
@@ -1,16 +0,0 @@
-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-demo/src/main/java/com/ruoyi/demo/controller/queue/PriorityQueueController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/PriorityQueueController.java
index baec18440..4a60232c7 100644
--- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/PriorityQueueController.java
+++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/PriorityQueueController.java
@@ -3,9 +3,6 @@ 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;
@@ -24,26 +21,22 @@ import org.springframework.web.bind.annotation.RestController;
* @version 3.6.0
*/
@Slf4j
-@Api(value = "优先队列 演示案例", tags = {"优先队列"})
@RequiredArgsConstructor
@RestController
@RequestMapping("/demo/queue/priority")
public class PriorityQueueController {
- @ApiOperation("添加队列数据")
+ /**
+ * 添加队列数据
+ *
+ * @param queueName 队列名
+ */
@GetMapping("/add")
- public R add(@ApiParam("队列名") String queueName) {
+ public R add(String queueName) {
// 用完了一定要销毁 否则会一直存在
- boolean b = QueueUtils.destroyPriorityQueueObject(queueName);
+ boolean b = QueueUtils.destroyQueue(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();
@@ -58,15 +51,19 @@ public class PriorityQueueController {
return R.ok("操作成功");
}
- @ApiOperation("删除队列数据")
+ /**
+ * 删除队列数据
+ *
+ * @param queueName 队列名
+ * @param name 对象名
+ * @param orderNum 排序号
+ */
@GetMapping("/remove")
- public R remove(@ApiParam("队列名") String queueName,
- @ApiParam("对象名") String name,
- @ApiParam("排序号") Integer orderNum) {
+ public R remove(String queueName, String name, Integer orderNum) {
PriorityDemo data = new PriorityDemo();
data.setName(name);
data.setOrderNum(orderNum);
- if (QueueUtils.removePriorityQueueObject(queueName, data)) {
+ if (QueueUtils.removeQueueObject(queueName, data)) {
log.info("通道: {} , 删除数据: {}", queueName, data);
} else {
return R.fail("操作失败");
@@ -74,12 +71,16 @@ public class PriorityQueueController {
return R.ok("操作成功");
}
- @ApiOperation("获取队列数据")
+ /**
+ * 获取队列数据
+ *
+ * @param queueName 队列名
+ */
@GetMapping("/get")
- public R get(@ApiParam("队列名") String queueName) {
+ public R get(String queueName) {
PriorityDemo data;
do {
- data = QueueUtils.getPriorityQueueObject(queueName);
+ data = QueueUtils.getQueueObject(queueName);
log.info("通道: {} , 获取数据: {}", queueName, data);
} while (data != null);
return R.ok("操作成功");
diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/bo/TestDemoBo.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/bo/TestDemoBo.java
index 61c10ab16..54ecae117 100644
--- a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/bo/TestDemoBo.java
+++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/bo/TestDemoBo.java
@@ -3,8 +3,6 @@ package com.ruoyi.demo.domain.bo;
import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.common.core.validate.AddGroup;
import com.ruoyi.common.core.validate.EditGroup;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -20,48 +18,41 @@ import javax.validation.constraints.NotNull;
@Data
@EqualsAndHashCode(callSuper = true)
-@ApiModel("测试单表业务对象")
public class TestDemoBo extends BaseEntity {
/**
* 主键
*/
- @ApiModelProperty("主键")
@NotNull(message = "主键不能为空", groups = {EditGroup.class})
private Long id;
/**
* 部门id
*/
- @ApiModelProperty("部门id")
@NotNull(message = "部门id不能为空", groups = {AddGroup.class, EditGroup.class})
private Long deptId;
/**
* 用户id
*/
- @ApiModelProperty("用户id")
@NotNull(message = "用户id不能为空", groups = {AddGroup.class, EditGroup.class})
private Long userId;
/**
* 排序号
*/
- @ApiModelProperty("排序号")
@NotNull(message = "排序号不能为空", groups = {AddGroup.class, EditGroup.class})
private Integer orderNum;
/**
* key键
*/
- @ApiModelProperty("key键")
@NotBlank(message = "key键不能为空", groups = {AddGroup.class, EditGroup.class})
private String testKey;
/**
* 值
*/
- @ApiModelProperty("值")
@NotBlank(message = "值不能为空", groups = {AddGroup.class, EditGroup.class})
private String value;
diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/bo/TestDemoImportVo.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/bo/TestDemoImportVo.java
index 7185514fd..8f417fb2e 100644
--- a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/bo/TestDemoImportVo.java
+++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/bo/TestDemoImportVo.java
@@ -1,8 +1,6 @@
package com.ruoyi.demo.domain.bo;
import com.alibaba.excel.annotation.ExcelProperty;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@@ -15,13 +13,11 @@ import javax.validation.constraints.NotNull;
* @date 2021-07-26
*/
@Data
-@ApiModel("测试单表业务对象")
public class TestDemoImportVo {
/**
* 部门id
*/
- @ApiModelProperty("部门id")
@NotNull(message = "部门id不能为空")
@ExcelProperty(value = "部门id")
private Long deptId;
@@ -29,7 +25,6 @@ public class TestDemoImportVo {
/**
* 用户id
*/
- @ApiModelProperty("用户id")
@NotNull(message = "用户id不能为空")
@ExcelProperty(value = "用户id")
private Long userId;
@@ -37,7 +32,6 @@ public class TestDemoImportVo {
/**
* 排序号
*/
- @ApiModelProperty("排序号")
@NotNull(message = "排序号不能为空")
@ExcelProperty(value = "排序号")
private Long orderNum;
@@ -45,7 +39,6 @@ public class TestDemoImportVo {
/**
* key键
*/
- @ApiModelProperty("key键")
@NotBlank(message = "key键不能为空")
@ExcelProperty(value = "key键")
private String testKey;
@@ -53,7 +46,6 @@ public class TestDemoImportVo {
/**
* 值
*/
- @ApiModelProperty("值")
@NotBlank(message = "值不能为空")
@ExcelProperty(value = "值")
private String value;
diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/bo/TestTreeBo.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/bo/TestTreeBo.java
index 211a79f14..a51b3fe37 100644
--- a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/bo/TestTreeBo.java
+++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/bo/TestTreeBo.java
@@ -3,8 +3,6 @@ package com.ruoyi.demo.domain.bo;
import com.ruoyi.common.core.domain.TreeEntity;
import com.ruoyi.common.core.validate.AddGroup;
import com.ruoyi.common.core.validate.EditGroup;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -20,34 +18,29 @@ import javax.validation.constraints.NotNull;
@Data
@EqualsAndHashCode(callSuper = true)
-@ApiModel("测试树表业务对象")
public class TestTreeBo extends TreeEntity {
/**
* 主键
*/
- @ApiModelProperty("主键")
@NotNull(message = "主键不能为空", groups = {EditGroup.class})
private Long id;
/**
* 部门id
*/
- @ApiModelProperty("部门id")
@NotNull(message = "部门id不能为空", groups = {AddGroup.class, EditGroup.class})
private Long deptId;
/**
* 用户id
*/
- @ApiModelProperty("用户id")
@NotNull(message = "用户id不能为空", groups = {AddGroup.class, EditGroup.class})
private Long userId;
/**
* 树节点名
*/
- @ApiModelProperty("树节点名")
@NotBlank(message = "树节点名不能为空", groups = {AddGroup.class, EditGroup.class})
private String treeName;
diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/vo/TestDemoVo.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/vo/TestDemoVo.java
index 1e896500d..c4a46edf3 100644
--- a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/vo/TestDemoVo.java
+++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/vo/TestDemoVo.java
@@ -2,8 +2,6 @@ package com.ruoyi.demo.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
@@ -16,7 +14,6 @@ import java.util.Date;
* @date 2021-07-26
*/
@Data
-@ApiModel("测试单表视图对象")
@ExcelIgnoreUnannotated
public class TestDemoVo {
@@ -26,70 +23,60 @@ public class TestDemoVo {
* 主键
*/
@ExcelProperty(value = "主键")
- @ApiModelProperty("主键")
private Long id;
/**
* 部门id
*/
@ExcelProperty(value = "部门id")
- @ApiModelProperty("部门id")
private Long deptId;
/**
* 用户id
*/
@ExcelProperty(value = "用户id")
- @ApiModelProperty("用户id")
private Long userId;
/**
* 排序号
*/
@ExcelProperty(value = "排序号")
- @ApiModelProperty("排序号")
private Integer orderNum;
/**
* key键
*/
@ExcelProperty(value = "key键")
- @ApiModelProperty("key键")
private String testKey;
/**
* 值
*/
@ExcelProperty(value = "值")
- @ApiModelProperty("值")
private String value;
/**
* 创建时间
*/
@ExcelProperty(value = "创建时间")
- @ApiModelProperty("创建时间")
private Date createTime;
/**
* 创建人
*/
@ExcelProperty(value = "创建人")
- @ApiModelProperty("创建人")
private String createBy;
/**
* 更新时间
*/
@ExcelProperty(value = "更新时间")
- @ApiModelProperty("更新时间")
private Date updateTime;
/**
* 更新人
*/
@ExcelProperty(value = "更新人")
- @ApiModelProperty("更新人")
private String updateBy;
diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/vo/TestTreeVo.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/vo/TestTreeVo.java
index 309a0ae4e..6836c06bb 100644
--- a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/vo/TestTreeVo.java
+++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/vo/TestTreeVo.java
@@ -2,8 +2,6 @@ package com.ruoyi.demo.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
@@ -16,7 +14,6 @@ import java.util.Date;
* @date 2021-07-26
*/
@Data
-@ApiModel("测试树表视图对象")
@ExcelIgnoreUnannotated
public class TestTreeVo {
@@ -25,42 +22,36 @@ public class TestTreeVo {
/**
* 主键
*/
- @ApiModelProperty("主键")
private Long id;
/**
* 父id
*/
@ExcelProperty(value = "父id")
- @ApiModelProperty("父id")
private Long parentId;
/**
* 部门id
*/
@ExcelProperty(value = "部门id")
- @ApiModelProperty("部门id")
private Long deptId;
/**
* 用户id
*/
@ExcelProperty(value = "用户id")
- @ApiModelProperty("用户id")
private Long userId;
/**
* 树节点名
*/
@ExcelProperty(value = "树节点名")
- @ApiModelProperty("树节点名")
private String treeName;
/**
* 创建时间
*/
@ExcelProperty(value = "创建时间")
- @ApiModelProperty("创建时间")
private Date createTime;
diff --git a/ruoyi-extend/pom.xml b/ruoyi-extend/pom.xml
index 2be8693e4..8b0e2fb67 100644
--- a/ruoyi-extend/pom.xml
+++ b/ruoyi-extend/pom.xml
@@ -5,7 +5,7 @@
ruoyi-vue-plus
com.ruoyi
- 4.2.0
+ 4.4.0
4.0.0
ruoyi-extend
diff --git a/ruoyi-extend/ruoyi-monitor-admin/Dockerfile b/ruoyi-extend/ruoyi-monitor-admin/Dockerfile
index b506a2ddd..02b741f48 100644
--- a/ruoyi-extend/ruoyi-monitor-admin/Dockerfile
+++ b/ruoyi-extend/ruoyi-monitor-admin/Dockerfile
@@ -2,7 +2,6 @@ FROM anapsix/alpine-java:8_server-jre_unlimited
MAINTAINER Lion Li
-RUN mkdir -p /ruoyi/monitor
RUN mkdir -p /ruoyi/monitor/logs
WORKDIR /ruoyi/monitor
diff --git a/ruoyi-extend/ruoyi-monitor-admin/pom.xml b/ruoyi-extend/ruoyi-monitor-admin/pom.xml
index e42e8e0f4..687d95853 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
- 4.2.0
+ 4.4.0
4.0.0
jar
@@ -59,25 +59,6 @@
-
- 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}
-
-
-