web/src/stores/user.ts
2025-05-06 16:37:57 +08:00

69 lines
1.6 KiB
TypeScript

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<string | null>(localStorage.getItem('access_token'))
const userInfo = ref<UserInfo | null>(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,
}
})