mirror of
https://gitcode.com/JianFeeeee/ModelRouter.git
synced 2026-10-03 23:54:06 +00:00
首页记录表由 paintRecords(st.records) 渲染,而 /api/stats 的 period 分支 手写了一份响应 map,压根没有 records 字段 —— 只有 all 分支走 Snapshot() 才带得上。实测切到日/周/月,记录表恒为空。 两处数据源也不一致: | 端点 | 数据源 | 排序 | |---|---|---| | /api/stats(all)| 内存ring(几百条)| oldest-first | | /api/stats/records(翻页)| 审计文件(全部)| newest-first | | /api/stats(period)| 无 | 无 | 前端靠 paintRecords 里一句 .reverse() 把 all 的 oldest-first 转成 newest-first, 翻页端点则本来就是 newest-first。首屏和翻页方向相反,滚动时新旧行会错位 拼接;且 all 分支不带 next_cursor,表永远停在第一屏。 修法:两个分支都改用 AuditPage(与翻页端点同一份代码路径),记录方向统一 由它决定,前端去掉 .reverse()。附带好处:记录深度不再受 maxRecs 限制, "全部"视图真的能翻到底。 判据三条,变异验证:period 分支返回 nil records → 前两条判红;all 分支不 覆盖 records → "no next_cursor"判红。变异过程中我自己也犯了两次错:第一版 判据硬编码 newest-first,而AuditPage 在单文件(整块读完)与多文件(分块反向 读)下方向不同,改为断言两处方向一致;第三版想测 admin 过滤,但 newTestGateway 的 sk-test 不是 admin,改为测真正的越权边界(非admin 不能 用 ?key= 看别人的记录)。 CDP 实测:四个视图各 100 行、时间从新到旧,滚动加载 100→200 行且新末行 时间更旧(顺序衔接正确)。 Co-Authored-By: ModelRouter <noreply@modelrouter.dev>