ruoyi-common/pom.xml
@@ -28,6 +28,7 @@ <module>ruoyi-common-security</module> <module>ruoyi-common-sms</module> <module>ruoyi-common-web</module> <module>ruoyi-common-translation</module> </modules> <artifactId>ruoyi-common</artifactId> ruoyi-common/ruoyi-common-bom/pom.xml
@@ -130,6 +130,14 @@ <artifactId>ruoyi-common-web</artifactId> <version>${revision}</version> </dependency> <!-- ç¿»è¯æ¨¡å --> <dependency> <groupId>com.ruoyi</groupId> <artifactId>ruoyi-common-translation</artifactId> <version>${revision}</version> </dependency> </dependencies> </dependencyManagement> ruoyi-common/ruoyi-common-translation/pom.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,28 @@ <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <groupId>com.ruoyi</groupId> <artifactId>ruoyi-common</artifactId> <version>${revision}</version> <relativePath>../pom.xml</relativePath> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>ruoyi-common-translation</artifactId> <description> ruoyi-common-translation éç¨ç¿»è¯åè½ </description> <dependencies> <dependency> <groupId>com.ruoyi</groupId> <artifactId>ruoyi-common-core</artifactId> </dependency> </dependencies> </project> ruoyi-common/ruoyi-common-translation/src/main/java/com/ruoyi/common/translation/annotation/Translation.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,32 @@ package com.ruoyi.common.translation.annotation; import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.ruoyi.common.translation.core.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.translation.annotation.TranslationType} 注解type对åº) */ String type(); /** * éç¨Key å¦æä¸ºç©ºååè¢«æ æ³¨çåæ®µå¼ ä¾å¦: åå ¸type(sys_user_sex) */ String key() default ""; } ruoyi-common/ruoyi-common-translation/src/main/java/com/ruoyi/common/translation/annotation/TranslationType.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,21 @@ package com.ruoyi.common.translation.annotation; import java.lang.annotation.*; /** * ç¿»è¯ç±»å注解 (æ æ³¨å°{@link com.ruoyi.common.translation.core.TranslationInterface} çå®ç°ç±») * * @author Lion Li */ @Inherited @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE}) @Documented public @interface TranslationType { /** * ç±»å */ String type(); } ruoyi-common/ruoyi-common-translation/src/main/java/com/ruoyi/common/translation/config/TranslationConfig.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,41 @@ package com.ruoyi.common.translation.config; import com.ruoyi.common.translation.annotation.TranslationType; import com.ruoyi.common.translation.core.TranslationInterface; import com.ruoyi.common.translation.core.handler.TranslationHandler; import jakarta.annotation.PostConstruct; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.AutoConfiguration; import java.util.HashMap; import java.util.List; import java.util.Map; /** * ç¿»è¯æ¨¡åé 置类 * * @author Lion Li */ @Slf4j @AutoConfiguration public class TranslationConfig { @Autowired private List<TranslationInterface> list; @PostConstruct public void init() { Map<String, TranslationInterface> map = new HashMap<>(list.size()); for (TranslationInterface trans : list) { if (trans.getClass().isAnnotationPresent(TranslationType.class)) { TranslationType annotation = trans.getClass().getAnnotation(TranslationType.class); map.put(annotation.type(), trans); } else { log.warn(trans.getClass().getName() + " ç¿»è¯å®ç°ç±»æªæ 注 TranslationType 注解!"); } } TranslationHandler.TRANSLATION_MAPPER.putAll(map); } } ruoyi-common/ruoyi-common-translation/src/main/java/com/ruoyi/common/translation/constant/TransConstant.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,22 @@ package com.ruoyi.common.translation.constant; /** * ç¿»è¯å¸¸é * * @author Lion Li */ public interface TransConstant { /** * ç¨æ·åç¿»è¯ */ String USER_ID_TO_NAME = "userIdToName"; /** * åå ¸å¼ç¿»è¯ */ String DICT_TYPE_TO_LABEL = "dictTypeToLabel"; String OSS_ID_TO_URL = "ossIdToUrl"; } ruoyi-common/ruoyi-common-translation/src/main/java/com/ruoyi/common/translation/core/TranslationInterface.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,17 @@ package com.ruoyi.common.translation.core; /** * ç¿»è¯æ¥å£ (å®ç°ç±»éæ æ³¨ {@link com.ruoyi.common.translation.annotation.TranslationType} æ³¨è§£æ æç¿»è¯ç±»å) * * @author Lion Li */ public interface TranslationInterface { /** * ç¿»è¯ * * @param key éè¦è¢«ç¿»è¯çé® * @return è¿åé®å¯¹åºçå¼ */ String translation(Object key); } ruoyi-common/ruoyi-common-translation/src/main/java/com/ruoyi/common/translation/core/handler/TranslationHandler.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,61 @@ package com.ruoyi.common.translation.core.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.core.utils.StringUtils; import com.ruoyi.common.translation.annotation.Translation; import com.ruoyi.common.translation.core.TranslationInterface; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeansException; 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<Object> implements ContextualSerializer { /** * å ¨å±ç¿»è¯å®ç°ç±»æ å°å¨ */ public static final Map<String, TranslationInterface> TRANSLATION_MAPPER = new ConcurrentHashMap<>(); private Translation translation; @Override public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException { try { TranslationInterface trans = TRANSLATION_MAPPER.get(translation.type()); if (ObjectUtil.isNotNull(trans)) { String result = trans.translation(StringUtils.isBlank(translation.key()) ? value : translation.key()); gen.writeString(StringUtils.isNotBlank(result) ? result : value.toString()); } else { gen.writeString(value.toString()); } } catch (BeansException e) { log.error("åå ¸æ°æ®æªæ¥å°, éç¨é»è®¤å¤ç => {}", e.getMessage()); gen.writeString(value.toString()); } } @Override public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException { Translation translation = property.getAnnotation(Translation.class); if (Objects.nonNull(translation)) { this.translation = translation; return this; } return prov.findValueSerializer(property.getType(), property); } } ruoyi-common/ruoyi-common-translation/src/main/java/com/ruoyi/common/translation/core/impl/DictTranslationImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,29 @@ package com.ruoyi.common.translation.core.impl; import com.ruoyi.common.translation.annotation.TranslationType; import com.ruoyi.common.translation.constant.TransConstant; import com.ruoyi.common.translation.core.TranslationInterface; import org.springframework.stereotype.Component; /** * ç¿»è¯æ¥å£ (å®ç°ç±»éæ æ³¨ {@link com.ruoyi.common.translation.annotation.TranslationType} æ³¨è§£æ æç¿»è¯ç±»å) * * @author Lion Li */ @Component @TranslationType(type = TransConstant.DICT_TYPE_TO_LABEL) public class DictTranslationImpl implements TranslationInterface { /** * ç¿»è¯ * * @param key éè¦è¢«ç¿»è¯çé® * @return è¿åé®å¯¹åºçå¼ */ public String translation(Object key) { if (key instanceof String dictType) { return "dict"; } return null; } } ruoyi-common/ruoyi-common-translation/src/main/java/com/ruoyi/common/translation/core/impl/UserNameTranslationImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,29 @@ package com.ruoyi.common.translation.core.impl; import com.ruoyi.common.translation.annotation.TranslationType; import com.ruoyi.common.translation.constant.TransConstant; import com.ruoyi.common.translation.core.TranslationInterface; import org.springframework.stereotype.Component; /** * ç¿»è¯æ¥å£ (å®ç°ç±»éæ æ³¨ {@link com.ruoyi.common.translation.annotation.TranslationType} æ³¨è§£æ æç¿»è¯ç±»å) * * @author Lion Li */ @Component @TranslationType(type = TransConstant.USER_ID_TO_NAME) public class UserNameTranslationImpl implements TranslationInterface { /** * ç¿»è¯ * * @param key éè¦è¢«ç¿»è¯çé® * @return è¿åé®å¯¹åºçå¼ */ public String translation(Object key) { if (key instanceof Long id) { return "admin"; } return null; } } ruoyi-common/ruoyi-common-translation/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
¶Ô±ÈÐÂÎļþ @@ -0,0 +1 @@ com.ruoyi.common.translation.config.TranslationConfig ruoyi-modules/ruoyi-demo/pom.xml
@@ -73,6 +73,11 @@ <artifactId>ruoyi-common-ratelimiter</artifactId> </dependency> <dependency> <groupId>com.ruoyi</groupId> <artifactId>ruoyi-common-translation</artifactId> </dependency> <!-- çä¿¡ ç¨åªä¸ªå¯¼å ¥åªä¸ªä¾èµ --> <!-- <dependency>--> <!-- <groupId>com.aliyun</groupId>--> ruoyi-modules/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/vo/TestDemoVo.java
@@ -2,6 +2,8 @@ import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; import com.ruoyi.common.translation.annotation.Translation; import com.ruoyi.common.translation.constant.TransConstant; import lombok.Data; import java.io.Serial; @@ -67,6 +69,7 @@ /** * å建人 */ @Translation(type = TransConstant.USER_ID_TO_NAME) @ExcelProperty(value = "å建人") private Long createBy; @@ -79,6 +82,7 @@ /** * æ´æ°äºº */ @Translation(type = TransConstant.USER_ID_TO_NAME) @ExcelProperty(value = "æ´æ°äºº") private Long updateBy;