From 0e8bc800151d835aaf1f7587dcd832f8ac050ec5 Mon Sep 17 00:00:00 2001 From: song_jx <1649991905@qq.com> Date: Mon, 18 Mar 2024 11:26:04 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=AE=8C=E5=96=84(master):?= =?UTF-8?q?=20=E6=95=B0=E6=8D=AE=E5=BA=93=E7=BF=BB=E8=AF=91=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=AD=97=E6=AE=B5=E4=B8=8D=E4=B8=80=E8=87=B4=E6=83=85?= =?UTF-8?q?=E5=86=B5=EF=BC=88=E6=98=A0=E5=B0=84=E6=A8=A1=E5=BC=8F=E8=A7=A3?= =?UTF-8?q?=E5=86=B3=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 12 +++- .../aizuda/trans/annotation/Translate.java | 1 + .../com/aizuda/trans/demo/DemoService.java | 18 ++++- .../trans/demo/impl/DemoServiceImpl.java | 12 +++- .../com/aizuda/trans/entity/People2_1.java | 27 +++++++ .../java/com/aizuda/trans/TranslatorTest.java | 7 ++ .../trans/handler/TranslatorHandle.java | 72 +++++++++++++------ pom.xml | 2 +- 8 files changed, 124 insertions(+), 27 deletions(-) create mode 100644 dict-trans-demo/src/main/java/com/aizuda/trans/entity/People2_1.java diff --git a/README.md b/README.md index 426e77b..3abf2c9 100644 --- a/README.md +++ b/README.md @@ -148,7 +148,7 @@ dict-trans com.aizuda dict-trans - 0.7 + 0.8 @@ -269,6 +269,9 @@ public class People { 参数: * dictClass:字典配置类,指定的 class 上必须是 `DictTranslate.class` 实现类 、 `IEnum` 接口的实现类 、 `Desensitized` 、 `SummaryExtract` 或者是 `@Dictionary` 注解; * translateField:翻译后的属性名,注意使用驼峰命名,默认为原属性名去除末尾的 "Id" 和 "Code" 再接上 "Name"; + 1. 不填时默认为原属性名去除末尾的"Id"和"Code"再接上"Name" + 2. Desensitized(脱敏) 与 SummaryExtract(摘要提取)不填时默认为原字段 + 3. 数据库翻译时,若查询的字段与翻译字段长度不一致,可以填写字段映射。格式:“查询字段:翻译字段”,如“sex:sexName”。此时将会自动重新组织数据,防止翻译对不上的情况。*注意:若不使用映射模式,一定要长度一致,顺序一致!!!否者会出现对应错乱!!!* * groupValue:组属性值,在静态字典表这种拥有组属性的字典中需要手动传入一个定值(即:字典分组的 code); * dictionary:指定 `Dictionary` 并设置其属性,将覆盖 `dictClass` 上的 `Dictionary` 注解的配置,指定了该属性后也可不指定 `dictClass` ,一般情况下不会使用; * conditionField:指定判断条件字段(仅自定义翻译实现时用来进行判断)『20230822更新后支持固定值,格式:V:<值>』; @@ -310,7 +313,14 @@ public class UserDB { } // 2.2. 字段翻译 +// 特殊用法1(多列翻译): // @Translate(dictClass = UserDB.class, translateField = {"name", "sex"}) +// +// 特殊用法2(映射翻译): +// 针对此种翻译注解情况 @Dictionary(codeColumn = "id", textColumn = {"user_name", "sex"}) +// @Translate(dictClass = UserDB.class, translateField = {"user_name:name"}) +// +// 常规用法如下: @Translate(dictClass = UserDB.class, translateField = "name") private String id; diff --git a/dict-trans-core/src/main/java/com/aizuda/trans/annotation/Translate.java b/dict-trans-core/src/main/java/com/aizuda/trans/annotation/Translate.java index e362b09..8ab599a 100644 --- a/dict-trans-core/src/main/java/com/aizuda/trans/annotation/Translate.java +++ b/dict-trans-core/src/main/java/com/aizuda/trans/annotation/Translate.java @@ -38,6 +38,7 @@ public @interface Translate { * * * diff --git a/dict-trans-demo/src/main/java/com/aizuda/trans/demo/DemoService.java b/dict-trans-demo/src/main/java/com/aizuda/trans/demo/DemoService.java index 4119046..747ff2a 100644 --- a/dict-trans-demo/src/main/java/com/aizuda/trans/demo/DemoService.java +++ b/dict-trans-demo/src/main/java/com/aizuda/trans/demo/DemoService.java @@ -1,6 +1,12 @@ package com.aizuda.trans.demo; -import com.aizuda.trans.entity.*; +import com.aizuda.trans.entity.Device; +import com.aizuda.trans.entity.People; +import com.aizuda.trans.entity.People2; +import com.aizuda.trans.entity.People2_1; +import com.aizuda.trans.entity.People3; +import com.aizuda.trans.entity.People4; +import com.aizuda.trans.entity.Result; import java.util.List; @@ -43,7 +49,15 @@ public interface DemoService { * @author nn200433 */ public List dbDemo(); - + + /** + * 数据库演示(单列翻译) + * + * @return {@link List }<{@link People2 }> + * @author nn200433 + */ + public List dbDemo1(); + /** * json演示 * diff --git a/dict-trans-demo/src/main/java/com/aizuda/trans/demo/impl/DemoServiceImpl.java b/dict-trans-demo/src/main/java/com/aizuda/trans/demo/impl/DemoServiceImpl.java index 5ba8130..d614093 100644 --- a/dict-trans-demo/src/main/java/com/aizuda/trans/demo/impl/DemoServiceImpl.java +++ b/dict-trans-demo/src/main/java/com/aizuda/trans/demo/impl/DemoServiceImpl.java @@ -6,6 +6,7 @@ import com.aizuda.trans.demo.DemoService; import com.aizuda.trans.entity.Device; import com.aizuda.trans.entity.People; import com.aizuda.trans.entity.People2; +import com.aizuda.trans.entity.People2_1; import com.aizuda.trans.entity.People3; import com.aizuda.trans.entity.People4; import com.aizuda.trans.entity.Result; @@ -54,7 +55,16 @@ public class DemoServiceImpl implements DemoService { People2 more = People2.builder().id("1,2").build(); return CollUtil.newArrayList(man, woman, more); } - + + @Translator + @Override + public List dbDemo1() { + People2_1 man = People2_1.builder().id("1").build(); + People2_1 woman = People2_1.builder().id("2").build(); + People2_1 more = People2_1.builder().id("1,2").build(); + return CollUtil.newArrayList(man, woman, more); + } + @Translator @Override public List jsonDemo() { diff --git a/dict-trans-demo/src/main/java/com/aizuda/trans/entity/People2_1.java b/dict-trans-demo/src/main/java/com/aizuda/trans/entity/People2_1.java new file mode 100644 index 0000000..fca8e55 --- /dev/null +++ b/dict-trans-demo/src/main/java/com/aizuda/trans/entity/People2_1.java @@ -0,0 +1,27 @@ +package com.aizuda.trans.entity; + +import com.aizuda.trans.annotation.Translate; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 人2_1 + * + * @author nn200433 + * @date 2022-12-16 016 11:40:30 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class People2_1 { + + /** 数据库翻译 */ + @Translate(dictClass = UserDB.class, translateField = {"user_name:name"}) + private String id; + + private String name; + +} diff --git a/dict-trans-demo/src/test/java/com/aizuda/trans/TranslatorTest.java b/dict-trans-demo/src/test/java/com/aizuda/trans/TranslatorTest.java index 0c986de..a64ab55 100644 --- a/dict-trans-demo/src/test/java/com/aizuda/trans/TranslatorTest.java +++ b/dict-trans-demo/src/test/java/com/aizuda/trans/TranslatorTest.java @@ -7,6 +7,7 @@ import com.aizuda.trans.demo.DemoService; import com.aizuda.trans.entity.Device; import com.aizuda.trans.entity.People; import com.aizuda.trans.entity.People2; +import com.aizuda.trans.entity.People2_1; import com.aizuda.trans.entity.People3; import com.aizuda.trans.entity.People4; import com.aizuda.trans.entity.Result; @@ -50,6 +51,12 @@ public class TranslatorTest { Console.log("---> 数据库 翻译结果:{}", JSONUtil.toJsonStr(peopleList)); } + @Test + public void demo3_1() { + List peopleList = demoService.dbDemo1(); + Console.log("---> 数据库(长度不一致,采用字段映射方式) 翻译结果:{}", JSONUtil.toJsonStr(peopleList)); + } + @Test public void demo4() { List peopleList = demoService.jsonDemo(); diff --git a/dict-trans-spring-boot-starter/src/main/java/com/aizuda/trans/handler/TranslatorHandle.java b/dict-trans-spring-boot-starter/src/main/java/com/aizuda/trans/handler/TranslatorHandle.java index 2db9b0d..fcf3910 100644 --- a/dict-trans-spring-boot-starter/src/main/java/com/aizuda/trans/handler/TranslatorHandle.java +++ b/dict-trans-spring-boot-starter/src/main/java/com/aizuda/trans/handler/TranslatorHandle.java @@ -43,6 +43,7 @@ import org.springframework.stereotype.Service; import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.lang.reflect.Method; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; @@ -171,41 +172,68 @@ public class TranslatorHandle { * @author nn200433 */ private static void transformField(T origin, FormatType fieldFormatType, Field field) { - // 1.获取要翻译的属性名 - final String fName = field.getName(); - final String fieldName = NameUtil.parseCamelTo(fName, fieldFormatType); - // 2.获取每个待翻译属性的配置 - final Translate translateConfig = field.getAnnotation(Translate.class); - final Class dictClass = getDictClass(translateConfig); - final List writeFieldList = getWriteFieldNameSrv().getFieldNameList(translateConfig, fName, fieldFormatType); - final String groupValue = translateConfig.groupValue(); - final String conditionField = translateConfig.conditionField(); - final String desensitizedModel = translateConfig.desensitizedModel(); - final int maxLen = translateConfig.maxLen(); - final Dictionary dictionaryConfig = handle(dictClass, translateConfig); - final boolean isJsonConvert = IJsonConvert.class.isAssignableFrom(dictClass); - final boolean isSetFieldEmpty = translateConfig.setFieldEmpty(); - - // 获取未翻译的原值,如果值为空则跳过 + // 1.获取要翻译的属性名 及 获取每个待翻译属性的配置 + final String fName = field.getName(); + final String fieldName = NameUtil.parseCamelTo(fName, fieldFormatType); + final Translate translateConfig = field.getAnnotation(Translate.class); + final Class dictClass = getDictClass(translateConfig); + final String groupValue = translateConfig.groupValue(); + final String conditionField = translateConfig.conditionField(); + final String desensitizedModel = translateConfig.desensitizedModel(); + final int maxLen = translateConfig.maxLen(); + final boolean isJsonConvert = IJsonConvert.class.isAssignableFrom(dictClass); + final boolean isSetFieldEmpty = translateConfig.setFieldEmpty(); + final Dictionary dictionaryConfig = handle(dictClass, translateConfig); + final String[] columns = dictionaryConfig.textColumn(); + final String codeColumn = dictionaryConfig.codeColumn(); + List writeFieldList = getWriteFieldNameSrv().getFieldNameList(translateConfig, fName, fieldFormatType); + // 2. 获取未翻译的原值,如果值为空则跳过 String originValue = Convert.toStr(getProperty(origin, fieldName)); if (originValue == null) { return; } - - // 获取条件字段值 + // 3. 获取条件字段值 String conditionFieldValue = Opt.ofBlankAble(conditionField) .map(c -> StrUtil.startWith(c, CONDITION_FIELD_IS_VALUE_PREFIX) ? StrUtil.removePrefix(c, CONDITION_FIELD_IS_VALUE_PREFIX) : Convert.toStr(getProperty(origin, c))) .get(); - - // 获取翻译结果并脱敏处理 + // 4. 获取翻译结果 final ExtendParam extendParam = new ExtendParam(groupValue, conditionFieldValue, dictClass, maxLen); List translateValList = parse(originValue, dictionaryConfig, extendParam); + // 5. 数据库翻译时,处理多个值情况的问题 + if (StrUtil.isNotBlank(codeColumn) && ArrayUtil.isNotEmpty(columns)) { + final int columnLen = columns.length; + final int writeFieldSize = writeFieldList.size(); + List newWriteFieldList = new ArrayList(writeFieldSize); + List newTranslateValList = new ArrayList(translateValList.size()); + if (columnLen > 1) { + for (final String writeField : writeFieldList) { + final List fieldList = StrUtil.split(writeField, StrUtil.COLON, Boolean.TRUE, Boolean.TRUE); + // Assert.isTrue(fieldList.size() == 2, "数据库翻译异常:由于查询字段多于翻译字段,需要设置映射关系(格式:“查询字段:翻译字段”,如“sex:sexName”),您未进行设置或设置错误。"); + if (fieldList.size() != 2) { + continue; + } + // 左侧为数据库查询字段,右侧为翻译字段,根据查询字段获取结果值的下标 + final String queryColumn = fieldList.get(0); + final String waitWriteField = fieldList.get(1); + final int translateValDataIndex = ArrayUtil.indexOf(columns, queryColumn); + // 构造新数据 + newWriteFieldList.add(waitWriteField); + newTranslateValList.add(translateValList.get(translateValDataIndex)); + } + if (CollUtil.isNotEmpty(newWriteFieldList)) { + writeFieldList = newWriteFieldList; + } + if (CollUtil.isNotEmpty(newTranslateValList)) { + translateValList = newTranslateValList; + } + } + } + // 6. 脱敏处理 if (!isJsonConvert) { // 不是 JsonConvert.class 时可进行脱敏 translateValList = desensitizedHandle(desensitizedModel, translateValList); } - - // 将翻译结果填入翻译展示字段 + // 7. 将翻译结果填入翻译展示字段 setProperty(origin, (isJsonConvert && isSetFieldEmpty), fieldName, writeFieldList, translateValList); } diff --git a/pom.xml b/pom.xml index 9c30ca6..d98ae2b 100644 --- a/pom.xml +++ b/pom.xml @@ -22,7 +22,7 @@ - 0.7 + 0.8 3.5.5