Files
electron-4/src/renderer/src/axios/index.ts
2025-10-31 11:01:59 +08:00

121 lines
3.0 KiB
TypeScript

//@ts-nocheck
import router from '@renderer/router'
import axios from 'axios'
import type {
AxiosInstance,
AxiosRequestConfig,
AxiosResponse,
InternalAxiosRequestConfig
} from 'axios'
const pendingRequests = new Map<string, AbortController>()
let baseURL: any
if (window && window.process && window.process.type === 'renderer') {
baseURL = localStorage.getItem('ip') || 'http://127.0.0.1:8848'
// baseURL = 'http://127.0.0.1:8848'
} else {
localStorage.setItem('ip', 'http://192.168.110.71:8848')
baseURL = 'http://192.168.110.71:8848'
}
// localStorage.setItem('service', baseURL)
// 创建自定义配置的axios实例
const service: AxiosInstance = axios.create({
// baseURL: baseURL,
timeout: 300000,
headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*'
}
})
// 生成请求唯一标识
function getRequestKey(config: AxiosRequestConfig): string {
return `${config.url}`
}
// 请求拦截器
service.interceptors.request.use(
(config: InternalAxiosRequestConfig) => {
if (!config.url.startsWith("http://"))
config.url = new URL(config.url,
localStorage.getItem('ip')
).href;
const key = getRequestKey(config)
// 检查是否有相同请求正在进行
if (pendingRequests.has(key)) {
ElMessage({
message: '当前请求已存在,请稍后再试',
type: 'warning'
})
}
const controller = new AbortController()
config.signal = controller.signal
pendingRequests.set(key, controller)
// 在这里添加认证token
const token = localStorage.getItem('Authorization')
console.log("localStorage.getItem('Authorization')", token);
if (token && config.headers) {
// Bearer
config.headers.Authorization = `${token}`
}
return config
},
(error) => {
return Promise.reject(error)
}
)
// 响应拦截器
service.interceptors.response.use(
(response: AxiosResponse) => {
const key = getRequestKey(response.config)
pendingRequests.delete(key)
// console.log(response);
// 统一处理HTTP状态码
if (response.status === 200) {
if ([0, 200].includes(response.data.code)) {
return response
}
if (response.data.code == 401) {
router.push('/')
localStorage.removeItem('Authorization')
}
if (![0, 200].includes(response.data.code)) {
ElMessage({
message: response.data.msg || response.data.message,
type: 'error'
})
}
}
return Promise.reject(new Error('Error'))
},
(error) => {
console.log('error', error)
if (error.config) {
const key = getRequestKey(error.config)
pendingRequests.delete(key)
}
// 统一错误处理
const {response} = error
if (response) {
return Promise.reject(response)
}
ElMessage({
message: '网络连接异常,请稍后再试',
type: 'error'
})
return Promise.reject(new Error('网络连接异常,请稍后再试'))
}
)
export default service