user.ts 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375
  1. import type { UserInfo, UserUpdateInfo } from '/#/store';
  2. import type { ErrorMessageMode } from '/#/axios';
  3. import { defineStore } from 'pinia';
  4. import { store } from '/@/store';
  5. import { RoleEnum } from '/@/enums/roleEnum';
  6. import { PageEnum } from '/@/enums/pageEnum';
  7. import { JWT_TOKEN_KEY, REFRESH_TOKEN_KEY, ROLES_KEY, USER_INFO_KEY } from '/@/enums/cacheEnum';
  8. import { getAuthCache, setAuthCache } from '/@/utils/auth';
  9. import { getAppEnvConfig } from '/@/utils/env';
  10. const { VITE_GLOB_BIG_SCREEN } = getAppEnvConfig();
  11. import {
  12. LoginParams,
  13. LoginResultModel,
  14. RefreshTokenParams,
  15. SmsLoginParams,
  16. } from '/@/api/sys/model/userModel';
  17. import { doRefreshToken, getMyInfo, loginApi, smsCodeLoginApi, kidloginApi, LoginOut } from '/@/api/sys/user';
  18. import { gisLoginApi } from '/@/api/sys/gis';
  19. import { useI18n } from '/@/hooks/web/useI18n';
  20. import { useMessage } from '/@/hooks/web/useMessage';
  21. import { router } from '/@/router';
  22. import { usePermissionStore } from '/@/store/modules/permission';
  23. import { RouteRecordRaw } from 'vue-router';
  24. import { PAGE_NOT_FOUND_ROUTE } from '/@/router/routes/basic';
  25. import { createLocalStorage } from '/@/utils/cache/index';
  26. import { getEntitiesId } from '/@/api/dashboard/index';
  27. interface UserState {
  28. platInfo: any;
  29. enterPriseInfo: any;
  30. userInfo: Nullable<UserInfo>;
  31. userUpdateInfo?: Nullable<UserUpdateInfo>;
  32. token?: string;
  33. roleList: RoleEnum[];
  34. sessionTimeout?: boolean;
  35. lastUpdateTime: number;
  36. jwtToken?: string;
  37. gisToken?: string;
  38. refreshToken?: string;
  39. outTarget?: string;
  40. }
  41. const storage = createLocalStorage();
  42. export const useUserStore = defineStore({
  43. id: 'app-user',
  44. state: (): UserState => ({
  45. //平台信息
  46. platInfo: storage.get('platformInfo') || null,
  47. enterPriseInfo: storage.get('enterPriseInfo') || null,
  48. // user info
  49. userInfo: null,
  50. userUpdateInfo: null,
  51. // token
  52. jwtToken: undefined,
  53. //refresh Token
  54. refreshToken: undefined,
  55. // roleList
  56. roleList: [],
  57. // Whether the login expired
  58. sessionTimeout: false,
  59. // Last fetch time
  60. lastUpdateTime: 0,
  61. // gis的token
  62. gisToken: undefined,
  63. }),
  64. getters: {
  65. getPlatInfo(): any {
  66. return this.platInfo;
  67. },
  68. getUserInfo(): UserInfo {
  69. return this.userInfo || getAuthCache<UserInfo>(USER_INFO_KEY) || {};
  70. },
  71. getUserUpdateInfo(): UserUpdateInfo {
  72. return this.userUpdateInfo || {};
  73. },
  74. getJwtToken(): string {
  75. return this.jwtToken || getAuthCache<string>(JWT_TOKEN_KEY);
  76. },
  77. getGisToken(): string {
  78. return this.gisToken;
  79. },
  80. getRefreshToken(): string {
  81. return this.refreshToken || getAuthCache<string>(REFRESH_TOKEN_KEY);
  82. },
  83. getRoleList(): RoleEnum[] {
  84. return this.roleList.length > 0 ? this.roleList : getAuthCache<RoleEnum[]>(ROLES_KEY);
  85. },
  86. getSessionTimeout(): boolean {
  87. return !!this.sessionTimeout;
  88. },
  89. getLastUpdateTime(): number {
  90. return this.lastUpdateTime;
  91. },
  92. },
  93. actions: {
  94. setPlatInfo(platInfo: any) {
  95. this.platInfo = platInfo;
  96. },
  97. setEnterPriseInfo(enterPriseInfo: any) {
  98. this.enterPriseInfo = enterPriseInfo;
  99. },
  100. storeToken(jwtToken: string, refreshToken: string) {
  101. sessionStorage.setItem('token', jwtToken);
  102. // sessionStorage.setItem('refreshToken', JSON.stringify(refreshToken));
  103. this.jwtToken = jwtToken;
  104. this.refreshToken = refreshToken;
  105. setAuthCache(JWT_TOKEN_KEY, jwtToken);
  106. setAuthCache(REFRESH_TOKEN_KEY, refreshToken);
  107. },
  108. setToken(info: string | undefined) {
  109. sessionStorage.setItem('token', info);
  110. this.jwtToken = info;
  111. setAuthCache(JWT_TOKEN_KEY, info);
  112. },
  113. setGisToken(info: any) {
  114. sessionStorage.setItem('gisInfo', JSON.stringify(info.EMPLOYEE));
  115. sessionStorage.setItem('gisToken', info.tokenV2);
  116. this.gisToken = info.tokenV2;
  117. },
  118. setRoleList(roleList: RoleEnum[]) {
  119. this.roleList = roleList;
  120. setAuthCache(ROLES_KEY, roleList);
  121. },
  122. setUserInfo(info: UserInfo | null) {
  123. sessionStorage.setItem('user', JSON.stringify(info));
  124. this.userInfo = info;
  125. this.lastUpdateTime = new Date().getTime();
  126. setAuthCache(USER_INFO_KEY, info);
  127. },
  128. setUserUpdateInfo(info: UserUpdateInfo) {
  129. this.userUpdateInfo = info;
  130. },
  131. setSessionTimeout(flag: boolean) {
  132. this.sessionTimeout = flag;
  133. },
  134. resetState() {
  135. this.userInfo = null;
  136. this.token = '';
  137. this.roleList = [];
  138. this.sessionTimeout = false;
  139. },
  140. /**
  141. * @description: login
  142. */
  143. async login
  144. (
  145. params: LoginParams & {
  146. goHome?: boolean;
  147. mode?: ErrorMessageMode;
  148. }
  149. ): Promise<UserInfo | null> {
  150. try {
  151. const { goHome = true, mode, ...loginParams } = params;
  152. // 进行gis系统的模拟登录
  153. const gsiFormData = new FormData();
  154. gsiFormData.append('interfaceName', 'atp-provider.controller.AtpController');
  155. gsiFormData.append('methodName', 'misLogin');
  156. gsiFormData.append('args[]', "[space, ADMIN2, c4ca4238a0b923820dcc509a6f75849b, ' ']");
  157. await this.GisLogin(gsiFormData);
  158. // 本系统的登录
  159. const data = await loginApi(loginParams, mode);
  160. return this.process(data, goHome);
  161. } catch (error) {
  162. return Promise.reject(error);
  163. }
  164. },
  165. async GisLogin(loginParams): Promise<UserInfo | null> {
  166. try {
  167. const data = {
  168. status: 0,
  169. result: '2w3r2fewvdsv',
  170. }; //await gisLoginApi(loginParams);
  171. console.log('gis接口返回1:', data);
  172. if (data.status == 0) {
  173. // const resultData = JSON.parse(data.result);
  174. const resultData = data.result;
  175. console.log('gis接口返回2:', resultData);
  176. this.setGisToken(resultData);
  177. return resultData;
  178. }
  179. } catch (error) {
  180. console.log(error);
  181. return Promise.reject(error);
  182. }
  183. },
  184. async singlesignon(data) {
  185. if (!data.token) data.token = data.refreshToken;
  186. if (!data.refreshToken) data.refreshToken = data.token;
  187. return this.process(data, true);
  188. },
  189. async process(data: LoginResultModel, goHome?: boolean): Promise<UserInfo | null> {
  190. const { token, refreshToken } = data;
  191. this.storeToken(token, refreshToken);
  192. // get user info
  193. const userInfo = await this.getMyUserInfoAction();
  194. const sessionTimeout = this.sessionTimeout;
  195. if (sessionTimeout) {
  196. this.setSessionTimeout(false);
  197. } else if (goHome) {
  198. const permissionStore = usePermissionStore();
  199. if (!permissionStore.isDynamicAddedRoute) {
  200. const routes = await permissionStore.buildRoutesAction();
  201. routes.forEach((route) => {
  202. router.addRoute(route as unknown as RouteRecordRaw);
  203. });
  204. router.addRoute(PAGE_NOT_FOUND_ROUTE as unknown as RouteRecordRaw);
  205. permissionStore.setDynamicAddedRoute(true);
  206. }
  207. // console.log(`${VITE_GLOB_BIG_SCREEN}refreshToken=${refreshToken.replace(/['"]/g, '')}`);
  208. // 跳转到门户页面
  209. // sessionStorage.setItem('token', refreshToken);
  210. // setTimeout(() => {
  211. // window.location.href = `${VITE_GLOB_BIG_SCREEN}refreshToken=${refreshToken.replace(
  212. // /['"]/g,
  213. // ''
  214. // )}`;
  215. // }, 1000);
  216. // await router.replace(userInfo.homePath || PageEnum.BASE_HOME_NAV);
  217. }
  218. return userInfo;
  219. },
  220. async smsCodelogin(
  221. params: SmsLoginParams & {
  222. goHome?: boolean;
  223. mode?: ErrorMessageMode;
  224. }
  225. ): Promise<UserInfo | null> {
  226. try {
  227. const { goHome = true, mode, ...loginParams } = params;
  228. const data = await smsCodeLoginApi(loginParams, mode);
  229. return this.process(data, goHome);
  230. } catch (error) {
  231. const { createMessage } = useMessage();
  232. createMessage.error(error?.message || '');
  233. // return Promise.reject(error);
  234. }
  235. },
  236. async getMyUserInfoAction(): Promise<UserInfo> {
  237. const userInfo = await getMyInfo();
  238. this.setUserInfo(userInfo);
  239. const { roles } = userInfo;
  240. const roleList = roles.map((item) => item) as RoleEnum[];
  241. this.setRoleList(roleList);
  242. try {
  243. if (roleList[0] !== 'SYS_ADMIN') {
  244. const res = []; //await getEntitiesId();sujunling
  245. // const entityId = res.data[0]?.entityId;
  246. // window.localStorage.setItem('entityId', JSON.stringify(entityId));
  247. // window.sessionStorage.setItem('entityId', JSON.stringify(entityId));
  248. }
  249. } catch { }
  250. return userInfo;
  251. },
  252. /**
  253. * @description: logout
  254. */
  255. async logout(goLogin = false) {
  256. // try {
  257. // await doLogout();
  258. // } catch {
  259. // console.log('注销Token失败');
  260. // }
  261. // this.resetState();
  262. // setAuthCache(JWT_TOKEN_KEY, undefined);
  263. // setAuthCache(REFRESH_TOKEN_KEY, undefined);
  264. // this.setSessionTimeout(false);
  265. // // goLogin && router.push(PageEnum.BASE_LOGIN);
  266. const { VITE_GLOB_IS_IDC } = getAppEnvConfig();
  267. if (VITE_GLOB_IS_IDC && VITE_GLOB_IS_IDC.length) {
  268. await LoginOut()
  269. }
  270. this.setToken(undefined);
  271. this.setSessionTimeout(false);
  272. setAuthCache(REFRESH_TOKEN_KEY, undefined);
  273. this.setUserInfo(null);
  274. goLogin && router.push(PageEnum.BASE_LOGIN);
  275. window.localStorage.clear();
  276. window.localStorage.removeItem('updateUserInfo');
  277. },
  278. async doRefresh() {
  279. try {
  280. const req = { refreshToken: this.refreshToken } as RefreshTokenParams;
  281. const data = await doRefreshToken(req);
  282. const { token, refreshToken } = data;
  283. this.storeToken(token, refreshToken);
  284. } catch (error) {
  285. this.logout();
  286. }
  287. },
  288. /**
  289. * @description: Confirm before logging out
  290. */
  291. confirmLoginOut() {
  292. const { createConfirm } = useMessage();
  293. const { t } = useI18n();
  294. createConfirm({
  295. iconType: 'warning',
  296. title: t('sys.app.logoutTip'),
  297. content: t('sys.app.logoutMessage'),
  298. onOk: async () => {
  299. await this.logout(true);
  300. },
  301. });
  302. },
  303. /**
  304. * @description: 导航页的返回登录页
  305. */
  306. async backLogin() {
  307. await this.logout(true);
  308. },
  309. /**
  310. * @description: 导航页的返回登录页
  311. */
  312. async wlwLogin() {
  313. const { notification } = useMessage();
  314. setTimeout(() => {
  315. notification.warn({
  316. message: '警告',
  317. description: 'Token 失效请重新登录!',
  318. duration: 3,
  319. });
  320. }, 1000);
  321. await this.logout(true);
  322. },
  323. /**
  324. * @description: 有response_type后
  325. */
  326. async kidlogin(
  327. params: LoginParams & {
  328. goHome?: boolean;
  329. mode?: ErrorMessageMode;
  330. }
  331. ): Promise<UserInfo | null> {
  332. try {
  333. const { goHome = true, mode, ...loginParams } = params;
  334. // // 进行gis系统的模拟登录
  335. // let gsiFormData = new FormData();
  336. // gsiFormData.append('interfaceName', 'atp-provider.controller.AtpController');
  337. // gsiFormData.append('methodName', 'misLogin');
  338. // gsiFormData.append('args[]', "[space, ADMIN2, c4ca4238a0b923820dcc509a6f75849b, ' ']");
  339. // await this.GisLogin(gsiFormData);
  340. // 本系统的登录
  341. const data = await kidloginApi(loginParams, mode);
  342. console.log('luozhi1', data);
  343. return this.process(data.data, goHome);
  344. } catch (error) {
  345. return Promise.reject(error);
  346. }
  347. },
  348. },
  349. });
  350. // Need to be used outside the setup
  351. export function useUserStoreWithOut() {
  352. return useUserStore(store);
  353. }