From 661a7fb8c044412889befaba8d0ade359919cb19 Mon Sep 17 00:00:00 2001
From: LiShu <2945621619@qq.com>
Date: Fri, 29 Nov 2024 16:29:20 +0800
Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=8C=85=E7=BB=93=E6=9E=84?=
=?UTF-8?q?=EF=BC=8C=E8=87=AA=E5=AE=9A=E4=B9=89=E6=B3=A8=E8=A7=A3=E5=92=8C?=
=?UTF-8?q?=E5=88=87=E9=9D=A2=E7=B1=BB=EF=BC=8C=E7=94=A8=E4=BA=8E=E8=87=AA?=
=?UTF-8?q?=E5=8A=A8=E5=A4=84=E7=90=86=E6=95=B0=E6=8D=AE=E5=BA=93=E6=8F=92?=
=?UTF-8?q?=E5=85=A5=E3=80=81=E6=9B=B4=E6=96=B0=E6=95=B0=E6=8D=AE=E6=97=B6?=
=?UTF-8?q?=E5=88=9B=E5=BB=BA=E6=97=B6=E9=97=B4=E5=92=8C=E6=9B=B4=E6=96=B0?=
=?UTF-8?q?=E6=97=B6=E9=97=B4=E5=AD=97=E6=AE=B5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.idea/misc.xml | 5 --
.../java/com/sky/Aspect/AutoFillAspect.java | 74 +++++++++++++++++++
.../java/com/sky/annotation/AutoFill.java | 20 +++++
3 files changed, 94 insertions(+), 5 deletions(-)
create mode 100644 sky-server/src/main/java/com/sky/Aspect/AutoFillAspect.java
create mode 100644 sky-server/src/main/java/com/sky/annotation/AutoFill.java
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();
+}