Skip to content

6.13 租户管理 ​

概述

租户模块(goframe_tenant,平台级表)管理多租户生命周期:状态/过期、用户上限、事务化开户(Account,code 按 T+ID 规则回填)。隔离机制详见 5.8 多租户隔离。

接口清单 ​

方法路由权限说明
GET/api/tenant/pagesys:tenant:page分页(平台专属视图,带用户数统计)
GET/api/tenant/listsys:tenant:list列表
GET/api/tenant/detail/:idsys:tenant:detail详情
POST/api/tenant/addsys:tenant:add新增
PUT/api/tenant/updatesys:tenant:update修改
PUT/api/tenant/statussys:tenant:status状态切换
DELETE/api/tenant/delete/:idsys:tenant:delete软删
DELETE/api/tenant/batchDeletesys:tenant:batchDelete批量删除
POST/api/tenant/accountsys:tenant:add创建租户账号(开户)
GET/api/tenant/users/:tenantIdsys:tenant:users查询租户用户

编码规则(T%04d,自增 ID 回填) ​

text
code 为 NOT NULL + 唯一键,插入时无法预知 ID →
  1) 先写临时占位编码(T%010d,纳秒取模防撞)
  2) Insert 后按 LastInsertId 修正为 "T"+4 位ID(如 T0001)
Add 与 Account 均遵循此模式;显式传 code 时查重后直接使用不回填

开户事务(tenant.Account,真实流程) ​

text
bcrypt 在事务外预计算(短事务纪律)→ WithTrans 内三段原子写:
  ① Insert 租户(status=1,hooks 填审计列)
  ② 修正 code = T%04d(tenantId)
  ③ 以 tenantCtx(WithTenantID(txCtx, tenantId))Insert 初始管理员:
     code = "{code}-000001"(首用户序号),tenant_id 显式传入,
     password/salt 为预计算值
返回 {tenantId, code, userId}

角色分配未含在开户事务内(按需另行调用)
事务纪律:事务内不做 HTTP/文件 IO,bcrypt 等 CPU 计算事务外预计算

状态与缓存 ​

text
tenantFilter:列表为平台专属视图(超管可见全部,带每租户用户数统计)
fillUserCount:每租户用户数(对照 max_user_num 判断容量)
clearCache:状态/过期变更后 Del tenant:info:{id}
  (Tenant 中间件 60s 摘要缓存——变更后最多 60s 生效,Del 后即时生效)

关联约束 ​

  • 用户数上限:user.Add 的 checkTenantUserMax 对照 max_user_num(1007)
  • 租户用户列表:GET /api/tenant/users/:tenantId
  • 租户删除前应清空/迁移该租户用户与业务数据(软删租户不级联)

管理建议 ​

  • expire_time 为 nil 表示永不过期;到期前 30 天关注续期
  • max_user_num 控制容量;调大即时生效(user.Add 实时校验)
  • 禁用租户(status=2)立即拦截该租户全部用户请求(等 60s 缓存或 Del 即时)
  • 开户后记得为初始管理员分配角色(Account 不含角色分配)

小蚂蚁云团队 · 提供技术支持