跳到主要内容

角色权限表

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能考虑
  8. 故障排查指南
  9. 结论
  10. 附录

简介

本文件聚焦于角色权限体系的表结构与权限控制机制,详细说明角色表(system_role)、菜单表(system_menu)以及角色菜单关联表(system_role_menu)的核心字段、数据类型、约束条件与业务含义;解释角色类型与数据范围字段设计;阐述菜单类型与权限标识字段;并给出角色菜单关联表的设计思路与权限控制流程。最后提供角色权限体系的完整结构说明(含父子角色关系与权限继承规则),以及典型场景与数据示例。

项目结构

围绕角色权限的核心表位于系统模块的数据库脚本中,同时在系统业务模块的测试资源中提供了标准建表SQL,便于本地开发与测试环境快速初始化。

Mermaid Diagram Code:

graph TB
subgraph "数据库脚本"
A["sql/mysql/system.sql<br/>角色/菜单/关联表定义"]
B["sql/mysql/...其他方言脚本<br/>同构表结构"]
end
subgraph "系统业务模块测试资源"
C["create_tables.sql<br/>统一建表SQL测试环境"]
end
A --> C
B --> C

图表来源

章节来源

核心组件

  • 角色表(system_role)
    • 角色ID、角色名称、角色权限字符串(code)、显示顺序、数据范围、数据范围部门集合、角色状态、角色类型、备注、租户编号等字段
  • 菜单表(system_menu)
    • 菜单ID、菜单名称、权限标识(permission)、菜单类型、排序、父级ID、路由地址、图标、组件路径、组件名、状态、可见性、缓存策略、始终显示、租户编号等字段
  • 角色菜单关联表(system_role_menu)
    • 关联ID、角色ID、菜单ID、租户编号等字段

章节来源

架构总览

角色权限体系通过“角色-菜单”多对多关联实现权限控制,结合数据范围(按部门/本人等)实现数据级权限。前端根据菜单树展示可访问的菜单项,后端通过权限标识(permission)进行接口级鉴权。

Mermaid Diagram Code:

erDiagram
SYSTEM_ROLE {
bigint id PK
varchar name
varchar code
int sort
tinyint data_scope
varchar data_scope_dept_ids
tinyint status
tinyint type
varchar remark
bigint tenant_id
}
SYSTEM_MENU {
bigint id PK
varchar name
varchar permission
tinyint type
int sort
bigint parent_id
varchar path
varchar icon
varchar component
varchar component_name
tinyint status
bit visible
bit keep_alive
bit always_show
bigint tenant_id
}
SYSTEM_ROLE_MENU {
bigint id PK
bigint role_id FK
bigint menu_id FK
bigint tenant_id
}
SYSTEM_ROLE ||--o{ SYSTEM_ROLE_MENU : "拥有"
SYSTEM_MENU ||--o{ SYSTEM_ROLE_MENU : "被授予"

图表来源

详细组件分析

角色表(system_role)字段详解

  • 角色ID(id)
    • 类型:bigint(主键)
    • 说明:自增主键,唯一标识角色
  • 角色名称(name)
    • 类型:varchar(30)
    • 说明:角色显示名称
  • 角色权限字符串(code)
    • 类型:varchar(100)
    • 说明:角色的权限标识字符串,用于接口或业务逻辑判断
  • 显示顺序(sort)
    • 类型:int
    • 说明:角色在界面中的排序权重
  • 数据范围(data_scope)
    • 类型:tinyint
    • 取值:参考数据范围枚举(全部、指定部门、本部门、本部门及以下、仅本人)
    • 说明:决定角色的数据访问范围
  • 数据范围部门集合(data_scope_dept_ids)
    • 类型:varchar(500)
    • 说明:当数据范围为“指定部门”时,存储部门ID集合
  • 角色状态(status)
    • 类型:tinyint
    • 取值:0 正常;1 停用
    • 说明:控制角色是否生效
  • 角色类型(type)
    • 类型:tinyint
    • 取值:参考角色类型枚举(系统内置、自定义)
    • 说明:区分内置角色与自定义角色
  • 备注(remark)
    • 类型:varchar(500)
    • 说明:角色描述信息
  • 租户编号(tenant_id)
    • 类型:bigint
    • 默认:0
    • 说明:多租户隔离标识

章节来源

菜单表(system_menu)字段详解

  • 菜单ID(id)
    • 类型:bigint(主键)
    • 说明:自增主键,唯一标识菜单
  • 菜单名称(name)
    • 类型:varchar(50)
    • 说明:菜单显示名称
  • 权限标识(permission)
    • 类型:varchar(100)
    • 说明:接口级权限标识,如 system:user:list
  • 菜单类型(type)
    • 类型:tinyint
    • 说明:菜单分类(目录、菜单、按钮等)
  • 显示顺序(sort)
    • 类型:int
    • 默认:0
  • 父级ID(parent_id)
    • 类型:bigint
    • 默认:0
  • 路由地址(path)
    • 类型:varchar(200)
    • 说明:前端路由路径
  • 图标(icon)
    • 类型:varchar(100)
    • 默认:'#'
  • 组件路径(component)
    • 类型:varchar(255)
    • 说明:前端组件路径
  • 组件名(component_name)
    • 类型:varchar(255)
    • 说明:前端组件名称
  • 菜单状态(status)
    • 类型:tinyint
    • 默认:0
  • 是否可见(visible)
    • 类型:bit
    • 默认:true
  • 是否缓存(keep_alive)
    • 类型:bit
    • 默认:true
  • 是否总是显示(always_show)
    • 类型:bit
    • 默认:true
  • 租户编号(tenant_id)
    • 类型:bigint
    • 默认:0
    • 说明:多租户隔离标识

章节来源

角色菜单关联表(system_role_menu)字段详解

  • 关联ID(id)
    • 类型:bigint(主键)
    • 说明:自增主键
  • 角色ID(role_id)
    • 类型:bigint(外键)
    • 说明:指向角色表的主键
  • 菜单ID(menu_id)
    • 类型:bigint(外键)
    • 说明:指向菜单表的主键
  • 租户编号(tenant_id)
    • 类型:bigint
    • 默认:0
    • 说明:多租户隔离标识

章节来源

角色类型与数据范围设计

  • 角色类型(type)
    • 系统内置(SYSTEM)
    • 自定义(CUSTOM)
  • 数据范围(data_scope)
    • 全部数据权限(ALL)
    • 指定部门数据权限(DEPT_CUSTOM)
    • 本部门数据权限(DEPT_ONLY)
    • 本部门及以下数据权限(DEPT_AND_CHILD)
    • 仅本人数据权限(SELF)

章节来源

菜单类型与权限标识

  • 菜单类型(type)
    • 用于区分目录、菜单、按钮等不同层级
  • 权限标识(permission)
    • 用于接口级权限控制,如 system:user:list、system:role:create

章节来源

权限控制机制与流程

  • 菜单授权(角色-菜单)
    • 通过 system_role_menu 将角色与菜单建立多对多关系
    • 授权请求参数对象包含角色ID与菜单ID集合
  • 数据权限控制
    • 通过 system_role 的 data_scope 与 data_scope_dept_ids 控制数据访问范围
    • 授权请求参数对象包含角色ID、数据范围与部门ID集合(当范围为指定部门时)

Mermaid Diagram Code:

sequenceDiagram
participant Admin as "管理端"
participant API as "权限服务接口"
participant RoleMenu as "角色菜单关联表"
participant Role as "角色表"
participant Menu as "菜单表"
Admin->>API : 提交角色菜单授权请求角色ID+菜单ID集合
API->>RoleMenu : 批量插入角色-菜单关联记录
API-->>Admin : 授权完成
Admin->>API : 提交角色数据权限授权请求角色ID+数据范围+部门ID集合
API->>Role : 更新角色数据范围与部门集合
API-->>Admin : 数据权限授权完成
Admin->>API : 请求菜单树/权限标识
API->>RoleMenu : 查询角色关联的菜单ID
API->>Menu : 加载菜单树与权限标识
API-->>Admin : 返回可访问菜单与权限标识

图表来源

依赖关系分析

  • system_role_menu 依赖 system_role 与 system_menu
  • system_role 的数据范围字段与部门集合共同决定数据级权限
  • system_menu 的 permission 字段用于接口级权限校验

Mermaid Diagram Code:

graph LR
ROLE["system_role"] --> RM["system_role_menu"]
MENU["system_menu"] --> RM
ROLE --> DATA_SCOPE["数据范围/部门集合"]
MENU --> PERM["权限标识(permission)"]

图表来源

章节来源

性能考虑

  • 建议在角色ID与菜单ID上建立索引以优化授权查询与权限判定
  • 对 data_scope_dept_ids 进行合理分隔符存储与查询优化,避免复杂字符串匹配
  • 菜单树加载时建议缓存静态菜单结构,减少重复查询

故障排查指南

  • 授权后无法访问菜单
    • 检查 system_role_menu 中是否存在对应的角色-菜单关联
    • 检查 system_menu 的 status 与 visible 字段
  • 数据权限异常
    • 检查 system_role 的 data_scope 与 data_scope_dept_ids 设置
    • 确认当前用户所属部门是否在指定范围内
  • 权限标识不生效
    • 检查 system_menu 的 permission 字段是否正确配置
    • 确认接口层权限校验逻辑是否使用了该标识

结论

角色权限体系通过“角色-菜单”关联与“数据范围”双重维度实现细粒度的权限控制。角色表负责角色属性与数据范围,菜单表负责菜单与权限标识,关联表承担两者之间的多对多映射。配合请求参数对象,系统实现了菜单授权与数据权限授权的标准化流程。

附录

角色权限体系结构说明

  • 角色类型
    • 系统内置:由系统生成,通常具备较高权限
    • 自定义:由管理员创建,权限范围可灵活配置
  • 数据范围
    • 全部数据权限:可访问所有数据
    • 指定部门数据权限:仅可访问指定部门集合的数据
    • 本部门数据权限:仅可访问当前部门数据
    • 本部门及以下数据权限:可访问当前部门及其子部门数据
    • 仅本人数据权限:仅可访问本人产生的数据
  • 菜单类型
    • 目录、菜单、按钮等,用于前端菜单树与按钮级权限控制
  • 权限标识
    • 用于接口级权限校验,格式如 module:resource:operation

章节来源

典型场景与数据示例

  • 场景一:为普通角色授予用户管理菜单
    • 角色:普通角色(role_id=2)
    • 菜单:用户管理(menu_id=100)
    • 关联:在 system_role_menu 插入一条记录
  • 场景二:为租户管理员设置数据范围为“本部门及以下”
    • 角色:租户管理员(role_id=109)
    • 数据范围:DEPT_AND_CHILD(scope=4)
    • 部门集合:空或默认(视具体实现)
  • 场景三:为测试账号授予大量菜单
    • 角色:测试账号(role_id=101)
    • 菜单:多个ID集合(如 1216~1243 等)
    • 关联:批量插入 system_role_menu 记录

章节来源

用户文档
AI 助手
Agent 列表
请选择一个 Agent 开始对话
AI 问答