From 1749d139875c9fe4a5ad42ac19cb6b203a7491d3 Mon Sep 17 00:00:00 2001 From: jingrow Date: Sat, 3 Jan 2026 18:50:24 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BD=BF=E7=94=A8localStorage=E4=BF=9D?= =?UTF-8?q?=E5=AD=98=E7=99=BB=E5=BD=95=E7=8A=B6=E6=80=81=EF=BC=8C=E9=98=B2?= =?UTF-8?q?=E6=AD=A2=E5=88=B7=E6=96=B0=E5=90=8E=E9=80=80=E5=87=BA=E7=99=BB?= =?UTF-8?q?=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/shared/stores/auth.ts | 64 +++++++++++++++++++++++++++++++++------ 1 file changed, 55 insertions(+), 9 deletions(-) diff --git a/src/shared/stores/auth.ts b/src/shared/stores/auth.ts index 2fabfe1..063c7e4 100644 --- a/src/shared/stores/auth.ts +++ b/src/shared/stores/auth.ts @@ -8,6 +8,8 @@ export interface User { user_type: string } +const STORAGE_KEY = 'auth_user' + export const useAuthStore = defineStore('auth', () => { const user = ref(null) const loading = ref(false) @@ -23,16 +25,49 @@ export const useAuthStore = defineStore('auth', () => { error?.message?.includes('Cookie已过期') } - // 设置用户状态(统一的状态更新方法,不保存到localStorage) + // 从 localStorage 加载用户信息 + const loadUserFromStorage = (): User | null => { + try { + const stored = localStorage.getItem(STORAGE_KEY) + if (stored) { + return JSON.parse(stored) + } + } catch (error) { + console.error('从 localStorage 加载用户信息失败:', error) + } + return null + } + + // 保存用户信息到 localStorage + const saveUserToStorage = (userInfo: User) => { + try { + localStorage.setItem(STORAGE_KEY, JSON.stringify(userInfo)) + } catch (error) { + console.error('保存用户信息到 localStorage 失败:', error) + } + } + + // 清除 localStorage 中的用户信息 + const clearUserFromStorage = () => { + try { + localStorage.removeItem(STORAGE_KEY) + } catch (error) { + console.error('清除 localStorage 用户信息失败:', error) + } + } + + // 设置用户状态(统一的状态更新方法,保存到localStorage) const setUserState = (userInfo: User) => { user.value = userInfo isAuthenticated.value = true + saveUserToStorage(userInfo) } // 清除用户状态 const clearUserState = () => { user.value = null isAuthenticated.value = false + clearUserFromStorage() } // 验证并更新用户信息 @@ -88,17 +123,28 @@ export const useAuthStore = defineStore('auth', () => { const hasSessionCookie = !isCookieExpired() const hasCookie = userId || hasSessionCookie - // 如果没有cookie,清除认证状态 - if (!hasCookie) { + // 如果有cookie,尝试验证并获取用户信息 + if (hasCookie) { + const success = await validateAndUpdateUser() + if (success) { + return + } + } + + // 如果cookie验证失败或没有cookie,尝试从localStorage恢复 + const storedUser = loadUserFromStorage() + if (storedUser) { + user.value = storedUser + isAuthenticated.value = true + // 尝试在后台验证用户信息,失败也不影响当前状态 + validateAndUpdateUser().catch(() => { + // 静默失败,保持localStorage中的状态 + }) + } else { + // 既没有cookie也没有localStorage,清除认证状态 if (isAuthenticated.value) { clearUserState() } - return - } - - // 如果有cookie,尝试验证并获取用户信息 - if (hasCookie) { - await validateAndUpdateUser() } } finally { setInitializingAuth(false)