import axios from 'axios' import { MessageBox, Message, Loading } from 'element-ui' import store from '@/store' import { getToken } from '@/utils/auth' import Storage from '@/utils/storage' // import { serverUrl, apiMode } from '@/utils/domain' // import { serverUrl, apiMode } from '../../public/domain' import * as Foundation from '@/utils/Foundation' import md5 from 'js-md5' import checkToken from '@/utils/checkToken' import { ERROR_TYPE } from '@/utils/enum/ErrorEnum' const qs = require('qs') // create an axios instance const serverUrl = domain.serverUrl const apiMode = domain.apiMode const service = axios.create({ baseURL: serverUrl, // url = base url + request url // withCredentials: true, // send cookies when cross-domain requests timeout: 30000, // request timeout paramsSerializer: params => qs.stringify(params, { arryFormat: 'repeat' }) }) export const mediaRequest = axios.create({ baseURL: domain.mediaUrl, timeout: 30000, headers: { 'Content-Type': 'application/json;charset=UTF-8' }, paramsSerializer: params => qs.stringify(params, { arryFormat: 'repeat' }) }) // request interceptor service.interceptors.request.use( config => { /** 配置全屏加载 */ if (config.loading) { const { loading } = config const is_num = typeof (config.loading) === 'number' if (is_num) config.loading_num = true config.loading = Loading.service({ lock: true, background: `rgba(0, 0, 0, ${is_num ? loading : '0.8'})`, spinner: 'el-icon-loading' }) } // uuid const uuid = Storage.getItem('calling_uuid') config.headers['uuid'] = uuid // 获取访问Token const accessToken = Storage.getItem('calling_access_token') if (accessToken) { if (apiMode === 'prod') { const uid = Storage.getItem('calling_uuid') const nonce = Foundation.randomString(6) const timestamp = parseInt(new Date().getTime() / 1000) const sign = md5(uid + nonce + timestamp + accessToken) const _params = { uid, nonce, timestamp, sign } let params = config.params || {} params = { ...params, ..._params } config.params = params } else { config.headers['Authorization'] = accessToken } } // do something before request is sent // config.headers['Content-type'] = 'application/x-www-form-urlencoded;charset=utf-8' // 如果是put/post请求,用qs.stringify序列化参数 const is_put_post = config.method === 'put' || config.method === 'post' || config.method === 'delete' // const is_json = config.headers['Content-Type'] === 'application/json' if (is_put_post && config.headers['Content-Type'] === 'application/json') { // 发送json数据 config.data = JSON.stringify(config.data) } if (is_put_post && config.headers['Content-Type'] !== 'application/json') { // 发送表单数据 config.data = qs.stringify(config.data, { arrayFormat: 'repeat' }) } 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() } return config }, error => { // do something with request error console.log(error) // for debug return Promise.reject(error) } ) // response interceptor service.interceptors.response.use( /** * If you want to get http information such as headers or status * Please return response => response */ /** * Determine the request status by custom code * Here is just an example * You can also judge the status by HTTP Status Code */ async response => { await closeLoading(response) return response.data // if the custom code is not 20000, it is judged as an error. // if (res.code !== 20000) { // Message({ // message: res.message || 'Error', // type: 'error', // duration: 5 * 1000 // }) // // // 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired; // if (res.code === 50008 || res.code === 50012 || res.code === 50014) { // // to re-login // MessageBox.confirm('You have been logged out, you can cancel to stay on this page, or log in again', 'Confirm logout', { // confirmButtonText: 'Re-Login', // cancelButtonText: 'Cancel', // type: 'warning' // }).then(() => { // store.dispatch('user/resetToken').then(() => { // location.reload() // }) // }) // } // return Promise.reject(new Error(res.message || 'Error')) // } else { // return res // } }, async error => { await closeLoading(error) const error_response = error.response || {} const error_data = error_response.data || {} if (error_response.status === 403) { if (!Storage.getItem('calling_refresh_token')) return store.dispatch('user/logout') window.location.replace(`/login?forward=${location.pathname}`) return } Message({ message: getErrorMgs(error_data.message), type: 'error', duration: 5 * 1000 }) return Promise.reject(error_data.message) } ) function getErrorMgs(msg) { if (ERROR_TYPE.getDesc(msg) !== undefined) { return ERROR_TYPE.getDesc(msg) } else { return msg } } /** * 关闭全局加载 * 延迟200毫秒关闭,以免晃眼睛 * @param target */ const closeLoading = (target) => { const { loading, loading_num } = target.config if (!loading) return true return new Promise((resolve, reject) => { setTimeout(() => { target.config.loading.close() resolve() }, loading_num ? 0 : 200) }) } export default function request(options) { // 如果是请求【刷新token、登录、退出】不需要检查token,直接请求。 if (/mgr\/refresh_token|mgr\/login|mgr\/logout|care/.test(options.url.toLocaleLowerCase())) { return service(options) } return new Promise((resolve, reject) => { checkToken(options).then(() => { service(options).then(resolve).catch(reject) }) }) }