import axios from 'axios' import { ElNotification, ElMessageBox, ElMessage, ElLoading } from 'element-plus' import errorCode from '@/utils/errorCode' import { tansParams, blobValidate } from '@/utils/ruoyi' import cache from '@/plugins/cache' import { saveAs } from 'file-saver' import {signatureGenerate} from "@/utils/signatureUtil" let downloadLoadingInstance; // 是否显示重新登录 export let isRelogin = { show: false }; // axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8' // 创建axios实例 const service = axios.create({ // axios中请求配置有baseURL选项,表示请求URL公共部分 baseURL: import.meta.env.VITE_APP_BASE_API, // 超时 timeout: 30000 }) // request拦截器 service.interceptors.request.use(config => { // 是否需要设置 token const isToken = (config.headers || {}).isToken === false // 是否需要防止数据重复提交 const isRepeatSubmit = (config.headers || {}).repeatSubmit === false if (localStorage.getItem("token725") && !isToken) { config.headers['Authorization'] = localStorage.getItem("token725") // 让每个请求携带自定义token 请根据实际情况自行修改 } // get请求映射params参数 if (config.method === 'get' && config.params) { let url = config.url + '?' + tansParams(config.params); url = url.slice(0, -1); config.params = {}; config.url = url; } if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) { const requestObj = { url: config.url, data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data, time: new Date().getTime() } 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),小于此时间视为重复提交 cache.session.setJSON('sessionObj', requestObj) } } config.headers['Content-Type'] = 'application/json;charset=utf-8' return config }, error => { Promise.reject(error) }) // 响应拦截器 service.interceptors.response.use(res => { console.log(res) // 未设置状态码则默认成功状态 const code = res.data.code; if (code == 200) { return res.data } else { ElMessage({ message: res.data.msg, type: 'error', duration: 5 * 1000 }) } }, error => { let message = error?.response?.data?.msg || ""; if (message == "Network Error") { message = "后端接口连接异常"; } else if (message.includes("timeout")) { message = "系统接口请求超时"; } else if (message.includes("Request failed with status code")) { message = "系统接口" + message.substr(message.length - 3) + "异常"; } ElMessage({ message: message, type: 'error', duration: 5 * 1000 }) return Promise.reject(error) } ) /** * 通用下载方法(post类型有params、data两种方式) * @param {*接口地址} url * @param {*数据} data * @param {*文件名称} filename * @param {*请求方式} type * @param {*数据类型} dataFormat * @returns */ export function download(url, data, filename, type, dataFormat) { downloadLoadingInstance = ElLoading.service({ text: "正在下载数据,请稍候", background: "rgba(0, 0, 0, 0.7)", }) return service[type](url, type == "post" ? data : { params: data, headers: { 'Content-Type': 'application/json; charset=utf-8' }, responseType: 'blob' }, type == "post" && dataFormat == "params" ? { headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, responseType: 'blob', params: data } : type == "post" && dataFormat == "data" ? { headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, responseType: 'blob', data } : null).then(async(data) => { const isLogin = await blobValidate(data); if (isLogin) { const blob = new Blob([data]) saveAs(blob, filename) } else { const resText = await data.text(); const rspObj = JSON.parse(resText); const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default'] ElMessage.error(errMsg); } downloadLoadingInstance.close(); }).catch((r) => { ElMessage.error('下载文件出现错误,请联系管理员!') downloadLoadingInstance.close(); }) } export default service