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/handler/PlusDataPermissionHandler.java |   44 ++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 42 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);
+    }
 }

--
Gitblit v1.9.3