From 8041ced02d3dbe4fbaea8f928356c43fbd9410a1 Mon Sep 17 00:00:00 2001
From: 疯狂的狮子li <15040126243@163.com>
Date: 星期四, 16 十二月 2021 13:58:52 +0800
Subject: [PATCH] update 数据权限增加全局缓存 提高处理性能 减少重复处理
---
ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/PlusDataPermissionInterceptor.java | 6 ++++++
ruoyi-framework/src/main/java/com/ruoyi/framework/handler/PlusDataPermissionHandler.java | 44 ++++++++++++++++++++++++++++++++++++++++++--
2 files changed, 48 insertions(+), 2 deletions(-)
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/handler/PlusDataPermissionHandler.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/handler/PlusDataPermissionHandler.java
index 5bcb868..c1ac605 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/handler/PlusDataPermissionHandler.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/handler/PlusDataPermissionHandler.java
@@ -1,6 +1,7 @@
package com.ruoyi.framework.handler;
import cn.hutool.core.annotation.AnnotationUtil;
+import cn.hutool.core.collection.ConcurrentHashSet;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ClassUtil;
import cn.hutool.core.util.ObjectUtil;
@@ -31,6 +32,9 @@
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
/**
@@ -41,13 +45,32 @@
@Slf4j
public class PlusDataPermissionHandler {
+ /**
+ * 鏂规硶鎴栫被 涓� 娉ㄨВ鐨勬槧灏勫叧绯荤紦瀛�
+ */
+ private final Map<Method, DataPermission> methodCacheMap = new ConcurrentHashMap<>();
+ private final Map<Class<?>, DataPermission> classCacheMap = new ConcurrentHashMap<>();
+
+ /**
+ * 鏃犳晥娉ㄨВ鏂规硶缂撳瓨鐢ㄤ簬蹇�熻繑鍥�
+ */
+ private final Set<String> inavlidCacheSet = new ConcurrentHashSet<>();
+
+ /**
+ * spel 瑙f瀽鍣�
+ */
private final ExpressionParser parser = new SpelExpressionParser();
private final ParserContext parserContext = new TemplateParserContext();
+ /**
+ * bean瑙f瀽鍣� 鐢ㄤ簬澶勭悊 spel 琛ㄨ揪寮忎腑瀵� bean 鐨勮皟鐢�
+ */
private final BeanResolver beanResolver = new BeanFactoryResolver(SpringUtils.getBeanFactory());
+
public Expression getSqlSegment(Expression where, String mappedStatementId, boolean isSelect) {
DataColumn[] dataColumns = findAnnotation(mappedStatementId);
if (ArrayUtil.isEmpty(dataColumns)) {
+ inavlidCacheSet.add(mappedStatementId);
return where;
}
SysUser currentUser = SpringUtils.getBean(UserService.class).selectUserById(SecurityUtils.getUserId());
@@ -131,16 +154,33 @@
DataPermission dataPermission;
// 鑾峰彇鏂规硶娉ㄨВ
for (Method method : methods) {
- if (AnnotationUtil.hasAnnotation(method, DataPermission.class)) {
- dataPermission = AnnotationUtil.getAnnotation(method, DataPermission.class);
+ dataPermission = methodCacheMap.get(method);
+ if (ObjectUtil.isNotNull(dataPermission)) {
return dataPermission.value();
}
+ if (AnnotationUtil.hasAnnotation(method, DataPermission.class)) {
+ dataPermission = AnnotationUtil.getAnnotation(method, DataPermission.class);
+ methodCacheMap.put(method, dataPermission);
+ return dataPermission.value();
+ }
+ }
+ dataPermission = classCacheMap.get(clazz);
+ if (ObjectUtil.isNotNull(dataPermission)) {
+ return dataPermission.value();
}
// 鑾峰彇绫绘敞瑙�
if (AnnotationUtil.hasAnnotation(clazz, DataPermission.class)) {
dataPermission = AnnotationUtil.getAnnotation(clazz, DataPermission.class);
+ classCacheMap.put(clazz, dataPermission);
return dataPermission.value();
}
return null;
}
+
+ /**
+ * 鏄惁涓烘棤鏁堟柟娉� 鏃犳暟鎹潈闄�
+ */
+ public boolean isInvalid(String mappedStatementId) {
+ return inavlidCacheSet.contains(mappedStatementId);
+ }
}
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/PlusDataPermissionInterceptor.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/PlusDataPermissionInterceptor.java
index a1d90ff..6f4d4b7 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/PlusDataPermissionInterceptor.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/PlusDataPermissionInterceptor.java
@@ -30,9 +30,15 @@
@Override
public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {
+ // 妫�鏌ュ拷鐣ユ敞瑙�
if (InterceptorIgnoreHelper.willIgnoreDataPermission(ms.getId())) {
return;
}
+ // 妫�鏌ユ槸鍚︽棤鏁� 鏃犳暟鎹潈闄愭敞瑙�
+ if (dataPermissionHandler.isInvalid(ms.getId())) {
+ return;
+ }
+ // 瑙f瀽 sql 鍒嗛厤瀵瑰簲鏂规硶
PluginUtils.MPBoundSql mpBs = PluginUtils.mpBoundSql(boundSql);
mpBs.sql(parserSingle(mpBs.sql(), ms.getId()));
}
--
Gitblit v1.9.3