Files
Yi.Admin/Yi.RuoYi.Vue3/src/utils/request.js

207 lines
5.7 KiB
JavaScript
Raw Normal View History

2023-02-04 18:06:42 +08:00
import axios from 'axios'
2023-05-20 17:20:52 +08:00
import { ElNotification, ElMessageBox, ElMessage, ElLoading } from 'element-plus'
2023-02-04 18:06:42 +08:00
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'
import useUserStore from '@/store/modules/user'
import JsonBig from 'json-bigint'
2023-12-11 09:55:12 +08:00
import qs from 'qs'
2023-02-04 18:06:42 +08:00
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: 10000,
2023-12-11 09:55:12 +08:00
//处理批零参数
paramsSerializer:params => {
// return qs.stringify(params,{indices:false})
2024-01-03 12:28:46 +08:00
// console.log(params,"params")
2023-12-11 09:55:12 +08:00
// if(params.id!=undefined)
// {
// if(Array.isArray(params.id) )
// {
// return "id="+params.id.join("&id=")
// }
// else
// {
// return "id="+params.id;
// }
// }
// return request.param(params);
return qs.stringify(params, {arrayFormat: 'repeat'});
},
2023-05-20 17:20:52 +08:00
transformResponse: [data => {
2023-02-04 18:06:42 +08:00
const json = JsonBig({
storeAsString: true
})
2023-10-08 22:59:22 +08:00
try {
return json.parse(data)
}
catch
{
return data;
}
2023-02-04 18:06:42 +08:00
}],
})
2023-02-04 18:06:42 +08:00
// request拦截器
service.interceptors.request.use(config => {
2023-04-02 00:17:07 +08:00
2023-02-04 18:06:42 +08:00
// 是否需要设置 token
const isToken = (config.headers || {}).isToken === false
// 是否需要防止数据重复提交
const isRepeatSubmit = (config.headers || {}).repeatSubmit === false
if (getToken() && !isToken) {
config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
}
2023-04-02 00:17:07 +08:00
2023-02-04 18:06:42 +08:00
// 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),小于此时间视为重复提交
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)
}
}
}
2023-04-02 00:17:07 +08:00
2023-02-04 18:06:42 +08:00
return config
}, error => {
2023-05-20 17:20:52 +08:00
Promise.reject(error)
2023-02-04 18:06:42 +08:00
})
// 响应拦截器
service.interceptors.response.use(res => {
2023-05-20 17:20:52 +08:00
2023-12-11 09:55:12 +08:00
// //如果code为200不需要处理直接返回数据即可
// console.log(res,"res")
// // 二进制数据则直接返回
// if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') {
// return res.data
// }
// const code = res.data.status || 200;
// // 获取错误信息
// const msg = `${res.data.errors.message},详细信息:${details}` ;
// handler(code, msg);
return Promise.resolve(res);
2023-05-20 17:20:52 +08:00
},
error => {
2023-12-11 09:55:12 +08:00
console.log(error.response,"error")
const errorRes=error.response;
const code = errorRes.status || 200;
const msg = `${errorRes.data?.error?.message}` ;
2023-05-20 17:20:52 +08:00
handler(code, msg);
2023-12-11 09:55:12 +08:00
return Promise.reject(error)
2023-02-04 18:06:42 +08:00
}
)
// 通用下载方法
2024-01-03 12:28:46 +08:00
export function download(url, query, filename) {
2023-02-04 18:06:42 +08:00
downloadLoadingInstance = ElLoading.service({ text: "正在下载数据,请稍候", background: "rgba(0, 0, 0, 0.7)", })
2024-01-03 12:28:46 +08:00
return service({
url: url,
method: 'get',
params: query,
2023-02-04 18:06:42 +08:00
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
responseType: 'blob'
}).then(async (data) => {
2024-01-03 12:28:46 +08:00
debugger;
const blob = new Blob([data.data])
2023-02-04 18:06:42 +08:00
saveAs(blob, filename)
downloadLoadingInstance.close();
}).catch((r) => {
console.error(r)
ElMessage.error('下载文件出现错误,请联系管理员!')
downloadLoadingInstance.close();
})
}
2023-05-20 17:20:52 +08:00
const handler = (code, msg) => {
switch (code) {
//服务器异常
case 500:
ElMessage({
message: msg,
type: 'error'
});
break;
//业务异常
case 403:
2023-10-08 22:59:22 +08:00
ElNotification.error({
title: msg
})
2023-05-20 17:20:52 +08:00
break;
2023-12-11 09:55:12 +08:00
//接口异常
case 400:
ElNotification.error({
title: msg
})
break;
2023-10-08 22:59:22 +08:00
//未授权
2023-05-20 17:20:52 +08:00
case 401:
2023-10-08 22:59:22 +08:00
ElMessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', {
confirmButtonText: '重新登录',
cancelButtonText: '取消',
type: 'warning'
})
2023-05-20 17:20:52 +08:00
.then(() => {
isRelogin.show = false;
useUserStore().logOut().then(() => {
location.href = '/index';
})
}).catch(() => {
isRelogin.show = false;
});
break;
case 404:
ElMessage({
message: "404未找到资源",
type: 'error'
});
break;
2023-10-08 22:59:22 +08:00
//正常
2023-05-20 17:20:52 +08:00
case 200:
break;
}
}
2023-02-04 18:06:42 +08:00
export default service