返回 Bug 清单
BUG-0405project-13中已修复frontend-integration

后端返回 camelCase 且缺字段的题目摘要,前端按 snake_case 完整题目消费,造成「加载成功但选项与答案全空」

发现:2026-10-03验证:2026-10-09置信度:90%

症状

练习页能进入、题干预设为空,选项列表为空且无法作答;接口 200、无异常日志,看起来像前端渲染问题。

根因

/adaptive/next 的响应是手写 LinkedHashMap,键名用 camelCase(questionId/questionType/knowledgePoint)且只放 5 个字段,不返回 options 与 answer;而前端按 Question 实体的 snake_case(id/question_type/knowledge_point)读取,并期望有 options/answer 才能渲染。两侧都不报错:前端拿到对象但每个字段都是 undefined,页面渲染成空选项列表。

修复方案

①前端加归一函数 normalizeNextQuestion(brief, full) 把 camelCase 摘要映射为内部分型,并用现有字段可用的判断决定是否需要补取;②后端 next 一并返回 options/answer/analysis/subject/chapter,并对 stem/knowledgePoint/chapter/options/analysis 统一做占位符解析(此前只有 /questions/{id} 做解析,导致同一道题两条路径呈现不一致);③前端改为「next 已带 options/answer 则不再发第二次请求」,并保留回退分支以兼容未升级的后端,两条路径均有测试覆盖。 【交叉引用·2026-10-03】本条与 BUG-DSX-006B(slug=dsx-006b-camel-snake-contract-drift-tsc-blocked)**主题重叠**:同属「前后端字段命名契约漂移」。区别:本条聚焦 /adaptive/next **单接口**返回 camelCase 摘要且缺 options/answer;BUG-DSX-006B 聚焦 Admin/PC 两端**批量字段名失配**引发的 tsc 编译阻断。两者保留为独立条目(触发面与修复手法不同),请勿因「看起来重复」而删除任一条。

错误签名

next 返回 {questionId, stem, knowledgePoint, difficulty, questionType}(无 options/answer);前端读取 id/question_type/knowledge_point/options/answer

技术信息

来源项目

project-13

涉及文件

miniapp/src/services/adaptive.ts, backend/src/main/java/com/project-13/service/AdaptivePracticeService.java

标签

字段命名, 静默错位, 手写 Map, 契约漂移, project-13...