From 411253a277379839fd55a26d956a238e833a8e08 Mon Sep 17 00:00:00 2001 From: chenhao <852066789@qq.com> Date: Thu, 28 Aug 2025 15:37:34 +0800 Subject: [PATCH] =?UTF-8?q?feat(auth):=20=E5=AE=9E=E7=8E=B0=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E5=8A=9F=E8=83=BD=E5=92=8C=E8=AE=A4=E8=AF=81=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 auth.ts 文件实现登录接口调用 - 创建 auth store 管理认证状态 - 实现登录页面组件 - 优化订单列表页面样式 - 添加记住密码和自动登录功能 --- docs/ui-mockups/designs/login.png | Bin 0 -> 13448 bytes src/api/auth.ts | 20 +++ src/store/auth.ts | 80 ++++++++++ src/store/index.ts | 17 +++ src/views/List/index.vue | 100 ++++++++++-- src/views/Login/index.vue | 243 ++++++++++++++++++++++++++++++ 6 files changed, 445 insertions(+), 15 deletions(-) create mode 100644 docs/ui-mockups/designs/login.png create mode 100644 src/api/auth.ts create mode 100644 src/store/auth.ts create mode 100644 src/store/index.ts create mode 100644 src/views/Login/index.vue diff --git a/docs/ui-mockups/designs/login.png b/docs/ui-mockups/designs/login.png new file mode 100644 index 0000000000000000000000000000000000000000..cc15e3c893e77b4a30b6b40b5abc0124472208d3 GIT binary patch literal 13448 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 bD~Ow@YME`xV@L46h#-oxYA>o~%)|a0;ZKn4 literal 0 HcmV?d00001 diff --git a/src/api/auth.ts b/src/api/auth.ts new file mode 100644 index 0000000..d15088f --- /dev/null +++ b/src/api/auth.ts @@ -0,0 +1,20 @@ +import http from '@/utils/http' +import type { ApiResponse, LoginParams } from '@/types' +import type { AxiosResponse } from 'axios' + +/** + * 用户登录 + */ +export const login = (params: LoginParams): Promise>> => { + // 创建FormData对象 + const formData = new FormData() + formData.append('username', params.username) + formData.append('password', params.password) + // 添加rememberMe参数,默认为true + formData.append('rememberMe', String(params.rememberMe ?? true)) + + return http.post('/login', formData) +} \ No newline at end of file diff --git a/src/store/auth.ts b/src/store/auth.ts new file mode 100644 index 0000000..760bcaf --- /dev/null +++ b/src/store/auth.ts @@ -0,0 +1,80 @@ +import { defineStore } from 'pinia' +import { login } from '@/api/auth' +import type { LoginParams } from '@/types' + +interface AuthState { + token: string | null + userInfo: any | null + isAuthenticated: boolean +} + +export const useAuthStore = defineStore('auth', { + state: (): AuthState => ({ + token: null, + userInfo: null, + isAuthenticated: localStorage.getItem('isAuthenticated') === 'true' + }), + + actions: { + /** + * 用户登录 + */ + async login(params: LoginParams) { + try { + // 调用登录接口 + const response = await login(params) + + // 检查响应状态 + if (response.status === 200 && response.data.code === 0) { + // 由于服务器使用session判断登录状态,我们只需要设置认证状态为true + this.isAuthenticated = true + + // 保存到localStorage,用于页面刷新后保持登录状态 + localStorage.setItem('isAuthenticated', 'true') + + // 如果选择了记住密码,则保存用户名和密码 + if (params.rememberMe) { + localStorage.setItem('savedUsername', params.username) + localStorage.setItem('savedPassword', params.password) + } else { + // 清除保存的用户名和密码 + localStorage.removeItem('savedUsername') + localStorage.removeItem('savedPassword') + } + + return response.data + } else { + throw new Error(response.data.msg || '登录失败') + } + } catch (error: any) { + console.error('登录接口调用失败:', error) + throw error + } + }, + + /** + * 用户登出 + */ + logout() { + this.token = null + this.userInfo = null + this.isAuthenticated = false + + // 清除localStorage中的认证状态 + localStorage.removeItem('isAuthenticated') + + // 注意:这里不清除保存的用户名和密码,以便下次自动填充 + }, + + /** + * 检查登录状态 + */ + checkAuthStatus() { + // 从localStorage检查认证状态 + const isAuthenticated = localStorage.getItem('isAuthenticated') + if (isAuthenticated === 'true') { + this.isAuthenticated = true + } + } + } +}) \ No newline at end of file diff --git a/src/store/index.ts b/src/store/index.ts new file mode 100644 index 0000000..e447e03 --- /dev/null +++ b/src/store/index.ts @@ -0,0 +1,17 @@ +import { createPinia } from 'pinia' +import { useAuthStore } from './auth' +import { useOrderStore } from './order' + +// 创建 pinia 实例 +export const store = createPinia() + +// 导出所有 store 的 hook +export { useAuthStore, useOrderStore } + +// 初始化 store +export const initStores = () => { + // 可以在这里添加初始化逻辑 + const authStore = useAuthStore(store) + // 检查本地存储的认证状态 + authStore.checkAuthStatus() +} \ No newline at end of file diff --git a/src/views/List/index.vue b/src/views/List/index.vue index 9abe162..35b5e5a 100644 --- a/src/views/List/index.vue +++ b/src/views/List/index.vue @@ -134,18 +134,39 @@ onMounted(() => { \ No newline at end of file diff --git a/src/views/Login/index.vue b/src/views/Login/index.vue new file mode 100644 index 0000000..c4e7347 --- /dev/null +++ b/src/views/Login/index.vue @@ -0,0 +1,243 @@ + + + + + \ No newline at end of file