| import axios from 'axios' |
| import { Notification, MessageBox, Message, Loading } from 'element-ui' |
| import store from '@/store' |
| import { getToken } from '@/utils/auth' |
| import errorCode from '@/utils/errorCode' |
| import { tansParams, blobValidate } from "@/utils/ruoyi"; |
| import cache from '@/plugins/cache' |
| import { saveAs } from 'file-saver' |
| |
| let downloadLoadingInstance; |
| |
| export let isRelogin = { show: false }; |
| |
| axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8' |
| |
| const service = axios.create({ |
| |
| baseURL: process.env.VUE_APP_BASE_API, |
| |
| timeout: 10000 |
| }) |
| |
| |
| service.interceptors.request.use(config => { |
| |
| const isToken = (config.headers || {}).isToken === false |
| |
| const isRepeatSubmit = (config.headers || {}).repeatSubmit === false |
| if (getToken() && !isToken) { |
| config.headers['Authorization'] = 'Bearer ' + getToken() |
| } |
| |
| 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; |
| 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) |
| }) |
| |
| |
| service.interceptors.response.use(res => { |
| |
| const code = res.data.code || 200; |
| |
| const msg = errorCode[code] || res.data.msg || errorCode['default'] |
| |
| if(res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer'){ |
| return res.data |
| } |
| if (code === 401) { |
| if (!isRelogin.show) { |
| isRelogin.show = true; |
| MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning' }).then(() => { |
| isRelogin.show = false; |
| store.dispatch('LogOut').then(() => { |
| location.href = '/index'; |
| }) |
| }).catch(() => { |
| isRelogin.show = false; |
| }); |
| } |
| return Promise.reject('无效的会话,或者会话已过期,请重新登录。') |
| } else if (code === 500) { |
| Message({ message: msg, type: 'error' }) |
| return Promise.reject(new Error(msg)) |
| } else if (code === 601) { |
| Message({ message: msg, type: 'warning' }) |
| return Promise.reject('error') |
| } else if (code !== 200) { |
| Notification.error({ title: msg }) |
| return Promise.reject('error') |
| } else { |
| return res.data |
| } |
| }, |
| error => { |
| console.log('err' + error) |
| let { message } = error; |
| 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) + "异常"; |
| } |
| Message({ message: message, type: 'error', duration: 5 * 1000 }) |
| return Promise.reject(error) |
| } |
| ) |
| |
| |
| export function download(url, params, filename, config) { |
| downloadLoadingInstance = Loading.service({ text: "正在下载数据,请稍候", spinner: "el-icon-loading", background: "rgba(0, 0, 0, 0.7)", }) |
| return service.post(url, params, { |
| transformRequest: [(params) => { return tansParams(params) }], |
| headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, |
| responseType: 'blob', |
| ...config |
| }).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'] |
| Message.error(errMsg); |
| } |
| downloadLoadingInstance.close(); |
| }).catch((r) => { |
| console.error(r) |
| Message.error('下载文件出现错误,请联系管理员!') |
| downloadLoadingInstance.close(); |
| }) |
| } |
| |
| export default service |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)