import { getToken, removeToken, setToken } from "@/utils/auth"; import { getInfo, login as doLogin } from "@/api/user"; import type { UserInfoVO } from "@/api/user"; import { defineStore } from "pinia"; import { resetRouter } from "@/router"; // store 侧用户信息:后端返回结构 + 登录令牌,token 独立维护 type UserInfo = Partial & { token?: string | null; }; export const useUserStore = defineStore("user", { state: (): { userInfo: UserInfo } => ({ userInfo: { token: getToken() || "", name: "", profile: {}, permissions: [], }, }), getters: { userId(): string { return this.userInfo?.profile?.id || ""; }, name(): string { return this.userInfo?.name || ""; }, avatar(): string { return this.userInfo?.profile?.avatar || ""; }, permissions(): string[] { return this.userInfo?.permissions || []; }, }, actions: { async login(userInfo: Record) { const res = await doLogin(userInfo); const { token, tokenName } = res.data; this.userInfo.token = token; setToken(token, tokenName); return true; }, async getInfo() { const res = await getInfo(); const data = res.data; const { name, profile, permissions } = data; // 保留当前的 token,避免被覆盖 const currentToken = this.userInfo.token || getToken(); this.userInfo = { token: currentToken, name, profile, permissions, }; return data; }, // user logout async logout() { await this.resetToken(); await resetRouter(); return true; }, async resetToken() { this.userInfo = { profile: {}, permissions: [], }; removeToken(); }, }, });