From 3173525a2e918c456fe15f7332c1b2dbea0abd0f Mon Sep 17 00:00:00 2001 From: congsh Date: Sat, 18 Apr 2026 13:35:41 +0800 Subject: [PATCH] feat: support nickname login and nickname uniqueness check v0.0.3 - Login: query user by name field, authenticate with username - Register: add blur-triggered nickname uniqueness validation - Requires PocketBase users collection listRule/viewRule set to public Co-Authored-By: Claude Opus 4.7 --- frontend/src/views/Login.vue | 27 ++++++++++++++++++++------- frontend/src/views/Register.vue | 29 ++++++++++++++++++++++++++++- 2 files changed, 48 insertions(+), 8 deletions(-) diff --git a/frontend/src/views/Login.vue b/frontend/src/views/Login.vue index c1aeb4b..683d432 100644 --- a/frontend/src/views/Login.vue +++ b/frontend/src/views/Login.vue @@ -4,6 +4,7 @@ import { ref } from 'vue' import { useRouter } from 'vue-router' import { useUserStore } from '@/stores/user' import { ElMessage } from 'element-plus' +import { pb } from '@/api/pocketbase' import PasswordInput from '@/components/common/PasswordInput.vue' const router = useRouter() @@ -15,16 +16,29 @@ const loading = ref(false) async function handleLogin() { if (!identity.value || !password.value) { - ElMessage.warning('请输入邮箱和密码') + ElMessage.warning('请输入昵称/邮箱和密码') return } try { loading.value = true - await userStore.login(identity.value, password.value) + let loginIdentity = identity.value.trim() - const redirect = '/' - router.push(redirect) + // 如果不包含 @,按昵称或用户名查找对应 username 用于认证 + if (!loginIdentity.includes('@')) { + const result = await pb.collection('users').getList(1, 1, { + filter: `name="${loginIdentity}" || username="${loginIdentity}"`, + $autoCancel: false + }) + if (result.items.length === 0) { + ElMessage.error('用户不存在') + return + } + loginIdentity = (result.items[0] as any).username + } + + await userStore.login(loginIdentity, password.value) + router.push('/') } catch (error: any) { ElMessage.error(error.message || '登录失败') } finally { @@ -45,12 +59,11 @@ async function handleLogin() {