Skip to content

feat: 排名页多词对比与渲染性能、总览对象仪表盘重构(关键词/竞品/版本/推广) - #305

Merged
wxy merged 11 commits into
masterfrom
feat/keywords-multi-trend-compare
Sep 19, 2026
Merged

wxy merged 11 commits into
masterfrom
feat/keywords-multi-trend-compare

Conversation

@wxy

@wxy wxy commented Sep 18, 2026 •

Copy link
Copy Markdown
Owner

概要

本 PR 为 feat/post-release-promotion 分支的全部待合并工作(11 个提交,含 #304 复审后续修复与三轮体验迭代)。

主要内容

1. 排名页

  • 一词一卡:全局(en)关键词唯一的家是全局卡(en × 全部商店,列分组「英语商店 | 其他市场」);语言卡只含本语言词,lang=en 深链归一到全局卡
  • 多词趋势对比:勾选 ≥2 词进入对比模式,每词一条跨店最优名次曲线(同口径灰带 = 整卡词池 P25–P75);勾选 1 词直接显示该词逐店曲线
  • 渲染性能:buildCellIndex 快照格索引(O(快照) 预计算、O(1) 查询)+ 全派生链 useMemo 化,勾选/切页不再全量重扫
  • 已删除列表改页面级模态;表头加高对齐;L1「推广待发布」条目移除

2. 总览重构(对象仪表盘)

  • L0 系统脉搏条:数据新鲜度 / 调度器 / 失败 / 采集预算(并入开发卡底部)
  • L1 分诊区:待复核、数据过期、版本不一致、任务失败——每条「现象 + 动作」,无异常收起
  • 对象卡网格:关键词与市场(表现三格 + 进榜词数走势 + 市场组进榜率条可展开逐店 + 词池健康)| 竞品(状态 tile + TOP 竞品 + 优劣势词,指数降为副注)| 开发(四指标 + 限宽热力图 + 系统脉搏)| 版本与发布(管线节点灯 + 上架事实格 + 文案行)| 推广(X 帖子发布漏斗 + 待发布徽标)

3. 深链与一致性

  • 排名页支持 ?tab=competitor|distribution 与 ?scope=pending|deleted;总览各卡直达对应页签/弹层

测试

  • tsc --noEmit、生产构建通过
  • tests/matrix.test.ts(含 buildCellIndex 一致性断言)、matrix-helpers、overview-data、format 等全部通过
  • 总览布局经 Electron 截图壳渲染验证(还原卡高拉伸、重叠问题后复查)

wxy added 5 commits September 18, 2026 08:33
- 左列表头两行 h-6×2 → h-7 + h-9,四个按钮不再拥挤;右侧商店表头格固定
  h-16(64px)与左列等高,全局视图分组行同步 24px,滚动对齐不受影响
- 第二行去掉 overflow-x-auto:裁剪上下文会把绝对定位浮层压成行内一条缝,
  导致点击「已删除」看不到浮层
- 已删除浮层改挂到第二行整行(relative + right-4),不再相对按钮定位被挤出
  列宽之外;deletedPopoverRef 随之外移(span → div)
- 外点关闭逻辑不变:点击行外任意处收起浮层
- 左列滚动容器本身是裁剪上下文,行内绝对定位浮层无法逃出最左列,
  会有遮挡/截断——彻底从容器中拿出来
- 「已删除」点击改为打开 fixed 全屏遮罩模态(与建议弹窗/待处理复核同款样式):
  标题带当前卡片语言,弹层内提供清空与逐词恢复,遮罩点击或 ✕ 关闭
- 清空成功后自动关闭模态;外点关闭逻辑只保留已暂停气泡,删除 deletedPopoverRef
- 根因:matrixCellState 每次调用都全量过滤排名快照,矩阵渲染要读 行×列 格,
  一次勾选触发整页重渲染就是 O(行×列×快照数)(快照上万后明显卡顿)
- matrix.ts 新增 buildCellIndex:快照 → (keyword, storefront) → cell 一次性预计算,
  查询 O(1);matrixRowGroups 改收 CellLookup(与 matrixCellState 结果一致,有单测)
- KeywordsPage 全部重渲染热点 memo 化:tracked/trackedActive/已暂停/待处理/已删除/
  商店列/行分组/趋势图数据/分布数据,依赖均为 store 引用或卡片语言——
  勾选、切标签只重渲染行,不再重扫快照
- tests/matrix.test.ts 适配新签名并补 buildCellIndex 一致性断言
全局排查 matrixCellState/rankSnapshots/tasks 的渲染期扫描,三处同款问题修复:

- OverviewContent(总览卡片):父页面十几个异步 state 每次落定都整卡重渲染,
  每次都重跑 overviewRankRows + 分布矩阵(词×店×全量快照)+ 最新快照 reduce。
  快照派生链全部 useMemo 化(置于 early return 之前),格值走 buildCellIndex;
- TaskCenterPage(任务中心):加速模式倒计时每秒 setState 整页重渲染,
  任务筛选/排序链(typeTasks/options/tasks/pending/failed)改为 useMemo,
  只在任务数据或筛选条件变化时重算;
- CopilotPage:每条 run 摘要渲染期全量过滤快照(AI 流式逐 token 重渲染时
  O(runs×快照)/token),改为 useMemo 预构建 runId → 摘要 Map。

排查过无问题的:CompetitorPanel(重活在主进程 IPC,渲染期仅小数组)、
RankCoverageHeatmap(矩阵数据 IPC 存 state,pulse 为局部 state)、发布工作台。
- 勾选 ≥2 个词:趋势图每词一条曲线,取该词当日在这张卡全部商店中的
  最优名次(与在榜判定同口径),按最优名次排序,最多前 6 个(6 色调色板)
- 勾选恰 1 个词:趋势图直接显示该词的逐店曲线(此前勾选不影响趋势图)
- 未勾选:维持原行为(点行选中的词逐店曲线 + 组带)
- 对比模式不画组带:跨店聚合曲线与每店组带语义混杂;数据一次快照扫描
  预计算 (日 × 词) → 最优名次,走已 memo 化的渲染链
- 超出上限时提示「已勾选 N 个词,仅显示最优前 6 个」
@github-actions

Copy link
Copy Markdown

Appilot CLA v1.0 accepted. Thank you for contributing. / Appilot CLA 1.0 已接受,感谢贡献。
Posted by the CLA Assistant Lite bot.

wxy added 6 commits September 18, 2026 21:09
- 第三形态:对比模式的词线是跨店最优口径,原每店组带与其不可比
  (跨店最优是次序统计量、系统性偏低)——改为画同口径带:
  每天对整卡词池各取跨店最优名次,P25–P75 成带
- 带与线同口径后对比有意义:勾选词的曲线出带 = 优于 3/4 的词池;
  带不随勾选变化(整卡词池恒定),勾选只改变哪些线高亮
- 当天不足 GROUP_BAND_MIN_N 个词有数据则该天不画带(connectNulls 连接)
- Y 轴域把带的上缘计入;图例加灰带说明
- 排名分布改按市场组聚合(英文本土 / 华人市场 / 其他市场):英文市场
  4-27% 与非英语市场 65-96% 的进榜率差异此前被混合口径平均掉,
  市场组进榜率条(绿/黄/红分级)一眼暴露「哪组市场失效」;
  逐店明细深链到排名页「分布」页签
- ④竞品与表现卡新增「词池健康」条:活跃词 / 进榜词 / 待复核 / 已删除 /
  采集预算水位,每格深链到对应处理入口(待复核 >0 时呼吸灯提示)
- 排名页页签支持 ?tab=competitor|distribution 深链;总览「去竞品页」
  直达竞品页签;scope=pending / scope=deleted 打开对应弹层后消费参数,
  避免同页参数变化时重复弹出
- 顺带移除分布卡被替换后的 recharts 依赖与旧分桶渲染代码
按第一性原理重排总览:总览 = 状态仪表盘 + 分诊台,回答三个问题
(一切正常吗 / 有什么变化 / 接下来做什么),评估指数降级为副注。

- L0 系统脉搏条:数据截至(新鲜度灯)/ 调度器状态与待执行 / 失败数 /
  采集预算水位,全部可点直达
- L1 分诊区(条件渲染):待复核、数据过期、版本不一致、推广待发布、
  任务失败——每条一行「现象 + 动作按钮」,无异常收起为一行绿字
- ②发布卡顶部加发布管线节点灯:提交 → 文案 → 提审 → 上架,
  done/current/idle 三态,替代文字罗列
- 推广卡(新):最新版本 X 系列发布漏斗(published/ready/planned/skipped
  堆叠条)+ 最近发布时间 + 管理推广深链;补齐总览对推广数据的缺席
- 分布卡加进榜词数 30 天 sparkline(内联 SVG,零新依赖)
- OverviewPage 新增 scheduler.status 轮询与 promotion.list 取数,
  以 props 注入纯展示组件(DSH 宿主可选,缺省安全)
- 布局从「三卡 + 多张全宽卡堆叠」重构为对象仪表盘网格:
  Row A 关键词与市场(3/5) | 竞品(2/5);Row B 开发(3/5) | 版本与发布(2/5,原②③合并同列);推广全宽
- 竞品卡压缩:四格状态 tile(跟踪竞品/占优商店/优势词/劣势词)为主视觉,
  竞争指数五格(新上榜/跌出/停滞等评估性指标)降级为 title 副注;
  TOP3 竞品与优势/劣势词 chips 压缩保留
- 关键词与市场卡:表现三格 + 进榜词数 sparkline + 市场组进榜率条
  (可点击展开逐店明细)+ TOP3 词走势 sparkline(跨店最优,30 天)+ 词池健康条
- StageCard 的 step 徽标改为可选:对象卡不再是流程步骤编号
- 移除被替换的旧分布卡与竞品概况块(recharts 依赖一并清掉)
- 根因:右列(版本与发布)叠了两张 h-full 的 StageCard,网格等高拉伸时
  各卡取行高 100%,第二张(上架卡)整体下坠压到推广卡,并产生大片留白
- Row A/B 网格加 items-start:卡片按内容自然高度顶对齐,不再拉伸填充
- 关键词与市场卡减负:「逐店明细」并入卡头、内部间距收紧、TOP 词走势缩小
- 推广卡瘦身(内边距与行距收紧)
- L1 分诊区移除「推广待发布」横条:信号并入推广卡卡头(ready > 0 时
  呼吸灯徽标 + N 条待发布),不再为一句话占一整条
- 关键词与市场卡内部双栏化:左栏 = 表现三格 + 进榜词数 sparkline + 词池
  健康,右栏 = 市场组进榜率条(可展开逐店),卡高约减半
- 删除 TOP3 词走势:头部词排名天然稳定,无趋势可读(用户判断正确)
- 开发卡:移除 GitHub ↗ 按钮与分支/仓库 URL 行(身份卡已有路径),
  热力图限宽 max-w-md 居中不再霸占卡宽
- L0 系统脉搏 chips 并入开发卡底部(原顶部独立横条取消),空间与
  工程状态合流
@wxy wxy changed the title keywords: 304 复审后续修复、渲染性能优化 + 多词趋势对比 feat: 排名页多词对比与渲染性能、总览对象仪表盘重构(关键词/竞品/版本/推广) Sep 19, 2026
@wxy
wxy merged commit e162a9b into master Sep 19, 2026
4 checks passed
@github-actions github-actions Bot locked and limited conversation to collaborators Sep 19, 2026
@wxy
wxy deleted the feat/keywords-multi-trend-compare branch September 22, 2026 07:51
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant