From af94e1d2cb22f1e939ceb0912fb4b75f9fef6881 Mon Sep 17 00:00:00 2001 From: chenxing Date: Wed, 16 Sep 2026 16:33:58 +0800 Subject: [PATCH] =?UTF-8?q?fix(permission):=20=E8=A7=92=E8=89=B2=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E8=81=94=E5=8A=A8=E5=B7=B2=E6=8E=88=E6=9D=83=E5=BA=94?= =?UTF-8?q?=E7=94=A8=E3=80=81=E6=89=80=E5=B1=9E=E9=83=A8=E9=97=A8=E6=8C=89?= =?UTF-8?q?=E8=A1=8C=E6=94=B6=E7=AA=84=E3=80=81=E6=A0=91=E6=BB=9A=E5=8A=A8?= =?UTF-8?q?=E6=9D=A1=E6=94=B6=E6=95=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 权限一览:formatRoleAuthzTree 子节点键 apps→children(zTree 只认 children,导致除分类外全不渲染) - 权限一览:所属部门按行所在组请求 UserGroupTree,多组用户只显示该组链路,(本组)标记指向该组 - 角色授权:用户管理新增「部门」列,添加/删除按(用户,组)维度,切组清空勾选避免误绑 - 编辑用户:切「所在组」时身份与角色属性双回显,该组角色未就绪拦截提交防误存;保存按组覆盖 - 组用户管理:左侧树滚动条收敛到树节点(页面级新增 group-user-tree 类,不动全局 .tree-container) --- src/api/globals.d.ts | 19 +++++++- src/views/PermissionView.vue | 9 ++-- src/views/group-user/index.vue | 21 ++++++++- .../group-user/user/AddUserContainer.vue | 6 ++- .../group-user/user/EditUserContainer.vue | 43 ++++++++----------- src/views/group-user/user/UserForm.vue | 36 +++++++++++++--- src/views/role-authz/RoleUserBindModal.vue | 31 ++++++++++--- src/views/role-authz/RoleUserManage.vue | 22 ++++++---- 8 files changed, 134 insertions(+), 53 deletions(-) diff --git a/src/api/globals.d.ts b/src/api/globals.d.ts index ccc0331..f547fbd 100644 --- a/src/api/globals.d.ts +++ b/src/api/globals.d.ts @@ -179,11 +179,18 @@ export interface GroupAppAssignRequest { } export interface UserAppRoleBindRequest { userId: number; + /** 绑定组ID(可选):角色归属的组,空则后端兜底主组 */ + groupId?: number; roleIds?: number[]; } +export interface AppRoleUserBinding { + userId: number; + /** 绑定发生时所选的组ID */ + groupId: number; +} export interface AppRoleUserBindRequest { roleId: number; - userIds?: number[]; + bindings?: AppRoleUserBinding[]; } export interface AppRoleModuleAssignRequest { roleId: number; @@ -677,6 +684,10 @@ export interface AppRoleUserVo { id?: number; account?: string; realName?: string; + /** 绑定发生时所选的组ID */ + groupId?: number; + /** 组路径(查询时按 groupId 现算,scope 裁剪后) */ + groupPath?: string; } export interface AppRoleAuthzModuleVo { id?: number; @@ -2031,6 +2042,8 @@ declare global { Config extends Alova2MethodConfig & { params: { userId: number; + /** 组ID(可选):传入时只返回该组下的绑定(编辑弹窗按所在组回显) */ + groupId?: number; }; } >( @@ -2129,6 +2142,8 @@ declare global { Config extends Alova2MethodConfig & { params: { userId: number; + /** 上下文组ID(可选):传入且用户确属该组时只画该组祖先链 */ + groupId?: number; }; } >( @@ -3036,6 +3051,8 @@ declare global { params: { roleId: number; userId: number; + /** 绑定组ID:按行精确删除 */ + groupId: number; }; } >( diff --git a/src/views/PermissionView.vue b/src/views/PermissionView.vue index 254a1b3..a8688eb 100644 --- a/src/views/PermissionView.vue +++ b/src/views/PermissionView.vue @@ -262,9 +262,10 @@ async function onSelectUser(user: UserItem) { // 行自带组ID(多组用户每个组一行)优先;组列表模式回退左侧选中组 const groupId = user.groupId ?? (selectedGroup.value?.id ? Number(selectedGroup.value.id) : undefined); // 三块数据并行加载,互不阻塞 - // userGroupTree 为新增接口:apiDefinitions 未重新生成(npm run api:gen)时方法不存在,降级为友好报错 + // userGroupTree 为新增接口:apiDefinitions 未重新生成(npm run api:gen)时方法不存在,降级为友好报错; + // groupId 为行所在组(每行是「用户×组」对),所属部门只画该组链路而非用户全部归属组 const userGroupTreeApi = (Apis.GroupAuthz as any).userGroupTree - ? Apis.GroupAuthz.userGroupTree({ params: { userId }, cacheFor: null }) + ? Apis.GroupAuthz.userGroupTree({ params: { userId, groupId: groupId ?? undefined }, cacheFor: null }) : Promise.reject(new Error("所属部门接口未生成,请重启后端后执行 npm run api:gen")); const [permRes, deptRes, roleRes] = await Promise.allSettled([ Apis.GroupAuthz.userPermissionTree({ @@ -371,9 +372,9 @@ function formatRoleAuthzTree(apps: any[], appListRes: any, typeRes: any): any[] if (children.length === 0) continue; // 角色未勾选任何模块的应用不展示 const cid = catMap.get(Number(app.id)) ?? -1; if (!groups.has(cid)) { - groups.set(cid, { id: cid, name: typeMap.get(cid) || "未分类", open: true, isParent: true, apps: [] }); + groups.set(cid, { id: cid, name: typeMap.get(cid) || "未分类", open: true, isParent: true, children: [] }); } - groups.get(cid).apps.push({ + groups.get(cid).children.push({ id: `app_${app.id}_${cid}`, name: app.name || `应用${app.id}`, open: false, // 与用户视图一致:应用一级默认闭合,点击才展开模块 diff --git a/src/views/group-user/index.vue b/src/views/group-user/index.vue index beb10e4..a1bd411 100644 --- a/src/views/group-user/index.vue +++ b/src/views/group-user/index.vue @@ -1,7 +1,7 @@