From 634e1c12af39f2d552bc977d51f3bdaa82275944 Mon Sep 17 00:00:00 2001 From: weicw <594098497@qq.com> Date: Fri, 30 Oct 2026 19:59:48 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=A7=92=E8=89=B2=E9=A1=B5=E6=88=90?= =?UTF-8?q?=E5=91=98=E7=BB=B4=E6=8A=A4=E5=BC=B9=E7=AA=97=E4=B8=8E=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E8=A7=92=E8=89=B2=E6=B8=85=E7=A9=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 角色页新增「成员」动作,弹窗展示姓名/账号/所属组织/状态,支持搜索添加启用用户与移除 - api/system/role 增加 pageRoleMembers/addRoleMember/removeRoleMember,走 THINK_API_URL - api/system/user 的 updateUser 改走 THINK_API_URL,空角色由后端清空 - 用户编辑表单允许角色为空,保存后可删除该用户全部角色关联 --- src/api/system/role/index.ts | 46 +++- src/api/system/role/model/index.ts | 28 +++ src/api/system/user/index.ts | 4 +- .../system/role/components/role-member.vue | 230 ++++++++++++++++++ src/views/system/role/index.vue | 16 +- .../system/user/components/user-edit.vue | 10 +- 6 files changed, 321 insertions(+), 13 deletions(-) create mode 100644 src/views/system/role/components/role-member.vue diff --git a/src/api/system/role/index.ts b/src/api/system/role/index.ts index 352e352..1dcb9c1 100644 --- a/src/api/system/role/index.ts +++ b/src/api/system/role/index.ts @@ -1,8 +1,8 @@ import request from '@/utils/request'; import type { ApiResult, PageResult } from '@/api'; -import type { Role, RoleParam } from './model'; +import type { Role, RoleMember, RoleMemberParam, RoleParam } from './model'; import type { Menu } from '../menu/model'; -import { SERVER_API_URL } from '@/config/setting'; +import { SERVER_API_URL, THINK_API_URL } from '@/config/setting'; /** * 分页查询角色 @@ -117,3 +117,45 @@ export async function updateRoleMenus(roleId?: number, data?: number[]) { } return Promise.reject(new Error(res.data.message)); } + +/** + * 分页查询角色成员 + */ +export async function pageRoleMembers(params: RoleMemberParam) { + const res = await request.get>>( + THINK_API_URL + '/system/role-member/page', + { params } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加角色成员 + */ +export async function addRoleMember(data: RoleMemberParam) { + const res = await request.post>( + THINK_API_URL + '/system/role-member', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 移除角色成员 + */ +export async function removeRoleMember(roleId?: number, userId?: number) { + const res = await request.delete>( + THINK_API_URL + '/system/role-member', + { params: { roleId, userId } } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/src/api/system/role/model/index.ts b/src/api/system/role/model/index.ts index d4c9a50..4a02264 100644 --- a/src/api/system/role/model/index.ts +++ b/src/api/system/role/model/index.ts @@ -25,3 +25,31 @@ export interface RoleParam extends PageParam { roleCode?: string; comments?: string; } + +/** + * 角色成员 + */ +export interface RoleMember { + // 用户id + userId?: number; + // 账号 + username?: string; + // 真实姓名 + realName?: string; + // 昵称 + nickname?: string; + // 所属组织id + organizationId?: number; + // 所属组织名称 + organizationName?: string; + // 状态, 0启用, 1停用 + status?: number; +} + +/** + * 角色成员查询/操作参数 + */ +export interface RoleMemberParam extends PageParam { + roleId?: number; + userId?: number; +} diff --git a/src/api/system/user/index.ts b/src/api/system/user/index.ts index 2ac2612..f0b4411 100644 --- a/src/api/system/user/index.ts +++ b/src/api/system/user/index.ts @@ -1,7 +1,7 @@ import request from '@/utils/request'; import type { ApiResult, PageResult } from '@/api'; import type { User, UserParam } from './model'; -import { SERVER_API_URL } from '@/config/setting'; +import { SERVER_API_URL, THINK_API_URL } from '@/config/setting'; /** * 分页查询用户 @@ -97,7 +97,7 @@ export async function addUser(data: User) { */ export async function updateUser(data: User) { const res = await request.put>( - SERVER_API_URL + '/system/user', + THINK_API_URL + '/system/user', data ); if (res.data.code === 0) { diff --git a/src/views/system/role/components/role-member.vue b/src/views/system/role/components/role-member.vue new file mode 100644 index 0000000..8228a11 --- /dev/null +++ b/src/views/system/role/components/role-member.vue @@ -0,0 +1,230 @@ + + + + diff --git a/src/views/system/role/index.vue b/src/views/system/role/index.vue index ab6ebca..4462465 100644 --- a/src/views/system/role/index.vue +++ b/src/views/system/role/index.vue @@ -39,6 +39,8 @@ 修改 + 成员 + 分配权限 + + @@ -77,6 +81,7 @@ import RoleSearch from './components/role-search.vue'; import RoleEdit from './components/role-edit.vue'; import RoleAuth from './components/role-auth.vue'; + import RoleMember from './components/role-member.vue'; import { pageRoles, removeRole, removeRoles } from '@/api/system/role'; import type { Role, RoleParam } from '@/api/system/role/model'; @@ -120,7 +125,7 @@ { title: '操作', key: 'action', - width: 200, + width: 260, align: 'center' } ]); @@ -137,6 +142,9 @@ // 是否显示权限分配弹窗 const showAuth = ref(false); + // 是否显示成员维护弹窗 + const showMember = ref(false); + // 表格数据源 const datasource: DatasourceFunction = ({ page, limit, where, orders }) => { return pageRoles({ ...where, ...orders, page, limit }); @@ -160,6 +168,12 @@ showAuth.value = true; }; + /* 打开成员维护弹窗 */ + const openMember = (row?: Role) => { + current.value = row ?? null; + showMember.value = true; + }; + /* 删除单个 */ const remove = (row: Role) => { const hide = messageLoading('请求中..', 0); diff --git a/src/views/system/user/components/user-edit.vue b/src/views/system/user/components/user-edit.vue index 13f807d..59649d2 100644 --- a/src/views/system/user/components/user-edit.vue +++ b/src/views/system/user/components/user-edit.vue @@ -255,14 +255,8 @@ // trigger: 'blur' // } // ], - roles: [ - { - required: true, - message: '请选择角色', - type: 'array', - trigger: 'blur' - } - ], + // 角色可以为空:清空并保存表示删除该用户的全部角色关联 + roles: [], email: [ { pattern: emailReg,