/** * @program: kicc-ui * @description: 当前用户信息存储中心 * @author: entfrm开发团队-王翔 * @create: 2022/4/9 */ import type {UserInfo} from '/#/store'; import {defineStore} from 'pinia'; import {store} from '/@/store'; import {PageEnum} from '/@/enums/pageEnum'; import {ACCESS_TOKEN_KEY, REFRESH_TOKEN_KEY, USER_INFO_KEY} from '/@/enums/cacheEnum'; import {setAuthCache} from '/@/utils/auth'; import {GetUserInfoModel, LoginParams} from '/@/api/sys/model/userModel'; import {doLogout, getUserInfo, loginApi} from '/@/api/sys/user'; import {useI18n} from '/@/hooks/web/useI18n'; import {useMessage} from '/@/hooks/web/useMessage'; import {router} from '/@/router'; import {usePermissionStore} from '/@/store/modules/permission'; import {RouteRecordRaw} from 'vue-router'; import {PAGE_NOT_FOUND_ROUTE} from '/@/router/routes/basic'; interface UserState { userInfo: Nullable; sessionTimeout: boolean; roleIds: Recordable; permissions: Recordable; access_token: string; refresh_token: string; } export const useUserStore = defineStore({ id: 'app-user', state: (): UserState => ({ // 用户信息 userInfo: null, // 登录是否过期 sessionTimeout: false, // 角色ID用于权限校验 roleIds: [], // 按钮权限标识用于权限校验 permissions: [], // 访问令牌 access_token: '', // 刷新令牌 refresh_token: '', }), getters: { getUserInfo(): UserInfo | {[key: string]: any} { return this.userInfo || {}; }, getAccessToken(): string { return this.access_token; }, getRefreshToken(): string { return this.refresh_token; }, getSessionTimeout(): boolean { return !!this.sessionTimeout; }, getRoleIds(): Recordable { return this.roleIds; }, getPermissions(): Recordable { return this.permissions; }, }, actions: { setRoleIds(roleIds: Recordable) { this.roleIds = roleIds; }, setPermissions(permissions: Recordable) { this.permissions = permissions; }, setAccessToken(accessToken: string) { this.access_token = accessToken; setAuthCache(ACCESS_TOKEN_KEY, accessToken); }, setRefreshToken(refreshToken: string) { this.refresh_token = refreshToken; setAuthCache(REFRESH_TOKEN_KEY, refreshToken); }, setUserInfo(userInfo: UserInfo) { this.userInfo = userInfo; setAuthCache(USER_INFO_KEY, userInfo); }, setSessionTimeout(flag: boolean) { this.sessionTimeout = flag; }, resetState() { this.userInfo = null; this.sessionTimeout = false; this.access_token = ''; this.refresh_token = ''; this.roleIds = []; this.permissions = []; }, /** 登录 */ async login(params: LoginParams & { goHome?: boolean; }): Promise { try { const { goHome = true, ...loginParams } = params; const data = await loginApi(loginParams); const { access_token, refresh_token } = data; this.setAccessToken(access_token); this.setRefreshToken(refresh_token); // 获取用户信息 const userInfo = await this.getUserInfoAction(); const sessionTimeout = this.sessionTimeout; if (sessionTimeout) { this.setSessionTimeout(false); } else if (goHome) { // 处理路由与菜单的构建,并且进行缓存 const permissionStore = usePermissionStore(); // 使用isDynamicAddedRoute字段做菜单路由缓存功能 if (!permissionStore.isDynamicAddedRoute) { const routes = await permissionStore.buildRoutesAction(); routes.forEach((route) => { router.addRoute(route as unknown as RouteRecordRaw); }); router.addRoute(PAGE_NOT_FOUND_ROUTE as unknown as RouteRecordRaw); permissionStore.setDynamicAddedRoute(true); } await router.replace(userInfo.homePath || PageEnum.BASE_HOME); } return userInfo; } catch (error) { return Promise.reject(error); } }, async getUserInfoAction(): Promise { const userInfo = await getUserInfo(); // 存储用户扩展信息,便于鉴权 this.setUserInfo(userInfo); this.setRoleIds(userInfo.roleIds); this.setPermissions(userInfo.permissions); return userInfo; }, /** 登出 */ async logout(goLogin = false) { try { await doLogout(); } catch { console.log('注销Token失败'); } this.setAccessToken(''); this.setRefreshToken(''); this.setSessionTimeout(false); goLogin && router.push(PageEnum.BASE_LOGIN); }, /** 退出前确认 */ confirmLoginOut() { const { createConfirm } = useMessage(); const { t } = useI18n(); createConfirm({ iconType: 'warning', title: t('sys.app.logoutTip'), content: t('sys.app.logoutMessage'), onOk: async () => { await this.logout(true); }, }); }, }, }); // 需要在设置之外使用 export function useUserStoreWithOut() { return useUserStore(store); }