| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- 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;
- }
|