* 封装 axios
*/
import axios from 'axios'
import { ElMessage } from 'element-plus'
import store from '@/store'
import router from '@/router'
import Config from '@/config'
import autoJump from '@/lin/util/auto-jump'
import ErrorCode from '@/config/error-code'
import { getToken, saveAccessToken } from '@/lin/util/token'
const config = {
baseURL: Config.baseURL || '',
timeout: 5 * 1000,
crossDomain: true,
validateStatus(status) {
return status >= 200 && status < 510
},
}
* 错误码是否是refresh相关
* @param { number } code 错误码
*/
function refreshTokenException(code) {
const codes = [10000, 10042, 10050, 10052, 10012]
return codes.includes(code)
}
const _axios = axios.create(config)
_axios.interceptors.request.use(
originConfig => {
autoJump(router)
const reqConfig = { ...originConfig }
if (!reqConfig.url) {
console.error('request need url')
}
reqConfig.method = reqConfig.method.toLowerCase()
if (reqConfig.method === 'get') {
if (!reqConfig.params) {
reqConfig.params = reqConfig.data || {}
}
} else if (reqConfig.method === 'post') {
if (!reqConfig.data) {
reqConfig.data = reqConfig.params || {}
}
let hasFile = false
Object.keys(reqConfig.data).forEach(key => {
if (typeof reqConfig.data[key] === 'object') {
const item = reqConfig.data[key]
if (item instanceof FileList || item instanceof File || item instanceof Blob) {
hasFile = true
}
}
})
if (hasFile) {
const formData = new FormData()
Object.keys(reqConfig.data).forEach(key => {
formData.append(key, reqConfig.data[key])
})
reqConfig.data = formData
}
}
if (reqConfig.url === 'cms/user/refresh') {
const refreshToken = getToken('refresh_token')
if (refreshToken) {
reqConfig.headers.Authorization = refreshToken
}
} else {
const accessToken = getToken('access_token')
if (accessToken) {
reqConfig.headers.Authorization = accessToken
}
}
return reqConfig
},
error => Promise.reject(error),
)
_axios.interceptors.response.use(
async res => {
if (res.status.toString().charAt(0) === '2') {
return res.data
}
const { code, message } = res.data
return new Promise(async (resolve, reject) => {
let tipMessage = ''
const { url } = res.config
if (refreshTokenException(code)) {
setTimeout(() => {
store.dispatch('loginOut')
const { origin } = window.location
window.location.href = origin
}, 1500)
return resolve(null)
}
if (code === 10041 || code === 10051) {
const cache = {}
if (cache.url !== url) {
cache.url = url
const refreshResult = await _axios('cms/user/refresh')
saveAccessToken(refreshResult.access_token)
const result = await _axios(res.config)
return resolve(result)
}
}
if (res.config.handleError) {
return reject(res)
}
if (Config.useFrontEndErrorMsg && !res.config.showBackend) {
const errorArr = Object.entries(ErrorCode).filter(v => v[0] === code.toString())
if (errorArr.length > 0 && errorArr[0][1] !== '') {
;[[, tipMessage]] = errorArr
} else {
tipMessage = ErrorCode['777']
}
}
if (typeof message === 'string') {
tipMessage = message
}
if (Object.prototype.toString.call(message) === '[object Object]') {
;[tipMessage] = Object.values(message).flat()
}
if (Object.prototype.toString.call(message) === '[object Array]') {
;[tipMessage] = message
}
ElMessage.error(tipMessage)
reject(res)
})
},
error => {
if (!error.response) {
ElMessage.error('请检查 API 是否异常')
console.log('error', error)
}
if (error.code === 'ECONNABORTED' && error.message.indexOf('timeout') !== -1) {
ElMessage.warning('请求超时')
}
return Promise.reject(error)
},
)
* @param {string} url
* @param {object} data
* @param {object} params
*/
export function post(url, data = {}, params = {}) {
return _axios({
method: 'post',
url,
data,
params,
})
}
* @param {string} url
* @param {object} params
*/
export function get(url, params = {}) {
return _axios({
method: 'get',
url,
params,
})
}
* @param {string} url
* @param {object} data
* @param {object} params
*/
export function put(url, data = {}, params = {}) {
return _axios({
method: 'put',
url,
params,
data,
})
}
* @param {string} url
* @param {object} params
*/
export function _delete(url, params = {}) {
return _axios({
method: 'delete',
url,
params,
})
}
export default _axios