import store from '@/store' import { defineStore } from 'pinia' import { usePermissionStore } from './permission' import { getToken, removeToken, setToken } from '@/utils/cookies' import router, { resetRouter } from '@/router' import { accountLogin, userInfoRequest } from '@/api/login' import { RouteRecordRaw } from 'vue-router' interface IUserState { token: string roles: string[] } export const useUserStore = defineStore({ id: 'user', state: (): IUserState => { return { token: getToken() || '', roles: [] } }, actions: { /** 设置角色数组 */ setRoles(roles: string[]) { this.roles = roles }, /** 登录 */ login(userInfo: { username: string, password: string }) { return new Promise((resolve, reject) => { accountLogin({ username: userInfo.username.trim(), password: userInfo.password }) .then((res: any) => { setToken(res.data.accessToken) this.token = res.data.accessToken resolve(true) }) .catch((error) => { reject(error) }) }) }, /** 获取用户详情 */ getInfo() { return new Promise((resolve, reject) => { userInfoRequest() .then((res: any) => { this.roles = res.data.user.roles resolve(res) }) .catch((error) => { reject(error) }) }) }, /** 切换角色 */ async changeRoles(role: string) { const token = role + '-token' this.token = token setToken(token) await this.getInfo() const permissionStore = usePermissionStore() permissionStore.setRoutes(this.roles) resetRouter() permissionStore.dynamicRoutes.forEach((item: RouteRecordRaw) => { router.addRoute(item) }) }, /** 登出 */ logout() { removeToken() this.token = '' this.roles = [] resetRouter() }, /** 重置 token */ resetToken() { removeToken() this.token = '' this.roles = [] } } }) /** 在 setup 外使用 */ export function useUserStoreHook() { return useUserStore(store) }