import type { MenuRecordRaw } from '@vben-core/typings'; import type { RouteRecordRaw } from 'vue-router'; import { acceptHMRUpdate, defineStore } from 'pinia'; type AccessToken = null | string; interface BasicUserInfo { /** * 头像 */ avatar: string; /** * 用户昵称 */ realName: string; /** * 用户角色 */ roles?: string[]; /** * 用户id */ userId: string; /** * 用户名 */ username: string; } interface AccessState { /** * 权限码 */ accessCodes: string[]; /** * 可访问的菜单列表 */ accessMenus: MenuRecordRaw[]; /** * 可访问的路由列表 */ accessRoutes: RouteRecordRaw[]; /** * 登录 accessToken */ accessToken: AccessToken; /** * 登录 accessToken */ refreshToken: AccessToken; /** * 用户信息 */ userInfo: BasicUserInfo | null; /** * 用户角色 */ userRoles: string[]; } /** * @zh_CN 访问权限相关 */ export const useCoreAccessStore = defineStore('core-access', { actions: { setAccessCodes(codes: string[]) { this.accessCodes = codes; }, setAccessMenus(menus: MenuRecordRaw[]) { this.accessMenus = menus; }, setAccessRoutes(routes: RouteRecordRaw[]) { this.accessRoutes = routes; }, setAccessToken(token: AccessToken) { this.accessToken = token; }, setRefreshToken(token: AccessToken) { this.refreshToken = token; }, setUserInfo(userInfo: BasicUserInfo | null) { // 设置用户信息 this.userInfo = userInfo; // 设置角色信息 const roles = userInfo?.roles ?? []; this.setUserRoles(roles); }, setUserRoles(roles: string[]) { this.userRoles = roles; }, }, persist: { // 持久化 paths: ['accessToken', 'refreshToken', 'accessCodes'], }, state: (): AccessState => ({ accessCodes: [], accessMenus: [], accessRoutes: [], accessToken: null, refreshToken: null, userInfo: null, userRoles: [], }), }); // 解决热更新问题 const hot = import.meta.hot; if (hot) { hot.accept(acceptHMRUpdate(useCoreAccessStore, hot)); }