import type { UserInfo, UserUpdateInfo } from '/#/store'; import type { ErrorMessageMode } from '/#/axios'; import { defineStore } from 'pinia'; import { store } from '/@/store'; import { RoleEnum } from '/@/enums/roleEnum'; import { PageEnum } from '/@/enums/pageEnum'; import { JWT_TOKEN_KEY, REFRESH_TOKEN_KEY, ROLES_KEY, USER_INFO_KEY } from '/@/enums/cacheEnum'; import { getAuthCache, setAuthCache } from '/@/utils/auth'; import { getAppEnvConfig } from '/@/utils/env'; const { VITE_GLOB_BIG_SCREEN } = getAppEnvConfig(); import { LoginParams, LoginResultModel, RefreshTokenParams, SmsLoginParams, } from '/@/api/sys/model/userModel'; import { doRefreshToken, getMyInfo, loginApi, smsCodeLoginApi, kidloginApi, LoginOut } from '/@/api/sys/user'; import { gisLoginApi } from '/@/api/sys/gis'; 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'; import { createLocalStorage } from '/@/utils/cache/index'; import { getEntitiesId } from '/@/api/dashboard/index'; interface UserState { platInfo: any; enterPriseInfo: any; userInfo: Nullable; userUpdateInfo?: Nullable; token?: string; roleList: RoleEnum[]; sessionTimeout?: boolean; lastUpdateTime: number; jwtToken?: string; gisToken?: string; refreshToken?: string; outTarget?: string; } const storage = createLocalStorage(); export const useUserStore = defineStore({ id: 'app-user', state: (): UserState => ({ //平台信息 platInfo: storage.get('platformInfo') || null, enterPriseInfo: storage.get('enterPriseInfo') || null, // user info userInfo: null, userUpdateInfo: null, // token jwtToken: undefined, //refresh Token refreshToken: undefined, // roleList roleList: [], // Whether the login expired sessionTimeout: false, // Last fetch time lastUpdateTime: 0, // gis的token gisToken: undefined, }), getters: { getPlatInfo(): any { return this.platInfo; }, getUserInfo(): UserInfo { return this.userInfo || getAuthCache(USER_INFO_KEY) || {}; }, getUserUpdateInfo(): UserUpdateInfo { return this.userUpdateInfo || {}; }, getJwtToken(): string { return this.jwtToken || getAuthCache(JWT_TOKEN_KEY); }, getGisToken(): string { return this.gisToken; }, getRefreshToken(): string { return this.refreshToken || getAuthCache(REFRESH_TOKEN_KEY); }, getRoleList(): RoleEnum[] { return this.roleList.length > 0 ? this.roleList : getAuthCache(ROLES_KEY); }, getSessionTimeout(): boolean { return !!this.sessionTimeout; }, getLastUpdateTime(): number { return this.lastUpdateTime; }, }, actions: { setPlatInfo(platInfo: any) { this.platInfo = platInfo; }, setEnterPriseInfo(enterPriseInfo: any) { this.enterPriseInfo = enterPriseInfo; }, storeToken(jwtToken: string, refreshToken: string) { sessionStorage.setItem('token', jwtToken); // sessionStorage.setItem('refreshToken', JSON.stringify(refreshToken)); this.jwtToken = jwtToken; this.refreshToken = refreshToken; setAuthCache(JWT_TOKEN_KEY, jwtToken); setAuthCache(REFRESH_TOKEN_KEY, refreshToken); }, setToken(info: string | undefined) { sessionStorage.setItem('token', info); this.jwtToken = info; setAuthCache(JWT_TOKEN_KEY, info); }, setGisToken(info: any) { sessionStorage.setItem('gisInfo', JSON.stringify(info.EMPLOYEE)); sessionStorage.setItem('gisToken', info.tokenV2); this.gisToken = info.tokenV2; }, setRoleList(roleList: RoleEnum[]) { this.roleList = roleList; setAuthCache(ROLES_KEY, roleList); }, setUserInfo(info: UserInfo | null) { sessionStorage.setItem('user', JSON.stringify(info)); this.userInfo = info; this.lastUpdateTime = new Date().getTime(); setAuthCache(USER_INFO_KEY, info); }, setUserUpdateInfo(info: UserUpdateInfo) { this.userUpdateInfo = 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; // 进行gis系统的模拟登录 const gsiFormData = new FormData(); gsiFormData.append('interfaceName', 'atp-provider.controller.AtpController'); gsiFormData.append('methodName', 'misLogin'); gsiFormData.append('args[]', "[space, ADMIN2, c4ca4238a0b923820dcc509a6f75849b, ' ']"); await this.GisLogin(gsiFormData); // 本系统的登录 const data = await loginApi(loginParams, mode); return this.process(data, goHome); } catch (error) { return Promise.reject(error); } }, async GisLogin(loginParams): Promise { try { const data = { status: 0, result: '2w3r2fewvdsv', }; //await gisLoginApi(loginParams); console.log('gis接口返回1:', data); if (data.status == 0) { // const resultData = JSON.parse(data.result); const resultData = data.result; console.log('gis接口返回2:', resultData); this.setGisToken(resultData); return resultData; } } catch (error) { console.log(error); return Promise.reject(error); } }, async singlesignon(data) { if (!data.token) data.token = data.refreshToken; if (!data.refreshToken) data.refreshToken = data.token; return this.process(data, true); }, async process(data: LoginResultModel, goHome?: boolean): Promise { const { token, refreshToken } = data; this.storeToken(token, refreshToken); // get user info const userInfo = await this.getMyUserInfoAction(); const sessionTimeout = this.sessionTimeout; 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); } // console.log(`${VITE_GLOB_BIG_SCREEN}refreshToken=${refreshToken.replace(/['"]/g, '')}`); // 跳转到门户页面 // sessionStorage.setItem('token', refreshToken); // setTimeout(() => { // window.location.href = `${VITE_GLOB_BIG_SCREEN}refreshToken=${refreshToken.replace( // /['"]/g, // '' // )}`; // }, 1000); // await router.replace(userInfo.homePath || PageEnum.BASE_HOME_NAV); } return userInfo; }, async smsCodelogin( params: SmsLoginParams & { goHome?: boolean; mode?: ErrorMessageMode; } ): Promise { try { const { goHome = true, mode, ...loginParams } = params; const data = await smsCodeLoginApi(loginParams, mode); return this.process(data, goHome); } catch (error) { const { createMessage } = useMessage(); createMessage.error(error?.message || ''); // return Promise.reject(error); } }, async getMyUserInfoAction(): Promise { const userInfo = await getMyInfo(); this.setUserInfo(userInfo); const { roles } = userInfo; const roleList = roles.map((item) => item) as RoleEnum[]; this.setRoleList(roleList); try { if (roleList[0] !== 'SYS_ADMIN') { const res = []; //await getEntitiesId();sujunling // const entityId = res.data[0]?.entityId; // window.localStorage.setItem('entityId', JSON.stringify(entityId)); // window.sessionStorage.setItem('entityId', JSON.stringify(entityId)); } } catch { } return userInfo; }, /** * @description: logout */ async logout(goLogin = false) { // try { // await doLogout(); // } catch { // console.log('注销Token失败'); // } // this.resetState(); // setAuthCache(JWT_TOKEN_KEY, undefined); // setAuthCache(REFRESH_TOKEN_KEY, undefined); // this.setSessionTimeout(false); // // goLogin && router.push(PageEnum.BASE_LOGIN); const { VITE_GLOB_IS_IDC } = getAppEnvConfig(); if (VITE_GLOB_IS_IDC && VITE_GLOB_IS_IDC.length) { await LoginOut() } this.setToken(undefined); this.setSessionTimeout(false); setAuthCache(REFRESH_TOKEN_KEY, undefined); this.setUserInfo(null); goLogin && router.push(PageEnum.BASE_LOGIN); window.localStorage.clear(); window.localStorage.removeItem('updateUserInfo'); }, async doRefresh() { try { const req = { refreshToken: this.refreshToken } as RefreshTokenParams; const data = await doRefreshToken(req); const { token, refreshToken } = data; this.storeToken(token, refreshToken); } catch (error) { this.logout(); } }, /** * @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); }, }); }, /** * @description: 导航页的返回登录页 */ async backLogin() { await this.logout(true); }, /** * @description: 导航页的返回登录页 */ async wlwLogin() { const { notification } = useMessage(); setTimeout(() => { notification.warn({ message: '警告', description: 'Token 失效请重新登录!', duration: 3, }); }, 1000); await this.logout(true); }, /** * @description: 有response_type后 */ async kidlogin( params: LoginParams & { goHome?: boolean; mode?: ErrorMessageMode; } ): Promise { try { const { goHome = true, mode, ...loginParams } = params; // // 进行gis系统的模拟登录 // let gsiFormData = new FormData(); // gsiFormData.append('interfaceName', 'atp-provider.controller.AtpController'); // gsiFormData.append('methodName', 'misLogin'); // gsiFormData.append('args[]', "[space, ADMIN2, c4ca4238a0b923820dcc509a6f75849b, ' ']"); // await this.GisLogin(gsiFormData); // 本系统的登录 const data = await kidloginApi(loginParams, mode); console.log('luozhi1', data); return this.process(data.data, goHome); } catch (error) { return Promise.reject(error); } }, }, }); // Need to be used outside the setup export function useUserStoreWithOut() { return useUserStore(store); }