diff --git a/components.d.ts b/components.d.ts index a3c0989..3378731 100644 --- a/components.d.ts +++ b/components.d.ts @@ -25,8 +25,11 @@ declare module 'vue' { NFormItem: typeof import('naive-ui')['NFormItem'] NGlobalStyle: typeof import('naive-ui')['NGlobalStyle'] NInput: typeof import('naive-ui')['NInput'] + NInputOtp: typeof import('naive-ui')['NInputOtp'] NMessageProvider: typeof import('naive-ui')['NMessageProvider'] NNotificationProvider: typeof import('naive-ui')['NNotificationProvider'] + NQrCode: typeof import('naive-ui')['NQrCode'] + NSpace: typeof import('naive-ui')['NSpace'] NThemeEditor: typeof import('naive-ui')['NThemeEditor'] RouterLink: typeof import('vue-router')['RouterLink'] RouterView: typeof import('vue-router')['RouterView'] @@ -48,8 +51,11 @@ declare global { const NFormItem: typeof import('naive-ui')['NFormItem'] const NGlobalStyle: typeof import('naive-ui')['NGlobalStyle'] const NInput: typeof import('naive-ui')['NInput'] + const NInputOtp: typeof import('naive-ui')['NInputOtp'] const NMessageProvider: typeof import('naive-ui')['NMessageProvider'] const NNotificationProvider: typeof import('naive-ui')['NNotificationProvider'] + const NQrCode: typeof import('naive-ui')['NQrCode'] + const NSpace: typeof import('naive-ui')['NSpace'] const NThemeEditor: typeof import('naive-ui')['NThemeEditor'] const RouterLink: typeof import('vue-router')['RouterLink'] const RouterView: typeof import('vue-router')['RouterView'] diff --git a/src/router/routes.ts b/src/router/routes.ts index 191342d..61a0d2e 100644 --- a/src/router/routes.ts +++ b/src/router/routes.ts @@ -15,12 +15,22 @@ const routes: RouteRecordRaw[] = [ { path: 'login', name: 'Login', - component: () => import('@/views/auth/login.vue') + component: () => import('@/views/auth/Login.vue') }, { path: 'register', name: 'Register', - component: () => import('@/views/auth/register.vue') + component: () => import('@/views/auth/Register.vue') + }, + { + path: 'phone-login', + name: 'PhoneLogin', + component: () => import('@/views/auth/PhoneLogin.vue') + }, + { + path: 'qrcode-login', + name: 'QRCodeLogin', + component: () => import('@/views/auth/QRCodeLogin.vue') } ] } diff --git a/src/utils/useDebouncedRef.ts b/src/utils/useDebouncedRef.ts new file mode 100644 index 0000000..011708c --- /dev/null +++ b/src/utils/useDebouncedRef.ts @@ -0,0 +1,30 @@ +import { customRef } from 'vue' + +/** + * 创建防抖的响应式引用 + * @param value - 初始值 + * @param delay - 防抖延迟时间(毫秒),默认 200ms + * @returns 防抖的响应式引用 + */ +export function useDebouncedRef(value: T, delay: number = 300) { + let timeout: ReturnType | null = null + + return customRef((track, trigger) => { + return { + get() { + track() + return value + }, + set(newValue: T) { + if (timeout) { + clearTimeout(timeout) + } + + timeout = setTimeout(() => { + value = newValue + trigger() + }, delay) + } + } + }) +} diff --git a/src/views/auth/login.vue b/src/views/auth/Login.vue similarity index 76% rename from src/views/auth/login.vue rename to src/views/auth/Login.vue index 8e07623..2f7f6be 100644 --- a/src/views/auth/login.vue +++ b/src/views/auth/Login.vue @@ -32,14 +32,20 @@ - 登录 + 登录 + + + +
+ 手机登录 + 扫码登录 +
没有账号? - 注册 + 创建账号
@@ -50,23 +56,26 @@ import { reactive, ref, useTemplateRef } from 'vue' import type { FormItemRule, FormRules, FormInst } from 'naive-ui' import { useAccountStore } from '@/stores' +import { useRouter } from 'vue-router' +const router = useRouter() const accountStore = useAccountStore() const formRef = useTemplateRef('formRef') const loginModel = reactive({ username: '', password: '' }) -const loginLoading = ref(false) +const loading = ref(false) const rules: FormRules = { username: [ { required: true, - message: '请输入登陆账号', trigger: ['blur'], validator: (rule: FormItemRule, value: string) => { - if (value.length < 2) { + if (!value) { + return new Error('请输入登陆账号') + } else if (value.length < 2) { return new Error('账号长度不能小于2位') } else if (value.length > 20) { return new Error('账号长度不能大于20位') @@ -80,11 +89,12 @@ const rules: FormRules = { password: [ { required: true, - message: '请输入登陆密码', trigger: ['blur'], validator: (rule: FormItemRule, value: string) => { - if (value.length < 6) { - return new Error('密码长度不能小于6位') + if (!value) { + return new Error('请输入密码') + } else if (value.length < 8) { + return new Error('密码长度不能小于8位') } else if (value.length > 20) { return new Error('密码长度不能大于20位') } else if (!/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).+$/.test(value)) { @@ -99,12 +109,12 @@ const rules: FormRules = { const userLoginFun = () => { formRef.value?.validate((errors) => { if (!errors) { - loginLoading.value = true + loading.value = true console.log('登录成功') // TODO 登录方法 accountStore.token = '123456' setTimeout(() => { - loginLoading.value = false + loading.value = false }, 1000) } }) diff --git a/src/views/auth/PhoneLogin.vue b/src/views/auth/PhoneLogin.vue new file mode 100644 index 0000000..34a54eb --- /dev/null +++ b/src/views/auth/PhoneLogin.vue @@ -0,0 +1,123 @@ + + + + + diff --git a/src/views/auth/QRCodeLogin.vue b/src/views/auth/QRCodeLogin.vue new file mode 100644 index 0000000..0b3d5b6 --- /dev/null +++ b/src/views/auth/QRCodeLogin.vue @@ -0,0 +1,35 @@ + + + + + diff --git a/src/views/auth/Register.vue b/src/views/auth/Register.vue new file mode 100644 index 0000000..1a5d728 --- /dev/null +++ b/src/views/auth/Register.vue @@ -0,0 +1,214 @@ + + + + + diff --git a/src/views/auth/register.vue b/src/views/auth/register.vue deleted file mode 100644 index 6c61cce..0000000 --- a/src/views/auth/register.vue +++ /dev/null @@ -1,5 +0,0 @@ - - - - -