import { defineStore } from 'pinia' import cache from '@/utils/cache' import type { RouteRecordRaw } from 'vue-router' import { getUserInfo, login, logout } from '@/api/user' import router, { filterAsyncRoutes } from '@/router' import { TOKEN_KEY } from '@/enums/cacheEnums' import { PageEnum } from '@/enums/pageEnum' import { clearAuthInfo, getToken } from '@/utils/auth' export interface UserState { token: string userInfo: Record routes: RouteRecordRaw[] perms: string[] } const useUserStore = defineStore({ id: 'user', state: (): UserState => ({ token: getToken() || '', // 用户信息 userInfo: {}, // 路由 routes: [], // 权限 perms: [] }), getters: {}, actions: { resetState() { this.token = '' this.userInfo = {} this.perms = [] }, login(playload: any) { const { account, password, is_admin } = playload return new Promise((resolve, reject) => { login({ account: account.trim(), password: password, is_admin: is_admin }) .then((data) => { this.token = data.token cache.set(TOKEN_KEY, data.token) cache.set('is_admin', is_admin) resolve(data) }) .catch((error) => { reject(error) }) }) }, logout() { return new Promise((resolve, reject) => { logout() .then(async (data) => { this.token = '' const is_admin = cache.get('is_admin') await router.push(is_admin==1 ? PageEnum.ADMIN_LOGIN : PageEnum.LOGIN) clearAuthInfo() resolve(data) }) .catch((error) => { reject(error) }) }) }, getUserInfo() { return new Promise((resolve, reject) => { getUserInfo() .then((data) => { this.userInfo = data.user this.perms = data.permissions this.routes = filterAsyncRoutes(data.menu) resolve(data) }) .catch((error) => { reject(error) }) }) } } }) export default useUserStore