import axios from 'axios' import type { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios' import type { ApiResponse } from '@/types' // 创建axios实例 const api: AxiosInstance = axios.create({ baseURL: import.meta.env.VITE_API_BASE_URL || '/api', timeout: 10000, headers: { 'Content-Type': 'application/json', }, }) // 请求拦截器 api.interceptors.request.use( (config) => { // 添加认证token const token = localStorage.getItem('token') if (token) { config.headers.Authorization = `Bearer ${token}` } // 添加请求时间戳 config.headers['X-Request-Time'] = Date.now().toString() return config }, (error) => { console.error('Request error:', error) return Promise.reject(error) } ) // 响应拦截器 api.interceptors.response.use( (response: AxiosResponse) => { const { data } = response // 检查业务状态码 if (data.code !== 200) { console.error('API Error:', data.message) return Promise.reject(new Error(data.message)) } return response }, (error) => { // 处理HTTP错误 if (error.response) { const { status, data } = error.response switch (status) { case 401: // 未授权,清除token并跳转到登录页 localStorage.removeItem('token') window.location.href = '/login' break case 403: console.error('Access forbidden') break case 404: console.error('Resource not found') break case 500: console.error('Server error') break default: console.error('HTTP Error:', status, data?.message || error.message) } } else if (error.request) { console.error('Network error:', error.message) } else { console.error('Request setup error:', error.message) } return Promise.reject(error) } ) // 通用请求方法 export const request = { get: (url: string, config?: AxiosRequestConfig): Promise => api.get(url, config).then(res => res.data.data), post: (url: string, data?: any, config?: AxiosRequestConfig): Promise => api.post(url, data, config).then(res => res.data.data), put: (url: string, data?: any, config?: AxiosRequestConfig): Promise => api.put(url, data, config).then(res => res.data.data), delete: (url: string, config?: AxiosRequestConfig): Promise => api.delete(url, config).then(res => res.data.data), patch: (url: string, data?: any, config?: AxiosRequestConfig): Promise => api.patch(url, data, config).then(res => res.data.data), } // 文件上传 export const uploadFile = (file: File, onProgress?: (progress: number) => void): Promise => { const formData = new FormData() formData.append('file', file) return api.post('/upload', formData, { headers: { 'Content-Type': 'multipart/form-data', }, onUploadProgress: (progressEvent) => { if (onProgress && progressEvent.total) { const progress = Math.round((progressEvent.loaded * 100) / progressEvent.total) onProgress(progress) } }, }).then(res => res.data.data.url) } // 消息相关API export const messageApi = { // 获取用户消息分页 getUserMessages: (current: number = 1, size: number = 20) => request.get(`/message/user/page`, { params: { current, size } }), // 搜索用户消息 searchUserMessages: (keyword: string, limit: number = 50) => request.get(`/message/user/search`, { params: { keyword, limit } }), // 获取用户最近的聊天记录 getRecentMessages: (limit: number = 10) => request.get(`/message/user/recent`, { params: { limit } }), // 获取消息详情 getMessageById: (id: string) => request.get(`/message/${id}`) } // 情绪记录相关API export const emotionRecordApi = { // 获取用户情绪记录分页 getUserEmotionRecords: (current: number = 1, size: number = 10) => request.get(`/emotion-records/user`, { params: { current, size } }), // 获取用户最近情绪记录 getUserRecentEmotionRecords: (limit: number = 5) => request.get(`/emotion-records/user/recent`, { params: { limit } }), // 获取情绪记录详情 getEmotionRecordById: (id: string) => request.get(`/emotion-records/${id}`), // 删除情绪记录 deleteEmotionRecord: (id: string) => request.delete(`/emotion-records/${id}`) } // 情绪总结相关API export const emotionSummaryApi = { // 生成情绪记录总结 generateEmotionSummary: () => request.post(`/emotion-summary/generate`), // 获取情绪记录总结状态 getEmotionSummaryStatus: () => request.get(`/emotion-summary/status`) } export default api