From 117b422a5fff91b3fdb9af692aa815a6b315d3f4 Mon Sep 17 00:00:00 2001 From: zzh <1368735060@qq.com> Date: Fri, 3 Jul 2026 12:19:15 +0800 Subject: [PATCH] =?UTF-8?q?feat(rbac):=20=E7=94=A8=E6=88=B7=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E4=B8=8E=E6=95=B0=E6=8D=AE=E6=9D=83=E9=99=90=E6=94=B9?= =?UTF-8?q?=E7=94=A8=E5=86=85=E9=83=A8=E7=94=A8=E6=88=B7=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Cursor --- src/api/rbac/index.ts | 2 + src/api/rbac/internal-user.ts | 21 ++ .../components/ApplyTemplateModal.vue | 180 +++++++++++++++ src/views/system/dataPerm/users/index.vue | 218 ++++++++++++++++++ src/views/system/organization/user/index.vue | 29 +-- 5 files changed, 430 insertions(+), 20 deletions(-) create mode 100644 src/api/rbac/internal-user.ts create mode 100644 src/views/system/dataPerm/components/ApplyTemplateModal.vue create mode 100644 src/views/system/dataPerm/users/index.vue diff --git a/src/api/rbac/index.ts b/src/api/rbac/index.ts index 40e49cd..af770b1 100644 --- a/src/api/rbac/index.ts +++ b/src/api/rbac/index.ts @@ -6,6 +6,8 @@ // 导出所有生成的类型和服务 export * from './generated' +export { getInternalUserList } from './internal-user' + // 配置 API import { OpenAPI } from './generated/core/OpenAPI' import { axiosInstance } from './axios-config' diff --git a/src/api/rbac/internal-user.ts b/src/api/rbac/internal-user.ts new file mode 100644 index 0000000..c59ca70 --- /dev/null +++ b/src/api/rbac/internal-user.ts @@ -0,0 +1,21 @@ +import type { UserDto } from './generated/models/UserDto' +import type { UserDtoPagedResultDto } from './generated/models/UserDtoPagedResultDto' +import { axiosInstance } from './axios-config' +import { resolveAdminApiPath } from '@/utils/adminApi' + +function internalUserListUrl() { + return resolveAdminApiPath('/rbac/user/internal-list') +} + +/** 内部用户列表(排除纯客户账号),响应结构与 UserDtoPagedResultDto 兼容 */ +export async function getInternalUserList(params: { + keyword?: string + organizationId?: string + page?: number + pageSize?: number +}): Promise { + const res = await axiosInstance.get(internalUserListUrl(), { params }) + return res.data +} + +export type { UserDto } diff --git a/src/views/system/dataPerm/components/ApplyTemplateModal.vue b/src/views/system/dataPerm/components/ApplyTemplateModal.vue new file mode 100644 index 0000000..cb17657 --- /dev/null +++ b/src/views/system/dataPerm/components/ApplyTemplateModal.vue @@ -0,0 +1,180 @@ + + + diff --git a/src/views/system/dataPerm/users/index.vue b/src/views/system/dataPerm/users/index.vue new file mode 100644 index 0000000..794f9e9 --- /dev/null +++ b/src/views/system/dataPerm/users/index.vue @@ -0,0 +1,218 @@ + + + + + diff --git a/src/views/system/organization/user/index.vue b/src/views/system/organization/user/index.vue index 3b2066e..a06027b 100644 --- a/src/views/system/organization/user/index.vue +++ b/src/views/system/organization/user/index.vue @@ -158,7 +158,7 @@ import { IconPlus, IconRefresh, } from '@arco-design/web-vue/es/icon' -import { UserService, RoleService, OrganizationService } from '@/api/rbac' +import { getInternalUserList, UserService, RoleService, OrganizationService } from '@/api/rbac' import type { UserDto, UserCreateDto, UserUpdateDto, RoleSimpleDto, OrganizationTreeDto } from '@/api/rbac' import { hasPermission } from '@/utils/rbac-permission' import { handleApiError } from '@/utils/rbac-error-handler' @@ -319,25 +319,14 @@ onMounted(() => { async function loadData() { loading.value = true try { - // 注意:当前 API 不支持 organizationId 参数,如果需要组织筛选,需要后端支持 - // 或者在前端进行筛选 - const result = await UserService.getRbacUserGetList( - searchKeyword.value || undefined, - undefined, // roleId - pagination.current, - pagination.pageSize - ) - // 如果设置了组织筛选,在前端进行过滤 - let filteredData = result.items || [] - if (filterOrganizationId.value) { - filteredData = filteredData.filter( - (user) => user.organizationId === filterOrganizationId.value - ) - } - dataSource.value = filteredData - pagination.total = filterOrganizationId.value - ? filteredData.length - : result.total || 0 + const result = await getInternalUserList({ + keyword: searchKeyword.value || undefined, + organizationId: filterOrganizationId.value, + page: pagination.current, + pageSize: pagination.pageSize, + }) + dataSource.value = result.items || [] + pagination.total = result.total || 0 } catch (error) { handleApiError(error) } finally {