代码拉取完成,页面将自动刷新
同步操作将从 weihuazhou/wonder-server 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
优点:传统的5种权限:全部数据权限、本部门数据权限、本部门及下属部门数据、仅本人数据、自定义数据权限,其实再怎么自定义也是针对人和部门的纬度来说的,如果需求是:角色A只能订单表的销售数量>=100的订单,角色B只能订单表的销售数量<100的订单,恐怕实现不了。本项目针对这种需求就设计得更灵活了一点,仅需要针对不同的接口可视化添加一些配置即可以针对数据库表不同字段来控制数据权限。
缺点:如果是控制比较复杂的查询,需要在项目代码中预先写好相关的方法来提供使用。执行时间慢那么一点,但也只是对有限制的接口来说,还是可以接受的。
@DataScope("order-list")
@Override
public List<OrderDto> list(OrderQuery query) {
LambdaQueryWrapper<Order> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(StrUtil.isNotBlank(query.getReceiverName()), Order::getReceiverName, query.getReceiverName());
...
List<Order> list = list(queryWrapper);
return afterQueryHandler(list);
}
@Override
public List<OrderDto> list(OrderQuery query, @DataScope("order-list") DataScopeInfo dataScopeInfo) {
QueryWrapper<Order> queryWrapper = new QueryWrapper<>();
// 或者自行处理
CommonUtil.handleQueryWrapper(queryWrapper, dataScopeInfo);
queryWrapper.eq(StrUtil.isNotBlank(query.getReceiverName()), "receiver_name", query.getReceiverName());
...
List<Order> list = list(queryWrapper);
return afterQueryHandler(list);
}
service
方法:由开发者根据方法返回值自行处理。(可传递到xml中拼接)
// 这样比方法2多出注入一步
@Autowired
private MarkService dataScopeService;
@Override
public List<OrderDto> list(OrderQuery query) {
DataScopeInfo dataScopeInfo = dataScopeService.execRuleByName("order-list");
QueryWrapper<Order> queryWrapper = new QueryWrapper<>();
// 或者自行处理
CommonUtil.handleQueryWrapper(queryWrapper, dataScopeInfo);
queryWrapper.eq(StrUtil.isNotBlank(query.getReceiverName()), "receiver_name", query.getReceiverName());
...
List<Order> list = list(queryWrapper);
return afterQueryHandler(list);
}
拥有多个角色的时候,怎么知道该取哪条规则?
优先级
字段,每个用户拥有的角色中,最大的优先级只能同时有一个。取规则的时候就取优先级最大的角色关联的规则去处理即可。header
传递所选角色id
,部门同理
id
、update_by
、create_by
、update_time
、create_time
等每个表都会存在的字段。但是如果遇到某些每个表特有字段例如订单表有number
、汽车表有color
字段时,怎么处理?tableName
,用来标识该条规则作用于哪个表,为空就是作用于所有表。例如@DataScope(value="sn1", tableName="order")
将作用于order
表。(这样的话,sn1
的存在是不是多余了,直接查询用户优先级最高的角色有没有关联order
这张表的规则限制。)如果想限制同一张表的多个字段怎么办?比如某条规则限制order
表查询付款金额大于100元 && 已经完成的订单时怎么办?
值
的情况是否满足当前需求。如需要限制两个及以上字段时,使用提供类型为方法
来处理,此时配置记录中字段column_name
为id
,配置对应的无参或有参方法,返回idList
去IN
,就能满足。例如问题中可一执行一个方法返回 付款金额大于100元 && 已经完成的订单 的idList
去order
表拼接id IN( idList )
就能满足 column_name
可以设计成分号隔开的类型,同时新增一个连接条件
id | column_name | column_splice_type | value | expression | 其他属性不变 |
---|---|---|---|---|---|
number;color | AND;OR | 100;黑色 | GE;EQ |
这条记录代表着需要拼接SQL语句:xxx AND number >= 100 OR color = '黑色'
java.lang.NoSuchFieldException: id
,其他接口为出现此情况按钮
时,后端在处理时设置inFrame = true
,因为按钮也可以表示打开一个新的tab页,(是不是一定是框架内打开,待考虑)controller
、service
、mapper
...EntityQuery
查询时,怎么知道某个字段的匹配方法是什么? eq? like? ne? 方案1:自定义注解@Equal、@Like、@In,然后反射读取做对应处理EntityQuery
,还有另外一种方案:通过自定义注解@Query
标记Dto
对象中可以查询的字段,page
接口、list
接口读取这个注解就可以了between
的值可以用特定符号分开 1,9。in同理@Query
直接且expression
为BETWEEN
时的由运行时校验改成编译时校验,可提高执行速度。目前时运行时校验,其实只要在编译时校验一次够了。
@Query(column = "create_time", expression = ExpressionEnum.BETWEEN, left = true)
@ApiModelProperty("开始时间")
private Date startTime;
@Query(column = "create_time", expression = ExpressionEnum.BETWEEN, left = false)
@ApiModelProperty("结束时间")
private Date endTime;
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。