import axios from 'axios' import { MessageBox, Message } from 'element-ui' import store from '@/store' import { getToken, removeToken,tansParams } from '@/utils/auth' import router from '@/router' // @表示src目录 import cache from '@/utils/cache' import { encryptCBC, decryptCBC } from '@/utils/aescbc' // 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: 10000 // request timeout }) // request interceptor // service.interceptors.request.use( // config => { // // do something before request is sent // if (!config?.custom && 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['Authorization'] = getToken() // } // return config // }, // error => { // // do something with request error // console.log(error) // for debug // return Promise.reject(error) // } // ) // request拦截器 service.interceptors.request.use(config => { // 是否需要加密 let aqEnnable = true; // 是否需要设置 token const isToken = (config.headers || {}).isToken === false // 是否需要防止数据重复提交 const isRepeatSubmit = (config.headers || {}).repeatSubmit === false if (getToken() && !isToken) { config.headers['Authorization'] = getToken() // 让每个请求携带自定义token 请根据实际情况自行修改 } config.headers['Content-Type']='application/json' //参数加密 if (config.method === 'post' && config.data) { if(aqEnnable){ config.data = encryptCBC(JSON.stringify(config.data)) } } // get请求映射params参数 if (config.method === 'get' && config.params) { let url = '' //加密 if(aqEnnable){ let urlStr = tansParams(config.params); urlStr = urlStr.slice(0, -1); console.log(urlStr) url = config.url + '?params='+ encryptCBC(urlStr) } //未加密 if(!aqEnnable){ url = config.url + '?' + tansParams(config.params); url = url.slice(0, -1); } // config.params = {}; config.url = url; } if (!isRepeatSubmit && (config.method === 'post' || config.method === 'get')) { const requestObj = { url: config.url, data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data, time: new Date().getTime() } const requestSize = Object.keys(JSON.stringify(requestObj)).length; // 请求数据大小 const limitSize = 5 * 1024 * 1024; // 限制存放数据5M if (requestSize >= limitSize) { console.warn(`[${config.url}]: ` + '请求数据大小超出允许的5M限制,无法进行防重复提交验证。') return config; } const sessionObj = cache.session.getJSON('sessionObj') if (sessionObj === undefined || sessionObj === null || sessionObj === '') { cache.session.setJSON('sessionObj', requestObj) } else { const s_url = sessionObj.url; // 请求地址 const s_data = sessionObj.data; // 请求数据 const s_time = sessionObj.time; // 请求时间 const interval = 1000; // 间隔时间(ms),小于此时间视为重复提交 if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url) { const message = '数据正在处理,请勿重复提交'; console.warn(`[${s_url}]: ` + message) return Promise.reject(new Error(message)) } else { cache.session.setJSON('sessionObj', requestObj) } } } return config }, error => { console.log(error) 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 */ response => { const res = response.data // console.log(res) if (res.code === 401) { removeToken() MessageBox.confirm('登录已过期', '退出登录', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning' }).then(() => { router.push({ path: '/login' }) }) return } if (response.request?.responseType === 'blob') { // 文件流 return res } else if (res.code !== 200) { Message({ message: res.msg || 'Error', type: 'error', duration: 5 * 1000 }) 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 } }, error => { console.log('err' + error) // for debug Message({ message: error.message, type: 'error', duration: 5 * 1000 }) return Promise.reject(error) } ) export default service