diff --git a/src/services/api.js b/src/services/api.js new file mode 100644 index 0000000..62384ed --- /dev/null +++ b/src/services/api.js @@ -0,0 +1,106 @@ +/** + * API服务类 + * 处理与后端的所有HTTP通信 + */ +import axios from 'axios'; + +// 创建axios实例 +const api = axios.create({ + baseURL: 'http://localhost:5177/api', + timeout: 300000, // 5分钟超时 + headers: { + 'Content-Type': 'application/json', + }, +}); + +// 请求拦截器 +api.interceptors.request.use( + (config) => { + console.log('发送请求:', config.method.toUpperCase(), config.url); + return config; + }, + (error) => { + console.error('请求错误:', error); + return Promise.reject(error); + } +); + +// 响应拦截器 +api.interceptors.response.use( + (response) => { + console.log('收到响应:', response.status, response.config.url); + return response; + }, + (error) => { + console.error('响应错误:', error); + const message = error.response?.data?.message || '网络请求失败'; + return Promise.reject(new Error(message)); + } +); + +/** + * API接口定义 + */ +export const apiService = { + /** + * 健康检查 + */ + healthCheck: () => { + return api.get('/health'); + }, + + /** + * 上传SQL文件并转换 + * @param {File} file SQL文件 + * @param {Function} onProgress 上传进度回调 + */ + uploadFile: (file, onProgress) => { + const formData = new FormData(); + formData.append('file', file); + + return api.post('/upload', formData, { + headers: { + 'Content-Type': 'multipart/form-data', + }, + onUploadProgress: (progressEvent) => { + if (onProgress) { + const percentCompleted = Math.round( + (progressEvent.loaded * 100) / progressEvent.total + ); + onProgress(percentCompleted); + } + }, + }); + }, + + /** + * 下载转换后的文件 + * @param {number} recordId 转换记录ID + */ + downloadFile: (recordId) => { + return api.get(`/download/${recordId}`, { + responseType: 'blob', + }); + }, + + /** + * 获取转换历史记录 + * @param {number} page 页码 + * @param {number} pageSize 每页数量 + */ + getHistory: (page = 1, pageSize = 20) => { + return api.get('/history', { + params: { page, page_size: pageSize }, + }); + }, + + /** + * 获取单个转换记录详情 + * @param {number} recordId 记录ID + */ + getRecord: (recordId) => { + return api.get(`/record/${recordId}`); + }, +}; + +export default apiService; \ No newline at end of file