| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- /**
- * axios 实例(乾坤行为对齐 EOM:成功响应不回调门户 fetchNew)
- *
- * 说明:此前每次接口成功都调 parentWindow.fetchNew,
- * 进入 HR 后拉资源树会触发门户重新初始化菜单,侧栏闪一下又回到第一个系统。
- * EOM 无此逻辑,故去掉成功路径的 notifyParent。
- */
- import axios from 'axios';
- import JSONBIG from 'json-bigint';
- import { MessageBox } from 'element-ui';
- import { API_BASE_URL, TOKEN_HEADER_NAME } from '@/config/setting';
- import { getRouter, resetRouter } from '@/router';
- import { getToken, refreshToken, removeToken } from '@/utils/token-util';
- let loginExpiredDialogVisible = false;
- /** 跳转登录页,独立运行和 qiankun 嵌入运行分别处理。 */
- function redirectToLogin(from) {
- const isHome =
- !from || from === '/' || from === '/home' || from === '/home/index';
- removeToken();
- try {
- const store = require('@/store').default;
- store.commit('user/setMenus', null);
- store.commit('user/setAuthoritiesRouter', []);
- } catch (e) {
- /* ignore */
- }
- try {
- resetRouter();
- } catch (e) {
- /* ignore */
- }
- if (window.__POWERED_BY_QIANKUN__) {
- const query = isHome ? '' : `?from=${encodeURIComponent(from)}`;
- window.location.replace(`${window.location.origin}/login${query}`);
- return;
- }
- const router = getRouter();
- if (router?.currentRoute?.path !== '/login') {
- router
- .replace({
- path: '/login',
- query: isHome ? {} : { from },
- })
- .catch(() => {});
- }
- }
- function handleLoginExpired() {
- removeToken();
- if (loginExpiredDialogVisible) {
- return;
- }
- loginExpiredDialogVisible = true;
- const router = getRouter();
- const currentPath =
- router?.currentRoute?.fullPath || window.location.pathname;
- MessageBox.alert('登录状态已过期,请退出后重新登录', '系统提示', {
- confirmButtonText: '重新登录',
- closeOnClickModal: false,
- closeOnPressEscape: false,
- showClose: false,
- })
- .then(() => redirectToLogin(currentPath))
- .catch(() => redirectToLogin(currentPath))
- .finally(() => {
- loginExpiredDialogVisible = false;
- });
- }
- const request = axios.create({
- baseURL: API_BASE_URL,
- timeout: 30000,
- transformResponse: [
- (data) => {
- if (data instanceof Blob || typeof data !== 'string' || !data) {
- return data;
- }
- try {
- return JSONBIG({ storeAsString: true }).parse(data);
- } catch (error) {
- return data;
- }
- },
- ],
- });
- request.interceptors.request.use(
- (config) => {
- const token = getToken();
- if (token) {
- config.headers = config.headers || {};
- config.headers[TOKEN_HEADER_NAME] = token;
- }
- return config;
- },
- (error) => Promise.reject(error),
- );
- request.interceptors.response.use(
- (response) => {
- // 与 EOM 一致:不在成功响应里回调门户 fetchNew
- const token = response.headers?.[TOKEN_HEADER_NAME.toLowerCase()];
- if (token) {
- refreshToken(token);
- }
- return response;
- },
- (error) => {
- if (error.response?.status === 401) {
- handleLoginExpired();
- return Promise.reject(error);
- }
- const message =
- error.response?.data?.message ||
- (error.response?.status
- ? `服务调用失败(${error.response.status})`
- : '服务调用失败,请联系管理员!');
- error.message = message;
- return Promise.reject(error);
- },
- );
- export default request;
|