一、前言

在若依框架中,权限分为菜单接口权限数据权限。菜单权限控制能看到哪些功能、访问哪些接口;数据权限控制同一张数据表,不同角色用户能看到哪些行数据

本次实战搭建车间设备管理模块,实现需求:

  1. 超级管理员:查看全部车间设备数据
  2. 普通角色用户:只能查看本部门 / 本车间设备数据
  3. 核心技术:@DataScope 注解 + AOP 切面 + MyBatis 动态 SQL 拼接

二、核心原理

  1. 若依内置 DataScopeAspect 切面类,拦截 @DataScope 注解
  2. 自动获取当前登录用户所属部门、角色数据权限
  3. 动态拼接 SQL 过滤条件,存入实体类 params 参数
  4. Mapper XML 通过 ${params.dataScope} 引入动态条件,实现行级过滤
  5. 内置 5 种数据权限:全部、自定义、本部门、本部门及以下、仅本人

三、数据库准备(CMD 终端操作)

1. CMD 登录 MySQL

bash

运行

mysql -uroot -p

输入密码登录,选择若依数据库

sql

use ry-vue;

2. 创建设备表

sql

CREATE TABLE `sys_equipment` (
  `equip_id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '设备ID',
  `equip_name` VARCHAR(100) NOT NULL COMMENT '设备名称',
  `equip_no` VARCHAR(50) DEFAULT NULL COMMENT '设备编号',
  `dept_id` BIGINT NOT NULL COMMENT '所属车间部门ID',
  `user_id` BIGINT DEFAULT NULL COMMENT '负责人ID',
  `status` CHAR(1) DEFAULT '0' COMMENT '状态(0正常 1停用)',
  `create_time` DATETIME DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`equip_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='车间设备表';

3. 插入测试设备数据

sql

INSERT INTO sys_equipment (equip_name, equip_no, dept_id, user_id)
VALUES
('LatheA', 'Li_001', 103, 2),
('MillingB', 'Li_002', 103, 3),
('DrillC', 'Li_003', 104, 2);

4. 导入菜单 SQL

解压代码生成包,在 CMD 执行菜单脚本:

sql

source D:/edgdownload/w13/equipmentMenu.sql;

四、若依代码生成

  1. 登录若依后台 → 系统工具 → 代码生成
  2. 导入 sys_equipment 表,配置:
    • 模块名:equipment
    • 功能名:设备管理
    • 上级菜单:系统管理
  3. 生成代码并下载压缩包,解压得到后端、前端、SQL 文件

五、项目代码部署

1. 后端代码复制

  1. controller/domain/mapper/service 对应文件复制到项目对应包下
  2. SysEquipmentMapper.xml 复制到 mapper/system 目录

2. 前端代码复制

  1. equipment.js 复制到 ruoyi-ui/src/api
  2. equipment 文件夹复制到 ruoyi-ui/src/views

六、数据权限核心改造(三步必做)

1. 实体类继承 BaseEntity

自动生成的 SysEquipment 已默认继承,无需修改,核心作用:携带 params 参数存放动态 SQL。

2. Service 层添加 @DataScope 注解

修改 SysEquipmentServiceImpl.java,导入注解并添加到查询列表方法:

java

运行

import com.ruoyi.common.annotation.DataScope;

@Override
@DataScope(deptAlias = "d", userAlias = "s")
public List<SysEquipment> selectSysEquipmentList(SysEquipment sysEquipment)
{
    return sysEquipmentMapper.selectSysEquipmentList(sysEquipment);
}
  • deptAlias = "d":部门表别名
  • userAlias = "s":设备表别名

3. Mapper XML 改造

关联部门表,末尾加入 ${params.dataScope} 接收动态权限 SQL:

xml

<select id="selectSysEquipmentList" parameterType="SysEquipment" resultMap="SysEquipmentResult">
    select s.* from sys_equipment s
    left join sys_dept d on s.dept_id = d.dept_id
    <where>
        <if test="equipName != null and equipName != ''">
            and equip_name like concat('%', #{equipName}, '%')
        </if>
        <if test="status != null and status != ''">
            and status = #{status}
        </if>
        ${params.dataScope}
    </where>
</select>

七、角色与数据权限配置

  1. 系统管理 → 角色管理
  2. 超级管理员:设置全部数据权限
  3. 新建普通角色:设置本部门数据权限
  4. 新建测试用户,归属对应部门,绑定普通角色
  5. 给角色分配设备管理菜单权限,刷新菜单

八、功能测试

  1. admin 账号:登录设备管理,查看所有 3 条设备数据
  2. 普通部门用户:登录后仅展示本车间设备,自动过滤其他部门数据
  3. 查看后端日志,可看到框架自动拼接 AND d.dept_id = 部门ID 权限条件

九、5 种数据权限 SQL 解析

  1. 全部数据权限:不拼接任何 SQL,查询全量数据
  2. 本部门数据权限:拼接 AND d.dept_id = 当前用户部门ID
  3. 本部门及以下:拼接部门及子部门 ID 集合查询
  4. 仅本人数据权限:拼接 AND s.user_id = 当前用户ID
  5. 自定义数据权限:拼接勾选的部门 ID 集合

十、截图

可以新建,修改设备,没开权限之前普通角色看不到设备管理菜单,开了就可以。 不同角色因为权限不同看到的设备数量信息不同。

更多推荐