2026-08-17 12:25:42 +08:00
|
|
|
|
import request from './request'
|
|
|
|
|
|
|
|
|
|
|
|
// ==================== 考试/知识竞答 API ====================
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 获取考试状态
|
|
|
|
|
|
* @param {string} group - 组别标识
|
|
|
|
|
|
* @returns {Promise} { isActive, startTime, endTime, countdown, status, submitted }
|
|
|
|
|
|
*/
|
|
|
|
|
|
export function getExamStatus(group) {
|
|
|
|
|
|
return request.get(`/exam/${group}/status`)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 获取考试题目列表
|
|
|
|
|
|
* 抽题数量以后台 competition_times 配置为准(choice_count / judge_count),
|
|
|
|
|
|
* 题目数量不足时自动按题库实际数量封顶,题号随实际数量自适应。
|
|
|
|
|
|
* @param {string} group - 组别标识
|
|
|
|
|
|
* @returns {Promise} 题目数组
|
|
|
|
|
|
*/
|
|
|
|
|
|
export function getQuestions(group) {
|
|
|
|
|
|
return request.get(`/exam/${group}/questions`)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 提交单个答案
|
|
|
|
|
|
* @param {string} group - 组别标识
|
|
|
|
|
|
* @param {array} answers - 答案数组 [{ question_uid, answer_data }]
|
|
|
|
|
|
* @returns {Promise}
|
|
|
|
|
|
*/
|
|
|
|
|
|
export function submitAnswers(group, answers) {
|
|
|
|
|
|
return request.post(`/exam/${group}/submit-answers`, { answers }, { silent: true })
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-09-21 11:17:59 +08:00
|
|
|
|
// 注:原 getWordTemplate / uploadWord / deleteWord 三个封装已随「中职/高职取消 Word
|
|
|
|
|
|
// 上传题」一并移除(2026-09-21)。后端对应路由亦已对中职/高职封堵;本科/教师组的
|
|
|
|
|
|
// 文档上传走分片通道 @/api/upload,不经此处。
|
|
|
|
|
|
|
|
|
|
|
|
// ==================== 综合大题(中职/高职) ====================
|
|
|
|
|
|
|
2026-08-17 12:25:42 +08:00
|
|
|
|
/**
|
2026-09-21 11:17:59 +08:00
|
|
|
|
* 获取综合大题(首次调用即抽题并落库快照,后续调用复用同一题)
|
|
|
|
|
|
*
|
|
|
|
|
|
* 服务端保证「一考生一行、一题一快照」:抽题幂等(reused=true 表示复用),
|
|
|
|
|
|
* 题干以抽题时刻的快照为准(管理员后续改题干不影响已抽考生,防纠纷)。
|
|
|
|
|
|
* 响应体不含任何分数字段(成绩发布门控)。
|
|
|
|
|
|
* @param {string} group - 组别标识(仅 zhongzhi / gaozhi)
|
|
|
|
|
|
* @returns {Promise} {
|
|
|
|
|
|
* question: { big_question_uid, title, description, sub_prompts, score_per_sub, total_score, snapshot_at },
|
|
|
|
|
|
* answers: { answer_1, answer_2, answer_3 },
|
|
|
|
|
|
* submitTime, maxChars, subCount, reused
|
|
|
|
|
|
* }
|
2026-08-17 12:25:42 +08:00
|
|
|
|
*/
|
2026-09-21 11:17:59 +08:00
|
|
|
|
export function getBigQuestion(group) {
|
|
|
|
|
|
// silent:本接口的失败(如 4004 该组暂无大题)由答题区自行展示 + 提供重试,
|
|
|
|
|
|
// 避免与页面其他提示重复弹窗。
|
|
|
|
|
|
return request.get(`/exam/${group}/big-question`, { silent: true })
|
2026-08-17 12:25:42 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
2026-09-21 11:17:59 +08:00
|
|
|
|
* 保存综合大题三小问答案(整卷覆盖保存)
|
|
|
|
|
|
*
|
|
|
|
|
|
* 超长由前端 maxlength 与服务端双重拦截;服务端超限返回 400 且整批拒绝(不静默截断)。
|
2026-08-17 12:25:42 +08:00
|
|
|
|
* @param {string} group - 组别标识
|
2026-09-21 11:17:59 +08:00
|
|
|
|
* @param {{answer_1: string, answer_2: string, answer_3: string, forceSubmit?: boolean}} data
|
|
|
|
|
|
* @returns {Promise} { filled, subCount, maxChars, savedAt }
|
2026-08-17 12:25:42 +08:00
|
|
|
|
*/
|
2026-09-21 11:17:59 +08:00
|
|
|
|
export function saveBigAnswer(group, data) {
|
|
|
|
|
|
return request.post(`/exam/${group}/big-answer`, data, { silent: true })
|
2026-08-17 12:25:42 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 提交全部答案(结束考试)
|
|
|
|
|
|
* @param {string} group - 组别标识
|
|
|
|
|
|
* @param {object} data - 提交数据
|
|
|
|
|
|
* @returns {Promise}
|
|
|
|
|
|
*/
|
|
|
|
|
|
export function submitAll(group, data) {
|
|
|
|
|
|
return request.post(`/exam/${group}/submit-all`, data, { silent: true })
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 获取已有答案(考试重新进入时恢复状态)
|
|
|
|
|
|
* @param {string} group - 组别标识
|
|
|
|
|
|
* @returns {Promise} { answers: [...] }
|
|
|
|
|
|
*/
|
|
|
|
|
|
export function getAnswers(group) {
|
|
|
|
|
|
return request.get(`/exam/${group}/answers`)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 获取当前选手个人成绩(后端按认证用户取,group 仅作透传参数)
|
|
|
|
|
|
* GET /score
|
|
|
|
|
|
* @param {string} group - 组别标识
|
|
|
|
|
|
* @returns {Promise} 成绩详情(含答题得分/作品评分/总分)
|
|
|
|
|
|
*/
|
|
|
|
|
|
export function getScore(group) {
|
|
|
|
|
|
return request.get('/score', { params: { group } })
|
|
|
|
|
|
}
|