edit(@Validated @RequestBody SysUser user) {
userService.checkUserAllowed(user);
userService.checkUserDataScope(user.getUserId());
- if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(user))) {
+ if (!userService.checkUserNameUnique(user)) {
return R.fail("修改用户'" + user.getUserName() + "'失败,登录账号已存在");
- } else if (StringUtils.isNotEmpty(user.getPhonenumber())
- && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) {
+ } else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) {
return R.fail("修改用户'" + user.getUserName() + "'失败,手机号码已存在");
- } else if (StringUtils.isNotEmpty(user.getEmail())
- && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) {
+ } else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) {
return R.fail("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在");
}
return toAjax(userService.updateUser(user));
diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml
index 7b7380b8a..32123a764 100644
--- a/ruoyi-admin/src/main/resources/application-dev.yml
+++ b/ruoyi-admin/src/main/resources/application-dev.yml
@@ -86,15 +86,17 @@ spring:
# 最小空闲线程数量
minIdle: 10
# 配置获取连接等待超时的时间
- connectionTimeout: 10000
+ connectionTimeout: 30000
# 校验超时时间
validationTimeout: 5000
# 空闲连接存活最大时间,默认10分钟
- idleTimeout: 60000
+ idleTimeout: 600000
# 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认30分钟
- maxLifetime: 900000
+ maxLifetime: 1800000
# 连接测试query(配置检测连接是否有效)
connectionTestQuery: SELECT 1
+ # 多久检查一次连接的活性
+ keepaliveTime: 30000
--- # redis 单机配置(单机与集群只能开启一个另一个需要注释掉)
spring:
diff --git a/ruoyi-admin/src/main/resources/application-prod.yml b/ruoyi-admin/src/main/resources/application-prod.yml
index 970fe4c5a..85f6e935d 100644
--- a/ruoyi-admin/src/main/resources/application-prod.yml
+++ b/ruoyi-admin/src/main/resources/application-prod.yml
@@ -89,15 +89,17 @@ spring:
# 最小空闲线程数量
minIdle: 10
# 配置获取连接等待超时的时间
- connectionTimeout: 10000
+ connectionTimeout: 30000
# 校验超时时间
validationTimeout: 5000
# 空闲连接存活最大时间,默认10分钟
- idleTimeout: 60000
+ idleTimeout: 600000
# 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认30分钟
- maxLifetime: 900000
+ maxLifetime: 1800000
# 连接测试query(配置检测连接是否有效)
connectionTestQuery: SELECT 1
+ # 多久检查一次连接的活性
+ keepaliveTime: 30000
--- # redis 单机配置(单机与集群只能开启一个另一个需要注释掉)
spring:
diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml
index 4f3da2c5f..d87088d1b 100644
--- a/ruoyi-admin/src/main/resources/application.yml
+++ b/ruoyi-admin/src/main/resources/application.yml
@@ -128,8 +128,10 @@ security:
- /**/*.html
- /**/*.css
- /**/*.js
- # swagger 文档配置
+ # 公共路径
- /favicon.ico
+ - /error
+ # swagger 文档配置
- /*/api-docs
- /*/api-docs/**
# actuator 监控配置
@@ -196,8 +198,6 @@ mybatis-encryptor:
# Swagger配置
swagger:
- # 是否开启swagger
- enabled: true
info:
# 标题
title: '标题:${ruoyi.name}后台管理系统_接口文档'
@@ -219,6 +219,9 @@ swagger:
name: ${sa-token.token-name}
springdoc:
+ api-docs:
+ # 是否开启接口文档
+ enabled: true
swagger-ui:
# 持久化认证数据
persistAuthorization: true
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
index 5c14a5520..564b2a4a1 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DictDataMapper.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DictDataMapper.java
@@ -13,7 +13,9 @@ import java.lang.annotation.Target;
* 字典数据映射注解
*
* @author itino
+ * @deprecated 建议使用通用翻译注解
*/
+@Deprecated
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.METHOD})
@JacksonAnnotationsInside
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/ExcelDictFormat.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/ExcelDictFormat.java
index 400080ea7..4bb0cc868 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/ExcelDictFormat.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/ExcelDictFormat.java
@@ -1,5 +1,7 @@
package com.ruoyi.common.annotation;
+import com.ruoyi.common.utils.StringUtils;
+
import java.lang.annotation.*;
/**
@@ -25,6 +27,6 @@ public @interface ExcelDictFormat {
/**
* 分隔符,读取字符串组内容
*/
- String separator() default ",";
+ String separator() default StringUtils.SEPARATOR;
}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/ExcelEnumFormat.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/ExcelEnumFormat.java
new file mode 100644
index 000000000..a8f550a4a
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/ExcelEnumFormat.java
@@ -0,0 +1,30 @@
+package com.ruoyi.common.annotation;
+
+import java.lang.annotation.*;
+
+/**
+ * 枚举格式化
+ *
+ * @author Liang
+ */
+@Target({ElementType.FIELD})
+@Retention(RetentionPolicy.RUNTIME)
+@Inherited
+public @interface ExcelEnumFormat {
+
+ /**
+ * 字典枚举类型
+ */
+ Class extends Enum>> enumClass();
+
+ /**
+ * 字典枚举类中对应的code属性名称,默认为code
+ */
+ String codeField() default "code";
+
+ /**
+ * 字典枚举类中对应的text属性名称,默认为text
+ */
+ String textField() default "text";
+
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Log.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Log.java
index 32c39a3b0..f9ba00126 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Log.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Log.java
@@ -38,4 +38,10 @@ public @interface Log {
* 是否保存响应的参数
*/
boolean isSaveResponseData() default true;
+
+ /**
+ * 排除指定的请求参数
+ */
+ String[] excludeParamNames() 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 2e3ff7a82..6eeb2f2c4 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,6 +1,5 @@
package com.ruoyi.common.annotation;
-import com.ruoyi.common.constant.CacheConstants;
import com.ruoyi.common.enums.LimitType;
import java.lang.annotation.*;
@@ -15,9 +14,10 @@ import java.lang.annotation.*;
@Documented
public @interface RateLimiter {
/**
- * 限流key
+ * 限流key,支持使用Spring el表达式来动态获取方法上的参数值
+ * 格式类似于 #code.id #{#code}
*/
- String key() default CacheConstants.RATE_LIMIT_KEY;
+ String key() default "";
/**
* 限流时间,单位秒
@@ -33,4 +33,9 @@ public @interface RateLimiter {
* 限流类型
*/
LimitType limitType() default LimitType.DEFAULT;
+
+ /**
+ * 提示消息 支持国际化 格式为 {code}
+ */
+ String message() default "{rate.limiter.message}";
}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Translation.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Translation.java
new file mode 100644
index 000000000..ba8cd22ca
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Translation.java
@@ -0,0 +1,39 @@
+package com.ruoyi.common.annotation;
+
+import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.ruoyi.common.translation.handler.TranslationHandler;
+
+import java.lang.annotation.*;
+
+/**
+ * 通用翻译注解
+ *
+ * @author Lion Li
+ */
+@Inherited
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.FIELD, ElementType.METHOD})
+@Documented
+@JacksonAnnotationsInside
+@JsonSerialize(using = TranslationHandler.class)
+public @interface Translation {
+
+ /**
+ * 类型 (需与实现类上的 {@link com.ruoyi.common.annotation.TranslationType} 注解type对应)
+ *
+ * 默认取当前字段的值 如果设置了 @{@link Translation#mapper()} 则取映射字段的值
+ */
+ String type();
+
+ /**
+ * 映射字段 (如果不为空则取此字段的值)
+ */
+ String mapper() default "";
+
+ /**
+ * 其他条件 例如: 字典type(sys_user_sex)
+ */
+ String other() default "";
+
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/TranslationType.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/TranslationType.java
new file mode 100644
index 000000000..f592f6d80
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/TranslationType.java
@@ -0,0 +1,21 @@
+package com.ruoyi.common.annotation;
+
+import java.lang.annotation.*;
+
+/**
+ * 翻译类型注解 (标注到{@link com.ruoyi.common.translation.TranslationInterface} 的实现类)
+ *
+ * @author Lion Li
+ */
+@Inherited
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.TYPE})
+@Documented
+public @interface TranslationType {
+
+ /**
+ * 类型
+ */
+ String type();
+
+}
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
index 591ca2546..1396b6d18 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheNames.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheNames.java
@@ -30,6 +30,16 @@ public interface CacheNames {
*/
String SYS_DICT = "sys_dict";
+ /**
+ * 用户账户
+ */
+ String SYS_USER_NAME = "sys_user_name#30d";
+
+ /**
+ * 部门
+ */
+ String SYS_DEPT = "sys_dept#30d";
+
/**
* OSS内容
*/
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/TransConstant.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/TransConstant.java
new file mode 100644
index 000000000..5c5e5f8e0
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/TransConstant.java
@@ -0,0 +1,30 @@
+package com.ruoyi.common.constant;
+
+/**
+ * 翻译常量
+ *
+ * @author Lion Li
+ */
+public interface TransConstant {
+
+ /**
+ * 用户id转账号
+ */
+ String USER_ID_TO_NAME = "user_id_to_name";
+
+ /**
+ * 部门id转名称
+ */
+ String DEPT_ID_TO_NAME = "dept_id_to_name";
+
+ /**
+ * 字典type转label
+ */
+ String DICT_TYPE_TO_LABEL = "dict_type_to_label";
+
+ /**
+ * ossId转url
+ */
+ String OSS_ID_TO_URL = "oss_id_to_url";
+
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/convert/ExcelEnumConvert.java b/ruoyi-common/src/main/java/com/ruoyi/common/convert/ExcelEnumConvert.java
new file mode 100644
index 000000000..c69d90cfb
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/convert/ExcelEnumConvert.java
@@ -0,0 +1,75 @@
+package com.ruoyi.common.convert;
+
+import cn.hutool.core.annotation.AnnotationUtil;
+import cn.hutool.core.convert.Convert;
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.excel.converters.Converter;
+import com.alibaba.excel.enums.CellDataTypeEnum;
+import com.alibaba.excel.metadata.GlobalConfiguration;
+import com.alibaba.excel.metadata.data.ReadCellData;
+import com.alibaba.excel.metadata.data.WriteCellData;
+import com.alibaba.excel.metadata.property.ExcelContentProperty;
+import com.ruoyi.common.annotation.ExcelEnumFormat;
+import com.ruoyi.common.utils.reflect.ReflectUtils;
+import lombok.extern.slf4j.Slf4j;
+
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 枚举格式化转换处理
+ *
+ * @author Liang
+ */
+@Slf4j
+public class ExcelEnumConvert implements Converter