import { defineStore } from 'pinia' import { ref, computed } from 'vue' export interface UserInfo { id: number mail: string nickname: string level: number create_time: string } export interface AuthResponse { access_token: string token_type: string expires_in: number user_info: UserInfo } export const useUserStore = defineStore('user', () => { // 状态 const accessToken = ref(localStorage.getItem('access_token')) const userInfo = ref(null) const isAuthenticated = computed(() => !!accessToken.value) // 从本地存储中恢复用户信息 try { const savedUserInfo = localStorage.getItem('user_info') if (savedUserInfo) { userInfo.value = JSON.parse(savedUserInfo) } } catch (error) { console.error('Failed to parse user info from localStorage:', error) } // 设置用户信息和令牌 function setAuth(authResponse: AuthResponse) { accessToken.value = authResponse.access_token userInfo.value = authResponse.user_info // 保存到本地存储 localStorage.setItem('access_token', authResponse.access_token) localStorage.setItem('user_info', JSON.stringify(authResponse.user_info)) } // 登出 function logout() { accessToken.value = null userInfo.value = null // 清除本地存储 localStorage.removeItem('access_token') localStorage.removeItem('user_info') } // 获取认证头 const authHeader = computed(() => { return accessToken.value ? `Bearer ${accessToken.value}` : '' }) return { accessToken, userInfo, isAuthenticated, authHeader, setAuth, logout, } })