import axios from 'axios' import { // baseURL, contentType, debounce, requestTimeout, // successCode, tokenName, } from '@/config' import store from '@/store' import qs from 'qs' import router from '@/router' // import { isArray } from '@/utils/validate' import { message } from 'ant-design-vue' import { getAccessToken, setAccessToken } from '@/utils/accessToken' let loadingInstance /** * @author chuzhixin 1204505056@qq.com * @description 处理code异常 * @param {*} code * @param {*} msg */ const handleCode = (code, msg, res) => { // debugger switch (code) { case 401: store.dispatch('user/resetAll').catch(() => {}) break case 403: router.push({ path: '/401' }).catch(() => {}) break case 500: message.error(msg || '接口异常') break case 302: // window.location.href = redirect break } } /** * @author chuzhixin 1204505056@qq.com * @description axios初始化 */ const instance = axios.create({ baseURL: window.SITE_CONFIG.apiURL, timeout: requestTimeout, headers: { 'Content-Type': contentType, }, }) /** * @author chuzhixin 1204505056@qq.com * @description axios请求拦截器 */ instance.interceptors.request.use( (config) => { // debugger const token = getAccessToken() if (token) config.headers[tokenName] = token if ( config.data && config.headers['Content-Type'] === 'application/x-www-form-urlencoded;charset=UTF-8' ) config.data = qs.stringify(config.data) if (debounce.some((item) => config.url.includes(item))) { //这里写加载动画 } if (!config.headers.REQUESTURI) { config.headers.REQUESTURI = window.location.href } return config }, (error) => { return Promise.reject(error) } ) /** * @author chuzhixin 1204505056@qq.com * @description axios响应拦截器 */ instance.interceptors.response.use( (response) => { console.log('接口返回', response) console.log('接口返回headers', response.headers) console.log('接口返回REDIRECT', response.headers.redirect) response['Access-Control-Expose-Headers'] = 'redirect' const { code, message } = response.data if (response.headers.token) { setAccessToken(response.headers.token) } if (response.headers.redirect) { window.location.replace(response.headers.redirect) return } if (response.headers.redirect === '/#/login') { var keys = document.cookie.match(/[^ =;]+(?=\=)/g) if (keys) { for (var i = keys.length; i--; ) { document.cookie = keys[i] + '=0;path=/;expires=' + new Date(0).toUTCString() //清除当前域名下的,例如:m.kevis.com document.cookie = keys[i] + '=0;path=/;domain=' + document.domain + ';expires=' + new Date(0).toUTCString() //清除当前域名下的,例如 .m.kevis.com document.cookie = keys[i] + '=0;path=/;domain=kevis.com;expires=' + new Date(0).toUTCString() //清除一级域名下的或指定的,例如 .kevis.com } } console.log('已清除') setTimeout(() => { location.reload() }, 1000) } handleCode(code, message, response.headers) if (loadingInstance) loadingInstance.close() // const { data, config } = response // const { code, msg } = data // 操作正常Code数组 // const codeVerificationArray = isArray(successCode) // ? [...successCode] // : [...[successCode]] // 是否操作正常 // if (codeVerificationArray.includes(code)) { return response // } else { // handleCode(code, msg) // return Promise.reject( // 'vue-admin-beautiful请求异常拦截:' + // JSON.stringify({ url: config.url, code, msg }) || 'Error' // ) // } }, (error) => { // debugger console.log('接口error', error) if (loadingInstance) loadingInstance.close() const { response, message } = error if (error.response) { console.log('接口返回', response) console.log('接口返回headers', response.headers) console.log('接口返回REDIRECT', response.headers.redirect) if (response.headers.token) { setAccessToken(response.headers.token) } if (response.headers.redirect) { window.location.replace(response.headers.redirect) return Promise.resolve() } const { status, data } = response handleCode(status, data.msg || message, response.headers.redirect) return Promise.reject(error) } else { let { message } = error if (message === 'Network Error') { message = '后端接口连接异常' } if (message.includes('timeout')) { message = '后端接口请求超时' } if (message.includes('Request failed with status code')) { const code = message.substr(message.length - 3) message = '后端接口' + code + '异常' } message.error(message || `后端接口未知异常`) return Promise.reject(error) } } ) export default instance