Files
nanxiisletAdmin/src/utils/request.ts
2025-12-28 22:12:08 +08:00

113 lines
3.1 KiB
TypeScript
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.

/**
* Axios 基础配置
*/
import axios, { type AxiosInstance, type AxiosRequestConfig, type AxiosResponse, type InternalAxiosRequestConfig } from 'axios'
import { message } from 'ant-design-vue'
import type { ApiResponse } from '@/types'
// 创建axios实例
const service: AxiosInstance = axios.create({
baseURL: import.meta.env.VITE_API_BASE_URL || '/api',
timeout: 30000,
headers: {
'Content-Type': 'application/json'
}
})
// 请求拦截器
service.interceptors.request.use(
(config: InternalAxiosRequestConfig) => {
// 从localStorage获取token
const token = localStorage.getItem('token')
if (token && config.headers) {
config.headers.Authorization = `Bearer ${token}`
}
return config
},
(error) => {
console.error('请求错误:', error)
return Promise.reject(error)
}
)
// 响应拦截器
service.interceptors.response.use(
(response: AxiosResponse<ApiResponse>) => {
const res = response.data
// 根据业务状态码判断请求是否成功
if (res.code === 200 || res.success) {
return response
}
// 处理业务错误
message.error(res.message || '请求失败')
// 处理特定错误码
if (res.code === 401) {
// token过期或未授权跳转登录
localStorage.removeItem('token')
window.location.href = '/login'
}
return Promise.reject(new Error(res.message || '请求失败'))
},
(error) => {
console.error('响应错误:', error)
// 处理HTTP错误
let errorMessage = '网络错误,请稍后重试'
if (error.response) {
const { status } = error.response
switch (status) {
case 400:
errorMessage = '请求参数错误'
break
case 401:
errorMessage = '未授权,请重新登录'
localStorage.removeItem('token')
window.location.href = '/login'
break
case 403:
errorMessage = '拒绝访问'
break
case 404:
errorMessage = '请求资源不存在'
break
case 500:
errorMessage = '服务器内部错误'
break
default:
errorMessage = `请求失败(${status})`
}
} else if (error.code === 'ECONNABORTED') {
errorMessage = '请求超时,请稍后重试'
}
message.error(errorMessage)
return Promise.reject(error)
}
)
// 封装请求方法
export const request = {
get<T = unknown>(url: string, config?: AxiosRequestConfig): Promise<AxiosResponse<ApiResponse<T>>> {
return service.get(url, config)
},
post<T = unknown>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<AxiosResponse<ApiResponse<T>>> {
return service.post(url, data, config)
},
put<T = unknown>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<AxiosResponse<ApiResponse<T>>> {
return service.put(url, data, config)
},
delete<T = unknown>(url: string, config?: AxiosRequestConfig): Promise<AxiosResponse<ApiResponse<T>>> {
return service.delete(url, config)
}
}
export default service