From 4a6aa03fff36df5ea1260cf0d6154e8efcadf219 Mon Sep 17 00:00:00 2001 From: zyh Date: Thu, 10 Apr 2025 05:03:36 +0000 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=AE=A4=E8=AF=81=E6=8F=90?= =?UTF-8?q?=E4=BE=9B=E8=80=85=E7=BB=84=E4=BB=B6=EF=BC=8C=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E4=B8=8D=E5=BF=85=E8=A6=81=E7=9A=84=E8=AF=B7=E6=B1=82=E6=8B=A6?= =?UTF-8?q?=E6=88=AA=E5=99=A8=E4=BB=A3=E7=A0=81=EF=BC=8C=E4=BD=BF=E7=94=A8?= =?UTF-8?q?useQuery=E7=AE=80=E5=8C=96=E7=99=BB=E5=BD=95=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E6=A3=80=E6=9F=A5=EF=BC=8C=E5=A2=9E=E5=BC=BA=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E8=AE=A4=E8=AF=81=E9=80=BB=E8=BE=91=E7=9A=84=E6=B8=85=E6=99=B0?= =?UTF-8?q?=E6=80=A7=E5=92=8C=E5=8F=AF=E7=BB=B4=E6=8A=A4=E6=80=A7=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/admin/hooks_sys.tsx | 11 ------- client/mobile/hooks.tsx | 59 +++++++++++++++++++++++++++----------- 2 files changed, 43 insertions(+), 27 deletions(-) diff --git a/client/admin/hooks_sys.tsx b/client/admin/hooks_sys.tsx index 72ff404..01b095c 100644 --- a/client/admin/hooks_sys.tsx +++ b/client/admin/hooks_sys.tsx @@ -113,17 +113,6 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children // 设置请求拦截器 useEffect(() => { - // console.log('token状态变化,当前token:', token); - // if (token) { - // // 从localStorage中恢复token时设置全局请求头 - // axios.defaults.headers.common['Authorization'] = `Bearer ${token}`; - // console.log('从状态中恢复全局Authorization头:', axios.defaults.headers.common['Authorization']); - // } else { - // // 登出时删除请求头 - // delete axios.defaults.headers.common['Authorization']; - // console.log('已删除全局Authorization头'); - // } - // 设置响应拦截器处理401错误 const responseInterceptor = axios.interceptors.response.use( (response) => response, diff --git a/client/mobile/hooks.tsx b/client/mobile/hooks.tsx index 77daeb8..b4b806e 100644 --- a/client/mobile/hooks.tsx +++ b/client/mobile/hooks.tsx @@ -1,5 +1,6 @@ import React, { createContext, useContext, useState, useEffect } from 'react'; import axios from 'axios'; +import { useQuery, useQueryClient } from '@tanstack/react-query'; import { getLocalStorageWithExpiry, setLocalStorageWithExpiry } from './utils.ts'; import type { User, AuthContextType, ThemeContextType, ThemeSettings } from '../share/types.ts'; import { ThemeMode, FontSize, CompactMode } from '../share/types.ts'; @@ -65,21 +66,40 @@ const ThemeContext = createContext(null); // 认证提供者组件 export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => { const [user, setUser] = useState(null); - const [token, setToken] = useState(null); - const [isLoading, setIsLoading] = useState(true); + const [token, setToken] = useState(getLocalStorageWithExpiry('token')); + const [isAuthenticated, setIsAuthenticated] = useState(false); + const queryClient = useQueryClient(); - // 初始化时从本地存储获取用户信息和令牌 - useEffect(() => { - const storedToken = getLocalStorageWithExpiry('token'); - const storedUser = getLocalStorageWithExpiry('user'); - - if (storedToken && storedUser) { - setToken(storedToken); - setUser(storedUser); - } - - setIsLoading(false); - }, []); + // 使用useQuery检查登录状态 + const { isLoading: isAuthChecking } = useQuery({ + queryKey: ['auth', 'status', token], + queryFn: async () => { + if (!token) { + setUser(null); + setIsAuthenticated(false); + return null; + } + + try { + // 设置请求头 + api.defaults.headers.common['Authorization'] = `Bearer ${token}`; + // 获取当前用户信息 + const currentUser = await AuthAPI.getCurrentUser(); + setUser(currentUser); + setIsAuthenticated(true); + setLocalStorageWithExpiry('user', currentUser, 24); + return { isValid: true, user: currentUser }; + } catch (error) { + // 如果API调用失败,自动登出 + logout(); + return { isValid: false }; + } + }, + enabled: !!token, + refetchOnWindowFocus: false, + retry: false, + }); + // 登录函数 const login = async (username: string, password: string) => { @@ -93,6 +113,9 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children setLocalStorageWithExpiry('token', token, 24); // 24小时过期 setLocalStorageWithExpiry('user', user, 24); + // 设置请求头 + api.defaults.headers.common['Authorization'] = `Bearer ${token}`; + } catch (error) { console.error('登录失败:', error); throw error; @@ -112,6 +135,10 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children setUser(null); localStorage.removeItem('token'); localStorage.removeItem('user'); + // 清除请求头 + delete api.defaults.headers.common['Authorization']; + // 清除所有查询缓存 + queryClient.clear(); } }; @@ -122,8 +149,8 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children token, login, logout, - isAuthenticated: !!token, - isLoading + isAuthenticated, + isLoading: isAuthChecking }} > {children}