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 @@