diff --git a/.idea/misc.xml b/.idea/misc.xml index 540d695..82dbec8 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -7,11 +7,6 @@ - diff --git a/sky-server/src/main/java/com/sky/Aspect/AutoFillAspect.java b/sky-server/src/main/java/com/sky/Aspect/AutoFillAspect.java new file mode 100644 index 0000000..989e38a --- /dev/null +++ b/sky-server/src/main/java/com/sky/Aspect/AutoFillAspect.java @@ -0,0 +1,74 @@ +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.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.InvocationTargetException; +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) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { + log.info("开始进行公共字段的自动填充..."); + + //获取当前被拦截的方法上的数据库操作类型 + MethodSignature signature = (MethodSignature) joinPoint.getSignature();//方法签名对象 + AutoFill autoFill = signature.getMethod().getAnnotation(AutoFill.class);//获取方法上的注解对象 + OperationType operationType = autoFill.value();//获取数据库操作类型 + //获取当前被拦截的方法的参数 --实体对象 + Object[] args = joinPoint.getArgs(); + if(args == null || args.length ==0){ + return; + } + + Object entity = args[0]; + + //准备赋值数据 + LocalDateTime now = LocalDateTime.now(); + Long currentId = BaseContext.getCurrentId(); + //根据当前不同操作类型,为对应的属性通过反射赋值 + if(operationType == OperationType.INSERT){ + Method setCreateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_TIME, LocalDateTime.class); + Method setCreateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_USER, Long.class); + Method setUpdateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class); + Method setUpdateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class); + + //通过反射为对象属性赋值 + setCreateTime.invoke(entity,now); + setCreateUser.invoke(entity,currentId); + setUpdateTime.invoke(entity,now); + setUpdateUser.invoke(entity,currentId); + }else if(operationType == OperationType.UPDATE){ + Method setUpdateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class); + Method setUpdateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class); + setUpdateTime.invoke(entity,now); + setUpdateUser.invoke(entity,currentId); + } + } +} diff --git a/sky-server/src/main/java/com/sky/annotation/AutoFill.java b/sky-server/src/main/java/com/sky/annotation/AutoFill.java new file mode 100644 index 0000000..8f320e7 --- /dev/null +++ b/sky-server/src/main/java/com/sky/annotation/AutoFill.java @@ -0,0 +1,20 @@ +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(); +}