From 37d2641e49d6dd5bcb38241a59560d6259603111 Mon Sep 17 00:00:00 2001 From: qubiaobiao <3294694717@qq.com> Date: Mon, 28 Sep 2026 10:15:50 +0800 Subject: [PATCH] =?UTF-8?q?feat(admin):=20=E5=90=8E=E5=8F=B0=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E3=80=8C=E6=88=90=E7=BB=A9=E5=A4=8D=E6=A0=B8=E3=80=8D?= =?UTF-8?q?=E2=80=94=E2=80=94=E6=A3=80=E7=B4=A2=E8=80=83=E7=94=9F=20+=20?= =?UTF-8?q?=E5=85=A8=E5=8D=B7=E9=80=90=E9=A2=98=E6=98=8E=E7=BB=86=E5=BC=B9?= =?UTF-8?q?=E7=AA=97=EF=BC=88R26=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - api/admin.js: 新增 reviewSearch(姓名/身份证/电话任一,可选限定组别)与 getContestantScore(group, id) - Admin.vue: 菜单新增「成绩复核」(Search 图标);检索区(关键词 + 可选组别下拉)+ 结果列表 + 全卷明细弹窗 - 明细含客观题逐题:题号 / 题型 / 题干 / 选项 / 考生答案 / 正确答案 / 判定 / 得分/满分 - 异常标记:题干缺失(questionMissing)、答案与判定矛盾(answerMatches≠isCorrect) - 判断题答案 'true'/'false' 显示为「正确/错误」;未作答显示「未作答」且不判错 - 综合大题展示三小问作答与得分;本科/教师组展示作品文件清单并支持下载(不回传 file_path) - 弹窗用考生自身组别请求接口,避免前端传错组照错人(后端 409 兜底) - 回传正确答案仅管理员可见,与后端 adminAuth 门禁配套 构建验证:vite build 通过(✓ built in 14.80s,退出码 0) --- src/api/admin.js | 35 ++++ src/views/Admin.vue | 482 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 516 insertions(+), 1 deletion(-) diff --git a/src/api/admin.js b/src/api/admin.js index b857bab..5014b00 100644 --- a/src/api/admin.js +++ b/src/api/admin.js @@ -435,4 +435,39 @@ export function setBigAnswerScores(group, uid, scores) { return request.put(`/admin/big-answers/${group}/${uid}/scores`, scores) } +// ==================== 成绩复核 ==================== +// 场景:考生对成绩有异议 → 按「姓名 / 身份证号 / 电话」任一检索 → 核对全卷题目与作答。 + +/** + * 检索考生(姓名 / 身份证号 / 电话 任一,模糊匹配) + * + * 不传 group 则全组别检索 —— 复核时通常只拿到一个身份证号,不应强迫先猜组别。 + * @param {string} keyword - 检索词 + * @param {string} [group] - 可选:限定组别 + * @returns {Promise} { list: [{ contestantId, name, idNumber, phone, group, objectiveApplicable }], total, truncated } + */ +export function reviewSearch(keyword, group) { + const params = { keyword } + if (group) params.group = group + return request.get('/admin/review/search', { params }) +} + +/** + * 考生全卷明细(复核) + * + * 返回客观题逐题(题干 / 选项 / 考生答案 / **正确答案** / 对错 / 得分 / 满分) + * + 综合大题(题干快照 + 三小问作答与得分)+ 本科/教师组作品文件清单。 + * ⚠️ 含正确答案,仅管理员可用。 + * @param {string} group - 组别标识(须与考生实际组别一致) + * @param {number|string} contestantId - 考生 ID(contestants.id) + * @returns {Promise} { name, idNumber, phone, group, objectiveApplicable, scorePublished, + * objective: [{ seq, questionType, questionUid, question, options, correctAnswer, maxScore, + * answer, answered, isCorrect, score, answerMatches, questionMissing }], + * summary: { answered, total, correctCount, autoScore, wordScore, totalScore }, + * bigQuestion, works, warnings, matchedKeys, questionOrderFixed } + */ +export function getContestantScore(group, contestantId) { + return request.get(`/admin/review/score/${group}/${contestantId}`) +} + diff --git a/src/views/Admin.vue b/src/views/Admin.vue index 0c2b7f2..83a455b 100644 --- a/src/views/Admin.vue +++ b/src/views/Admin.vue @@ -48,6 +48,10 @@ 成绩管理 + + + 成绩复核 + 新闻管理 @@ -990,6 +994,255 @@ + + +