修改完成
This commit is contained in:
@@ -0,0 +1,50 @@
|
||||
# 全活动页面业务所有权与成熟度收敛设计
|
||||
|
||||
## 目标
|
||||
|
||||
在不接业务接口、不改变现有浅色国风视觉体系的前提下,把 52 个活动路由从“视觉覆盖稿”收敛为可独立理解、可本地操作、可扩容的 H5 产品候选。共享组件只负责背景、页头、按钮、弹窗、提示和加载等视觉原语;每个业务页面必须自己拥有字段、内容结构、状态语义、入口与下一步。
|
||||
|
||||
## 已确认根因
|
||||
|
||||
`components/ModulePage.vue` 与 `data/page-catalog.js` 当前同时拥有 F/R/N/M 23 个路由的业务结构和交互。不同任务只替换标题、字段数组或模板类型,造成动态详情、谱文、相册、贺礼、礼仪、成长日志、消息详情、个人资料、安全、帮助、反馈、推广、订单和关于页共享同一套“查看详情/提交后成功”行为。历史规划已经把它定义为第一版覆盖工具而非最终视觉答案,因此用户对同质化的怀疑成立。
|
||||
|
||||
## 五方案比较
|
||||
|
||||
1. **继续沿用单一 `ModulePage`**:改动最少,但业务含义继续由模板猜测,不能成为成熟产品,淘汰。
|
||||
2. **扩大 `pageCatalog` 配置协议**:可补字段类型和动作,但会把页面逻辑继续集中到一个巨型解释器,配置与运行时容易分叉,淘汰。
|
||||
3. **按 form/list/detail/timeline/settings 拆五个业务组件**:比单一母版清晰,但“同样是表单”不代表个人资料、密码、礼仪和反馈拥有相同验证与状态,仅作为视觉结构参考。
|
||||
4. **每页复制完整视觉与业务代码**:业务独立但重复背景、页头、按钮和状态样式,后续全局调整风险过高,淘汰。
|
||||
5. **共享视觉原语、页面拥有业务(最优)**:活动路由不再委托 `ModulePage` 或 `pageCatalog`;每页直接声明真实本地数据、字段类型、状态和动作,只复用 `ModulePageBackground`、`PageHeader`、`AppButton`、`AppDialog`、`AppToast`、`AppLoading` 等稳定视觉原语与公共样式。
|
||||
|
||||
## 所有权边界
|
||||
|
||||
- 页面拥有:业务文案、字段与输入类型、列表项目结构、空/加载/失败/权限/失效/成功状态、校验、确认动作、入口和返回目标。
|
||||
- 公共组件拥有:模块长背景、顶部/底部导航、按钮表面、卷轴弹窗、Toast、Loading、稳定卡片皮肤映射。
|
||||
- `ModulePage.vue` 与 `page-catalog.js` 不再是活动路由入口;为遵守现有文件保留要求,文件保留为封存历史实现,并由合同禁止活动页面引用。
|
||||
- 不接 `utils/api.js`;页面使用真实语义的本地 mock 数据与查询参数状态,接口阶段替换数据源而不重写视觉结构。
|
||||
|
||||
## 分模块业务内容
|
||||
|
||||
- F:动态详情/评论、谱文列表与详情、相册列表必须各自拥有内容和动作;编辑、上传与待开放页沿用现有独立实现。
|
||||
- R:贺礼、礼仪、成长日志、人生事、备忘、功德分别拥有对应金额/关系/时间/地点/人物/提醒/贡献字段,不再是通用卡片换标题。
|
||||
- N:消息详情拥有消息类型、时间、正文、已读与业务去向。
|
||||
- M:资料、安全、改密、改手机、帮助、反馈、推广、订单、关于分别拥有正确控件、校验、确认与状态。
|
||||
- A/G/T:保留现有独立页面,重点复核共享组件边界、长数据、长文本、状态与导航,不为了统一而退回母版。
|
||||
|
||||
## 数据驱动与视觉规则
|
||||
|
||||
- 普通内容由文档流自然撑高;列表使用数组渲染,不写死项目数。
|
||||
- 文字允许换行;只有真实媒体缩略图、图标和结构画布可精确裁切。
|
||||
- 表单使用与语义匹配的 `input` 类型和 `textarea auto-height`;长列表末项必须可达。
|
||||
- 四档 H5:320×568、360×640、360×800、412×915;压力覆盖 1/10/50 条、三倍长文案和 1.3 倍字号模拟。
|
||||
- 视觉继续使用仓库现有真实位图资产,不新增 CSS 伪装饰、占位资产或手绘 SVG。
|
||||
|
||||
## 验收
|
||||
|
||||
1. 52 个活动路由均能被 Vite 转换并通过静态资产、定位、数据容量合同。
|
||||
2. 活动页面对 `ModulePage` 的引用为 0;页面目录不再是活动业务合同。
|
||||
3. 每个替换页至少有一个页面专属合同,验证核心字段、状态、动作、路由和禁止项。
|
||||
4. 四档运行 smoke 无横向溢出,长内容不裁切,主动作和末项可达。
|
||||
5. 代表页面与同模块长期参考图同尺寸比较;视觉自审不能替用户的最终 `[x]`,但代码与候选状态必须完整记录。
|
||||
6. 不宣称接口、Android/HBuilderX、系统字体缩放或真实系统权限完成。
|
||||
|
||||
@@ -0,0 +1,72 @@
|
||||
# 全项目数据驱动布局审核设计
|
||||
|
||||
> 日期:2026-07-20
|
||||
> 阶段:H5 视觉与布局韧性,不接接口,不宣称 Android 完成
|
||||
> 约束:不使用多代理或 worktree,不执行 Git 写操作,不删除源码、测试、文档、长期截图或实际资产
|
||||
|
||||
## 目标
|
||||
|
||||
在全项目文档流迁移完成后,再以真实数据增长为前提审核 `pages/`、`components/`、52 条活动路由及封存 A06。当前 Mock 数量或短文案能显示正常,不再视为数据驱动布局通过。
|
||||
|
||||
审核必须证明:列表、卡片、表单、弹层、相册、世系树和共享组件能够由数据数量、文案长度和字号自然驱动;固定尺寸只用于图标、媒体比例、明确的装饰槽位和视口级导航等稳定视觉边界。
|
||||
|
||||
## 压力基线
|
||||
|
||||
- 列表: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。
|
||||
|
||||
## 审核分类
|
||||
|
||||
1. 普通页面和共享卡片:检查固定 `height`、固定 grid 行、`overflow: hidden`、单行截断、不可换行和固定项目数量假设。
|
||||
2. 列表和目录:检查数据增加后页面自然增长、末项可达、底部导航避让和滚动所有权。
|
||||
3. 弹层和底部层:检查少量内容自然增长、大量内容达到 `max-height` 后内部滚动、标题和操作区不被挤出。
|
||||
4. 表单和状态页:检查错误文案、长标签、长输入值、键盘前后及成功/失败信息自然撑高。
|
||||
5. 媒体网格:检查项目数量改变、长说明、失败状态和当前项标识;媒体缩略图可保留稳定 `aspect-ratio`。
|
||||
6. 世系树:检查画布宽高、世代轨道、节点坐标和关系线是否由数据边界推导;不允许固定 `900rpx` 或固定 180×180 网格成为容量上限。
|
||||
|
||||
## 每项问题的五方案决策
|
||||
|
||||
每个确认问题都必须记录下列五种候选方案,并按该问题的内容类型选择最优方案,不机械套用同一种 CSS:
|
||||
|
||||
1. **扩大固定尺寸**:改动最小,但只是推迟溢出,默认淘汰。
|
||||
2. **增加尺寸断点**:适合设备差异,不解决未知数据量,通常只作补充。
|
||||
3. **容器限高并滚动**:适合弹层、独立列表和全屏画布;普通卡片不使用。
|
||||
4. **正常文档流自然撑高**:适合正文、表单、状态卡、普通列表卡和长文案;为普通内容首选。
|
||||
5. **由数据计算布局边界**:适合世系树、媒体网格、可变列数和结构化关系;由数据推导行列、画布和连接关系。
|
||||
|
||||
选择顺序:普通内容优先方案 4;独立滚动容器优先方案 3;结构化画布优先方案 5。方案 1 不作为最终修复,方案 2 只处理确实由视口造成的差异。
|
||||
|
||||
## 实施规则
|
||||
|
||||
- 先建立全局静态容量合同,列出风险选择器,但对白名单视觉边界做精确说明,不能简单禁止所有固定尺寸。
|
||||
- 每个确认问题先添加最小失败测试并看到预期 RED,再修改源码。
|
||||
- 卡片默认使用 `min-height` 和自然撑高;文本默认允许换行。只有同时存在完整值查看路径、非关键摘要语义和明确空间边界时才允许省略号。
|
||||
- 页面主列表使用正常文档流;弹层列表、固定导航下的独立区域和世系画布可以拥有明确滚动容器。
|
||||
- 背景图使用 `background`、九宫格或稳定比例承载装饰,不让装饰图高度决定正文容量。
|
||||
- 不改变接口、路由、业务状态含义、当前视觉资产和用户已确认的色彩/字体/装饰语言。
|
||||
|
||||
## 验证与证据
|
||||
|
||||
1. 静态容量合同为零未解释风险。
|
||||
2. 每类页面运行压力数据 smoke,检查横向溢出、内容裁切、末项可达、滚动所有权和操作区可达。
|
||||
3. 使用唯一 5173/9222 Chrome 项目页,在四档尺寸获取当前审核运行的新截图。
|
||||
4. 修改后再次获取同状态、同尺寸截图;将修改前后放入同一比较图检查可见变化。
|
||||
5. 自动化与截图只能证明候选稳定,不能代替用户视觉确认或新增 `[x]`。
|
||||
|
||||
## 已知首轮风险
|
||||
|
||||
- T01 使用固定 `900rpx` 画布、固定 180×180 网格及固定世代轨道行高,属于高风险。
|
||||
- G05 使用百分比固定行轨道和局部固定行高,长文案可能挤压。
|
||||
- G06 结果卡在可增长内容上保留 `overflow: hidden`,存在裁切风险。
|
||||
- T07 成员卡固定高度,姓名和成员信息强制单行省略,存在长数据风险。
|
||||
- 共享 `GenealogyCard` 的谱名、元信息、角色与更新时间多处不换行,存在真实数据截断风险。
|
||||
- G01 切换家谱弹层已验证 2/6/12 条可增长与滚动,是可复用的弹层容量参考。
|
||||
|
||||
## 完成边界
|
||||
|
||||
本轮完成只表示 H5 数据容量候选通过源码合同、压力运行和同尺寸视觉回归。A06 封存路由只做静态检查;Android/HBuilderX、系统键盘、真实接口数据和设备级字体缩放仍需后续单独验证。既有 `foundation-asset-audit` 与 `repository-handoff-size-contract` 失败不得通过放宽阈值或删除长期资料处理。
|
||||
@@ -6,7 +6,11 @@
|
||||
|
||||
## 当前证据
|
||||
|
||||
只读审计发现 37 个 Vue 文件包含 `position: absolute|fixed|sticky`。用法混合了正常内容、装饰图层、页面背景、Tabbar、世系关系线和真实弹层,不能机械删除。R02 已证明普通文字、字段标签和输入框也被定位到装饰图之上,系统字体、长文案、键盘或尺寸变化时存在重叠风险。
|
||||
旧只读审计只发现 37 个 Vue 文件包含 `position: absolute|fixed|sticky`,漏掉了普通容器上的 `relative`,因此旧“剩余 112 条”无效。2026-07-20 扩展合同后,新口径发现 35 个文件存在 390 条未白名单 `position` 声明,其中 278 条为 `relative`;F10 一页即有 6 条无意义 `relative`。用法混合了正常内容、装饰图层、页面背景、Tabbar、世系关系线和真实弹层,不能机械删除。R02 已证明普通文字、字段标签和输入框也被定位到装饰图之上,系统字体、长文案、键盘或尺寸变化时存在重叠风险。
|
||||
|
||||
## 执行状态
|
||||
|
||||
2026-07-20 已按本设计完成全项目源码迁移。合同从上述 390 条未白名单声明收敛为零,并增加失效白名单检查,保证白名单与源码实际定位逐项对应。迁移覆盖共享组件、R/N/M/F/G/T/A 页面及封存 A06;普通内容改用正常文档流、flex、grid 或 grid 同单元叠放,只有本设计列出的明确职责保留定位。H5 同尺寸回归未发现语义性可见变化,但这不替代用户确认;本次不新增视觉 `[x]`,不宣称 Android 或接口完成。
|
||||
|
||||
## 单一合同
|
||||
|
||||
@@ -20,12 +24,13 @@
|
||||
|
||||
## 迁移顺序
|
||||
|
||||
1. 建立合同、精确白名单和 37 文件初始清单,测试先失败并输出全部违规位置。
|
||||
2. R02 作为第一张页面样板:人物题签、档案卡、表单、状态卡全部改为背景 + flex/grid 文档流。
|
||||
3. 迁移共享控件:AppButton、PageHeader、AppTabbar、ModulePageBackground、GenealogyPageBackground、GenealogyCard;PageHeader 与 AppTabbar 保留用户指定的 fixed 白名单,清除其内部普通内容和装饰定位;弹层组件保留白名单定位。
|
||||
4. 迁移 `ModulePage`,让普通 F/R/N/M 页面共享文档流结构。
|
||||
5. 按 R → N → M → F → G → T → A 迁移专属页面;A06 源码也纳入静态合同。
|
||||
6. 每批执行聚焦合同、现有交互 smoke、四档响应式、真实截图和 `git diff --check`。
|
||||
1. 建立扫描全部 `position` 的合同和精确白名单,以 35 文件/390 条未白名单声明作为新初始基线;测试先失败并输出全部违规位置。
|
||||
2. F10 先移除页面根容器、Header/Content、正文和卡片的 6 条无意义 `relative`,作为新口径最小返工样板。
|
||||
3. T01 随后迁移世代栏与成员节点;节点正文使用 grid/flex,关系线只保留经审计的局部绘制职责。
|
||||
4. 复核 R02 样板并迁移共享控件:AppButton、PageHeader、AppTabbar、ModulePageBackground、GenealogyPageBackground、GenealogyCard;PageHeader 与 AppTabbar 保留用户指定的 fixed 白名单,清除其内部普通内容定位;弹层组件保留白名单定位。
|
||||
5. 迁移 `ModulePage`,让普通 F/R/N/M 页面共享文档流结构。
|
||||
6. 按 R → N → M → F → G → T → A 迁移其余专属页面;A06 源码也纳入静态合同。
|
||||
7. 每批执行聚焦合同、现有交互 smoke、四档响应式、真实截图和 `git diff --check`。
|
||||
|
||||
## 冻结页
|
||||
|
||||
@@ -33,7 +38,7 @@
|
||||
|
||||
## 验收门槛
|
||||
|
||||
- 全项目合同最终为零违规,白名单只含固定顶部/底部导航和真实弹层。
|
||||
- 全项目合同最终为零未白名单违规;白名单只含固定顶部/底部导航、独立视口背景、真实弹层/Toast/遮罩/底部弹层/全屏预览,以及经审计确有必要的局部装饰、角标和关系线。
|
||||
- 52 条活动路由和封存 A06 源码均被扫描。
|
||||
- 四档固定为 320×568、360×640、360×800、412×915。
|
||||
- 长文案、约 1.3 倍字号、输入校验和键盘场景不重叠,操作区可滚动到达。
|
||||
|
||||
Reference in New Issue
Block a user