Skip to content

[P0][Admin UX] 管理后台批量操作静默失败 + Webhook 读数口径撒谎 + 面包屑缺 4 项映射 #88

Description

@fxbin

来源

Roundtable Forge 圆桌对 frontend/src/app/admin/** 的实测诊断结论(2026-09-28~29),已在 docs/quality/regression-matrix.md §二 按十个维度登记三条。

圆桌形成的统一判据:可用性缺陷(会让操作者做出一个错的决定,现在修)> 工程债(下次改那页时顺手)> 纯审美(不花钱)。

三条缺陷

1. 批量操作静默失败(P0)

frontend/src/app/admin/sources/page.tsx 的 handleBatchToggle:

for (const id of ids) {
  try {
    await sourcesApi.update(id, { enabled });
  } catch (err) {
    console.error(`Batch toggle source ${id} failed:`, err);  // 只进 console
  }
}
setSelectedIds(new Set());   // 无条件清空,失败项也被清掉
await fetchSources();

批量停用 30 个信源、其中 5 个失败时,UI 表现为「全部处理完」。失败的 5 个仍按原状态继续采集并污染内容池,而监控大盘一切正常——系统宣称健康,实际状态与操作者认知相反。

2. Webhook 日志页读数口径撒谎(P1)

frontend/src/app/admin/webhook-logs/page.tsx:

  • successCount / failCount 只统计当前页 30 行,却与全局 total 并排渲染成同款 Badge。读者会把「本页 2 失败」除以「共 1240 条」读成 0.16% 失败率。
  • 失败徽章以 failCount > 0 为条件渲染:翻到失败为 0 的分页时,「失败」整枚徽章消失。徽章的缺席本身在制造错误信念。

Webhook 是 TopicEye 的产品交付通道,这个读数错了等于对交付健康度撒谎。

3. 面包屑缺 4 项映射(P2)

frontend/src/components/AdminTopBar.tsx 的 ADMIN_PAGE_LABELS 只有 10 条,侧边栏 15 项。prompts / scoring-dashboard / evidence / webhook-logs 四页无映射,顶栏回退显示兜底文案「管理」。

修复方案

  • 缺陷 1:逐条失败收集并上抛 UI(复用现成 AdminNoticeBanner,不引入 toast 框架);只清成功项的选择态,失败项保持选中以便重试;执行期间用户新勾选的项不被重建丢弃。
  • 缺陷 2:页内计数显式标注「本页」,全局计数标「全部」;成功/失败徽章无条件渲染,0 失败显式写 0。
  • 缺陷 3:补齐 4 项映射。已用脚本逐项核对:侧边栏壳内 14 项 ↔ 面包屑 14 条,全覆盖。

验收与已知缺口

  • 本地验证:tsc --noEmit 0 错;eslint 三个改动文件 0 错(11 个存量未用 import warning);vitest run 147/147。
  • 回归测试暂缺:vitest.config.ts 为 environment: 'node' + include: ['src/**/*.test.ts'],.tsx 组件行为不在覆盖内,CI 五 job 亦无 eslint,本切片无法机器钉住。按 AGENTS.md「教训必须机器化」不变量,这三条不得仅凭文档关闭——关闭条件是补 grep 形态门禁脚本(仿 scripts/check_layering.py)或扩 vitest 到 DOM。该脚本属后续批次,不在本 issue 范围内。

批次

  1. docs:回归矩阵登记(本条)
  2. fix(frontend):缺陷 1 + 缺陷 2
  3. fix(frontend):缺陷 3

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions