import type { UserInfo } from '/#/store'; import type { ErrorMessageMode } from '/@/utils/http/axios/types'; 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 type { LoginParams, GetUserInfoModel, // GetUserInfoByUserIdParams, } from '/@/api/sys/model/userModel'; import { getMyInfo, loginApi } from '/@/api/sys/user'; import { useI18n } from '/@/hooks/web/useI18n'; import { useMessage } from '/@/hooks/web/useMessage'; import { router } from '/@/router'; interface UserState { userInfo: Nullable; token?: string; roleList: RoleEnum[]; sessionTimeout?: boolean; } export const useUserStore = defineStore({ id: 'app-user', state: (): UserState => ({ // user info userInfo: null, // token token: undefined, // roleList roleList: [], // Whether the login expired sessionTimeout: false, }), getters: { getUserInfo(): UserInfo { return this.userInfo || getAuthCache(USER_INFO_KEY) || {}; }, getToken(): string { return this.token || getAuthCache(TOKEN_KEY); }, getRoleList(): RoleEnum[] { return this.roleList.length > 0 ? this.roleList : getAuthCache(ROLES_KEY); }, getSessionTimeout(): boolean { return !!this.sessionTimeout; }, }, actions: { setToken(info: string | undefined) { this.token = info; setAuthCache(TOKEN_KEY, info); }, setRoleList(roleList: RoleEnum[]) { this.roleList = roleList; setAuthCache(ROLES_KEY, roleList); }, setUserInfo(info: UserInfo) { this.userInfo = info; 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 { try { const { goHome = true, mode, ...loginParams } = params; const data = await loginApi(loginParams, mode); const { token } = data; // save token this.setToken(token); // get user info const userInfo = await this.getUserInfoAction(); const sessionTimeout = this.sessionTimeout; sessionTimeout && this.setSessionTimeout(false); !sessionTimeout && goHome && (await router.replace(PageEnum.BASE_HOME)); return userInfo; } catch (error) { return Promise.reject(error); } }, async getUserInfoAction() { const result = await getMyInfo(); const userInfo = result.row; const roles = userInfo; roles.value = roles.userName; const roleList = [{ ...roles }] as RoleEnum[]; console.log(roleList); console.log(`userInfo`, userInfo); this.setUserInfo(userInfo); this.setRoleList(roleList); return userInfo; }, /** * @description: logout */ logout(goLogin = false) { goLogin && router.push(PageEnum.BASE_LOGIN); }, /** * @description: Confirm before logging out */ 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); }, }); }, }, }); // Need to be used outside the setup export function useUserStoreWidthOut() { return useUserStore(store); }