Browse Source

update 数据权限注解支持类标注

疯狂的狮子li 3 years ago
parent
commit
e6b45d4cdb

+ 1 - 1
ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataPermission.java

@@ -7,7 +7,7 @@ import java.lang.annotation.*;
  *
  * @author Lion Li
  */
-@Target(ElementType.METHOD)
+@Target({ElementType.METHOD, ElementType.TYPE})
 @Retention(RetentionPolicy.RUNTIME)
 @Documented
 public @interface DataPermission {

+ 4 - 27
ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/TestTreeMapper.java

@@ -1,16 +1,9 @@
 package com.ruoyi.demo.mapper;
 
-import com.baomidou.mybatisplus.core.conditions.Wrapper;
-import com.baomidou.mybatisplus.core.toolkit.Constants;
 import com.ruoyi.common.annotation.DataColumn;
 import com.ruoyi.common.annotation.DataPermission;
 import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus;
 import com.ruoyi.demo.domain.TestTree;
-import org.apache.ibatis.annotations.Param;
-
-import java.io.Serializable;
-import java.util.Collection;
-import java.util.List;
 
 /**
  * 测试树表Mapper接口
@@ -18,26 +11,10 @@ import java.util.List;
  * @author Lion Li
  * @date 2021-07-26
  */
+@DataPermission({
+    @DataColumn(key = "deptName", value = "dept_id"),
+    @DataColumn(key = "userName", value = "user_id")
+})
 public interface TestTreeMapper extends BaseMapperPlus<TestTree> {
 
-    @Override
-    @DataPermission({
-        @DataColumn(key = "deptName", value = "dept_id"),
-        @DataColumn(key = "userName", value = "user_id")
-    })
-    List<TestTree> selectList(@Param(Constants.WRAPPER) Wrapper<TestTree> queryWrapper);
-
-    @Override
-    @DataPermission({
-        @DataColumn(key = "deptName", value = "dept_id"),
-        @DataColumn(key = "userName", value = "user_id")
-    })
-    int updateById(@Param(Constants.ENTITY) TestTree entity);
-
-    @Override
-    @DataPermission({
-        @DataColumn(key = "deptName", value = "dept_id"),
-        @DataColumn(key = "userName", value = "user_id")
-    })
-    int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
 }

+ 11 - 2
ruoyi-framework/src/main/java/com/ruoyi/framework/handler/PlusDataPermissionHandler.java

@@ -17,6 +17,7 @@ import com.ruoyi.common.utils.spring.SpringUtils;
 import lombok.extern.slf4j.Slf4j;
 import net.sf.jsqlparser.JSQLParserException;
 import net.sf.jsqlparser.expression.Expression;
+import net.sf.jsqlparser.expression.Parenthesis;
 import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
 import net.sf.jsqlparser.parser.CCJSqlParserUtil;
 import org.springframework.context.expression.BeanFactoryResolver;
@@ -60,10 +61,12 @@ public class PlusDataPermissionHandler {
         }
         try {
             Expression expression = CCJSqlParserUtil.parseExpression(dataFilterSql);
+            // 数据权限使用单独的括号 防止与其他条件冲突
+            Parenthesis parenthesis = new Parenthesis(expression);
             if (ObjectUtil.isNotNull(where)) {
-                return new AndExpression(where, expression);
+                return new AndExpression(where, parenthesis);
             } else {
-                return expression;
+                return parenthesis;
             }
         } catch (JSQLParserException e) {
             throw new ServiceException("数据权限解析异常 => " + e.getMessage());
@@ -126,12 +129,18 @@ public class PlusDataPermissionHandler {
         List<Method> methods = Arrays.stream(ClassUtil.getDeclaredMethods(clazz))
             .filter(method -> method.getName().equals(methodName)).collect(Collectors.toList());
         DataPermission dataPermission;
+        // 获取方法注解
         for (Method method : methods) {
             if (AnnotationUtil.hasAnnotation(method, DataPermission.class)) {
                 dataPermission = AnnotationUtil.getAnnotation(method, DataPermission.class);
                 return dataPermission.value();
             }
         }
+        // 获取类注解
+        if (AnnotationUtil.hasAnnotation(clazz, DataPermission.class)) {
+            dataPermission = AnnotationUtil.getAnnotation(clazz, DataPermission.class);
+            return dataPermission.value();
+        }
         return null;
     }
 }