| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- /**
- * 简化版request - 用于测试401跳转
- * 如果标准版本不工作,可以临时替换使用这个版本
- */
- import axios from 'axios'
- import type { InternalAxiosRequestConfig, AxiosResponse } from 'axios'
- import { ElMessage } from 'element-plus'
- import { getToken, getRefreshToken, setToken as saveToken } from '@/utils/auth'
- // 获取基础 URL
- const getBaseURL = () => {
- let url = import.meta.env.VITE_API_BASE_URL || 'http://localhost:8000'
- if (url.includes('localhost') && typeof window !== 'undefined' && window.location.hostname !== 'localhost' && window.location.hostname !== '127.0.0.1') {
- url = url.replace('localhost', window.location.hostname)
- }
- return url
- }
- // 创建axios实例
- const request = axios.create({
- baseURL: getBaseURL(),
- timeout: 30000,
- headers: {
- 'Content-Type': 'application/json'
- }
- })
- // 请求拦截器
- request.interceptors.request.use(
- (config: InternalAxiosRequestConfig) => {
- const token = getToken()
- if (token && config.headers) {
- config.headers.Authorization = `Bearer ${token}`
- }
- return config
- },
- (error) => {
- return Promise.reject(error)
- }
- )
- // 响应拦截器 - 简化版
- request.interceptors.response.use(
- (response: AxiosResponse) => {
- // Token自动更新
- const newToken = response.headers['x-new-token']
- if (newToken) {
- const refreshToken = getRefreshToken()
- saveToken(newToken, refreshToken || undefined)
- console.log('[简化版] Token已自动刷新')
- }
-
- const { code, message } = response.data ?? {}
- if ((code === '000000' || code === 0) || code === 200 || typeof code === 'undefined') {
- return response.data
- }
-
- const errorMsg = message || '请求失败'
- if (!response.config.headers?.['Skip-Error-Message']) {
- ElMessage.error(errorMsg)
- }
- const businessError = new Error(errorMsg)
- // @ts-ignore
- businessError.code = code
- // @ts-ignore
- businessError.isBusinessError = true
- return Promise.reject(businessError)
- },
- (error) => {
- console.log('[简化版] 拦截器捕获错误:', error.response?.status)
-
- // 401错误 - 最简单的处理
- if (error.response?.status === 401) {
- console.log('[简化版] 检测到401,立即跳转')
-
- // 清除所有认证信息
- localStorage.clear()
- sessionStorage.clear()
-
- // 显示提示
- ElMessage.error('登录已过期,请重新登录')
-
- // 立即跳转
- window.location.href = '/login'
-
- // 阻止后续执行
- return new Promise(() => {})
- }
-
- // 其他错误
- const skipErrorMessage = error.config?.headers?.['Skip-Error-Message']
- if (error.response) {
- const { status, data } = error.response
- if (!skipErrorMessage) {
- if (status === 403) {
- ElMessage.error('权限不足')
- } else if (status === 404) {
- ElMessage.error('请求的资源不存在')
- } else if (status === 500) {
- ElMessage.error('服务器内部错误')
- } else {
- ElMessage.error(data?.message || '请求失败')
- }
- }
- } else {
- if (!skipErrorMessage) {
- ElMessage.error('网络连接失败')
- }
- }
-
- return Promise.reject(error)
- }
- )
- export default request
|