import axios, { type AxiosInstance, type AxiosRequestConfig, type AxiosResponse } from 'axios' import { ElMessage } from 'element-plus' import { useUserStore } from '@/stores/user' // 响应数据接口 export interface ApiResponse { code: number message: string data: T timestamp: number } // 创建 axios 实例 const service: AxiosInstance = axios.create({ baseURL: '/api', timeout: 30000, headers: { 'Content-Type': 'application/json;charset=UTF-8' } }) // 请求拦截器 service.interceptors.request.use( (config) => { const userStore = useUserStore() if (userStore.token) { config.headers.Authorization = `Bearer ${userStore.token}` } return config }, (error) => { return Promise.reject(error) } ) // 响应拦截器 service.interceptors.response.use( (response: AxiosResponse) => { const { data } = response if (data.code === 200) { return data.data } else if (data.code === 401) { ElMessage.error('登录已过期,请重新登录') const userStore = useUserStore() userStore.logout() window.location.href = '/login' return Promise.reject(new Error(data.message || '未授权')) } else { ElMessage.error(data.message || '请求失败') return Promise.reject(new Error(data.message || '请求失败')) } }, (error) => { ElMessage.error(error.message || '网络请求失败') return Promise.reject(error) } ) // 封装请求方法 export const http = { get(url: string, config?: AxiosRequestConfig): Promise { return service.get(url, config) }, post(url: string, data?: any, config?: AxiosRequestConfig): Promise { return service.post(url, data, config) }, put(url: string, data?: any, config?: AxiosRequestConfig): Promise { return service.put(url, data, config) }, delete(url: string, config?: AxiosRequestConfig): Promise { return service.delete(url, config) } } export default service