edit(@Validated @RequestBody SysRole role) {
// 更新缓存用户权限
LoginUser loginUser = getLoginUser();
SysUser sysUser = userService.selectUserById(loginUser.getUserId());
- if (ObjectUtil.isNotNull(sysUser) && !sysUser.isAdmin()) {
+ if (ObjectUtil.isNotNull(sysUser) && !LoginHelper.isAdmin()) {
loginUser.setMenuPermission(permissionService.getMenuPermission(sysUser));
LoginHelper.setLoginUser(loginUser);
}
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 05e370b5d..cee0e93ae 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,7 +2,6 @@
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;
@@ -15,11 +14,11 @@
/**
* 登录鉴权助手
- *
+ *
* user_type 为 用户类型 同一个用户表 可以有多种用户类型 例如 pc,app
* deivce 为 设备类型 同一个用户类型 可以有 多种设备类型 例如 web,ios
* 可以组成 用户类型与设备类型多对多的 权限灵活控制
- *
+ *
* 多用户体系 针对 多种用户类型 但权限控制不一致
* 可以组成 多用户类型表与多设备类型 分别控制权限
*
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/SysPermissionService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/SysPermissionService.java
index 97ff4801a..79d6e2522 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/SysPermissionService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/SysPermissionService.java
@@ -1,5 +1,6 @@
package com.ruoyi.system.service;
+import cn.hutool.core.collection.CollUtil;
import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.common.core.domain.entity.SysUser;
import lombok.RequiredArgsConstructor;
@@ -28,7 +29,7 @@ public class SysPermissionService {
* @return 角色权限信息
*/
public Set getRolePermission(SysUser user) {
- Set roles = new HashSet();
+ Set roles = new HashSet<>();
// 管理员拥有所有权限
if (user.isAdmin()) {
roles.add("admin");
@@ -45,13 +46,13 @@ public Set getRolePermission(SysUser user) {
* @return 菜单权限信息
*/
public Set getMenuPermission(SysUser user) {
- Set perms = new HashSet();
+ Set perms = new HashSet<>();
// 管理员拥有所有权限
if (user.isAdmin()) {
perms.add("*:*:*");
} else {
List roles = user.getRoles();
- if (!roles.isEmpty() && roles.size() > 1) {
+ if (CollUtil.isNotEmpty(roles)) {
// 多角色设置permissions属性,以便数据权限匹配权限
for (SysRole role : roles) {
Set rolePerms = menuService.selectMenuPermsByRoleId(role.getRoleId());
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java
index c39ec74df..c77612e72 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java
@@ -205,9 +205,9 @@ public void resetConfigCache() {
*/
@Override
public String checkConfigKeyUnique(SysConfig config) {
- Long configId = ObjectUtil.isNull(config.getConfigId()) ? -1L : config.getConfigId();
+ long configId = ObjectUtil.isNull(config.getConfigId()) ? -1L : config.getConfigId();
SysConfig info = baseMapper.selectOne(new LambdaQueryWrapper().eq(SysConfig::getConfigKey, config.getConfigKey()));
- if (ObjectUtil.isNotNull(info) && info.getConfigId().longValue() != configId.longValue()) {
+ if (ObjectUtil.isNotNull(info) && info.getConfigId() != configId) {
return UserConstants.NOT_UNIQUE;
}
return UserConstants.UNIQUE;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java
index 00b402467..afb7a3155 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java
@@ -259,7 +259,7 @@ public void updateDeptChildren(Long deptId, String newAncestors, String oldAnces
dept.setAncestors(child.getAncestors().replaceFirst(oldAncestors, newAncestors));
list.add(dept);
}
- if (list.size() > 0) {
+ if (CollUtil.isNotEmpty(list)) {
baseMapper.updateBatchById(list);
}
}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java
index 4d3406757..4056d5670 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java
@@ -153,7 +153,7 @@ public List selectMenuListByRoleId(Long roleId) {
*/
@Override
public List buildMenus(List menus) {
- List routers = new LinkedList();
+ List routers = new LinkedList<>();
for (SysMenu menu : menus) {
RouterVo router = new RouterVo();
router.setHidden("1".equals(menu.getVisible()));
@@ -169,7 +169,7 @@ public List buildMenus(List menus) {
router.setChildren(buildMenus(cMenus));
} else if (isMenuFrame(menu)) {
router.setMeta(null);
- List childrenList = new ArrayList();
+ List childrenList = new ArrayList<>();
RouterVo children = new RouterVo();
children.setPath(menu.getPath());
children.setComponent(menu.getComponent());
@@ -181,7 +181,7 @@ public List buildMenus(List menus) {
} else if (menu.getParentId().intValue() == 0 && isInnerLink(menu)) {
router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon()));
router.setPath("/");
- List childrenList = new ArrayList();
+ List childrenList = new ArrayList<>();
RouterVo children = new RouterVo();
String routerPath = innerLinkReplaceEach(menu.getPath());
children.setPath(routerPath);
@@ -394,7 +394,7 @@ public boolean isParentView(SysMenu menu) {
* @return String
*/
public List getChildPerms(List list, int parentId) {
- List returnList = new ArrayList();
+ List returnList = new ArrayList<>();
for (SysMenu t : list) {
// 一、根据传入的某个父节点ID,遍历该父节点的所有子节点
if (t.getParentId() == parentId) {
@@ -433,7 +433,7 @@ private List getChildList(List list, SysMenu t) {
* 判断是否有子节点
*/
private boolean hasChild(List list, SysMenu t) {
- return getChildList(list, t).size() > 0;
+ return CollUtil.isNotEmpty(getChildList(list, t));
}
/**
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java
index e7e5b53c5..9e85bee57 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java
@@ -14,6 +14,7 @@
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.helper.LoginHelper;
+import com.ruoyi.common.utils.StreamUtils;
import com.ruoyi.system.domain.SysRoleDept;
import com.ruoyi.system.domain.SysRoleMenu;
import com.ruoyi.system.domain.SysUserRole;
@@ -397,14 +398,13 @@ public int deleteAuthUsers(Long roleId, Long[] userIds) {
public int insertAuthUsers(Long roleId, Long[] userIds) {
// 新增用户与角色管理
int rows = 1;
- List list = new ArrayList();
- for (Long userId : userIds) {
+ List list = StreamUtils.toList(Arrays.asList(userIds), userId -> {
SysUserRole ur = new SysUserRole();
ur.setUserId(userId);
ur.setRoleId(roleId);
- list.add(ur);
- }
- if (list.size() > 0) {
+ return ur;
+ });
+ if (CollUtil.isNotEmpty(list)) {
rows = userRoleMapper.insertBatch(list) ? list.size() : 0;
}
return rows;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
index 4e63f17ea..862d029d3 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
@@ -30,7 +30,6 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
@@ -211,7 +210,6 @@ public String checkUserNameUnique(SysUser user) {
* 校验手机号码是否唯一
*
* @param user 用户信息
- * @return
*/
@Override
public String checkPhoneUnique(SysUser user) {
@@ -228,7 +226,6 @@ public String checkPhoneUnique(SysUser user) {
* 校验email是否唯一
*
* @param user 用户信息
- * @return
*/
@Override
public String checkEmailUnique(SysUser user) {
@@ -417,13 +414,12 @@ public void insertUserPost(SysUser user) {
Long[] posts = user.getPostIds();
if (ArrayUtil.isNotEmpty(posts)) {
// 新增用户与岗位管理
- List list = new ArrayList<>(posts.length);
- for (Long postId : posts) {
+ List list = StreamUtils.toList(Arrays.asList(posts), postId -> {
SysUserPost up = new SysUserPost();
up.setUserId(user.getUserId());
up.setPostId(postId);
- list.add(up);
- }
+ return up;
+ });
userPostMapper.insertBatch(list);
}
}
@@ -437,13 +433,12 @@ public void insertUserPost(SysUser user) {
public void insertUserRole(Long userId, Long[] roleIds) {
if (ArrayUtil.isNotEmpty(roleIds)) {
// 新增用户与角色管理
- List list = new ArrayList<>(roleIds.length);
- for (Long roleId : roleIds) {
+ List list = StreamUtils.toList(Arrays.asList(roleIds), roleId -> {
SysUserRole ur = new SysUserRole();
ur.setUserId(userId);
ur.setRoleId(roleId);
- list.add(ur);
- }
+ return ur;
+ });
userRoleMapper.insertBatch(list);
}
}
diff --git a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
index dacdcd8a6..06a653efe 100644
--- a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
@@ -86,17 +86,17 @@
From f8ac8c085e22bc1dfe1dfaf0436e7ff4d048c504 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90li?=
<15040126243@163.com>
Date: Wed, 1 Feb 2023 17:34:58 +0800
Subject: [PATCH 13/56] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=20=E4=BC=98?=
=?UTF-8?q?=E5=8C=96=E8=BF=9E=E6=8E=A5=E6=B1=A0=E9=BB=98=E8=AE=A4=E5=8F=82?=
=?UTF-8?q?=E6=95=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
ruoyi-admin/src/main/resources/application-dev.yml | 4 ++--
ruoyi-admin/src/main/resources/application-prod.yml | 4 ++--
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml
index 7b7380b8a..1db59bbc7 100644
--- a/ruoyi-admin/src/main/resources/application-dev.yml
+++ b/ruoyi-admin/src/main/resources/application-dev.yml
@@ -86,11 +86,11 @@ spring:
# 最小空闲线程数量
minIdle: 10
# 配置获取连接等待超时的时间
- connectionTimeout: 10000
+ connectionTimeout: 30000
# 校验超时时间
validationTimeout: 5000
# 空闲连接存活最大时间,默认10分钟
- idleTimeout: 60000
+ idleTimeout: 600000
# 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认30分钟
maxLifetime: 900000
# 连接测试query(配置检测连接是否有效)
diff --git a/ruoyi-admin/src/main/resources/application-prod.yml b/ruoyi-admin/src/main/resources/application-prod.yml
index 970fe4c5a..0852d4199 100644
--- a/ruoyi-admin/src/main/resources/application-prod.yml
+++ b/ruoyi-admin/src/main/resources/application-prod.yml
@@ -89,11 +89,11 @@ spring:
# 最小空闲线程数量
minIdle: 10
# 配置获取连接等待超时的时间
- connectionTimeout: 10000
+ connectionTimeout: 30000
# 校验超时时间
validationTimeout: 5000
# 空闲连接存活最大时间,默认10分钟
- idleTimeout: 60000
+ idleTimeout: 600000
# 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认30分钟
maxLifetime: 900000
# 连接测试query(配置检测连接是否有效)
From 6c6d92a776cd011ff63b1507946eadf939514ca2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?=
<15040126243@163.com>
Date: Fri, 3 Feb 2023 00:40:49 +0800
Subject: [PATCH 14/56] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E6=8E=A5?=
=?UTF-8?q?=E5=8F=A3=E9=97=AE=E9=A2=98=E5=BC=80=E5=85=B3=E4=B8=8D=E7=94=9F?=
=?UTF-8?q?=E6=95=88=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
ruoyi-admin/src/main/resources/application.yml | 5 +++--
.../main/java/com/ruoyi/framework/config/SwaggerConfig.java | 2 +-
.../ruoyi/framework/config/properties/SwaggerProperties.java | 5 -----
3 files changed, 4 insertions(+), 8 deletions(-)
diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml
index 4f3da2c5f..1534251f8 100644
--- a/ruoyi-admin/src/main/resources/application.yml
+++ b/ruoyi-admin/src/main/resources/application.yml
@@ -196,8 +196,6 @@ mybatis-encryptor:
# Swagger配置
swagger:
- # 是否开启swagger
- enabled: true
info:
# 标题
title: '标题:${ruoyi.name}后台管理系统_接口文档'
@@ -219,6 +217,9 @@ swagger:
name: ${sa-token.token-name}
springdoc:
+ api-docs:
+ # 是否开启接口文档
+ enabled: true
swagger-ui:
# 持久化认证数据
persistAuthorization: true
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SwaggerConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SwaggerConfig.java
index ab92cf591..88af7e725 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SwaggerConfig.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SwaggerConfig.java
@@ -33,7 +33,7 @@
@RequiredArgsConstructor
@Configuration
@AutoConfigureBefore(SpringDocConfiguration.class)
-@ConditionalOnProperty(name = "swagger.enabled", havingValue = "true", matchIfMissing = true)
+@ConditionalOnProperty(name = "springdoc.api-docs.enabled", havingValue = "true", matchIfMissing = true)
public class SwaggerConfig {
private final SwaggerProperties swaggerProperties;
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/SwaggerProperties.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/SwaggerProperties.java
index 736d70a45..ac6fc4249 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/SwaggerProperties.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/SwaggerProperties.java
@@ -23,11 +23,6 @@
@ConfigurationProperties(prefix = "swagger")
public class SwaggerProperties {
- /**
- * 是否开启 openApi 文档
- */
- private Boolean enabled = true;
-
/**
* 文档基本信息
*/
From 61db8435762629be7ac126d35ab7e28ed449e2fc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90li?=
<15040126243@163.com>
Date: Sun, 5 Feb 2023 12:43:14 +0800
Subject: [PATCH 15/56] =?UTF-8?q?update=20DictDataMapper=20=E6=B3=A8?=
=?UTF-8?q?=E8=A7=A3=E6=A0=87=E6=B3=A8=E8=BF=87=E6=9C=9F=20=E6=8E=A8?=
=?UTF-8?q?=E8=8D=90=E4=BD=BF=E7=94=A8=20Translation=20=E6=B3=A8=E8=A7=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../main/java/com/ruoyi/common/annotation/DictDataMapper.java | 2 ++
.../java/com/ruoyi/common/jackson/DictDataJsonSerializer.java | 2 ++
2 files changed, 4 insertions(+)
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 @@
* 字典数据映射注解
*
* @author itino
+ * @deprecated 建议使用通用翻译注解
*/
+@Deprecated
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.METHOD})
@JacksonAnnotationsInside
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
index caa059b92..5fbf0519c 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/jackson/DictDataJsonSerializer.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/jackson/DictDataJsonSerializer.java
@@ -22,7 +22,9 @@
* 字典数据json序列化工具
*
* @author itino
+ * @deprecated 建议使用通用翻译注解
*/
+@Deprecated
@Slf4j
public class DictDataJsonSerializer extends JsonSerializer implements ContextualSerializer {
From bc06550918780953baa650accb8380a4bfb7dd7b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90li?=
<15040126243@163.com>
Date: Sun, 5 Feb 2023 12:45:55 +0800
Subject: [PATCH 16/56] =?UTF-8?q?add=20=E6=96=B0=E5=A2=9E=20=E9=80=9A?=
=?UTF-8?q?=E7=94=A8=E7=BF=BB=E8=AF=91=E6=B3=A8=E8=A7=A3=E5=8F=8A=E5=AE=9E?=
=?UTF-8?q?=E7=8E=B0(=E9=83=A8=E9=97=A8=E5=90=8D=E3=80=81=E5=AD=97?=
=?UTF-8?q?=E5=85=B8=E3=80=81oss=E3=80=81=E7=94=A8=E6=88=B7=E5=90=8D)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../ruoyi/common/annotation/Translation.java | 39 +++++++++++
.../common/annotation/TranslationType.java | 21 ++++++
.../com/ruoyi/common/constant/CacheNames.java | 10 +++
.../ruoyi/common/constant/TransConstant.java | 30 +++++++++
.../common/core/service/DeptService.java | 18 +++++
.../ruoyi/common/core/service/OssService.java | 18 +++++
.../common/core/service/UserService.java | 18 +++++
.../translation/TranslationInterface.java | 17 +++++
.../TranslationBeanSerializerModifier.java | 29 +++++++++
.../handler/TranslationHandler.java | 65 +++++++++++++++++++
.../impl/DeptNameTranslationImpl.java | 25 +++++++
.../impl/DictTypeTranslationImpl.java | 29 +++++++++
.../impl/OssUrlTranslationImpl.java | 25 +++++++
.../impl/UserNameTranslationImpl.java | 28 ++++++++
.../framework/config/TranslationConfig.java | 50 ++++++++++++++
.../service/impl/SysDeptServiceImpl.java | 33 +++++++++-
.../service/impl/SysOssServiceImpl.java | 20 ++++--
.../service/impl/SysUserServiceImpl.java | 13 +++-
18 files changed, 480 insertions(+), 8 deletions(-)
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/annotation/Translation.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/annotation/TranslationType.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/constant/TransConstant.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/service/DeptService.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/service/OssService.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/core/service/UserService.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/translation/TranslationInterface.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/translation/handler/TranslationBeanSerializerModifier.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/translation/handler/TranslationHandler.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/translation/impl/DeptNameTranslationImpl.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/translation/impl/DictTypeTranslationImpl.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/translation/impl/OssUrlTranslationImpl.java
create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/translation/impl/UserNameTranslationImpl.java
create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/config/TranslationConfig.java
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/core/service/DeptService.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/service/DeptService.java
new file mode 100644
index 000000000..c27f46182
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/service/DeptService.java
@@ -0,0 +1,18 @@
+package com.ruoyi.common.core.service;
+
+/**
+ * 通用 部门服务
+ *
+ * @author Lion Li
+ */
+public interface DeptService {
+
+ /**
+ * 通过部门ID查询部门名称
+ *
+ * @param deptIds 部门ID串逗号分隔
+ * @return 部门名称串逗号分隔
+ */
+ String selectDeptNameByIds(String deptIds);
+
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/service/OssService.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/service/OssService.java
new file mode 100644
index 000000000..65dda7c64
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/service/OssService.java
@@ -0,0 +1,18 @@
+package com.ruoyi.common.core.service;
+
+/**
+ * 通用 OSS服务
+ *
+ * @author Lion Li
+ */
+public interface OssService {
+
+ /**
+ * 通过ossId查询对应的url
+ *
+ * @param ossIds ossId串逗号分隔
+ * @return url串逗号分隔
+ */
+ String selectUrlByIds(String ossIds);
+
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/service/UserService.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/service/UserService.java
new file mode 100644
index 000000000..d2206c8b0
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/service/UserService.java
@@ -0,0 +1,18 @@
+package com.ruoyi.common.core.service;
+
+/**
+ * 通用 用户服务
+ *
+ * @author Lion Li
+ */
+public interface UserService {
+
+ /**
+ * 通过用户ID查询用户账户
+ *
+ * @param userId 用户ID
+ * @return 用户账户
+ */
+ String selectUserNameById(Long userId);
+
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/translation/TranslationInterface.java b/ruoyi-common/src/main/java/com/ruoyi/common/translation/TranslationInterface.java
new file mode 100644
index 000000000..4d59d7ec8
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/translation/TranslationInterface.java
@@ -0,0 +1,17 @@
+package com.ruoyi.common.translation;
+
+/**
+ * 翻译接口 (实现类需标注 {@link com.ruoyi.common.annotation.TranslationType} 注解标明翻译类型)
+ *
+ * @author Lion Li
+ */
+public interface TranslationInterface {
+
+ /**
+ * 翻译
+ *
+ * @param key 需要被翻译的键(不为空)
+ * @return 返回键对应的值
+ */
+ String translation(Object key, String other);
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/translation/handler/TranslationBeanSerializerModifier.java b/ruoyi-common/src/main/java/com/ruoyi/common/translation/handler/TranslationBeanSerializerModifier.java
new file mode 100644
index 000000000..0bcaf285e
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/translation/handler/TranslationBeanSerializerModifier.java
@@ -0,0 +1,29 @@
+package com.ruoyi.common.translation.handler;
+
+import com.fasterxml.jackson.databind.BeanDescription;
+import com.fasterxml.jackson.databind.SerializationConfig;
+import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
+import com.fasterxml.jackson.databind.ser.BeanSerializerModifier;
+
+import java.util.List;
+
+/**
+ * Bean 序列化修改器 解决 Null 被单独处理问题
+ *
+ * @author Lion Li
+ */
+public class TranslationBeanSerializerModifier extends BeanSerializerModifier {
+
+ @Override
+ public List changeProperties(SerializationConfig config, BeanDescription beanDesc,
+ List beanProperties) {
+ for (BeanPropertyWriter writer : beanProperties) {
+ // 如果序列化器为 TranslationHandler 的话 将 Null 值也交给他处理
+ if (writer.getSerializer() instanceof TranslationHandler) {
+ writer.assignNullSerializer(writer.getSerializer());
+ }
+ }
+ return beanProperties;
+ }
+
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/translation/handler/TranslationHandler.java b/ruoyi-common/src/main/java/com/ruoyi/common/translation/handler/TranslationHandler.java
new file mode 100644
index 000000000..f6daa50c5
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/translation/handler/TranslationHandler.java
@@ -0,0 +1,65 @@
+package com.ruoyi.common.translation.handler;
+
+import cn.hutool.core.util.ObjectUtil;
+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.Translation;
+import com.ruoyi.common.translation.TranslationInterface;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.reflect.ReflectUtils;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.IOException;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * 翻译处理器
+ *
+ * @author Lion Li
+ */
+@Slf4j
+public class TranslationHandler extends JsonSerializer