ISSUE-0083:HTTP 列对已采行显示 "-" 让用户误以为未采¶
现象¶
用户截图(v0.10.119)官网列表:
| 状态 | HTTP | 网址 |
|---|---|---|
| 已完成 | - | https://www.webbwellnesscenter.com/ |
| 已完成 | - | https://www.genevawoodsbirthcenter.com/ |
| 已完成 | ✓已采 | http://www.alaskaspca.org/ |
用户问:"有邮箱也有手机,HTTP 下边什么都没?HTTP 这一列啥意思呢?"
根因 — page-log 5000 条环形淘汰¶
data-view.tsx HTTP 列:
renderCell: ({ row }) => {
const log = websiteLogMap.get(row.website.toLowerCase());
if (log?.error) return <Chip mstage 标签 />;
if (log?.status != null) return <Chip HTTP 状态码 />;
return <span>-</span>; // ← log 缺失 = "-"
}
page-log 是 5000 条环形 buffer(page-log.ts:5000)。超过后老记录被淘汰。
但 row.scrape_status=2 仍然表示真采过(持久在 MapTaskData 表里)。 - 老采的行:page-log 被淘汰 → HTTP 列空 → 显示 "-" - 新采的行:page-log 在 → HTTP chip 显示 mstage:success 等
用户看到「状态=已完成 + HTTP=-」误以为没采,本质是 UI 列维度一致性 同款问题: - 状态列看 row 字段(持久) - HTTP 列看 page-log(环形淘汰)
修复(v0.10.120)¶
if (log?.error) return <chip mstage />;
if (log?.status != null) return <chip status />;
// v0.10.120:log 缺失但 row.scrape_status=2 → 灰 ✓ + tooltip
if (row.scrape_status === 2) {
return (
<Tooltip title="已采过此网站;详细日志已被环形 buffer 淘汰(保留最近 5000 条)">
<Chip label="✓" sx={{ color: 'text.secondary', bgcolor: 'action.hover' }} />
</Tooltip>
);
}
return (
<Tooltip title="此网站还未被采集(待采集状态)">
<span style={{ color: '#aaa' }}>-</span>
</Tooltip>
);
3 级降级: 1. 有 log → 显示 mstage chip / HTTP status chip 2. 无 log + row.scrape_status=2 → 灰 ✓(已采但日志过期) 3. 无 log + 其他 status → "-"(未采)
每种情况都有 tooltip 说明,不再让用户疑惑。
教训¶
- UI 列必须兜底处理"信号缺失" — 不能只显示空让用户猜
- environment 数据(page-log 环形)+ 持久数据(row 字段)混搭是 ISSUE-0075/0076 信号维度 同款家族
- 降级链要完整:A → fallback B → fallback C → 终态,每级都有 tooltip 说明
- 把这条加进
ui-column-dimension-consistency.md:跨维度兜底兜底再兜底