import { defineStore } from 'pinia' import type { RouteRecordRaw } from 'vue-router' import { getUserInfo, iamLogin, login, logout, workWechatLogin } from '@/api/user' import { TOKEN_KEY } from '@/enums/cacheEnums' import { PageEnum } from '@/enums/pageEnum' import router, { filterAsyncRoutes } from '@/router' import { clearAuthInfo, getToken } from '@/utils/auth' import cache from '@/utils/cache' export interface UserState { token: string userInfo: Record routes: RouteRecordRaw[] perms: string[] isPaw: number // 0=需要修改密码,1=正常 } const useUserStore = defineStore({ id: 'user', state: (): UserState => ({ token: getToken() || '', // 用户信息 userInfo: {}, // 路由 routes: [], // 权限 perms: [], // 是否需要修改密码 isPaw: 1 }), getters: {}, actions: { resetState() { this.token = '' this.userInfo = {} this.perms = [] this.isPaw = 1 }, login(playload: any) { const { account, password } = playload return new Promise((resolve, reject) => { login({ account: account.trim(), password: password }) .then((data) => { this.token = data.token this.isPaw = data.is_paw ?? 1 cache.set(TOKEN_KEY, data.token) resolve(data) }) .catch((error) => { reject(error) }) }) }, logout() { return new Promise((resolve, reject) => { logout() .then(async (data) => { this.token = '' await router.push(PageEnum.LOGIN) clearAuthInfo() resolve(data) }) .catch((error) => { reject(error) }) }) }, workWechatLogin(code: string) { return new Promise((resolve, reject) => { workWechatLogin({ code }) .then((data) => { this.token = data.token this.isPaw = data.is_paw ?? 1 cache.set(TOKEN_KEY, data.token) resolve(data) }) .catch((error) => { reject(error) }) }) }, async iamLogin(ticket: string) { const data = await iamLogin(ticket) this.token = data.token this.isPaw = data.is_paw ?? 1 cache.set(TOKEN_KEY, data.token) return data }, getUserInfo() { return new Promise((resolve, reject) => { getUserInfo() .then((data) => { this.userInfo = data.user this.perms = data.permissions this.routes = filterAsyncRoutes(data.menu) // 更新 isPaw 状态 this.isPaw = data.user.is_paw ?? 1 resolve(data) }) .catch((error) => { reject(error) }) }) } } }) export default useUserStore