middleground_code_v2/src/utils/request.js

322 lines
9.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import axios from 'axios'
import {
Notification,
MessageBox,
Message,
Loading
} from 'element-ui'
import store from '@/store'
import {
getToken,
setToken,
removeCompanyId,
removeToken,
removeInfo
} from '@/utils/auth'
import errorCode from '@/utils/errorCode'
import {
tansParams,
blobValidate
} from '@/utils/ruoyi'
import { closeLoading, openLoading } from '@/utils/loading'
import cache from '@/plugins/cache'
import {
saveAs
} from 'file-saver'
import route from '../router/index'
// import configKey from '@/assets/js/configKey.js'
let downloadLoadingInstance
let downloadLoadingAxios
// 是否显示重新登录
export let isRelogin = {
show: false
}
let timer = null
// 是否正在刷新的标记
let isRefreshing = false
//重试队列
let requests = []
// 在模块作用域定义一个全局标志变量
let isHandlingTokenInvalid = false
axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
// 创建axios实例
const service = axios.create({
// axios中请求配置有baseURL选项表示请求URL公共部分
// baseURL:configKey.urlType?configKey.baseURL:process.env.VUE_APP_BASE_API,
baseURL: process.env.VUE_APP_BASE_API,
// baseURL: "http://192.168.2.240:8066/",
// 超时
timeout: 2 * 60 * 1000
})
// request拦截器
service.interceptors.request.use(
(config) => {
// do something bedocument.getElementById("")fore request is sent
// config.headers['secretkey'] = 'aQ+b2wGj1LuhR8N2O0aOmKlkjgnOyHSlZ0QUtZMP3dHkVkAGhJe37KOdmpexsE6W' //本机密钥
// config.headers['secretkey'] = 'm/Ah8KQ6IfWEv85KEoaHKf4SfwtemYtGkiuBabkQCnOuJ/+nyvqBLOVheirHN1TO' //本机密钥
config.headers['secretkey'] = configKey.secretkey
// if (store.getters.token) {
// if (window.localStorage.userToken) {
let token = getToken()
if (token) {
config.headers['zt-token'] = token
}
if (config.url.indexOf('updateDto') != -1 || config.url.indexOf('saveDto') != -1) {
openLoading('submit')
} else if (config.url.indexOf('getById') != -1) {
openLoading('detail')
} else if (config.url.indexOf('deleteById') != -1) {
openLoading('del')
} else if (config.url.indexOf('changerState') != -1) {
openLoading('submit')
}
// 生成请求的唯一标识符
const requestIdentifier = `${config.url}-${config.method}`
// 判断是否已存在相同的请求
const isDuplicateRequest = requests.includes(requestIdentifier)
// 如果存在相同请求,取消当前请求
if (isDuplicateRequest) {
// return Promise.reject(new Error("Duplicate request"));
}
// 将请求的唯一标识符添加到请求队列中
requests.push(requestIdentifier)
// 设置计时器,在秒后移除请求的唯一标识符
clearTimeout(timer)
timer = setTimeout(() => {
const index = requests.indexOf(requestIdentifier)
if (index !== -1) {
requests.splice(index, 1) // 移除请求的唯一标识符
}
}, 2000)
return config
},
(error) => {
// do something with request error
// 请求发生错误时清除唯一标识符
const requestIdentifier = `${error.config.url}-${error.config.method}`
const index = requests.indexOf(requestIdentifier)
if (index !== -1) {
requests.splice(index, 1) // 清除唯一标识符
}
return Promise.reject(error)
}
)
// 响应拦截器
service.interceptors.response.use(
(res) => {
// 请求完成时清除唯一标识符
const requestIdentifier = `${res.config.url}-${res.config.method}`
const index = requests.indexOf(requestIdentifier)
if (index !== -1) {
requests.splice(index, 1) // 清除唯一标识符
}
// downloadLoadingAxios.close()
// 未设置状态码则默认成功状态
const code = res.data.status || '200'
// 获取错误信息
const msg = res.data.msg
closeLoading()
// 二进制数据则直接返回
if (
res.request.responseType === 'blob' ||
res.request.responseType === 'arraybuffer'
) {
return res.data
}
if (code === '500') {
// 判断是否在处理 token 无效情况
if (msg === 'zt-token无效' && isHandlingTokenInvalid) return
if (msg === 'zt-token无效' && !isHandlingTokenInvalid) {
isHandlingTokenInvalid = true;
MessageBox.confirm('登录失效!请重新登录。', '系统提示', {
confirmButtonText: '确定',
showCancelButton: false,
showClose: false,
closeOnClickModal: false,
closeOnPressEscape: false,
type: 'error'
})
.then(() => {
store.dispatch('LogOut').then(() => {
route.replace({
path: '/login'
});
// 重置标志变量
isHandlingTokenInvalid = false;
});
})
.catch(() => {
// 处理取消逻辑
isHandlingTokenInvalid = false;
});
} else {
// 其他错误处理
MessageBox.confirm(msg, '系统提示', {
confirmButtonText: '确定',
showCancelButton: false,
showClose: false,
closeOnClickModal: false,
closeOnPressEscape: false,
type: 'error'
});
}
return Promise.reject(new Error(msg));
} else if (code == '1002') {
MessageBox.confirm(msg, '系统提示', {
confirmButtonText: '确定',
showCancelButton: false,
showClose: false,
closeOnClickModal: false,
closeOnPressEscape: false,
type: 'error'
})
.then(() => {
store.dispatch('LogOut').then(() => {
route.replace({
path: '/login'
})
})
})
.catch(() => {
})
} else if (code !== '200') {
MessageBox.confirm(msg, '系统提示', {
confirmButtonText: '确定',
showCancelButton: false,
showClose: false,
closeOnClickModal: false,
closeOnPressEscape: false,
type: 'error'
})
.then(() => {
})
.catch(() => {
})
return Promise.reject('error')
} else {
return res.data
}
},
(error) => {
let response = error.response
closeLoading()
// downloadLoadingAxios.close()
// if (response.status == 401) {
// if (response.data.code == 1002) {
// if (!isRefreshing) {
// isRefreshing = true;
// setToken(response.data.data[0]);
// response.headers.token = response.data.data[0];
// // token 刷新后将数组的方法重新执行
// requests.forEach((cb) => cb(token));
// requests = []; // 重新请求完清空
// return service(response.config);
// isRefreshing = false;
// } else {
// // 返回未执行 resolve 的 Promise
// return new Promise((resolve) => {
// // 用函数形式将 resolve 存入,等待刷新后再执行
// requests.push((token) => {
// response.headers.token = `${token}`;
// resolve(service(response.config));
// });
// });
// }
// return response && response.data;
// } else {
// Message({
// message: response.data.message,
// type: "error",
// showClose: true,
// duration: 0,
// });
// if (response.data.code == -1) {} else {
// store.dispatch("LogOut").then(() => {
// route.replace({
// path: "/login",
// });
// });
// }
// }
// } else {
// 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) + "异常";
// }
// MessageBox.confirm(message, "系统提示", {
// confirmButtonText: "确定",
// showCancelButton: false,
// showClose: false,
// closeOnClickModal: false,
// closeOnPressEscape: false,
// type: "error",
// })
// .then(() => {})
// .catch(() => {});
// }
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) => {
Message.error('下载文件出现错误,请联系管理员!')
downloadLoadingInstance.close()
})
}
export default service