From d1484708fc87a4dd3df909c5a710d017e4e51f42 Mon Sep 17 00:00:00 2001 From: Litrix2 Date: Fri, 19 Apr 2024 20:52:42 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat:=20=E5=AE=8C=E6=88=90=E9=AA=8C?= =?UTF-8?q?=E8=AF=81=E7=A0=81=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- auto-imports.d.ts | 3 +- components.d.ts | 2 +- src/App.vue | 95 +++++++++++++++++++++------------- src/api/index.ts | 2 +- src/assets/icons/User.svg | 4 ++ src/components/VerifyInput.vue | 80 ++++++++++++++-------------- src/schemas/index.ts | 4 +- src/stores/background.ts | 4 +- src/stores/user.ts | 10 +++- src/utils/index.ts | 2 +- vite.config.ts | 2 +- 11 files changed, 120 insertions(+), 88 deletions(-) create mode 100644 src/assets/icons/User.svg diff --git a/auto-imports.d.ts b/auto-imports.d.ts index 1d89ee8..e6d5032 100644 --- a/auto-imports.d.ts +++ b/auto-imports.d.ts @@ -5,5 +5,6 @@ // Generated by unplugin-auto-import export {} declare global { - + const IconEpAvatar: typeof import('~icons/ep/avatar')['default'] + const IconEpCloseBold: typeof import('~icons/ep/close-bold')['default'] } diff --git a/components.d.ts b/components.d.ts index dcb45b9..b4c90e9 100644 --- a/components.d.ts +++ b/components.d.ts @@ -26,12 +26,12 @@ declare module 'vue' { ElTabs: typeof import('element-plus/es')['ElTabs'] Game2048: typeof import('./src/components/Game2048.vue')['default'] IconCsLock: typeof import('~icons/cs/lock')['default'] + IconCsUser: typeof import('~icons/cs/user')['default'] IconCsValidate: typeof import('~icons/cs/validate')['default'] IconEpLoading: typeof import('~icons/ep/loading')['default'] IconEpUserFilled: typeof import('~icons/ep/user-filled')['default'] RouterLink: typeof import('vue-router')['RouterLink'] RouterView: typeof import('vue-router')['RouterView'] VerifyInput: typeof import('./src/components/VerifyInput.vue')['default'] - VerifyInputImage: typeof import('./src/components/VerifyInputImage.vue')['default'] } } diff --git a/src/App.vue b/src/App.vue index a68d2a4..b0aa4af 100644 --- a/src/App.vue +++ b/src/App.vue @@ -8,7 +8,7 @@ {{ userStore.userInfo.name }} - + - + + + 登录 @@ -82,7 +84,7 @@ :disabled="registering" > @@ -110,6 +112,9 @@ + + + { if (value) { logining.value = false; + loginFormData.verifyImage = 'none'; loginFormRef.value?.resetFields(); registering.value = false; + registerFormData.verifyImage = 'none'; registerFormRef.value?.resetFields(); } }); @@ -177,17 +183,20 @@ const loginFormData = reactive({ username: 'wubaopu2', password: '123456', verifyImage: 'none' as VerifyImagePath, - verifyCode: '', - lastVerifyTime: undefined as number | undefined + verifyCode: '' }); const loginFormRules = reactive>({ username: [ - { required: true, message: '请输入用户名', trigger: 'blur' }, - { min: 6, message: '用户名长度不能小于3位', trigger: 'blur' } + { required: true, message: '请输入用户名' }, + { min: 6, message: '用户名长度不能小于3位' } ], password: [ - { required: true, message: '请输入密码', trigger: 'blur' }, - { min: 6, message: '密码长度不能小于6位', trigger: 'blur' } + { required: true, message: '请输入密码' }, + { min: 6, message: '密码长度不能小于6位' } + ], + verifyCode: [ + { required: true, message: '请输入验证码' }, + { pattern: /[0-9A-Za-z]{4}/, message: '验证码不符合格式' } ] }); const logining = ref(false); @@ -197,16 +206,13 @@ const registerFormData = reactive({ password: '', confirmPassword: '', verifyImage: 'none' as VerifyImagePath, - verifyCode: '', - lastVerifyTime: undefined as number | undefined + verifyCode: '' }); const registerFormRules = reactive>({ ...loginFormRules, confirmPassword: [ { - trigger: 'blur', validator: (_, value, callback) => { - console.log(value); if (value === '') { callback('请输入密码'); } else if (value !== registerFormData.password) { @@ -244,8 +250,8 @@ async function login(params: LoginParams) { ElMessage.error(loginErrorMessage(e.code, e.message)); } else { ElMessage.error('error'); - console.log(e); } + console.log(e); return false; } } @@ -258,7 +264,22 @@ async function submitLoginForm() { } catch (e) { return; } - succeed = await login(); + if (typeof loginFormData.verifyImage === 'string') { + ElMessage.error('请获取验证码'); + return; + } + const { + username, + password, + verifyImage: { key }, + verifyCode: code + } = loginFormData; + succeed = await login({ + username, + password, + key, + code + }); } finally { if (succeed) { window.location.reload(); @@ -268,16 +289,13 @@ async function submitLoginForm() { } } const registerErrorMessage = partial(errorMessage, '注册'); -async function register() { +interface RegisterParams extends LoginParams { + auth: number; +} +async function register(params: RegisterParams) { try { const registerResp = registerResponseSchema.parse( - ( - await axiosInstance.put('/api/user/create', { - username: registerFormData.username, - password: registerFormData.password, - auth: 1 - }) - ).data + (await axiosInstance.put('/api/user/create', params)).data ); if (registerResp.type === 'error') { ElMessage.error({ @@ -285,16 +303,14 @@ async function register() { }); return false; } - console.log(registerResp); return true; } catch (e) { if (e instanceof AxiosError) { ElMessage.error(registerErrorMessage(e.code, e.message)); } else { ElMessage.error('error'); - console.log(e); } - console.log('error', e); + console.log(e); return false; } } @@ -307,7 +323,17 @@ async function submitRegisterForm() { } catch { return; } - succeed = await register(); + if (typeof registerFormData.verifyImage === 'string') { + ElMessage.error('请输入验证码'); + return; + } + const { + username, + password, + verifyImage: { key }, + verifyCode: code + } = registerFormData; + succeed = await register({ username, password, key, code, auth: 1 }); } finally { if (succeed) { window.location.reload(); @@ -323,11 +349,9 @@ async function logout() { } onMounted(async () => { try { - console.log((await axiosInstance.get('/api/user/info')).data); const userInfoResponse = userInfoResponseSchema.parse( (await axiosInstance.get('/api/user/info')).data ); - console.log(userInfoResponse); if (userInfoResponse.type === 'error') { ElMessage.error( errorMessage('获取用户信息失败', userInfoResponse.code, userInfoResponse.msg) @@ -340,7 +364,6 @@ onMounted(async () => { } getAvailableRoutes(userInfoResponse.data.auth.permissions[0].routers); } catch (e) { - console.log(e); if (e instanceof AxiosError) { ElMessage.error(errorMessage('获取用户信息失败', e.code, e.message)); } diff --git a/src/api/index.ts b/src/api/index.ts index 632ba5d..0045460 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -1,7 +1,7 @@ import axios from 'axios'; import { useUserStore } from '@/stores'; const axiosInstance = axios.create({ - baseURL: 'http://pc.wzpmc.cn:18080/' + baseURL: 'http://wzpmc.cn:18080/' }); // 自动添加token到请求中. axiosInstance.interceptors.request.use((config) => { diff --git a/src/assets/icons/User.svg b/src/assets/icons/User.svg new file mode 100644 index 0000000..5d37018 --- /dev/null +++ b/src/assets/icons/User.svg @@ -0,0 +1,4 @@ + + + diff --git a/src/components/VerifyInput.vue b/src/components/VerifyInput.vue index 1af2690..1663965 100644 --- a/src/components/VerifyInput.vue +++ b/src/components/VerifyInput.vue @@ -1,34 +1,32 @@