更新记录
1.0.0(2026-10-23)
下载此版本
初版
平台兼容性
其他
| 多语言 |
暗黑模式 |
宽屏模式 |
蒸汽模式 |
| √ |
√ |
√ |
× |
在线试卷 — 后端数据接口说明
本文档定义了前端页面期望的 返回数据格式,后端同学按照以下结构返回即可直接渲染。
核心原则:一个接口返回全部试卷信息,前端不做二次组装。
一、接口概览
| 项目 |
值 |
| 接口用途 |
获取一份完整试卷的所有数据 |
| 请求方式 |
GET |
| 示例路径 |
/api/exam/detail?examId=xxx |
| 响应 Content-Type |
application/json |
标准响应包装
{
"code": 200,
"message": "success",
"data": { /* 试卷完整数据,见下方结构 */ }
}
若你们项目使用其他包装(如 ret / success),保持你们既有的外层即可,data 内部结构必须严格对齐下文。
二、data 顶层结构
{
"examInfo": { /* 考试基础信息 */ },
"questionGroups": [ /* 大题数组 */ ]
}
| 字段 |
类型 |
必填 |
说明 |
examInfo |
Object |
✅ |
试卷头部信息(标题、时间、守则等) |
questionGroups |
Array\<Object> |
✅ |
大题列表,按顺序从上到下渲染 |
三、examInfo 字段详解
"examInfo": {
"title": "2026 年度前端工程师专业能力认证考试", // 考试标题(页面大字标题)
"duration": "考试时间 120 分钟", // 文案描述(纯展示用)
"durationMinutes": 120, // ⏱ 考试时长(单位:分钟,**用于倒计时计算**)
"totalScore": 100, // 试卷总分
"studentName": "张三", // 学生姓名(可为空字符串)
"rules": [ // 考试守则数组,每条独立一行
"考生须在规定时间内完成所有题目,超时将自动提交。",
"请确保网络连接稳定,答题过程中请勿刷新页面。"
]
}
| 字段 |
类型 |
必填 |
备注 |
title |
String |
✅ |
居中大标题 |
duration |
String |
✅ |
顶部 meta 区展示的时间文案 |
durationMinutes |
Number |
✅ |
倒计时的唯一数据源,单位分钟,例如 120 表示 120 分钟 |
totalScore |
Number |
✅ |
满分 |
studentName |
String |
⭕ |
为空时显示「请填写姓名」 |
rules |
Array\<String> |
✅ |
考试守则,数组每一项渲染为一条 |
⚠️ 重要:倒计时从 durationMinutes × 60 秒开始倒数,不要把秒数直接塞进来。
四、questionGroups 大题数组
"questionGroups": [
{
"id": "g1", // 大题唯一标识(字符串)
"title": "一、单项选择题", // 大题标题
"score": 30, // 本大题总分
"questions": [ /* 本大题下的小题数组 */ ]
}
]
| 字段 |
类型 |
必填 |
备注 |
id |
String |
✅ |
大题唯一 id,可自造如 g1、g2 |
title |
String |
✅ |
大题标题(如"一、单项选择题") |
score |
Number |
✅ |
大题总分(用于显示 "共 X 题,XX 分") |
questions |
Array\<Object> |
✅ |
小题数组,按顺序渲染 |
五、小题通用字段(questions 内每一项)
{
"id": "q1", // 小题唯一标识(整个试卷内不重复)
"type": "single", // 题型枚举,见下表
"score": 5, // 本题分值
"description": "题干内容..." // 题目描述(支持纯文本)
}
| 字段 |
类型 |
必填 |
备注 |
id |
String |
✅ |
全卷唯一,用作 userAnswers 的 key |
type |
String |
✅ |
决定前端渲染哪种题型组件,枚举值见下 |
score |
Number |
✅ |
本题得分 |
description |
String |
✅ |
题干文本 |
type 枚举表
| type 值 |
中文名称 |
是否需要 options 字段 |
用户答案类型 |
single |
单选题 |
✅ 需要 |
单个字符串,如 "A" |
multiple |
多选题 |
✅ 需要 |
字符串数组,如 ["A","C"] |
judge |
判断题 |
❌ 不需要 |
"T" 或 "F" |
shortAnswer |
简答题 |
❌ 不需要 |
文本字符串 |
writing |
写作题 |
❌ 不需要 |
长文本字符串 |
六、各题型完整示例
1)单选题 type: "single"
{
"id": "q1",
"type": "single",
"score": 5,
"description": "以下哪个是 JavaScript 中的基本数据类型?",
"options": [
{ "key": "A", "value": "Array" },
{ "key": "B", "value": "Object" },
{ "key": "C", "value": "Symbol" },
{ "key": "D", "value": "Function" }
]
}
| options 子字段 |
类型 |
说明 |
key |
String |
选项标识,建议大写字母 A ~ D |
value |
String |
选项文本内容 |
2)多选题 type: "multiple"
{
"id": "q7",
"type": "multiple",
"score": 10,
"description": "以下哪些是 JavaScript 中声明变量的关键字?(多选)",
"options": [
{ "key": "A", "value": "var" },
{ "key": "B", "value": "let" },
{ "key": "C", "value": "const" },
{ "key": "D", "value": "define" }
]
}
options 结构与单选题完全相同,前端自动根据 type 切换为 checkbox 交互。
3)判断题 type: "judge"
{
"id": "q9",
"type": "judge",
"score": 5,
"description": "JavaScript 中,typeof null 的返回值是 \"object\"。"
}
⚠️ 不需要 options 字段。前端固定渲染「✓ 正确 / ✕ 错误」两个按钮,用户答案为 "T" 或 "F"。
4)简答题 type: "shortAnswer"
{
"id": "q11",
"type": "shortAnswer",
"score": 10,
"description": "请简述浏览器从输入 URL 到页面渲染完成的主要过程。"
}
⚠️ 不需要 options 字段。前端渲染一个 textarea(500 字上限)。
5)写作题 type: "writing"
{
"id": "q13",
"type": "writing",
"score": 20,
"description": "结合你的实际开发经验,以\"如何构建一个高性能的 Web 应用\"为主题,写一篇不少于 300 字的短文。"
}
⚠️ 不需要 options 字段。前端渲染大尺寸 textarea(2000 字上限)。
七、完整返回示例
{
"code": 200,
"message": "success",
"data": {
"examInfo": {
"title": "2026 年度前端工程师专业能力认证考试",
"duration": "考试时间 120 分钟",
"durationMinutes": 120,
"totalScore": 100,
"studentName": "张三",
"rules": [
"考生须在规定时间内完成所有题目,超时将自动提交。",
"请确保网络连接稳定,答题过程中请勿刷新页面。"
]
},
"questionGroups": [
{
"id": "g1",
"title": "一、单项选择题",
"score": 30,
"questions": [
{
"id": "q1",
"type": "single",
"score": 5,
"description": "以下哪个是 JavaScript 中的基本数据类型?",
"options": [
{ "key": "A", "value": "Array" },
{ "key": "B", "value": "Object" },
{ "key": "C", "value": "Symbol" },
{ "key": "D", "value": "Function" }
]
}
]
},
{
"id": "g2",
"title": "二、判断题",
"score": 10,
"questions": [
{
"id": "q9",
"type": "judge",
"score": 5,
"description": "JavaScript 中,typeof null 的返回值是 \"object\"。"
}
]
},
{
"id": "g3",
"title": "三、简答题",
"score": 20,
"questions": [
{
"id": "q11",
"type": "shortAnswer",
"score": 10,
"description": "请简述浏览器从输入 URL 到页面渲染完成的主要过程。"
}
]
}
]
}
}
八、前端提交答案格式(后端接收参考)
前端提交 POST /api/exam/submit 时,data 结构如下:
{
"examInfo": {
"title": "2026 年度前端工程师专业能力认证考试",
"durationMinutes": 120,
"totalScore": 100
},
"answers": {
"q1": "C", // 单选:单个 key
"q7": ["A", "B", "C"], // 多选:key 数组
"q9": "T", // 判断:T / F
"q11": "浏览器渲染过程..." // 简答 / 写作:文本
}
}
九、Review 答卷详情模式(后端额外字段)
前端通过 URL 参数切换模式:
| 模式 |
URL 示例 |
页面行为 |
| exam(答题) |
pages/index/index?mode=exam 或无参数 |
倒计时、可交互选项、底部提交按钮 |
| review(详情) |
pages/index/index?mode=review |
无倒计时、显示答案对比+解析、底部返回按钮 |
9.1 每个小题需额外返回(仅 review 模式下必须)
{
"id": "q1",
"type": "single",
"score": 5,
"description": "...",
// === 以下字段 review 模式必带 ===
"correctAnswer": "C", // 正确答案
"analysis": "解析文本..." // 答案解析
}
| 字段 |
类型 |
必填 |
说明 |
correctAnswer |
依题型而定 |
✅ review 模式必带 |
格式见下表 |
analysis |
String |
⭕ 建议 |
答案解析文本,可留空显示"暂无解析" |
correctAnswer 按题型取值
| 题型 |
correctAnswer 格式 |
示例 |
single |
String(单个选项 key) |
"C" |
multiple |
Array(选项 key 数组) |
["A","B","C"] |
judge |
String |
"T" 或 "F" |
shortAnswer |
String |
参考答案要点文本 |
writing |
String |
参考思路/方向文本 |
9.2 data 顶层额外返回学生答卷(仅 review 模式)
{
"examInfo": { ... },
"questionGroups": [ ... ],
// ========== review 模式额外字段 ==========
"userAnswers": {
"q1": "C", // 单选:单个 key
"q2": null, // 未答:null 或 ''
"q7": ["A", "B"], // 多选:key 数组
"q9": "T", // 判断:T / F
"q11": "用户写的内容...", // 简答/写作:文本
"q13": "" // 未答:''
}
}
userAnswers 以小题 id 为 key,前端直接合并进 userAnswers 状态对象。
如果 exam 模式接口不想改,也可以用两个接口:/exam/detail(exam 用)和 /exam/review(review 用,多返回 userAnswers + 每题的 correctAnswer/analysis)。
9.3 前端判分规则(供后端参考,也可后端判分后直接返回 score)
| 题型 |
判分方式 |
single |
userAnswer === correctAnswer |
judge |
userAnswer === correctAnswer |
multiple |
两边排序后数组全等(必须完全一致,多/少都算错) |
shortAnswer / writing |
主观题,前端不自动判,显示"主观题"标签;后端可在 examInfo 里返回 score 字段 |
9.4 examInfo 在 review 模式下可额外带
"examInfo": {
// ...原有字段...
"score": 85 // 学生得分,review 模式显示在头部
}
十、后端实现注意事项
id 全局唯一:大题 id(g1)和小题 id(q1)建议使用数据库主键或雪花 id,不要用前端临时编号,方便与后端题目表关联。
durationMinutes 为倒计时唯一来源:请勿只返回 "02:00:00" 这样的格式化字符串,前端拿不到分钟数。
- 可选类型严格区分:
single / multiple 必须带 options
judge / shortAnswer / writing 不要带 options(带了也会被前端忽略)
- 分数校验(可选):建议后端校验
sum(questionGroups.score) === examInfo.totalScore,不一致时打 warning。
- 题目顺序:前端按
questionGroups 数组顺序 + 每个大题内 questions 数组顺序渲染,后端请按照试卷编排顺序返回。