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] =?UTF-8?q?add=20=E6=96=B0=E5=A2=9E=20=E9=80=9A=E7=94=A8?=
=?UTF-8?q?=E7=BF=BB=E8=AF=91=E6=B3=A8=E8=A7=A3=E5=8F=8A=E5=AE=9E=E7=8E=B0?=
=?UTF-8?q?(=E9=83=A8=E9=97=A8=E5=90=8D=E3=80=81=E5=AD=97=E5=85=B8?=
=?UTF-8?q?=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