历阶 Helix-α 冲刺 Day6

历阶 历阶 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
这个作业属于哪个课程202601福大-软件工程实践-W班
这个作业要求在哪里软件工程实践团队作业-站立式会议+α冲刺
这个作业的目标完成 α冲刺 Day6:检索 + 正文读入(上),FSRS 复习调度收尾修复,登录态演示残留清理
其他参考文献《构建之法》

目录

  • 一、站立式会议
  • 二、项目燃尽图
  • 三、昨日至今进展总览
  • 3.1 检索 + 正文读入(主线任务)
  • 3.2 FSRS 复习调度收尾(Day5 遗留问题)
  • 3.3 登录态演示残留清理
  • 3.4 其他修复
  • 3.5 今日测试发现
  • 四、成员进展
  • 五、代码签入与测试结果记录
  • 问题1:登录用户完成并通过 L1 层级测试后,天梯上该层仍显示「本层未测」
  • 问题2:登录用户点击「跳过测试」后提示「已跳过」,天梯上该层仍显示「本层未测」
  • 问题3:登录用户的「分析额度」显示「0 次」与访客的「0 / 3」语义断裂,且账号浮层在登录态下仍保留访客页签
  • 问题4:访客与 AI 对话后,「分析额度」仍是 0,走了完整的新建计划分析后同样纹丝不动
  • 六、程序/模块最新运行效果
  • 6.1 今日面板:任务概览与学习足迹
  • 6.2 任务详情页:掌握状态三按钮
  • 6.3 甘特图:多计划并排展示与拖拽改期
  • 6.4 顶栏与登录态:中性占位,身份清晰
  • 6.5 AI 助手:对话与计划分析入口

一、站立式会议

参会成员:周蔚琳、刘嘉奕、柳钰舒、黄奕、郑聪凌、刘锐清、林彩华、汤文琪、AI 技术员

会议照片:

img


二、项目燃尽图

燃尽图:

img


三、昨日至今进展总览

Day6 是 α冲刺的第六天,主线任务是「检索 + 正文读入(上)」——把外部检索引擎和文档正文抽取接进分析流水线,让"目标输入→四段分析"从 mock 走向真实可用。同时,团队集中清理了前期攒下的一批登录态演示残留,并对 Day5 刚交付的 FSRS 复习调度做了一轮功能完整性核查与收尾修复。专职测试今日跑出 4 个问题,分两组归属到不同阶段的验收遗漏。

3.1 检索 + 正文读入(主线任务)

  • 检索引擎切换:主引擎从 Tavily 换成博查 AI Search(国内直连),Tavily 降级为备用。降级链设计为「博查 → Tavily → 仅检索词」,任何引擎故障都不卡住主流程,绝不编造假链接。
  • 文档读入扩展:readers 服务升到 0.3.0,新增 read_doc.py,支持 PDF / Word / PPT 三种格式的正文与表格提取,不识别的格式安全排除。
  • 端到端验证:真实链接 → 存活检查 → 正文读入 → 落库 body_ready=true,全链路跑通。

3.2 FSRS 复习调度收尾(Day5 遗留问题)

  • 原因句规范:固定原因句句末去掉多余句号,且只有"还糊"评分才返回原因句,"还熟"不再误返回还糊原因句。
  • 还熟也排复习日:修复标"还熟"时 reviewDate 写死为 null 的问题,现在还熟也走 FSRS 调度排复习日,只是不附原因句。
  • 前端手动掌握按钮:任务详情页新增「未标记 / 还熟 / 还糊」三个按钮,用户可以手动切换掌握状态。
  • 到期复习显示原因句:今日面板的到期复习条目下方,新增显示完整原因句原文。
  • 类型修复:Pydantic review_reason 改为 Optional,修复非 again 时返回 None 导致的 500 错误。
  • 阶段测试标准恢复:阶段测试通过标准恢复为说明书要求的 2/3(不足一题向上取整)。

3.3 登录态演示残留清理

  • **首帧不再闪现"林知"**:顶栏登录刷新先显示中性占位(头像 + "加载中"),/me 返回后再渲染真实身份。
  • 登录态不再闪现示例计划:甘特图首帧不再预填原型种子("掌握 Rust 异步编程"等),登录态下加载中显示"正在加载计划"。
  • **修复"提示成功但画面不动"**:接口响应漏拆 { subtask } 包装层导致的改期、打卡、掌握度不即时刷新问题,已统一修复。
  • 全站日期切换为真实当天:前端"今天"从硬编码 2026-10-15 切换为真实日期,访客种子按相对偏移平移。
  • 甘特图重构 + 归档概念删除:甘特筛选改为"全部并排 + 弹窗选单切换",删除整套"归档"概念,后端新增自动毕业判定。

3.4 其他修复

  • 对话记录按身份持久化:自由对话切页后丢失的问题修复,记录按访客 id / 用户 id 分开存储,先读后写避免空列表覆盖。
  • AI 导入防重复:导入学习计划库按钮加进行中锁与禁用态,成功后显示绿色完成卡片,避免连点重复建计划。

3.5 今日测试发现

专职测试今日跑出 4 个问题:

  • Day5 阶段核对联动验收遗漏(问题 1、2):登录态通过 / 跳过层级测试后,天梯仍显示"本层未测"——根因是视图层 tests 数据写死为空对象,服务端核对结果没有路径映射回前端。
  • Day2/Day3 额度体系连带问题(问题 3、4):登录用户额度显示裸"0 次"语义断裂,访客走完分析导入后额度仍为 0——根因是服务端 ai_generate_count 字段无递增逻辑,实际拦截用的是前端内存计数,两套体系互不相通。

四、成员进展

成员从昨天站立式会议到现在的进展存在的问题/遇到的困难从现在到明天站立式会议的安排心得体会今日成果(一句话)
周蔚琳(152401221)按 10 月 27 日测试报告修了自由对话切页丢失。汤文琪此前已把记录写入浏览器,但用的是全局键 helix_chat_history,页面一打开还会先用空列表覆盖已有内容,开发环境里切页再回来对话仍会丢。这次改成按身份分开存:未登录用浏览器访客 id,登录后用用户 id,两份不合并;先读出已有记录再允许写回。新建计划的分析过程不存。服务端仍只取最近 8 轮。提交 aa0cfcb 已推 dev。旧的全局键会让同一浏览器上的不同账号共用一份对话,和以后云上登录按人隔离冲突。首帧先写入空列表,会把还没读出来的记录盖掉登录上云之后,对话以服务器记录为准,浏览器这份只在未登录时使用。新建计划的分析会话仍不持久化本地持久化必须等读完再写,否则空的初始状态会覆盖旧数据。存储键要带上身份,不能所有人共用一把修好自由对话切页后丢失:记录按身份留在浏览器,未登录用访客 id,登录后用用户 id,先读后写,避免空列表覆盖。1 个提交已推 dev:fix(ai) aa0cfcb。
刘嘉奕(102400204)历史与成就页删除右侧"数据"面板(导出 JSON、导入存档、分享路径、重置演示数据)及对应函数;删掉"已归档"整套概念:我的任务列表去掉 archived 页签和归档菜单、任务详情页去掉归档按钮与状态 chip,后端 refreshTaskTrace 增加自动毕业判定(台阶全部完成、全部 familiar、无未来复习日时 active 计划自动置为 done);顶栏首帧不再写死演示用户"林知",登录刷新先显示中性占位(头像 + ··· + 加载中),/me 返回后再渲染真实身份,未登录落到中性访客身份;甘特图筛选从顶部一排 chips 重构为"全部并排 + 选一单计划"模式(弹窗选单带完成数,选中单计划后用 ‹ › 切换),提示文案明确为"复习日卡片无法拖动";今日面板左右两栏(台阶列表 / 学习足迹统计)改为各自独立滚动并隐藏灰色滚动条,窄屏单列时恢复整页自然滚动;第二批:AI 助手「导入学习计划库」按钮加进行中锁与禁用态(导入中显示"导入中…"),成功后对话轮切换为绿色"已导入学习计划库"完成卡片,台阶预览、甘特预览与导入按钮隐藏,避免连点重复建计划;修复 patchSubtask 响应未拆包导致登录态拖拽改期、打卡勾选、掌握度回显不即时、需刷新才生效的问题,与 reviewSubtask 统一从 { subtask } 取真实步骤对象;第三批:统一取数层按登录态 / 访客态分流——计划首帧不再预填原型种子,甘特图加载中显示"正在加载计划",刷新不再闪现"掌握 Rust 异步编程"等示例计划;登录态不套用种子统计、成就与记忆(成就默认全灰、记忆显示空态,专注分钟与连续天数取真实值或 0),访客演示态保留种子;顶栏加载中不再渲染"···"占位名,改为头像 + "加载中",/me 返回后再显示真实用户名甘特一开始误把"全部计划"视图删没了,实际时间轴上多单并排看排期冲突有价值,补回"全部并排"作为默认首项、弹窗里第一项即全部计划;mastery 只有 none/familiar/fuzzy 三态(没有 known),自动毕业条件要按 familiar 判定,不能凭印象写;顶栏首帧直接填 seed 用户是历史遗留,首帧必须用 null 中性占位避免 hydration 不一致;双栏加 overflow 后露出灰色滚动条不好看,再用 scrollbar-width:none 隐藏,窄屏断点要覆盖回自然滚动;AI 导入原先成功后直接跳详情页且按钮无锁,用户以为没成功会连点建出多个计划;patchSubtask 与 reviewSubtask 对后端包装层的解包口径不一致,复习评分即时正常而改期、打卡不刷新,需对照两条接口路径才定位到拆包遗漏;种子数据要分清"首帧闪现"和"常驻假数据"两层:计划类首帧清空即可,成就 / 记忆后端暂无前端查询接口,只能先在登录态前端清空、访客保留,真实成就解锁留待补接口;连续天数旧统计函数读种子打卡表,与后端真实 streak 口径未打通,本轮先保证不显示假值等组员 pull 后验收这批清理与交互改动;继续处理测试报告剩余问题:笔记按用户隔离(问题2)、AI 对话切页不丢失(问题3)、系统"今天"硬编码 10-15 的登录态真实日期切换(问题6);配合复习闭环联调,验证自动毕业触发时机以及复习日在甘特图和今日面板的同步;验证 AI 导入在登录态与访客态下都只生成一份计划;回归甘特拖拽改期、今日面板打卡与掌握度即时联动;回归登录态刷新甘特、历史与成就、顶栏均不再出现演示种子;评估把连续天数接到后端真实 streak、补成就 / 记忆查询接口删功能要顺着调用链清干净:前端页签、菜单、按钮、chip 分支和后端状态判定一起改,不然会留死代码和空状态错位;筛选交互要同时保留"全局概览"和"单条聚焦"两种模式,不能为了对齐别的页面样式把全部视图删掉;首帧身份用 null 中性占位比默认填演示账号稳,不会让登录用户刷新时看到别人名字;独立滚动容器高度要按视口算好,并给窄屏断点留退路;异步提交按钮要在请求进行中禁用并给出明确完成态反馈,否则用户会反复点击造成重复数据;前端 API 封装对同一后端响应包装结构的解包口径必须统一,一个接口漏拆就会出现"后端已成功、前端不更新、刷新才对"的假象;首帧默认值不能直接塞演示种子,要用登录态 / 访客态标志分流,否则登录用户一刷新就看到别人的示例计划、徽章和记忆;前端缺后端接口的统计字段宁可先置空显示 0 或空态,也不要长期展示原型假数据今日完成三批改动并推到 dev 分支:第一批 37662f0(7 个文件,+184 / -195)完成历史页数据面板清理、归档概念移除与后端自动毕业判定、顶栏登录首帧中性占位、甘特图选单模式重构、今日面板双栏独立滚动;第二批 7fa0071(3 个文件,+80 / -29)完成 AI 导入计划防重复与绿色完成卡片、步骤更新响应统一拆包修复拖拽改期 / 打卡 / 掌握度即时刷新;第三批 61daf1a(3 个文件,+22 / -9)完成登录态演示种子计划闪现消除、历史页登录态成就 / 记忆 / 统计假数据清理、顶栏加载占位名去除。三批行数合计 +286 / -233。
柳钰舒(102400205)完成 Day6:① 文档读入——readers 服务升 0.3.0,新增 read_doc.py(pypdf / python-docx / python-pptx 解析 PDF/Word/PPT 正文与表格,标题元数据兜底、瞬时失败重试一次、4xx 不重试),/read 支持四类型(网页/pdf/word/ppt),不识别格式 bad_kind 安全排除;② 检索引擎切换——主引擎 Tavily 换成博查 AI Search(国内直连、Bearer key),Tavily 降级为备用,博查失败/无结果自动降级 Tavily、再降级仅检索词,空结果重试一次;key 只存 web/.env.local。端到端验证:真实链接 → 存活 → 正文读入 → 落库 body_ready=true;博查 key 未激活(403)时自动走 Tavily 兜底出真实链接。2 个提交已推 dev(b1ae4d5 / 4d49709),创建工作项 #71206157Tavily 国内直连间歇性 RST(时通时不通)导致检索结果时多时少——已通过切换博查主引擎解决;dev server 长驻进程连接池会缓存坏连接,网络波动后即使恢复也持续失败,重启 dev server 即恢复askSteps「已读入正文材料清单」渲染格式确认;检索参数(perQuery/maxTotal)与相似检索词合并优化留待贝塔冲刺精细化国内直连优先:外部 API 先考虑国内可达性,少踩 RST 的坑;降级链设计(主引擎→备用→仅检索词)保证链路永远不崩、绝不编造;用临时诊断日志截获模型输出,把"缺主题"这类随机性问题从猜测变成实锤完成文档读入(PDF/Word/PPT 正文与表格提取,readers 0.3.0)+ 检索引擎切换(博查 AI Search 为主、Tavily 备用降级链)+ 端到端验证(真实链接、正文落库 body_ready=true)。排查并解决 Tavily 网络不稳定(换国内直连主引擎)与 dev server 连接池坏连接(重启恢复)。tsc 归零。2 个提交已推 dev:feat(readers) b1ae4d5、feat(analysis) 4d49709,工作项 #71206157。
黄奕(102400203)修复登录态甘特改期提示成功但条不动、勾选与掌握度不即时刷新(接口响应漏拆 { subtask } 包装);补齐 markStep 防御;甘特撤回栈持久化、账号隔离、本机基线、完成态锁定与一键复原;全站"今天"切换为真实当天,访客 seed 相对真实今天归一化,服务端排期起点取真实时钟推送前远程已被同学推进 8 个提交,rebase 时甘特组件与任务 API 封装两处冲突,已按远程最新为底叠加我方逻辑解决;前端展示轴此前停在演示日,与服务端 FSRS 真实时钟两套口径打架等组员验收登录态拖拽即时移动、撤回与复原;回归访客 seed 每次打开保持新鲜;核对服务端新建计划起点日期响应包装少拆一行会让改期、打卡、掌握度整条链路静默失效;基线落本机后刷新不被后端覆盖;访客种子按相对偏移平移,每次打开围绕真实当天重新排期修复登录态甘特改期、勾选、掌握度不即时刷新的问题,补齐甘特撤回/基线/锁定与一键复原;全站日期口径切换为真实当天,访客 seed 相对真实今天归一化、每次打开保持新鲜,服务端新建计划起点同步对齐真实时钟;代码已 rebase 到远程最新之上并推送到 dev 分支。
郑聪凌(102400309)在 Day5 FSRS 复习闭环基础上,继续修复独立 py-fsrs 服务和 Web 端的调度问题;同步远程 dev 分支中的 FSRS 修复内容,解决 main.py 合并冲突;统一使用新版 FSRS().review_card 接口,保留业务时区和固定日期计算;完善 FSRS 卡片状态、复习原因和复习日展示;保持复习日由服务端计算、普通学习台阶可改期的规则。本地 FSRS 修改与远程 dev 分支存在多个文件重叠,需要手动合并;fsrs-service/main.py 曾出现 py-fsrs API 冲突;生产构建初次运行时受到 .next 目录权限和 Node 进程占用影响;本地仍有未跟踪的 Python 虚拟环境和临时 diff 文件,不能误提交。继续验证合并后的 FSRS 完整链路,重点检查复习评分、复习日只读、服务异常"待计算"、重复提交和普通打卡不清除复习状态;清理本地临时文件和虚拟环境,确认远程 dev 分支与本地提交一致,并补充 Day7 联调所需的运行记录。多人协作时,FSRS 功能不能只看单个文件是否能编译,还要同时核对远程 API 适配、数据库状态、前端展示和说明书规则。合并远程代码后必须重新确认"还熟不排复习日、还糊才排复习日、阶段测试按 2/3 判定"等核心约束。完成 FSRS 调度修复、远程分支同步、main.py 冲突解决、阶段测试 2/3 规则修正;通过 ESLint、FSRS smoke 测试和生产构建,并将最终代码推送到远程 dev 分支。
刘锐清(102400304)完成 FSRS 复习调度功能完整性核查,对照 SRS 需求逐项排查前后端代码,发现并修复 7 项问题:固定原因句句末多余句号、原因句不区分场景(还熟也返回还糊原因句)、标还熟不排复习日、复习重做后还熟不保留复习日、兜底文案与 SRS 原文不一致、前端无手动掌握标记按钮、到期复习不显示原因句原文。同步修复 Pydantic 类型不匹配导致的服务崩溃问题。完成代码提交并推送至 dev 分支。标还熟的复习日暂未纳入今日待复习列表(当前只统计还糊);FSRS 服务失败时掌握标记仍被修改(SRS 原文"保持未标记"的边界需确认)。配合晚间专职测试进行 FSRS 全功能验证;跟进还熟复习日展示和 FSRS 失败兜底逻辑的产品确认;根据测试反馈继续修复问题。FSRS 复习调度的核心是"服务端计算、前端只读"——复习日和原因句必须由后端调度服务统一生成,前端不能硬编码或兜底生成。前后端联调时要注意类型定义一致,Python 侧 Optional 字段和 TypeScript 侧 nullable 要对齐,否则会 500。完成 FSRS 全链路问题排查与修复(7 项),代码已推送 dev 分支(commit 9fd7340),独立 py-fsrs 服务重启验证通过,手动标还糊/还熟、到期复习原因句展示等功能可正常使用。

AI 技术员工作情况(单独表格)

AI 技术员角色今日任务完成情况与产出对团队效率的具体帮助
测试员对照 SRS F-07 需求逐项核查 FSRS 前后端代码,覆盖 Python 调度服务、Web 适配层、业务层接口、前端展示四个层面定位 7 个功能缺陷和 1 个类型 bug,输出完整问题清单把 FSRS 模块的问题从"感觉有问题"变成"具体哪一行、哪个字段、和需求差在哪",方便精准修复
程序员修复 fsrs-service/main.py 原因句逻辑和类型定义,修复 tasks.ts 标还熟不排复习日的问题,修复 fsrs.ts 兜底文案,给 TaskDetailView 加手动掌握标记按钮,给 ReviewLine 加原因句展示5 个文件修改,打通"手动标还糊→FSRS 调度→复习日+原因句→今日面板展示"完整闭环把 FSRS 从"能跑"修到"符合 SRS 需求",减少了逐行核对说明书的人工时间
环境维护重启独立 py-fsrs 服务,验证 again/good 两种评分接口返回正常确认 Pydantic 类型修复后不再报 500,服务稳定运行保证修复后的服务能正常跑起来,不阻塞后续测试

五、代码签入与测试结果记录

代码签入记录

提交人提交说明Issue提交链接/截图
柳钰舒feat(readers): 文档读入支持 PDF/Word/PPT 正文提取#71206157 Day6 文档读入(readers 0.3.0 + read_doc.py)b1ae4d5
柳钰舒feat(analysis): 检索引擎切换为博查为主、Tavily 备用#71206157 Day6 检索引擎切换(retrieval.ts)4d49709
周蔚琳fix(ai): 自由对话按身份留在浏览器里—aa0cfcb
刘嘉奕fix(web): 清理归档与数据面板、修复登录首帧闪现、甘特选单与今日分栏独立滚动#71208983 Day6:清理归档与数据面板、修复登录首帧闪现、甘特选单与今日分栏独立滚动37662f0
刘嘉奕fix(ai): 导入计划完成态防重复,并修复步骤更新响应拆包导致界面不即时刷新—7fa0071
刘嘉奕fix(ui): 登录态清除演示种子闪现与常驻假数据,优化顶栏加载占位—61daf1a
黄奕fix(web): 修复登录态改期不即时生效,全站日期切换为真实当天并支持甘特撤回复原#71209474 Day6:修复登录态改期不即时生效,全站日期切换为真实当天并支持甘特撤回复原ab9cbee
郑聪凌fix(fsrs): 修复复习调度与状态展示问题#7120928380ea029
郑聪凌fix(fsrs): 同步远程代码并完成合并#7120928375f9dc7
郑聪凌fix(fsrs): 按说明书恢复阶段测试通过标准#7120928370f95f7
刘锐清fix(fsrs): 修复FSRS复习调度多项问题#712032089fd7340

提交记录截图:

img

img

工作项(Issue)

工作项列表截图:

img

测试等其他工作结果

2026-10-28 对 web 工程做了一轮功能测试。测试环境:本地 npm run dev(localhost:3000),访客演示模式(未登录,前端回退 mock 数据),Chrome 浏览器,视口 1440×900。发现 4 个问题:

编号问题现象根因概要关键影响修复方向
问题1登录态通过 L1 层级测试后,天梯仍显示「本层未测」toHelixPlan 写死 tests: {},服务端核对结果没有路径映射回视图层状态标签不更新;L2+ 被前端门禁误锁,与服务端已解锁的事实相反用 listChecks 返回的各层 result 在映射处构造 tests[l]
问题2登录态点「跳过测试」后天梯仍显示「本层未测」同问题一的映射断层;且跳过在服务端以「全对提交」落库,与真实通过混用 passed跳过与通过不可区分,标签恒为未测跳过落独立 result(如 skipped)并映射为「本层已跳过」
问题3登录用户额度显示裸「0 次」,与访客「0 / 3」语义断裂;浮层仍保留访客/登录/注册页签ai_generate_count 有列无递增,实际拦截用前端 seed 内存额度,两套体系互不相通;auth 页签未按登录态裁剪「0 次」被误读为没额度;登录态可一键静默切回访客额度体系统一到服务端扣减;登录态隐藏 auth 页签,身份切换加确认
问题4访客对话及完整「新建计划→分析→导入」后额度仍为 0唯一扣减点只累加前端内存计数(刷新清零),服务端字段无人递增,展示端也无刷新联动用量数字恒为 0,与真实使用永远对不上明确计次口径,服务端统一扣减并在操作后联动 /me 刷新展示

问题1:登录用户完成并通过 L1 层级测试后,天梯上该层仍显示「本层未测」

冲刺归属:Day 5(10-27)FSRS 复习调度。层级综合测试在登录态下的完整链路是「拉取核对项(listChecks)→ 提交核对(submitStageCheck)→ 服务端按知识点回写熟/糊并进入 FSRS 调度」,这正是 Day 5 冲刺计划里「阶段核对联动」交付的内容,服务端这一半是完整可用的;缺的是联动的另一半——「核对结果 → 天梯状态展示」从来没有接上。

问题一现场截图:L1 层级测试通过后,通关测试行状态仍为未测

复现步骤:以普通用户登录 → 进入「历阶天梯」(或今日看板)→ 把 L1 的所有知识点逐个标记完成,点亮 L1 后出现「开始测试」按钮 → 点击「开始测试」,答题后点击「提交测试」,达到通过线(≥67%)→ 评估面板提示通过 → 关闭弹窗,回到天梯页观察 L1「通关测试」行的状态标签。

预期行为:评估面板提示通过后,天梯上 L1 通关测试行的状态标签应变为「本层已过 XX 分」;后续 L2 及以上层级的解锁判定基于该结果推进,刷新页面后状态保持。

实际行为:评估面板明明显示「✓ 本层已通过,下一层测试已解锁」,天梯上 L1 的通关测试行却仍显示「本层未测」;刷新页面、重新登录都不会变化。对照实验:同样的操作在访客(未登录)模式下做完,状态标签能正常变为「本层已过 XX 分」——同一条业务链路在两种模式下一个正常一个失效。

根因分析:登录态下「层级测试结果」在前端视图层没有数据来源,是典型的对接断层,分三层看。第一层,展示层读的是 plan.tests:LevelTestRow.tsx 通过 levelTestOf(plan, level) 取状态渲染标签,而 derive.ts 的 levelTestOf 从 plan.tests[l] 取值,取不到就回落到 { status: 'untested' }——于是永远显示「本层未测」。第二层,登录态的 tests 永远是空对象:helix.ts 的 toHelixPlan 把 API 计划映射为视图计划时,写死 tests: {};后端 /api/tasks 返回的 ApiTaskRow 只带 subtasks 与进度,不携带任何层级核对结果,所以无论 reload 多少次 tests 都是空的。第三层,提交链路只写了服务端、没有回写视图:LevelTestModal.tsx 登录态提交走 submitStageCheck,成功后只调 onResult(true)(实现就是 reload);服务端 stageChecks.ts 其实把该写的都写了——stageChecks.result 置为 passed、逐知识点回写 mastery 与 FSRS 状态、解锁下一层、taskTraces 记录 stagePassed = true——但这些结果没有任何一条路径映射回前端的 tests 结构。连带影响不止状态标签:derive.ts 的 levelUnlocked / firstBlockingTestLevel 同样基于 plan.tests 判定,登录态下恒为 untested,导致 L1 通过后 L2 的通关测试行仍显示「🔒 需先过 L1 测试」,L2 台阶的打卡与进入仍被前端门禁拦截——与服务端已解锁的事实正好相反。

修复建议:把核对结果接进视图数据层,改动集中在映射一处。数据侧,现有接口已经够用——/api/tasks/:id/checks 返回的 ApiCheck 自带 level 与 result,可以在 useAppData 的首次加载与 reload 里对每个计划并行拉取一次 listChecks,把各层 result 映射进 tests[l];展示侧,toHelixPlan 接收核对结果参数来构造 tests,替换写死的空对象。映射接通后,levelTestOf / levelUnlocked / firstBlockingTestLevel 三个派生函数对登录态自动生效,状态标签与 L2+ 的解锁门禁一并恢复,展示组件不需要再动。



问题2:登录用户点击「跳过测试」后提示「已跳过」,天梯上该层仍显示「本层未测」

冲刺归属:Day 5(10-27)FSRS 复习调度,与问题一同源。跳过测试在登录态下走的也是「submitStageCheck 提交 → 服务端解锁下一层」这条 Day 5 交付的阶段核对链路,服务端同样正常落库;状态不显示依然是「核对结果 → 天梯状态展示」映射缺失所致。

问题二现场截图:跳过测试后,通关测试行状态仍为未测

复现步骤:以普通用户登录 → 进入「历阶天梯」→ 把 L1 的所有知识点标记完成点亮层级 → 点击通关测试行上的「跳过测试」按钮 → 观察 toast 提示与 L1 通关测试行的状态标签 → 刷新页面再观察一次。

预期行为:跳过后天梯上 L1 通关测试行的状态标签应变为「本层已跳过」,L2 及以上层级随之解锁,刷新页面后状态保持。

实际行为:toast 正常弹出「已跳过 L1 测试:L2 已解锁」,但 L1 通关测试行仍显示「本层未测」;刷新页面后依旧是「本层未测」,L2 也仍处于锁定状态。

根因分析:与问题一是同一个断层,只是走的是跳过分支。Ladder.tsx 的 skipTest 在登录态下调 listChecks 找到本层核对项后 submitStageCheck 提交,成功即 reload() 并弹「已跳过 L1 测试:L2 已解锁」;服务端 stageChecks.ts 也正常解锁了下一层并记录 stagePassed = true。但正如问题一根因第二层所述,helix.ts 的 tests: {} 写死为空,reload 拉回的数据不携带任何核对结果,levelTestOf 永远回落「untested」——跳过结果同样没有路径映射回 tests[l].status = 'skipped'。需要特别指出的一点:跳过在服务端是以「全对提交」近似的,落库的 result 与真实通过完全一样都是 passed——也就是说,即使按问题一的修复方案把核对结果映射进 tests,跳过也只会显示成「本层已过 100 分」而不是「本层已跳过」,跳过与通过在天梯上仍不可区分。

修复建议:以问题一的数据映射修复为前提,增量工作只剩「跳过语义的落库与映射」。提交侧,跳过时在请求中带上类型标记,服务端把跳过落成独立的 result 值(如 'skipped')而不是与通过混用 passed,解锁下一层的逻辑保持不变;映射侧,toHelixPlan 构造 tests 时把该值对应写为 status: 'skipped',天梯标签即可显示「本层已跳过」。


问题3:登录用户的「分析额度」显示「0 次」与访客的「0 / 3」语义断裂,且账号浮层在登录态下仍保留访客页签

冲刺归属:Day 2(10-24)前后端基本搭建。账号浮层与 users 表的 ai_generate_count 额度字段都是 Day 2 交付的内容,两个子问题的缺陷本体都出在 Day 2 复刻期「形似而神不似」:页签结构照搬原型、没有按登录态裁剪;额度字段只做了「有列、有展示」,没有设计递增逻辑与展示语义。

问题三现场截图一:访客的分析额度显示「0 / 3」

问题三现场截图二:登录用户的分析额度显示「0 次」,且浮层仍保留访客/登录/注册页签

复现步骤:以访客(未登录)状态点击右上角头像,观察访客卡片上的「分析额度」→ 注册/登录一个普通用户 → 再次点击头像,观察「我的账号」卡片上的「分析额度」与浮层顶部的页签行。

预期行为:登录用户的额度展示应与访客同构且语义明确(如「已用 X / 3」或「不限次」),不应出现让人误读为「没额度了」的裸数字;已登录用户的账号浮层不应再呈现「访客 / 登录 / 注册 / 找回密码」这套访客语境页签,更不应能一键把当前会话切换成访客。

实际行为:访客卡片显示「0 / 3」(带进度条,能看出还剩 3 次);登录用户的卡片只显示「0 次」——既没有总数也没有「已用」说明,看起来就像额度为零、什么都不能用。同时浮层顶部仍完整保留「访客 / 登录 / 注册 / 找回密码」四个页签(均未选中),「访客」页签可点击,点击后卡片切换为「访客空间 · 数据保存在本机浏览器」,并且当前会话会被真实切换成访客账号。

根因分析:先说结论——「普通用户额度为 0」不是扣错了账,而是两套互不相通的额度体系加上语义断裂的展示叠加出来的观感。第一层,展示端:账号浮层的访客卡片把服务端返回的 user.quota.aiGenerateCount 渲染成「X / 3」带进度条,而已登录卡片把同一个字段渲染成「X 次」——这个字段的语义是「已用次数」,访客卡片有总数做上下文所以读得懂,登录卡片只剩裸数字,0 就被读成了「没额度」。第二层,数据端:全服务端没有任何代码递增这个字段(只有建列默认 0、seed 置 1、/api/auth/me 原样返回),所以它永远是 0——展示的数字从一开始就不反映真实用量。第三层,真正的额度拦截在另一套体系上:AI 助手导入计划前的判断读的是原型 seed 的演示用户 seedState.user(内存态 quota.used/total),导入成功后 bumpQuotaUsed 给这个内存计数 +1,刷新页面即清零;且该判断不区分登录态——登录用户同样被这个「访客额度」拦截。也就是说:卡片上显示的是服务端恒为 0 的已用计数,实际生效的是前端内存里清零即重置的原型额度,两者互不相通。

修复建议:两个子问题分开修。额度侧,正解是把额度体系统一到服务端:在服务端扣减/校验(创建并导入计划时校验上限并递增 ai_generate_count),前端删掉 seed 内存拦截,改为依据 /me 返回的 quota 判断;展示端把登录卡片改成与访客卡片同构的「已用 X / 3」加进度条,杜绝「0 次 = 没额度」的误读。页签侧,登录态下隐藏「访客 / 登录 / 注册 / 找回密码」页签行,保留「退出到访客」作为唯一明确的身份切换入口并加二次确认。


问题4:访客与 AI 对话后,「分析额度」仍是 0,走了完整的新建计划分析后同样纹丝不动

冲刺归属:Day 3(10-25)大模型接入,与问题三连带。额度门禁是 Day 3 接入 AI 时挂在「新建计划的分析导入」这一步的,「自由对话不计次」也是接入时的隐式设计。

问题四现场截图:访客对话后分析额度仍显示 0

复现步骤:以访客(未登录)状态进入「AI 助手」→ 在「自由对话」里进行几轮对话 → 点击头像查看访客卡片的「分析额度」→ 再走一次完整的「新建计划 → 七步分析 → 导入学习计划」→ 再次查看额度并刷新页面。

预期行为:AI 调用若计次,额度应实时递增且刷新后保持;若对话设计上不计次,额度文案应明确计次范围,让用户知道「对话不动」是正常表现。真正计次的新建计划分析导入后,额度必须 +1。

实际行为:对话几轮后额度停在 0 不动;即便走完「新建计划 → 分析 → 导入」这条唯一设计了扣额度的路径,访客卡片依然是 0,刷新也不变——无论怎么用,这个数字永远不动。

根因分析:这个问题是问题三「两套互不相通的额度体系」在访客侧的完整表现,分两层。第一层,「对话不计次」是隐式设计而非漏扣:全组件只有一处额度扣减——AiAssistant.tsx 的 bumpQuotaUsed,挂在导入计划成功的 finishImport 回调里;额度门禁也只在新建计划的 start 入口判断;自由对话的收发链路完全不经过任何额度逻辑。也就是说「分析额度」在代码里只覆盖「新建计划的分析导入」,对话、出题都不计次——单看这是原型语义的延续,但界面上「分析额度」四个字没有说明计次范围,用户自然预期对话也扣次。第二层,「计次了也看不到」:即使走了真正扣额度的路径,被 +1 的也只是前端 seed 的内存计数,而访客卡片显示的是服务端 users.ai_generate_count(无任何代码递增,恒为 0);顶栏的 user 对象只在页面挂载的 /me 和认证回调时更新,分析导入后也没有任何环节重新拉取——所以无论做多少次分析,访客卡片的数字永远停在 0,内存里的真实用量刷新即清零,两边永远不会对上。

修复建议:与问题三的额度统一方案一体实施,这里是「计次范围」与「展示联动」两个增量。计次范围:先定产品口径——「分析额度」只限新建计划分析(原型语义),还是对话/出题一并计次;按口径在服务端统一扣减与递增,前端删掉 seed 内存计数与拦截。展示联动:额度变动后同步刷新——最简单是导入成功等事件后重新拉一次 /me。文案:把「分析额度」改成明确的计次范围(如「新建计划额度」),对话不计次时加一句说明(如「自由对话不消耗额度」),避免「用了不动」再次被当成 bug。


六、程序/模块最新运行效果

今日项目整体运行正常,主要页面均可正常访问与交互。以下是各模块今日最新效果:

6.1 今日面板:任务概览与学习足迹

今日面板展示当天的待办任务、到期复习项和学习足迹统计,左右两栏各自独立滚动,长列表浏览体验流畅。全站日期已对齐真实当天,访客演示种子按相对偏移围绕真实日期排期,每次打开保持新鲜。

img

6.2 任务详情页:掌握状态三按钮

任务详情页提供「未标记 / 还熟 / 还糊」三个手动掌握状态按钮,点击即时切换掌握标签。标记为"还糊"后,独立 py-fsrs 服务会根据间隔重复算法计算下次复习日期,到期那天今日面板会自动展示原因句提醒复习。

img

6.3 甘特图:多计划并排展示与拖拽改期

甘特图支持"全部并排"和"单计划聚焦"两种模式切换,登录态下拖拽条形改期松开鼠标后即时生效,无需刷新页面。复习日卡片由 FSRS 服务端计算,不可拖动改期,提示文案明确。

img

6.4 顶栏与登录态:中性占位,身份清晰

登录用户刷新页面时,顶栏先显示中性占位(灰色头像 + "加载中"),接口返回后渲染真实用户名与头像,不再闪现演示账号"林知"。访客模式下保留演示种子数据,方便产品演示。

img

6.5 AI 助手:对话与计划分析入口

AI 助手提供自由对话和新建计划分析两大功能,对话记录按身份持久化(访客用浏览器 id,登录用用户 id),切页后不丢失。导入学习计划时按钮有禁用态和完成卡片反馈,避免连点重复建计划。

img

...全文

相关推荐

科技中介服务机构如何提升技术评估的智能化与专业化水平?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

BIZKEEN

高校技术转移办公室人员在开展技术推介时,如何高效生成科技成果展示材料?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

BIZKEEN

产业园区运营负责人如何实现创新资源的高效整合与精准配置?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

BIZKEEN

科技中介服务机构如何利用平台提升服务质量与运营效率?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

BIZKEEN

OxygenXMLEditor-v26.x + keygen

OxygenXMLEditor-v26.x + keygen

fabushi_
评论
收藏 已收藏
分享
返回顶部