import axios from 'axios' import { Loading, Message, MessageBox } from 'element-ui' import store from '@/store' import { getToken, removeToken } from '@/assets/js/utils/auth' import router from '@/router' import { logger } from 'runjs/lib/common' import { decryptWithPrivateKey, encrypt, shouldEncrypt } from '@/assets/js/utils/encrypt' // create an axios instance const service = axios.create({ baseURL: '', // url = base url + request url timeout: 600000 // request timeout }) let loading function startLoading() { //使用Element loading-start 方法 loading = Loading.service({ target: '.render-container' }) } function endLoading() { //使用Element loading-close 方法 if (loading) { loading.close() } } let envInfo = process.env // request interceptor service.interceptors.request.use( config => { if (store.getters.token) { // config.headers['sid'] = getToken() config.headers['sysType'] = '3' config.headers['sid'] = getToken() } if (loading) { endLoading() } let deviceId = localStorage.getItem('deviceId') if (deviceId) { config.headers['deviceId'] = localStorage.getItem('deviceId') } if (envInfo.VUE_APP_USE_ENCRYPT === 'true') { // 3. 判断是否需要加密:跳过非 JSON 请求、OPTIONS 请求、自定义排除项 const shouldSkipEncryption = () => { // 跳过 Content-Type 不是 application/json 的请求 const contentType = config.headers['Content-Type'] || config.headers['content-type'] if (contentType && !contentType.includes('application/json')) { return true } // // 跳过自定义标记不加密的请求 (在encrypt.js中已写这部分逻辑) const url = config.url .substring(config.url.lastIndexOf(':')) .substring(6) return !shouldEncrypt(url) } // 4. 执行加密逻辑 if (!shouldSkipEncryption()) { // 添加加密标识(便于调试) config.headers['X-Encrypted'] = 'true' if (config.data) { // 保存原始数据用于调试 config.originalData = config.data // 加密数据,包装成 { content: "encryptedString" } config.data = { content: encrypt(config.data, config.url) } } } } // config.type 可以从api的接口地址定义 可以不触发loading if (config.noLoading !== true) { startLoading() } return config }, error => { return Promise.reject(error) } ) // response interceptor service.interceptors.response.use( response => { let res = response.data if (envInfo.VUE_APP_USE_ENCRYPT === 'true') { // 解密处理 if ( response.config.headers['X-Encrypted'] === 'true' && typeof res === 'string' ) { try { res = decryptWithPrivateKey(res) } catch (e) { logger.error('解密响应失败', e) } } if (res !== '' && typeof res === 'string') { res = JSON.parse(res) } } endLoading() if (response.config.back) { return res } // 二进制数据则直接返回 if ( response.request.responseType === 'blob' || response.request.responseType === 'arraybuffer' ) { return response.data } res.code = Number(res.code) if (res.code === 401) { MessageBox.confirm('登录状态已过期,请重新登录', '系统提示', { confirmButtonText: '重新登录', showCancelButton: false, type: 'warning' }).then(() => { removeToken() router.push({ path: '/login' }) }) } else if (res.code === 500) { Message({ message: res.message, type: 'error', duration: 5 * 500 }) return Promise.reject(res) } else if (res.code !== 0) { Message({ message: res.result || res.message || res.content.resultMessage || '接口请求错误', type: 'error', duration: 5 * 1000 }) return Promise.reject(res) } else { if (!res.content.result || res.content.result !== '0') { Message({ message: res.result || res.content.resultMessage || '接口请求错误', type: 'error', duration: 5 * 1000 }) } else { return res } } }, error => { endLoading() Message({ message: error.message, type: 'error', duration: 5 * 500 }) return } ) export default service