jeecg-boot改造,新增注解数据权限规则字段支持指定表名

原生jeecg-boot多表联查配置数据权限时,有可能权限字段重复。

报错信息如下:

### Error querying database.  Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'sys_org_code' in order where is ambiguous

网上查了一下没找到解决方案,只好顺着权限控制的源码理看看怎么解决。

QueryGenerator的installMplus方法实现了数据权限匹配,匹配权限规则是直接读取的Bean字段名。我想,能不能改造成通过反射来读取注解的值,覆盖掉原来的匹配规则,就可以解决字段重复了。

原版代码

//数据权限查询
if(ruleMap.containsKey(name)) {
    addRuleToQueryWrapper(ruleMap.get(name), name, origDescriptors[i].getPropertyType(), queryWrapper);
}

新建个注解

package org.jeecg.common.aspect.annotation;


import java.lang.annotation.*;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface AliasRuleField {
    String value() default "";
}

将原来的代码改成

//数据权限查询
                String tableFieldId = null;
                try {
                    Field f = searchObj.getClass().getDeclaredField(name);
                    AliasRuleField aliasRuleField = f.getAnnotation(AliasRuleField.class);
                    if (aliasRuleField != null)
                        tableFieldId = aliasRuleField.value();
                } catch (NoSuchFieldException ignored) { }
                if (StringUtils.isEmpty(tableFieldId)){
                    tableFieldId = name;
                }
                if(ruleMap.containsKey(tableFieldId)) {
                    addRuleToQueryWrapper(ruleMap.get(tableFieldId), tableFieldId, origDescriptors[i].getPropertyType(), queryWrapper);
                }

同时在实体类重复的字段上加个注解

    @AliasRuleField(value = "teaching_user_work.sysOrgCode")
    private String sysOrgCode;

配置数据规则字段时sysOrgCode改为teaching_user_work.sysOrgCode

这样,遇到重复的字段,只需要加个AliasRuleField注解就可以解决了!

============

还有一种比较简单的做法
数据权限直接使用自定义SQL
上面的就可以写为:

sys_depart.org_code like '%#{sys_org_code}%

发表评论

[/0o0] [..^v^..] [0_0] [T.T] [=3-❤] [❤.❤] [^v^] [-.0] [!- -] [=x=] [→_→] [><] 更多 »
昵称

抢沙发~