128 lines
3.0 KiB
JavaScript
128 lines
3.0 KiB
JavaScript
/**
|
|
* axios 封装
|
|
*/
|
|
import axios from 'axios'
|
|
import {ElMessage, ElMessageBox} from 'element-plus'
|
|
import {tansParams} from '@/utils/index'
|
|
import {getToken, removeToken, removeUserTenantInfo} from '@/utils/auth'
|
|
|
|
// 配置基础URL
|
|
const baseURL = window.config?.baseUrl || 'http://work.rangutech.cn:9131'
|
|
|
|
// 设置默认请求头
|
|
axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
|
|
|
|
// 创建axios实例
|
|
const service = axios.create({
|
|
baseURL,
|
|
timeout: 10000, // 添加合理的超时时间
|
|
})
|
|
|
|
// 请求拦截器
|
|
service.interceptors.request.use(
|
|
(config) => {
|
|
// 是否需要设置 token
|
|
const isToken = (config.headers || {}).isToken === false
|
|
|
|
// 添加token到请求头
|
|
if (getToken() && !isToken) {
|
|
config.headers.Authorization = `Bearer ${getToken()}`
|
|
}
|
|
|
|
// GET请求参数处理
|
|
if (config.method?.toLowerCase() === 'get' && config.params) {
|
|
const urlParams = tansParams(config.params)
|
|
config.url = `${config.url}?${urlParams}`
|
|
config.params = {}
|
|
}
|
|
|
|
return config
|
|
},
|
|
(error) => {
|
|
console.error('Request error:', error)
|
|
return Promise.reject(error)
|
|
}
|
|
)
|
|
|
|
// 响应拦截器
|
|
service.interceptors.response.use(
|
|
(response) => {
|
|
const {data, config} = response
|
|
|
|
// 处理二进制数据响应
|
|
if (config.responseType === 'blob' || config.responseType === 'arraybuffer') {
|
|
return data
|
|
}
|
|
|
|
// 正常响应处理
|
|
if (response.status === 200) {
|
|
return data
|
|
}
|
|
|
|
// 异常响应处理
|
|
return Promise.reject(response)
|
|
},
|
|
(error) => {
|
|
const {config, response, message} = error
|
|
|
|
console.error('Response error:', {config, response, message})
|
|
|
|
// 处理认证错误
|
|
if (response && [401, 471, 472].includes(response.status)) {
|
|
handleAuthError(config, response)
|
|
return Promise.reject(error)
|
|
}
|
|
|
|
// 处理网络错误
|
|
handleNetworkError(message)
|
|
|
|
return Promise.reject(error)
|
|
}
|
|
)
|
|
|
|
/**
|
|
* 处理认证错误
|
|
*/
|
|
function handleAuthError(config, response) {
|
|
const excludeUrls = ['/Token/Logout', '/Token/Access']
|
|
|
|
if (!excludeUrls.includes(config.url)) {
|
|
ElMessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', {
|
|
confirmButtonText: '重新登录',
|
|
cancelButtonText: '取消',
|
|
type: 'warning',
|
|
})
|
|
.then(() => {
|
|
removeToken()
|
|
removeUserTenantInfo()
|
|
// 这里需要导入store
|
|
// store.dispatch('LogOut').then(() => {});
|
|
window.location.reload() // 简单重载页面
|
|
})
|
|
.catch(() => {
|
|
// 用户取消操作
|
|
})
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 处理网络错误
|
|
*/
|
|
function handleNetworkError(message) {
|
|
let errorMsg = message
|
|
|
|
if (message === 'Network Error') {
|
|
errorMsg = '网络连接异常,请检查网络设置'
|
|
} else if (message.includes('timeout')) {
|
|
errorMsg = '请求超时,请稍后重试'
|
|
}
|
|
|
|
ElMessage({
|
|
message: errorMsg,
|
|
type: 'error',
|
|
duration: 1000,
|
|
})
|
|
}
|
|
|
|
export default service
|