Explorar o código

公共字段自动填充开发

潘海瑞 hai 10 meses
pai
achega
1a7a674905

+ 19 - 0
sky-server/src/main/java/com/sky/annotation/AutoFill.java

@@ -0,0 +1,19 @@
+package com.sky.annotation;
+
+import com.sky.enumeration.OperationType;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 自定义注解,用于标识某个方法需要进行功能字段的自动填充处理
+ */
+
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface AutoFill {
+    // 枚举,数据库操作类型:UPDATE,INSERT
+    OperationType value();
+}

+ 87 - 0
sky-server/src/main/java/com/sky/aspect/AutoFillAspect.java

@@ -0,0 +1,87 @@
+package com.sky.aspect;
+
+import com.sky.annotation.AutoFill;
+import com.sky.constant.AutoFillConstant;
+import com.sky.context.BaseContext;
+import com.sky.enumeration.OperationType;
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.Signature;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.stereotype.Component;
+
+import java.lang.reflect.Method;
+import java.time.LocalDateTime;
+
+/**
+ * 自定义切面,实现公共字段自动填充处理逻辑
+ */
+@Aspect
+@Component
+@Slf4j
+public class AutoFillAspect {
+    /**
+     * 切入点
+     */
+    @Pointcut("execution(* com.sky.mapper.*.*(..)) && @annotation(com.sky.annotation.AutoFill)")
+    public void autoFillPointCut(){}
+
+    /**
+     * 前置通知,在通知中为公共字段赋值
+     */
+    @Before("autoFillPointCut()")
+    public void autoFill(JoinPoint joinPoint){
+        log.info("开始进行公共字段的填充...");
+
+        // 获取到当前被拦截到的方法上的数据库操作类型
+        MethodSignature signature = (MethodSignature) joinPoint.getSignature();//向下转型成MethodSignature + 方法签名对象
+        AutoFill autoFill = signature.getMethod().getAnnotation(AutoFill.class);//获得方法山上的注解对象
+        OperationType operationType = autoFill.value();//获取数据库操作类型
+
+        // 获取到当前被拦截的方法的参数--实体对象
+        Object[] args = joinPoint.getArgs(); //获取到所有带有@AutoFill的实体对象
+        if(args == null || args.length == 0){
+            return;
+        }
+        Object entity = args[0];//用Object类来接受第一个实体对象
+
+        // 准备赋值的数据
+        LocalDateTime now = LocalDateTime.now();
+        Long currentId = BaseContext.getCurrentId();
+
+        // 根据当前不同的操作类型,为对应的属性通过反射来赋值
+        if(operationType == OperationType.INSERT){
+            //为四个公共字段赋值
+            try {
+                Method setCreateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_TIME, LocalDateTime.class);
+                Method setCreateUser = entity.getClass().getDeclaredMethod("setCreateUser", Long.class);
+                Method setUpdateTime = entity.getClass().getDeclaredMethod("setUpdateTime", LocalDateTime.class);
+                Method setUpdateUser = entity.getClass().getDeclaredMethod("setUpdateUser", Long.class);
+
+                // 通过反射为对象属性赋值
+                setCreateTime.invoke(entity,now);
+                setCreateUser.invoke(entity,currentId);
+                setUpdateTime.invoke(entity,now);
+                setUpdateUser.invoke(entity,currentId);
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+        }else if(operationType == OperationType.UPDATE){
+            // 为两个公共字段赋值
+            try {
+                Method setUpdateTime = entity.getClass().getDeclaredMethod("setUpdateTime", LocalDateTime.class);
+                Method setUpdateUser = entity.getClass().getDeclaredMethod("setUpdateUser", Long.class);
+
+                // 通过反射为对象属性赋值
+                setUpdateTime.invoke(entity,now);
+                setUpdateUser.invoke(entity,currentId);
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+        }
+
+    }
+}

+ 4 - 0
sky-server/src/main/java/com/sky/mapper/CategoryMapper.java

@@ -1,9 +1,11 @@
 package com.sky.mapper;
 
 import com.github.pagehelper.Page;
+import com.sky.annotation.AutoFill;
 import com.sky.dto.CategoryDTO;
 import com.sky.dto.CategoryPageQueryDTO;
 import com.sky.entity.Category;
+import com.sky.enumeration.OperationType;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Select;
 
@@ -19,6 +21,7 @@ public interface CategoryMapper {
     @Select("insert into category(type, name, sort, status, create_time, update_time, create_user, update_user) " +
             "values" +
             "(#{type},#{name},#{sort},#{status},#{createTime},#{updateTime},#{createUser},#{updateUser})")
+    @AutoFill(value = OperationType.INSERT)
     void insert(Category category);
 
     /**
@@ -39,6 +42,7 @@ public interface CategoryMapper {
      * 修改分类
      * @param category
      */
+    @AutoFill(value = OperationType.UPDATE)
     void Update(Category category);
 
     List<Category> list(Integer type);

+ 4 - 0
sky-server/src/main/java/com/sky/mapper/EmployeeMapper.java

@@ -1,8 +1,10 @@
 package com.sky.mapper;
 
 import com.github.pagehelper.Page;
+import com.sky.annotation.AutoFill;
 import com.sky.dto.EmployeePageQueryDTO;
 import com.sky.entity.Employee;
+import com.sky.enumeration.OperationType;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Select;
 
@@ -27,6 +29,7 @@ public interface EmployeeMapper {
             "values" +
             "(#{name},#{username},#{password},#{phone},#{sex},#{idNumber},#{createTime},#{updateTime},#{createUser}," +
             "#{updateUser},#{status})")
+    @AutoFill(value = OperationType.INSERT)
     void insert(Employee employee);
 
     /**
@@ -40,6 +43,7 @@ public interface EmployeeMapper {
      * 根据主键动态修改属性
      * @param employee
      */
+    @AutoFill(value = OperationType.UPDATE)
     void update(Employee employee);
 
     /**

+ 6 - 6
sky-server/src/main/java/com/sky/service/impl/CategoryServiceImpl.java

@@ -47,10 +47,10 @@ public class CategoryServiceImpl implements CategoryService {
         category.setStatus(StatusConstant.DISABLE);
 
         // 设置创建时间、修改时间、创建人、修改人
-        category.setCreateTime(LocalDateTime.now());
+        /*category.setCreateTime(LocalDateTime.now());
         category.setUpdateTime(LocalDateTime.now());
         category.setCreateUser(BaseContext.getCurrentId());
-        category.setUpdateUser(BaseContext.getCurrentId());
+        category.setUpdateUser(BaseContext.getCurrentId());*/
 
         categoryMapper.insert(category);
     }
@@ -94,8 +94,8 @@ public class CategoryServiceImpl implements CategoryService {
 
         Category category = new Category(); // 创建一个新的类
         BeanUtils.copyProperties(categoryDTO,category); // 将DTO的信息复制到新类
-        category.setUpdateTime(LocalDateTime.now()); // 获取当前时间
-        category.setUpdateUser(BaseContext.getCurrentId()); // 获取修改人id
+        //category.setUpdateTime(LocalDateTime.now()); // 获取当前时间
+        //category.setUpdateUser(BaseContext.getCurrentId()); // 获取修改人id
 
         categoryMapper.Update(category);
     }
@@ -109,8 +109,8 @@ public class CategoryServiceImpl implements CategoryService {
         Category category = Category.builder()
                 .id(id)
                 .status(status)
-                .updateTime(LocalDateTime.now())
-                .updateUser(BaseContext.getCurrentId())
+                //.updateTime(LocalDateTime.now())
+                //.updateUser(BaseContext.getCurrentId())
                 .build();
         categoryMapper.Update(category);
     }