# 时间线页面复测报告 日期:2026-05-31 ## 结论 其他团队的修改有部分推进,但时间线页面还不能算完成。已改善的点包括:`scale=day` 时下拉框能正确显示 Day、segment 外层宽度开始使用 `track_width_pct`、asset 名称已具备链接、`_partial=1` 从 HTML 改成了 JSON,单次响应体从上一轮约 315 KB 降到当前约 128 KB。 但复测发现新的关键回归:页面加载后客户端 JS 会直接替换 `#tl-canvas.innerHTML`,把时间刻度行清掉;滚轮/按钮缩放没有可靠生效;Auto scale 在手动范围下仍然错误;事件点仍然只是无文字小点;资产筛选仍不是需求里的“type/location 筛选后资产多选默认全选”。 ## 测试环境 - 本地服务:`http://127.0.0.1:9000` - 页面:`/mission-preview/timeline` - 自动化:Codex in-app Browser + 现有 `tests/test_e2e.py` - 当前工作区包含大量未提交改动,本报告只做复测与记录,不修改业务代码。 ## 执行的检查 ### HTTP / 路由检查 1. `GET /mission-preview/timeline` - HTTP 200 - 响应体约 512 KB - 包含 `tl-viewport` / `tl-canvas` 2. `GET /mission-preview/timeline?_partial=1` - HTTP 200 - `Content-Type: application/json` - 响应体约 128 KB - `scale=year` - `bucket_count=15` - `rows=14` 3. `GET /mission-preview/timeline?scale=auto&start=2057-04-24&end=2057-07-21&range_mode=manual&_partial=1` - HTTP 200 - `range_start=2057-04-24T00:00` - `range_end=2057-07-21T00:00` - 实际 `scale=year` - 实际 `bucket_count=1` - 这是错误结果。88 天范围应该自动进入 Day 或至少 Month。 4. `GET /mission-preview/timeline?scale=day&start=2057-04-24&end=2057-07-21&range_mode=manual&_partial=1` - HTTP 200 - `scale=day` - `bucket_count=89` - 说明显式 Day 路径可工作。 ### 浏览器 DOM 检查 初始打开 `/mission-preview/timeline` 后,等待 JS 执行完成: - `#tl-canvas.children.length = 14` - DOM 中 asset 行数 = 14 - segment 数 = 116 - event 数 = 238 - `timeline_json.scale = year` - `timeline_json.bucket_count = 15` - `select[name=scale].value = year` - `window.tlZoom = undefined` - `window.tlResetView = undefined` 重要现象:客户端渲染后,`#tl-canvas` 的第一个子元素已经是 `Europa Outpost` 的资产行,不再是时间刻度行。也就是说,服务端首屏渲染出来的刻度行被 JS 清掉了。 ### 现有 E2E 执行命令: ```powershell python tests\test_e2e.py ``` 结果: - 总计 36 项 - 通过 34 项 - 失败 2 项 - 失败项均为时间线: - `8.1 渲染` - `8.2 数据 -- 0 rows` 说明:现有 E2E 仍在找旧 DOM 选择器 `#tls` / `.tl-r`,已经与当前实现失配。这个失败不等价于页面完全不可用,但说明测试套件没有跟随时间线重构更新,无法作为时间线验收依据。 ## 逐项复测结果 ### 1. 滚轮缩放卡顿 状态:部分改善,但未通过。 改善点: - `_partial=1` 改成 JSON 后,单次 partial 数据量下降到约 128 KB。 - 新实现意图是在客户端用 `timeline_json` 直接重绘,理论上可以避免上一版每次 wheel 都请求后端。 仍存在的问题: - 实测滚轮操作没有改变 hidden `start/end`,也没有改变 segment 位置。 - `Zoom +` / `Zoom -` / `Reset View` 按钮仍然存在,但模板里没有定义 `tlZoom()` 和 `tlResetView()`。 - 客户端 zoom 逻辑只调整 `bucket_count`,没有按新的 `range_start/range_end` 重新计算每个 segment/event 相对位置。即使 wheel 触发成功,也会出现“缩放但不按新窗口重定位”的问题。 证据: - `window.tlZoom` 为 `undefined` - `window.tlResetView` 为 `undefined` - 点击按钮对应的 inline handler 是 `tlZoom(1.3)` / `tlResetView()` ### 2. 滚轮缩放丢失日志/资产 状态:旧丢参问题缓解,但新实现仍有风险。 已改善: - 客户端缩放不再发 AJAX,因此上一版 wheel AJAX 丢 `asset_ids` / `record_scope` 的问题不再以同样形式出现。 - URL 手动传 2 个 `asset_ids` 时,DOM 确实只渲染这 2 个 asset。 仍存在的问题: - 默认资产多选框没有任何选中项,但页面渲染 14 个 asset。UI 表达仍然是“未选择”,实际语义却是“全部显示”。 - 客户端缩放数据来自初始 `timeline_json`,如果后续改为 partial 更新,需要重新验证所有 filter 参数是否同步。 证据: - 默认打开时:asset options = 14,selected count = 0,timeline rows = 14。 - 加 `asset_ids=A&B` 打开时:selected count = 2,timeline rows = 2。 ### 3. 缩放时自动切换年/月/日 状态:未通过。 显式 `scale=day` 已经可以显示 Day,并且 JSON 返回 `bucket_count=89`。但 `scale=auto` 或不传 `scale` 且传入 88 天手动范围时,后端仍返回 `scale=year`、`bucket_count=1`。 根因判断: - `mission_timeline_preview()` 在解析 `range_start/range_end` 之前先调用 `_resolve_timeline_scale(request.args.get("scale"), initial_range_start, initial_range_end)`。 - 这导致 auto scale 使用的是默认全量时间范围,而不是用户当前手动范围。 - 此外 `