// 用户状态管理模块:管理用户的登录状态(token、昵称、用户ID) import { defineStore } from 'pinia' import { ref } from 'vue' import { getUserInfo } from '../api/user' import { readString, removeKey, removeSessionKey, writeString } from '../utils/storage' import { STORAGE_KEYS } from '../utils/storageKeys' /** 登录令牌存储键(认证凭据,不属于界面偏好,不纳入 ledgerly. 前缀) */ const TOKEN_KEY = 'token' export const useUserStore = defineStore('user', () => { // 从 localStorage 恢复 token,若不存在则为空字符串 const token = ref(readString(TOKEN_KEY)) const nickname = ref('') // 用户昵称 const userId = ref(null) // 用户 ID /** 设置 token 并持久化到 localStorage */ function setToken(t: string) { token.value = t writeString(TOKEN_KEY, 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 removeKey(TOKEN_KEY) // 清除智能查数上一次查询会话,避免同标签切换账号后看到上一用户的数据 removeSessionKey(STORAGE_KEYS.sqlQuerySession) } return { token, nickname, userId, setToken, setUserInfo, fetchUserInfo, logout } })