表格

租户表(tenant)
字段名数据类型注释约束
idbigint主键id不为空
namevarchar(50)租户名称
package_idbigint套餐id外键,关联租户套餐表
租户套餐表(tenant_package)
字段名数据类型注释约束
idbigint主键id不为空
menu_idstext菜单id集合存储格式:逗号分隔或JSON数组
菜单表(menu)
字段名数据类型注释约束
idbigint主键id不为空
namevarchar菜单名称
permvarchar权限标识如:sys:user:list
角色表(role)
字段名数据类型注释约束
idbigint主键id不为空
namevarchar角色名称
tenant_idbigint租户id外键,关联租户表
角色菜单关联表(role_menu)
字段名数据类型注释约束
idbigint主键id不为空
menu_idbigint菜单id
role_idbigint角色id

业务流程说明

一、创建租户

  1. 选择套餐 运营人员在前端为待创建租户选择一个已配置好的套餐(即 tenant_package 中的一条记录)。

  2. 创建租户管理员账号 系统自动创建一个用户账号,该账号默认为当前租户的管理员。

  3. 创建租户管理员角色 系统为当前租户新增一条角色记录,角色名称建议为“租户管理员”或“{租户名称}_admin”,并关联 tenant_id

  4. 初始化角色菜单权限 根据所选套餐中的 menu_ids(菜单ID集合),系统批量将菜单与角色的关联关系插入 role_menu 表,完成管理员角色的权限初始化。

    说明:租户管理员角色的权限来源于租户套餐,通过角色与菜单的关联实现,为后续权限扩展(如新增子角色)奠定基础。


二、修改套餐配置

  1. 更新套餐定义 运营人员修改 tenant_package 表中的 menu_ids 字段内容(例如新增或移除某些菜单ID)。
  2. 查询受影响的租户 系统查询所有 tenant 表中 package_id 指向该套餐的租户记录。
  3. 遍历租户并同步权限 对每个受影响的租户执行以下操作:
    • 获取该租户的“租户管理员”角色(或所有需要同步的角色)。
    • 获取当前角色的已有菜单权限(从 role_menu 查询)。
    • 将原 menu_ids 与新 menu_ids 进行比对:
      • 新增菜单:将新出现的菜单ID插入 role_menu
      • 删除菜单:将不再包含的菜单ID从 role_menu 中移除。
    • 提交变更,确保租户管理员权限与套餐定义一致。

三、用户登录与权限加载

  1. 用户登录认证 用户输入账号密码,系统校验身份合法性。

  2. 查询用户角色 根据用户ID关联查询其所属的角色(支持多角色)。

  3. 查询角色菜单权限 根据角色ID集合,关联查询 role_menumenu 表,获取所有授权菜单及权限标识(perm)。

    关键点:权限来源于角色与菜单的关联关系,而非直接关联租户套餐。租户管理员角色的菜单权限已在创建租户时通过套餐初始化至 role_menu,因此登录时只需通过角色即可获取完整权限。

  4. 构建权限数据 系统去重后生成权限标识列表(如 ["sys:user:list", "sys:role:add"])。

  5. 返回前端渲染 将权限列表返回给前端,前端根据权限控制菜单显隐及按钮级别的操作权限。