request.js


import axios from 'axios' import store from '@/store' import storage from 'store' import notification from 'geely-design-vue/es/notification' import { ACCESS_TOKEN } from '@/store/mutation-types' import { FORM_URLENCODED } from '@/constData/constants' import Qs from 'qs' const contentTypesList = [   'application/octet-stream',   'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', ]
// 创建 axios 实例 const request = axios.create({   // API 请求的默认前缀   baseURL: window.__POWERED_BY_QIANKUN__ ? process.env.VUE_APP_QIANKUN_BASE_API : process.env.VUE_APP_BASE_API,   timeout: 5000, // 请求超时时间   headers: {     'client-code': 'PC',   }, })
const get = function (url, params = {}, _hideError = false) {   return request({     method: 'get',     url,     params,     _hideError,   }) }
const post = function (url, data = {}, contentType, _hideError = false) {   const obj = {     method: 'post',     url,     data,     _hideError,   }
  // 请求头设置,不设置时,axios默认为application/json   if (contentType) {     if (contentType === FORM_URLENCODED) {       obj.data = Qs.stringify(obj.data)       obj.headers = {         'Content-Type': contentType,       }     } else {       obj.headers = {         'Content-Type': contentType,       }     }   }
  return request(obj) }
/**  * request downloadFile  * @param {String} url  * @param {Object} data  * @param {Boolean} [_hideError], 是否隐藏错误信息  * @returns {AxiosPromise}  */ const downloadsFile = function (url, data = {}, _hideError = false) {   return request({     method: 'post',     responseType: 'blob',     url,     data:       typeof data === 'object'         ? Object.assign({ ...data })         : {             data,           },     _hideError,   }) }
// 异常拦截处理器 const errorHandler = error => {   if (error.response) {     const data = error.response.data     // 从 localstorage 获取 token     const token = storage.get(ACCESS_TOKEN)     if (error.response.status === 403) {       notification.error({         message: 'Forbidden',         description: data.message,       })     } else if (error.response.status === 401) {       notification.error({         message: 'Unauthorized',         description: 'Authorization verification failed',       })       if (token) {         store.dispatch('Logout').then(() => {           setTimeout(() => {             window.location.reload()           }, 1000)         })       }     } else if (error.response.status === 500) {       notification.error({         message: '系统异常',         description: data.message,       })     } else {       notification.error({         message: data.error,         description: data.message,       })     }   }   return Promise.reject(error) }
// request interceptor request.interceptors.request.use(config => {   const token = storage.get(ACCESS_TOKEN)   // 如果 token 存在   // 让每个请求携带自定义 token 请根据实际情况自行修改   if (token) {     config.headers['Access-Token'] = token   }   // get参数编码,防止特殊字符入参报错   let url = config.url   if (config.method === 'get' && config.params) {     url += '?'     const keys = Object.keys(config.params)     for (const key of keys) {       if (config.params[key] !== undefined && config.params[key] !== null) {         let val = config.params[key]         // 斜杠的特殊处理         if (typeof val === 'string' && val.indexOf('\\') > -1) {           val = val.replaceAll('\\', '\\\\')         }         // 编码         val = val ? encodeURIComponent(val) : val         url += `${key}=${val}&`       }     }     url = url.substring(0, url.length - 1)     config.params = {}   }   config.url = url   return config }, errorHandler)
// response interceptor request.interceptors.response.use(response => {   const { message, success, code } = response.data   // wms 返回数据在 result,而 tms 返回的数据在 data 中   // 故此处对接口数据结构先做兼容处理,后期需跟后端约定   // 前端业务中只使用 data   if (response.data.hasOwnProperty('result')) {     response.data.data = response.data.result     Reflect.deleteProperty(response.data, 'result')   }   // 下载文件的请求头有多种   const str = response.headers['content-type']   let headerStr = str   if (str && str.indexOf(';') > -1) {     headerStr = str.split(';')[0]   }   const booleanVal = contentTypesList.includes(headerStr)   if (success || booleanVal) {     return response.data   }   // token 失效退出   if (code === '403403') {     if (response.config.url.includes('logout')) {       return     }     store.dispatch('Logout').then(() => {       setTimeout(() => {         window.location.reload()       }, 1000)     })   }   // _hideError 为默认显示错误参数   !response.config._hideError && notification.error({ message })   const error = new Error(response.data.message || 'Error')   error.response = response   return Promise.reject(error) }, errorHandler)
export default request
export { request as axios, get, post, downloadsFile }