Files
jiapuapp/docs/superpowers/plans/2026-07-20-project-data-driven-layout-audit.md
T
2026-07-21 07:53:08 +08:00

194 lines
9.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 全项目数据驱动布局审核实施计划
> **执行要求:** 使用 `superpowers:executing-plans` 在当前会话逐任务执行。用户明确禁止多代理、worktree 与全部 Git 写操作,因此在已获用户“开始”授权的当前 `main` 工作区内执行,不包含提交步骤。
**目标:** 让 52 条活动路由、共享组件及封存 A06 的布局能够承受数据数量、文案长度和字号增长,同时保留确有必要的固定视觉边界。
**架构:** 新增一个扫描固定容量风险的 PowerShell 合同和精确 JSON 白名单,作为规则单一所有者;新增一个 Chrome CDP 压力脚本,对代表性重复内容注入 1/10/50 条、2~3 倍文案和 1.3 倍字号。普通内容使用自然文档流,弹层使用限高滚动,世系树从数据计算画布边界。
**技术栈:** uni-app Vue 3、SCSS、PowerShell、Node.js、Chrome CDP。
## 全局约束
- 列表验证 1/10/50 条;弹层验证 2/6/12/50 条;相册验证 1/9/30 张。
- 世系树验证 1/5/10 代及单代 1/6/12 人。
- 文案验证正常、2 倍、3 倍;字号验证默认及约 1.3 倍。
- 固定视口为 320×568、360×640、360×800、412×915。
- 不接接口、不新增路由、不改变业务语义、不删除或重绘实际资产。
- 不执行多代理、worktree、git add/commit/push/reset/checkout。
- 每个问题记录五种方案:扩大固定尺寸、增加断点、限高滚动、自然撑高、数据计算边界;按内容类型选择最优方案。
---
### 任务 1:建立全局容量风险合同与审计报告
**文件:**
- 新建:`tests/data-driven-layout-risk-allowlist.json`
- 新建:`tests/data-driven-layout-contract.ps1`
- 新建:`docs/data-driven-layout-audit_2026-07-20.md`
**接口:**
- 合同扫描 `pages/**/*.vue``components/**/*.vue` 的 style 块。
- 风险类型固定为 `fixed-content-height``clipping-overflow``single-line-truncation``fixed-grid-track``fixed-capacity-canvas`
- 白名单项必须包含 `file``selector``risk``reason`,并拒绝失效条目。
- [ ] **步骤 1:编写失败合同**
合同提取选择器和声明,普通内容命中以下条件即失败:固定内容高度、`overflow: hidden``nowrap/ellipsis/line-clamp`、百分比或固定值 grid 行、固定容量 `repeat(N, ...)`
- [ ] **步骤 2:运行合同确认 RED**
运行:
```powershell
powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\tests\data-driven-layout-contract.ps1
```
预期:FAIL,并至少报告 T01、G05、G06、T07、`GenealogyCard` 的已知风险。
- [ ] **步骤 3:逐项分类并写五方案审计表**
审计表每行包含:文件/选择器、真实风险、五个候选方案、最优方案、选择理由、验证用例。装饰背景、媒体比例、图标、固定导航和明确滚动视口才允许加入白名单。
- [ ] **步骤 4:运行白名单失效自测**
临时增加不存在的选择器,确认合同以“失效白名单”失败;随后移除该临时条目。
### 任务 2:共享卡片、目录和普通结果卡自然撑高
**文件:**
- 修改:`components/GenealogyCard.vue`
- 修改:`pages/tree/t07-member-directory.vue`
- 修改:`pages/genealogy/g06-search-genealogies.vue`
- 修改:相关聚焦合同
**接口:**
- 关键姓名、谱名、地区、支系和身份允许换行。
- 卡片使用 `min-height`,不得使用固定 `height` 裁切正文。
- 摘要省略仅在存在同屏完整值或明确详情入口时允许。
- [ ] **步骤 1:扩展聚焦合同并确认 RED**
明确禁止 `.directory-card` 固定高度、`.directory-card__name/.directory-card__meta` 单行截断、`.result-card` 裁切、共享卡关键字段 `nowrap`
- [ ] **步骤 2:记录五方案并选择自然撑高**
对上述普通卡片选择方案 4;方案 1 只延后溢出,方案 2 不解决数据量,方案 3 会制造卡片内滚动,方案 5 对普通文本过度复杂。
- [ ] **步骤 3:最小修改源码**
将固定高度改为 `min-height`,移除正文裁切和关键字段强制单行,使用 `flex-wrap``minmax(0, 1fr)` 和自然行高。
- [ ] **步骤 4:运行聚焦合同和现有 runtime smoke**
预期:聚焦合同、G06、T03—T08 与模块响应式 smoke 全部 PASS。
### 任务 3:G05 百分比轨道改为内容驱动
**文件:**
- 修改:`pages/genealogy/g05-genealogy-overview.vue`
- 修改:`tests/g05-document-flow-contract.ps1`
- 修改:`tests/g05-overview-runtime-smoke.js`
- [ ] **步骤 1:添加长谱名、长来源、长公开说明失败断言**
检查每个内容块 `scrollHeight <= clientHeight + 1` 或容器允许自然增长,操作按钮可达。
- [ ] **步骤 2:运行确认 RED**
预期:百分比固定行导致长内容裁切或重叠。
- [ ] **步骤 3:比较五方案并选择自然撑高**
普通概览正文选择方案 4;保留真实背景比例,但让内容层以 `auto/minmax` 和自然间距排列。
- [ ] **步骤 4:修改并验证**
移除正文百分比行轨道和固定详情行高,改为内容驱动 grid/flex;运行 G05 静态、运行时与四档压力检查。
### 任务 4:T01 世系树由数据计算画布
**文件:**
- 修改:`pages/tree/t01-tree-overview.vue`
- 修改:`tests/t01-tree-state-contract.ps1`
- 修改:`tests/t01-tree-state-runtime-smoke.js`
**接口:**
- `layoutMembers`:从成员的世代和同代顺序生成 grid 行列。
- `treeCanvasStyle`:根据最大列、最大行、节点尺寸和间距返回动态 `gridTemplateColumns``gridTemplateRows``width``height`
- `generationRows`:从实际成员世代分组生成,不维护固定轨道行高数组。
- [ ] **步骤 1:写动态 10 代/单代 12 人失败测试**
断言所有节点处于画布边界内、世代标签与对应节点纵向相交、画布可横纵滚动、节点正文不使用定位。
- [ ] **步骤 2:运行确认 RED**
预期:固定 `900rpx`、180×180 网格和固定世代轨道无法满足压力数据。
- [ ] **步骤 3:比较五方案并选择数据计算边界**
选择方案 5;方案 3 仅解决滚动而不解决画布容量,方案 4 无法表达关系图坐标,方案 1/2 仍有硬上限。
- [ ] **步骤 4:实现动态布局并验证**
用 computed 数据推导画布、节点和世代轨道;保留关系线局部绘制白名单。运行 T01 静态、全状态、运行时和定位合同。
### 任务 5:其余页面全量风险清零
**文件:**
- 修改:任务 1 合同报告的其余 `pages/**/*.vue``components/**/*.vue`
- 修改:对应聚焦测试
- [ ] **步骤 1:按风险类型逐项写 RED**
每次只处理一个选择器;普通正文优先方案 4,弹层列表优先方案 3,媒体网格优先方案 5 或稳定 `aspect-ratio` 白名单。
- [ ] **步骤 2:逐项实现最小修改**
不得顺手重构相邻代码;每行修改必须对应审计表中的风险和选择方案。
- [ ] **步骤 3:全局合同归零**
运行容量合同,预期零未白名单风险、零失效白名单。
### 任务 6:全项目压力运行和二次视觉审核
**文件:**
- 新建:`tests/data-driven-layout-runtime-smoke.js`
- 修改:`scripts/capture-chrome-page.js`(只在需要新增审计动作时)
- 修改:三份交接/验收文档与本计划
**运行接口:**
- 对代表性重复项选择器复制到 10/50 条或 9/30 项。
- 对关键文本替换为 2~3 倍真实中文长文案。
- 对页面根设置 1.3 倍字号压力类,不改变生产默认字号。
- 输出只写 `%TEMP%\jiapuapp-runtime\data-driven-layout-audit`
- [ ] **步骤 1:编写压力脚本并确认在未修页面 RED**
检查横向溢出、正文裁切、末项可达、弹层滚动、按钮可达和树节点边界。
- [ ] **步骤 2:运行四档全量压力 smoke**
预期:所有配置用例 PASS,且 9222 仍只有一个项目页面。
- [ ] **步骤 3:捕获并检查代表性截图**
至少覆盖共享卡、普通列表、弹层、G05、T01、T07、媒体网格;每张截图必须实际打开检查。
- [ ] **步骤 4:修改后再审核一次**
把修改前后同状态同尺寸图放入同一比较图,检查裁切、边距、字体、边框、圆角和装饰资产;发现问题回到对应任务继续 RED/GREEN。
- [ ] **步骤 5:最终验证与交接**
运行容量合同、定位合同、全部相关静态合同、关键 runtime smoke、`git diff --check`,确认 `docs/design/screens/runtime/` 不存在;不运行会恢复该目录的旧脚本。文档明确自动审核不等于用户新增 `[x]` 或 Android 完成。
## 2026-07-20 执行记录
- 任务 1—5 已完成:容量合同覆盖固定内容高度、裁切、单行截断、固定 grid 行和大固定画布;最终为零未解释风险、零失效白名单。
- TDD 记录已形成:共享卡/T07/G06、G05、T01、G08/G09/G11/G12 均先看到聚焦 RED,再完成最小实现和 GREEN。
- 任务 6 已完成 H5 自动化与二次目视审核:四档视口、50 条列表/弹层、30 项媒体、10×12 世系树、长文案和 1.3 倍字号模拟通过。
- 当前停点为用户视觉复核。所有有可见变化的旧 `[x]` 只能视为候选;用户再次明确“通过”前,不维护或新增验收勾选。