import { defineStore } from 'pinia'; import type { RouteRecordRaw } from 'vue-router'; import { store } from '@/store'; import { login } from '@/api/login'; import { ACCESS_TOKEN_KEY } from '@/enums/cacheEnum'; import { Storage } from '@/utils/Storage'; import { logout, getInfo, permmenu } from '@/api/account'; // 动态路由生成 import { generatorDynamicRouter } from '@/router/generator-router'; import { resetRouter } from '@/router'; interface UserState { token: string; name: string; avatar: string; // like [ 'sys:user:add', 'sys:user:update' ] perms: string[]; menus: RouteRecordRaw[]; userInfo: Partial; } const userInfo = { name: '路飞', nickName: '', email: 'qa894178522@qq.com', phone: '15622472425', remark: null, headImg: 'https://buqiyuan.gitee.io/img/logo.jpg', loginIp: '112.20.118.45', }; const perms = [ 'sys:user:add', 'sys:user:delete', 'sys:menu:add', 'sys:menu:delete', 'sys:menu:list', 'sys:menu:info', 'sys:menu:update', 'sys:dept:move', 'sys:role:delete', 'sys:role:add', 'sys:role:update', 'sys:role:list', 'sys:role:page', 'sys:role:info', 'sys:dept:list', 'sys:dept:info', 'sys:user:page', 'sys:user:info', 'sys:user:update', 'sys:dept:transfer', 'sys:dept:add', 'sys:dept:delete', 'sys:dept:update', 'sys:online:list', 'sys:online:kick', 'sys:log:login:page', 'sys:task:page', 'sys:task:info', 'sys:task:add', 'sys:task:update', 'sys:task:once', 'sys:task:start', 'sys:task:stop', 'sys:task:delete', 'sys:log:task:page', 'sys:user:password', 'netdisk:manage:list', 'netdisk:manage:mkdir', 'netdisk:manage:token', 'netdisk:manage:rename', 'netdisk:manage:check', 'netdisk:manage:download', 'netdisk:manage:info', 'netdisk:manage:mark', 'netdisk:manage:copy', ]; const menus = []; export const useUserStore = defineStore({ id: 'user', state: (): UserState => ({ token: Storage.get(ACCESS_TOKEN_KEY, null), name: 'amdin', avatar: '', perms: [], menus: [], userInfo: {}, }), getters: { getToken(): string { return this.token; }, getAvatar(): string { return this.avatar; }, getName(): string { return this.name; }, getPerms(): string[] { return this.perms; }, }, actions: { /** 清空token及用户信息 */ resetToken() { this.avatar = this.token = this.name = ''; this.perms = []; this.menus = []; this.userInfo = {}; Storage.clear(); }, /** 登录成功保存token */ setToken(token: string) { this.token = token ?? ''; const ex = 7 * 24 * 60 * 60 * 1000; Storage.set(ACCESS_TOKEN_KEY, this.token, ex); }, /** 登录 */ async login(params: API.LoginParams) { try { // const { data } = await login(params); // this.setToken(data.accessToken); this.setToken('111'); return this.afterLogin(); } catch (error) { console.log('error: ', error); return Promise.reject(error); } }, /** 登录成功之后, 获取用户信息以及生成权限路由 */ async afterLogin() { try { // const [userInfo, { perms, menus }] = await Promise.all([getInfo(), permmenu()]); this.perms = perms; this.name = userInfo.name; this.avatar = userInfo.headImg; this.userInfo = userInfo as any; // 生成路由 const generatorResult = await generatorDynamicRouter([]); console.timeEnd('generatorDynamicRouter'); this.menus = generatorResult.menus.filter((item) => !item.meta?.hideInMenu); console.log('this.menus: ', this.menus); return { menus, perms, userInfo }; } catch (error) { return this.logout(); } }, /** 登出 */ async logout() { this.resetToken(); resetRouter(); }, }, }); // 在组件setup函数外使用 export function useUserStoreWithOut() { return useUserStore(store); }