import axios from 'axios'
|
import Cookies from 'js-cookie'
|
import pkg from '../../package'
|
import { trim } from './util'
|
import cache from '../plugins/cache'
|
|
axios.defaults.headers.common['Content-Type'] = 'application/json;charset=UTF-8'
|
const axiosInstance = axios.create({
|
baseURL: process.env.VUE_APP_API_PREFIX,
|
// 请求超时时间
|
timeout: 60000
|
})
|
|
// 新建请求拦截器
|
axiosInstance.interceptors.request.use(config => {
|
// 参数去空格
|
if (config.trim === true) {
|
if (config.data != null) {
|
config.data = trim(config.data)
|
}
|
if (config.params != null) {
|
config.params = trim(config.params)
|
}
|
}
|
// 导出处理
|
if (config.download === true) {
|
config.responseType = 'blob'
|
}
|
// 设置操作平台
|
config.headers['eva-platform'] = `pc-${pkg.version}`
|
// 设置认证头
|
const authToken = Cookies.get('eva-auth-token')
|
if (authToken != null) {
|
config.headers['eva-auth-token'] = authToken
|
}
|
return config
|
}, function (error) {
|
return Promise.reject(error)
|
})
|
|
// 新建响应拦截器
|
axiosInstance.interceptors.response.use((response) => {
|
// 请求失败
|
if (response.status !== 200) {
|
return Promise.reject(new Error('服务器繁忙,请稍后再试'))
|
}
|
// 下载接口处理
|
if (response.headers['eva-opera-type'] === 'download') {
|
return Promise.resolve(response)
|
}
|
// 未登录
|
if (response.data.code === 401) {
|
if (response.config.autoLogin !== false) {
|
window.location.href = process.env.VUE_APP_ROUTER_MODE === 'history' ? '/#/login' : '/login'
|
}
|
return Promise.reject(response.data)
|
}
|
// 业务失败
|
if (!response.data.success) {
|
return Promise.reject(response.data)
|
}
|
return response.data.data
|
}, function (error) {
|
if (error.code == null) {
|
return Promise.reject(new Error('服务器繁忙,请稍后再试'))
|
}
|
if (error.code === 'ECONNABORTED' && error.message.indexOf('timeout') !== -1) {
|
return Promise.reject(new Error('服务器响应超时,请稍后再试'))
|
}
|
return Promise.reject(error)
|
})
|
|
// 缓存请求结果
|
const buildCachePromise = (cacheKey, method, args, cacheImpl) => {
|
return {
|
__cacheImpl: cache[cacheImpl],
|
__arguments: args,
|
__result_promise: null,
|
// 开启缓存
|
cache () {
|
const data = this.__cacheImpl.getJSON(cacheKey)
|
if (data != null) {
|
this.__result_promise = Promise.resolve(data)
|
}
|
if (this.__result_promise != null) {
|
return this.__result_promise
|
}
|
return this
|
},
|
then () {
|
return this.__access('then', arguments)
|
},
|
catch () {
|
return this.__access('catch', arguments)
|
},
|
finally () {
|
return this.__access('finally', arguments)
|
},
|
__access (methodName, args) {
|
if (this.__result_promise != null) {
|
return this.__result_promise
|
}
|
this.__result_promise = axiosInstance[method].apply(axiosInstance, this.__arguments)
|
this.__result_promise.then(data => {
|
this.__cacheImpl.setJSON(cacheKey, data)
|
return data
|
})
|
return this.__result_promise[methodName].apply(this.__result_promise, args)
|
}
|
}
|
}
|
const methods = ['get', 'post', 'delete', 'put', 'head', 'options', 'patch', 'request']
|
axiosInstance.cache = function (cacheKey, isLocal = false) {
|
if (cacheKey == null) {
|
throw Error('Request cache key can not be null.')
|
}
|
const cacheAxiosInstance = {}
|
for (const method of methods) {
|
cacheAxiosInstance[method] = function () {
|
return buildCachePromise(cacheKey, method, arguments, isLocal ? 'local' : 'session')
|
}
|
}
|
return cacheAxiosInstance
|
}
|
|
export default axiosInstance
|