UNPKG

create-iking-admin

Version:

金合技术中台脚手架

192 lines (185 loc) 6.05 kB
import { ApiModel } from '@/mainApp/api/model/baseModel'; import { LoginParams } from '@/mainApp/api/sys-default/model/userModel'; import { doLogout, getUserInfo, loginApi, userAuthApi } from '@/mainApp/api/sys-default/user'; import { ROLES_KEY, USER_INFO_KEY } from '@/global/enums/cacheEnum'; import { PageEnum } from '@/global/enums/pageEnum'; import { RoleEnum } from '@/global/enums/roleEnum'; import { useI18n } from '@/global/hooks/web/useI18n'; import { useMessage } from '@/global/hooks/web/useMessage'; import { router } from '@/mainApp/router'; import { store } from '@/global/store'; import { getAuthCache, setAuthCache } from '@/mainApp/utils/auth'; import type { ErrorMessageMode } from '@t/axios'; import type { UserInfo } from '@t/store'; import { message } from 'ant-design-vue'; import { defineStore } from 'pinia'; import { h } from 'vue'; import { usePermissionStore } from './permission'; import { WHITE_NAME_LIST } from '@/mainApp/router/index'; const { VITE_GLOB_APP_TOKEN_NAME } = import.meta.env; interface UserState { userInfo: Nullable<UserInfo>; token?: string; roleList: RoleEnum[]; sessionTimeout?: boolean; lastUpdateTime: number; } export const useUserStore = defineStore({ id: 'app-user', state: (): UserState => ({ // user info userInfo: null, // token token: undefined, // roleList roleList: [], // Whether the login expired sessionTimeout: false, // Last fetch time lastUpdateTime: 0, }), getters: { getUserInfo(): UserInfo { return this.userInfo || getAuthCache<UserInfo>(USER_INFO_KEY) || {}; }, getToken(): string { return this.token || getAuthCache<string>(VITE_GLOB_APP_TOKEN_NAME); }, getRoleList(): RoleEnum[] { return this.roleList.length > 0 ? this.roleList : getAuthCache<RoleEnum[]>(ROLES_KEY); }, getSessionTimeout(): boolean { return !!this.sessionTimeout; }, getLastUpdateTime(): number { return this.lastUpdateTime; }, }, actions: { setToken(info: string | undefined) { this.token = info ? info : ''; // for null or undefined value setAuthCache(VITE_GLOB_APP_TOKEN_NAME, info); }, setRoleList(roleList: RoleEnum[]) { this.roleList = roleList; setAuthCache(ROLES_KEY, roleList); }, setUserInfo(info: UserInfo | null) { this.userInfo = info; this.lastUpdateTime = new Date().getTime(); setAuthCache(USER_INFO_KEY, info); }, setSessionTimeout(flag: boolean) { this.sessionTimeout = flag; }, resetState() { this.userInfo = null; this.token = ''; this.roleList = []; this.sessionTimeout = false; }, /** * @description: login */ async login( params: LoginParams & { goHome?: boolean; mode?: ErrorMessageMode; }, ): Promise<ApiModel | null> { try { const { goHome = true, mode, ...loginParams } = params; const data = await loginApi(loginParams, mode); if (data.success) { const { token, user } = data?.data; this.setToken(token); this.setUserInfo(user); // 用户授权 const handAuth = await this.getUserAuth(); if (!handAuth) { message.warning('用户授权失败'); return null; } this.afterLoginAction(user, goHome); } return data?.data || data; } catch (error) { return error as ApiModel; } }, async afterLoginAction(user, goHome?: boolean) { if (!this.getToken) return null; // get user info const userInfo = await this.getUserInfoAction(); const sessionTimeout = this.sessionTimeout; if (sessionTimeout) { this.setSessionTimeout(false); } else { // usePermissionStore(); const permissionStore = usePermissionStore(); await permissionStore.buildRoutesAction(); // permissionStore.setDynamicAddedRoute(true); if (goHome) { const path = userInfo?.homePath || PageEnum.BASE_HOME; // 判断即将跳转的路由是否有权限 // 无权限则跳转至权限路由第一个 const inPath = WHITE_NAME_LIST.includes(path) || permissionStore.systemMenuList.find((item) => item.link === path); if (inPath) { await router.replace(path); } else { const firstMenu = permissionStore.systemMenuList.find((f) => f.link); if (firstMenu) await router.replace(firstMenu.path); } } } return userInfo; }, // 用户授权 async getUserAuth(): Promise<boolean> { const data = await userAuthApi(); return data.success; }, async getUserInfoAction() { if (!this.getToken) return null; const res = await getUserInfo(); return res.data; }, /** * @description: logout */ async logout(goLogin = false) { if (this.getToken) { try { await doLogout(); } catch { console.info('注销Token失败'); } } this.setToken(undefined); this.setSessionTimeout(false); this.setUserInfo(null); goLogin && router.push(PageEnum.BASE_LOGIN); }, /** * @description: Confirm before logging out */ confirmLoginOut() { const { createConfirm } = useMessage(); const { t } = useI18n(); createConfirm({ iconType: 'warning', title: () => h('span', t('sys.app.logoutTip')), content: () => h('span', t('sys.app.logoutMessage')), onOk: async () => { await this.logout(true); }, }); }, }, }); // Need to be used outside the setup export function useUserStoreWithOut() { return useUserStore(store); }