表格
租户表(tenant)
| 字段名 | 数据类型 | 注释 | 约束 |
|---|---|---|---|
| id | bigint | 主键id | 不为空 |
| name | varchar(50) | 租户名称 | |
| package_id | bigint | 套餐id | 外键,关联租户套餐表 |
租户套餐表(tenant_package)
| 字段名 | 数据类型 | 注释 | 约束 |
|---|---|---|---|
| id | bigint | 主键id | 不为空 |
| menu_ids | text | 菜单id集合 | 存储格式:逗号分隔或JSON数组 |
菜单表(menu)
| 字段名 | 数据类型 | 注释 | 约束 |
|---|---|---|---|
| id | bigint | 主键id | 不为空 |
| name | varchar | 菜单名称 | |
| perm | varchar | 权限标识 | 如:sys:user:list |
角色表(role)
| 字段名 | 数据类型 | 注释 | 约束 |
|---|---|---|---|
| id | bigint | 主键id | 不为空 |
| name | varchar | 角色名称 | |
| tenant_id | bigint | 租户id | 外键,关联租户表 |
角色菜单关联表(role_menu)
| 字段名 | 数据类型 | 注释 | 约束 |
|---|---|---|---|
| id | bigint | 主键id | 不为空 |
| menu_id | bigint | 菜单id | |
| role_id | bigint | 角色id |
业务流程说明
一、创建租户
-
选择套餐 运营人员在前端为待创建租户选择一个已配置好的套餐(即
tenant_package中的一条记录)。 -
创建租户管理员账号 系统自动创建一个用户账号,该账号默认为当前租户的管理员。
-
创建租户管理员角色 系统为当前租户新增一条角色记录,角色名称建议为“租户管理员”或“{租户名称}_admin”,并关联
tenant_id。 -
初始化角色菜单权限 根据所选套餐中的
menu_ids(菜单ID集合),系统批量将菜单与角色的关联关系插入role_menu表,完成管理员角色的权限初始化。说明:租户管理员角色的权限来源于租户套餐,通过角色与菜单的关联实现,为后续权限扩展(如新增子角色)奠定基础。
二、修改套餐配置
- 更新套餐定义
运营人员修改
tenant_package表中的menu_ids字段内容(例如新增或移除某些菜单ID)。 - 查询受影响的租户
系统查询所有
tenant表中package_id指向该套餐的租户记录。 - 遍历租户并同步权限
对每个受影响的租户执行以下操作:
- 获取该租户的“租户管理员”角色(或所有需要同步的角色)。
- 获取当前角色的已有菜单权限(从
role_menu查询)。 - 将原
menu_ids与新menu_ids进行比对:- 新增菜单:将新出现的菜单ID插入
role_menu。 - 删除菜单:将不再包含的菜单ID从
role_menu中移除。
- 新增菜单:将新出现的菜单ID插入
- 提交变更,确保租户管理员权限与套餐定义一致。
三、用户登录与权限加载
-
用户登录认证 用户输入账号密码,系统校验身份合法性。
-
查询用户角色 根据用户ID关联查询其所属的角色(支持多角色)。
-
查询角色菜单权限 根据角色ID集合,关联查询
role_menu和menu表,获取所有授权菜单及权限标识(perm)。关键点:权限来源于角色与菜单的关联关系,而非直接关联租户套餐。租户管理员角色的菜单权限已在创建租户时通过套餐初始化至
role_menu,因此登录时只需通过角色即可获取完整权限。 -
构建权限数据 系统去重后生成权限标识列表(如
["sys:user:list", "sys:role:add"])。 -
返回前端渲染 将权限列表返回给前端,前端根据权限控制菜单显隐及按钮级别的操作权限。