69 lines
1.6 KiB
TypeScript
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,
|
|
}
|
|
})
|