瀏覽代碼

提交, 后面还原

Gaokun Wang 1 月之前
父節點
當前提交
1ccdc33500

+ 1 - 0
eco-bom/pom.xml

@@ -87,6 +87,7 @@
                 <artifactId>com-security</artifactId>
                 <version>${revision}</version>
             </dependency>
+
             <!-- com-mapper -->
             <dependency>
                 <groupId>org.eco.vip</groupId>

+ 34 - 0
eco-common/com-core/src/main/java/org/eco/vip/orm/utils/ReflectUtils.java

@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2025 GaoKunW
+ *
+ */
+
+package org.eco.vip.orm.utils;
+
+
+import cn.hutool.core.util.ReflectUtil;
+
+/**
+ * @description ReflectUtils
+ *
+ * @author GaoKunW
+ * @date 2025/7/4 13:46
+ */
+public class ReflectUtils extends ReflectUtil {
+    private static final String GETTER_PREFIX = "get";
+
+    /**
+     * 调用Getter方法.
+     * 支持多级,如:对象名.对象名.方法
+     */
+    public static <E> E invokeGetter(Object obj, String propertyName) {
+        Object object = obj;
+        for (String name : StrUtils.split(propertyName, ".")) {
+            String getterMethodName = GETTER_PREFIX + StrUtils.upperFirst(name);
+            object = invokeMethod(object, getterMethodName, new Class[]{}, new Object[]{});
+        }
+        return (E) object;
+    }
+
+
+}

+ 10 - 3
eco-common/com-mapper/pom.xml

@@ -4,9 +4,16 @@
     <parent>
         <groupId>org.eco.vip</groupId>
         <artifactId>eco-common</artifactId>
-        <version>1.0.0</version>
+        <version>${revision}</version>
     </parent>
     <artifactId>com-mapper</artifactId>
-    <name>Archetype - com-mapper</name>
-    <url>http://maven.apache.org</url>
+    <name>${project.artifactId}</name>
+    <packaging>jar</packaging>
+
+    <dependencies>
+    <dependency>
+        <groupId>org.eco.vip</groupId>
+        <artifactId>com-core</artifactId>
+    </dependency>
+    </dependencies>
 </project>

+ 50 - 0
eco-common/com-mapper/src/main/java/org/eco/vip/mapper/annotation/FieldMapper.java

@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2025 GaoKunW
+ *
+ */
+
+package org.eco.vip.mapper.annotation;
+
+
+import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import org.eco.vip.mapper.handler.FieldMapperHandler;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * @description FieldMapper
+ *
+ * @author GaoKunW
+ * @date 2025/7/4 13:35
+ */
+
+@Inherited
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.FIELD, ElementType.METHOD})
+@Documented
+@JacksonAnnotationsInside
+@JsonSerialize(using = FieldMapperHandler.class)
+public @interface FieldMapper {
+
+    /**
+     * 类型 (需与实现类上的 {@link FieldMapperType} 注解type对应)
+     * 默认取当前字段的值 如果设置了 @{@link FieldMapper#mapper()} 则取映射字段的值
+     */
+    String type();
+
+    /**
+     * 映射字段 (如果不为空则取此字段的值)
+     */
+    String mapper() default "";
+
+    /**
+     * 其他条件 例如: 字典type(sys_user_gender)
+     */
+    String other() default "";
+}

+ 31 - 0
eco-common/com-mapper/src/main/java/org/eco/vip/mapper/annotation/FieldMapperType.java

@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2025 GaoKunW
+ *
+ */
+
+package org.eco.vip.mapper.annotation;
+
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * @description FieldMapperType
+ *
+ * @author GaoKunW
+ * @date 2025/7/4 13:36
+ */
+@Inherited
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.TYPE})
+@Documented
+public @interface FieldMapperType {
+    /**
+     * 类型
+     */
+    String type();
+}

+ 56 - 0
eco-common/com-mapper/src/main/java/org/eco/vip/mapper/config/FieldMapperConfig.java

@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2025 GaoKunW
+ *
+ */
+
+package org.eco.vip.mapper.config;
+
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import jakarta.annotation.PostConstruct;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.eco.vip.mapper.annotation.FieldMapperType;
+import org.eco.vip.mapper.handler.FieldMapperBeanSerializerModifier;
+import org.eco.vip.mapper.handler.FieldMapperHandler;
+import org.eco.vip.mapper.service.IFieldMapperInterface;
+import org.springframework.boot.autoconfigure.AutoConfiguration;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @description FieldMapperConfig
+ *
+ * @author GaoKunW
+ * @date 2025/7/4 13:36
+ */
+@Slf4j
+@AutoConfiguration
+public class FieldMapperConfig {
+
+    @Resource
+    private List<IFieldMapperInterface<?>> list;
+
+    @Resource
+    private ObjectMapper objectMapper;
+
+    @PostConstruct
+    public void init() {
+        Map<String, IFieldMapperInterface<?>> map = new HashMap<>(list.size());
+        for (IFieldMapperInterface<?> trans : list) {
+            if (trans.getClass().isAnnotationPresent(FieldMapperType.class)) {
+                FieldMapperType annotation = trans.getClass().getAnnotation(FieldMapperType.class);
+                map.put(annotation.type(), trans);
+            } else {
+                log.warn("{}翻译实现类未标注 FieldMapperType 注解!", trans.getClass().getName());
+            }
+        }
+        FieldMapperHandler.FIELD_MAPPER.putAll(map);
+        // 设置 Bean 序列化修改器
+        objectMapper.setSerializerFactory(
+                objectMapper.getSerializerFactory()
+                        .withSerializerModifier(new FieldMapperBeanSerializerModifier()));
+    }
+}

+ 26 - 0
eco-common/com-mapper/src/main/java/org/eco/vip/mapper/constant/MapperConstant.java

@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2025 GaoKunW
+ *
+ */
+
+package org.eco.vip.mapper.constant;
+
+
+/**
+ * @description MapperConstant
+ *
+ * @author GaoKunW
+ * @date 2025/7/4 13:37
+ */
+public class MapperConstant {
+
+    /**
+     * 用户id转名称
+     */
+    String USER_ID_TO_NAME = "user_id_to_name";
+
+    /**
+     * 用户id转账号
+     */
+    String USER_ID_TO_ACCOUNT = "user_id_to_account";
+}

+ 34 - 0
eco-common/com-mapper/src/main/java/org/eco/vip/mapper/handler/FieldMapperBeanSerializerModifier.java

@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2025 GaoKunW
+ *
+ */
+
+package org.eco.vip.mapper.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;
+
+/**
+ * @description FieldMapperBeanSerializerModifier
+ *
+ * @author GaoKunW
+ * @date 2025/7/4 13:38
+ */
+public class FieldMapperBeanSerializerModifier extends BeanSerializerModifier {
+    @Override
+    public List<BeanPropertyWriter> changeProperties(SerializationConfig config, BeanDescription beanDesc,
+                                                     List<BeanPropertyWriter> beanProperties) {
+        for (BeanPropertyWriter writer : beanProperties) {
+            // 如果序列化器为 FieldMapperHandler 的话 将 Null 值也交给他处理
+            if (writer.getSerializer() instanceof FieldMapperHandler serializer) {
+                writer.assignNullSerializer(serializer);
+            }
+        }
+        return beanProperties;
+    }
+}

+ 64 - 0
eco-common/com-mapper/src/main/java/org/eco/vip/mapper/handler/FieldMapperHandler.java

@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2025 GaoKunW
+ *
+ */
+
+package org.eco.vip.mapper.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 org.eco.vip.mapper.annotation.FieldMapper;
+import org.eco.vip.mapper.service.IFieldMapperInterface;
+import org.eco.vip.orm.utils.ReflectUtils;
+import org.eco.vip.orm.utils.StrUtils;
+
+import java.io.IOException;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * @description FieldMapperHandler
+ *
+ * @author GaoKunW
+ * @date 2025/7/4 13:24
+ */
+public class FieldMapperHandler extends JsonSerializer<Object> implements ContextualSerializer {
+
+    /**
+     * 全局实现类映射器
+     */
+    public static final Map<String, IFieldMapperInterface<?>> FIELD_MAPPER = new ConcurrentHashMap<>();
+
+    private FieldMapper fieldMapper;
+
+    @Override
+    public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
+        IFieldMapperInterface<?> trans = FIELD_MAPPER.get(fieldMapper.type());
+        if (ObjectUtil.isNotNull(trans)) {
+            // 如果映射字段不为空 则取映射字段的值
+            if (StrUtils.isNotBlank(fieldMapper.mapper())) {
+                o = ReflectUtils.invokeGetter(jsonGenerator.getCurrentValue(), fieldMapper.mapper());
+            }
+            // 如果为 null 直接写出
+            if (ObjectUtil.isNull(o)) {
+                jsonGenerator.writeNull();
+                return;
+            }
+            Object result = trans.fieldMapper(o, fieldMapper.other());
+            jsonGenerator.writeObject(result);
+        } else {
+            jsonGenerator.writeObject(o);
+        }
+    }
+
+    @Override
+    public JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty) throws JsonMappingException {
+        return null;
+    }
+}

+ 25 - 0
eco-common/com-mapper/src/main/java/org/eco/vip/mapper/service/IFieldMapperInterface.java

@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 2025 GaoKunW
+ *
+ */
+
+package org.eco.vip.mapper.service;
+
+
+/**
+ * @description IFieldMapperInterface
+ *
+ * @author GaoKunW
+ * @date 2025/7/4 13:23
+ */
+public interface IFieldMapperInterface<T> {
+
+    /**
+     * 映射
+     *
+     * @param key   需要被映射的键(不为空)
+     * @param other 其他参数
+     * @return 返回键对应的值
+     */
+    T fieldMapper(Object key, String other);
+}

+ 27 - 0
eco-common/com-mapper/src/main/java/org/eco/vip/mapper/service/UserNameMapper.java

@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2025 GaoKunW
+ *
+ */
+
+package org.eco.vip.mapper.service;
+
+
+import lombok.AllArgsConstructor;
+import org.eco.vip.mapper.annotation.FieldMapperType;
+import org.eco.vip.mapper.constant.MapperConstant;
+
+/**
+ * @description UserNameMapper
+ *
+ * @author GaoKunW
+ * @date 2025/7/4 13:41
+ */
+@AllArgsConstructor
+@FieldMapperType(type = MapperConstant.USER_ID_TO_NAME)
+public class UserNameMapper implements IFieldMapperInterface<String> {
+    @Override
+    public String mapper(String value) {
+        // 模拟数据库查询
+        return "userName_" + value;
+    }
+}