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 0000000000000000000000000000000000000000..f86a9503191255d4ecd397e98773f6895ce8dd4f --- /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 3edc241ad5ed72baddf2d240be1b586652d8beba..cf1f3dac0a3223e1b47b2311ffaf372a8d1dda26 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 0000000000000000000000000000000000000000..15088e295a1bd0e43c08093062bf5e422f2586d6 --- /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 ff6727db9e70b64bd0b5219ff17eff7c717d2a5b..f6762b0baa5bfcf50a80a67d714616a98f07da68 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 c18b21b671d17a8926d42ed9582e71015b153084..cfe7dc651cd0187a5cbac49e98eaf0c64f0c1eb9 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 b4e34a21433a7eb3132fd8c7ba4ea324bdaf296a..b66d40faf8954cf65ca98b9cff237f853fcea455 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 e6c99000ff4ee9b697e0930599b60e4158b07c37..384aa9e693d68dafa9796a6e636a6b1699de14a9 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);