更新记录

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 模式显示在头部
}

十、后端实现注意事项

  1. id 全局唯一:大题 id(g1)和小题 id(q1)建议使用数据库主键或雪花 id,不要用前端临时编号,方便与后端题目表关联。
  2. durationMinutes 为倒计时唯一来源:请勿只返回 "02:00:00" 这样的格式化字符串,前端拿不到分钟数。
  3. 可选类型严格区分:
    • single / multiple 必须带 options
    • judge / shortAnswer / writing 不要带 options(带了也会被前端忽略)
  4. 分数校验(可选):建议后端校验 sum(questionGroups.score) === examInfo.totalScore,不一致时打 warning。
  5. 题目顺序:前端按 questionGroups 数组顺序 + 每个大题内 questions 数组顺序渲染,后端请按照试卷编排顺序返回。

隐私、权限声明

1. 本插件需要申请的系统权限列表:

无

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

无

许可协议

MIT协议

暂无用户评论。