import { Message, Modal } from '@arco-design/web-vue'; import type { AxiosResponse, InternalAxiosRequestConfig } from 'axios'; import axios from 'axios'; import { useUserStore } from '@/store'; import { getToken } from '@/utils/auth'; export interface HttpResponse { status: number; msg: string; code: number; data: T; } let initialized = false; export function setupHttp() { if (initialized) { return; } initialized = true; const baseURL = import.meta.env.VITE_API_BASE_URL?.trim(); if (baseURL) { axios.defaults.baseURL = baseURL; } axios.interceptors.request.use( (config: InternalAxiosRequestConfig) => { const token = getToken(); if (token) { config.headers.Authorization = `Bearer ${token}`; } return config; }, (error) => Promise.reject(error), ); axios.interceptors.response.use( (response: AxiosResponse) => { const res = response.data; if (res.code !== 20000) { Message.error({ content: res.msg || '请求失败', duration: 5 * 1000, }); if ( [50008, 50012, 50014].includes(res.code) && response.config.url !== '/api/user/info' ) { Modal.error({ title: '登录已失效', content: '当前登录状态已失效,请重新登录。', okText: '重新登录', async onOk() { const userStore = useUserStore(); await userStore.logout(); window.location.reload(); }, }); } return Promise.reject(new Error(res.msg || '请求失败')); } return res as unknown as AxiosResponse; }, (error) => { Message.error({ content: error.msg || '网络请求失败', duration: 5 * 1000, }); return Promise.reject(error); }, ); }