gin-vue-admin/web/src/utils/request.js

200 lines
5.3 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' // 引入axios
import { ElMessage, ElMessageBox } from 'element-plus'
import { useUserStore } from '@/pinia/modules/user'
import router from '@/router/index'
import { ElLoading } from 'element-plus'
// 添加一个状态变量,用于跟踪是否已有错误弹窗显示
let errorBoxVisible = false
const service = axios.create({
baseURL: import.meta.env.VITE_BASE_API,
timeout: 99999
})
let activeAxios = 0
let timer
let loadingInstance
const showLoading = (
option = {
target: null
}
) => {
const loadDom = document.getElementById('gva-base-load-dom')
activeAxios++
if (timer) {
clearTimeout(timer)
}
timer = setTimeout(() => {
if (activeAxios > 0) {
if (!option.target) option.target = loadDom
loadingInstance = ElLoading.service(option)
}
}, 400)
}
const closeLoading = () => {
activeAxios--
if (activeAxios <= 0) {
clearTimeout(timer)
loadingInstance && loadingInstance.close()
}
}
// http request 拦截器
service.interceptors.request.use(
(config) => {
if (!config.donNotShowLoading) {
showLoading(config.loadingOption)
}
const userStore = useUserStore()
config.headers = {
'Content-Type': 'application/json',
'x-token': userStore.token,
'x-user-id': userStore.userInfo.ID,
...config.headers
}
return config
},
(error) => {
if (!error.config.donNotShowLoading) {
closeLoading()
}
ElMessage({
showClose: true,
message: error,
type: 'error'
})
return error
}
)
// http response 拦截器
service.interceptors.response.use(
(response) => {
const userStore = useUserStore()
if (!response.config.donNotShowLoading) {
closeLoading()
}
if (response.headers['new-token']) {
userStore.setToken(response.headers['new-token'])
}
if (typeof response.data.code === 'undefined') {
return response
}
if (response.data.code === 0 || response.headers.success === 'true') {
if (response.headers.msg) {
response.data.msg = decodeURI(response.headers.msg)
}
return response.data
} else {
ElMessage({
showClose: true,
message: response.data.msg || decodeURI(response.headers.msg),
type: 'error'
})
return response.data.msg ? response.data : response
}
},
(error) => {
if (!error.config.donNotShowLoading) {
closeLoading()
}
// 如果已经有错误弹窗显示,则不再显示新的弹窗
if (errorBoxVisible) {
return error
}
if (!error.response) {
errorBoxVisible = true
ElMessageBox.confirm(
`
<p>检测到请求错误</p>
<p>${error}</p>
`,
'请求报错',
{
dangerouslyUseHTMLString: true,
distinguishCancelAndClose: true,
confirmButtonText: '稍后重试',
cancelButtonText: '取消'
}
).finally(() => {
// 弹窗关闭后重置状态
errorBoxVisible = false
})
return
}
switch (error.response.status) {
case 500:
errorBoxVisible = true
ElMessageBox.confirm(
`
<p>检测到接口错误${error}</p>
<p>错误码<span style="color:red"> 500 </span>此类错误内容常见于后台panic请先查看后台日志如果影响您正常使用可强制登出清理缓存</p>
`,
'接口报错',
{
dangerouslyUseHTMLString: true,
distinguishCancelAndClose: true,
confirmButtonText: '清理缓存',
cancelButtonText: '取消'
}
).then(() => {
const userStore = useUserStore()
userStore.ClearStorage()
router.push({ name: 'Login', replace: true })
}).finally(() => {
// 弹窗关闭后重置状态
errorBoxVisible = false
})
break
case 404:
errorBoxVisible = true
ElMessageBox.confirm(
`
<p>检测到接口错误${error}</p>
<p>错误码<span style="color:red"> 404 </span>此类错误多为接口未注册或未重启或者请求路径方法与api路径方法不符--如果为自动化代码请检查是否存在空格</p>
`,
'接口报错',
{
dangerouslyUseHTMLString: true,
distinguishCancelAndClose: true,
confirmButtonText: '我知道了',
cancelButtonText: '取消'
}
).finally(() => {
// 弹窗关闭后重置状态
errorBoxVisible = false
})
break
case 401:
errorBoxVisible = true
ElMessageBox.confirm(
`
<p>无效的令牌</p>
<p>错误码:<span style="color:red"> 401 </span>错误信息:${error}</p>
`,
'身份信息',
{
dangerouslyUseHTMLString: true,
distinguishCancelAndClose: true,
confirmButtonText: '重新登录',
cancelButtonText: '取消'
}
).then(() => {
const userStore = useUserStore()
userStore.ClearStorage()
router.push({ name: 'Login', replace: true })
}).finally(() => {
// 弹窗关闭后重置状态
errorBoxVisible = false
})
break
}
return error
}
)
export default service