44 lines
1.3 KiB
TypeScript
44 lines
1.3 KiB
TypeScript
// 用户状态管理模块:管理用户的登录状态(token、昵称、用户ID)
|
|
import { defineStore } from 'pinia'
|
|
import { ref } from 'vue'
|
|
import { getUserInfo } from '../api/user'
|
|
|
|
export const useUserStore = defineStore('user', () => {
|
|
// 从 localStorage 恢复 token,若不存在则为空字符串
|
|
const token = ref(localStorage.getItem('token') || '')
|
|
const nickname = ref('') // 用户昵称
|
|
const userId = ref<number | null>(null) // 用户 ID
|
|
|
|
/** 设置 token 并持久化到 localStorage */
|
|
function setToken(t: string) {
|
|
token.value = t
|
|
localStorage.setItem('token', t)
|
|
}
|
|
|
|
/** 设置用户基本信息(昵称和 ID) */
|
|
function setUserInfo(nick: string, id: number) {
|
|
nickname.value = nick
|
|
userId.value = id
|
|
}
|
|
|
|
/** 从后端获取当前登录用户的信息 */
|
|
async function fetchUserInfo() {
|
|
try {
|
|
const res: any = await getUserInfo()
|
|
setUserInfo(res.data.nickname, res.data.id)
|
|
} catch (e) {
|
|
console.error('获取用户信息失败', e)
|
|
}
|
|
}
|
|
|
|
/** 退出登录:清空状态并移除 localStorage 中的 token */
|
|
function logout() {
|
|
token.value = ''
|
|
nickname.value = ''
|
|
userId.value = null
|
|
localStorage.removeItem('token')
|
|
}
|
|
|
|
return { token, nickname, userId, setToken, setUserInfo, fetchUserInfo, logout }
|
|
})
|