import router from '@/router' import axios from 'axios' import { Message } from 'element-ui' import Cookies from 'js-cookie' import tool from './tool' import usersInfo from './usersInfo' // create an axios instance const service = axios.create({ baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url // withCredentials: true, // send cookies when cross-domain requests timeout: 12000 // request timeout }) // request interceptor service.interceptors.request.use( config => { // do something before request is sent // if (store.getters.token) { // // let each request carry token // // ['X-Token'] is a custom headers key // // please modify it according to the actual situation // config.headers['X-Token'] = getToken() // } if (usersInfo.accessToken()) { config.headers['Authorization'] = process.env.VUE_APP_ACCESS_TOKEN_PREFIX + usersInfo.accessToken() } // 设置语言 config.headers['language'] = Cookies.get('language') if (usersInfo.accessToken() && usersInfo.accessTokenExpiresIn() && parseInt(usersInfo.accessTokenExpiresIn()) + parseInt(usersInfo.accessTokenUpdateAt()) - 30 > parseInt(tool.getTimestamp())) { } else if (usersInfo.accessToken()) { // 需要先刷新token const refreshToken = usersInfo.refreshToken() const refreshTokenExpiresIn = usersInfo.refreshTokenExpiresIn() const refreshTokenUpdateAt = usersInfo.refreshTokenUpdateAt() if (refreshToken && refreshTokenExpiresIn && parseInt(refreshTokenExpiresIn) - 30 + parseInt(refreshTokenUpdateAt) > parseInt(tool.getTimestamp())) { // 有效,去更新 axios.get(`${process.env.VUE_APP_BASE_API}/v1/oauth/refresh-token?refresh-token=${refreshToken}`).then(response => { // 更新本地accessToken usersInfo.accessToken(response.data.accessToken) usersInfo.accessTokenExpiresIn(response.data.accessTokenExpiresIn) usersInfo.accessTokenUpdateAt(response.data.accessTokenUpdateAt) usersInfo.refreshToken(response.data.refreshToken) usersInfo.refreshTokenExpiresIn(response.data.refreshTokenExpiresIn) usersInfo.refreshTokenUpdateAt(response.data.refreshTokenUpdateAt) usersInfo.accessToken() }).catch(error => { Message({ message: 'accessToken Failed', type: 'error', duration: 5 * 1000 }) return }) } else { // console.log('refreshToken已失效'); usersInfo.clear() Message({ message: 'refreshToken Invalid', type: 'error', duration: 5 * 1000 }) return } } return config }, error => { // do something with request error console.log('请求报错----->', error) // for debug return Promise.reject(error) } ) // response interceptor service.interceptors.response.use( response => { const responseData = response.data const data = responseData.data if ((responseData.success === false) || (responseData.code && responseData.code !== 200)) { // Message({ // message: responseData.message || 'Error', // type: 'error', // duration: 5 * 1000 // }) return Promise.reject(responseData.message) } else { if (!data) { return { data: responseData } } return data } }, err => { if (err && err.response && err.response.data && err.response.data.message) { err.message = err.response.data.message } else if (err && err.response) { switch (err.response.data.status) { case 400: err.message = '请求错误' break case 401: err.message = '未授权,请登录' break case 403: err.message = '拒绝访问' break case 404: err.message = `请求地址出错: ${err.response.data.config.url}` break case 408: err.message = '请求超时' break case 500: err.message = '服务器内部错误' break case 501: err.message = '服务未实现' break case 502: err.message = '网关错误' break case 503: err.message = '服务不可用' break case 504: err.message = '网关超时' break case 505: err.message = 'HTTP版本不受支持' break default: } } if (err.response.data.status == 401) { localStorage.clear() router.replace({ path: '/login', query: { redirect: router.currentRoute.fullPath } }) } if (err.response.data.status == 403 || err.response.data.status == 400) { Message({ message: err.message || 'Error', type: 'error', duration: 3 * 1000 }) } // Message({ // message: err.message || 'Error', // type: 'error', // duration: 5 * 1000 // }) return Promise.reject(err) } ) export default service