$cacheService
$cacheService : \App\Services\Admin\PermissionCacheService
用户配置服务
职责:用户台账的增删改查、批量启停、导入导出,以及直授角色/任职/个人范围/个人权限 四类授权同步。鉴权(提权拦截、数据范围校验、委派上界)与缓存失效在此收口。
┌────────────────── 分区导航(按此顺序阅读)──────────────────┐ 分区 1 · 构造与依赖 __construct 分区 2 · 查询(读操作) paginate / overview / postUserGroups / deptNames / ledDeptNames memberships / getUserRoleIds / getUserScopes getUserPermissionIds / permissionCatalog 分区 3 · 用户写操作 create / update / batchUpdateStatus / resetPassword destroy / importCsv 分区 4 · 授权同步(写) syncUserRoles / syncMemberships / syncUserScopes / syncUserPermissions 分区 5 · 数据范围与内部 assertTargetVisible / assertOperatorCoversRolePermissions normalizeAvatar / forceLogout / currentOperatorName └────────────────────────────────────────────────────────────┘
$cacheService : \App\Services\Admin\PermissionCacheService
syncMemberships(\App\Models\SysUser $user, array $items) : void
同步任职(覆盖式,V6.2 起任职仅为归属标记,不再带 scope)。 每条:dept_id + post_id(岗位,须在该部门岗位目录内)+ is_leader。 超级管理员岗位(code=super)特殊:全局岗位 dept_id 必须为 0(不挂部门), 仅超管本人可分配(任职即数据全见),负责人标识强制为 0。
| \App\Models\SysUser | $user | |
| array | $items |
非超管为任何人任职超级管理员岗位(403)、目标不在数据范围内、 或非豁免操作者自我调整导致范围扩大时抛 403
syncUserScopes(\App\Models\SysUser $user, array $items) : void
同步用户个人数据范围(覆盖式)。 每条:company_id(组织)+ dept_id(0=整组织,否则该部门含下级)。 个人范围与岗位范围并集生效(用户可见部门集 = 岗位范围 ∪ 个人范围 ∪ 负责人部门)。
| \App\Models\SysUser | $user | |
| array | $items | [{company_id, dept_id}] |
目标不在数据范围内(403)、组织/部门不存在或归属不符(400)时抛
syncUserPermissions(\App\Models\SysUser $user, int[] $permissionIds) : void
同步用户个人权限(覆盖式)。 仅按钮/接口权限(type=2/3):菜单页面可见性仍由角色决定(前端安全模型「菜单=全量页面集合」)。 个人权限与角色权限并集生效(与个人数据范围同构)。
| \App\Models\SysUser | $user | |
| int[] | $permissionIds |
目标不可见(403)、超管只读(403)、越权授予(403)、 权限不存在/停用或含菜单权限(400)时抛
normalizeStringColumns(array<string,mixed> $data, string[] $columns, array<string,string> $defaults = [], bool $fillMissing = false) : array
字符串列归一化:值为 null 的键写入 $defaults 对应默认值(缺省 '')。
| array |
$data | 待写库数据(按引用字段处理,返回归一化副本) |
| string[] | $columns | 参与归一化的列名 |
| array |
$defaults | 列 => 默认值(缺省 '',如 link_target => '_self') |
| bool | $fillMissing | true 时缺失键也补默认值(创建路径全字段落库用);false 只处理已存在的键 |