# 一、背景与问题
1024实验室下有三个销售部,分别是销售一部、销售二部、销售三部,卓主任要求销售各部门只能看到各部门自己的订单数据,以防数据外泄恶意竞争。
# 二 、架构与思想
DataScopeTypeEnum
新增ORDER
枚举项- 对应订单查询方法(Dao接口方法)添加数据范围注解
@DataScope(dataScopeType = DataScopeTypeEnum.ORDER,whereInType = DataScopeWhereInTypeEnum.DEPARTMENT,joinSql = "d.department_id in #departmentIds")
- 创建销售角色,给销售部的人分配此角色
- 设置此角色的订单业务模块的数据范围为本部门
# 三、具体使用
# 3.1、@DataScope注解
参数 | 类型 | 说明 |
---|---|---|
dataScopeType | DataScopeTypeEnum | 定义对应数据范围的业务模块 |
whereInType | DataScopeWhereInTypeEnum | 定义数据范围Sql拼接的模式是已部门、员工还是自定义的方式判断数据范围 |
joinSqlImplClazz | DataScopePowerStrategy | 这个是扩展功能,当whereInType 的值为CUSTOM_STRATEGY 必填,用于固有功能无法满足需求的情况下,通过实现joinSqlImplClazz的方式来自定义数据范围 |
paramName | String | 这个同样是扩展功能,用于自定义数据范围策略的实现方法中获取接口参数的内容 |
whereIndex | int | 默认值0,定义拼接的sql从第几个Where开始 |
joinSql | String | 拼接的sql语句,非自定义策略此参数必填,目前扩展的参数变量有#departmentIds、#employeeIds |
# 3.2、joinSql参数说明
参数 | 说明 |
---|---|
#departmentIds | 当whereInType 为DEPARTMENT 时,此参数会自动根据对应用户在此模块的数据范围设置此变量的部门id集合,会自动拼接() |
#employeeIds | 当whereInType 为EMPLOYEE 时,此参数会自动根据对应用户在此模块的数据范围设置此变量的员工id集合,会自动拼接() |
# 四、实现原理
简单一句话:通过拦截sql语句,在对应的sql语句后拼接具体可见的范围条件,来控制数据范围。参考代码:MyBatisPlugin
# 联系我们
1024创新实验室-主任:卓大 (opens new window),混迹于各个技术圈,研究过计算机,熟悉点 java,略懂点前端。
1024创新实验室(河南·洛阳) (opens new window) 致力于成为中原领先、国内一流的技术团队,以技术创新为驱动,合作各类项目(软件外包、技术顾问、培训等等)。
![]() | ![]() | ![]() |
加 主任 “卓大” 微信 拉你入群,一起学习 | 关注 “小镇程序员” 分享代码与生活、技术与赚钱 | 请 “1024创新实验室” 喝咖啡 支持我们的开源与分享 |