若依框架数据权限发分析

📅 2026/7/13 19:03:11 👁️ 阅读次数 📝 编程学习
若依框架数据权限发分析

一、需求

一个车间(部门)的负责人只能查看自己车间的设备数据

案例设定

用户所属部门数据权限看到的设备
admin全部数据权限所有设备
ry测试部门(105)本部门数据权限测试部门的设备
zhy财务部门(106)本部门数据权限

财务部门的设备

二、数据库建表

2.1 建表SQL

-- 设备表 DROP TABLE IF EXISTS `sys_equipment`; CREATE TABLE `sys_equipment` ( `equipment_id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '设备ID', `equipment_code` VARCHAR(64) NOT NULL COMMENT '设备编号', `equipment_name` VARCHAR(100) NOT NULL COMMENT '设备名称', `dept_id` INT(11) DEFAULT NULL COMMENT '所属部门ID', `status` CHAR(1) DEFAULT '0' COMMENT '状态', `remark` VARCHAR(500) DEFAULT NULL COMMENT '备注', `create_by` VARCHAR(64) DEFAULT '' COMMENT '创建者', `create_time` DATETIME DEFAULT NULL COMMENT '创建时间', `update_by` VARCHAR(64) DEFAULT '' COMMENT '更新者', `update_time` DATETIME DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`equipment_id`) ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='设备表'; -- 插入测试数据 INSERT INTO `sys_equipment` VALUES (1, 'zhy_001', '测试服务器', 105, '0', '测试部门设备', 'admin', NOW(), NULL, NULL), (2, 'zhy_002', '测试客户端', 105, '0', '测试部门设备', 'admin', NOW(), NULL, NULL), (3, 'zhy_003', '财务服务器', 106, '0', '财务部门设备', 'admin', NOW(), NULL, NULL), (4, 'zhy_004', '财务客户端', 106, '0', '财务部门设备', 'admin', NOW(), NULL, NULL);

2.2截图

三、使用若依代码生成器

四、复制代码到项目

4.1 后端代码放置位置

文件放置路径
SysEquipment.javaruoyi-system/src/main/java/com/ruoyi/system/domain/
SysEquipmentMapper.javaruoyi-system/src/main/java/com/ruoyi/system/mapper/
ISysEquipmentService.javaruoyi-system/src/main/java/com/ruoyi/system/service/
SysEquipmentServiceImpl.javaruoyi-system/src/main/java/com/ruoyi/system/service/impl/
SysEquipmentController.javaruoyi-admin/src/main/java/com/ruoyi/web/controller/system/
SysEquipmentMapper.xmlruoyi-system/src/main/resources/mapper/system/

4.2 前端代码放置位置

文件放置路径
equipment/index.vueruoyi-ui/src/views/
api/equipment.jsruoyi-ui/src/api/

4.3 执行菜单SQL

在Navicat中执行生成的menu.sql文件,添加设备管理菜单。

五、手动添加数据权限

若依代码生成器生成的代码默认不带数据权限,需要手动添加两处。

5.1 Service层添加 @DataScope 注解

文件路径:SysEquipmentServiceImpl.java

java

@Override @DataScope(deptAlias = "e") // ← 添加这一行,e是部门表别名 public List<SysEquipment> selectEquipmentList(SysEquipment equipment) { return equipmentMapper.selectEquipmentList(equipment); }

5.2 Mapper.xml 添加 ${params.dataScope}



六、效果验证

6.1 admin用户(全部数据权限)

6.2 ry用户(测试部门)

ry登录,设备管理页面只显示zhy_001、zhy_002

6.3 zhy用户(财务部门)

zhy登录,设备管理页面只显示zhy_003、zhy_004

6.4 后端SQL日志验证


七、核心原理总结

text

用户请求 → Controller → Service(@DataScope) → AOP拦截 → 生成SQL片段 → 存入params.dataScope → Mapper.xml使用${params.dataScope}拼接 → 执行过滤后的SQL