news-classifier/client/src/stores/user.ts

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
}
})