完成40%
@@ -1,11 +1,6 @@
|
|||||||
// 全量视觉交付的本地页面目录:只保存页面内容与状态,样式由 ModulePage 的六类母版统一维护。
|
// 全量视觉交付的本地页面目录:只保存页面内容与状态,样式由 ModulePage 的六类母版统一维护。
|
||||||
export const pageCatalog = {
|
export const pageCatalog = {
|
||||||
a03: { number: 'A-03', title: '手机验证', subtitle: '验证手机号,守护家谱记忆', template: 'auth', fields: ['手机号', '验证码'], action: '验证并继续', note: '验证码服务待接入' },
|
|
||||||
a04: { number: 'A-04', title: '注册账号', subtitle: '创建属于你的家谱账号', template: 'auth', fields: ['手机号', '设置密码', '确认密码'], action: '提交注册', note: '注册服务待接入' },
|
|
||||||
a05: { number: 'A-05', title: '重设密码', subtitle: '通过手机号找回登录凭证', template: 'auth', fields: ['手机号', '验证码', '新密码'], action: '确认重设', note: '密码重设服务待接入' },
|
|
||||||
a06: { number: 'A-06', title: '登录状态', subtitle: '账户安全提醒与登录结果', template: 'status', badge: '安', lead: '当前没有需要处理的登录异常', note: '授权取消、账号受限和登录失败会显示在这里', action: '返回登录' },
|
|
||||||
|
|
||||||
g02: { number: 'G-02', title: '我的家谱', subtitle: '等待第一段家族记忆开始', template: 'status', badge: '谱', lead: '你还没有加入任何家谱', note: '创建自己的家谱,或搜索并申请加入家族', action: '搜索家谱' },
|
|
||||||
g07: { number: 'G-07', title: '搜索结果', subtitle: '为你找到 3 部公开家谱', template: 'list', sections: [['洛阳汤氏家谱', '河南 · 洛阳 · 158 位成员'], ['汝南周氏家谱', '河南 · 周口 · 86 位成员'], ['清河张氏家谱', '河北 · 邢台 · 214 位成员']], action: '申请加入' },
|
g07: { number: 'G-07', title: '搜索结果', subtitle: '为你找到 3 部公开家谱', template: 'list', sections: [['洛阳汤氏家谱', '河南 · 洛阳 · 158 位成员'], ['汝南周氏家谱', '河南 · 周口 · 86 位成员'], ['清河张氏家谱', '河北 · 邢台 · 214 位成员']], action: '申请加入' },
|
||||||
g08: { number: 'G-08', title: '申请加入家谱', subtitle: '留下真实姓名,等待管理员审核', template: 'form', fields: ['真实姓名', '与家谱关系', '申请说明'], action: '提交申请', note: '提交后可在我的申请中查看进度' },
|
g08: { number: 'G-08', title: '申请加入家谱', subtitle: '留下真实姓名,等待管理员审核', template: 'form', fields: ['真实姓名', '与家谱关系', '申请说明'], action: '提交申请', note: '提交后可在我的申请中查看进度' },
|
||||||
g09: { number: 'G-09', title: '我的申请', subtitle: '查看加入家谱的审核进度', template: 'timeline', sections: [['洛阳汤氏家谱', '审核中 · 已提交于今天'], ['清河张氏家谱', '已通过 · 可进入家谱']], action: '查看申请说明' },
|
g09: { number: 'G-09', title: '我的申请', subtitle: '查看加入家谱的审核进度', template: 'timeline', sections: [['洛阳汤氏家谱', '审核中 · 已提交于今天'], ['清河张氏家谱', '已通过 · 可进入家谱']], action: '查看申请说明' },
|
||||||
|
|||||||
@@ -38,12 +38,42 @@
|
|||||||
Evidence: `A02-after-360x800.png`.
|
Evidence: `A02-after-360x800.png`.
|
||||||
Follow-up: remove only the heading cloud if the user finds the top-right decoration busy; do not alter the panel frame or input structure.
|
Follow-up: remove only the heading cloud if the user finds the top-right decoration busy; do not alter the panel frame or input structure.
|
||||||
|
|
||||||
|
### Iteration 3: A02 本页协议确认
|
||||||
|
|
||||||
|
**Findings**
|
||||||
|
|
||||||
|
- [P1] 直接进入 A02 时,协议确认以前只是一句“请先在登录引导页阅读并确认协议”,用户无法在当前任务页修正状态。
|
||||||
|
Location: `pages/auth/a02-login.vue`,原 `.agreement-reminder`。
|
||||||
|
Evidence: `docs/design/screens/runtime/2026-07-14/A02-without-agreement-360x800.png`。
|
||||||
|
Fix: 以 A02 卷轴面板内的可点击协议行替换提示;未选中与选中状态分别使用两枚 96×96 透明 PNG,文字和链接保留在 Vue 文字层。
|
||||||
|
|
||||||
|
- [P2] Chrome 捕获脚本在选择器出现 300ms 后就截图,A02 图层尚未加载时会产生黑块或过渡状态,不能作为视觉证据。
|
||||||
|
Location: `scripts/capture-chrome-page.js`。
|
||||||
|
Evidence: 本轮已拒绝的半渲染截图;修复后截图均由 `tests/capture-chrome-page-contract.ps1` 约束为“图片资源加载完成且额外稳定等待后再采集”。
|
||||||
|
Fix: 截图脚本等待全部 `document.images` 加载完成,再等待 900ms;新截图逐张打开检查。
|
||||||
|
|
||||||
|
### Iteration 4: A02 注册入口与证据隔离
|
||||||
|
|
||||||
|
**Findings**
|
||||||
|
|
||||||
|
- [P2] 直接进入 A02 的新用户在账号密码与验证码登录之外没有注册路径,页面功能感不完整。
|
||||||
|
Location: `pages/auth/a02-login.vue`,协议行下方。
|
||||||
|
Evidence: 用户审视的 412×915 运行截图与本轮 `A02-register-entry-412x915.png`。
|
||||||
|
Fix: 在协议行下方的既有留白内增加“还没有账号? 注册账号”;仅朱砂色“注册账号”可点,真实跳转到既有 A04 路由,不新增按钮资产或重做 A04。
|
||||||
|
|
||||||
|
- [P1] Chrome 对同一路由的 hash 导航会复用 Vue 实例;直接进入 URL 的截图可能继承上一次勾选协议的状态,不能证明初始态。
|
||||||
|
Location: `scripts/capture-chrome-page.js`。
|
||||||
|
Evidence: 导航后 URL 已是无参数 A02,但实际图标仍为 `a02-agreement-checked.png`;整页刷新后才回到未选中图标。
|
||||||
|
Fix: 截图脚本在到达目标 URL 后刷新,并等待 `performance.timeOrigin` 变化,再检查选择器、图片和稳定时间。该顺序由 `tests/capture-chrome-page-contract.ps1` 约束。
|
||||||
|
|
||||||
## Required fidelity surfaces
|
## Required fidelity surfaces
|
||||||
|
|
||||||
- Fonts and typography: A02 uses the project’s existing STKaiti/KaiTi hierarchy; current capture keeps the title above form labels and retains readable body copy.
|
- Fonts and typography: A02 uses the project’s existing STKaiti/KaiTi hierarchy; current capture keeps the title above form labels and retains readable body copy.
|
||||||
- Spacing and layout rhythm: the larger panel establishes a clear header → title → tab → form → action cadence; 320 × 568 and 360 × 640 intentionally scroll rather than clip the action.
|
- Spacing and layout rhythm: the larger panel establishes a clear header → title → tab → form → action cadence; 320 × 568 and 360 × 640 intentionally scroll rather than clip the action.
|
||||||
- Colors and visual tokens: cinnabar remains limited to the header, selected Tab, helper action and primary button; antique gold frames and ink-brown body text follow A01/G01.
|
- Colors and visual tokens: cinnabar remains limited to the header, selected Tab, helper action and primary button; antique gold frames and ink-brown body text follow A01/G01.
|
||||||
- Image quality and asset fidelity: the panel is a complete opaque PNG with no generated text, placeholder controls, or CSS-drawn frame; the button remains the approved complete A01 asset.
|
- Image quality and asset fidelity: the panel is a complete opaque PNG with no generated text, placeholder controls, or CSS-drawn frame; the button remains the approved complete A01 asset.
|
||||||
|
- Agreement control: the 96×96 unchecked and checked icons are separate transparent PNGs with transparent corners; A02 does not draw the circle, fill, or checkmark with CSS.
|
||||||
|
- Registration entry: the low-emphasis text path follows the agreement row and uses only the existing panel whitespace; it does not compete with the full-surface cinnabar login button or invent a second button asset.
|
||||||
- Copy and content: account and SMS flows retain their original Chinese copy and real input controls; no visible workflow was invented.
|
- Copy and content: account and SMS flows retain their original Chinese copy and real input controls; no visible workflow was invented.
|
||||||
|
|
||||||
## Primary interactions checked
|
## Primary interactions checked
|
||||||
@@ -51,13 +81,14 @@
|
|||||||
- Account/password state captured at 320 × 568, 360 × 640, 360 × 800 and 412 × 915.
|
- Account/password state captured at 320 × 568, 360 × 640, 360 × 800 and 412 × 915.
|
||||||
- SMS Tab was clicked through the Chrome debugging session and captured at 360 × 800: `docs/design/screens/runtime/2026-07-13/A02-sms-360x800.png`.
|
- SMS Tab was clicked through the Chrome debugging session and captured at 360 × 800: `docs/design/screens/runtime/2026-07-13/A02-sms-360x800.png`.
|
||||||
- Form submission behavior is covered by the existing A01/A02 contract and was not changed in this visual pass.
|
- Form submission behavior is covered by the existing A01/A02 contract and was not changed in this visual pass.
|
||||||
|
- Direct A02 now opens unchecked at 320×568, 360×640, 360×800 and 412×915; `?agreed=1` opens checked at 360×800. A real Chrome click changed the checked icon back to the unchecked PNG, and an unchecked submit displayed the current-page agreement message.
|
||||||
|
- Registration entry was captured at 360×800 and 412×915 after a fresh-document reload; a real Chrome click reached `http://localhost:5173/#/pages/auth/a04-register`.
|
||||||
|
- A03 重复验证码页已删除;删除后重新捕获 A02 的手机验证码 Tab(360×800),手机号、验证码、获取验证码、登录、协议和注册入口均完整显示,作为唯一验证码登录入口的运行证据。
|
||||||
|
|
||||||
## Open question
|
## Acceptance
|
||||||
|
|
||||||
There is no user-approved A02 visual mockup at the same route and state. A01 and G01 establish the visual language, but they cannot prove that this exact A02 composition meets the user’s subjective standard.
|
用户已于 2026-07-14 确认 A02 账号密码登录、协议确认和注册入口的视觉结果。本页从待验收样板转为冻结的认证模块参考;后续页面可继承其视觉语言,但不能改动 A02 可见效果。
|
||||||
|
|
||||||
## Final result
|
## Final result
|
||||||
|
|
||||||
final result: blocked
|
final result: accepted
|
||||||
|
|
||||||
Blocker: wait for the user’s visual approval of the captured A02 account-password state before treating it as the final authentication module sample or propagating it to A03–A05.
|
|
||||||
|
|||||||
@@ -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 Tab;A06 六状态均保留在各自页面内部 | 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 启动 / 登录引导设计记录
|
||||||
|
|
||||||
> 状态: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` 仅保留为失效历史,不可作为实现或推进下一页的依据。
|
> 本页设计事实的唯一归档位置为本文件。旧的 `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`。这两页完成设计前,当前入口只提示页面准备中,不伪造跳转。
|
- 注册账号入口仍归 `A-04`;忘记密码仍归 `A-05`。这两页完成设计前,当前入口只提示页面准备中,不伪造跳转。
|
||||||
- 协议必须为用户主动勾选:初始未勾选,可分别打开《家谱用户协议》和《隐私政策》。不得使用“登录即表示同意”或任何默认同意文案;未勾选时登录操作应明确提示用户先确认协议。
|
- 协议必须为用户主动勾选:初始未勾选,可分别打开《家谱用户协议》和《隐私政策》。不得使用“登录即表示同意”或任何默认同意文案;未勾选时登录操作应明确提示用户先确认协议。
|
||||||
|
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
|
|
||||||
- 页面采用纵向滚动;`320 × 568` 下两个按钮、注册文字和协议行可以滚动,但任一按钮文字、注册文字、协议行和底部内容不得被系统导航区遮挡。
|
- 页面采用纵向滚动;`320 × 568` 下两个按钮、注册文字和协议行可以滚动,但任一按钮文字、注册文字、协议行和底部内容不得被系统导航区遮挡。
|
||||||
- A-01 的登录与微信功能图标均需采用独立本地透明 PNG;微信标志只使用官方或许可来源的原色透明 PNG,不自行重绘或改色。账号密码与手机号验证码的表单图标归 A-02 设计时确定。
|
- 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 正常态必须展示两个按钮、注册文字入口和未勾选协议;点击任一需要授权的入口但未勾选协议时,仅提示“请先阅读并同意相关协议”,不视为用户已同意。
|
- A-01 正常态必须展示两个按钮、注册文字入口和未勾选协议;点击任一需要授权的入口但未勾选协议时,仅提示“请先阅读并同意相关协议”,不视为用户已同意。
|
||||||
- 页面根容器宽度必须为 100%,不可写死为 `750rpx` 或使用整张效果图。固定设计画布仍以 `750rpx` 为测量基准,运行时由真实 DOM 按当前屏宽响应式还原。
|
- 页面根容器宽度必须为 100%,不可写死为 `750rpx` 或使用整张效果图。固定设计画布仍以 `750rpx` 为测量基准,运行时由真实 DOM 按当前屏宽响应式还原。
|
||||||
#### 412 × 915 运行时校准表
|
#### 412 × 915 运行时校准表
|
||||||
@@ -52,7 +52,7 @@
|
|||||||
| 初始未勾选 | 首次进入 | 两个按钮、注册文字与空复选框 | 留在 A-01 |
|
| 初始未勾选 | 首次进入 | 两个按钮、注册文字与空复选框 | 留在 A-01 |
|
||||||
| 未同意协议 | 点击登录、微信登录或注册账号 | 提示“请先阅读并同意相关协议”,不跳转、不改变勾选状态 | 留在 A-01 |
|
| 未同意协议 | 点击登录、微信登录或注册账号 | 提示“请先阅读并同意相关协议”,不跳转、不改变勾选状态 | 留在 A-01 |
|
||||||
| 登录已确认协议 | 点击“登录” | 结束 A-01 引导 | A-02,默认账号密码登录标签 |
|
| 登录已确认协议 | 点击“登录” | 结束 A-01 引导 | A-02,默认账号密码登录标签 |
|
||||||
| 微信已确认协议 | 点击“微信登录” | 提示“微信登录功能准备中” | 留在 A-01,等待 A-03 设计完成 |
|
| 微信已确认协议 | 点击“微信登录” | 提示“微信登录功能准备中” | 留在 A-01;真实授权取消、失败与受限状态以后归 A-06 |
|
||||||
| 注册已确认协议 | 点击“注册账号”文字 | 提示“注册页面准备中” | 留在 A-01,等待 A-04 设计完成 |
|
| 注册已确认协议 | 点击“注册账号”文字 | 提示“注册页面准备中” | 留在 A-01,等待 A-04 设计完成 |
|
||||||
|
|
||||||
### A-01 资产清单
|
### A-01 资产清单
|
||||||
@@ -73,10 +73,10 @@
|
|||||||
- 此结论只验证设计稿与固定栅格,不替代 uni-app 页面实现后的 Android 运行时验收。
|
- 此结论只验证设计稿与固定栅格,不替代 uni-app 页面实现后的 Android 运行时验收。
|
||||||
- 2026-07-13 用户已验收当前连续背景、完整按钮边框与单行协议区的 `412 × 915` 运行截图,A-01 当前视觉基准标记为完成;本轮不再授权继续微调视觉细节。
|
- 2026-07-13 用户已验收当前连续背景、完整按钮边框与单行协议区的 `412 × 915` 运行截图,A-01 当前视觉基准标记为完成;本轮不再授权继续微调视觉细节。
|
||||||
- 页面实现阶段仍须按本记录在 Android 实机或同等运行环境复核四个尺寸的安全区、滚动与文字折行。
|
- 页面实现阶段仍须按本记录在 Android 实机或同等运行环境复核四个尺寸的安全区、滚动与文字折行。
|
||||||
- A-01 的协议最终页面去向及 A-03 至 A-06 的设计仍未完成;这些后续范围不影响当前 A-01 视觉基准的验收结论。
|
- A-01 的协议最终页面去向及 A-04 至 A-06 的设计仍未完成;A-03 已删除。这些后续范围不影响当前 A-01 视觉基准的验收结论。
|
||||||
|
|
||||||
## 5. 推进约束
|
## 5. 推进约束
|
||||||
|
|
||||||
- `A-01` 与 `A-02` 的本地 UI 已按本记录及实现合同落地;A-02 的最终效果稿与 Android 运行时验收仍待补齐,不能据此推进 A-03。
|
- `A-01` 与 `A-02` 的本地 UI 已按本记录及实现合同落地并获用户视觉验收;A-03 已删除,后续仅在 A04--A06 获得明确授权后推进。
|
||||||
- 当前 A-01 视觉基准已完成;后续只在协议页面、认证接口或新页面范围获得明确授权后继续推进。
|
- 当前 A-01 视觉基准已完成;后续只在协议页面、认证接口或新页面范围获得明确授权后继续推进。
|
||||||
- 用户已于 2026-07-13 授权落地 A-01 欢迎入口与 A-02 双标签登录页的本地 UI;仍不接接口、不执行真实登录、不改 Android 打包配置。实现细节的唯一所有者见 `docs/superpowers/specs/2026-07-13-a01-a02-static-ui-implementation-design.md`。
|
- 用户已于 2026-07-13 授权落地 A-01 欢迎入口与 A-02 双标签登录页的本地 UI;仍不接接口、不执行真实登录、不改 Android 打包配置。实现细节的唯一所有者见 `docs/superpowers/specs/2026-07-13-a01-a02-static-ui-implementation-design.md`。
|
||||||
|
|||||||
@@ -1,18 +1,20 @@
|
|||||||
# A02 账号登录设计记录
|
# A02 账号登录设计记录
|
||||||
|
|
||||||
> 状态:实现与运行时截图已完成,等待用户视觉验收。
|
> 状态:已于 2026-07-14 获用户视觉验收,A02 可见效果冻结。
|
||||||
> 路由:`pages/auth/a02-login?agreed=1`
|
> 路由:`pages/auth/a02-login`;A01 已确认协议进入时附带 `?agreed=1`。
|
||||||
> 视觉来源:已验收的 A01 启动/登录引导与 G01 我的家谱。
|
> 视觉来源:已验收的 A01 启动/登录引导与 G01 我的家谱。
|
||||||
|
|
||||||
## 1. 页面任务
|
## 1. 页面任务
|
||||||
|
|
||||||
让已确认协议的用户在“账号密码登录”与“手机验证码登录”之间切换并进入家谱。页面只保留本地字段校验、A05 忘记密码跳转与待接入 toast;不新增真实账号、短信、微信或后端逻辑。
|
让用户在“账号密码登录”与“手机验证码登录”之间切换并进入家谱。A02 自己提供协议确认:直接进入默认未同意,A01 已确认协议进入时默认已同意;没有账号的新用户可从协议行下方进入既有 A04 注册路由。页面只保留本地字段校验、A04 注册跳转、A05 忘记密码跳转与待接入 toast;不新增真实账号、短信、微信或后端逻辑。
|
||||||
|
|
||||||
|
手机号验证码登录只由 A02 的“手机验证码登录”Tab 承接;重复的 A03 页面已于 2026-07-14 删除。绑定手机号以后属于个人中心安全设置,微信授权取消、失败与受限状态以后属于 A06。
|
||||||
|
|
||||||
## 2. 视觉结构
|
## 2. 视觉结构
|
||||||
|
|
||||||
1. 使用与 A01 同高度的朱砂祠堂头和居中谱印,保证认证入口属于同一品牌场景。
|
1. 使用与 A01 同高度的朱砂祠堂头和居中谱印,保证认证入口属于同一品牌场景。
|
||||||
2. 头部下方放置一张完整不透明的卷轴认证面板,而不是普通 CSS 矩形卡;标题、双 Tab、输入、辅助链接和按钮文字都是可编辑的 Vue 内容层。
|
2. 头部下方放置一张完整不透明的卷轴认证面板,而不是普通 CSS 矩形卡;标题、双 Tab、输入、辅助链接和按钮文字都是可编辑的 Vue 内容层。
|
||||||
3. 面板上部承载任务标题和双 Tab,中部承载两行输入与辅助操作,下部留给原比例朱砂按钮、协议提示与淡墨山水收束。
|
3. 面板上部承载任务标题和双 Tab,中部承载两行输入与辅助操作,下部留给原比例朱砂按钮、可点击协议确认行、轻量文字注册入口与淡墨山水收束。
|
||||||
4. 主按钮继续复用 A01 的 `a01-primary-button.png`,显示槽高度为 128rpx;不把约 4.49:1 的皮肤压进旧的 100rpx 矮按钮。
|
4. 主按钮继续复用 A01 的 `a01-primary-button.png`,显示槽高度为 128rpx;不把约 4.49:1 的皮肤压进旧的 100rpx 矮按钮。
|
||||||
5. 背景山水只出现在认证面板之外和面板底部,保证输入、标签与占位文本的对比度。
|
5. 背景山水只出现在认证面板之外和面板底部,保证输入、标签与占位文本的对比度。
|
||||||
|
|
||||||
@@ -25,6 +27,8 @@
|
|||||||
| `static/assets/modules/auth/opaque/a02-login-panel.png` | opaque / 940×1672 | 完整卷轴登录面板,承载纸纹、双金线、角纹、云纹与底部山水;A02 容器 666rpx × 1184rpx。 |
|
| `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/opaque/a01-primary-button.png` | opaque / 1877×418 | A02 唯一主操作按钮皮肤,显示槽 128rpx 高。 |
|
||||||
| `static/assets/foundation/transparent/chevron-right.png` | transparent / 96×96 | 返回图标,水平翻转后使用,不再用文字符号或 CSS 圆框。 |
|
| `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 生成目录,项目运行时只引用上表中的最终资产。
|
认证面板由内置 ImageGen 根据 A01、G01 的已验收截图生成;提示词约束为“完整不透明暖宣纸、双古金线、角纹、边缘淡云竹、中央留给真实控件、无文字无按钮无图标”。生成源保留在 Codex 生成目录,项目运行时只引用上表中的最终资产。
|
||||||
|
|
||||||
@@ -33,6 +37,9 @@
|
|||||||
- 两个 Tab 仍由 `activeTab` 切换;已验证手机验证码 Tab 的真实页面状态。
|
- 两个 Tab 仍由 `activeTab` 切换;已验证手机验证码 Tab 的真实页面状态。
|
||||||
- 账号、密码、手机号、验证码继续使用原生 `input`,不烘焙到图片。
|
- 账号、密码、手机号、验证码继续使用原生 `input`,不烘焙到图片。
|
||||||
- A02 不绘制面板或主按钮的 CSS `border`/`background`;对应完整外观由图片资产承担。
|
- 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 均无横向裁切。
|
- 320 × 568 下可纵向滚动,主按钮位于首屏可达区域;360 × 640、360 × 800、412 × 915 均无横向裁切。
|
||||||
|
|
||||||
## 5. 运行时证据
|
## 5. 运行时证据
|
||||||
@@ -45,11 +52,22 @@
|
|||||||
| 改造后,账号密码 Tab,360×800 | `screens/runtime/2026-07-13/A02-after-360x800.png` |
|
| 改造后,账号密码 Tab,360×800 | `screens/runtime/2026-07-13/A02-after-360x800.png` |
|
||||||
| 改造后,账号密码 Tab,412×915 | `screens/runtime/2026-07-13/A02-after-412x915.png` |
|
| 改造后,账号密码 Tab,412×915 | `screens/runtime/2026-07-13/A02-after-412x915.png` |
|
||||||
| 改造后,手机验证码 Tab,360×800 | `screens/runtime/2026-07-13/A02-sms-360x800.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 删除后,手机验证码 Tab,360×800 | `screens/runtime/2026-07-14/A02-sms-tab-after-a03-removal-360x800.png` |
|
||||||
|
|
||||||
## 6. 自动检查
|
## 6. 自动检查
|
||||||
|
|
||||||
- `tests/a02-asset-alpha-audit.ps1`:A02 卷轴面板存在、尺寸稳定、比例稳定、四角不透明。
|
- `tests/a02-asset-alpha-audit.ps1`:A02 卷轴面板稳定;两枚协议图标均为 96×96、带 Alpha、四角透明且包含不透明图形。
|
||||||
- `tests/a01-a02-ui-contract.ps1`:A02 使用完整卷轴面板与完整主按钮;保留 Tab、原生输入、A05 跳转;拒绝 CSS 面板和 CSS 主按钮外观。
|
- `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/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,仍须重新截图、运行上述检查和相关回归。
|
||||||
@@ -1,13 +1,13 @@
|
|||||||
# P00 页面结构与资产清单
|
# P00 页面结构与资产清单
|
||||||
|
|
||||||
> 状态:59 条最终编号路由与第一版统一视觉母版已落地;A01/G01 运行时截图回归及全量逐页视觉精修待办。
|
> 状态:55 条最终编号路由与第一版统一视觉母版已落地;A01/A02/A04/A05/A06/G01 两种状态与 G03 `create|ancestor` 已验收;G06 已合并 G07 的三态,最新「朱砂题签」候选只完成初始态截图,结果/无结果同版截图与用户审美确认待补。
|
||||||
> 目的:让页面、路由和资产都有唯一、可读、可审计的归属;本文件是 P-00 的执行清单。
|
> 目的:让页面、路由和资产都有唯一、可读、可审计的归属;本文件是 P-00 的执行清单。
|
||||||
|
|
||||||
## 1. 页面命名规则
|
## 1. 页面命名规则
|
||||||
|
|
||||||
最终页面文件遵循 `<页面编号>-<语义名>.vue`:
|
最终页面文件遵循 `<页面编号>-<语义名>.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`
|
- 家谱:`g01-my-genealogies.vue`、`g03-create-genealogy.vue`
|
||||||
- 世系:`t01-tree-overview.vue`、`t03-member-profile.vue`
|
- 世系:`t01-tree-overview.vue`、`t03-member-profile.vue`
|
||||||
- 家族:`f01-family-feed.vue`、`f02-publish-feed.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/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/g01-my-genealogies` | G01 我的家谱 | `pages/genealogy/g01-my-genealogies.vue` | 已迁移;视觉冻结 |
|
||||||
| `pages/genealogy/g03-create-genealogy` | G03 创建家谱 | `pages/genealogy/g03-create-genealogy.vue` | 已迁移;未验收 |
|
| `pages/genealogy/g03-create-genealogy` | G03 创建家谱/始祖录入 | `pages/genealogy/g03-create-genealogy.vue` | `step=create|ancestor`;已获用户验收,视觉冻结 |
|
||||||
| `pages/genealogy/g04-first-ancestor` | G04 始祖录入 | `pages/genealogy/g04-first-ancestor.vue` | 已迁移;未验收 |
|
|
||||||
| `pages/genealogy/g05-genealogy-overview` | G05 家谱总览 | `pages/genealogy/g05-genealogy-overview.vue` | 已迁移;未验收 |
|
| `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/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/t01-tree-overview` | T01 世系树总览 | `pages/tree/t01-tree-overview.vue` | 已迁移;未验收 |
|
||||||
| `pages/tree/t03-member-profile` | T03 成员档案 | `pages/tree/t03-member-profile.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/notification/n01-message-center` | N01 消息中心 | `pages/notification/n01-message-center.vue` | 已迁移;未验收 |
|
||||||
| `pages/profile/m01-profile-home` | M01 我的首页 | `pages/profile/m01-profile-home.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`、所有跳转路径、测试和中文文件头注释;未完成全部引用更新时,不得删除旧路径。
|
迁移要求:同一轮更新页面文件、`pages.json`、所有跳转路径、测试和中文文件头注释;未完成全部引用更新时,不得删除旧路径。
|
||||||
|
|
||||||
@@ -60,8 +59,16 @@ static/assets/
|
|||||||
auth/
|
auth/
|
||||||
opaque/
|
opaque/
|
||||||
a02-login-panel.png
|
a02-login-panel.png
|
||||||
|
transparent/
|
||||||
|
a02-agreement-unchecked.png
|
||||||
|
a02-agreement-checked.png
|
||||||
genealogy/
|
genealogy/
|
||||||
opaque/
|
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/
|
transparent/
|
||||||
tree/
|
tree/
|
||||||
opaque/
|
opaque/
|
||||||
@@ -79,23 +86,31 @@ static/assets/
|
|||||||
|
|
||||||
| 路径 | 属性/尺寸 | 用途 | 引用位置 | 状态 |
|
| 路径 | 属性/尺寸 | 用途 | 引用位置 | 状态 |
|
||||||
| --- | --- | --- | --- | --- |
|
| --- | --- | --- | --- | --- |
|
||||||
| `foundation/opaque/auth-page-paper.jpg` | opaque / 750×1334 | 认证页纸纹底色 | A01、A02 | 保留 |
|
| `foundation/opaque/auth-page-paper.jpg` | opaque / 750×1334 | 认证页纸纹底色 | A01、A02、A04、A05、A06 | 保留 |
|
||||||
| `foundation/opaque/auth-header.png` | opaque / 750×196 | 认证页红色页头 | A01、A02 | 保留 |
|
| `foundation/opaque/auth-header.png` | opaque / 750×196 | 认证页红色页头 | A01、A02、A04、A05、A06 | 保留 |
|
||||||
| `foundation/opaque/page-paper.jpg` | opaque / 852×1846 | 根页宣纸底图 | G01 | 保留 |
|
| `foundation/opaque/page-paper.jpg` | opaque / 852×1846 | 根页宣纸底图 | G01、G06 | 保留 |
|
||||||
| `foundation/opaque/root-header-cinnabar.jpg` | opaque / 720×184 | 根页朱砂页头 | `PageHeader` | 保留 |
|
| `foundation/opaque/root-header-cinnabar.jpg` | opaque / 720×184 | 根页朱砂页头 | `PageHeader` | 保留 |
|
||||||
| `foundation/transparent/auth-ink-scenery.png` | transparent / 750×1334 | 认证页淡墨叠层 | A01、A02 | 保留 |
|
| `foundation/transparent/auth-ink-scenery.png` | transparent / 750×1334 | 认证页淡墨叠层 | A01、A02、A04、A05、A06 | 保留 |
|
||||||
| `foundation/transparent/auth-title-cloud.png` | transparent / 200×120 | A01 标题左右云纹 | A01 | 保留 |
|
| `foundation/transparent/auth-title-cloud.png` | transparent / 200×120 | 认证标题右侧云纹 | A01、A02、A04、A05、A06 | 保留 |
|
||||||
| `foundation/transparent/auth-divider-knot.png` | transparent / 160×96 | A01 文案分隔结 | A01 | 保留 |
|
| `foundation/transparent/auth-divider-knot.png` | transparent / 160×96 | 认证标题与正文结饰 | A01、A04、A05、A06 | 保留 |
|
||||||
| `foundation/opaque/a01-primary-button.png` | opaque / 1877×418 | A01 朱砂主按钮完整皮肤 | A01 | 保留;待运行截图回归 |
|
| `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 | 保留;待运行截图回归 |
|
| `foundation/opaque/a01-secondary-button.png` | opaque / 1881×419 | A01 宣纸次按钮完整皮肤 | A01 | 保留;待运行截图回归 |
|
||||||
| `modules/auth/opaque/a02-login-panel.png` | opaque / 940×1672 | A02 完整卷轴登录面板,含纸纹、双金线、角纹、云纹与底部山水 | A02 | 保留;待用户视觉验收 |
|
| `modules/auth/opaque/a02-login-panel.png` | opaque / 940×1672 | 认证完整卷轴面板,含纸纹、双金线、角纹、云纹与底部山水 | A02、A04、A05、A06 | 保留;A02、A04、A05、A06 已验收 |
|
||||||
| `foundation/transparent/auth-login-outline.png` | transparent / 96×96 | 登录图标 | A01 | 保留 |
|
| `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/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/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/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-location.png` | transparent / 96×96 | 地点元信息 | G01、`GenealogyCard` | 保留 |
|
||||||
| `foundation/transparent/meta-member.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 | 保留 |
|
| `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/section-divider.png` | transparent / 720×30 | G01 分区金线 | G01 | 保留 |
|
||||||
| `modules/genealogy/transparent/current-seal-frame.png` | transparent / 144×208 | 当前家谱谱印框 | 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/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/add.png` | transparent / 96×96 | 新建入口加号 | G01 | 保留 |
|
||||||
| `modules/genealogy/transparent/shortcut-tree.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-members.png` | transparent / 96×96 | 成员入口 | G01 | 保留 |
|
||||||
| `modules/genealogy/transparent/shortcut-generation-poem.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 | 保留 |
|
| `modules/genealogy/transparent/shortcut-application.png` | transparent / 96×96 | 审核入口 | G01 | 保留 |
|
||||||
|
|
||||||
本轮已迁入 35 项在用资产,删除 24 项运行时零引用的旧副本。A01 的两张完整按钮皮肤由图像生成工具制作,不是设计图裁切;它们的原始比例均约为 4.49:1,并由 A01 页面作为单张底层皮肤引用。旧版设计记录中的历史路径不再是资产依据;后续只按本台账引用和维护。
|
本轮已迁入 38 项在用资产,删除 24 项运行时零引用的旧副本。A01 的两张完整按钮皮肤与 G06 检索资产均由图像生成工具制作,不是设计图裁切;G06 不再使用大型检索面板,当前使用朱砂题签、宽版输入框与搜索按钮三张独立位图,页面只叠放真实品牌印、文字与交互控件。旧版设计记录中的历史路径不再是资产依据;后续只按本台账引用和维护。
|
||||||
|
|
||||||
## 5. 图片属性规则
|
## 5. 图片属性规则
|
||||||
|
|
||||||
|
|||||||
|
After Width: | Height: | Size: 340 KiB |
|
After Width: | Height: | Size: 352 KiB |
|
After Width: | Height: | Size: 355 KiB |
|
After Width: | Height: | Size: 229 KiB |
|
After Width: | Height: | Size: 290 KiB |
|
After Width: | Height: | Size: 355 KiB |
|
After Width: | Height: | Size: 454 KiB |
|
After Width: | Height: | Size: 359 KiB |
|
After Width: | Height: | Size: 359 KiB |
|
After Width: | Height: | Size: 456 KiB |
|
After Width: | Height: | Size: 359 KiB |
|
After Width: | Height: | Size: 352 KiB |
|
After Width: | Height: | Size: 284 KiB |
|
After Width: | Height: | Size: 356 KiB |
|
After Width: | Height: | Size: 360 KiB |
|
After Width: | Height: | Size: 457 KiB |
|
After Width: | Height: | Size: 359 KiB |
|
After Width: | Height: | Size: 456 KiB |
|
After Width: | Height: | Size: 360 KiB |
|
After Width: | Height: | Size: 457 KiB |
|
After Width: | Height: | Size: 276 KiB |
|
After Width: | Height: | Size: 346 KiB |
|
After Width: | Height: | Size: 360 KiB |
|
After Width: | Height: | Size: 457 KiB |
|
After Width: | Height: | Size: 275 KiB |
|
After Width: | Height: | Size: 346 KiB |
|
After Width: | Height: | Size: 350 KiB |
|
After Width: | Height: | Size: 451 KiB |
|
After Width: | Height: | Size: 237 KiB |
|
After Width: | Height: | Size: 300 KiB |
|
After Width: | Height: | Size: 352 KiB |
|
After Width: | Height: | Size: 697 KiB |
|
After Width: | Height: | Size: 288 KiB |
|
After Width: | Height: | Size: 368 KiB |
|
After Width: | Height: | Size: 281 KiB |
|
After Width: | Height: | Size: 367 KiB |
|
After Width: | Height: | Size: 314 KiB |
|
After Width: | Height: | Size: 406 KiB |
|
After Width: | Height: | Size: 318 KiB |
|
After Width: | Height: | Size: 331 KiB |
|
After Width: | Height: | Size: 278 KiB |
|
After Width: | Height: | Size: 284 KiB |
|
After Width: | Height: | Size: 282 KiB |
|
After Width: | Height: | Size: 284 KiB |
|
After Width: | Height: | Size: 288 KiB |
|
After Width: | Height: | Size: 284 KiB |
|
After Width: | Height: | Size: 490 KiB |
|
After Width: | Height: | Size: 280 KiB |
|
After Width: | Height: | Size: 283 KiB |
|
After Width: | Height: | Size: 284 KiB |
|
After Width: | Height: | Size: 251 KiB |
|
After Width: | Height: | Size: 426 KiB |
|
After Width: | Height: | Size: 250 KiB |
|
After Width: | Height: | Size: 256 KiB |
|
After Width: | Height: | Size: 289 KiB |
|
After Width: | Height: | Size: 368 KiB |
|
After Width: | Height: | Size: 260 KiB |
|
After Width: | Height: | Size: 264 KiB |
|
After Width: | Height: | Size: 697 KiB |
|
After Width: | Height: | Size: 262 KiB |
|
After Width: | Height: | Size: 693 KiB |
|
After Width: | Height: | Size: 343 KiB |
|
After Width: | Height: | Size: 359 KiB |
|
After Width: | Height: | Size: 359 KiB |
|
After Width: | Height: | Size: 360 KiB |
|
After Width: | Height: | Size: 350 KiB |
|
After Width: | Height: | Size: 288 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 259 KiB |
|
After Width: | Height: | Size: 7.7 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 236 KiB |
|
After Width: | Height: | Size: 1.9 MiB |
@@ -3,41 +3,54 @@
|
|||||||
> 更新日期:2026-07-14
|
> 更新日期:2026-07-14
|
||||||
> 用途:在新电脑或交给新的 GPT 后,按本手册恢复当前工作;它只记录已发生的事实,不把待验收写成已完成。
|
> 用途:在新电脑或交给新的 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. 当前停点:先看这一节
|
## 1. 当前停点:先看这一节
|
||||||
|
|
||||||
项目已有 59 条最终编号路由,第一版都可以浏览;这不等于 59 个页面已完成视觉验收。
|
项目已有 55 条最终编号路由,第一版都可以浏览;这不等于 55 个页面已完成视觉验收。
|
||||||
|
|
||||||
- 用户已经验收的视觉基准只有两个:**A01 启动/登录引导**、**G01 我的家谱**。它们的可见效果已冻结。
|
- 用户已经验收的视觉基准有六个:**A01 启动/登录引导**、**A02 账号登录**、**A04 注册账号**、**A05 重置密码**、**A06 登录状态**、**G01 我的家谱**。它们的可见效果已冻结。
|
||||||
- **A02 账号登录**已经完成一次资产化重做、功能回归和多尺寸截图,但**仍在等待用户审美验收**。在用户确认前,不得把 A02 标记为完成,也不得把它的样式批量传播到 A03--A06。
|
- **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。
|
- 其余模块的页面仍属于后续视觉设计任务;其中不少页面目前由 `components/ModulePage.vue` 与 `data/page-catalog.js` 提供第一版可浏览壳。这个壳是过渡方案,不是最终 UI。
|
||||||
- 不提交、不推送、不上传 Git;由用户自行处理版本库操作。
|
- 不提交、不推送、不上传 Git;由用户自行处理版本库操作。
|
||||||
|
|
||||||
下一位执行者的第一件事不是开始做新页面,而是请用户查看 A02 的前后对比:
|
下一位执行者先读取当前停点与已验收页面,再向用户展示 **G06 当前候选的初始态** 并等待反馈:
|
||||||
|
|
||||||
- `docs/design/screens/runtime/2026-07-13/A02-before-after-360x800.png`
|
- `docs/design/screens/runtime/2026-07-14/A05-after-360x800.png`
|
||||||
- `docs/design/screens/runtime/2026-07-13/A02-after-412x915.png`
|
- `docs/design/screens/runtime/2026-07-14/A05-after-412x915.png`
|
||||||
- `docs/design/screens/runtime/2026-07-13/A02-sms-360x800.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 迁移前必须保留的文件
|
## 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. 必读文件与唯一职责
|
## 2. 必读文件与唯一职责
|
||||||
|
|
||||||
| 文件 | 负责什么 |
|
| 文件 | 负责什么 |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| `AGENTS.md` | 最小修改、保护既有未提交内容、验证后再交付的项目规则。 |
|
| `AGENTS.md` | 最小修改、保护既有未提交内容、验证后再交付的项目规则。 |
|
||||||
| `docs/规划.md` | 59 个页面的范围、模块顺序和“完成”的定义。 |
|
| `docs/规划.md` | 55 条独立路由的范围、模块顺序和“完成”的定义。 |
|
||||||
| `docs/design/D1_安卓视觉规范与页面壳.md` | Android 页面、资产、布局与中文注释的硬约束。 |
|
| `docs/design/D1_安卓视觉规范与页面壳.md` | Android 页面、资产、布局与中文注释的硬约束。 |
|
||||||
| `docs/design/P00_页面结构与资产清单.md` | 路由、页面文件和资产台账的唯一清单。 |
|
| `docs/design/P00_页面结构与资产清单.md` | 路由、页面文件和资产台账的唯一清单。 |
|
||||||
| `docs/superpowers/plans/2026-07-13-product-design-visual-refinement.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/2026-07-13-A01-G01-A02-视觉审视.md` | A01/G01 视觉证据与旧 A02 的问题定位。 |
|
||||||
| `docs/design/A02_账号登录_设计记录.md` | 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` | 简版当前状态与恢复入口;本手册提供完整操作细节。 |
|
| `docs/交接记录.md` | 简版当前状态与恢复入口;本手册提供完整操作细节。 |
|
||||||
|
|
||||||
发生冲突时,按“用户最新明确指令 > AGENTS.md > 上表中的当前台账/计划 > 历史文档”的顺序处理。不要以旧的草案或已废弃的截图切片方案为依据。
|
发生冲突时,按“用户最新明确指令 > AGENTS.md > 上表中的当前台账/计划 > 历史文档”的顺序处理。不要以旧的草案或已废弃的截图切片方案为依据。
|
||||||
@@ -88,7 +101,7 @@
|
|||||||
|
|
||||||
已通过的是:资产尺寸与不透明角审计、A01/A02 页面契约、编译检查、A02 的多尺寸运行截图和短信 Tab 交互。
|
已通过的是:资产尺寸与不透明角审计、A01/A02 页面契约、编译检查、A02 的多尺寸运行截图和短信 Tab 交互。
|
||||||
|
|
||||||
未通过的是:用户对 A02 的最终审美确认。因此 `design-qa.md` 必须保持 `blocked`,直至用户明确确认。用户若觉得顶部祥云偏多,只可先移除 A02 标题右侧的单个祥云;不要无根据改动面板框、输入区或交互。
|
已通过的是:用户对 A02 的最终审美确认,`design-qa.md` 为 `accepted`,A02 可见效果冻结。用户若提出新的明确调整,只改动被指出的区域并重新截图复核;不要无根据改动面板框、输入区或交互。
|
||||||
|
|
||||||
## 5. 换电脑后如何恢复截图与审视能力
|
## 5. 换电脑后如何恢复截图与审视能力
|
||||||
|
|
||||||
@@ -128,16 +141,16 @@ node scripts/capture-chrome-page.js `
|
|||||||
|
|
||||||
## 6. 后续执行顺序与每轮产物
|
## 6. 后续执行顺序与每轮产物
|
||||||
|
|
||||||
### 门禁 0:先处理 A02
|
### 门禁 0:A02 与 A04 已通过
|
||||||
|
|
||||||
1. 让用户审 A02 前后对比与 412 × 915、短信 Tab 图。
|
1. A02 与 A04 均已通过;不因后续页面改动而触碰其可见效果。
|
||||||
2. 若不通过:只在 A02 修正明确问题,先调整对应契约测试,再改页面/资产,重新截全尺寸图。
|
2. 若用户提出明确调整:只在对应页面修正,先调整对应契约测试,再改页面/资产,重新截图复核。
|
||||||
3. 若通过:把 A02 状态同步到 `docs/规划.md`、`docs/交接记录.md`、`docs/design/A02_账号登录_设计记录.md` 与 `design-qa.md`,再开始 A03--A06。
|
3. A05、A06 与 G01 空状态均已通过并完成状态同步;G04 已合并为 G03 `step=ancestor`,该双步骤已获用户通过;G07 已合并为 G06 三态。G06 当前朱砂题签候选只完成初始态新截图,尚待结果/无结果截图、审视和用户审美确认。
|
||||||
|
|
||||||
### 其后的模块顺序
|
### 其后的模块顺序
|
||||||
|
|
||||||
1. **账号 A03--A06**:以已验收 A02 为认证样板,但每个页面保留各自的任务与状态,不能直接复制表单。
|
1. **账号 A04--A06**:以已验收 A02 为认证样板,但每个页面保留各自的任务与状态,不能直接复制表单。绑定手机号以后归个人中心安全设置的独立入口;微信授权取消、失败、受限归 A06。
|
||||||
2. **家谱 G02--G12**:先做空态/创建、家谱概览与世代字等代表页,再扩展搜索、申请、设置。
|
2. **家谱 G03、G05--G12**:G07→G06 搜索流程已收敛;先由用户审美确认 G06 当前候选,并补齐同版三态截图;之后再推进家谱概览、世代字、申请与设置。用户明确授权连续推进时,先执行 T02→T01 状态收敛。
|
||||||
3. **世系树 T01--T08**:先建立树、成员档案、关系编辑三类代表页。
|
3. **世系树 T01--T08**:先建立树、成员档案、关系编辑三类代表页。
|
||||||
4. **家族内容 F01--F10**:动态、文章、相册、媒体上传分别建立内容档案式层级。
|
4. **家族内容 F01--F10**:动态、文章、相册、媒体上传分别建立内容档案式层级。
|
||||||
5. **人物记录 R01--R11**:人物档案、礼仪活动、成长时间线先定样板。
|
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` 诚实记录通过或阻塞。 |
|
| Product Design 的 `user-context`、`get-context`、`ideate`、`image-to-code`、Design QA 流程 | 需要探索方向、选择视觉方案、将已选样稿落地、或交付前比对时。 | 有明确视觉真源时先忠实落地;没有真源且需要新方向时先给可比较方案,选定后再实现;最后在 `design-qa.md` 诚实记录通过或阻塞。 |
|
||||||
| `imagegen` | 现有资产无法承担完整视觉面时。 | 先用 A01/G01 实图作为参考,明确输出是完整不透明面板还是透明叠加件;检查实际尺寸/Alpha 后再放入项目。不能用截图代替资产。 |
|
| `imagegen` | 现有资产无法承担完整视觉面时。 | 先用 A01/G01 实图作为参考,明确输出是完整不透明面板还是透明叠加件;检查实际尺寸/Alpha 后再放入项目。不能用截图代替资产。 |
|
||||||
| `superpowers:brainstorming` 与 `superpowers:writing-plans` | 新模块或会改变页面行为的创作工作开始前。 | 先写清用户目标、交互和验收,不以“尽快”跳过设计决定。 |
|
| `superpowers:brainstorming` 与 `superpowers:writing-plans` | 新模块或会改变页面行为的创作工作开始前。 | 先写清用户目标、交互和验收,不以“尽快”跳过设计决定。 |
|
||||||
@@ -169,7 +182,7 @@ node scripts/capture-chrome-page.js `
|
|||||||
| `superpowers:systematic-debugging` | 截图、路由、构建或测试出现意外时。 | 先复现和定位单一根因,禁止靠删测试、盲改样式掩盖问题。 |
|
| `superpowers:systematic-debugging` | 截图、路由、构建或测试出现意外时。 | 先复现和定位单一根因,禁止靠删测试、盲改样式掩盖问题。 |
|
||||||
| `superpowers:verification-before-completion` | 任何“完成/修好/通过”的表述前。 | 以命令输出、运行截图和用户确认作证据;不能用意图代替验证。 |
|
| `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. 验证命令
|
## 8. 验证命令
|
||||||
|
|
||||||
@@ -196,6 +209,17 @@ powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/full-page-visual-c
|
|||||||
git diff --check
|
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、清空或覆盖用户已有改动。
|
`git diff --check` 可能提示仓库既有的 CRLF 行尾警告;只有真正的空白错误或非零退出码才算失败。不要 reset、checkout、清空或覆盖用户已有改动。
|
||||||
|
|
||||||
## 9. 文档与资源维护清单
|
## 9. 文档与资源维护清单
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
# 家谱 App Product Design 视觉精修实施计划
|
# 家谱 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.
|
> **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 小屏上成立的家祠卷轴界面。
|
**Goal:** 在不改变已验收 A01、G01 可见效果和既有业务交互的前提下,把其余 57 个页面从“可浏览的第一版”精修为同一套、可在 Android 小屏上成立的家祠卷轴界面。
|
||||||
@@ -168,25 +170,24 @@
|
|||||||
|
|
||||||
只在用户确认 A02 后,将 `docs/规划.md` 状态更新为“认证样板已验收”。用户未确认时,记录为“实现完成,视觉待验收”,不得假称完成。
|
只在用户确认 A02 后,将 `docs/规划.md` 状态更新为“认证样板已验收”。用户未确认时,记录为“实现完成,视觉待验收”,不得假称完成。
|
||||||
|
|
||||||
## Task 4: 完成认证模块 A03–A06
|
## Task 4: 完成认证模块 A04–A06
|
||||||
|
|
||||||
**Files:**
|
**Files:**
|
||||||
- Modify: `pages/auth/a03-mobile-verify.vue`
|
|
||||||
- Modify: `pages/auth/a04-register.vue`
|
- Modify: `pages/auth/a04-register.vue`
|
||||||
- Modify: `pages/auth/a05-reset-password.vue`
|
- Modify: `pages/auth/a05-reset-password.vue`
|
||||||
- Modify: `pages/auth/a06-auth-status.vue`
|
- Modify: `pages/auth/a06-auth-status.vue`
|
||||||
- Create only after A02 布局被两页复用: `components/auth/AuthFormPanel.vue`
|
- Create only after A02 布局被两页复用: `components/auth/AuthFormPanel.vue`
|
||||||
- Modify: `data/page-catalog.js` and `components/ModulePage.vue` only when the corresponding A03–A06 entry is removed from the temporary motherplate
|
- Modify: `data/page-catalog.js` and `components/ModulePage.vue` only when the corresponding A04–A06 entry is removed from the temporary motherplate
|
||||||
- Modify: `tests/full-page-visual-contract.ps1`
|
- Modify: `tests/full-page-visual-contract.ps1`
|
||||||
- Modify: `docs/design/P00_页面结构与资产清单.md`
|
- Modify: `docs/design/P00_页面结构与资产清单.md`
|
||||||
|
|
||||||
**Consumes:** 已验收的 A02 面板、按钮和文字层级。
|
**Consumes:** 已验收的 A02 面板、按钮和文字层级。
|
||||||
|
|
||||||
**Produces:** 认证六页同一入口体验:登录、验证码、注册、重设和结果状态各有对应任务,不能仍显示泛化的“功能完善中”。
|
**Produces:** 认证五页同一入口体验:登录、注册、重设和结果状态各有对应任务,不能仍显示泛化的“功能完善中”。
|
||||||
|
|
||||||
- [ ] **Step 1: 分别写四条红灯合同。**
|
- [ ] **Step 1: 分别写四条红灯合同。**
|
||||||
|
|
||||||
A03 必须有手机号与验证码;A04 有手机号、密码、确认密码和协议提示;A05 有手机号、验证码、新密码;A06 有状态图标、说明和明确返回登录操作。合同只验证存在的交互和资产锚点,不宣称后端已接入。
|
A04 有手机号、密码、确认密码和协议提示;A05 有手机号、验证码、新密码;A06 有状态图标、说明和明确返回登录操作,并承接微信授权取消、失败与受限。合同只验证存在的交互和资产锚点,不宣称后端已接入。
|
||||||
|
|
||||||
- [ ] **Step 2: 用 A02 的已确认结构分别实现。**
|
- [ ] **Step 2: 用 A02 的已确认结构分别实现。**
|
||||||
|
|
||||||
@@ -194,7 +195,7 @@
|
|||||||
|
|
||||||
- [ ] **Step 3: 模块截图与回归。**
|
- [ ] **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: 完成家谱模块 G02–G12
|
## Task 5: 完成家谱模块 G02–G12
|
||||||
|
|
||||||
|
|||||||
@@ -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 到 G06(GREEN)
|
||||||
|
|
||||||
|
**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 时不得修改。
|
||||||