From 3aa98274f92fa6ca078465484fce03309773fda4 Mon Sep 17 00:00:00 2001 From: loser <1500162516@qq.com> Date: Wed, 5 Jun 2024 21:31:47 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=80=BB=E8=BE=91=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E5=BF=BD=E7=95=A5=E6=B3=A8=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mongo/annotation/logice/IgnoreLogic.java | 14 +++++++ .../mongo/config/MongoPlusConfiguration.java | 13 +++++++ .../mongo/logic/MongoLogicIgnoreAspect.java | 37 +++++++++++++++++++ .../global/CollectionLogicDeleteCache.java | 18 +++++++++ .../CollectionLogiceInterceptor.java | 16 ++++++++ .../interceptor/LogicAutoFillInterceptor.java | 7 ++++ .../logic/replacer/LogicRemoveReplacer.java | 3 ++ 7 files changed, 108 insertions(+) create mode 100644 mongo-plus-annotation/src/main/java/com/anwen/mongo/annotation/logice/IgnoreLogic.java create mode 100644 mongo-plus-boot-starter/src/main/java/com/anwen/mongo/logic/MongoLogicIgnoreAspect.java diff --git a/mongo-plus-annotation/src/main/java/com/anwen/mongo/annotation/logice/IgnoreLogic.java b/mongo-plus-annotation/src/main/java/com/anwen/mongo/annotation/logice/IgnoreLogic.java new file mode 100644 index 0000000..f86a950 --- /dev/null +++ b/mongo-plus-annotation/src/main/java/com/anwen/mongo/annotation/logice/IgnoreLogic.java @@ -0,0 +1,14 @@ +package com.anwen.mongo.annotation.logice; + +import java.lang.annotation.*; + + +@Target({ElementType.METHOD}) +//运行时注解 +@Retention(RetentionPolicy.RUNTIME) +//表明这个注解应该被 javadoc工具记录 +//生成文档 +@Documented +public @interface IgnoreLogic { + +} diff --git a/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/MongoPlusConfiguration.java b/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/MongoPlusConfiguration.java index 3edc241..cf1f3da 100644 --- a/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/MongoPlusConfiguration.java +++ b/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/config/MongoPlusConfiguration.java @@ -8,6 +8,7 @@ import com.anwen.mongo.convert.CollectionNameConvert; import com.anwen.mongo.datasource.MongoDataSourceAspect; import com.anwen.mongo.factory.MongoClientFactory; import com.anwen.mongo.listener.BaseListener; +import com.anwen.mongo.logic.MongoLogicIgnoreAspect; import com.anwen.mongo.manager.MongoPlusClient; import com.anwen.mongo.mapper.BaseMapper; import com.anwen.mongo.mapper.DefaultBaseMapperImpl; @@ -247,4 +248,16 @@ public class MongoPlusConfiguration { return new MongoDataSourceAspect(); } + /** + * 忽略逻辑删除 + * + * @return {@link MongoLogicIgnoreAspect} + * @author loser + */ + @Bean("mongoLogicIgnoreAspect") + @ConditionalOnMissingBean + public MongoLogicIgnoreAspect mongoLogicIgnoreAspect() { + return new MongoLogicIgnoreAspect(); + } + } diff --git a/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/logic/MongoLogicIgnoreAspect.java b/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/logic/MongoLogicIgnoreAspect.java new file mode 100644 index 0000000..15088e2 --- /dev/null +++ b/mongo-plus-boot-starter/src/main/java/com/anwen/mongo/logic/MongoLogicIgnoreAspect.java @@ -0,0 +1,37 @@ +package com.anwen.mongo.logic; + +import com.anwen.mongo.annotation.logice.IgnoreLogic; +import com.anwen.mongo.cache.global.CollectionLogicDeleteCache; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.springframework.core.annotation.Order; + +/** + * 忽略逻辑删除 + * + * @author loser + */ +@Aspect +@Order(0) +public class MongoLogicIgnoreAspect { + + @Pointcut("@annotation(com.anwen.mongo.annotation.logice.IgnoreLogic)") + private void markIgnoreLogic() { + } + + @Around(value = "markIgnoreLogic() && @annotation(ignoreLogic)") + public Object ignoreLogic(ProceedingJoinPoint joinPoint, IgnoreLogic ignoreLogic) throws Throwable { + + try { + CollectionLogicDeleteCache.setLogicIgnore(true); + return joinPoint.proceed(); + } finally { + CollectionLogicDeleteCache.clear(); + } + + } + + +} diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/cache/global/CollectionLogicDeleteCache.java b/mongo-plus-core/src/main/java/com/anwen/mongo/cache/global/CollectionLogicDeleteCache.java index ff6727d..f6762b0 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/cache/global/CollectionLogicDeleteCache.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/cache/global/CollectionLogicDeleteCache.java @@ -5,6 +5,7 @@ import com.anwen.mongo.model.LogicProperty; import java.util.HashMap; import java.util.Map; +import java.util.Objects; import java.util.concurrent.ConcurrentHashMap; /** @@ -15,6 +16,8 @@ import java.util.concurrent.ConcurrentHashMap; */ public class CollectionLogicDeleteCache { + private static final ThreadLocal logicIgnore = new InheritableThreadLocal<>(); + /** * 是否开启逻辑删除功能 */ @@ -46,4 +49,19 @@ public class CollectionLogicDeleteCache { fullNameMap.put(fullName, clazz); } } + + public static void setLogicIgnore(boolean ignore) { + logicIgnore.set(ignore); + } + + public static boolean getLogicIgnore() { + Boolean ignore = logicIgnore.get(); + return Objects.nonNull(ignore) && ignore; + + } + + public static void clear() { + logicIgnore.remove(); + } + } diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/logic/interceptor/CollectionLogiceInterceptor.java b/mongo-plus-core/src/main/java/com/anwen/mongo/logic/interceptor/CollectionLogiceInterceptor.java index c18b21b..cfe7dc6 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/logic/interceptor/CollectionLogiceInterceptor.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/logic/interceptor/CollectionLogiceInterceptor.java @@ -1,5 +1,6 @@ package com.anwen.mongo.logic.interceptor; +import com.anwen.mongo.cache.global.CollectionLogicDeleteCache; import com.anwen.mongo.interceptor.Interceptor; import com.anwen.mongo.logic.LogicDeleteHandler; import com.anwen.mongo.model.MutablePair; @@ -27,6 +28,9 @@ public class CollectionLogiceInterceptor implements Interceptor { @Override public Bson executeRemove(Bson filter, MongoCollection collection) { + if (CollectionLogicDeleteCache.getLogicIgnore()) { + return filter; + } Class clazz = LogicDeleteHandler.getBeanClass(collection); if (LogicDeleteHandler.close() || Objects.isNull(clazz)) { return filter; @@ -38,6 +42,9 @@ public class CollectionLogiceInterceptor implements Interceptor { @Override public MutablePair executeUpdate(Bson queryBasic, Bson updateBasic, MongoCollection collection) { + if (CollectionLogicDeleteCache.getLogicIgnore()) { + return new MutablePair<>(queryBasic, updateBasic); + } Class clazz = LogicDeleteHandler.getBeanClass(collection); if (LogicDeleteHandler.close() || Objects.isNull(clazz)) { return new MutablePair<>(queryBasic, updateBasic); @@ -50,6 +57,9 @@ public class CollectionLogiceInterceptor implements Interceptor { @Override public QueryParam executeQuery(Bson queryBasic, BasicDBObject projectionList, BasicDBObject sortCond, MongoCollection collection) { + if (CollectionLogicDeleteCache.getLogicIgnore()) { + return new QueryParam(queryBasic, projectionList, sortCond); + } Class clazz = LogicDeleteHandler.getBeanClass(collection); if (LogicDeleteHandler.close() || Objects.isNull(clazz)) { return new QueryParam(queryBasic, projectionList, sortCond); @@ -62,6 +72,9 @@ public class CollectionLogiceInterceptor implements Interceptor { @Override public MutablePair executeCount(BasicDBObject queryBasic, CountOptions countOptions, MongoCollection collection) { + if (CollectionLogicDeleteCache.getLogicIgnore()) { + return new MutablePair<>(queryBasic, countOptions); + } Class clazz = LogicDeleteHandler.getBeanClass(collection); if (LogicDeleteHandler.close() || Objects.isNull(clazz)) { return new MutablePair<>(queryBasic, countOptions); @@ -75,6 +88,9 @@ public class CollectionLogiceInterceptor implements Interceptor { @SuppressWarnings("all") public List> executeBulkWrite(List> writeModelList, MongoCollection collection) { + if (CollectionLogicDeleteCache.getLogicIgnore()) { + return writeModelList; + } Class clazz = LogicDeleteHandler.getBeanClass(collection); if (LogicDeleteHandler.close() || Objects.isNull(clazz)) { return writeModelList; diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/logic/interceptor/LogicAutoFillInterceptor.java b/mongo-plus-core/src/main/java/com/anwen/mongo/logic/interceptor/LogicAutoFillInterceptor.java index b4e34a2..b66d40f 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/logic/interceptor/LogicAutoFillInterceptor.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/logic/interceptor/LogicAutoFillInterceptor.java @@ -1,5 +1,6 @@ package com.anwen.mongo.logic.interceptor; +import com.anwen.mongo.cache.global.CollectionLogicDeleteCache; import com.anwen.mongo.interceptor.Interceptor; import com.anwen.mongo.logic.LogicDeleteHandler; import com.anwen.mongo.model.LogicDeleteResult; @@ -22,6 +23,9 @@ public class LogicAutoFillInterceptor implements Interceptor { @Override public List executeSave(List documentList, MongoCollection collection) { + if (CollectionLogicDeleteCache.getLogicIgnore()) { + return documentList; + } Class clazz = LogicDeleteHandler.getBeanClass(collection); if (Objects.isNull(clazz)) { return documentList; @@ -41,6 +45,9 @@ public class LogicAutoFillInterceptor implements Interceptor { @Override public List> executeBulkWrite(List> writeModelList, MongoCollection collection) { + if (CollectionLogicDeleteCache.getLogicIgnore()) { + return writeModelList; + } Class clazz = LogicDeleteHandler.getBeanClass(collection); if (Objects.isNull(clazz)) { return writeModelList; diff --git a/mongo-plus-core/src/main/java/com/anwen/mongo/logic/replacer/LogicRemoveReplacer.java b/mongo-plus-core/src/main/java/com/anwen/mongo/logic/replacer/LogicRemoveReplacer.java index e6c9900..384aa9e 100644 --- a/mongo-plus-core/src/main/java/com/anwen/mongo/logic/replacer/LogicRemoveReplacer.java +++ b/mongo-plus-core/src/main/java/com/anwen/mongo/logic/replacer/LogicRemoveReplacer.java @@ -28,6 +28,9 @@ public class LogicRemoveReplacer implements Replacer { @Override public Object invoke(Object proxy, Object target, Method method, Object[] args) throws Throwable { + if (CollectionLogicDeleteCache.getLogicIgnore()) { + return method.invoke(target, args); + } Class clazz = LogicDeleteHandler.getBeanClass((MongoCollection) args[1]); if (Objects.isNull(clazz)) { return method.invoke(target, args); -- Gitee