import apiConfig from './api_config.js'; import request from '../utils/request.js'; // Fiber 后端请求函数 // 注意:request 函数内部已经会拼接 baseURL,所以这里只需要传入相对路径 function fiberRequest(options) { return request({ url: options.url, // 只传入相对路径,request 函数会拼接 baseURL method: options.method || 'GET', data: options.data, header: options.header || {} }); } export const questionApi = { /** * 获取试卷详情(使用 Fiber 后端) * @param {string} paperId 试卷ID * @returns {Promise} 试卷数据 */ getPaperDetail: (paperId) => { return fiberRequest({ url: `/paper/detail?id=${paperId}`, method: 'GET' }).then(res => { // 转换 Fiber 后端返回格式为前端期望的格式 if (res.success && res.paper) { return { success: true, code: 200, data: res.paper, paper: res.paper // 兼容旧格式 }; } return res; }); }, /** * 获取试卷(兼容旧接口,接受 paperId 和 taskId) * @param {string} paperId 试卷ID * @param {string} taskId 任务ID(可选) * @returns {Promise} 试卷数据 */ getExamPaper: (paperId, taskId) => { return questionApi.getPaperDetail(paperId); }, /** * 获取试卷详情(包含答案和解析,用于答题结果页面) * @param {string} paperId 试卷ID * @returns {Promise} 试卷数据(包含答案和解析) */ getPaperWithAnswers: (paperId) => { return fiberRequest({ url: `/paper/result?id=${paperId}`, method: 'GET' }).then(res => { // 转换 Fiber 后端返回格式为前端期望的格式 if (res.success && (res.paper || res.data)) { const paper = res.paper || res.data; return { success: true, code: 200, data: paper, paper: paper // 兼容旧格式 }; } return res; }); }, /** * 创建答题记录(使用 Fiber 后端) * @param {object} data 答题记录数据 * @param {string} data.user_id 用户ID * @param {string} data.paper_id 试卷ID * @param {number} data.start_time 开始时间(Unix时间戳,秒) * @param {number} data.end_time 结束时间(Unix时间戳,秒) * @param {array} data.answers 答案数组 * @returns {Promise} 创建结果 */ createAnswerRecord: (data) => { // 转换前端数据格式为 Fiber 后端期望的格式 const fiberData = { user_id: String(data.user_id), paper_id: String(data.paper_id), task_id: data.task_id ? String(data.task_id) : '', // 打卡营任务ID,用于不同打卡营的答题隔离 start_time: data.start_time || Math.floor(Date.now() / 1000), end_time: data.end_time || Math.floor(Date.now() / 1000), answers: (data.answers || []).map(answer => ({ question_id: String(answer.question_id), user_answer: String(answer.user_answer || '') })) }; return fiberRequest({ url: `/answer_record/create`, method: 'POST', data: fiberData }).then(res => { // 转换 Fiber 后端返回格式为前端期望的格式 if (res.success) { return { success: true, code: 200, ...res }; } return res; }); }, /** * 获取答题记录(使用 Fiber 后端) * @param {string} userId 用户ID * @param {string} paperId 试卷ID * @param {number} page 页码 * @param {number} pageSize 每页数量 * @returns {Promise} 答题记录列表 */ getAnswerRecord: (userId, paperId, page = 1, pageSize = 100, taskId = '') => { let url = `/answer_record/detail?user_id=${userId}&paper_id=${paperId}&page=${page}&page_size=${pageSize}`; if (taskId) { url += `&task_id=${taskId}`; } return fiberRequest({ url: url, method: 'GET' }).then(res => { // 转换 Fiber 后端返回格式为前端期望的格式 if (res.success) { return { success: true, code: 200, ...res }; } return res; }); } };