| | |
| | | import type { UserInfo } from '/#/store'; |
| | | import type { ErrorMessageMode } from '/@/utils/http/axios/types'; |
| | | |
| | | import type { ErrorMessageMode } from '/#/axios'; |
| | | import { defineStore } from 'pinia'; |
| | | import { store } from '/@/store'; |
| | | |
| | | import { RoleEnum } from '/@/enums/roleEnum'; |
| | | import { PageEnum } from '/@/enums/pageEnum'; |
| | | import { ROLES_KEY, TOKEN_KEY, USER_INFO_KEY } from '/@/enums/cacheEnum'; |
| | | |
| | | import { getAuthCache, setAuthCache } from '/@/utils/auth'; |
| | | import { GetUserInfoModel, LoginParams } from '/@/api/sys/model/userModel'; |
| | | |
| | | import { getUserInfo, loginApi } from '/@/api/sys/user'; |
| | | |
| | | 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 { 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<UserInfo>; |
| | | token?: string; |
| | | roleList: RoleEnum[]; |
| | | sessionTimeout?: boolean; |
| | | lastUpdateTime: number; |
| | | } |
| | | |
| | | export const useUserStore = defineStore({ |
| | |
| | | roleList: [], |
| | | // Whether the login expired |
| | | sessionTimeout: false, |
| | | // Last fetch time |
| | | lastUpdateTime: 0, |
| | | }), |
| | | getters: { |
| | | getUserInfo(): UserInfo { |
| | |
| | | getSessionTimeout(): boolean { |
| | | return !!this.sessionTimeout; |
| | | }, |
| | | getLastUpdateTime(): number { |
| | | return this.lastUpdateTime; |
| | | }, |
| | | }, |
| | | actions: { |
| | | setToken(info: string | undefined) { |
| | |
| | | }, |
| | | setUserInfo(info: UserInfo) { |
| | | this.userInfo = info; |
| | | this.lastUpdateTime = new Date().getTime(); |
| | | setAuthCache(USER_INFO_KEY, info); |
| | | }, |
| | | setSessionTimeout(flag: boolean) { |
| | |
| | | params: LoginParams & { |
| | | goHome?: boolean; |
| | | mode?: ErrorMessageMode; |
| | | } |
| | | }, |
| | | ): Promise<GetUserInfoModel | null> { |
| | | try { |
| | | const { goHome = true, mode, ...loginParams } = params; |
| | |
| | | const userInfo = await this.getUserInfoAction(); |
| | | |
| | | const sessionTimeout = this.sessionTimeout; |
| | | sessionTimeout && this.setSessionTimeout(false); |
| | | !sessionTimeout && goHome && (await router.replace(PageEnum.BASE_HOME)); |
| | | if (sessionTimeout) { |
| | | this.setSessionTimeout(false); |
| | | } else if (goHome) { |
| | | const permissionStore = usePermissionStore(); |
| | | 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() { |
| | | async getUserInfoAction(): Promise<UserInfo> { |
| | | const userInfo = await getUserInfo(); |
| | | const { roles } = userInfo; |
| | | const roleList = roles.map((item) => item.value) as RoleEnum[]; |
| | |
| | | /** |
| | | * @description: logout |
| | | */ |
| | | logout(goLogin = false) { |
| | | async logout(goLogin = false) { |
| | | if (this.token) { |
| | | try { |
| | | await doLogout(); |
| | | } catch { |
| | | console.log('注销Token失败'); |
| | | } |
| | | } |
| | | this.setToken(undefined); |
| | | this.setSessionTimeout(false); |
| | | goLogin && router.push(PageEnum.BASE_LOGIN); |
| | | }, |
| | | |
| | |
| | | }); |
| | | |
| | | // Need to be used outside the setup |
| | | export function useUserStoreWidthOut() { |
| | | export function useUserStoreWithOut() { |
| | | return useUserStore(store); |
| | | } |