import axios from 'axios'; import { getToken } from '@/utils/auth'; import { getRuntimeServices } from '@/utils/runtime-services'; import { Message } from 'element-ui'; const service = axios.create({ baseURL: process.env.VUE_APP_EEP, timeout: 300000, }); /** * 获取请求错误信息 * @param {object} error 请求错误对象 * @returns {string} 返回错误提示信息 */ function getRequestErrorMessage(error) { const status = error.response?.status; const code = error.code; if (code === 'ECONNABORTED' || /timeout/i.test(error.message || '')) { return '请求超时:服务器长时间未响应。下一步:请稍后重试,若持续出现请联系管理员检查服务状态。'; } if (!error.response) { if (typeof navigator !== 'undefined' && navigator.onLine === false) { return '网络不可用:当前设备似乎已断网。下一步:请检查网络连接恢复后重新操作。'; } if (code === 'ERR_NETWORK') { return '网络异常:当前无法连接到服务器。下一步:请检查网络、服务地址或浏览器安全限制后重试。'; } return `请求失败:${error.message || '无法连接服务器'}。下一步:请检查网络连接和服务地址后重试。`; } if (status === 401) { return '登录状态已失效:当前请求未通过身份校验。下一步:请重新登录后再试。'; } if (status === 403) { return '没有操作权限:服务器拒绝了本次请求。下一步:请确认账号权限或联系管理员开通权限。'; } if (status === 404) { return '接口不存在:当前请求的服务或资源未找到。下一步:请确认请求地址或联系后端排查接口配置。'; } if (status >= 500) { return '服务异常:服务器处理请求时发生错误。下一步:请稍后重试,若持续出现请联系管理员查看服务日志。'; } if (status >= 400) { return `请求异常:服务器返回 ${status}。下一步:请核对提交内容后重试,必要时联系管理员排查。`; } return `请求失败:${error.message || '未知错误'}。下一步:请稍后重试。`; } // 请求拦截器 service.interceptors.request.use( (config) => { config.headers['Content-Type'] = 'application/json'; return config; }, (error) => { return Promise.reject(error); }, ); // 响应拦截器 service.interceptors.response.use( (response) => { const res = response.data; const { code, status, message, error } = res; if (code === 404) { Message({ message: '请求的资源不存在', type: 'error', duration: 3 * 1000, }); return Promise.reject(new Error(message || 'Error')); } // 返回数据失败 if (status === 0) { Message({ message: `${error}`, type: 'error', duration: 3 * 1000, }); return Promise.reject(new Error(`${error}` || 'Error')); } // 无效的操作用户 if (status === -1) { Message({ message: error, type: 'error', duration: 3 * 1000, }); const { store, router } = getRuntimeServices(); store?.dispatch('user/signOut'); router?.push('/login'); } return res; }, (error) => { if (error.code === 'ERR_CANCELED') { return Promise.reject(error); } Message({ message: getRequestErrorMessage(error), type: 'error', duration: 3 * 1000, }); return Promise.reject(error); }, ); /** * 得到必需的请求参数 * @param {boolean} noTransmit 不传递旧的请求参数 * @param {object} options 其他选项 * @param {boolean} options.newAccessToken 是否使用新的AccessToken * @returns {object} 返回必需的请求参数 * */ function getRequestParams(noTransmit = false, options = { newAccessToken: false }) { const { newAccessToken } = options; const token = getToken(); let AccessToken = token?.access_token ?? ''; if (newAccessToken) { AccessToken = token?.gcls_sys_session_info?.access_token || AccessToken; } const params = { UserCode: token?.gcls_sys_session_info?.user_id ?? '', UserType: token?.gcls_sys_session_info?.user_type ?? '', SessionID: token?.gcls_sys_session_info?.session_id ?? '', }; return { AccessToken, ...(!noTransmit && params), }; } /** * @description http 请求封装 */ export const http = { /** * @param {String} url 请求地址 * @param {object} config 请求配置 */ get: (url, config) => service.get(url, config), /** * @param {string} url 请求地址 * @param {object} data 请求数据 * @param {object} config 请求配置 * @param {boolean} noTransmit 不传递旧的请求参数 * @param {object} options 其他选项 * @param {boolean} options.newAccessToken 是否使用新的AccessToken */ post: (url, data = {}, config = {}, noTransmit = false, options = { newAccessToken: false }) => { config.params = { ...config.params, ...getRequestParams(noTransmit, options), }; return service.post(url, data, config); }, postForm: (url, data = {}, config = {}, noTransmit = false, options = { newAccessToken: false }) => { config.params = { ...config.params, ...getRequestParams(noTransmit, options), }; return service.postForm(url, data, config); }, put: (url, data, config) => service.put(url, data, config), delete: (url, data, config) => service.delete(url, data, config), }; /** * 更新axios的baseURL * @param {string} address 新的baseURL地址 */ export function updateBaseURL(address = '') { service.defaults.baseURL = address || process.env.VUE_APP_EEP; }