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..225e2fb --- /dev/null +++ b/sky-server/src/main/java/com/sky/annotation/AutoFill.java @@ -0,0 +1,18 @@ +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 { + //指定数据库操作类型 + OperationType value(); +} 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..21deec4 --- /dev/null +++ b/sky-server/src/main/java/com/sky/aspect/AutoFillAspect.java @@ -0,0 +1,86 @@ +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.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) { + 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) { + try { + 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); + } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { + throw new RuntimeException(e); + } + }else if (operationType == OperationType.UPDATE) { + try { + 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); + } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { + throw new RuntimeException(e); + } + } + } +}