6.4 部门管理
概述
部门模块(goframe_dept,租户级表)管理组织架构:树形结构、删除有子级/用户守卫、租户内名称唯一。部门是数据权限(本部门及以下/本部门)的组织基础。
接口清单
text
七件套:sys:dept:{page|list|detail|add|update|delete|batchDelete}
List 返回树形(IsTree + ParentOf)模块特征
| 特征 | 实现 |
|---|---|
| 树形 | IsTree + ParentOf,List 自动建树 |
| 删除守卫 | 存在子部门拒绝(1011);存在用户引用拒绝(1014 语义) |
| 唯一性 | 租户内部门名唯一(uk_tenant_name) |
| 数据权限 | dept_id 是 data_scope 档 2/3 的过滤维度 |
| 子树查询 | data_scope.go deptSubtreeIds:拉全租户部门行后 BFS |
与其他模块的关系
text
user.dept_id → dept.id 用户归属部门(用户表单部门选择)
data_scope 档 2/3 按部门维度过滤可见数据(见 5.9 数据权限)
deptSubtreeIds(deptId) 档 2 "本部门及以下"的子孙部门集合计算
(每次全量拉部门表 BFS,树小无缓存;
部门表数百行内无感知,上万行需加短时缓存)唯一性说明
建表有 uk_tenant_name (tenant_id, name, del_flag) 唯一索引,但 dept 模块未声明 UniqueFields 预检——重复名称提交会收到数据库 1062 裸错误。修复方向:补 UniqueFields{Field:"name", Group:"tenant_id"}(预检范围=索引范围)。
管理建议
- 部门层级建议控制在 5 层内(子树 BFS 与前端展示友好)
- 删除部门前先处理子部门与挂载用户(守卫会拦截)
- 未分配部门(dept_id=0)的用户挂数据权限档 2/3 时降级为"仅本人"(防可见面意外放大)
- 部门调整后,受影响用户的数据权限即时生效(user.Update 清身份缓存路径覆盖 dept_id 变更)