From c18d4bfdd7e4f797c2a86d340864564a3c920795 Mon Sep 17 00:00:00 2001 From: wxg0103 <727495428@qq.com> Date: Tue, 1 Sep 2026 16:31:52 +0800 Subject: [PATCH] feat: enhance user import functionality with file upload support and user group selection --- .../api/admin/system/chat-user/chat-user.ts | 12 +- .../admin/system/settings/theme-setting.ts | 2 +- ui/src/api/admin/system/user-manage.ts | 27 ++- .../chat/users/dialog/ImportUsersDialog.vue | 99 ++++++++- .../system/identity/users/UserListView.vue | 2 +- .../users/dialog/ImportUsersDialog.vue | 194 +++++++++++++----- 6 files changed, 271 insertions(+), 65 deletions(-) diff --git a/ui/src/api/admin/system/chat-user/chat-user.ts b/ui/src/api/admin/system/chat-user/chat-user.ts index 17e64cc8760..fb7537496ef 100644 --- a/ui/src/api/admin/system/chat-user/chat-user.ts +++ b/ui/src/api/admin/system/chat-user/chat-user.ts @@ -76,9 +76,15 @@ const getChatUserSyncTypes = () => { return get(`${prefix}/sync/types`) } -/** 从指定来源导入对话用户。 */ -const postSyncChatUsers = (syncType: string) => { - return post(`${prefix}/sync/${syncType}`) +/** 从指定来源导入对话用户(file 来源需携带 xlsx 文件)。 */ +const postSyncChatUsers = (syncType: string, defaultGroupId?: string, syncFile?: File) => { + if (syncFile) { + const payload = new FormData() + payload.append('xlsx_file', syncFile) + if (defaultGroupId) payload.append('default_group_id', defaultGroupId) + return post(`${prefix}/sync/${syncType}`, payload) + } + return post<{ default_group_id?: string }, ChatUserSyncResult>(`${prefix}/sync/${syncType}`, { default_group_id: defaultGroupId }) } export default { diff --git a/ui/src/api/admin/system/settings/theme-setting.ts b/ui/src/api/admin/system/settings/theme-setting.ts index 9720cdae350..5a9b3a9f3b3 100644 --- a/ui/src/api/admin/system/settings/theme-setting.ts +++ b/ui/src/api/admin/system/settings/theme-setting.ts @@ -3,7 +3,7 @@ import type { ThemeInfo } from '../../auth/types' /** 保存系统外观主题设置。 */ const putThemeSetting = (payload: FormData) => { - return put('/settings/theme', payload) + return put('/display/update', payload) } export default { putThemeSetting } diff --git a/ui/src/api/admin/system/user-manage.ts b/ui/src/api/admin/system/user-manage.ts index fff44808db7..3719828d165 100644 --- a/ui/src/api/admin/system/user-manage.ts +++ b/ui/src/api/admin/system/user-manage.ts @@ -1,6 +1,6 @@ -import { del, get, post, put } from '../core/request' +import { del, get, getExportFile, post, put } from '../core/request' import type { ResponsePage, ParamsPage, PasswordRequest } from '../core/types' -import type { Dict, SystemUser, SystemUserPayload, SystemUserUpdateRequest, BatchSetUserRolesRequest, BatchSetUserWorkspaceRolesRequest } from '@/api/types' +import type { Dict, SystemUser, SystemUserPayload, SystemUserUpdateRequest, BatchSetUserRolesRequest, BatchSetUserWorkspaceRolesRequest, ChatUserSyncResult } from '@/api/types' const prefix = '/user_manage' @@ -44,4 +44,25 @@ const postBatchSetUserWorkspaceRoles = (payload: BatchSetUserWorkspaceRolesReque return post(`${prefix}/batch/add_role_ee`, payload) } -export default { deleteUser, getUserManagePage, postUser, postBatchDeleteUsers, postBatchSetUserRoles, postBatchSetUserWorkspaceRoles, putUser, putUserPassword } + +/** 下载系统用户导入模板。 */ +const getUserManageImportTemplate = () => { + return getExportFile('user_import_template.xlsx', `${prefix}/template/export`) +} + +/** 获取可导入的系统用户来源。 */ +const getUserManageSyncTypes = () => { + return get(`${prefix}/sync/types`) +} + +/** 从指定来源同步系统用户(file 来源需携带 xlsx 文件)。 */ +const postSyncSystemUsers = (syncType: string, syncFile?: File, workspaceId?: string, roleId?: string, defaultGroupId?: string) => { + const payload = new FormData() + if (workspaceId) payload.append('workspace_id', workspaceId) + if (roleId) payload.append('role_id', roleId) + if (defaultGroupId) payload.append('default_group_id', defaultGroupId) + if (syncFile) payload.append('xlsx_file', syncFile) + return post(`${prefix}/sync/${syncType}`, payload) +} + +export default { deleteUser, getUserManageImportTemplate, getUserManagePage, getUserManageSyncTypes, postUser, postBatchDeleteUsers, postBatchSetUserRoles, postBatchSetUserWorkspaceRoles, postSyncSystemUsers, putUser, putUserPassword } \ No newline at end of file diff --git a/ui/src/views/system/chat/users/dialog/ImportUsersDialog.vue b/ui/src/views/system/chat/users/dialog/ImportUsersDialog.vue index c8be4d92e10..f47a6ceb0bf 100644 --- a/ui/src/views/system/chat/users/dialog/ImportUsersDialog.vue +++ b/ui/src/views/system/chat/users/dialog/ImportUsersDialog.vue @@ -1,27 +1,40 @@