Selaa lähdekoodia

新增 敏感词过滤组件

18339543638 2 vuotta sitten
vanhempi
commit
f3bd8bc33d
42 muutettua tiedostoa jossa 1158 lisäystä ja 95 poistoa
  1. 1 0
      pom.xml
  2. 47 12
      tr-dependencies/pom.xml
  3. 0 1
      tr-plugins/pom.xml
  4. 22 1
      tr-plugins/tr-spring-boot-starter-plugin-desensitize/pom.xml
  5. 28 0
      tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/annotation/DesensitizeBy.java
  6. 21 0
      tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/handler/DesensitizationHandler.java
  7. 32 0
      tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/regex/annotation/EmailDesensitize.java
  8. 34 0
      tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/regex/annotation/RegexDesensitize.java
  9. 38 0
      tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/regex/handler/AbstractRegexDesensitizationHandler.java
  10. 21 0
      tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/regex/handler/DefaultRegexDesensitizationHandler.java
  11. 22 0
      tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/regex/handler/EmailDesensitizationHandler.java
  12. 92 0
      tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/serializer/StringDesensitizeSerializer.java
  13. 36 0
      tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/slider/annotation/BankCardDesensitize.java
  14. 37 0
      tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/slider/annotation/CarLicenseDesensitize.java
  15. 36 0
      tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/slider/annotation/ChineseNameDesensitize.java
  16. 36 0
      tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/slider/annotation/FixedPhoneDesensitize.java
  17. 36 0
      tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/slider/annotation/IdCardDesensitize.java
  18. 36 0
      tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/slider/annotation/MobileDesensitize.java
  19. 38 0
      tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/slider/annotation/PasswordDesensitize.java
  20. 39 0
      tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/slider/annotation/SliderDesensitize.java
  21. 78 0
      tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/slider/handler/AbstractDesensitizationHandler.java
  22. 78 0
      tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/slider/handler/AbstractSliderDesensitizationHandler.java
  23. 27 0
      tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/slider/handler/BankCardDesensitization.java
  24. 25 0
      tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/slider/handler/CarLicenseDesensitization.java
  25. 27 0
      tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/slider/handler/ChineseNameDesensitization.java
  26. 25 0
      tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/slider/handler/DefaultDesensitizationHandler.java
  27. 25 0
      tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/slider/handler/FixedPhoneDesensitization.java
  28. 25 0
      tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/slider/handler/IdCardDesensitization.java
  29. 26 0
      tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/slider/handler/MobileDesensitization.java
  30. 25 0
      tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/slider/handler/PasswordDesensitization.java
  31. 87 0
      tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/test/java/cn/tr/plugin/desensitize/DesensitizeTest.java
  32. 2 5
      tr-plugins/tr-spring-boot-starter-plugin-dict/src/main/java/cn/tr/plugin/dict/config/jackson/DictJacksonDeserializer.java
  33. 1 2
      tr-plugins/tr-spring-boot-starter-plugin-dict/src/main/java/cn/tr/plugin/dict/config/jackson/DictJacksonSerializer.java
  34. 0 11
      tr-plugins/tr-spring-boot-starter-plugin-eventbus/pom.xml
  35. 3 0
      tr-plugins/tr-spring-boot-starter-plugin-eventbus/src/main/java/cn/tr/plugin/eventbus/TrEventBusAutoConfiguration.java
  36. 0 1
      tr-plugins/tr-spring-boot-starter-plugin-satoken/pom.xml
  37. 2 1
      tr-plugins/tr-spring-boot-starter-plugin-sms/src/main/java/cn/tr/plugin/sms/config/ali/AliSmsClient.java
  38. 10 4
      tr-plugins/tr-spring-boot-starter-plugin-web/src/main/java/cn/tr/plugin/web/TrWebAutoConfiguration.java
  39. 12 14
      tr-plugins/tr-spring-boot-starter-plugin-web/src/main/java/cn/tr/plugin/web/config/jackson/mapper/core/ObjectMapperConfig.java
  40. 6 6
      tr-test/pom.xml
  41. 22 15
      tr-test/src/main/java/cn/tr/test/TestController.java
  42. 0 22
      tr-test/src/main/java/cn/tr/test/WebApplication.java

+ 1 - 0
pom.xml

@@ -11,6 +11,7 @@
     <description>驼人通用型管理框架</description>
 
     <modules>
+        <module>tr-dependencies</module>
         <module>tr-plugins</module>
         <module>tr-framework</module>
         <module>tr-modules</module>

+ 47 - 12
tr-dependencies/pom.xml

@@ -125,6 +125,7 @@
                 <artifactId>mybatis-plus-extension</artifactId>
                 <version>${mybatis-plus.version}</version>
             </dependency>
+
             <dependency>
                 <groupId>com.baomidou</groupId>
                 <artifactId>mybatis-plus-generator</artifactId> <!-- 代码生成器,使用它解析表结构 -->
@@ -220,6 +221,25 @@
                 <version>${tio-websocket.version}</version>
             </dependency>
 
+            <!--字节码增强技术-->
+            <dependency>
+                <groupId>org.javassist</groupId>
+                <artifactId>javassist</artifactId>
+                <version>${javassist.version}</version>
+            </dependency>
+
+            <!--flink 组件-->
+            <dependency>
+                <groupId>org.apache.flink</groupId>
+                <artifactId>flink-streaming-java</artifactId>
+                <version>${flink.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>org.apache.flink</groupId>
+                <artifactId>flink-clients</artifactId>
+                <version>${flink.version}</version>
+            </dependency>
 
             <!--业务组件-->
             <dependency>
@@ -269,6 +289,14 @@
                 <version>${revision}</version>
             </dependency>
 
+
+            <!--satoken插件-->
+            <dependency>
+                <groupId>cn.tr</groupId>
+                <artifactId>tr-spring-boot-starter-plugin-satoken</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
             <!--字典插件-->
             <dependency>
                 <groupId>cn.tr</groupId>
@@ -276,26 +304,33 @@
                 <version>${revision}</version>
             </dependency>
 
-            <!--字节码增强技术-->
+
+            <!--websocket插件-->
             <dependency>
-                <groupId>org.javassist</groupId>
-                <artifactId>javassist</artifactId>
-                <version>${javassist.version}</version>
+                <groupId>cn.tr</groupId>
+                <artifactId>tr-spring-boot-starter-plugin-websocket</artifactId>
+                <version>${revision}</version>
             </dependency>
 
-
+            <!--打印banner插件-->
             <dependency>
-                <groupId>org.apache.flink</groupId>
-                <artifactId>flink-streaming-java</artifactId>
-                <version>1.16.1</version>
+                <groupId>cn.tr</groupId>
+                <artifactId>tr-spring-boot-starter-plugin-banner</artifactId>
+                <version>${revision}</version>
             </dependency>
 
+            <!--敏感词插件-->
+            <dependency>
+                <groupId>cn.tr</groupId>
+                <artifactId>tr-spring-boot-starter-plugin-desensitize</artifactId>
+                <version>${revision}</version>
+            </dependency>
 
-            <!--flink 组件-->
+            <!--web插件-->
             <dependency>
-                <groupId>org.apache.flink</groupId>
-                <artifactId>flink-clients</artifactId>
-                <version>${flink.version}</version>
+                <groupId>cn.tr</groupId>
+                <artifactId>tr-spring-boot-starter-plugin-web</artifactId>
+                <version>${revision}</version>
             </dependency>
         </dependencies>
     </dependencyManagement>

+ 0 - 1
tr-plugins/pom.xml

@@ -11,7 +11,6 @@
 
     <artifactId>tr-plugins</artifactId>
     <packaging>pom</packaging>
-    <!--<version>${revision}</version>-->
 
     <description></description>
     <modules>

+ 22 - 1
tr-plugins/tr-spring-boot-starter-plugin-desensitize/pom.xml

@@ -9,8 +9,29 @@
     </parent>
     <modelVersion>4.0.0</modelVersion>
     <version>${revision}</version>
+    <packaging>jar</packaging>
+
     <artifactId>tr-spring-boot-starter-plugin-desensitize</artifactId>
 
 
-    <description>支持脱敏操作</description>
+    <description>脱敏组件:支持 JSON 返回数据时,将邮箱、手机等字段进行脱敏</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>cn.tr</groupId>
+            <artifactId>tr-framework</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.tr</groupId>
+            <artifactId>tr-spring-boot-starter-plugin-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
 </project>

+ 28 - 0
tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/annotation/DesensitizeBy.java

@@ -0,0 +1,28 @@
+package cn.tr.plugin.desensitize.annotation;
+
+import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import cn.tr.plugin.desensitize.config.handler.DesensitizationHandler;
+import cn.tr.plugin.desensitize.config.serializer.StringDesensitizeSerializer;
+
+import java.lang.annotation.*;
+
+/**
+ * 顶级脱敏注解,自定义注解需要使用此注解
+ *
+ * @author gaibu
+ */
+@Documented
+@Target(ElementType.ANNOTATION_TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+@JacksonAnnotationsInside // 此注解是其他所有 jackson 注解的元注解,打上了此注解的注解表明是 jackson 注解的一部分
+@JsonSerialize(using = StringDesensitizeSerializer.class) // 指定序列化器
+public @interface DesensitizeBy {
+
+    /**
+     * 脱敏处理器
+     */
+    @SuppressWarnings("rawtypes")
+    Class<? extends DesensitizationHandler> handler();
+
+}

+ 21 - 0
tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/handler/DesensitizationHandler.java

@@ -0,0 +1,21 @@
+package cn.tr.plugin.desensitize.config.handler;
+
+import java.lang.annotation.Annotation;
+
+/**
+ * 脱敏处理器接口
+ *
+ * @author gaibu
+ */
+public interface DesensitizationHandler<T extends Annotation> {
+
+    /**
+     * 脱敏
+     *
+     * @param origin     原始字符串
+     * @param annotation 注解信息
+     * @return 脱敏后的字符串
+     */
+    String desensitize(String origin, T annotation);
+
+}

+ 32 - 0
tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/regex/annotation/EmailDesensitize.java

@@ -0,0 +1,32 @@
+package cn.tr.plugin.desensitize.config.regex.annotation;
+
+import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
+import cn.tr.plugin.desensitize.annotation.DesensitizeBy;
+import cn.tr.plugin.desensitize.config.regex.handler.EmailDesensitizationHandler;
+
+import java.lang.annotation.*;
+
+/**
+ * 邮箱脱敏注解
+ *
+ * @author gaibu
+ */
+@Documented
+@Target({ElementType.FIELD})
+@Retention(RetentionPolicy.RUNTIME)
+@JacksonAnnotationsInside
+@DesensitizeBy(handler = EmailDesensitizationHandler.class)
+public @interface EmailDesensitize {
+
+    /**
+     * 匹配的正则表达式
+     */
+    String regex() default "(^.)[^@]*(@.*$)";
+
+    /**
+     * 替换规则,邮箱;
+     *
+     * 比如:example@gmail.com 脱敏之后为 e****@gmail.com
+     */
+    String replacer() default "$1****$2";
+}

+ 34 - 0
tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/regex/annotation/RegexDesensitize.java

@@ -0,0 +1,34 @@
+package cn.tr.plugin.desensitize.config.regex.annotation;
+
+import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
+import cn.tr.plugin.desensitize.annotation.DesensitizeBy;
+import cn.tr.plugin.desensitize.config.regex.handler.DefaultRegexDesensitizationHandler;
+
+import java.lang.annotation.*;
+
+/**
+ * 正则脱敏注解
+ *
+ * @author gaibu
+ */
+@Documented
+@Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+@JacksonAnnotationsInside
+@DesensitizeBy(handler = DefaultRegexDesensitizationHandler.class)
+public @interface RegexDesensitize {
+
+    /**
+     * 匹配的正则表达式(默认匹配所有)
+     */
+    String regex() default "^[\\s\\S]*$";
+
+    /**
+     * 替换规则,会将匹配到的字符串全部替换成 replacer
+     *
+     * 例如:regex=123; replacer=******
+     * 原始字符串 123456789
+     * 脱敏后字符串 ******456789
+     */
+    String replacer() default "******";
+}

+ 38 - 0
tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/regex/handler/AbstractRegexDesensitizationHandler.java

@@ -0,0 +1,38 @@
+package cn.tr.plugin.desensitize.config.regex.handler;
+
+import cn.tr.plugin.desensitize.config.handler.DesensitizationHandler;
+
+import java.lang.annotation.Annotation;
+
+/**
+ * 正则表达式脱敏处理器抽象类,已实现通用的方法
+ *
+ * @author gaibu
+ */
+public abstract class AbstractRegexDesensitizationHandler<T extends Annotation>
+        implements DesensitizationHandler<T> {
+
+    @Override
+    public String desensitize(String origin, T annotation) {
+        String regex = getRegex(annotation);
+        String replacer = getReplacer(annotation);
+        return origin.replaceAll(regex, replacer);
+    }
+
+    /**
+     * 获取注解上的 regex 参数
+     *
+     * @param annotation 注解信息
+     * @return 正则表达式
+     */
+    abstract String getRegex(T annotation);
+
+    /**
+     * 获取注解上的 replacer 参数
+     *
+     * @param annotation 注解信息
+     * @return 待替换的字符串
+     */
+    abstract String getReplacer(T annotation);
+
+}

+ 21 - 0
tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/regex/handler/DefaultRegexDesensitizationHandler.java

@@ -0,0 +1,21 @@
+package cn.tr.plugin.desensitize.config.regex.handler;
+
+import cn.tr.plugin.desensitize.config.regex.annotation.RegexDesensitize;
+
+/**
+ * {@link RegexDesensitize} 的正则脱敏处理器
+ *
+ * @author gaibu
+ */
+public class DefaultRegexDesensitizationHandler extends AbstractRegexDesensitizationHandler<RegexDesensitize> {
+
+    @Override
+    String getRegex(RegexDesensitize annotation) {
+        return annotation.regex();
+    }
+
+    @Override
+    String getReplacer(RegexDesensitize annotation) {
+        return annotation.replacer();
+    }
+}

+ 22 - 0
tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/regex/handler/EmailDesensitizationHandler.java

@@ -0,0 +1,22 @@
+package cn.tr.plugin.desensitize.config.regex.handler;
+
+import cn.tr.plugin.desensitize.config.regex.annotation.EmailDesensitize;
+
+/**
+ * {@link EmailDesensitize} 的脱敏处理器
+ *
+ * @author gaibu
+ */
+public class EmailDesensitizationHandler extends AbstractRegexDesensitizationHandler<EmailDesensitize> {
+
+    @Override
+    String getRegex(EmailDesensitize annotation) {
+        return annotation.regex();
+    }
+
+    @Override
+    String getReplacer(EmailDesensitize annotation) {
+        return annotation.replacer();
+    }
+
+}

+ 92 - 0
tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/serializer/StringDesensitizeSerializer.java

@@ -0,0 +1,92 @@
+package cn.tr.plugin.desensitize.config.serializer;
+
+import cn.hutool.core.annotation.AnnotationUtil;
+import cn.hutool.core.lang.Singleton;
+import cn.hutool.core.util.ArrayUtil;
+import cn.hutool.core.util.ReflectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.BeanProperty;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.ser.ContextualSerializer;
+import com.fasterxml.jackson.databind.ser.std.StdSerializer;
+import lombok.Getter;
+import lombok.Setter;
+import cn.tr.plugin.desensitize.annotation.DesensitizeBy;
+import cn.tr.plugin.desensitize.config.handler.DesensitizationHandler;
+
+import java.io.IOException;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Field;
+
+/**
+ * 脱敏序列化器
+ *
+ * 实现 JSON 返回数据时,使用 {@link DesensitizationHandler} 对声明脱敏注解的字段,进行脱敏处理。
+ *
+ * @author gaibu
+ */
+@SuppressWarnings("rawtypes")
+public class StringDesensitizeSerializer extends StdSerializer<String> implements ContextualSerializer {
+
+    @Getter
+    @Setter
+    private DesensitizationHandler desensitizationHandler;
+
+    protected StringDesensitizeSerializer() {
+        super(String.class);
+    }
+
+    @Override
+    public JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty) {
+        DesensitizeBy annotation = beanProperty.getAnnotation(DesensitizeBy.class);
+        if (annotation == null) {
+            return this;
+        }
+        // 创建一个 StringDesensitizeSerializer 对象,使用 DesensitizeBy 对应的处理器
+        StringDesensitizeSerializer serializer = new StringDesensitizeSerializer();
+        serializer.setDesensitizationHandler(Singleton.get(annotation.handler()));
+        return serializer;
+    }
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public void serialize(String value, JsonGenerator gen, SerializerProvider serializerProvider) throws IOException {
+        if (StrUtil.isBlank(value)) {
+            gen.writeNull();
+            return;
+        }
+        // 获取序列化字段
+        Field field = getField(gen);
+
+        // 自定义处理器
+        DesensitizeBy[] annotations = AnnotationUtil.getCombinationAnnotations(field, DesensitizeBy.class);
+        if (ArrayUtil.isEmpty(annotations)) {
+            gen.writeString(value);
+            return;
+        }
+        for (Annotation annotation : field.getAnnotations()) {
+            if (AnnotationUtil.hasAnnotation(annotation.annotationType(), DesensitizeBy.class)) {
+                value = this.desensitizationHandler.desensitize(value, annotation);
+                gen.writeString(value);
+                return;
+            }
+        }
+        gen.writeString(value);
+    }
+
+    /**
+     * 获取字段
+     *
+     * @param generator JsonGenerator
+     * @return 字段
+     */
+    private Field getField(JsonGenerator generator) {
+        String currentName = generator.getOutputContext().getCurrentName();
+        Object currentValue = generator.getCurrentValue();
+        Class<?> currentValueClass = currentValue.getClass();
+        return ReflectUtil.getField(currentValueClass, currentName);
+    }
+
+}

+ 36 - 0
tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/slider/annotation/BankCardDesensitize.java

@@ -0,0 +1,36 @@
+package cn.tr.plugin.desensitize.config.slider.annotation;
+
+import cn.tr.plugin.desensitize.annotation.DesensitizeBy;
+import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
+import cn.tr.plugin.desensitize.config.slider.handler.BankCardDesensitization;
+
+import java.lang.annotation.*;
+
+/**
+ * 银行卡号
+ *
+ * @author gaibu
+ */
+@Documented
+@Target({ElementType.FIELD})
+@Retention(RetentionPolicy.RUNTIME)
+@JacksonAnnotationsInside
+@DesensitizeBy(handler = BankCardDesensitization.class)
+public @interface BankCardDesensitize {
+
+    /**
+     * 前缀保留长度
+     */
+    int prefixKeep() default 6;
+
+    /**
+     * 后缀保留长度
+     */
+    int suffixKeep() default 2;
+
+    /**
+     * 替换规则,银行卡号; 比如:9988002866797031 脱敏之后为 998800********31
+     */
+    String replacer() default "*";
+
+}

+ 37 - 0
tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/slider/annotation/CarLicenseDesensitize.java

@@ -0,0 +1,37 @@
+package cn.tr.plugin.desensitize.config.slider.annotation;
+
+import cn.tr.plugin.desensitize.annotation.DesensitizeBy;
+import cn.tr.plugin.desensitize.config.slider.handler.CarLicenseDesensitization;
+import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
+
+
+import java.lang.annotation.*;
+
+/**
+ * 车牌号
+ *
+ * @author gaibu
+ */
+@Documented
+@Target({ElementType.FIELD})
+@Retention(RetentionPolicy.RUNTIME)
+@JacksonAnnotationsInside
+@DesensitizeBy(handler = CarLicenseDesensitization.class)
+public @interface CarLicenseDesensitize {
+
+    /**
+     * 前缀保留长度
+     */
+    int prefixKeep() default 3;
+
+    /**
+     * 后缀保留长度
+     */
+    int suffixKeep() default 1;
+
+    /**
+     * 替换规则,车牌号;比如:粤A66666 脱敏之后为粤A6***6
+     */
+    String replacer() default "*";
+
+}

+ 36 - 0
tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/slider/annotation/ChineseNameDesensitize.java

@@ -0,0 +1,36 @@
+package cn.tr.plugin.desensitize.config.slider.annotation;
+
+import cn.tr.plugin.desensitize.annotation.DesensitizeBy;
+import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
+import cn.tr.plugin.desensitize.config.slider.handler.ChineseNameDesensitization;
+
+import java.lang.annotation.*;
+
+/**
+ * 中文名
+ *
+ * @author gaibu
+ */
+@Documented
+@Target({ElementType.FIELD})
+@Retention(RetentionPolicy.RUNTIME)
+@JacksonAnnotationsInside
+@DesensitizeBy(handler = ChineseNameDesensitization.class)
+public @interface ChineseNameDesensitize {
+
+    /**
+     * 前缀保留长度
+     */
+    int prefixKeep() default 1;
+
+    /**
+     * 后缀保留长度
+     */
+    int suffixKeep() default 0;
+
+    /**
+     * 替换规则,中文名;比如:刘子豪脱敏之后为刘**
+     */
+    String replacer() default "*";
+
+}

+ 36 - 0
tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/slider/annotation/FixedPhoneDesensitize.java

@@ -0,0 +1,36 @@
+package cn.tr.plugin.desensitize.config.slider.annotation;
+
+import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
+import cn.tr.plugin.desensitize.annotation.DesensitizeBy;
+import cn.tr.plugin.desensitize.config.slider.handler.FixedPhoneDesensitization;
+
+import java.lang.annotation.*;
+
+/**
+ * 固定电话
+ *
+ * @author gaibu
+ */
+@Documented
+@Target({ElementType.FIELD})
+@Retention(RetentionPolicy.RUNTIME)
+@JacksonAnnotationsInside
+@DesensitizeBy(handler = FixedPhoneDesensitization.class)
+public @interface FixedPhoneDesensitize {
+
+    /**
+     * 前缀保留长度
+     */
+    int prefixKeep() default 4;
+
+    /**
+     * 后缀保留长度
+     */
+    int suffixKeep() default 2;
+
+    /**
+     * 替换规则,固定电话;比如:01086551122 脱敏之后为 0108*****22
+     */
+    String replacer() default "*";
+
+}

+ 36 - 0
tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/slider/annotation/IdCardDesensitize.java

@@ -0,0 +1,36 @@
+package cn.tr.plugin.desensitize.config.slider.annotation;
+
+import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
+import cn.tr.plugin.desensitize.annotation.DesensitizeBy;
+import cn.tr.plugin.desensitize.config.slider.handler.IdCardDesensitization;
+
+import java.lang.annotation.*;
+
+/**
+ * 身份证
+ *
+ * @author gaibu
+ */
+@Documented
+@Target({ElementType.FIELD})
+@Retention(RetentionPolicy.RUNTIME)
+@JacksonAnnotationsInside
+@DesensitizeBy(handler = IdCardDesensitization.class)
+public @interface IdCardDesensitize {
+
+    /**
+     * 前缀保留长度
+     */
+    int prefixKeep() default 6;
+
+    /**
+     * 后缀保留长度
+     */
+    int suffixKeep() default 2;
+
+    /**
+     * 替换规则,身份证号码;比如:530321199204074611 脱敏之后为 530321**********11
+     */
+    String replacer() default "*";
+
+}

+ 36 - 0
tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/slider/annotation/MobileDesensitize.java

@@ -0,0 +1,36 @@
+package cn.tr.plugin.desensitize.config.slider.annotation;
+
+import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
+import cn.tr.plugin.desensitize.annotation.DesensitizeBy;
+import cn.tr.plugin.desensitize.config.slider.handler.MobileDesensitization;
+
+import java.lang.annotation.*;
+
+/**
+ * 手机号
+ *
+ * @author gaibu
+ */
+@Documented
+@Target({ElementType.FIELD})
+@Retention(RetentionPolicy.RUNTIME)
+@JacksonAnnotationsInside
+@DesensitizeBy(handler = MobileDesensitization.class)
+public @interface MobileDesensitize {
+
+    /**
+     * 前缀保留长度
+     */
+    int prefixKeep() default 3;
+
+    /**
+     * 后缀保留长度
+     */
+    int suffixKeep() default 4;
+
+    /**
+     * 替换规则,手机号;比如:13248765917 脱敏之后为 132****5917
+     */
+    String replacer() default "*";
+
+}

+ 38 - 0
tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/slider/annotation/PasswordDesensitize.java

@@ -0,0 +1,38 @@
+package cn.tr.plugin.desensitize.config.slider.annotation;
+
+import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
+import cn.tr.plugin.desensitize.annotation.DesensitizeBy;
+import cn.tr.plugin.desensitize.config.slider.handler.PasswordDesensitization;
+
+import java.lang.annotation.*;
+
+/**
+ * 密码
+ *
+ * @author gaibu
+ */
+@Documented
+@Target({ElementType.FIELD})
+@Retention(RetentionPolicy.RUNTIME)
+@JacksonAnnotationsInside
+@DesensitizeBy(handler = PasswordDesensitization.class)
+public @interface PasswordDesensitize {
+
+    /**
+     * 前缀保留长度
+     */
+    int prefixKeep() default 0;
+
+    /**
+     * 后缀保留长度
+     */
+    int suffixKeep() default 0;
+
+    /**
+     * 替换规则,密码;
+     *
+     * 比如:123456 脱敏之后为 ******
+     */
+    String replacer() default "*";
+
+}

+ 39 - 0
tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/slider/annotation/SliderDesensitize.java

@@ -0,0 +1,39 @@
+package cn.tr.plugin.desensitize.config.slider.annotation;
+
+import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
+import cn.tr.plugin.desensitize.annotation.DesensitizeBy;
+import cn.tr.plugin.desensitize.config.slider.handler.DefaultDesensitizationHandler;
+
+import java.lang.annotation.*;
+
+/**
+ * 滑动脱敏注解
+ *
+ * @author gaibu
+ */
+@Documented
+@Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+@JacksonAnnotationsInside
+@DesensitizeBy(handler = DefaultDesensitizationHandler.class)
+public @interface SliderDesensitize {
+
+    /**
+     * 后缀保留长度
+     */
+    int suffixKeep() default 0;
+
+    /**
+     * 替换规则,会将前缀后缀保留后,全部替换成 replacer
+     *
+     * 例如:prefixKeep = 1; suffixKeep = 2; replacer = "*";
+     * 原始字符串  123456
+     * 脱敏后     1***56
+     */
+    String replacer() default "*";
+
+    /**
+     * 前缀保留长度
+     */
+    int prefixKeep() default 0;
+}

+ 78 - 0
tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/slider/handler/AbstractDesensitizationHandler.java

@@ -0,0 +1,78 @@
+package cn.tr.plugin.desensitize.config.slider.handler;
+
+import cn.tr.plugin.desensitize.config.handler.DesensitizationHandler;
+
+import java.lang.annotation.Annotation;
+
+/**
+ * 滑动脱敏处理器抽象类,已实现通用的方法
+ *
+ * @author gaibu
+ */
+public abstract class AbstractDesensitizationHandler<T extends Annotation>
+        implements DesensitizationHandler<T> {
+
+    @Override
+    public String desensitize(String origin, T annotation) {
+        int prefixKeep = getPrefixKeep(annotation);
+        int suffixKeep = getSuffixKeep(annotation);
+        String replacer = getReplacer(annotation);
+        int length = origin.length();
+
+        // 情况一:原始字符串长度小于等于保留长度,则原始字符串全部替换
+        if (prefixKeep >= length || suffixKeep >= length) {
+            return buildReplacerByLength(replacer, length);
+        }
+
+        // 情况二:原始字符串长度小于等于前后缀保留字符串长度,则原始字符串全部替换
+        if ((prefixKeep + suffixKeep) >= length) {
+            return buildReplacerByLength(replacer, length);
+        }
+
+        // 情况三:原始字符串长度大于前后缀保留字符串长度,则替换中间字符串
+        int interval = length - prefixKeep - suffixKeep;
+        return origin.substring(0, prefixKeep) +
+                buildReplacerByLength(replacer, interval) +
+                origin.substring(prefixKeep + interval);
+    }
+
+    /**
+     * 根据长度循环构建替换符
+     *
+     * @param replacer 替换符
+     * @param length   长度
+     * @return 构建后的替换符
+     */
+    private String buildReplacerByLength(String replacer, int length) {
+        StringBuilder builder = new StringBuilder();
+        for (int i = 0; i < length; i++) {
+            builder.append(replacer);
+        }
+        return builder.toString();
+    }
+
+    /**
+     * 前缀保留长度
+     *
+     * @param annotation 注解信息
+     * @return 前缀保留长度
+     */
+    abstract Integer getPrefixKeep(T annotation);
+
+    /**
+     * 后缀保留长度
+     *
+     * @param annotation 注解信息
+     * @return 后缀保留长度
+     */
+    abstract Integer getSuffixKeep(T annotation);
+
+    /**
+     * 替换符
+     *
+     * @param annotation 注解信息
+     * @return 替换符
+     */
+    abstract String getReplacer(T annotation);
+
+}

+ 78 - 0
tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/slider/handler/AbstractSliderDesensitizationHandler.java

@@ -0,0 +1,78 @@
+package cn.tr.plugin.desensitize.config.slider.handler;
+
+import cn.tr.plugin.desensitize.config.handler.DesensitizationHandler;
+
+import java.lang.annotation.Annotation;
+
+/**
+ * 滑动脱敏处理器抽象类,已实现通用的方法
+ *
+ * @author gaibu
+ */
+public abstract class AbstractSliderDesensitizationHandler<T extends Annotation>
+        implements DesensitizationHandler<T> {
+
+    @Override
+    public String desensitize(String origin, T annotation) {
+        int prefixKeep = getPrefixKeep(annotation);
+        int suffixKeep = getSuffixKeep(annotation);
+        String replacer = getReplacer(annotation);
+        int length = origin.length();
+
+        // 情况一:原始字符串长度小于等于保留长度,则原始字符串全部替换
+        if (prefixKeep >= length || suffixKeep >= length) {
+            return buildReplacerByLength(replacer, length);
+        }
+
+        // 情况二:原始字符串长度小于等于前后缀保留字符串长度,则原始字符串全部替换
+        if ((prefixKeep + suffixKeep) >= length) {
+            return buildReplacerByLength(replacer, length);
+        }
+
+        // 情况三:原始字符串长度大于前后缀保留字符串长度,则替换中间字符串
+        int interval = length - prefixKeep - suffixKeep;
+        return origin.substring(0, prefixKeep) +
+                buildReplacerByLength(replacer, interval) +
+                origin.substring(prefixKeep + interval);
+    }
+
+    /**
+     * 根据长度循环构建替换符
+     *
+     * @param replacer 替换符
+     * @param length   长度
+     * @return 构建后的替换符
+     */
+    private String buildReplacerByLength(String replacer, int length) {
+        StringBuilder builder = new StringBuilder();
+        for (int i = 0; i < length; i++) {
+            builder.append(replacer);
+        }
+        return builder.toString();
+    }
+
+    /**
+     * 前缀保留长度
+     *
+     * @param annotation 注解信息
+     * @return 前缀保留长度
+     */
+    abstract Integer getPrefixKeep(T annotation);
+
+    /**
+     * 后缀保留长度
+     *
+     * @param annotation 注解信息
+     * @return 后缀保留长度
+     */
+    abstract Integer getSuffixKeep(T annotation);
+
+    /**
+     * 替换符
+     *
+     * @param annotation 注解信息
+     * @return 替换符
+     */
+    abstract String getReplacer(T annotation);
+
+}

+ 27 - 0
tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/slider/handler/BankCardDesensitization.java

@@ -0,0 +1,27 @@
+package cn.tr.plugin.desensitize.config.slider.handler;
+
+import cn.tr.plugin.desensitize.config.slider.annotation.BankCardDesensitize;
+
+/**
+ * {@link BankCardDesensitize} 的脱敏处理器
+ *
+ * @author gaibu
+ */
+public class BankCardDesensitization extends AbstractSliderDesensitizationHandler<BankCardDesensitize> {
+
+    @Override
+    Integer getPrefixKeep(BankCardDesensitize annotation) {
+        return annotation.prefixKeep();
+    }
+
+    @Override
+    Integer getSuffixKeep(BankCardDesensitize annotation) {
+        return annotation.suffixKeep();
+    }
+
+    @Override
+    String getReplacer(BankCardDesensitize annotation) {
+        return annotation.replacer();
+    }
+
+}

+ 25 - 0
tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/slider/handler/CarLicenseDesensitization.java

@@ -0,0 +1,25 @@
+package cn.tr.plugin.desensitize.config.slider.handler;
+
+import cn.tr.plugin.desensitize.config.slider.annotation.CarLicenseDesensitize;
+
+/**
+ * {@link CarLicenseDesensitize} 的脱敏处理器
+ *
+ * @author gaibu
+ */
+public class CarLicenseDesensitization extends AbstractSliderDesensitizationHandler<CarLicenseDesensitize> {
+    @Override
+    Integer getPrefixKeep(CarLicenseDesensitize annotation) {
+        return annotation.prefixKeep();
+    }
+
+    @Override
+    Integer getSuffixKeep(CarLicenseDesensitize annotation) {
+        return annotation.suffixKeep();
+    }
+
+    @Override
+    String getReplacer(CarLicenseDesensitize annotation) {
+        return annotation.replacer();
+    }
+}

+ 27 - 0
tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/slider/handler/ChineseNameDesensitization.java

@@ -0,0 +1,27 @@
+package cn.tr.plugin.desensitize.config.slider.handler;
+
+import cn.tr.plugin.desensitize.config.slider.annotation.ChineseNameDesensitize;
+
+/**
+ * {@link ChineseNameDesensitize} 的脱敏处理器
+ *
+ * @author gaibu
+ */
+public class ChineseNameDesensitization extends AbstractSliderDesensitizationHandler<ChineseNameDesensitize> {
+
+    @Override
+    Integer getPrefixKeep(ChineseNameDesensitize annotation) {
+        return annotation.prefixKeep();
+    }
+
+    @Override
+    Integer getSuffixKeep(ChineseNameDesensitize annotation) {
+        return annotation.suffixKeep();
+    }
+
+    @Override
+    String getReplacer(ChineseNameDesensitize annotation) {
+        return annotation.replacer();
+    }
+
+}

+ 25 - 0
tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/slider/handler/DefaultDesensitizationHandler.java

@@ -0,0 +1,25 @@
+package cn.tr.plugin.desensitize.config.slider.handler;
+
+import cn.tr.plugin.desensitize.config.slider.annotation.SliderDesensitize;
+
+/**
+ * {@link SliderDesensitize} 的脱敏处理器
+ *
+ * @author gaibu
+ */
+public class DefaultDesensitizationHandler extends AbstractSliderDesensitizationHandler<SliderDesensitize> {
+    @Override
+    Integer getPrefixKeep(SliderDesensitize annotation) {
+        return annotation.prefixKeep();
+    }
+
+    @Override
+    Integer getSuffixKeep(SliderDesensitize annotation) {
+        return annotation.suffixKeep();
+    }
+
+    @Override
+    String getReplacer(SliderDesensitize annotation) {
+        return annotation.replacer();
+    }
+}

+ 25 - 0
tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/slider/handler/FixedPhoneDesensitization.java

@@ -0,0 +1,25 @@
+package cn.tr.plugin.desensitize.config.slider.handler;
+
+import cn.tr.plugin.desensitize.config.slider.annotation.FixedPhoneDesensitize;
+
+/**
+ * {@link FixedPhoneDesensitize} 的脱敏处理器
+ *
+ * @author gaibu
+ */
+public class FixedPhoneDesensitization extends AbstractSliderDesensitizationHandler<FixedPhoneDesensitize> {
+    @Override
+    Integer getPrefixKeep(FixedPhoneDesensitize annotation) {
+        return annotation.prefixKeep();
+    }
+
+    @Override
+    Integer getSuffixKeep(FixedPhoneDesensitize annotation) {
+        return annotation.suffixKeep();
+    }
+
+    @Override
+    String getReplacer(FixedPhoneDesensitize annotation) {
+        return annotation.replacer();
+    }
+}

+ 25 - 0
tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/slider/handler/IdCardDesensitization.java

@@ -0,0 +1,25 @@
+package cn.tr.plugin.desensitize.config.slider.handler;
+
+import cn.tr.plugin.desensitize.config.slider.annotation.IdCardDesensitize;
+
+/**
+ * {@link IdCardDesensitize} 的脱敏处理器
+ *
+ * @author gaibu
+ */
+public class IdCardDesensitization extends AbstractSliderDesensitizationHandler<IdCardDesensitize> {
+    @Override
+    Integer getPrefixKeep(IdCardDesensitize annotation) {
+        return annotation.prefixKeep();
+    }
+
+    @Override
+    Integer getSuffixKeep(IdCardDesensitize annotation) {
+        return annotation.suffixKeep();
+    }
+
+    @Override
+    String getReplacer(IdCardDesensitize annotation) {
+        return annotation.replacer();
+    }
+}

+ 26 - 0
tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/slider/handler/MobileDesensitization.java

@@ -0,0 +1,26 @@
+package cn.tr.plugin.desensitize.config.slider.handler;
+
+import cn.tr.plugin.desensitize.config.slider.annotation.MobileDesensitize;
+
+/**
+ * {@link MobileDesensitize} 的脱敏处理器
+ *
+ * @author gaibu
+ */
+public class MobileDesensitization extends AbstractSliderDesensitizationHandler<MobileDesensitize> {
+
+    @Override
+    Integer getPrefixKeep(MobileDesensitize annotation) {
+        return annotation.prefixKeep();
+    }
+
+    @Override
+    Integer getSuffixKeep(MobileDesensitize annotation) {
+        return annotation.suffixKeep();
+    }
+
+    @Override
+    String getReplacer(MobileDesensitize annotation) {
+        return annotation.replacer();
+    }
+}

+ 25 - 0
tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/main/java/cn/tr/plugin/desensitize/config/slider/handler/PasswordDesensitization.java

@@ -0,0 +1,25 @@
+package cn.tr.plugin.desensitize.config.slider.handler;
+
+import cn.tr.plugin.desensitize.config.slider.annotation.PasswordDesensitize;
+
+/**
+ * {@link PasswordDesensitize} 的码脱敏处理器
+ *
+ * @author gaibu
+ */
+public class PasswordDesensitization extends AbstractSliderDesensitizationHandler<PasswordDesensitize> {
+    @Override
+    Integer getPrefixKeep(PasswordDesensitize annotation) {
+        return annotation.prefixKeep();
+    }
+
+    @Override
+    Integer getSuffixKeep(PasswordDesensitize annotation) {
+        return annotation.suffixKeep();
+    }
+
+    @Override
+    String getReplacer(PasswordDesensitize annotation) {
+        return annotation.replacer();
+    }
+}

+ 87 - 0
tr-plugins/tr-spring-boot-starter-plugin-desensitize/src/test/java/cn/tr/plugin/desensitize/DesensitizeTest.java

@@ -0,0 +1,87 @@
+package cn.tr.plugin.desensitize;
+
+import cn.tr.core.utils.JsonUtils;
+import cn.tr.plugin.desensitize.config.regex.annotation.EmailDesensitize;
+import cn.tr.plugin.desensitize.config.regex.annotation.RegexDesensitize;
+import cn.tr.plugin.desensitize.config.slider.annotation.*;
+import lombok.Data;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+/**
+ * {@link DesensitizeTest} 的单元测试
+ */
+public class DesensitizeTest {
+
+    @Test
+    public void test() {
+        // 准备参数
+        DesensitizeDemo desensitizeDemo = new DesensitizeDemo();
+        desensitizeDemo.setNickname("芋道源码");
+        desensitizeDemo.setBankCard("9988002866797031");
+        desensitizeDemo.setCarLicense("粤A66666");
+        desensitizeDemo.setFixedPhone("01086551122");
+        desensitizeDemo.setIdCard("530321199204074611");
+        desensitizeDemo.setPassword("123456");
+        desensitizeDemo.setPhoneNumber("13248765917");
+        desensitizeDemo.setSlider1("ABCDEFG");
+        desensitizeDemo.setSlider2("ABCDEFG");
+        desensitizeDemo.setSlider3("ABCDEFG");
+        desensitizeDemo.setEmail("1@email.com");
+        desensitizeDemo.setRegex("你好,我是芋道源码");
+
+        desensitizeDemo.setOrigin("芋道源码");
+
+        // 调用
+        DesensitizeDemo d = JsonUtils.parseObject(JsonUtils.toJsonString(desensitizeDemo), DesensitizeDemo.class);
+        // 断言
+        assertNotNull(d);
+        assertEquals("芋***", d.getNickname());
+        assertEquals("998800********31", d.getBankCard());
+        assertEquals("粤A6***6", d.getCarLicense());
+        assertEquals("0108*****22", d.getFixedPhone());
+        assertEquals("530321**********11", d.getIdCard());
+        assertEquals("******", d.getPassword());
+        assertEquals("132****5917", d.getPhoneNumber());
+        assertEquals("#######", d.getSlider1());
+        assertEquals("ABC*EFG", d.getSlider2());
+        assertEquals("*******", d.getSlider3());
+        assertEquals("1****@email.com", d.getEmail());
+        assertEquals("你好,我是*", d.getRegex());
+        assertEquals("芋道源码", d.getOrigin());
+    }
+
+    @Data
+    public static class DesensitizeDemo {
+
+        @ChineseNameDesensitize
+        private String nickname;
+        @BankCardDesensitize
+        private String bankCard;
+        @CarLicenseDesensitize
+        private String carLicense;
+        @FixedPhoneDesensitize
+        private String fixedPhone;
+        @IdCardDesensitize
+        private String idCard;
+        @PasswordDesensitize
+        private String password;
+        @MobileDesensitize
+        private String phoneNumber;
+        @SliderDesensitize(prefixKeep = 6, suffixKeep = 1, replacer = "#")
+        private String slider1;
+        @SliderDesensitize(prefixKeep = 3, suffixKeep = 3)
+        private String slider2;
+        @SliderDesensitize(prefixKeep = 10)
+        private String slider3;
+        @EmailDesensitize
+        private String email;
+        @RegexDesensitize(regex = "芋道源码", replacer = "*")
+        private String regex;
+        private String origin;
+
+    }
+
+}

+ 2 - 5
tr-plugins/tr-spring-boot-starter-plugin-dict/src/main/java/cn/tr/plugin/dict/config/jackson/DictJacksonDeserializer.java

@@ -1,9 +1,6 @@
 package cn.tr.plugin.dict.config.jackson;
 
 import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.core.util.StrUtil;
-import cn.tr.core.utils.JsonUtils;
-import cn.tr.plugin.dict.bo.DictBO;
 import com.fasterxml.jackson.core.JacksonException;
 import com.fasterxml.jackson.core.JsonParser;
 import com.fasterxml.jackson.core.TreeNode;
@@ -31,8 +28,8 @@ public class DictJacksonDeserializer extends JsonDeserializer<String>  {
         }
         try {
             TreeNode result = treeNode.get("value");
-            if(result instanceof NullNode){
-                return null;
+            if(result instanceof NullNode || result==null){
+                return p.getText();
             }
             if(result instanceof TextNode){
                 return ((TextNode) result).asText();

+ 1 - 2
tr-plugins/tr-spring-boot-starter-plugin-dict/src/main/java/cn/tr/plugin/dict/config/jackson/DictJacksonSerializer.java

@@ -1,6 +1,6 @@
 package cn.tr.plugin.dict.config.jackson;
 
-import cn.hutool.core.annotation.AnnotationUtil;
+
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.extra.spring.SpringUtil;
 import cn.tr.plugin.dict.annotation.Dict;
@@ -14,7 +14,6 @@ import com.fasterxml.jackson.databind.SerializerProvider;
 import com.fasterxml.jackson.databind.ser.ContextualSerializer;
 import lombok.AllArgsConstructor;
 import lombok.NoArgsConstructor;
-import org.springframework.core.annotation.AnnotationUtils;
 
 import java.io.IOException;
 

+ 0 - 11
tr-plugins/tr-spring-boot-starter-plugin-eventbus/pom.xml

@@ -26,17 +26,6 @@
             <artifactId>tr-spring-boot-starter-plugin-flink</artifactId>
         </dependency>
 
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-amqp</artifactId>
-            <exclusions>
-                <exclusion>
-                    <groupId>org.springframework.boot</groupId>
-                    <artifactId>spring-boot-starter-logging</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-
         <dependency>
             <groupId>org.redisson</groupId>
             <artifactId>redisson-spring-boot-starter</artifactId>

+ 3 - 0
tr-plugins/tr-spring-boot-starter-plugin-eventbus/src/main/java/cn/tr/plugin/eventbus/TrEventBusAutoConfiguration.java

@@ -16,6 +16,8 @@ import org.redisson.api.RedissonClient;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
+
 import java.util.*;
 /**
  * @ClassName : TrEventBusAutoConfiguration
@@ -23,6 +25,7 @@ import java.util.*;
  * @Author : LF
  * @Date: 2023年03月15日
  */
+@Import(TrEventBusAutoConfiguration.RedissionEventBusAutoConfiguration.class)
 public class TrEventBusAutoConfiguration {
     /**
      * 本地订阅处理

+ 0 - 1
tr-plugins/tr-spring-boot-starter-plugin-satoken/pom.xml

@@ -25,7 +25,6 @@
         <dependency>
             <groupId>cn.dev33</groupId>
             <artifactId>sa-token-dao-redis</artifactId>
-            <scope>provided</scope>
         </dependency>
 
 

+ 2 - 1
tr-plugins/tr-spring-boot-starter-plugin-sms/src/main/java/cn/tr/plugin/sms/config/ali/AliSmsClient.java

@@ -1,5 +1,6 @@
 package cn.tr.plugin.sms.config.ali;
 
+import cn.tr.core.pojo.CommonResult;
 import cn.tr.plugin.sms.bo.SmsSendRespBO;
 import cn.tr.plugin.sms.config.AbstractSmsClient;
 
@@ -22,7 +23,7 @@ public class AliSmsClient extends AbstractSmsClient<AliSmsClientConfig,AliSmsCli
     }
 
     @Override
-    public SmsCommonResult<SmsSendRespBO> sendSms(AliSmsClientSendConfig sendConfig) {
+    public CommonResult<SmsSendRespBO> sendSms(AliSmsClientSendConfig sendConfig) {
         return null;
     }
 }

+ 10 - 4
tr-plugins/tr-spring-boot-starter-plugin-web/src/main/java/cn/tr/plugin/web/TrWebAutoConfiguration.java

@@ -8,6 +8,7 @@ import cn.tr.plugin.web.filter.CachingContentFilter;
 import cn.tr.plugin.web.filter.ExceptionFilter;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import org.springframework.beans.factory.config.BeanPostProcessor;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.boot.web.servlet.FilterRegistrationBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.web.servlet.HandlerInterceptor;
@@ -21,6 +22,12 @@ import java.util.*;
  */
 public class TrWebAutoConfiguration implements BeanPostProcessor {
 
+    @Bean
+    @ConditionalOnMissingBean(ObjectMapper.class)
+    public ObjectMapper objectMapper(){
+        return new ObjectMapper();
+    }
+
     /**
      * mvc配置
      * @param objectMapper
@@ -32,10 +39,9 @@ public class TrWebAutoConfiguration implements BeanPostProcessor {
         return new TrWebMvcConfig(objectMapper,interceptors);
     }
 
-
-    @Bean
-    public ObjectMapperConfig objectMapperConfig(){
-        return new ObjectMapperConfig();
+    @Bean(initMethod = "init")
+    public ObjectMapperConfig objectMapperConfig(ObjectMapper objectMapper){
+        return new ObjectMapperConfig(objectMapper);
     }
     /**
      * 分页参数配置

+ 12 - 14
tr-plugins/tr-spring-boot-starter-plugin-web/src/main/java/cn/tr/plugin/web/config/jackson/mapper/core/ObjectMapperConfig.java

@@ -7,8 +7,8 @@ import cn.tr.plugin.web.config.jackson.mapper.module.bean.EnumModule;
 import cn.tr.plugin.web.config.jackson.mapper.module.bean.StringModule;
 import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.BeansException;
 import org.springframework.beans.factory.config.BeanPostProcessor;
 
 /**
@@ -18,25 +18,23 @@ import org.springframework.beans.factory.config.BeanPostProcessor;
  * @Date: 2023年02月21日
  */
 @Slf4j
+@AllArgsConstructor
 public class ObjectMapperConfig implements BeanPostProcessor {
+    private ObjectMapper objectMapper;
     static {
         SimpleModuleRegister.register(new BooleanModule());
         SimpleModuleRegister.register(new EnumModule());
         SimpleModuleRegister.register(new StringModule());
     }
 
-    @Override
-    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
-        if(bean instanceof ObjectMapper){
-            ObjectMapper objectMapper= (ObjectMapper) bean;
-            /**
-             * 设置modules
-             */
-            objectMapper.registerModules(SimpleModuleRegister.getModules());
-            objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
-            JsonUtils.init(objectMapper);
-            log.info("初始化 objectMapper 自动配置");
-        }
-        return bean;
+
+    public void init(){
+        /**
+         * 设置modules
+         */
+        objectMapper.registerModules(SimpleModuleRegister.getModules());
+        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+        JsonUtils.init(objectMapper);
+        log.info("初始化 objectMapper 自动配置");
     }
 }

+ 6 - 6
tr-test/pom.xml

@@ -8,7 +8,7 @@
         <version>${revision}</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
-
+    <version>${revision}</version>
     <artifactId>tr-test</artifactId>
 
 
@@ -16,31 +16,31 @@
         <dependency>
             <groupId>cn.tr</groupId>
             <artifactId>tr-spring-boot-starter-plugin-web</artifactId>
-            <version>0.0.9</version>
         </dependency>
 
         <dependency>
             <groupId>cn.tr</groupId>
             <artifactId>tr-spring-boot-starter-plugin-websocket</artifactId>
-            <version>0.0.9</version>
         </dependency>
 
         <dependency>
             <groupId>cn.tr</groupId>
             <artifactId>tr-spring-boot-starter-plugin-eventbus</artifactId>
-            <version>0.0.9</version>
         </dependency>
 
         <dependency>
             <groupId>cn.tr</groupId>
             <artifactId>tr-spring-boot-starter-plugin-satoken</artifactId>
-            <version>0.0.9</version>
         </dependency>
 
         <dependency>
             <groupId>cn.tr</groupId>
             <artifactId>tr-spring-boot-starter-plugin-banner</artifactId>
-            <version>0.0.9</version>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.tr</groupId>
+            <artifactId>tr-spring-boot-starter-plugin-desensitize</artifactId>
         </dependency>
 
         <dependency>

+ 22 - 15
tr-test/src/main/java/cn/tr/test/TestController.java

@@ -1,12 +1,15 @@
 package cn.tr.test;
 
+import cn.tr.core.enums.IEnum;
 import cn.tr.core.utils.JsonUtils;
+import cn.tr.plugin.desensitize.config.slider.annotation.ChineseNameDesensitize;
 import cn.tr.plugin.dict.annotation.Dict;
 import cn.tr.plugin.dict.bo.DictBO;
 import cn.tr.plugin.dict.config.cache.DictManager;
 import cn.tr.plugin.eventbus.annotation.Subscribe;
 import lombok.AllArgsConstructor;
 import lombok.Data;
+import lombok.Getter;
 import lombok.NoArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -24,7 +27,6 @@ import java.util.*;
  * @Date: 2023年02月22日
  */
 @RestController
-
 @RequestMapping("/test")
 @Slf4j
 public class TestController {
@@ -37,20 +39,8 @@ public class TestController {
     }
 
     @GetMapping("/123")
-    public Integer test(@RequestParam("test") String test){
-        return 2/1;
-    }
-
-
-    @Subscribe({"test*"})
-    public void sub(User test){
-        log.info("User:"+ JsonUtils.toJsonString(test));
-    }
-
-    @Subscribe({"test*"})
-    public void subString(String test){
-
-        log.info("String:"+ JsonUtils.toJsonString(test));
+    public User test(@RequestParam("test") String test){
+        return User.of("id","1","上官吹雪",false,Grander.high);
     }
 
     @Data
@@ -60,5 +50,22 @@ public class TestController {
         private String id;
         @Dict("gender")
         private String name;
+
+        @ChineseNameDesensitize
+        private String nickname;
+
+        private Boolean test;
+
+        private Grander grander;
+    }
+
+    @Getter
+    @AllArgsConstructor
+    static enum  Grander implements IEnum<String> {
+        lower("1","低年级"),
+        middle("1","中年级"),
+        high("1","高年级");
+        private String value;
+        private String label;
     }
 }

+ 0 - 22
tr-test/src/main/java/cn/tr/test/WebApplication.java

@@ -19,28 +19,6 @@ import javax.annotation.PostConstruct;
  */
 @SpringBootApplication
 public class WebApplication {
-    @Autowired
-    private RedissonClient redissonClient;
-
-    @Autowired
-    private EventBus eventBus;
-
-    @PostConstruct
-    public void init(){
-//        eventBus.subscribe("test1223", msg->{
-//            System.out.println("第------------"+ finalI +"  ----------------接收到信息:{ "+ JsonUtils.toJsonString(msg) +" }");
-//        });
-
-        ThreadUtil.execAsync(()->{
-            RTopic test = redissonClient.getTopic(EventBusConstant.EVENT_BUS_TOPIC);
-            while (true){
-                Thread.sleep(3000);
-                test.publish(TestController.User.of("test1223>>"+System.currentTimeMillis(),  "1"));
-            }
-        });
-    }
-
-
     public static void main(String[] args) {
         SpringApplication.run(WebApplication.class);
     }