import axios from 'axios' import Cookies from 'js-cookie' import pkg from '../../../package' import { trim } from '@/utils/util' import cache from '@/plugins/cache' import extendsMethods from './extends.methods' import AES from '@/utils/aes' // 默认配置 axios.defaults.headers.common['Content-Type'] = 'application/json;charset=UTF-8' // axios.defaults.headers.common['Content-Type'] = 'application/x-www-form-urlencoded' const axiosInstance = axios.create({ baseURL: process.env.VUE_APP_API_PREFIX, // 请求超时时间 timeout: 60000 }) // 新建请求拦截器 axiosInstance.interceptors.request.use(config => { console.log('请求', config) // 初始化加密标识值 config.encrypt = config.encrypt == null ? process.env.VUE_APP_ENCRYPT_REQUEST === 'on' : config.encrypt if (config.headers['Content-Type'] != null && config.headers['Content-Type'].startsWith('multipart/form-data')) { config.encrypt = false } // 参数去空格 if (config.trim === true) { if (config.data != null) { config.data = trim(config.data) } if (config.params != null) { config.params = trim(config.params) } } // 导出处理 if (config.download === true) { config.responseType = 'blob' } // 设置操作平台 config.headers['eva-platform'] = `pc-${pkg.version}` // 设置2fa密码 const cachePwd = cache.twoFA.__get('eva-2fa-password') if (cachePwd != null) { config.headers['eva-2fa-password'] = cachePwd.value // 未记住密码时直接删除密码 if (cachePwd.expiredTime == null) { // 延迟删除,防止promise.all同时发起多个2FA接口时无法读取到密码 setTimeout(() => { cache.twoFA.removePassword() }, 200) } } // 参数加密 // if (config.encrypt) { // let requestData = null // if (config.data != null) { // requestData = config.data // } // if (config.params != null) { // requestData = config.params // } // if (process.env.VUE_APP_DEBUG === 'on') { // console.log(`DEBUG: ${config.method} ${config.url}`, '请求参数', requestData) // } // // POST请求 // if (config.data != null) { // // config.data = { // // _p: AES.encrypt(JSON.stringify(config.data)) // // } // } // // GET请求 // if (config.params != null) { // config.params = { // _p: AES.encrypt(JSON.stringify(config.params)) // } // } // } // 设置认证头 const authToken = Cookies.get('eva-auth-token') if (authToken != null) { config.headers['eva-auth-token'] = authToken } return config }, function (error) { return Promise.reject(error) }) // 新建响应拦截器 axiosInstance.interceptors.response.use((response) => { // console.log('响应', response) // 请求失败 if (response.status !== 200) { return Promise.reject(new Error('服务器繁忙,请稍后再试')) } // 下载接口处理 if (response.headers['eva-opera-type'] === 'download') { return Promise.resolve(response) } // 解密响应结果 if (typeof response.data === 'string') { response.data = JSON.parse(AES.decrypt(response.data)) if (process.env.VUE_APP_DEBUG === 'on') { console.log(`DEBUG: ${response.config.method} ${response.config.url}`, '请求结果', JSON.parse(JSON.stringify(response))) } } // 未登录 if (response.data.code === 401) { // window.location.href = process.env.VUE_APP_ROUTER_MODE === 'history' ? '/login' : '/doumeeplant_web/#/login' if (response.config.autoLogin !== false) { window.location.href = process.env.VUE_APP_ROUTER_MODE !== 'hash' ? '/login' : process.env.VUE_APP_CONTEXT_PATH } return Promise.reject(response.data) } // 业务失败 if (!response.data.success) { return Promise.reject(response.data) } return response.data.data }, function (error) { console.log('error', error) if (error.code == null) { return Promise.reject(new Error('服务器繁忙,请稍后再试')) } if (error.code === 'ECONNABORTED' && error.message.indexOf('timeout') !== -1) { return Promise.reject(new Error('服务器响应超时,请稍后再试')) } return Promise.reject(error) }) // 添加扩展方法 for (const key in extendsMethods) { axiosInstance[key] = extendsMethods[key] } export default axiosInstance