63 lines
1.5 KiB
TypeScript
63 lines
1.5 KiB
TypeScript
import { defineStore } from 'pinia'
|
|
import { ref, computed } from 'vue'
|
|
import type { UserDto } from '@/types/api'
|
|
|
|
export type User = UserDto
|
|
|
|
export const useUserStore = defineStore('user', () => {
|
|
const token = ref<string>(localStorage.getItem('token') || '')
|
|
const userInfo = ref<User | null>(null)
|
|
|
|
// 判断是否已登录
|
|
const isAuthenticated = computed(() => !!token.value)
|
|
|
|
// 判断是否为管理员
|
|
const isAdmin = computed(() => {
|
|
return userInfo.value?.role === 'ADMIN' || localStorage.getItem('userRole') === 'ADMIN'
|
|
})
|
|
|
|
function setToken(newToken: string) {
|
|
token.value = newToken
|
|
localStorage.setItem('token', newToken)
|
|
}
|
|
|
|
function setUserInfo(user: User) {
|
|
userInfo.value = user
|
|
localStorage.setItem('userInfo', JSON.stringify(user))
|
|
if (user.role) {
|
|
localStorage.setItem('userRole', user.role)
|
|
}
|
|
}
|
|
|
|
function logout() {
|
|
token.value = ''
|
|
userInfo.value = null
|
|
localStorage.removeItem('token')
|
|
localStorage.removeItem('userInfo')
|
|
localStorage.removeItem('userRole')
|
|
}
|
|
|
|
function loadUserInfo() {
|
|
const saved = localStorage.getItem('userInfo')
|
|
if (saved) {
|
|
try {
|
|
userInfo.value = JSON.parse(saved)
|
|
} catch (e) {
|
|
console.error('Failed to parse user info:', e)
|
|
localStorage.removeItem('userInfo')
|
|
}
|
|
}
|
|
}
|
|
|
|
return {
|
|
token,
|
|
userInfo,
|
|
isAuthenticated,
|
|
isAdmin,
|
|
setToken,
|
|
setUserInfo,
|
|
logout,
|
|
loadUserInfo
|
|
}
|
|
})
|