From f9138cfd6bd2e4a38313a2c8aaf46cc91225f159 Mon Sep 17 00:00:00 2001 From: wxg0103 <727495428@qq.com> Date: Tue, 27 Oct 2026 18:27:46 +0800 Subject: [PATCH] fix: improve user import conflict handling and validation messages --- apps/users/serializers/user.py | 7 ++++--- .../users/import-users/ImportUsersDialog.vue | 19 +++++++++++++------ .../system/identity/users/UserFromDrawer.vue | 18 ++++++++++++++++-- .../users/import-users/ImportUsersDialog.vue | 19 +++++++++++++------ 4 files changed, 46 insertions(+), 17 deletions(-) diff --git a/apps/users/serializers/user.py b/apps/users/serializers/user.py index 1dc47dd958b..002541315ef 100644 --- a/apps/users/serializers/user.py +++ b/apps/users/serializers/user.py @@ -347,9 +347,10 @@ class UserInstance(serializers.Serializer): ) source = serializers.CharField(required=False, label=_("Source"), max_length=20, default="LOCAL") - def is_valid(self, *, raise_exception=True): - super().is_valid(raise_exception=True) - self._check_unique_username_and_email() + def is_valid(self, *, raise_exception=True, check_unique=True): + super().is_valid(raise_exception=raise_exception) + if check_unique: + self._check_unique_username_and_email() def _check_unique_username_and_email(self): username = self.data.get("username") diff --git a/ui/src/views/system/chat-management/users/import-users/ImportUsersDialog.vue b/ui/src/views/system/chat-management/users/import-users/ImportUsersDialog.vue index 2477e37da2e..46c8bf95c0f 100644 --- a/ui/src/views/system/chat-management/users/import-users/ImportUsersDialog.vue +++ b/ui/src/views/system/chat-management/users/import-users/ImportUsersDialog.vue @@ -88,12 +88,16 @@ function handleFileRemove() { nextTick(() => importUsersFormRef.value?.validateField('files')) } +function conflictTypeLabel(type: string) { + if (type === 'username') return '用户名已存在' + if (type === 'email') return '邮箱已存在' + if (type === 'nick_name') return '姓名已存在' + return `${type} 冲突` +} + function formatConflictMessage(conflicts: ChatUserSyncConflict[]) { return conflicts - .map((conflict) => { - const conflictLabel = conflict.type === 'username' ? '用户名已存在' : conflict.type === 'nick_name' ? '姓名已存在' : `${conflict.type} 冲突` - return `${conflictLabel}:${conflict.users.join('、')}` - }) + .map((conflict) => `${conflictTypeLabel(conflict.type)}:${conflict.users.join('、')}`) .join(';') } @@ -116,8 +120,11 @@ function submitImportUsers() { syncFile, ) .then((result) => { - const conflictMessage = formatConflictMessage(result.conflict_users ?? []) - MsgSuccess(`成功导入 ${result.success_count} 个用户${conflictMessage ? `,${conflictMessage}` : ''}`) + const conflictUsers = result.conflict_users ?? [] + const skippedCount = conflictUsers.reduce((sum, conflict) => sum + conflict.users.length, 0) + const conflictMessage = formatConflictMessage(conflictUsers) + const skipText = skippedCount > 0 ? `,跳过 ${skippedCount} 个用户` : '' + MsgSuccess(`成功导入 ${result.success_count} 个用户${skipText}${conflictMessage ? `,${conflictMessage}` : ''}`) emit('refresh') dialogVisible.value = false }) diff --git a/ui/src/views/system/identity/users/UserFromDrawer.vue b/ui/src/views/system/identity/users/UserFromDrawer.vue index 18470f5f745..db3c6dea6be 100644 --- a/ui/src/views/system/identity/users/UserFromDrawer.vue +++ b/ui/src/views/system/identity/users/UserFromDrawer.vue @@ -1,5 +1,5 @@