完成40%

This commit is contained in:
rain
2026-07-14 17:36:39 +08:00
parent 1015e60ff7
commit 8c98936da5
151 changed files with 5132 additions and 351 deletions
@@ -0,0 +1,73 @@
# 页面与状态合并审计
> 审计日期:2026-07-14
> 结论状态:G02→G01、G04→G03 已获用户授权并完成实施;其余四项仍是待实施建议。
## 1. 审计范围与证据
- 审计时 `pages.json` 实际登记 58 条路由;用户确认后已依序删除 G02、G04、G07 独立路由,当前由 `tests/full-page-visual-contract.ps1` 约束为 **55 条路由**
- G02 原先替换的是 `pages/genealogy/g02-empty-genealogies` 通用壳;该路由与 G01 的空态重复,现已收敛为 G01 的 `?state=empty`,不再进入独立页面验收。
- 已在本轮重新捕获并审视 A01、A02、A04、A05、A06、G01 的 360×800 真实运行图:`screens/runtime/2026-07-14/route-audit/accepted-route-audit-360x800.png`
- G01 源码在 `hasGenealogies``v-else` 分支拥有“新建家谱/搜索并申请加入”两条动作;现已由 `forceEmptyState` 统一所有权。默认态前后对比为 `screens/runtime/2026-07-14/G01-default-before-after-360x800.png`,空状态为 `G01-empty-after-360x800.png``G01-empty-after-412x915.png`,均已获用户审美确认。
- 其余 40 个仍渲染 `ModulePage` 的路由尚无独立视觉实现;其合并判断依据目前是规划中的任务语义、页面中文用途注释与目录状态,不将通用壳截图误当成最终交互。
## 2. 判断标准
保留独立路由,当用户进入的是不同的主任务、需要独立返回历史、可被深链/通知直接打开,或需要承载未保存的完整表单。
合并为同页状态,当差异仅是加载/空/失败/权限、查询前后、同一表单的步骤,或同一详情内的媒体预览与上传结果。状态由页面数据或查询参数驱动,不另建占位路由。
## 3. 已验收页面复核
| 已验收路由 | 结论 | 理由 |
| --- | --- | --- |
| A01 启动/登录引导 | 保留独立页 | 品牌入口、微信登录、注册入口与协议确认,和登录表单不是同一步。 |
| A02 账号登录 | 保留独立页;现有双 Tab 正确 | 账号密码/短信验证码已经在同页状态切换,无需拆为 A03。 |
| A04 注册账号 | 保留独立页 | 需要完整新用户表单、协议确认与返回链。 |
| A05 重置密码 | 保留独立页 | 手机验证、验证码与两次密码确认是独立安全任务。 |
| A06 登录状态 | 保留一个路由;现有六状态正确 | `normal/failed/restricted/register-pending/wechat-*` 已在同页状态配置中,未为每种错误新增页面。 |
| G01 我的家谱 | 保留根页;合并 G02 | 已具备列表、加载和空态分支,G02 不应是第十二个家谱路由。 |
结论:已验收页面中没有需要为了减少页面而合并的认证页;A02 与 A06 已经是正确的“同页多状态”实现。唯一明确重复的是 G02→G01。
## 4. 全量路由建议
| 模块 | 现有路由/单元 | 保留为独立任务 | 合并为同页状态 | 路由数变化 |
| --- | ---: | --- | --- | ---: |
| 认证 | 5 | A01、A02、A04、A05、A06 | A02 TabA06 六状态均保留在各自页面内部 | 5 → 5 |
| 家谱 | 9 | G01、G03、G05、G06、G08、G09、G10、G11、G12 | 已完成 G07→G06 搜索结果/无结果收敛 | 9 → 9 |
| 世系树 | 8 | T01、T03、T04、T05、T06、T07 | T02→T01 的横屏/空/加载失败状态;T08→T03 的已故/隐私/无权状态 | 8 → 6 |
| 家族内容 | 10 | F01、F02、F03、F04、F05、F06、F07、F08、F10 | F09→F08 的图片预览/上传/失败状态;F03 评论/删除确认和 F10 服务未开放也只作本页状态 | 10 → 9 |
| 人物与礼仪 | 11 | R01--R11 | R02 编辑、R04 新增/详情/删除确认、R07 新建/编辑均已应作为各自路由内部状态 | 11 → 11 |
| 消息 | 2 | N01、N02 | N01 空态、N02 已读均为内部状态 | 2 → 2 |
| 个人中心 | 10 | M01--M10 | M01 登录态、M03 安全态、M09 空订单均为内部状态;M04/M05 保持独立,尤其 M05 符合用户已确认的“安全设置按钮跳转绑定手机号页面” | 10 → 10 |
| **总计** | **55** | | **尚余 3 个重复路由合并** | **55 → 52** |
## 5. 建议的 52 条路由主表
### 合并清单(高置信)
1. 已删除 `G07` 路由;G06 同页管理初始搜索、结果列表与无结果,点选后进入 G08。G06 截图与自动验证已完成,等待用户审美确认。
2. 删除 `T02` 路由;T01 同页管理树正常态、小屏横屏提示、无成员、加载与失败。
3. 删除 `T08` 路由;T03 同页管理正常成员、已故、隐私隐藏、无权限。T07 仅保留目录和搜索结果。
4. 删除 `F09` 路由;F08 同页管理照片墙、预览、选择上传、上传中、失败重试。
### 暂不合并的边界
- 不把 A01/A02、A04/A05、M04/M05 合成万能认证/安全页:这些是不同主任务,且 M05 的独立跳转是用户已确认的产品要求。
- 不把 G08/G09 合并:一次申请表单与“我的全部申请记录”是不同任务和信息密度。
- 不把 T04/T06、F02/F06、R03/R05/R08--R11 合并:对象、数据结构与返回历史不同;可复用表单组件,但不应强行共享一个路由。
- F10 是否并入 F01 的媒体 Tab 不足以从当前规划判断,暂保留 F10 路由;待家族首页信息架构定稿后再评估,不计入 52 的高置信精简。
## 6. 已完成的 G02、G04、G07 收敛
G02 不进入独立视觉验收。用户已授权实施后,独立页面、G02 契约/冒烟测试、专属截图与“等待验收”文档已删除;最终 ImageGen 面板已改名为 `g01-empty-panel.png`,归属 G01 `state=empty`,现已获用户确认。G04 也已删除;其字段、校验与真实保存行为归属 G03 `step=ancestor`,并已获用户继续授权通过。G07 也已删除;公开检索的初始、结果和无结果均归属 G06,结果点选只进入 G08。`tests/g01-empty-state-contract.ps1``tests/g03-create-flow-contract.ps1``tests/g06-search-flow-contract.ps1` 与对应 Chrome 冒烟测试保护三条收敛链路;G01 默认态前后对比和 G06 前后对比证明已验收状态没有可见回退,G06 本身仍待用户审美确认。
## 7. 推荐执行顺序(G06 三态等待审美确认)
1. G02→G01、G04→G03、G07→G06 已完成,路由总数已从 58 变为 55;G01 两种状态与 G03 双步骤已获用户确认,G06 三态等待审美确认。
2. 用户已授权连续推进;下一项实施 T02→T01,路由数变为 54。
3. 在世系树完成 T01、T03 的独立设计时同步吸收 T02、T08,不先为状态壳单独生成资产。
4. 在相册 F08 设计时同步吸收 F09;其余模块按“先任务页、后状态”推进。
除已获用户确认的 G02→G01 外,未经用户确认,本审计不改动其余路由、已验收页面或现有未提交内容。
@@ -1,6 +1,6 @@
# A-01 启动 / 登录引导设计记录
> 状态:A-01 文字注册入口方案、四尺寸静态验收、本地 UI 与 412 × 915 运行时视觉基准已完成并获用户验收;A-02 双标签本地 UI 已完成协议页去向、A-03 至 A-06 的设计、认证接口与 Android 全尺寸回归验收仍未完成,D2 继续进行中。
> 状态:A-01 文字注册入口方案、四尺寸静态验收、本地 UI 与 412 × 915 运行时视觉基准已完成并获用户验收;A-02 双标签本地 UI 已完成并获用户验收。A-03 已删除;协议页去向、A-04 至 A-06 的设计、认证接口与 Android 全尺寸回归验收仍未完成,D2 继续进行中。
>
> 本页设计事实的唯一归档位置为本文件。旧的 `2026-07-13-a01-login-guide-design.md` 与 `2026-07-13-a01-login-guide.md` 仅保留为失效历史,不可作为实现或推进下一页的依据。
@@ -18,7 +18,7 @@
- 标题区保留“家谱 / 为家族留存可传承的记忆”,使用美术锚点中的朱砂家祠红头、暖宣纸、古金云纹、墨褐文字与淡墨建筑/竹影层次。
- 操作区只保留两个大按钮和一个文字入口:朱砂主按钮“登录”、古金描边按钮“微信登录”,以及其下方的“还没有账号?注册账号”。“注册账号”仅为朱砂红可点击文字,不再作为独立大按钮。
- 入口顺序:登录为主入口;微信登录为次入口;注册账号为辅助文字入口。
- 已勾选协议后,“登录”前往 `A-02`,且 `A-02` 内固定使用“账号密码登录 / 手机验证码登录”双标签切换,默认显示账号密码登录。微信授权中、取消失败回跳状态仍`A-03`,在 A-03 设计完成前当前入口提示“微信登录功能准备中”。
- 已勾选协议后,“登录”前往 `A-02`,且 `A-02` 内固定使用“账号密码登录 / 手机验证码登录”双标签切换,默认显示账号密码登录。微信授权取消失败与受限状态以后`A-06`当前入口继续提示“微信登录功能准备中”,不新增真实授权跳转
- 注册账号入口仍归 `A-04`;忘记密码仍归 `A-05`。这两页完成设计前,当前入口只提示页面准备中,不伪造跳转。
- 协议必须为用户主动勾选:初始未勾选,可分别打开《家谱用户协议》和《隐私政策》。不得使用“登录即表示同意”或任何默认同意文案;未勾选时登录操作应明确提示用户先确认协议。
@@ -26,7 +26,7 @@
- 页面采用纵向滚动;`320 × 568` 下两个按钮、注册文字和协议行可以滚动,但任一按钮文字、注册文字、协议行和底部内容不得被系统导航区遮挡。
- A-01 的登录与微信功能图标均需采用独立本地透明 PNG;微信标志只使用官方或许可来源的原色透明 PNG,不自行重绘或改色。账号密码与手机号验证码的表单图标归 A-02 设计时确定。
- A-01 只设计欢迎、入口与协议未勾选提示。账号密码与手机号验证码表单均归 `A-02`,微信授权结果归 `A-03`,注册归 `A-04`,忘记密码归 `A-05`
- A-01 只设计欢迎、入口与协议未勾选提示。账号密码与手机号验证码表单均归 `A-02`,微信授权取消、失败与受限结果归 `A-06`,注册归 `A-04`,忘记密码归 `A-05`绑定手机号以后归个人中心安全设置。
- A-01 正常态必须展示两个按钮、注册文字入口和未勾选协议;点击任一需要授权的入口但未勾选协议时,仅提示“请先阅读并同意相关协议”,不视为用户已同意。
- 页面根容器宽度必须为 100%,不可写死为 `750rpx` 或使用整张效果图。固定设计画布仍以 `750rpx` 为测量基准,运行时由真实 DOM 按当前屏宽响应式还原。
#### 412 × 915 运行时校准表
@@ -52,7 +52,7 @@
| 初始未勾选 | 首次进入 | 两个按钮、注册文字与空复选框 | 留在 A-01 |
| 未同意协议 | 点击登录、微信登录或注册账号 | 提示“请先阅读并同意相关协议”,不跳转、不改变勾选状态 | 留在 A-01 |
| 登录已确认协议 | 点击“登录” | 结束 A-01 引导 | A-02,默认账号密码登录标签 |
| 微信已确认协议 | 点击“微信登录” | 提示“微信登录功能准备中” | 留在 A-01,等待 A-03 设计完成 |
| 微信已确认协议 | 点击“微信登录” | 提示“微信登录功能准备中” | 留在 A-01;真实授权取消、失败与受限状态以后归 A-06 |
| 注册已确认协议 | 点击“注册账号”文字 | 提示“注册页面准备中” | 留在 A-01,等待 A-04 设计完成 |
### A-01 资产清单
@@ -73,10 +73,10 @@
- 此结论只验证设计稿与固定栅格,不替代 uni-app 页面实现后的 Android 运行时验收。
- 2026-07-13 用户已验收当前连续背景、完整按钮边框与单行协议区的 `412 × 915` 运行截图,A-01 当前视觉基准标记为完成;本轮不再授权继续微调视觉细节。
- 页面实现阶段仍须按本记录在 Android 实机或同等运行环境复核四个尺寸的安全区、滚动与文字折行。
- A-01 的协议最终页面去向及 A-03 至 A-06 的设计仍未完成;这些后续范围不影响当前 A-01 视觉基准的验收结论。
- A-01 的协议最终页面去向及 A-04 至 A-06 的设计仍未完成;A-03 已删除。这些后续范围不影响当前 A-01 视觉基准的验收结论。
## 5. 推进约束
- `A-01``A-02` 的本地 UI 已按本记录及实现合同落地A-02 的最终效果稿与 Android 运行时验收仍待补齐,不能据此推进 A-03
- `A-01``A-02` 的本地 UI 已按本记录及实现合同落地并获用户视觉验收;A-03 已删除,后续仅在 A04--A06 获得明确授权后推进
- 当前 A-01 视觉基准已完成;后续只在协议页面、认证接口或新页面范围获得明确授权后继续推进。
- 用户已于 2026-07-13 授权落地 A-01 欢迎入口与 A-02 双标签登录页的本地 UI;仍不接接口、不执行真实登录、不改 Android 打包配置。实现细节的唯一所有者见 `docs/superpowers/specs/2026-07-13-a01-a02-static-ui-implementation-design.md`
+25 -7
View File
@@ -1,18 +1,20 @@
# A02 账号登录设计记录
> 状态:实现与运行时截图已完成,等待用户视觉验收。
> 路由:`pages/auth/a02-login?agreed=1`
> 状态:已于 2026-07-14 获用户视觉验收,A02 可见效果冻结。
> 路由:`pages/auth/a02-login`A01 已确认协议进入时附带 `?agreed=1`
> 视觉来源:已验收的 A01 启动/登录引导与 G01 我的家谱。
## 1. 页面任务
已确认协议的用户在“账号密码登录”与“手机验证码登录”之间切换并进入家谱。页面只保留本地字段校验、A05 忘记密码跳转与待接入 toast;不新增真实账号、短信、微信或后端逻辑。
让用户在“账号密码登录”与“手机验证码登录”之间切换并进入家谱。A02 自己提供协议确认:直接进入默认未同意,A01 已确认协议进入时默认已同意;没有账号的新用户可从协议行下方进入既有 A04 注册路由。页面只保留本地字段校验、A04 注册跳转、A05 忘记密码跳转与待接入 toast;不新增真实账号、短信、微信或后端逻辑。
手机号验证码登录只由 A02 的“手机验证码登录”Tab 承接;重复的 A03 页面已于 2026-07-14 删除。绑定手机号以后属于个人中心安全设置,微信授权取消、失败与受限状态以后属于 A06。
## 2. 视觉结构
1. 使用与 A01 同高度的朱砂祠堂头和居中谱印,保证认证入口属于同一品牌场景。
2. 头部下方放置一张完整不透明的卷轴认证面板,而不是普通 CSS 矩形卡;标题、双 Tab、输入、辅助链接和按钮文字都是可编辑的 Vue 内容层。
3. 面板上部承载任务标题和双 Tab,中部承载两行输入与辅助操作,下部留给原比例朱砂按钮、协议提示与淡墨山水收束。
3. 面板上部承载任务标题和双 Tab,中部承载两行输入与辅助操作,下部留给原比例朱砂按钮、可点击协议确认行、轻量文字注册入口与淡墨山水收束。
4. 主按钮继续复用 A01 的 `a01-primary-button.png`,显示槽高度为 128rpx;不把约 4.49:1 的皮肤压进旧的 100rpx 矮按钮。
5. 背景山水只出现在认证面板之外和面板底部,保证输入、标签与占位文本的对比度。
@@ -25,6 +27,8 @@
| `static/assets/modules/auth/opaque/a02-login-panel.png` | opaque / 940×1672 | 完整卷轴登录面板,承载纸纹、双金线、角纹、云纹与底部山水;A02 容器 666rpx × 1184rpx。 |
| `static/assets/foundation/opaque/a01-primary-button.png` | opaque / 1877×418 | A02 唯一主操作按钮皮肤,显示槽 128rpx 高。 |
| `static/assets/foundation/transparent/chevron-right.png` | transparent / 96×96 | 返回图标,水平翻转后使用,不再用文字符号或 CSS 圆框。 |
| `static/assets/modules/auth/transparent/a02-agreement-unchecked.png` | transparent / 96×96 | A02 本页未同意协议图标;四角透明,不以 CSS 圆环代替。 |
| `static/assets/modules/auth/transparent/a02-agreement-checked.png` | transparent / 96×96 | A02 本页已同意协议图标;四角透明,不以文字勾号或 CSS 底色代替。 |
认证面板由内置 ImageGen 根据 A01、G01 的已验收截图生成;提示词约束为“完整不透明暖宣纸、双古金线、角纹、边缘淡云竹、中央留给真实控件、无文字无按钮无图标”。生成源保留在 Codex 生成目录,项目运行时只引用上表中的最终资产。
@@ -33,6 +37,9 @@
- 两个 Tab 仍由 `activeTab` 切换;已验证手机验证码 Tab 的真实页面状态。
- 账号、密码、手机号、验证码继续使用原生 `input`,不烘焙到图片。
- A02 不绘制面板或主按钮的 CSS `border``background`;对应完整外观由图片资产承担。
- A02 的 `agreed` 是本页登录提交的唯一协议状态;H5 从当前 `location.hash` 读取 `agreed=1`Android 从当前 uni 页面选项读取,直接进入默认未同意。
- 协议行点击可切换两枚透明图标;未同意提交时在本页提示“请先阅读并同意相关协议”,不再要求返回 A01。协议名称仍沿用“协议页面准备中”提示,不新增协议正文路由。
- 协议行下方显示“还没有账号? 注册账号”;只有朱砂色“注册账号”具有 88rpx 高的文字触点,点击进入既有 `/pages/auth/a04-register`。该入口不依赖协议状态,也不在本轮重做 A04。
- 320 × 568 下可纵向滚动,主按钮位于首屏可达区域;360 × 640、360 × 800、412 × 915 均无横向裁切。
## 5. 运行时证据
@@ -45,11 +52,22 @@
| 改造后,账号密码 Tab360×800 | `screens/runtime/2026-07-13/A02-after-360x800.png` |
| 改造后,账号密码 Tab412×915 | `screens/runtime/2026-07-13/A02-after-412x915.png` |
| 改造后,手机验证码 Tab,360×800 | `screens/runtime/2026-07-13/A02-sms-360x800.png` |
| 本页协议未同意,320×568 | `screens/runtime/2026-07-14/A02-agreement-unchecked-320x568.png` |
| 本页协议未同意,360×640 | `screens/runtime/2026-07-14/A02-agreement-unchecked-360x640.png` |
| 本页协议未同意,360×800 | `screens/runtime/2026-07-14/A02-agreement-unchecked-360x800.png` |
| 本页协议未同意,412×915 | `screens/runtime/2026-07-14/A02-agreement-unchecked-412x915.png` |
| A01 已确认协议进入,360×800 | `screens/runtime/2026-07-14/A02-agreement-checked-360x800.png` |
| 含注册入口、本页协议未同意,360×800 | `screens/runtime/2026-07-14/A02-register-entry-360x800.png` |
| 含注册入口、本页协议未同意,412×915 | `screens/runtime/2026-07-14/A02-register-entry-412x915.png` |
| A03 删除后,手机验证码 Tab360×800 | `screens/runtime/2026-07-14/A02-sms-tab-after-a03-removal-360x800.png` |
## 6. 自动检查
- `tests/a02-asset-alpha-audit.ps1`A02 卷轴面板存在、尺寸稳定、比例稳定、四角不透明。
- `tests/a01-a02-ui-contract.ps1`:A02 使用完整卷轴面板与完整主按钮;保留 Tab、原生输入、A05 跳转;拒绝 CSS 面板和 CSS 主按钮外观。
- `tests/a02-asset-alpha-audit.ps1`A02 卷轴面板稳定;两枚协议图标均为 96×96、带 Alpha、四角透明且包含不透明图形
- `tests/a01-a02-ui-contract.ps1`:A02 使用完整卷轴面板与完整主按钮;协议行、双状态图标、H5/Android 路由初始化和本页提交门禁可审计;保留 Tab、原生输入、A05 跳转;拒绝 CSS 面板、主按钮和协议图标外观。
- `tests/a02-register-entry-contract.ps1`:A02 注册入口的文案、阅读顺序、88rpx 触点、A04 跳转与目标路由均可审计。
- `tests/a03-route-removal-contract.ps1`:A03 页面、路由和临时目录条目均不存在;G02/G04 合并后,56 条最终路由与 A02 的唯一短信入口职责同步收敛。
- `tests/compile-audit.ps1`Vue 结构可编译。
- `tests/capture-chrome-page-contract.ps1`:Chrome 截图在目标 URL、新文档、页面选择器和全部图片资源就绪后再采集,防止复用状态、黑块或半渲染证据。
用户确认前,A02 不得在规划中标记为视觉验收完成,也不得作为其他认证页的最终样板直接复制
用户确认本页视觉结果。后续认证页可参考其已验收的品牌层级与完整位图面板规则,但不得直接复制其登录表单或改变 A02 的可见效果
@@ -0,0 +1,60 @@
# A04 注册账号设计记录
> 状态:用户已于 2026-07-14 视觉验收通过;A04 可见效果冻结。
> 路由:`pages/auth/a04-register`A02 的注册入口与本页“登录”入口构成新用户与已有用户的双向路径。
> 视觉来源:已验收的 A01 启动/登录引导、A02 账号登录与 G01 我的家谱。
## 1. 页面任务
让新用户填写手机号、设置密码、确认密码并在本页主动确认协议。A02 是唯一的账号密码/手机验证码登录页;A04 只处理注册,不重复验证码登录。真实注册、短信、微信、协议正文和后端接口均不在本页实现。
## 2. 视觉结构
1. 复用 A02 的朱砂祠堂头与居中谱印,让注册仍属于同一认证场景。
2. 使用完整不透明 `a02-login-panel.png` 承担卷轴纸纹、双金线、角纹、云纹和底部山水;A04 不绘制 CSS 卡片、边框或按钮表面。
3. 面板标题下使用既有结饰位图建立分隔,随后是三行真实输入、完整朱砂“注册账号”按钮、协议确认行和“已有账号?登录”回流入口;不保留挤压表单的独立引导文案。
4. 360 × 800 与 412 × 915 均完整呈现;较小屏幕保留纵向滚动,不允许横向裁切。
## 3. 资产合同
| 路径 | 属性/原图尺寸 | A04 职责 |
| --- | --- | --- |
| `static/assets/foundation/opaque/auth-page-paper.jpg` | opaque / 750×1334 | 认证页纸纹底色。 |
| `static/assets/foundation/opaque/auth-header.png` | opaque / 750×196 | 朱砂祠堂头。 |
| `static/assets/foundation/transparent/brand-seal.png` | transparent / 240×288 | 头部谱印。 |
| `static/assets/foundation/transparent/auth-divider-knot.png` | transparent / 160×96 | 标题与表单之间的位图结饰分隔。 |
| `static/assets/modules/auth/opaque/a02-login-panel.png` | opaque / 940×1672 | A04 完整卷轴注册面板。 |
| `static/assets/foundation/opaque/a01-primary-button.png` | opaque / 1877×418 | A04 注册主按钮皮肤。 |
| `static/assets/modules/auth/transparent/a02-agreement-unchecked.png` | transparent / 96×96 | 本页未同意协议图标。 |
| `static/assets/modules/auth/transparent/a02-agreement-checked.png` | transparent / 96×96 | 本页已同意协议图标。 |
现有认证资产已完整覆盖本页,未使用 ImageGen,也未新增视觉资产。
## 4. 交互合同
- `phone``password``confirmPassword``agreed` 都是 A04 本页状态;协议初始未同意。
- 点击协议行切换两枚透明图标;点击协议名称仅提示“协议页面准备中”。
- 注册前依次校验协议、11 位手机号、密码非空和两次密码一致;通过后仅提示“注册服务待接入”。
- “已有账号?登录”真实跳转 `/pages/auth/a02-login`Chrome 已验证该 URL。
- A04 已从 `data/page-catalog.js` 移出,不再使用 `ModulePage` 临时母版。
## 5. 运行时证据
| 状态 | 截图 |
| --- | --- |
| 改造前,通用表单壳,360×800 | `screens/runtime/2026-07-14/A04-before-360x800.png` |
| 改造前,通用表单壳,412×915 | `screens/runtime/2026-07-14/A04-before-412x915.png` |
| 改造后,注册初始态,360×800 | `screens/runtime/2026-07-14/A04-after-360x800.png` |
| 改造后,注册初始态,412×915 | `screens/runtime/2026-07-14/A04-after-412x915.png` |
| 平衡修订审视前,360×800 | `screens/runtime/2026-07-14/A04-audit-before-360x800.png` |
| 平衡修订审视前,412×915 | `screens/runtime/2026-07-14/A04-audit-before-412x915.png` |
| 平衡修订后,注册初始态,360×800 | `screens/runtime/2026-07-14/A04-after-balance-360x800.png` |
| 平衡修订后,注册初始态,412×915 | `screens/runtime/2026-07-14/A04-after-balance-412x915.png` |
## 6. 自动检查
- `tests/a04-registration-contract.ps1`:独立页面、完整位图面板/按钮、结饰分隔、长标签留白、三项字段、协议状态、校验、A02 回流和禁止 CSS 伪造均可审计。
- `tests/compile-audit.ps1`:A04 不使用失效目录条目,Vue 文件与现有本地导入可编译。
- `tests/full-page-visual-contract.ps1`:A04 保持最终编号路由;G02/G04 合并后全项目共 56 条路由。
用户已于 2026-07-14 确认本页通过视觉验收;后续可审视 A05,但不得改变 A04 可见效果。
@@ -0,0 +1,57 @@
# A05 重置密码设计记录
> 状态:用户已于 2026-07-14 视觉验收通过;A05 可见效果冻结。
> 路由:`pages/auth/a05-reset-password`A02 的“忘记密码”入口进入本页,本页“返回登录”回到 A02。
## 1. 页面任务与边界
让用户通过已绑定手机号和验证码重设登录密码。A05 使用手机号、验证码、新密码、确认新密码四项本页状态,避免在没有两次确认的情况下覆盖密码。
真实短信、验证码下发、账号校验、密码重设接口和后端数据均不在本页实现。“获取验证码”仅提示“验证码功能待接入”;所有字段有效后仅提示“密码重设服务待接入”。
## 2. 视觉结构
1. 复用 A02/A04 已验收的朱砂祠堂头、谱印、宣纸、淡墨山水和完整卷轴认证面板,使重置密码仍属于同一认证场景。
2. 标题为“重设密码”,副标题说明“验证手机号后重新设置登录密码”,不暴露 A-05 内部编号。
3. 标题和表单之间使用既有结饰位图;正文依次为手机号、验证码(含文字型获取动作)、新密码、确认新密码、完整朱砂主按钮、完成提示与返回登录入口。
4. 面板、按钮、页头和结饰均由既有位图提供;CSS 只处理布局、文字、输入与交互状态,不绘制 CSS 卡片或按钮表面。
## 3. 资产合同
| 路径 | 属性/原图尺寸 | A05 职责 |
| --- | --- | --- |
| `static/assets/foundation/opaque/auth-page-paper.jpg` | opaque / 750×1334 | 认证页纸纹底色。 |
| `static/assets/foundation/transparent/auth-ink-scenery.png` | transparent / 750×1334 | 认证页淡墨叠层。 |
| `static/assets/foundation/opaque/auth-header.png` | opaque / 750×196 | 朱砂祠堂头。 |
| `static/assets/foundation/transparent/brand-seal.png` | transparent / 240×288 | 头部谱印。 |
| `static/assets/modules/auth/opaque/a02-login-panel.png` | opaque / 940×1672 | A05 完整卷轴重设面板。 |
| `static/assets/foundation/opaque/a01-primary-button.png` | opaque / 1877×418 | “确认重设”完整主按钮皮肤。 |
| `static/assets/foundation/transparent/auth-title-cloud.png` | transparent / 200×120 | 标题右侧祥云。 |
| `static/assets/foundation/transparent/auth-divider-knot.png` | transparent / 160×96 | 标题与表单之间的结饰。 |
| `static/assets/foundation/transparent/chevron-right.png` | transparent / 96×96 | 返回动作图标。 |
现有认证资产已完整覆盖本页,未使用 ImageGen,也未新增视觉资产。
## 4. 交互合同
- 空提交先提示“请输入正确手机号”;手机号必须为 11 位,验证码必须为 6 位,密码非空且两次一致。
- 点击“获取验证码”显示“验证码功能待接入”。
- 点击“返回登录”真实跳转 `/pages/auth/a02-login`Chrome 已验证 URL。
- A05 已从 `data/page-catalog.js` 移出,不再使用 `ModulePage` 临时母版。
## 5. 运行时证据
| 状态 | 截图 |
| --- | --- |
| 改造前,通用白卡壳,360×800 | `screens/runtime/2026-07-14/A05-before-360x800.png` |
| 改造前,通用白卡壳,412×915 | `screens/runtime/2026-07-14/A05-before-412x915.png` |
| 改造后,重设密码初始态,360×800 | `screens/runtime/2026-07-14/A05-after-360x800.png` |
| 改造后,重设密码初始态,412×915 | `screens/runtime/2026-07-14/A05-after-412x915.png` |
## 6. 自动检查
- `tests/a05-reset-password-contract.ps1`:独立页面、完整位图面板/按钮、四项字段、验证码动作、校验、A02 回流、目录项移除和禁止 CSS 伪造可审计。
- `tests/compile-audit.ps1`:A05 不使用失效目录条目,Vue 文件与现有本地导入可编译。
- `tests/full-page-visual-contract.ps1`:A05 保持最终编号路由;G02/G04 合并后全项目共 56 条路由。
用户已于 2026-07-14 确认本页通过视觉验收;后续可审视 A06,但不得改变 A05 可见效果。
@@ -0,0 +1,50 @@
# A06 登录状态设计记录
> 状态:用户已于 2026-07-14 视觉验收通过;A06 可见效果冻结。
> 唯一路由:`pages/auth/a06-auth-status`;以 `?status=` 表示当前认证状态,不新建状态页面。
## 1. 页面任务与边界
A06 承接认证流程中不能继续进入家谱的结果:登录未完成、登录失败、账号暂时受限、注册尚未完成、微信授权取消和微信授权失败。
没有接入真实账号状态、客服、申诉、微信授权或后端接口。账号受限的“查看帮助”只显示“账号申诉功能待接入”;注册未完成真实跳转 A04;其余主操作与次操作真实跳转 A02。绑定手机号仍属于后续个人中心安全设置页面,本页不承担该功能。
## 2. 状态合同
| `status` 值 | 标题 | 主操作 | 次操作 |
| --- | --- | --- | --- |
| `normal`(含未知值回退) | 登录未完成 | 返回登录 → A02 | 无 |
| `failed` | 登录失败 | 返回登录 → A02 | 无 |
| `restricted` | 账号暂时受限 | 查看帮助 → 本地提示 | 返回登录 → A02 |
| `register-pending` | 注册尚未完成 | 继续注册 → A04 | 返回登录 → A02 |
| `wechat-cancelled` | 微信授权已取消 | 返回登录 → A02 | 无 |
| `wechat-failed` | 微信授权失败 | 返回登录 → A02 | 无 |
H5 由 `location.hash` 的查询参数读取状态;uni-app 原生端读取当前页 `options`。两端对未知值统一回退 `normal`,避免状态壳无文案或失去下一步。
## 3. 视觉结构与资产
1. 删除通用白卡、CSS 红方徽章和压缩按钮,改为 A02/A04/A05 已验证的“朱砂祠堂头 → 卷轴面板 → 状态说明 → 朱砂操作”的认证节奏。
2. 状态图形只使用已有透明 `auth-login-outline.png`,避免为每种异常绘制夸张警示符号;文案承担状态区别,朱砂只强调标签与主操作。
3. 主操作保持完整 `a01-primary-button.png` 位图比例;受限与注册未完成的次操作为低权重朱砂文字,不与主按钮竞争。
4. 页面壳、面板、按钮、边框、云纹和结饰均由既有位图提供;CSS 只处理布局、文字与点击态。现有资产已完整覆盖需求,因此未调用 ImageGen、未新增资产。
## 4. 运行时审视与证据
| 状态 | 截图 |
| --- | --- |
| 改造前通用壳,360×800 | `screens/runtime/2026-07-14/A06-before-360x800.png` |
| 改造前通用壳,412×915 | `screens/runtime/2026-07-14/A06-before-412x915.png` |
| `normal` 默认态,360×800 | `screens/runtime/2026-07-14/A06-after-360x800.png` |
| `normal` 默认态,412×915 | `screens/runtime/2026-07-14/A06-after-412x915.png` |
| `restricted` 受限态,360×800 | `screens/runtime/2026-07-14/A06-restricted-360x800.png` |
截图审视结论:两个尺寸中,朱砂头图、卷轴框、状态图形、标题/说明、完整主按钮与底部淡墨山水均未被裁切;360×800 的面板底部在首屏内结束,412×915 保留呼吸留白;`restricted` 的次操作保持在主按钮下方且不抢主路径。当前未发现黑块、图片未加载、横向溢出或 CSS 伪造完整表面。
## 5. 自动与交互检查
- `tests/a06-auth-status-contract.ps1`:约束唯一路由、独立页面、六个状态键、状态动作、A02/A04 目标、既有位图资产与禁止 CSS 伪造。
- `tests/a06-auth-status-runtime-smoke.js`:通过 Chrome DevTools 9222 真实验证默认主操作进入 A02、受限主操作展示本地帮助提示、注册未完成主操作进入 A04。脚本在每次 hash 跳转后刷新文档,以规避 H5 Vue 实例保留上一次状态。
- `tests/compile-audit.ps1`:确认 A06 不再依赖已移除的目录临时项。
用户已于 2026-07-14 确认本页通过视觉验收;后续可开始 G02,但不得改变 A01、A02、A04、A05、A06、G01 的可见效果。若用户后续指定调整 A06,仍须重新截图、运行上述检查和相关回归。
+36 -21
View File
@@ -1,13 +1,13 @@
# P00 页面结构与资产清单
> 状态:59 条最终编号路由与第一版统一视觉母版已落地;A01/G01 运行时截图回归及全量逐页视觉精修待办
> 状态:55 条最终编号路由与第一版统一视觉母版已落地;A01/A02/A04/A05/A06/G01 两种状态与 G03 `create|ancestor` 已验收;G06 已合并 G07 的三态,最新「朱砂题签」候选只完成初始态截图,结果/无结果同版截图与用户审美确认待补
> 目的:让页面、路由和资产都有唯一、可读、可审计的归属;本文件是 P-00 的执行清单。
## 1. 页面命名规则
最终页面文件遵循 `<页面编号>-<语义名>.vue`
- 账户:`a01-entry.vue``a02-login.vue`
- 账户:`a01-entry.vue``a02-login.vue``a04-register.vue``a05-reset-password.vue``a06-auth-status.vue`
- 家谱:`g01-my-genealogies.vue``g03-create-genealogy.vue`
- 世系:`t01-tree-overview.vue``t03-member-profile.vue`
- 家族:`f01-family-feed.vue``f02-publish-feed.vue`
@@ -21,12 +21,11 @@
| 当前路由 | 当前可确认用途 | 目标文件 | 处理状态 |
| --- | --- | --- | --- |
| `pages/auth/a01-entry` | A01 启动/登录引导 | `pages/auth/a01-entry.vue` | 已迁移;视觉冻结;完整按钮资产待补 |
| `pages/auth/a02-login` | A02 账号登录 | `pages/auth/a02-login.vue` | 已迁移;验收 |
| `pages/auth/a02-login` | A02 账号登录 | `pages/auth/a02-login.vue` | 已迁移;验收,视觉冻结 |
| `pages/genealogy/g01-my-genealogies` | G01 我的家谱 | `pages/genealogy/g01-my-genealogies.vue` | 已迁移;视觉冻结 |
| `pages/genealogy/g03-create-genealogy` | G03 创建家谱 | `pages/genealogy/g03-create-genealogy.vue` | 已迁移;未验收 |
| `pages/genealogy/g04-first-ancestor` | G04 始祖录入 | `pages/genealogy/g04-first-ancestor.vue` | 已迁移;未验收 |
| `pages/genealogy/g03-create-genealogy` | G03 创建家谱/始祖录入 | `pages/genealogy/g03-create-genealogy.vue` | `step=create|ancestor`;已获用户验收,视觉冻结 |
| `pages/genealogy/g05-genealogy-overview` | G05 家谱总览 | `pages/genealogy/g05-genealogy-overview.vue` | 已迁移;未验收 |
| `pages/genealogy/g06-search-genealogies` | G06 公开家谱搜索 | `pages/genealogy/g06-search-genealogies.vue` | 已迁移;未验收 |
| `pages/genealogy/g06-search-genealogies` | G06 公开家谱搜索/结果/无结果 | `pages/genealogy/g06-search-genealogies.vue` | 已收敛 G07;朱砂题签候选已实现,只有初始态新截图,三态复核与用户审美确认待补 |
| `pages/genealogy/g10-application-review` | G10 管理员入谱审核 | `pages/genealogy/g10-application-review.vue` | 已迁移;未验收 |
| `pages/tree/t01-tree-overview` | T01 世系树总览 | `pages/tree/t01-tree-overview.vue` | 已迁移;未验收 |
| `pages/tree/t03-member-profile` | T03 成员档案 | `pages/tree/t03-member-profile.vue` | 已迁移;未验收 |
@@ -35,7 +34,7 @@
| `pages/notification/n01-message-center` | N01 消息中心 | `pages/notification/n01-message-center.vue` | 已迁移;未验收 |
| `pages/profile/m01-profile-home` | M01 我的首页 | `pages/profile/m01-profile-home.vue` | 已迁移;未验收 |
上述表仅保留首批迁移的历史背景;当前最终 59 路由、文件存在性和中文编号注释的唯一合同是 `tests/full-page-visual-contract.ps1`。临时 `content-list-skeleton` 已由谱文、相册、礼仪、备忘录和字辈诗最终页面替代并移除。
上述表仅保留首批迁移的历史背景;当前最终 55 路由、文件存在性和中文编号注释的唯一合同是 `tests/full-page-visual-contract.ps1`。临时 `content-list-skeleton` 已由谱文、相册、礼仪、备忘录和字辈诗最终页面替代并移除。
迁移要求:同一轮更新页面文件、`pages.json`、所有跳转路径、测试和中文文件头注释;未完成全部引用更新时,不得删除旧路径。
@@ -60,8 +59,16 @@ static/assets/
auth/
opaque/
a02-login-panel.png
transparent/
a02-agreement-unchecked.png
a02-agreement-checked.png
genealogy/
opaque/
g01-empty-panel.png
g03-create-flow-panel.png
g06-search-title-strip.png
g06-search-input-wide.png
g06-search-button.png
transparent/
tree/
opaque/
@@ -79,23 +86,31 @@ static/assets/
| 路径 | 属性/尺寸 | 用途 | 引用位置 | 状态 |
| --- | --- | --- | --- | --- |
| `foundation/opaque/auth-page-paper.jpg` | opaque / 750×1334 | 认证页纸纹底色 | A01、A02 | 保留 |
| `foundation/opaque/auth-header.png` | opaque / 750×196 | 认证页红色页头 | A01、A02 | 保留 |
| `foundation/opaque/page-paper.jpg` | opaque / 852×1846 | 根页宣纸底图 | G01 | 保留 |
| `foundation/opaque/auth-page-paper.jpg` | opaque / 750×1334 | 认证页纸纹底色 | A01、A02、A04、A05、A06 | 保留 |
| `foundation/opaque/auth-header.png` | opaque / 750×196 | 认证页红色页头 | A01、A02、A04、A05、A06 | 保留 |
| `foundation/opaque/page-paper.jpg` | opaque / 852×1846 | 根页宣纸底图 | G01、G06 | 保留 |
| `foundation/opaque/root-header-cinnabar.jpg` | opaque / 720×184 | 根页朱砂页头 | `PageHeader` | 保留 |
| `foundation/transparent/auth-ink-scenery.png` | transparent / 750×1334 | 认证页淡墨叠层 | A01、A02 | 保留 |
| `foundation/transparent/auth-title-cloud.png` | transparent / 200×120 | A01 标题左右云纹 | A01 | 保留 |
| `foundation/transparent/auth-divider-knot.png` | transparent / 160×96 | A01 文案分隔结 | A01 | 保留 |
| `foundation/opaque/a01-primary-button.png` | opaque / 1877×418 | A01 朱砂主按钮完整皮肤 | A01 | 保留;待运行截图回归 |
| `foundation/transparent/auth-ink-scenery.png` | transparent / 750×1334 | 认证页淡墨叠层 | A01、A02、A04、A05、A06 | 保留 |
| `foundation/transparent/auth-title-cloud.png` | transparent / 200×120 | 认证标题右侧云纹 | A01、A02、A04、A05、A06 | 保留 |
| `foundation/transparent/auth-divider-knot.png` | transparent / 160×96 | 认证标题与正文结饰 | A01、A04、A05、A06 | 保留 |
| `foundation/opaque/a01-primary-button.png` | opaque / 1877×418 | A01 朱砂主按钮完整皮肤 | A01、A02、A04、A05、A06 | 保留;A01、A02、A04、A05、A06 已验收 |
| `foundation/opaque/a01-secondary-button.png` | opaque / 1881×419 | A01 宣纸次按钮完整皮肤 | A01 | 保留;待运行截图回归 |
| `modules/auth/opaque/a02-login-panel.png` | opaque / 940×1672 | A02 完整卷轴登录面板,含纸纹、双金线、角纹、云纹与底部山水 | A02 | 保留;待用户视觉验收 |
| `foundation/transparent/auth-login-outline.png` | transparent / 96×96 | 登录图标 | A01 | 保留 |
| `modules/auth/opaque/a02-login-panel.png` | opaque / 940×1672 | 认证完整卷轴面板,含纸纹、双金线、角纹、云纹与底部山水 | A02、A04、A05、A06 | 保留;A02、A04、A05、A06 已验收 |
| `modules/auth/transparent/a02-agreement-unchecked.png` | transparent / 96×96 | 认证未同意协议图标 | A02、A04 协议确认行,叠在卷轴面板上 | 保留;A02、A04 已验收 |
| `modules/auth/transparent/a02-agreement-checked.png` | transparent / 96×96 | 认证已同意协议图标 | A02、A04 协议确认行,叠在卷轴面板上 | 保留;A02、A04 已验收 |
| `foundation/transparent/auth-login-outline.png` | transparent / 96×96 | 登录/状态图标 | A01、A06 | 保留 |
| `foundation/transparent/auth-wechat.png` | transparent / 96×96 | 微信图标 | A01 | 保留 |
| `foundation/transparent/brand-seal.png` | transparent / 240×288 | 品牌谱印 | A01、A02、`PageHeader` | 保留 |
| `foundation/transparent/brand-seal.png` | transparent / 240×288 | 品牌谱印 | A01、A02、A04、A05、A06、G06、`PageHeader` | 保留 |
| `foundation/transparent/root-header-hall.png` | transparent / 750×300 | 根页祠堂线稿 | `PageHeader` | 保留 |
| `foundation/transparent/footer-mountain-bamboo.png` | transparent / 750×360 | 根页底部山水竹影 | G01 | 保留 |
| `foundation/transparent/footer-mountain-bamboo.png` | transparent / 750×360 | 根页底部山水竹影 | G01、G06 | 保留 |
| `foundation/transparent/notice.png` | transparent / 96×96 | 通知图标 | `PageHeader` | 保留 |
| `foundation/transparent/chevron-right.png` | transparent / 96×96 | 列表箭头 | `GenealogyCard` | 保留 |
| `foundation/transparent/chevron-right.png` | transparent / 96×96 | 返回与列表箭头 | A02、A04、A05、A06、`GenealogyCard` | 保留 |
| `modules/genealogy/opaque/g01-empty-panel.png` | opaque / 1122×1402 | 无家谱空态完整宣纸卡,双金线、角饰、云纹与下沿山水 | G01 `state=empty` | 保留;由 ImageGen 生成,已获用户验收 |
| `modules/genealogy/opaque/g03-create-flow-panel.png` | opaque / 1122×1500 | 创建流程完整宣纸表单面板,双金线、回纹角饰、云纹与下沿淡墨山水 | G03 `step=create|ancestor` | 保留;由 ImageGen 生成,已获用户验收 |
| `modules/genealogy/opaque/g06-search-title-strip.png` | opaque / 1122×220 | 朱砂题签完整视觉面,含古金边饰与云纹,不烘焙文字或印玺 | G06 顶部检索题签 | 保留;用户选定 ImageGen 第 3 稿方向,Vue 叠放真实 `brand-seal.png` 与标题文字 |
| `modules/genealogy/opaque/g06-search-input-wide.png` | opaque / 1120×248 | 宽版独立宣纸输入框完整皮肤,含古金双线与角饰 | G06 真实输入框底层 | 保留;真实原生输入控件叠放其上 |
| `modules/genealogy/opaque/g06-search-input.png` | opaque / 720×248 | 早期窄版输入框完整皮肤 | 当前无引用 | 已停用;仅因用户要求停止工作而保留,恢复工作后需在引用扫描通过且用户允许时删除 |
| `modules/genealogy/opaque/g06-search-button.png` | opaque / 300×132 | 独立朱砂搜索按钮完整皮肤,含古金双线与角饰 | G06 真实搜索点击控件底层 | 保留;由 ImageGen 生成,真实点击控件与文本叠放其上 |
| `foundation/transparent/meta-location.png` | transparent / 96×96 | 地点元信息 | G01、`GenealogyCard` | 保留 |
| `foundation/transparent/meta-member.png` | transparent / 96×96 | 成员元信息 | G01、`GenealogyCard` | 保留 |
| `foundation/transparent/meta-admin.png` | transparent / 96×96 | 管理员元信息 | G01 | 保留 |
@@ -110,14 +125,14 @@ static/assets/
| `modules/genealogy/transparent/section-divider.png` | transparent / 720×30 | G01 分区金线 | G01 | 保留 |
| `modules/genealogy/transparent/current-seal-frame.png` | transparent / 144×208 | 当前家谱谱印框 | G01 | 保留 |
| `modules/genealogy/transparent/row-seal-frame.png` | transparent / 112×160 | 列表谱印框 | `GenealogyCard` | 保留 |
| `modules/genealogy/transparent/create-cloud.png` | transparent / 192×96 | 新建入口云纹 | G01 | 保留 |
| `modules/genealogy/transparent/create-cloud.png` | transparent / 192×96 | 新建/搜索状态云纹 | G01、G06 | 保留 |
| `modules/genealogy/transparent/add.png` | transparent / 96×96 | 新建入口加号 | G01 | 保留 |
| `modules/genealogy/transparent/shortcut-tree.png` | transparent / 96×96 | 世系图入口 | G01 | 保留 |
| `modules/genealogy/transparent/shortcut-members.png` | transparent / 96×96 | 成员入口 | G01 | 保留 |
| `modules/genealogy/transparent/shortcut-generation-poem.png` | transparent / 96×96 | 字辈诗入口 | G01 | 保留 |
| `modules/genealogy/transparent/shortcut-application.png` | transparent / 96×96 | 审核入口 | G01 | 保留 |
本轮已迁入 35 项在用资产,删除 24 项运行时零引用的旧副本。A01 的两张完整按钮皮肤由图像生成工具制作,不是设计图裁切;它们的原始比例均约为 4.49:1,并由 A01 页面作为单张底层皮肤引用。旧版设计记录中的历史路径不再是资产依据;后续只按本台账引用和维护。
本轮已迁入 38 项在用资产,删除 24 项运行时零引用的旧副本。A01 的两张完整按钮皮肤与 G06 检索资产均由图像生成工具制作,不是设计图裁切;G06 不再使用大型检索面板,当前使用朱砂题签、宽版输入框与搜索按钮三张独立位图,页面只叠放真实品牌印、文字与交互控件。旧版设计记录中的历史路径不再是资产依据;后续只按本台账引用和维护。
## 5. 图片属性规则
Binary file not shown.

After

Width:  |  Height:  |  Size: 340 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 352 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 355 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 229 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 290 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 355 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 454 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 359 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 359 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 456 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 359 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 352 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 284 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 356 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 360 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 457 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 359 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 456 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 360 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 457 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 276 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 346 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 360 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 457 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 275 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 346 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 350 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 451 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 237 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 300 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 352 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 697 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 288 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 368 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 281 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 367 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 314 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 406 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 318 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 331 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 278 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 284 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 282 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 284 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 288 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 284 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 490 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 280 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 283 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 284 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 251 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 426 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 250 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 256 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 289 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 368 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 260 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 264 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 697 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 262 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 693 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 343 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 359 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 359 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 360 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 350 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 288 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 259 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

+45 -21
View File
@@ -3,41 +3,54 @@
> 更新日期:2026-07-14
> 用途:在新电脑或交给新的 GPT 后,按本手册恢复当前工作;它只记录已发生的事实,不把待验收写成已完成。
## 0. 给新 GPT 的可直接执行指令
你接手的是一个 **uni-app Android 家谱项目的高质量视觉设计任务**,全程中文工作;它不是只改 CSS 的任务。先不修改代码,完整阅读:`AGENTS.md``docs/交接记录.md`、本手册、`docs/规划.md``docs/design/D1_安卓视觉规范与页面壳.md``docs/design/P00_页面结构与资产清单.md``docs/superpowers/plans/2026-07-13-product-design-visual-refinement.md``design-qa.md`。随后只向用户简洁复述当前停点和准备如何处理反馈。
必须保留已有未提交改动;不使用 worktree 或多代理;不执行 `git add``git commit``git push`、上传、`git reset``git checkout`。A01、A02、A04、A05、A06、G01、G03 的可见效果已获用户验收并冻结,不能以重构或顺手优化的名义改变。G07 是 G06 的页面内状态,不得重新建为独立页。
当前唯一应向用户确认的候选是 G06:用户选定最近 ImageGen 第 3 稿的「朱砂题签 + 宽输入框 + 搜索按钮」方向,通用印玺已替换为项目真实 `brand-seal.png`。最后实际运行证据只有初始态 `docs/design/screens/runtime/2026-07-14/G06-selected-strip-final-initial-360x800.png`;同版结果态和无结果态截图未完成,G06 也**未验收**。不要把旧 `G06-no-panel-*` 截图当作当前最终版本。先请用户看当前初始态并决定是否继续;用户要求继续 G06 时,先截图审视,再补三态和验证;用户明确验收后,才继续 T02→T01(除非用户指定新优先级)。
新环境必须可用并实际调用:`product-design:index``product-design:audit``imagegen``superpowers:test-driven-development``superpowers:systematic-debugging``superpowers:verification-before-completion`。没有这些能力时,先安装/启用同等能力,不得假装已经完成设计审视或位图生成。
## 1. 当前停点:先看这一节
项目已有 59 条最终编号路由,第一版都可以浏览;这不等于 59 个页面已完成视觉验收。
项目已有 55 条最终编号路由,第一版都可以浏览;这不等于 55 个页面已完成视觉验收。
- 用户已经验收的视觉基准只有两个:**A01 启动/登录引导**、**G01 我的家谱**。它们的可见效果已冻结。
- **A02 账号登录**已经完成一次资产化重做、功能回归和多尺寸截图,但**仍在等待用户审美验收**。在用户确认前,不得把 A02 标记为完成,也不得把它的样式批量传播到 A03--A06
- 用户已经验收的视觉基准有六个:**A01 启动/登录引导**、**A02 账号登录**、**A04 注册账号**、**A05 重置密码**、**A06 登录状态**、**G01 我的家谱**。它们的可见效果已冻结。
- **A02 账号登录**已经完成资产化重做、功能回归和多尺寸截图,并于 2026-07-14 获用户审美验收。A03 已删除;A02 的短信 Tab 是唯一手机号验证码登录入口。A04、A05、A06 均于同日完成独立重做并获用户审美验收;G02 已按用户确认合并为 G01 的 `?state=empty` 并获用户审美确认;G04 已合并为 G03 的 `?step=ancestor`,G03 双步骤已获用户继续授权通过;G07 已合并为 G06 初始/结果/无结果状态。G06 曾被指出页头层级、伪控件和大面板截图感;用户最后选择最近 ImageGen 第 3 稿,当前以朱砂题签、真实品牌谱印、独立宽输入框和搜索按钮实现。最后候选只完成初始态新截图,结果态/无结果态的同版截图和用户审美确认尚未完成
- 其余模块的页面仍属于后续视觉设计任务;其中不少页面目前由 `components/ModulePage.vue``data/page-catalog.js` 提供第一版可浏览壳。这个壳是过渡方案,不是最终 UI。
- 不提交、不推送、不上传 Git;由用户自行处理版本库操作。
下一位执行者的第一件事不是开始做新页面,而是请用户查看 A02 的前后对比
下一位执行者先读取当前停点与已验收页面,再向用户展示 **G06 当前候选的初始态** 并等待反馈
- `docs/design/screens/runtime/2026-07-13/A02-before-after-360x800.png`
- `docs/design/screens/runtime/2026-07-13/A02-after-412x915.png`
- `docs/design/screens/runtime/2026-07-13/A02-sms-360x800.png`
- `docs/design/screens/runtime/2026-07-14/A05-after-360x800.png`
- `docs/design/screens/runtime/2026-07-14/A05-after-412x915.png`
- `docs/design/screens/runtime/2026-07-14/A06-after-360x800.png`
- `docs/design/screens/runtime/2026-07-14/A06-after-412x915.png`
- `docs/design/screens/runtime/2026-07-14/A06-restricted-360x800.png`
- `docs/design/screens/runtime/2026-07-14/G06-selected-strip-final-initial-360x800.png`
用户若要求调整,只修改 A02 并重新截图、复核;用户明确通过,才进入 A03--A06
`G06-no-panel-*` 图是被用户否定后各轮尝试的历史证据,只能帮助理解迭代原因,不能用于当前验收。用户若要求调整,只修改对应页面状态并重新截图、复核;当前 A01、A02、A04、A05、A06、G01 两种状态与 G03 `create|ancestor` 均已明确通过。G06 当前候选的初始态待用户确认,结果态/无结果态的新截图待补;不得把 G06 写成已验收。只有用户明确通过 G06 或明确要求跳过它,下一项才按 T02→T01 状态收敛执行
## 1.1 迁移前必须保留的文件
本手册和截图工具是本轮新增文件;换电脑前,用户需在自行提交/上传时包含它们,或完整复制当前工作区。我没有执行任何 Git 暂存、提交、推送或上传操作。
本手册、G06 最终候选资产和截图工具均是接管所需文件;换电脑前,用户需在自行提交/上传时包含它们,或完整复制当前工作区。我没有执行任何 Git 暂存、提交、推送或上传操作。
至少要保留:`docs/design/视觉设计交接手册.md``docs/交接记录.md``scripts/capture-chrome-page.js`、A02 页面/资产/测试、`docs/design/screens/runtime/2026-07-13/` 的运行证据,以及现有计划与设计记录。只复制已提交的旧版本会丢失当前停点。
至少要保留:`docs/design/视觉设计交接手册.md``docs/交接记录.md``scripts/capture-chrome-page.js`G06 页面/资产/测试、`docs/design/screens/runtime/2026-07-14/G06-selected-strip-final-initial-360x800.png`A02 页面/资产/测试、`docs/design/screens/runtime/2026-07-13/` 的运行证据,以及现有计划与设计记录。只复制已提交的旧版本会丢失当前停点。
## 2. 必读文件与唯一职责
| 文件 | 负责什么 |
| --- | --- |
| `AGENTS.md` | 最小修改、保护既有未提交内容、验证后再交付的项目规则。 |
| `docs/规划.md` | 59 个页面的范围、模块顺序和“完成”的定义。 |
| `docs/规划.md` | 55 条独立路由的范围、模块顺序和“完成”的定义。 |
| `docs/design/D1_安卓视觉规范与页面壳.md` | Android 页面、资产、布局与中文注释的硬约束。 |
| `docs/design/P00_页面结构与资产清单.md` | 路由、页面文件和资产台账的唯一清单。 |
| `docs/superpowers/plans/2026-07-13-product-design-visual-refinement.md` | 已批准的分模块视觉精修计划和验收顺序。 |
| `docs/design/2026-07-13-A01-G01-A02-视觉审视.md` | A01/G01 视觉证据与旧 A02 的问题定位。 |
| `docs/design/A02_账号登录_设计记录.md` | A02 当前实现、资产、截图和测试记录。 |
| `design-qa.md` | A02 的 Design QA;当前 `final result: blocked`,原因是缺少用户的审美确认。 |
| `design-qa.md` | A02 的 Design QA;当前 `final result: accepted`。 |
| `docs/交接记录.md` | 简版当前状态与恢复入口;本手册提供完整操作细节。 |
发生冲突时,按“用户最新明确指令 > AGENTS.md > 上表中的当前台账/计划 > 历史文档”的顺序处理。不要以旧的草案或已废弃的截图切片方案为依据。
@@ -88,7 +101,7 @@
已通过的是:资产尺寸与不透明角审计、A01/A02 页面契约、编译检查、A02 的多尺寸运行截图和短信 Tab 交互。
通过的是:用户对 A02 的最终审美确认。因此 `design-qa.md` 必须保持 `blocked`,直至用户明确确认。用户若觉得顶部祥云偏多,只可先移除 A02 标题右侧的单个祥云;不要无根据改动面板框、输入区或交互。
通过的是:用户对 A02 的最终审美确认`design-qa.md` `accepted`,A02 可见效果冻结。用户若提出新的明确调整,只改动被指出的区域并重新截图复核;不要无根据改动面板框、输入区或交互。
## 5. 换电脑后如何恢复截图与审视能力
@@ -128,16 +141,16 @@ node scripts/capture-chrome-page.js `
## 6. 后续执行顺序与每轮产物
### 门禁 0先处理 A02
### 门禁 0A02 与 A04 已通过
1. 让用户审 A02 前后对比与 412 × 915、短信 Tab 图
2.不通过:只在 A02 修正明确问题,先调整对应契约测试,再改页面/资产,重新截全尺寸图。
3. 若通过:把 A02 状态同步到 `docs/规划.md``docs/交接记录.md``docs/design/A02_账号登录_设计记录.md``design-qa.md`,再开始 A03--A06
1. A02 与 A04 均已通过;不因后续页面改动而触碰其可见效果
2.用户提出明确调整:只在对应页面修正,先调整对应契约测试,再改页面/资产,重新截图复核
3. A05、A06 与 G01 空状态均已通过并完成状态同步;G04 已合并为 G03 `step=ancestor`,该双步骤已获用户通过;G07 已合并为 G06 三态。G06 当前朱砂题签候选只完成初始态新截图,尚待结果/无结果截图、审视和用户审美确认
### 其后的模块顺序
1. **账号 A03--A06**:以已验收 A02 为认证样板,但每个页面保留各自的任务与状态,不能直接复制表单。
2. **家谱 G02--G12**先做空态/创建、家谱概览世代字等代表页,再扩展搜索、申请设置。
1. **账号 A04--A06**:以已验收 A02 为认证样板,但每个页面保留各自的任务与状态,不能直接复制表单。绑定手机号以后归个人中心安全设置的独立入口;微信授权取消、失败、受限归 A06。
2. **家谱 G03、G05--G12**G07→G06 搜索流程已收敛;先由用户审美确认 G06 当前候选,并补齐同版三态截图;之后再推进家谱概览世代字、申请设置。用户明确授权连续推进时,先执行 T02→T01 状态收敛。
3. **世系树 T01--T08**:先建立树、成员档案、关系编辑三类代表页。
4. **家族内容 F01--F10**:动态、文章、相册、媒体上传分别建立内容档案式层级。
5. **人物记录 R01--R11**:人物档案、礼仪活动、成长时间线先定样板。
@@ -161,7 +174,7 @@ node scripts/capture-chrome-page.js `
| 能力/技能 | 何时使用 | 项目中的正确做法 |
| --- | --- | --- |
| `product-design:index``product-design:audit` | 审视、评价或设计一个已运行页面/流程时。 | 先拿到真实路由截图,再依据 A01/G01 与页面任务写审视结论;不要靠源码猜好不好看。 |
| `product-design:index``product-design:audit` | 审视、评价或设计一个已运行页面/流程时;接管 G06 后的第一项视觉工作也必须使用。 | 先拿到真实路由截图,再依据 A01/G01 与页面任务写审视结论;不要靠源码猜好不好看。 |
| Product Design 的 `user-context``get-context``ideate``image-to-code`、Design QA 流程 | 需要探索方向、选择视觉方案、将已选样稿落地、或交付前比对时。 | 有明确视觉真源时先忠实落地;没有真源且需要新方向时先给可比较方案,选定后再实现;最后在 `design-qa.md` 诚实记录通过或阻塞。 |
| `imagegen` | 现有资产无法承担完整视觉面时。 | 先用 A01/G01 实图作为参考,明确输出是完整不透明面板还是透明叠加件;检查实际尺寸/Alpha 后再放入项目。不能用截图代替资产。 |
| `superpowers:brainstorming``superpowers:writing-plans` | 新模块或会改变页面行为的创作工作开始前。 | 先写清用户目标、交互和验收,不以“尽快”跳过设计决定。 |
@@ -169,7 +182,7 @@ node scripts/capture-chrome-page.js `
| `superpowers:systematic-debugging` | 截图、路由、构建或测试出现意外时。 | 先复现和定位单一根因,禁止靠删测试、盲改样式掩盖问题。 |
| `superpowers:verification-before-completion` | 任何“完成/修好/通过”的表述前。 | 以命令输出、运行截图和用户确认作证据;不能用意图代替验证。 |
若新电脑没有 Product Design 或 ImageGen 插件,应先安装/启用同等能力;在能力缺失时不能假装完成视觉审计或资产生成。当前环境曾因 Windows 的 `python`/`python3` 只是商店占位符而无法保存 Product Design 的持久 context,这不影响当前项目文件和截图恢复;新环境若有可用 Python,可重新运行该插件的 context 预检
若新电脑没有 Product Design 或 ImageGen 插件,应先安装/启用同等能力;在能力缺失时不能假装完成视觉审计或资产生成。新环境先执行 `python --version``node --version` 确认可用环境;当前用户已确认 Python 已安装。若 Product Design 的持久 context 预检仍失败,记录原因即可,不得阻塞对项目内真实截图、资产和测试的接管
## 8. 验证命令
@@ -196,6 +209,17 @@ powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/full-page-visual-c
git diff --check
```
G06 当前候选继续或验收前的最小回归集合:
```powershell
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/g06-search-flow-contract.ps1
node tests/g06-search-flow-runtime-smoke.js http://localhost:5173
node scripts/capture-chrome-page.js "http://localhost:5173/#/pages/genealogy/g06-search-genealogies" ".search-page" "docs/design/screens/runtime/<日期>/G06-selected-strip-initial-360x800.png" 360 800
git diff --check
```
若 G06 发生视觉改动,必须用真实输入分别截取有结果和无结果状态,再用 Product Design 审视;只有三态、相关测试与用户确认齐全,才能更新为验收通过。
`git diff --check` 可能提示仓库既有的 CRLF 行尾警告;只有真正的空白错误或非零退出码才算失败。不要 reset、checkout、清空或覆盖用户已有改动。
## 9. 文档与资源维护清单
@@ -1,5 +1,7 @@
# 家谱 App Product Design 视觉精修实施计划
> 现行范围更新:A03 已于 2026-07-14 删除;验证码登录归 A02,绑定手机号归个人中心,微信异常归 A06。历史方案不再作为实现依据。
> **For agentic workers:** REQUIRED SUB-SKILL: Use `superpowers:executing-plans` to implement this plan task-by-task. Do not use parallel agents in this shared workspace.
**Goal:** 在不改变已验收 A01、G01 可见效果和既有业务交互的前提下,把其余 57 个页面从“可浏览的第一版”精修为同一套、可在 Android 小屏上成立的家祠卷轴界面。
@@ -168,25 +170,24 @@
只在用户确认 A02 后,将 `docs/规划.md` 状态更新为“认证样板已验收”。用户未确认时,记录为“实现完成,视觉待验收”,不得假称完成。
## Task 4: 完成认证模块 A03A06
## Task 4: 完成认证模块 A04A06
**Files:**
- Modify: `pages/auth/a03-mobile-verify.vue`
- Modify: `pages/auth/a04-register.vue`
- Modify: `pages/auth/a05-reset-password.vue`
- Modify: `pages/auth/a06-auth-status.vue`
- Create only after A02 布局被两页复用: `components/auth/AuthFormPanel.vue`
- Modify: `data/page-catalog.js` and `components/ModulePage.vue` only when the corresponding A03A06 entry is removed from the temporary motherplate
- Modify: `data/page-catalog.js` and `components/ModulePage.vue` only when the corresponding A04A06 entry is removed from the temporary motherplate
- Modify: `tests/full-page-visual-contract.ps1`
- Modify: `docs/design/P00_页面结构与资产清单.md`
**Consumes:** 已验收的 A02 面板、按钮和文字层级。
**Produces:** 认证页同一入口体验:登录、验证码、注册、重设和结果状态各有对应任务,不能仍显示泛化的“功能完善中”。
**Produces:** 认证页同一入口体验:登录、注册、重设和结果状态各有对应任务,不能仍显示泛化的“功能完善中”。
- [ ] **Step 1: 分别写四条红灯合同。**
A03 必须有手机号与验证码;A04 有手机号、密码、确认密码和协议提示;A05 有手机号、验证码、新密码;A06 有状态图标、说明和明确返回登录操作。合同只验证存在的交互和资产锚点,不宣称后端已接入。
A04 有手机号、密码、确认密码和协议提示;A05 有手机号、验证码、新密码;A06 有状态图标、说明和明确返回登录操作,并承接微信授权取消、失败与受限。合同只验证存在的交互和资产锚点,不宣称后端已接入。
- [ ] **Step 2: 用 A02 的已确认结构分别实现。**
@@ -194,7 +195,7 @@
- [ ] **Step 3: 模块截图与回归。**
A03、A04、A05、A06 至少各保存 360×800 一张截图;运行认证合同、`compile-audit.ps1`、`git diff --check`。A01 不改动且至少复核 412×915。
对 A04、A05、A06 至少各保存 360×800 一张截图;运行认证合同、`compile-audit.ps1`、`git diff --check`。A01 不改动且至少复核 412×915。
## Task 5: 完成家谱模块 G02G12
@@ -0,0 +1,109 @@
# A02 协议确认控件实施计划
> 现行范围更新:A03 已于 2026-07-14 删除;验证码登录归 A02,绑定手机号归个人中心,微信异常归 A06。历史方案不再作为实现依据。
> **For agentic workers:** 本计划由当前根代理内联执行;用户明确禁止 worktree、子代理、Git 暂存、提交、推送与上传。步骤以复选框追踪。
**Goal:** 在不改变 A01 可见效果的前提下,让 A02 在当前页提供可见、可操作的协议确认并以其状态拦截登录提交。
**Architecture:** A02 页面本地 `agreed` 状态是提交前协议状态的唯一所有者,A01 的 `agreed=1` 只用于初始化。两个 96 × 96 的透明 PNG 负责未选中和选中图标,Vue 负责可点击行、文字、链接与状态切换;不新增协议正文路由。
**Tech Stack:** Vue 3 `<script setup>`、uni-app、SCSS、PowerShell 契约审计、ImageGen、Chrome DevTools 截图。
## Global Constraints
- A01、G01 可见效果冻结;本轮不触碰 A01。
- 完整视觉图标使用真实透明 PNG;不以 CSS 圆环、勾号、伪元素或文本符号替代。
- 先写并运行失败的最小契约,再生成资产或修改页面。
- 不修改 A04--A06,不新增业务接口、协议路由、依赖或 Git 操作。
- A02 已获用户视觉验收,保持可见效果冻结。
---
### Task 1: 固化 A02 协议与资产合同
**Files:**
- Modify: `tests/a01-a02-ui-contract.ps1`
- Modify: `tests/a02-asset-alpha-audit.ps1`
- [x] **Step 1: 写失败的 UI 合同。**
加入以下锚点:`agreement-row``agreement-icon`、两枚 A02 协议图标路径、`const agreed = ref(false)``onLoad/onShow`、H5 `location.hash` 与 Android 页面选项的路由同步、`toggleAgreement``请先阅读并同意相关协议`。拒绝旧提示 `请先在登录引导页阅读并确认协议` 与 A02 协议图标的 CSS `border``background`、伪元素。
- [x] **Step 2: 运行 UI 合同并确认红灯。**
运行:`powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a01-a02-ui-contract.ps1`
预期:因 A02 尚无协议行和图标锚点而失败。
- [x] **Step 3: 写失败的资产审计。**
`tests/a02-asset-alpha-audit.ps1` 对两枚 `static/assets/modules/auth/transparent/a02-agreement-*.png` 逐个验证:存在、96 × 96、`System.Drawing.Image.IsAlphaPixelFormat` 为真、四角 Alpha 为 0,且至少一个像素 Alpha 为 255。
- [x] **Step 4: 运行资产审计并确认红灯。**
运行:`powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a02-asset-alpha-audit.ps1`
预期:因两枚协议图标尚不存在而失败。
### Task 2: 生成并接入透明协议状态资产
**Files:**
- Create: `static/assets/modules/auth/transparent/a02-agreement-unchecked.png`
- Create: `static/assets/modules/auth/transparent/a02-agreement-checked.png`
- Modify: `pages/auth/a02-login.vue`
- [x] **Step 1: 生成未选中与选中图标。**
用 ImageGen 参考 A02 运行截图生成两枚不含文字的圆形古金协议图标:未选中为细古金圆环,选中为朱砂圆印内白色对勾。先用平坦色键背景生成,再移除为透明 PNG;不得保留背景、阴影、边框或水印。
- [x] **Step 2: 仅在资产审计通过后实施 A02。**
模板将旧 `agreement-reminder` 换为可点击 `agreement-row`,内部按 `agreed` 切换两枚 `agreement-icon` 图片;协议文字链接调用 `prepareAgreement` 并停止行点击。脚本以 `agreed` 替代 `agreedFromEntry`,并在 `onLoad/onShow` 同步 H5 当前 hash 或 Android 当前页面选项;`canSubmit` 只判断本页状态。样式只做行尺寸、排版与状态可见性,不画图标。
- [x] **Step 3: 运行绿灯合同。**
运行:
```powershell
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a02-asset-alpha-audit.ps1
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a01-a02-ui-contract.ps1
```
预期:两个脚本均输出 `PASS`
### Task 3: 记录并做运行验证
**Files:**
- Modify: `docs/design/P00_页面结构与资产清单.md`
- Modify: `docs/design/A02_账号登录_设计记录.md`
- Modify: `design-qa.md`
- Create: `docs/design/screens/runtime/2026-07-14/A02-agreement-unchecked-320x568.png`
- Create: `docs/design/screens/runtime/2026-07-14/A02-agreement-unchecked-360x640.png`
- Create: `docs/design/screens/runtime/2026-07-14/A02-agreement-unchecked-360x800.png`
- Create: `docs/design/screens/runtime/2026-07-14/A02-agreement-unchecked-412x915.png`
- Create: `docs/design/screens/runtime/2026-07-14/A02-agreement-checked-360x800.png`
- [x] **Step 1: 更新事实台账。**
在 P00 登记两枚图标的路径、96 × 96 尺寸、transparent 属性、A02 引用位置与保留状态;设计记录和 QA 仅写本轮交互与运行截图,最终状态保持 `blocked`
- [x] **Step 2: 截取并检查两种状态。**
使用专用 Chrome 9222 捕获 A02 直接进入的 320×568、360×640、360×800、412×915 未选中状态,以及 `?agreed=1` 的 360×800 选中状态;逐张打开检查,不接受复用状态、黑块、加载态、裁切或错误图。后续补充的注册入口已在新文档 360×800、412×915 截图中复核。
- [x] **Step 3: 运行受影响验证。**
运行:
```powershell
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a02-asset-alpha-audit.ps1
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a01-a02-ui-contract.ps1
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a02-register-entry-contract.ps1
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/capture-chrome-page-contract.ps1
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/compile-audit.ps1
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/full-page-visual-contract.ps1
git diff --check
```
预期:所有脚本 PASS`git diff --check` 没有真实空白错误。
@@ -0,0 +1,70 @@
# A04 注册页视觉平衡修订实施计划
> **For agentic workers:** 在当前工作区逐项执行;用户禁止子代理、worktree、Git 暂存、提交、推送与上传。
**Goal:** 修复 A04 窄屏中长标签与占位提示粘连、无目的引导文案挤压表单的问题,同时保持 A04 的注册行为和既有位图资产体系。
**Architecture:** 只改 `pages/auth/a04-register.vue` 的 A04 局部结构与布局。标题下采用现有透明位图 `auth-divider-knot.png` 作为分隔,移除 `register-intro`;输入标签列统一为 `154rpx`,使长标签与输入占位文字有稳定间距。所有面板、按钮、边框和装饰继续由既有位图提供。
**Tech Stack:** Vue 3 `<script setup>`、uni-app、SCSS、PowerShell 源码契约、Chrome DevTools 截图。
## Global Constraints
- 仅修改 A04 与它的契约、设计记录、运行时截图;不修改已验收 A01、A02、G01。
- 不生成新资产;使用 `static/assets/foundation/transparent/auth-divider-knot.png`
- 先让契约失败,再写最小实现;完成前重跑契约、截图、回归与 `git diff --check`
---
### Task 1: 固化并实现 A04 的窄屏信息层级
**Files:**
- Modify: `tests/a04-registration-contract.ps1`
- Modify: `pages/auth/a04-register.vue`
- Modify: `docs/design/A04_注册账号_设计记录.md`
- Create: `docs/design/screens/runtime/2026-07-14/A04-after-balance-360x800.png`
- Create: `docs/design/screens/runtime/2026-07-14/A04-after-balance-412x915.png`
**Interfaces:**
- Consumes: 已有 `auth-divider-knot.png`、A04 的 `phone``password``confirmPassword``agreed``submitRegister``prepareLogin`
- Produces: 无 `register-intro` 的 A04;标题后有 `register-divider` 位图;`.input-label` 宽度为 `154rpx`A04 原有注册和回流行为不变。
- [x] **Step 1: 写失败的视觉结构契约。**
`tests/a04-registration-contract.ps1` 追加断言:A04 不含 `register-intro`;模板引用 `auth-divider-knot.png` 并有 `register-divider`;样式含 `width: 154rpx`;既有 `register-submit``agreement-row``prepareLogin``/pages/auth/a02-login` 保持存在。
- [x] **Step 2: 运行红灯。**
运行:
```powershell
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a04-registration-contract.ps1
```
预期:因旧版仍含 `register-intro`、没有 `register-divider`、标签宽度仍为 `126rpx` 而失败。
- [x] **Step 3: 写最小实现。**
在标题后放入:
```vue
<image class="register-divider" src="/static/assets/foundation/transparent/auth-divider-knot.png" mode="aspectFit" />
```
删除 `register-intro`,添加 `.register-divider` 的尺寸定位规则,将 `.form-content` 顶距改为与分隔位图相连的间距,并把 `.input-label``width` 改为 `154rpx`。不改脚本、路由、注册校验或其他页面。
- [x] **Step 4: 运行绿灯与真实截图审视。**
运行:
```powershell
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a04-registration-contract.ps1
node scripts/capture-chrome-page.js "http://localhost:5173/#/pages/auth/a04-register" ".auth-page" "docs/design/screens/runtime/2026-07-14/A04-after-balance-360x800.png" 360 800
node scripts/capture-chrome-page.js "http://localhost:5173/#/pages/auth/a04-register" ".auth-page" "docs/design/screens/runtime/2026-07-14/A04-after-balance-412x915.png" 412 915
```
逐张检查长标签与占位文字的间距、标题到表单的层级、底部协议与登录入口、窄屏横向裁切与黑块。
- [x] **Step 5: 最终回归与记录。**
运行 A04 契约、A03 路由移除、A01/A02 契约、编译审计、全页视觉契约与 `git diff --check`;在 A04 设计记录中标注本轮平衡修订的截图和结论。
@@ -0,0 +1,96 @@
# A04 注册账号实施计划
> **For agentic workers:** 使用 `superpowers:executing-plans` 在当前工作区内联执行。用户禁止子代理、worktree、Git 暂存、提交、推送与上传。
**Goal:** 将 A04 从通用表单壳改为带协议确认、字段校验和 A02 回流的独立注册页。
**Architecture:** A04 自己拥有手机号、密码、确认密码和 `agreed` 状态;视觉只复用 A02 的完整卷轴面板、A01 主按钮、认证头与 A02 协议图标。A04 从 `pageCatalog` 临时母版移除,不改变已验收 A01/A02/G01。
**Tech Stack:** Vue 3 `<script setup>`、uni-app、SCSS、PowerShell 契约审计、Chrome DevTools 截图。
## Global Constraints
- 完整面板、按钮与协议图标必须引用已有位图资产,禁止 CSS 绘制最终表面。
- 不使用 ImageGen;现有认证资产已满足本页完整视觉需要。
- 不接入真实注册、短信、微信、协议正文或后端接口。
- A01、A02、G01 可见效果冻结;不修改它们。
---
### Task 1: 固化独立注册页合同
**Files:**
- Create: `tests/a04-registration-contract.ps1`
- Modify: `pages/auth/a04-register.vue`
- Modify: `data/page-catalog.js`
- [x] **Step 1: 写失败的最小契约。**
创建 `tests/a04-registration-contract.ps1`,读取 A04、`pages.json``page-catalog.js`,并断言:A04 不引用 `ModulePage`;存在 `auth-header``register-panel__skin``a02-login-panel.png``a01-primary-button.png`、两枚 A02 协议图标、手机号/密码/确认密码模型、`agreed``toggleAgreement``submitRegister``prepareLogin` 与 A02 路由;拒绝 A04 面板、按钮、协议图标的 CSS `border``background` 伪造。
- [x] **Step 2: 运行红灯。**
运行:
```powershell
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a04-registration-contract.ps1
```
预期:因 A04 仍是 `ModulePage` 而失败。
- [x] **Step 3: 最小独立实现。**
重写 `pages/auth/a04-register.vue`:使用 A02 头、完整卷轴面板、三行真实输入、本页协议行、完整朱砂主按钮与“已有账号? 登录”入口。用 `phone``password``confirmPassword``agreed` 保存状态;`submitRegister` 依次校验协议、11 位手机号、密码、密码一致,再显示“注册服务待接入”。删除 `data/page-catalog.js``a04` 条目。
- [x] **Step 4: 运行绿灯。**
运行:
```powershell
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a04-registration-contract.ps1
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/compile-audit.ps1
```
预期:输出 `A04-REGISTRATION-CONTRACT PASS``PASS compile audit`
### Task 2: 记录并验证注册页
**Files:**
- Create: `docs/design/A04_注册账号_设计记录.md`
- Create: `docs/design/screens/runtime/2026-07-14/A04-after-360x800.png`
- Create: `docs/design/screens/runtime/2026-07-14/A04-after-412x915.png`
- Modify: `docs/规划.md`
- Modify: `docs/交接记录.md`
- [x] **Step 1: 写 A04 设计记录。**
记录 A04 的任务、复用资产、本页状态、无后端边界、A02 回流、截图与自动检查;初始状态为“实现与截图完成,等待用户视觉验收”。用户于 2026-07-14 验收后,规划与交接已同步为 A04 冻结,A05 可以开始。
- [x] **Step 2: 捕获并审视两张真实运行截图。**
运行:
```powershell
node scripts/capture-chrome-page.js "http://localhost:5173/#/pages/auth/a04-register" ".auth-page" "docs/design/screens/runtime/2026-07-14/A04-after-360x800.png" 360 800
node scripts/capture-chrome-page.js "http://localhost:5173/#/pages/auth/a04-register" ".auth-page" "docs/design/screens/runtime/2026-07-14/A04-after-412x915.png" 412 915
```
逐张打开检查:完整头、卷轴边框、三项输入、协议、按钮和登录入口可读;无横向裁切、黑块、加载态或 CSS 通用卡片。
- [x] **Step 3: 运行最终回归。**
运行:
```powershell
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a04-registration-contract.ps1
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a03-route-removal-contract.ps1
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a01-a02-ui-contract.ps1
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a02-register-entry-contract.ps1
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a02-asset-alpha-audit.ps1
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/capture-chrome-page-contract.ps1
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/compile-audit.ps1
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/full-page-visual-contract.ps1
git diff --check
```
实际:全部 PASS;用户已于 2026-07-14 确认 A04 通过视觉验收,后续从 A05 开始。
@@ -0,0 +1,87 @@
# A05 重置密码实施计划
> **For agentic workers:** 在当前工作区逐项执行;用户禁止子代理、worktree、Git 暂存、提交、推送与上传。
**Goal:** 将 A05 改为与已验收认证入口一致的独立手机验证重置密码页,并保留真实本地校验与 A02 回流。
**Architecture:** `pages/auth/a05-reset-password.vue` 自己拥有四项表单状态、验证码提示、重置校验和 A02 跳转,不再依赖 `ModulePage`。视觉复用 A02/A04 已用的完整认证位图,`data/page-catalog.js` 删除 `a05` 临时条目。
**Tech Stack:** Vue 3 `<script setup>`、uni-app、SCSS、PowerShell 源码契约、Chrome DevTools 截图。
## Global Constraints
- 仅修改 A05、它的契约、目录项、设计记录、规划/交接/资产台账与运行时截图。
- 不生成新资产;完整卷轴面板、朱砂主按钮、页头、结饰和返回箭头全部引用已有位图。
- 不修改已验收 A01、A02、A04、G01 的可见效果。
- 先红灯后绿灯;完成前重跑受影响回归、截图审视和 `git diff --check`
---
### Task 1: 固化独立 A05 重置密码合同
**Files:**
- Create: `tests/a05-reset-password-contract.ps1`
- Modify: `pages/auth/a05-reset-password.vue`
- Modify: `data/page-catalog.js`
**Interfaces:**
- Consumes: `/pages/auth/a02-login``auth-header.png``a02-login-panel.png``a01-primary-button.png``auth-divider-knot.png``chevron-right.png`
- Produces: A05 的 `phone``verificationCode``password``confirmPassword``prepareGetCode``submitReset``prepareLogin``goBack`
- [x] **Step 1: 写失败的最小契约。**
创建 PowerShell 测试,读取 A05、`pages.json``data/page-catalog.js` 并断言:A05 路由存在但不使用 `ModulePage`;模板拥有认证头、卷轴面板、主按钮、结饰、手机号/验证码/新密码/确认新密码的 `v-model`、获取验证码动作、重置校验、A02 登录回流;`a05:` 从临时目录移除;A05 面板、主按钮和验证码动作不以 CSS `border`/`background` 伪造完整表面。
- [x] **Step 2: 运行红灯。**
运行:
```powershell
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a05-reset-password-contract.ps1
```
预期:A05 仍引用 `ModulePage` 且目录仍有 `a05:`,测试失败。
- [x] **Step 3: 最小独立实现。**
将 A05 写为独立认证页:认证背景与页头、带返回动作的标题、结饰、四行真实输入;验证码行右侧是无表面文字动作;完整位图主按钮;“返回登录”回流 A02。实现 `prepareGetCode``submitReset` 和四项顺序校验;删除 `data/page-catalog.js``a05` 条目。
- [x] **Step 4: 运行绿灯。**
运行:
```powershell
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a05-reset-password-contract.ps1
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/compile-audit.ps1
```
预期:输出 `A05-RESET-PASSWORD-CONTRACT PASS``PASS compile audit`
### Task 2: 记录、截图与最终回归
**Files:**
- Create: `docs/design/A05_重置密码_设计记录.md`
- Create: `docs/design/screens/runtime/2026-07-14/A05-after-360x800.png`
- Create: `docs/design/screens/runtime/2026-07-14/A05-after-412x915.png`
- Modify: `docs/规划.md`
- Modify: `docs/交接记录.md`
- Modify: `docs/design/P00_页面结构与资产清单.md`
- [x] **Step 1: 写设计记录。**
记录 A05 的四项认证流程、复用资产、未接入短信/后端的边界、A02 回流、截图与自动检查;状态写“实现与截图完成,等待用户视觉验收”。
- [x] **Step 2: 捕获并审视真实截图。**
运行:
```powershell
node scripts/capture-chrome-page.js "http://localhost:5173/#/pages/auth/a05-reset-password" ".auth-page" "docs/design/screens/runtime/2026-07-14/A05-after-360x800.png" 360 800
node scripts/capture-chrome-page.js "http://localhost:5173/#/pages/auth/a05-reset-password" ".auth-page" "docs/design/screens/runtime/2026-07-14/A05-after-412x915.png" 412 915
```
逐张检查认证页头、四项输入、验证码动作、按钮、登录回流、横向裁切、黑块和滚动可达性。
- [x] **Step 3: 完整回归。**
运行 A05 契约、A04 契约、A03 路由移除、A01/A02 契约、资产审计、截图脚本契约、编译审计、全页契约与 `git diff --check`。同步规划、交接和资产台账;用户已于 2026-07-14 明确验收 A05,因此将它写为已验收并冻结。
@@ -0,0 +1,117 @@
# A06 登录状态 Implementation Plan
> **For agentic workers:** REQUIRED SUB-SKILL: Use `superpowers:executing-plans` to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. 用户禁止子代理、worktree、Git 暂存、提交、推送与上传。
**Goal:** 将 A06 做成可通过一个 `status` 路由参数表达六种真实认证结果、并可返回正确认证步骤的独立页面。
**Architecture:** `pages/auth/a06-auth-status.vue` 独立拥有状态配置、H5 查询参数解析和最小本地交互;它不再依赖 `ModulePage``data/page-catalog.js`。页面复用已验收认证位图资产,保留单一 A06 路由,避免为每个状态新建页面。
**Tech Stack:** Vue 3 `<script setup>`、uni-app、SCSS、PowerShell 源码契约、Chrome DevTools 截图。
## Global Constraints
- 仅修改 A06、它的契约、设计记录、规划/交接/资产台账和 A06 运行截图。
- 不生成新资产;完整页面壳、面板、主按钮、边框与装饰面均引用现有位图,不以 CSS 伪造。
- 不修改已验收并冻结的 A01、G01、A02、A04、A05 可见效果。
- 手机号绑定不在本轮实现;它后续位于个人中心安全设置的独立页面。
- 先红灯、后绿灯;完成前截图审视、回归并运行 `git diff --check`
---
### Task 1: 固化 A06 多状态合同并替换通用页
**Files:**
- Create: `tests/a06-auth-status-contract.ps1`
- Modify: `pages/auth/a06-auth-status.vue`
- Modify: `data/page-catalog.js`
**Interfaces:**
- Consumes: `?status=normal|failed|restricted|register-pending|wechat-cancelled|wechat-failed`、认证位图资产、A02 登录页、A04 注册页。
- Produces: `resolveStatus``goLogin``goRegister``handlePrimary``goBack`;未知状态必须回退为 `normal`
- [x] **Step 1: 写失败的最小契约**
创建 `tests/a06-auth-status-contract.ps1`,读取 `pages.json`、A06 源码与 `data/page-catalog.js`,断言:A06 路由仍存在、源码不含 `ModulePage`、目录不再含 `a06:`;六个 ASCII 状态键与四个动作函数存在;页面引用现有认证壳、面板、主按钮、云纹、分隔结、返回箭头和登录轮廓位图;面板和主按钮不使用 CSS `border`/`background` 伪造;A02 与 A04 路由存在。
- [x] **Step 2: 运行红灯**
运行:
```powershell
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a06-auth-status-contract.ps1
```
预期:因当前 A06 仍渲染 `ModulePage`、目录仍有 `a06:` 而失败。
- [x] **Step 3: 写最小独立实现**
`pages/auth/a06-auth-status.vue` 改为认证状态页:用 `status` 查询键选择六条文案;每个状态仅给出一项可执行的下一步;`restricted` 的帮助只显示本地待接入提示;`register-pending` 去 A04;其余主操作及次操作去 A02。删除 `data/page-catalog.js``a06:` 临时条目。
- [x] **Step 4: 运行绿灯**
运行:
```powershell
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a06-auth-status-contract.ps1
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/compile-audit.ps1
```
预期:输出 `A06-AUTH-STATUS-CONTRACT PASS``PASS compile audit`
### Task 2: 记录、真实截图与回归
**Files:**
- Create: `docs/design/A06_登录状态_设计记录.md`
- Create: `docs/design/screens/runtime/2026-07-14/A06-after-360x800.png`
- Create: `docs/design/screens/runtime/2026-07-14/A06-after-412x915.png`
- Create: `docs/design/screens/runtime/2026-07-14/A06-restricted-360x800.png`
- Modify: `docs/规划.md`
- Modify: `docs/交接记录.md`
- Modify: `docs/design/P00_页面结构与资产清单.md`
- Modify: `docs/design/视觉设计交接手册.md`
**Interfaces:**
- Consumes: Task 1 的 `status` 状态合同和 Chrome CDP 9222。
- Produces: 可审查截图、交接记录和等待用户验收的 A06。
- [x] **Step 1: 记录设计边界**
写 A06 设计记录,包含六状态映射、复用资产、未接入后端/客服/申诉能力、A02/A04 回流、截图位置和“等待用户审美验收”状态。
- [x] **Step 2: 捕获并审视真实页面**
运行:
```powershell
node scripts/capture-chrome-page.js "http://localhost:5173/#/pages/auth/a06-auth-status" ".auth-page" "docs/design/screens/runtime/2026-07-14/A06-after-360x800.png" 360 800
node scripts/capture-chrome-page.js "http://localhost:5173/#/pages/auth/a06-auth-status" ".auth-page" "docs/design/screens/runtime/2026-07-14/A06-after-412x915.png" 412 915
node scripts/capture-chrome-page.js "http://localhost:5173/#/pages/auth/a06-auth-status?status=restricted" ".auth-page" "docs/design/screens/runtime/2026-07-14/A06-restricted-360x800.png" 360 800
```
逐张审视认证头图、卷轴面板、状态图形、主/次操作、底部留白、横向裁切和黑块;用 Chrome 实测默认返回登录、受限状态帮助提示、未完成注册去 A04。
- [x] **Step 3: 同步与完整回归**
更新规划、交接、资产台账与视觉手册,明确 A06 已实现并等待用户审美验收。运行:
```powershell
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a06-auth-status-contract.ps1
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a05-reset-password-contract.ps1
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a04-registration-contract.ps1
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a03-route-removal-contract.ps1
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a01-a02-ui-contract.ps1
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a02-register-entry-contract.ps1
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a02-asset-alpha-audit.ps1
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/capture-chrome-page-contract.ps1
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/compile-audit.ps1
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/full-page-visual-contract.ps1
git diff --check
```
预期:全部通过;`git diff --check` 允许已有 CRLF 提示,但退出码必须为 0。用户已于 2026-07-14 明确验收 A06,故已同步为可见效果冻结。
## 自审
- 规格的六个状态、单一路由、资产限制、A02/A04 回流、截图与等待验收均被两个任务覆盖。
- 本计划不含 TODO/TBD/“同 Task N”占位语,函数名和状态键在两个任务中一致。
- 不提交 Git:项目规则覆盖计划模板中的提交建议。
@@ -0,0 +1,198 @@
# G01 无家谱状态合并实施计划
> **For agentic workers:** REQUIRED SUB-SKILL: Use `superpowers:executing-plans` to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** 删除独立的 G02 页面路由,让“无家谱”成为 G01 在 `?state=empty` 下可复现、可验证的页面状态,同时保持 G01 默认已验收列表画面不变。
**Architecture:** `pages/genealogy/g01-my-genealogies.vue` 是“我的家谱”状态的唯一所有者:默认路由继续读取现有示例家谱数据,`state=empty` 只覆盖 `hasGenealogies` 的演示状态。G01 的空状态使用已生成的完整位图面板和现有按钮位图;G02 路由、专属实现、测试与已失效的专属交接材料删除。
**Tech Stack:** uni-app Vue 3、Vue Composition API、PowerShell 合约测试、Chrome DevTools 截图脚本、Node.js 运行时冒烟测试。
## Global Constraints
- 不修改 G01 默认“已有家谱”状态的可见效果,也不修改已验收的 A01、A02、A04、A05、A06。
- 可审计路由/视觉结构改动必须先有最小失败契约测试;行为验证必须覆盖默认与空状态。
- 空状态完整面板、按钮边框和装饰面使用位图资产,不以 CSS 伪造。
- 不执行 `git add``git commit``git push``git reset` 或 worktree 操作。
- 仅删除本项目此前为独立 G02 创建、且在迁移后无引用的文件;保留最终位图并改为 G01 所属名称。
---
### Task 1: 建立 G01 空状态与路由收敛契约
**Files:**
- Create: `tests/g01-empty-state-contract.ps1`
- Modify: `tests/full-page-visual-contract.ps1`
- Test: `tests/g01-empty-state-contract.ps1`
**Interfaces:**
- Consumes: `pages.json` 路由注册、`pages/genealogy/g01-my-genealogies.vue``static/assets/modules/genealogy/opaque/g01-empty-panel.png`
- Produces: 证明 G01 是唯一入口、`state=empty` 是唯一空状态开关、并且 57 条已注册路由为新的页面契约的静态测试。
- [x] **Step 1: 写失败的合约测试**
`tests/g01-empty-state-contract.ps1` 断言:
```powershell
Assert-True ($pages.paths -contains 'pages/genealogy/g01-my-genealogies') 'G01 route missing'
Assert-True (-not ($pages.paths -contains 'pages/genealogy/g02-empty-genealogies')) 'G02 route must be removed'
Assert-Match $g01Source 'forceEmptyState' 'G01 must own the explicit empty state'
Assert-Match $g01Source 'state.*empty' 'G01 must parse state=empty'
Assert-Match $g01Source 'g01-empty-panel\.png' 'G01 must use its final raster empty panel'
Assert-Match $g01Source 'empty-create-action' 'G01 must expose create action in empty state'
Assert-Match $g01Source 'empty-search-action' 'G01 must expose search action in empty state'
Assert-NoCssSurface $g01Source 'empty-panel'
Assert-NoCssSurface $g01Source 'empty-create-action'
Assert-NoCssSurface $g01Source 'empty-search-action'
```
并在 `tests/full-page-visual-contract.ps1` 中把期望页面数和完整清单收敛为 57 条,移除 G02。
- [x] **Step 2: 运行测试确认失败**
Run: `powershell -ExecutionPolicy Bypass -File tests/g01-empty-state-contract.ps1`
Expected: FAIL,指出 G02 仍在路由表中,且 G01 尚未拥有 `forceEmptyState` 和最终 `g01-empty-panel.png`
- [x] **Step 3: 记录失败原因**
失败不是视觉问题:现有 `pages.json` 将 G02 作为第二个页面注册,且现有 G01 空分支没有 URL 状态开关。这证明需要迁移所有权,而不是额外保留一个“空状态页面”。
### Task 2: 将空状态实现迁移到 G01
**Files:**
- Modify: `pages/genealogy/g01-my-genealogies.vue`
- Modify: `pages.json`
- Move: `static/assets/modules/genealogy/opaque/g02-empty-panel-v2.png` to `static/assets/modules/genealogy/opaque/g01-empty-panel.png`
- Test: `tests/g01-empty-state-contract.ps1`
**Interfaces:**
- Consumes: `state=empty` 路由参数和现有 G01 的 `createGenealogy()``applyToJoin()`
- Produces: 默认 G01 保持有家谱;`/pages/genealogy/g01-my-genealogies?state=empty` 展示带“创建我的家谱”和“搜索并申请加入”动作的空状态。
- [x] **Step 1: 实现最小路由状态所有权**
在 G01 里引入 `forceEmptyState`,在 `onLoad``onShow` 中同步当前页面 `options.state`(H5 时从 hash 查询串读取)。只用它定义:
```js
const hasGenealogies = computed(() => !forceEmptyState.value && list.value.length > 0)
```
默认路由不携带 `state=empty`,因此继续走现有已验收列表分支。
- [x] **Step 2: 替换 G01 的旧 CSS 空状态表面**
仅替换 `v-else` 空状态内容为:
```vue
<view v-else class="genealogy-empty-state">
<view class="empty-panel">
<image class="empty-panel-skin" src="/static/assets/modules/genealogy/opaque/g01-empty-panel.png" mode="aspectFill" />
<view class="empty-panel-content">
<!-- 印章标题说明分隔纹创建与搜索动作 -->
</view>
</view>
</view>
```
按钮皮肤继续引用现有 `a01-primary-button.png``a01-secondary-button.png`。使用 `empty-create-action``empty-search-action` 等新类名,不能改动现有列表中 `.create-action` 的已验收样式;这两个动作分别继续调用 `createGenealogy()``applyToJoin()`
- [x] **Step 3: 移除独立 G02 入口**
`pages.json` 删除 `pages/genealogy/g02-empty-genealogies`,删除 `pages/genealogy/g02-empty-genealogies.vue`,并将最终位图重命名为 `g01-empty-panel.png`。不保留 G02 兼容路由或重定向。
- [x] **Step 4: 运行静态契约确认通过**
Run: `powershell -ExecutionPolicy Bypass -File tests/g01-empty-state-contract.ps1`
Expected: PASS,且 `powershell -ExecutionPolicy Bypass -File tests/full-page-visual-contract.ps1` 输出 57 条路由清单通过。
### Task 3: 验证真实页面状态与动作
**Files:**
- Create: `tests/g01-empty-state-runtime-smoke.js`
- Test: `tests/g01-empty-state-runtime-smoke.js`
**Interfaces:**
- Consumes: Chrome DevTools `http://localhost:9222` 与开发服务器 `http://localhost:5173`
- Produces: 默认 G01 列表、空状态、创建跳转和搜索跳转的运行时证据。
- [x] **Step 1: 写运行时测试**
测试在同一浏览器中依序验证:
```js
await open('/#/pages/genealogy/g01-my-genealogies?state=empty')
await waitFor('.genealogy-empty-state .empty-create-action')
await click('.empty-create-action')
assertPath('/pages/genealogy/g03-create-genealogy')
await open('/#/pages/genealogy/g01-my-genealogies?state=empty')
await click('.empty-search-action')
assertPath('/pages/genealogy/g06-search-genealogies')
await open('/#/pages/genealogy/g01-my-genealogies')
assertExists('.current-slip')
assertMissing('.genealogy-empty-state')
```
- [x] **Step 2: 运行运行时测试确认通过**
Run: `node tests/g01-empty-state-runtime-smoke.js http://localhost:5173`
Expected: PASS,证明两个空状态动作可用,且不带参数的 G01 仍为默认列表。
### Task 4: 截图审视、清理与交接同步
**Files:**
- Modify: `docs/交接记录.md`
- Modify: `docs/规划.md`
- Modify: `docs/design/P00_页面结构与资产清单.md`
- Modify: `docs/design/2026-07-14_页面与状态合并审计.md`
- Delete: `tests/g02-empty-genealogies-contract.ps1`
- Delete: `tests/g02-empty-genealogies-runtime-smoke.js`
- Delete: `docs/design/G02_无家谱空状态_设计记录.md`
- Delete: `docs/superpowers/specs/2026-07-14-g02-empty-genealogies-design.md`
- Delete: `docs/superpowers/plans/2026-07-14-g02-empty-genealogies.md`
- Delete: `docs/design/screens/runtime/2026-07-14/G02-before-360x800.png`
- Delete: `docs/design/screens/runtime/2026-07-14/G02-before-412x915.png`
- Delete: `docs/design/screens/runtime/2026-07-14/G02-after-360x800.png`
- Delete: `docs/design/screens/runtime/2026-07-14/G02-after-412x915.png`
- Delete: `docs/design/screens/runtime/2026-07-14/G01-G02-comparison-360x800.png`
- Create: `docs/design/screens/runtime/2026-07-14/G01-empty-after-360x800.png`
- Create: `docs/design/screens/runtime/2026-07-14/G01-empty-after-412x915.png`
- Create: `docs/design/screens/runtime/2026-07-14/G01-default-after-360x800.png`
- Create: `docs/design/screens/runtime/2026-07-14/G01-default-before-after-360x800.png`
**Interfaces:**
- Consumes: G01 的两种可达状态、迁移后的 57 路由契约、审计前的 `route-audit/G01-360x800.png`
- Produces: 同一视口的默认态前后对比、空状态截图、无过期 G02 入口和准确的交接记录。
- [x] **Step 1: 截图并做同图对比审视**
在 360×800 截默认 G01 和 `state=empty`,在 412×915 截空状态;把迁移前 `route-audit/G01-360x800.png` 与迁移后默认图并排为一张对比图。使用图像查看确认默认态没有发生可见改动,并确认空状态不出现透明黑角、裁切或 CSS 伪造表面。
- [x] **Step 2: 清除过期 G02 资料**
`rg` 确认没有其余活跃引用后,删除仅属于独立 G02 的路由实现、测试、计划、设计记录和旧截图。保留路线审计里的总览截图,避免抹除先前审计证据。
- [x] **Step 3: 更新真实状态**
文档统一为:已注册路由 57 条;G01 默认列表仍已验收;G01 `state=empty` 已实现和截图验证、等待用户对新增状态的审美确认;下一项合并仍是 G04→G03,尚未开始。
- [x] **Step 4: 完成回归验证**
Run:
```powershell
powershell -ExecutionPolicy Bypass -File tests/g01-empty-state-contract.ps1
node tests/g01-empty-state-runtime-smoke.js http://localhost:5173
powershell -ExecutionPolicy Bypass -File tests/full-page-visual-contract.ps1
powershell -ExecutionPolicy Bypass -File tests/visual-asset-compliance.ps1
powershell -ExecutionPolicy Bypass -File tests/a01-landing-contract.ps1
powershell -ExecutionPolicy Bypass -File tests/a02-login-contract.ps1
powershell -ExecutionPolicy Bypass -File tests/a04-forgot-password-contract.ps1
powershell -ExecutionPolicy Bypass -File tests/a05-register-contract.ps1
powershell -ExecutionPolicy Bypass -File tests/a06-auth-status-contract.ps1
git diff --check
```
Expected: 全部通过;`git diff --check` 允许 CRLF 警告但无空白错误。
@@ -0,0 +1,163 @@
# G03 创建家谱流程收敛实施计划
> **For agentic workers:** REQUIRED SUB-SKILL: Use `superpowers:executing-plans` to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** 把 G04 始祖录入收敛为 G03 的第二步,保留创建/录入的真实数据行为,使独立路由由 57 条降到 56 条。
**Architecture:** `pages/genealogy/g03-create-genealogy.vue` 是创建家谱流程的唯一所有者;默认 `step=create` 创建家谱,`step=ancestor&genealogyId=…` 录入首代。成功创建后使用同一 G03 URL 进入第二步;首代创建成功后才进入 T01。G04 路由与页面彻底删除,不保留兼容入口。
**Tech Stack:** uni-app Vue 3、Vue Composition API、uni-app 生命周期、既有 `appApi`/`genealogyContext`、PowerShell 契约测试、Chrome DevTools 运行时冒烟、ImageGen 位图资产。
## Global Constraints
- 不触碰已验收 A01、A02、A04、A05、A06、G01 默认态和 G01 空状态的可见效果。
- 完整页头、表单面板、主按钮均使用完整位图资产;CSS 只负责布局、文字、字段状态与交互。
- 路由/状态/行为变化先写失败契约;无 G04 兼容路由、重定向或重复页面。
- 不执行 `git add``git commit``git push``git reset` 或 worktree 操作。
---
### Task 1: 固化唯一 G03 创建流程合同
**Files:**
- Create: `tests/g03-create-flow-contract.ps1`
- Modify: `tests/full-page-visual-contract.ps1`
- Modify: `tests/a03-route-removal-contract.ps1`
- Test: `tests/g03-create-flow-contract.ps1`
**Interfaces:**
- Consumes: `pages.json`、当前 G03/G04 页面、`appApi``genealogyContext`
- Produces: 证明 G03 是唯一创建流程入口、G04 不存在、`step=create|ancestor` 是唯一状态合同、位图表面不可被 CSS 伪造的静态守卫。
- [x] **Step 1: 写失败契约**
```powershell
Assert-RoutePresent 'pages/genealogy/g03-create-genealogy'
Assert-RouteAbsent 'pages/genealogy/g04-first-ancestor'
Assert-FileAbsent 'pages/genealogy/g04-first-ancestor.vue'
Assert-Contains $g03 'step=ancestor&genealogyId='
Assert-Contains $g03 'appApi.createGenealogy'
Assert-Contains $g03 'appApi.createPerson'
Assert-Contains $g03 'g03-create-flow-panel.png'
Assert-NoCssSurface $g03 'create-flow-panel'
Assert-NoCssSurface $g03 'flow-primary-action'
```
- [x] **Step 2: 运行并确认失败**
Run: `powershell -ExecutionPolicy Bypass -File tests/g03-create-flow-contract.ps1`
Expected: FAIL,指出 G04 路由和文件仍存在,且 G03 还没有祖先步骤与位图面板。
### Task 2: 生成并审视创建流程位图面板
**Files:**
- Create: `static/assets/modules/genealogy/opaque/g03-create-flow-panel.png`
- Modify: `docs/design/P00_页面结构与资产清单.md`
- Test: `tests/g03-create-flow-contract.ps1`
**Interfaces:**
- Consumes: G01 的暖宣纸、古金、淡墨山水视觉语言与 G03 约 656rpx 宽、876rpx 高的面板槽位。
- Produces: 1122×1500 的不透明表单面板位图,供 G03 两个流程状态共用。
- [x] **Step 1: 用 ImageGen 生成单一最终候选**
Use case: `ui-mockup`。生成暖宣纸全画布、不透明、古金双线框、回纹角饰、极淡右上云纹和底沿淡墨山水的竖向面板;禁止文字、按钮、Logo、人物、黑角、透明区域。
- [x] **Step 2: 将候选移入项目并验证位图**
最终文件为 `g03-create-flow-panel.png`;检查 1122×1500、四角 alpha=255、没有黑角,并在 P00 标注其只服务 G03 的 `create|ancestor` 两个状态。
### Task 3: 实现 G03 的两个真实步骤并移除 G04
**Files:**
- Modify: `pages/genealogy/g03-create-genealogy.vue`
- Modify: `pages.json`
- Delete: `pages/genealogy/g04-first-ancestor.vue`
- Test: `tests/g03-create-flow-contract.ps1`
**Interfaces:**
- Consumes: 查询参数 `step``genealogyId``appApi.createGenealogy``appApi.createPerson``genealogyContext`
- Produces: G03 默认创建态、G03 首代录入态、两个状态各自校验和真实跳转。
- [x] **Step 1: 添加明确路由状态同步**
`onLoad`/`onShow` 同步当前查询参数。缺失或非 `ancestor``step` 一律为 `create`;祖先步骤从 `genealogyId``genealogyContext` 读取家谱 ID。
- [x] **Step 2: 保留创建行为并改为同路由下一步**
`submitCreate()` 继续验证姓氏与谱名、调用 `appApi.createGenealogy()` 和设置上下文;成功后:
```js
uni.redirectTo({
url: `/pages/genealogy/g03-create-genealogy?step=ancestor&genealogyId=${created.id}`,
})
```
- [x] **Step 3: 内嵌祖先录入行为**
`submitAncestor()` 保留首代姓名校验和 `appApi.createPerson()`;成功后仍跳转 T01。祖先步骤的返回动作回 G03 默认创建态;默认创建态使用 `uni.navigateBack()`
- [x] **Step 4: 替换通用 CSS 视觉面**
采用 G01 的纸纹、下沿山水和 `root-header-cinnabar.jpg`,在本页构建位图页头;两个步骤共用 `g03-create-flow-panel.png`;按钮引用 `a01-primary-button.png``create-flow-panel``flow-primary-action` 不能有 CSS `border``background``border-radius`
- [x] **Step 5: 删除 G04 并运行静态合同**
`pages.json` 删除 G04,删除其 Vue 文件;`full-page-visual-contract` 与 A03 路由测试的总数改为 56。运行:
```powershell
powershell -ExecutionPolicy Bypass -File tests/g03-create-flow-contract.ps1
powershell -ExecutionPolicy Bypass -File tests/full-page-visual-contract.ps1
powershell -ExecutionPolicy Bypass -File tests/a03-route-removal-contract.ps1
```
Expected: 全部 PASS。
### Task 4: 真实流程、截图、清理和交接
**Files:**
- Create: `tests/g03-create-flow-runtime-smoke.js`
- Create: `docs/design/screens/runtime/2026-07-14/G03-create-after-360x800.png`
- Create: `docs/design/screens/runtime/2026-07-14/G03-ancestor-after-360x800.png`
- Create: `docs/design/screens/runtime/2026-07-14/G03-ancestor-after-412x915.png`
- Modify: `docs/交接记录.md`
- Modify: `docs/规划.md`
- Modify: `docs/design/视觉设计交接手册.md`
- Modify: `docs/design/2026-07-14_页面与状态合并审计.md`
**Interfaces:**
- Consumes: G03 两步 URL、Chrome DevTools `9222`、当前 56 路由合同。
- Produces: 可复现的创建链路证据、准确的路线数与“G03 两步视觉等待用户确认”停点。
- [x] **Step 1: 写并运行真实 Chrome 冒烟测试**
依次验证:默认 G03 显示创建表单;填写姓氏与谱名并点击主动作后进入 G03 祖先步骤;刷新后祖先步骤仍在;填写首代姓名后进入 T01;直接访问默认 G03 仍是创建步骤。
- [x] **Step 2: 截图并审视**
使用相同 Chrome/视口截取两步;并排比较 G01 根页视觉基准与 G03 的纸纹、页头、面板和按钮。检查图片已加载、无黑角、无横向裁切、字段和主动作完整可达。
- [x] **Step 3: 同步当前状态**
更新文档为:G01 空态已获用户验收;G04 已合并为 G03 `step=ancestor`;当前独立路由 56 条;G03 两步已实现/截图/自动验证,等待用户审美确认;下一项是 G07→G06。
- [x] **Step 4: 完成回归**
Run:
```powershell
powershell -ExecutionPolicy Bypass -File tests/g03-create-flow-contract.ps1
node tests/g03-create-flow-runtime-smoke.js http://localhost:5173
powershell -ExecutionPolicy Bypass -File tests/full-page-visual-contract.ps1
powershell -ExecutionPolicy Bypass -File tests/compile-audit.ps1
powershell -ExecutionPolicy Bypass -File tests/g01-empty-state-contract.ps1
node tests/g01-empty-state-runtime-smoke.js http://localhost:5173
powershell -ExecutionPolicy Bypass -File tests/a01-a02-ui-contract.ps1
powershell -ExecutionPolicy Bypass -File tests/a04-registration-contract.ps1
powershell -ExecutionPolicy Bypass -File tests/a05-reset-password-contract.ps1
powershell -ExecutionPolicy Bypass -File tests/a06-auth-status-contract.ps1
git diff --check
```
Expected: 全部通过;`git diff --check` 只允许现有 CRLF 警告,不存在空白错误。
@@ -0,0 +1,215 @@
# G06 搜索流程合并 Implementation Plan
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** 将 G07 搜索结果收敛到 G06 的页面内三态,并保持搜索、无结果和申请入口可验证。
**Architecture:** `pages/genealogy/g06-search-genealogies.vue` 作为唯一流程拥有者,初始、加载、结果、无结果均由本地响应式状态切换;结果点选仅进入保留的 G08 路由。G07 文件和路由完全删除;公开检索是单步任务,直接在页面纸纹上放置独立的输入框与按钮位图,结果项复用现有 `GenealogyCard` 位图框架。
**Tech Stack:** uni-app、Vue 3 `<script setup>`、现有 mock `appApi`、PowerShell 静态契约、Chrome DevTools Protocol 冒烟测试、ImageGen 位图资产。
## Global Constraints
- 不改动 A01、A02、A04、A05、A06、G01、G03 已验收的可见效果。
- 不使用 CSS 绘制检索面板、结果卡、按钮、边框或装饰面;只定位完整位图资产和真实交互控件。
- 不执行 `git add``git commit``git push`、重置或 worktree 操作;保留现有未提交改动。
- 本轮完成后路由总数必须为 55,G07 不得保留兼容入口。
---
### Task 1: 写入并确认 G06 收敛契约(RED)
**Files:**
- Create: `tests/g06-search-flow-contract.ps1`
- Create: `tests/g06-search-flow-runtime-smoke.js`
**Interfaces:**
- Consumes: G06 路由、`g06-search-genealogies.vue`、新面板资产和 Chrome 调试端 `9222`
- Produces: 对 G06 唯一路由、四态、G08 导航、位图表面以及四条核心交互的可重复检查。
- [x] **Step 1: 写静态失败契约**
```powershell
if ($paths -contains 'pages/genealogy/g07-search-result') { throw 'G07 route must be removed' }
if (Test-Path $g07File) { throw 'G07 page file must be deleted' }
foreach ($required in @('const searchState = ref("initial")', 'searchState.value = "results"', 'searchState.value = "empty"', '/pages/genealogy/g08-join-application?genealogyId=', 'g06-search-input.png', 'g06-search-button.png', 'search-hero')) {
Assert-Contains $g06 $required "Missing G06 flow contract: $required"
}
```
- [x] **Step 2: 运行静态契约,确认因 G07 和新状态/资产尚不存在而失败**
Run: `powershell -ExecutionPolicy Bypass -File tests/g06-search-flow-contract.ps1`
Expected: FAIL,错误直接指向仍存在的 G07 或缺少的 G06 状态/资产。
- [x] **Step 3: 写运行时失败冒烟**
```js
await openG06(send)
await waitFor(send, "Boolean(document.querySelector('.search-initial'))", 'G06 initial state did not render')
if (await valueOf(send, "Boolean(document.querySelector('.genealogy-card'))")) throw new Error('G06 initial state must not reveal a result card')
await setSearchKeyword(send, '汤')
await waitFor(send, "Boolean(document.querySelector('.genealogy-card'))", 'G06 matching search did not render a result card')
await setSearchKeyword(send, '不存在的家谱')
await waitFor(send, "Boolean(document.querySelector('.search-empty'))", 'G06 empty search state did not render')
```
- [x] **Step 4: 运行冒烟,确认因初始态选择器尚不存在而失败**
Run: `node tests/g06-search-flow-runtime-smoke.js http://localhost:5173`
Expected: FAIL with `G06 initial state did not render`
### Task 2: 制作并验证 G06 独立检索资产
**Files:**
- Create: `static/assets/modules/genealogy/opaque/g06-search-input.png`
- Create: `static/assets/modules/genealogy/opaque/g06-search-button.png`
- Modify: `docs/design/P00_页面结构与资产清单.md`
**Interfaces:**
- Consumes: G03 已确认的暖象牙、古金与淡墨设计语言。
- Produces: 720×248 的独立输入皮肤、300×132 的独立按钮皮肤;两张资产均四角不透明。
- [x] **Step 1: 用 ImageGen 生成没有文字的输入与按钮位图**
提示词必须要求:输入和按钮以独立完整位图生成;不得出现文字、输入内容、设备框、水印或透明角。
- [x] **Step 2: 将生成结果规范为 1122×820 PNG 并检查四角 alpha**
```powershell
$bitmap = [System.Drawing.Bitmap]::FromFile('static/assets/modules/genealogy/opaque/g06-search-input.png')
if ($bitmap.Width -ne 720 -or $bitmap.Height -ne 248) { throw 'Unexpected G06 input size' }
if (@($bitmap.GetPixel(0,0).A, $bitmap.GetPixel(719,0).A, $bitmap.GetPixel(0,247).A, $bitmap.GetPixel(719,247).A) | Where-Object { $_ -ne 255 }) { throw 'G06 input corners must be opaque' }
```
- [x] **Step 3: 登记资产的语义、尺寸、引用位置和状态**
在 P00 的资产清单中写入 `modules/genealogy/opaque/g06-search-input.png``g06-search-button.png` 两条正式路径,标明分别由真实输入和真实搜索动作使用。
### Task 3: 以最小实现合并 G07 到 G06GREEN
**Files:**
- Modify: `pages/genealogy/g06-search-genealogies.vue`
- Modify: `pages.json`
- Delete: `pages/genealogy/g07-search-result.vue`
**Interfaces:**
- Consumes: `appApi.getPublicGenealogies()` 返回的 `name``surname``location``id``GenealogyCard``genealogy``role``select` 接口。
- Produces: `.search-initial``.search-results``.search-empty` 运行时节点和 G08 导航。
- [x] **Step 1: 将 G06 默认结果清空,数据加载仅完成数据准备**
```js
const keyword = ref('')
const allResults = ref([])
const results = ref([])
const searchState = ref('initial')
onMounted(async () => {
searchState.value = 'loading'
allResults.value = await appApi.getPublicGenealogies()
searchState.value = 'initial'
})
```
- [x] **Step 2: 只在提交时筛选并切换结果/无结果状态**
```js
const search = () => {
const value = keyword.value.trim()
results.value = value
? allResults.value.filter((item) => `${item.name}${item.surname}${item.location}`.includes(value))
: allResults.value
searchState.value = results.value.length ? 'results' : 'empty'
}
const openApply = (genealogy) => uni.navigateTo({ url: `/pages/genealogy/g08-join-application?genealogyId=${genealogy.id}` })
```
- [x] **Step 3: 以位图面板承载输入区,复用题签结果卡**
模板包含 `search-hero`、独立的输入/按钮位图、真实 `<input>`、真实点击层、初始/加载/无结果文案和 `GenealogyCard role="可申请"`。相应 CSS 只负责布局、层级、文字和尺寸;`.search-field``.search-action` 不得写 `background``border``border-radius`
- [x] **Step 4: 从 `pages.json` 删除 G07 并物理删除 G07 页面文件**
删除唯一 `pages/genealogy/g07-search-result` 条目和 `pages/genealogy/g07-search-result.vue`,不添加重定向。
- [x] **Step 5: 运行新契约和冒烟测试,确认转绿**
Run: `powershell -ExecutionPolicy Bypass -File tests/g06-search-flow-contract.ps1`
Expected: `G06-SEARCH-FLOW-CONTRACT PASS`
Run: `node tests/g06-search-flow-runtime-smoke.js http://localhost:5173`
Expected: `G06-SEARCH-FLOW-RUNTIME-SMOKE PASS`
### Task 4: 同步全局契约、文档与视觉证据
**Files:**
- Modify: `tests/full-page-visual-contract.ps1`
- Modify: `tests/a03-route-removal-contract.ps1`
- Modify: `docs/交接记录.md`
- Modify: `docs/规划.md`
- Modify: `docs/design/视觉设计交接手册.md`
- Modify: `docs/design/P00_页面结构与资产清单.md`
- Modify: `docs/design/2026-07-14_页面与状态合并审计.md`
- Create: `docs/design/screens/runtime/2026-07-14/G06-initial-after-360x800.png`
- Create: `docs/design/screens/runtime/2026-07-14/G06-results-after-360x800.png`
- Create: `docs/design/screens/runtime/2026-07-14/G06-empty-after-360x800.png`
- Create: `docs/design/screens/runtime/2026-07-14/G06-results-after-412x915.png`
**Interfaces:**
- Consumes: 删除 G07 后的 55 条 `pages.json` 路由和 G06 三态截图。
- Produces: 当前路由数、G03 已通过状态和下一项 T02→T01 的准确交接记录。
- [x] **Step 1: 将全量路由数组和计数更新为 55**
`tests/full-page-visual-contract.ps1` 的预期数组删除 G07;两个契约都将 `56` 改为 `55`,并把说明改为已完成的三次合并。
- [x] **Step 2: 截取并逐张审视 G06 初始、有结果、无结果与 412×915 结果状态**
```powershell
node scripts/capture-chrome-page.js "http://localhost:5173/#/pages/genealogy/g06-search-genealogies" ".search-page" "docs/design/screens/runtime/2026-07-14/G06-initial-after-360x800.png" 360 800
```
结果和无结果截图由 Chrome 调试执行真实输入后取得;检查无黑角、无裁切、面板与题签框完整,且初始态没有结果卡。
- [x] **Step 3: 更新当前交接文档**
写明 G03 已获用户继续授权、G07 已合并到 G06、当前为 55 路由,下一项为 T02→T01;历史计划不做回写。
- [x] **Step 4: 运行相关全量静态契约、冒烟、截图检查和 Git 空白检查**
```powershell
Get-ChildItem tests -Filter *.ps1 | ForEach-Object { powershell -ExecutionPolicy Bypass -File $_.FullName }
node tests/g06-search-flow-runtime-smoke.js http://localhost:5173
node tests/g03-create-flow-runtime-smoke.js http://localhost:5173
node tests/g01-empty-state-runtime-smoke.js http://localhost:5173
git diff --check
```
Expected: 所有测试通过,`git diff --check` 仅可出现既有 CRLF 警告且退出码为 0。
## Plan Self-Review
- 覆盖性:四个任务分别覆盖契约、位图资产、G06/G07 收敛、文档和完成前验证。
- 无占位项:状态名、路由、资产路径、选择器和验证命令均已明确。
- 边界:不触及 G08 实现、其他合并项或已验收可见效果;Git 操作由用户保留。
### Task 5: 用户审视后的 G06 控件层级修正
- [x] 复现并确认:绝对定位的面板纸纹覆盖了静态 `PageHeader`,且输入槽和动作槽被烘焙在同一张背景中,造成不可交互的截图感。
- [x] 先将“可见页头、独立输入皮肤、独立按钮皮肤”写入 `tests/g06-search-flow-contract.ps1`,确认契约因缺少新结构而失败。
- [x] 以 ImageGen 制作过无控件的面板版本并制作独立 `g06-search-input.png``g06-search-button.png`;视觉审视后确认大型面板仍有设计稿感,已删除该短期资产,最终只保留两张独立控件位图。
- [x]`PageHeader` 包入高层级容器;在独立输入/按钮位图上叠放真实输入与点击控件,不改 G06 状态、筛选或 G08 跳转行为。
- [x] 截取并审视 `G06-correction-after-initial-360x800.png``G06-correction-after-results-360x800.png``G06-correction-after-empty-360x800.png` 和前后对比图;运行 G06 静态契约与 Chrome 冒烟。
### Task 6: 用户选定第 3 稿后的 G06 题签收尾(在用户要求停止时暂停)
- [x] 根据用户选择的最近 ImageGen 第 3 稿,写入/更新 G06 静态契约,要求朱砂题签、宽输入框、独立按钮和真实品牌谱印。
- [x] 新增 `g06-search-title-strip.png``g06-search-input-wide.png`,在 Vue 中用项目 `brand-seal.png` 覆盖题签的通用印玺;不改搜索状态、筛选和 G08 跳转。
- [x] 运行 G06 静态契约和 Chrome 运行冒烟,并保存最后候选的初始态运行图:`docs/design/screens/runtime/2026-07-14/G06-selected-strip-final-initial-360x800.png`
- [ ] 重新截取并审视最后候选的结果态与无结果态;请求用户对 G06 三态作最终审美确认。**用户已要求停止当前工作并转交到另一台电脑,禁止擅自继续。**
@@ -0,0 +1,176 @@
# 移除 A03 重复认证页实施计划
> **For agentic workers:** REQUIRED SUB-SKILL: Use `superpowers:executing-plans` to implement this plan task-by-task in the current workspace. 用户明确禁止子代理、worktree、Git 暂存、提交、推送与上传;不使用 `subagent-driven-development`。
**Goal:** 删除重复的 A03 手机验证码页,让 A02 的短信 Tab 成为唯一手机号验证码登录入口,并把最终路由合同从 59 条收敛到 58 条。
**Architecture:** `pages/auth/a02-login.vue` 已是短信登录的唯一所有者,不改动其可见效果。删除 A03 页面文件、路由声明和临时 `pageCatalog` 条目;页面清单只由 `tests/full-page-visual-contract.ps1` 管理,并在同轮改为 58 条。个人中心绑定手机号和真实微信授权均不在本轮实现。
**Tech Stack:** uni-app Vue 3、PowerShell 契约审计、Chrome DevTools 截图、Git 只读检查。
## Global Constraints
- A01、A02、G01 的可见效果已获用户验收,禁止修改。
- A02 的短信 Tab 是手机号验证码登录的唯一入口;A03 不保留重定向、兼容入口或重复表单。
- 绑定手机号以后属于个人中心安全设置;微信授权取消、失败、受限以后属于 A06。
- 不新增真实短信、微信授权、登录、注册或后端接口,不生成新视觉资产。
- 不执行 `git add``git commit``git push`、上传、reset 或 worktree 操作。
---
### Task 1: 先固化 A03 删除合同,再移除运行时入口
**Files:**
- Create: `tests/a03-route-removal-contract.ps1`
- Modify: `tests/full-page-visual-contract.ps1`
- Modify: `pages.json`
- Modify: `data/page-catalog.js`
- Delete: `pages/auth/a03-mobile-verify.vue`
**Interfaces:**
- Consumes: `pages.json` 的最终路径数组、`data/page-catalog.js` 的临时母版条目。
- Produces: 58 条最终路由;不存在 `pages/auth/a03-mobile-verify``a03` 目录条目或 A03 页面文件。
- [x] **Step 1: 写失败的 A03 删除合同。**
创建 `tests/a03-route-removal-contract.ps1`
```powershell
$ErrorActionPreference = 'Stop'
$root = Split-Path -Parent $PSScriptRoot
$pages = Get-Content -LiteralPath (Join-Path $root 'pages.json') -Raw -Encoding utf8 | ConvertFrom-Json
$catalog = Get-Content -LiteralPath (Join-Path $root 'data/page-catalog.js') -Raw -Encoding utf8
$a03File = Join-Path $root 'pages/auth/a03-mobile-verify.vue'
if ($pages.pages.path -contains 'pages/auth/a03-mobile-verify') { throw 'A-03 must not remain in pages.json' }
if (Test-Path -LiteralPath $a03File) { throw 'A-03 page file must be deleted' }
if ($catalog -match '(?m)^\s*a03\s*:') { throw 'A-03 catalog entry must be deleted' }
if ($pages.pages.Count -ne 58) { throw "Expected 58 final routes, found $($pages.pages.Count)." }
Write-Output 'A03-ROUTE-REMOVAL-CONTRACT PASS'
```
`tests/full-page-visual-contract.ps1` 中删除 `'pages/auth/a03-mobile-verify'`,并把 `59` 改为 `58`
- [x] **Step 2: 运行并确认红灯。**
运行:
```powershell
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a03-route-removal-contract.ps1
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/full-page-visual-contract.ps1
```
预期:前者报告 A03 仍在 `pages.json`;后者报告期望 58 条、实际 59 条。
- [x] **Step 3: 最小删除旧合同。**
`pages.json` 删除整个对象:
```json
{
"path": "pages/auth/a03-mobile-verify",
"style": { "navigationStyle": "custom" }
}
```
`data/page-catalog.js` 删除整个 `a03` 单行对象,并删除 `pages/auth/a03-mobile-verify.vue`。不修改 A01、A02、A04--A06 文件。
- [x] **Step 4: 运行绿灯合同。**
运行:
```powershell
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a03-route-removal-contract.ps1
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/full-page-visual-contract.ps1
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/compile-audit.ps1
```
预期:依次输出 `A03-ROUTE-REMOVAL-CONTRACT PASS``FULL-PAGE-VISUAL-CONTRACT PASS``PASS compile audit`
### Task 2: 同步当前产品事实与旧任务边界
**Files:**
- Modify: `docs/规划.md`
- Modify: `docs/交接记录.md`
- Modify: `docs/design/视觉设计交接手册.md`
- Modify: `docs/design/A01_启动登录引导_设计记录.md`
- Modify: `docs/design/A02_账号登录_设计记录.md`
- Modify: `docs/superpowers/specs/2026-07-14-a02-agreement-control-design.md`
- Modify: `docs/superpowers/plans/2026-07-14-a02-agreement-control.md`
- Modify: `docs/superpowers/plans/2026-07-13-product-design-visual-refinement.md`
**Interfaces:**
- Consumes: `docs/superpowers/specs/2026-07-14-remove-a03-redundant-auth-route-design.md` 的已确认决策。
- Produces: 当前规划、交接和认证设计记录都只把 A02 视为验证码登录入口,并声明 A03 已删除、绑定手机号归个人中心、微信异常归 A06。
- [x] **Step 1: 更新当前范围和计数。**
`docs/规划.md` 中把最终路由数从 59 改为 58,删除 A-03 清单项,把账户模块范围改为 A01、A02、A04--A06,并把下一步改为 A04。
`docs/交接记录.md` 中把“下一步审视 A03”改为“下一步审视 A04”,并明确 A03 已删除、A02 短信 Tab 唯一承接验证码登录。
- [x] **Step 2: 更新认证职责说明。**
在交接手册和 A01/A02 设计记录中把“验证码/微信回跳归 A03”改为:验证码归 A02;微信授权取消、失败、受限归 A06;绑定手机号归个人中心后续独立页。A01 保持当前微信待接入提示,不新增跳转。
- [x] **Step 3: 标记旧 A03 计划已被取代。**
在列出的日期计划和规格中保留历史执行事实,但在开头加入一行:
```markdown
> 现行范围更新:A03 已于 2026-07-14 删除;验证码登录归 A02,绑定手机号归个人中心,微信异常归 A06。历史方案不再作为实现依据。
```
`2026-07-13-product-design-visual-refinement.md` 的认证任务中删除 A03 文件和截图要求,任务名称改为“完成认证模块 A04--A06”。
- [x] **Step 4: 文档引用审计。**
运行:
```powershell
rg -n --glob '!unpackage/**' "a03-mobile-verify|A-03.*手机验证|A03.*手机号验证码" docs pages.json data tests
```
预期:没有当前范围、运行时路径或测试合同仍把 A03 定义为手机号验证码登录;日期历史文档只有明确的“现行范围更新”说明。
### Task 3: 验证 A02 唯一入口与冻结页回归
**Files:**
- Create: `docs/design/screens/runtime/2026-07-14/A02-sms-tab-after-a03-removal-360x800.png`
- Modify: `docs/design/A02_账号登录_设计记录.md`
- Modify: `design-qa.md`
**Interfaces:**
- Consumes: `scripts/capture-chrome-page.js``sms-tab` 动作与 A02 已验收的短信 Tab。
- Produces: A02 短信 Tab 是唯一验证码登录入口的运行时证据;A01/A02 不发生可见回退。
- [x] **Step 1: 捕获并审视 A02 短信 Tab。**
运行:
```powershell
node scripts/capture-chrome-page.js "http://localhost:5173/#/pages/auth/a02-login" ".auth-page" "docs/design/screens/runtime/2026-07-14/A02-sms-tab-after-a03-removal-360x800.png" 360 800 sms-tab
```
打开保存的 PNG,接受条件:祠堂头、卷轴面板、手机号和验证码输入行、获取验证码、朱砂登录按钮均完整;不得出现 A03、CSS 通用表单卡、黑块或半渲染。
- [x] **Step 2: 记录迁移事实。**
在 A02 设计记录和 `design-qa.md` 增加本轮事实:A02 短信 Tab 是唯一入口;A03 重复页已删除;本轮截图已检查。A02 保持 `accepted`,不重新打开其视觉验收。
- [x] **Step 3: 运行最终验证。**
运行:
```powershell
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a03-route-removal-contract.ps1
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a01-a02-ui-contract.ps1
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a02-register-entry-contract.ps1
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/capture-chrome-page-contract.ps1
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/compile-audit.ps1
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/full-page-visual-contract.ps1
git diff --check
```
预期:所有 PowerShell 脚本输出 PASS`git diff --check` 没有真实空白错误。最后报告 A03 已删除、A02 截图已审视,以及 A04 是下一步待审视页面;不声明 A04--A06 已完成。
@@ -0,0 +1,37 @@
# T01 世系树状态收敛 Implementation Plan
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** 将 T02 小屏、空数据和失败提示收敛进 T01,保留世系节点交互并以位图资产替代 CSS 表面。
**Architecture:** T01 读取 `state``genealogyId`,由一个 `treeState` 唯一管理四种同页状态。T02 文件与路由删除;所有节点/画布/底部信息表面由三个不透明位图承载。
**Tech Stack:** uni-app、Vue 3、现有 mock `appApi`、ImageGen、PowerShell 静态契约、Chrome DevTools Protocol 冒烟。
## Global Constraints
- 仅修改 T01/T02 收敛涉及的文件,不触碰已验收页面可见效果。
- 位图承载完整画布、节点、信息条、边框和装饰;CSS 只负责布局、文字、状态与交互。
- 不执行 Git 暂存、提交、推送、重置或 worktree 操作。
### Task 1: TDD 契约(RED
- [ ] 创建 `tests/t01-tree-state-contract.ps1``tests/t01-tree-state-runtime-smoke.js`
- [ ] 静态契约要求 T02 路由/文件不存在,T01 含 `tree|landscape|empty|error`、三张位图、T03/T04 跳转和无 CSS 表面;运行冒烟要求三种查询状态及 `genealogyId=1001` 节点跳转。
- [ ] 运行两个新测试,确认当前实现因 T02 仍存在和 T01 缺少状态节点而红灯。
### Task 2: 位图资产
- [ ] 用 ImageGen 生成 1122×1320 不透明 `t01-tree-canvas.png`、280×228 不透明 `t01-member-node.png`、1122×280 不透明 `t01-member-sheet.png`;均检查尺寸和四角 alpha。
- [ ] 在 P00 登记路径、用途、尺寸、T01 引用与不透明属性。
### Task 3: T01 同页状态与 T02 删除(GREEN
- [ ] 修改 `pages/tree/t01-tree-overview.vue`:加载后由状态和真实成员确定 `treeState`;画布、节点、信息条使用新位图;保留原有 T03/T04/T06/T07 跳转。
- [ ]`pages.json` 删除 `pages/tree/t02-tree-states`,删除 `pages/tree/t02-tree-states.vue`,移除 `data/page-catalog.js``t02`
- [ ] 运行新契约和运行冒烟转绿。
### Task 4: 收口
- [ ] 全量路由契约和 A03 路由计数更新为 54;当前文档同步 T02→T01 已完成、G06 仍待审美确认。
- [ ] 截图并审视 T01 tree/landscape/empty/error、412×915 tree;运行全部静态契约、相关冒烟和 `git diff --check`
@@ -0,0 +1,38 @@
# A02 协议确认控件设计
> 状态:用户已确认方案并验收 A02;本文件只保留本轮已完成的 A02 调整记录。
## 目标
让直接进入 A02 的用户能在当前登录页完成协议确认,替换“请先在登录引导页阅读并确认协议”的被动提示,同时保持 A01 已验收的可见效果与既有入口行为不变。
## 范围与边界
- 只修改 A02 账号登录、其最小契约、两枚认证模块透明状态图标、A02 文字注册入口、相应资产台账和 A02 设计记录。
- A01 的页面结构、视觉、协议勾选、`agreed=1` 跳转和拦截行为均不改动。
- 不新建协议正文路由;《用户协议》《隐私政策》沿用当前“协议页面准备中”的提示行为。
- A03 已删除;A02 已验收。后续 A04--A06 必须各自审视与验收,不把 A02 表单直接复制过去。
## A02 交互合同
1. A02 的 `agreed` 是 A02 提交前协议状态的唯一所有者。
2. `agreed=1` 只作为从 A01 进入时的初始已同意值;直接进入 A02 时默认未同意。
3. 登录按钮下方提供整行可点击的协议确认控件。点击行切换状态,点击协议名称不切换状态。
4. 未同意时提交提示“请先阅读并同意相关协议”,不再要求返回 A01;已同意后保留既有账号密码、短信登录校验和登录待接入提示。
5. 协议行下方提供“还没有账号? 注册账号”入口;仅“注册账号”可点,且直接进入既有 A04,不以协议状态或新接口阻断新用户。
## 视觉与资产合同
- 控件位于 A02 卷轴面板内、登录按钮下方,使用至少 88rpx 高的点击区和不小于 24rpx 的正文。
- 未选中和选中图标分别使用 `static/assets/modules/auth/transparent/a02-agreement-unchecked.png``a02-agreement-checked.png`
- 图标为 96 × 96 的 RGBA PNG,四角透明;显示时只承担图标,不用 CSS 绘制圆环、勾号或底色。
- 文本与链接位于 Vue 文字层,保留项目既有墨褐与朱砂层级;不把文字烘焙进图标。
- 注册入口是无底色、无边框的文字导航,不伪造为 CSS 按钮,也不新增视觉资产;“注册账号”保持至少 88rpx 高的触点。
## 验收
- 最小 UI 契约先红后绿,覆盖 A02 协议行、两枚图标、初始状态、切换、当前页拦截与旧提示移除。
- 资产审计验证两枚图标存在、尺寸、RGBA 与透明角。
- 运行 A02 相关审计、编译审计、全路由合同;用 Chrome 截取 A02 未选中与 `agreed=1` 选中状态,并验证注册入口实际到达 A04。
- 截图脚本每次必须确认目标 URL 并创建新文档后再等待图片,不能复用同一路由遗留的 Vue 状态作为视觉证据。
- `design-qa.md` 已标记 `accepted`;A02 不再阻塞后续页面,但其可见效果保持冻结。
@@ -0,0 +1,40 @@
# A04 注册账号设计
> 状态:用户已于 2026-07-14 视觉验收通过;A04 可见效果冻结。本规格据已验收 A01、A02、G01 与 A04 真实运行截图制定。
## 目标
将 A04 从通用表单壳改为独立的账号注册页,让新用户在统一的家祠认证场景中完成手机号、密码确认与协议确认,并能回到 A02 登录。
## 2026-07-14 视觉平衡修订
本轮真实运行截图审视限定在 A04 的 360×800 与 412×915 窄屏。问题不是资产,而是登录页的短标签规格被直接用于“设置密码”“确认密码”:`126rpx` 标签列不足以留出文字与占位提示的间距;居中的“填写信息,开启家族记忆”不承担操作作用,却挤占了表单的视觉呼吸。
修订只作用于 A04:移除这句冗余引导,以现有 `auth-divider-knot.png` 位图在标题与表单之间建立有意图的分隔;标签列扩至 `154rpx`,保持三项输入、主按钮、协议、登录回流以及已选的位图面板不变。A01、A02、G01 不触碰;不生成新资产,不以 CSS 伪造装饰面。
## 视觉与结构
1. 顶部复用 A02 已验收的朱砂祠堂头和谱印,不改变 A01/A02/G01。
2. 正文使用既有 `a02-login-panel.png` 完整不透明卷轴面板;不创建 CSS 卡片、边框或按钮表面。
3. 面板标题为“注册账号”,副标题为“创建属于你的家谱账号”;设置返回动作。
4. 表单依次为手机号、设置密码、确认密码。使用真实 `input`,密码字段隐藏输入。
5. 主按钮使用已验收 `a01-primary-button.png`,文字为“注册账号”。
6. 主按钮下方放 A02 同款本页协议确认行;下方提供“已有账号? 登录”文字回流,其中“登录”跳转 A02。
## 交互合同
- A04 的 `agreed` 是注册提交前协议状态的唯一所有者,初始未同意;协议名称仍只显示“协议页面准备中”提示,不新增协议正文路由。
- 未同意协议、手机号无效、密码为空、两次密码不一致分别在当前页显示对应 toast;字段有效时显示“注册服务待接入”。
- “登录”只跳转 `/pages/auth/a02-login`;不接入真实注册、短信、微信或后端接口。
## 资产与边界
- 复用 A02 完整卷轴面板、A01 主按钮和 A02 两枚透明协议图标;现有资产完整,不使用 ImageGen。
- A04 从 `ModulePage``pageCatalog` 中移出,成为独立 Vue 页面。
- A01、A02、A04、G01 的可见效果冻结;若用户提出 A04 的新明确意见,必须先重新截图审视,再只修正被指出的范围。
## 验收
- 先写失败的 A04 契约,覆盖独立页面、完整位图面板/按钮、三项输入、协议状态、A02 回流、校验与禁止 CSS 伪造。
- 使用 Chrome 捕获并审视 360×800、412×915;小屏允许纵向滚动,不允许横向裁切、黑块或半渲染。
- 运行 A04 契约、A01/A02 契约、资产审计、编译审计、全路由合同与 `git diff --check`
@@ -0,0 +1,33 @@
# A05 重置密码设计
> 状态:用户已于 2026-07-14 视觉验收通过;A05 可见效果冻结。本规格以 A01、A02、A04、G01 与 A05 的已验收可见效果和本轮 A05 真实运行截图为依据。
## 目标
把 A05 从 `ModulePage` 通用白卡壳改为独立的认证页,让用户清楚完成“手机验证后重设密码”,并能返回 A02 登录。它只提供可审计的本地交互,不接真实短信或后端。
## 审视结论与选择
当前 360×800、412×915 截图中的 A05 具备手机号、验证码、新密码和确认按钮,但暴露内部编号 A-05、没有获取验证码动作、缺少确认密码,且通用白卡不属于已验收的认证场景。
本轮采用完整验证流程,而不是三字段简版或多步流程:在一张完整卷轴面板中依次放手机号、验证码(右侧“获取验证码”)、新密码、确认新密码;主按钮为“确认重设”,下方保留低强调的“想起密码了? 返回登录”。四项填写虽比简版多一行,但能在本页防止密码误输,也不引入新的路由、状态机或位图资产。
## 视觉与资产
1. 复用认证页纸纹、淡墨山水、朱砂祠堂头、谱印、完整卷轴面板、完整朱砂主按钮、标题祥云、结饰和返回箭头。
2. 标题为“重设密码”,副标题为“验证手机号后重新设置登录密码”;不显示 A-05 等内部编号。
3. 卷轴面板、主按钮和装饰面全部由既有位图承担,CSS 只处理布局、文字、输入和状态;不使用 ImageGen,因为资产已完整。
4. A01、A02、A04、G01 可见效果冻结;仅修改 A05,并从 `pageCatalog` 中移除 A05 临时入口。
## 交互合同
- 本页状态只有 `phone``verificationCode``password``confirmPassword`
- “获取验证码”只显示“验证码功能待接入”;不请求短信服务。
- 提交依次校验 11 位手机号、6 位验证码、密码非空、两次密码一致;依次显示对应当前页 toast,均通过时显示“密码重设服务待接入”。
- “返回登录”跳转 `/pages/auth/a02-login`;返回箭头执行 `uni.navigateBack()`
## 验收
- 先写失败的 A05 契约,覆盖独立页面、完整位图面板/按钮、四项输入、验证码动作、校验、A02 回流、移除目录项及禁止 CSS 伪造。
- 以 Chrome 捕获 360×800、412×915,审视标题、四项表单、验证码动作、按钮、登录回流和窄屏滚动;不得有横向裁切、黑块或通用白卡。
- 完成前运行 A05 契约、A01/A02/A04 保护回归、A03 移除、资产、截图、编译、全页契约及 `git diff --check`
@@ -0,0 +1,41 @@
# A06 登录状态设计规格
## 目标
将 A06 从通用 `ModulePage` 卡片替换为与 A02/A04/A05 一致的独立认证状态页,清晰承接登录未完成、登录失败、账号受限、注册未完成、微信授权取消和微信授权失败。
## 已审视的真实界面
- 入口:`http://localhost:5173/#/pages/auth/a06-auth-status`
- 基线截图:`docs/design/screens/runtime/2026-07-14/A06-before-360x800.png``docs/design/screens/runtime/2026-07-14/A06-before-412x915.png`
- 结论:现页是白色通用卡片、CSS 红色方形徽章和被压缩的按钮,既没有认证页面的卷轴与朱砂语言,也无法明确表达可执行的下一步。
## 状态合同
唯一入口仍是 `/pages/auth/a06-auth-status`H5 路由以 `?status=` 选择状态,未知值回落到 `normal`。不新增页面或路由。
| status | 主文案 | 主操作 | 次操作 |
| --- | --- | --- | --- |
| `normal` | 登录未完成 | 返回登录 | 无 |
| `failed` | 登录失败 | 返回登录 | 无 |
| `restricted` | 账号暂时受限 | 查看帮助(本地提示) | 返回登录 |
| `register-pending` | 注册尚未完成 | 继续注册 | 返回登录 |
| `wechat-cancelled` | 微信授权已取消 | 返回登录 | 无 |
| `wechat-failed` | 微信授权失败 | 返回登录 | 无 |
“查看帮助”仅展示“账号申诉功能待接入”的本地提示;不伪造客服、申诉、短信或后端能力。继续注册跳转 A04,返回登录跳转 A02。手机号绑定仍属于后续个人中心安全设置,本轮不涉及。
## 视觉与资产
- 页面壳复用 `auth-page-paper.png``auth-ink-scenery.png``auth-header.png``brand-seal.png`
- 内容面板、完整主按钮、标题云纹、分隔结与返回箭头分别复用 `a02-login-panel.png``a01-primary-button.png``auth-title-cloud.png``auth-divider-knot.png``chevron-right.png`
- 状态识别复用现有透明位图 `auth-login-outline.png`
- 不生成新图:现有认证资产已完整覆盖页面壳、面板、按钮和装饰面。不得用 CSS 绘制完整卡片、按钮、边框或状态图形。
## 范围与验收
- 不修改已验收并冻结的 A01、G01、A02、A04、A05 可见效果。
- 先新增失败的 A06 源码契约,再实现页面。
- 在 360×800、412×915 的真实 Chrome 截图核对默认态;另核对 `restricted` 状态的文案与操作。
- 完成前运行 A06 契约、受影响回归、编译审计、全页契约和 `git diff --check`
- 用户已于 2026-07-14 明确确认 A06;其可见效果现已冻结,后续开始 G02 时不得修改。
@@ -0,0 +1,47 @@
# G03 创建家谱流程收敛设计规格
## 背景与用户确认
页面与状态合并审计已判定 G04“始祖录入”是 G03“创建家谱”的后续步骤,不是可独立进入的主任务。用户于 2026-07-14 确认 G01 空状态通过,并要求继续推进已确认的收敛方案;本规格直接执行 G04→G03,不再重复请求审批。
## 目标
将创建家谱与录入首代人物收敛为唯一的 `pages/genealogy/g03-create-genealogy` 路由,以 `step=create|ancestor` 表示两步流程;删除 G04 路由和页面,同时保留原有的字段、校验、数据创建、家谱上下文和跳转至世系树的行为。
## 真实画面审视
本轮基线截图:
- `docs/design/screens/runtime/2026-07-14/route-audit/G03-before-360x800.png`
- `docs/design/screens/runtime/2026-07-14/route-audit/G04-before-360x800.png`
两页都使用相同的普通返回页头、圆角 CSS 表单卡和固定 CSS 红色底部按钮。它们的任务与结构连续,但视觉层级过于通用,且完整卡片、页头和按钮面由 CSS 构造,不符合当前位图资产规则。
## 方案与取舍
1. **推荐:G03 同路由双步骤。** `step=create` 提交成功后跳转 G03 的 `step=ancestor&genealogyId=…`;始祖提交成功后跳转 T01。路由数量从 57 变为 56,浏览器返回可回到创建步骤。采用 G01 的暖宣纸、朱砂页头和淡墨山水,表单卡使用完整不透明位图皮肤。
2. 保留 G04 仅复用视觉组件。开发量较小,但仍有两个路由承载同一创建任务,不符合已确认的页面收敛目标。
3. 两步放进同一页的本地切换而不更新 URL。实现更短,但无法深链或刷新恢复始祖录入步骤,且不利于契约测试;不采用。
## 视觉与资产
- 复用 G01 已验收的 `page-paper.jpg``footer-mountain-bamboo.png``root-header-cinnabar.jpg`、返回箭头和 `a01-primary-button.png`
- 当前仓库没有能承载家谱创建表单完整金线边框、角饰与下沿淡墨景的位图,因此使用 ImageGen 生成一个不透明的 `static/assets/modules/genealogy/opaque/g03-create-flow-panel.png`。它仅承载暖宣纸底、双古金线边框、回纹角饰、极淡云纹和底部淡墨山水;不包含文字、按钮、Logo 或透明区域。
- G03 的局部文字、字段控件和状态提示由 Vue/CSS 布局;面板、页头和按钮的完整视觉面必须是图片,不能以 CSS 绘制边框、背景或圆角。
- 创建步骤与始祖步骤共用同一面板皮肤,以保持流程连续;两步标题与输入内容不同。
## 路由与行为合同
- 仅保留 `pages/genealogy/g03-create-genealogy`;从 `pages.json` 删除 G04,删除 `pages/genealogy/g04-first-ancestor.vue`,不留兼容入口。
- `step=create` 是默认值。缺失或未知 `step` 统一回到创建步骤。
- 创建步骤仍要求姓氏与谱名;成功后调用 `appApi.createGenealogy`、写入 `genealogyContext`,跳转 `?step=ancestor&genealogyId=<id>`
- 始祖步骤从查询参数或 `genealogyContext` 读取家谱 ID,仍要求首代姓名;成功后调用 `appApi.createPerson` 并跳转 T01。
- 始祖步骤的返回操作回到 G03 默认创建步骤;默认创建步骤沿用 `uni.navigateBack()`
## 验证
1. 先写 G03 流程收敛契约,并确认其在 G04 仍存在时失败。
2. 静态契约检查唯一 G03 路由、G04 删除、两步 URL、两组校验/数据调用、位图资产与禁止 CSS 视觉面。
3. Chrome 运行时冒烟:填写创建页,真实进入始祖步骤;填写始祖,真实进入 T01;刷新带参数 URL 仍显示始祖步骤;默认 G03 仍显示创建步骤。
4. 截图 360×800、412×915;把 G03 默认态与已验收 G01 视觉基准并排审视,检查无黑角、横向裁切、图片未加载或固定按钮遮挡。
5. 运行受影响路由、资产、编译、A01/A02/A04/A05/A06/G01 回归与 `git diff --check`
@@ -0,0 +1,45 @@
# G06 公开家谱搜索流程合并设计
## 背景与依据
- 用户已授权继续推进,并已将 G03 双步骤流程视为通过;G01、G03 与认证页的已验收可见效果不在本轮改动范围内。
- 真实运行基线已保存为 `docs/design/screens/runtime/2026-07-14/route-audit/G06-before-360x800.png``G07-before-360x800.png`
- 基线审视发现:G06 在尚未搜索时直接展示一条结果;G07 使用另一套通用列表壳。两页实际是同一条“查找—得到结果—申请加入”的连续旅程。
## 选择的方案
采用单一 G06 路由、页面内三态的方案:
1. 初始态:仅显示检索提示与输入控件,不预先泄露公开家谱结果。
2. 有结果态:输入并提交后显示匹配的 `GenealogyCard` 列表;点选任一条仅跳转既有 G08 申请页,并携带 `genealogyId`
3. 无结果态:输入无匹配条件时,在同一页面显示明确的无结果说明与重新检索引导。
不保留 G07 兼容路由、跳转或占位页面。G07 的“结果列表”语义由 G06 的有结果态唯一拥有。
曾考虑保留 G07 作为可深链结果页,以及让 G06 默认展示热门家谱。前者重复了同一任务并增加路由;后者会让“尚未搜索”和“已搜索”混淆,均不采用。
## 视觉与交互
- G06 继续使用现有 `PageHeader``page-paper.jpg``footer-mountain-bamboo.png``GenealogyCard` 的已登记资产,不改动已验收页面。
- G06 顶部的 `PageHeader` 必须高于纸纹底图。公开检索是单步任务,不使用大型检索面板;用户最后选定「朱砂题签 + 宽输入框 + 搜索按钮」方向:`g06-search-title-strip.png`1122×220)、`g06-search-input-wide.png`1120×248)和 `g06-search-button.png`(300×132)作为独立完整表面直接置于页面纸纹。题签中的实际谱印必须叠放项目 `brand-seal.png`,不得使用生成图中的通用印玺;Vue 仅叠放真实输入框、文本和点击层,不用 CSS 伪造边框、卡片、按钮或装饰面。
- 结果条目继续复用 `GenealogyCard` 已有的完整题签框和谱印框位图,以保留与 G01 一致的家谱信息密度;传入“可申请”作为条目角色。
- 初始、加载、无结果状态不是额外页面或卡片。它们在题签和控件下方以留白、现有云纹资产和清晰文案表达。
## 状态所有权与行为
- `g06-search-genealogies.vue` 是本流程唯一状态拥有者:`keyword`、公开家谱数据、`searchState` 和筛选结果都只在这里维护。
- `searchState` 的合法值是 `initial``results``empty``loading`。初始加载完成后保持 `initial`,只有用户提交搜索才进入 `results``empty`
- 搜索匹配范围维持现有数据契约:`name``surname``location`;空关键词视为查看全部公开家谱,仍属于 `results`
- 点选结果不再直接调用 `appApi.applyToJoin` 或弹确认框;改为导航到 `/pages/genealogy/g08-join-application?genealogyId=<id>`,把填写申请作为 G08 的独立任务。
## 契约与验证
- 静态契约先红灯后转绿:G06 路由存在,G07 路由与文件不存在;G06 包含四态、可见页头、无大型控件面板、朱砂题签/宽输入/按钮三张完整位图、G08 导航与位图表面约束;三张位图的尺寸和四角 alpha 均正确。
- 运行冒烟先红灯后转绿:默认进入 G06 能看到初始态且没有结果卡;搜索“汤”显示结果卡;搜索不存在关键词显示无结果态;点选结果进入 G08。最后选定样式已重跑该契约和冒烟;视觉证据当前只确认 `G06-selected-strip-final-initial-360x800.png`,结果/无结果同版截图与用户验收仍待补。
- 全量页面契约和 A03 路由计数从 56 更新为 55,文档中的当前路由数和 G03 验收状态同步更新。
## 范围外
- 不修改 G01、G03、A01、A02、A04、A05、A06 的可见效果。
- 不重做 G08 的申请表设计,不引入新 API 字段,不实现真实远端搜索协议。
- 不执行任何 Git 暂存、提交、推送、重置或 worktree 操作。

Some files were not shown because too many files have changed in this diff Show More