/** * 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;