import axios from 'axios' import store from '@/store' import router from '../router' import Vue from 'vue' let vue = new Vue() // import qs from 'qs' const exceptUrls = ['/sso/user/logout', '/sso/user/sendUserInfo', '/user/order/queryOrderStatus', '/user/checkToken'] // axios.defaults.baseURL = process.env.NODE_ENV === 'development' ? 'https://test.4dkankan.com/api' : '/api' axios.defaults.baseURL = process.env.NODE_ENV === 'development' ? '/api' : '/api' // axios.defaults.baseURL = process.env.NODE_ENV === 'development' ? 'http://192.168.0.207:8087/api' : '/api' // 请求超时时限 axios.defaults.timeout = 1500000 // 请求次数 axios.defaults.retry = 2 // 请求的间隙 axios.defaults.retryDelay = 1000 // 拦截请求,做登陆,或head处理 axios.interceptors.request.use(function (config) { if (config.method === 'post') { config.data = { ...config.data } // config.data = qs.stringify(config.data) } else if (config.method === 'get') { config.params = { rnd: Math.random(), ...config.params } // config.params = qs.stringify(config.params) } for (let i = 0; i < exceptUrls.length; i++) { let url = exceptUrls[i] if (config.url === url) { return config } } if (store.state.user.token) { config.headers = { token: store.state.user.token } } // vue.$toast.showLoading() vue.$toast.showLoading() return config }, function (error) { // 对请求错误做些什么 return Promise.reject(error) }) // // 拦截返回,做错误统一处理 axios.interceptors.response.use( response => { vue.$toast.hideLoading() let code = Number(response.data.code) for (let i = 0; i < exceptUrls.length; i++) { let url = response.config.baseURL + exceptUrls[i] if (response.config.url === url) { return response } } switch (code) { case 3004: let msg = localStorage.getItem('language') === 'en' ? 'Please re-log in.' : '请重新登录' store.state.user.token && vue.$toast.show('warn', msg, async () => { await store.dispatch('logout') router.push('/login/login') }) break default: break } return response }, error => { // 请求超时的之后,抛出 error.code = ECONNABORTED的错误..错误信息是 timeout of xxx ms exceeded let err = localStorage.getItem('language') === 'en' ? 'Network request failed' : '网络请求失败' if (error.code === 'ECONNABORTED' && error.message.indexOf('timeout') !== -1) { var config = error.config config.__retryCount = config.__retryCount || 0 if (config.__retryCount >= config.retry) { // Reject with the error // window.location.reload(); vue.$toast.show('error', err, function () { vue.$toast.hideLoading() }) return Promise.reject(error) } // Increase the retry count config.__retryCount += 1 // Create new promise to handle exponential backoff var backoff = new Promise(function (resolve) { setTimeout(function () { resolve() }, config.retryDelay || 1) }) return backoff.then(function () { return axios(config) }) } else { vue.$toast.show('error', err, function () { vue.$toast.hideLoading() }) return Promise.reject(error) } } ) export default axios