完成40%
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
# 家谱 App Product Design 视觉精修实施计划
|
||||
|
||||
> 现行范围更新:A03 已于 2026-07-14 删除;验证码登录归 A02,绑定手机号归个人中心,微信异常归 A06。历史方案不再作为实现依据。
|
||||
|
||||
> **For agentic workers:** REQUIRED SUB-SKILL: Use `superpowers:executing-plans` to implement this plan task-by-task. Do not use parallel agents in this shared workspace.
|
||||
|
||||
**Goal:** 在不改变已验收 A01、G01 可见效果和既有业务交互的前提下,把其余 57 个页面从“可浏览的第一版”精修为同一套、可在 Android 小屏上成立的家祠卷轴界面。
|
||||
@@ -168,25 +170,24 @@
|
||||
|
||||
只在用户确认 A02 后,将 `docs/规划.md` 状态更新为“认证样板已验收”。用户未确认时,记录为“实现完成,视觉待验收”,不得假称完成。
|
||||
|
||||
## Task 4: 完成认证模块 A03–A06
|
||||
## Task 4: 完成认证模块 A04–A06
|
||||
|
||||
**Files:**
|
||||
- Modify: `pages/auth/a03-mobile-verify.vue`
|
||||
- Modify: `pages/auth/a04-register.vue`
|
||||
- Modify: `pages/auth/a05-reset-password.vue`
|
||||
- Modify: `pages/auth/a06-auth-status.vue`
|
||||
- Create only after A02 布局被两页复用: `components/auth/AuthFormPanel.vue`
|
||||
- Modify: `data/page-catalog.js` and `components/ModulePage.vue` only when the corresponding 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: `docs/design/P00_页面结构与资产清单.md`
|
||||
|
||||
**Consumes:** 已验收的 A02 面板、按钮和文字层级。
|
||||
|
||||
**Produces:** 认证六页同一入口体验:登录、验证码、注册、重设和结果状态各有对应任务,不能仍显示泛化的“功能完善中”。
|
||||
**Produces:** 认证五页同一入口体验:登录、注册、重设和结果状态各有对应任务,不能仍显示泛化的“功能完善中”。
|
||||
|
||||
- [ ] **Step 1: 分别写四条红灯合同。**
|
||||
|
||||
A03 必须有手机号与验证码;A04 有手机号、密码、确认密码和协议提示;A05 有手机号、验证码、新密码;A06 有状态图标、说明和明确返回登录操作。合同只验证存在的交互和资产锚点,不宣称后端已接入。
|
||||
A04 有手机号、密码、确认密码和协议提示;A05 有手机号、验证码、新密码;A06 有状态图标、说明和明确返回登录操作,并承接微信授权取消、失败与受限。合同只验证存在的交互和资产锚点,不宣称后端已接入。
|
||||
|
||||
- [ ] **Step 2: 用 A02 的已确认结构分别实现。**
|
||||
|
||||
@@ -194,7 +195,7 @@
|
||||
|
||||
- [ ] **Step 3: 模块截图与回归。**
|
||||
|
||||
对 A03、A04、A05、A06 至少各保存 360×800 一张截图;运行认证合同、`compile-audit.ps1`、`git diff --check`。A01 不改动且至少复核 412×915。
|
||||
对 A04、A05、A06 至少各保存 360×800 一张截图;运行认证合同、`compile-audit.ps1`、`git diff --check`。A01 不改动且至少复核 412×915。
|
||||
|
||||
## Task 5: 完成家谱模块 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 时不得修改。
|
||||
@@ -0,0 +1,47 @@
|
||||
# G03 创建家谱流程收敛设计规格
|
||||
|
||||
## 背景与用户确认
|
||||
|
||||
页面与状态合并审计已判定 G04“始祖录入”是 G03“创建家谱”的后续步骤,不是可独立进入的主任务。用户于 2026-07-14 确认 G01 空状态通过,并要求继续推进已确认的收敛方案;本规格直接执行 G04→G03,不再重复请求审批。
|
||||
|
||||
## 目标
|
||||
|
||||
将创建家谱与录入首代人物收敛为唯一的 `pages/genealogy/g03-create-genealogy` 路由,以 `step=create|ancestor` 表示两步流程;删除 G04 路由和页面,同时保留原有的字段、校验、数据创建、家谱上下文和跳转至世系树的行为。
|
||||
|
||||
## 真实画面审视
|
||||
|
||||
本轮基线截图:
|
||||
|
||||
- `docs/design/screens/runtime/2026-07-14/route-audit/G03-before-360x800.png`
|
||||
- `docs/design/screens/runtime/2026-07-14/route-audit/G04-before-360x800.png`
|
||||
|
||||
两页都使用相同的普通返回页头、圆角 CSS 表单卡和固定 CSS 红色底部按钮。它们的任务与结构连续,但视觉层级过于通用,且完整卡片、页头和按钮面由 CSS 构造,不符合当前位图资产规则。
|
||||
|
||||
## 方案与取舍
|
||||
|
||||
1. **推荐:G03 同路由双步骤。** `step=create` 提交成功后跳转 G03 的 `step=ancestor&genealogyId=…`;始祖提交成功后跳转 T01。路由数量从 57 变为 56,浏览器返回可回到创建步骤。采用 G01 的暖宣纸、朱砂页头和淡墨山水,表单卡使用完整不透明位图皮肤。
|
||||
2. 保留 G04 仅复用视觉组件。开发量较小,但仍有两个路由承载同一创建任务,不符合已确认的页面收敛目标。
|
||||
3. 两步放进同一页的本地切换而不更新 URL。实现更短,但无法深链或刷新恢复始祖录入步骤,且不利于契约测试;不采用。
|
||||
|
||||
## 视觉与资产
|
||||
|
||||
- 复用 G01 已验收的 `page-paper.jpg`、`footer-mountain-bamboo.png`、`root-header-cinnabar.jpg`、返回箭头和 `a01-primary-button.png`。
|
||||
- 当前仓库没有能承载家谱创建表单完整金线边框、角饰与下沿淡墨景的位图,因此使用 ImageGen 生成一个不透明的 `static/assets/modules/genealogy/opaque/g03-create-flow-panel.png`。它仅承载暖宣纸底、双古金线边框、回纹角饰、极淡云纹和底部淡墨山水;不包含文字、按钮、Logo 或透明区域。
|
||||
- G03 的局部文字、字段控件和状态提示由 Vue/CSS 布局;面板、页头和按钮的完整视觉面必须是图片,不能以 CSS 绘制边框、背景或圆角。
|
||||
- 创建步骤与始祖步骤共用同一面板皮肤,以保持流程连续;两步标题与输入内容不同。
|
||||
|
||||
## 路由与行为合同
|
||||
|
||||
- 仅保留 `pages/genealogy/g03-create-genealogy`;从 `pages.json` 删除 G04,删除 `pages/genealogy/g04-first-ancestor.vue`,不留兼容入口。
|
||||
- `step=create` 是默认值。缺失或未知 `step` 统一回到创建步骤。
|
||||
- 创建步骤仍要求姓氏与谱名;成功后调用 `appApi.createGenealogy`、写入 `genealogyContext`,跳转 `?step=ancestor&genealogyId=<id>`。
|
||||
- 始祖步骤从查询参数或 `genealogyContext` 读取家谱 ID,仍要求首代姓名;成功后调用 `appApi.createPerson` 并跳转 T01。
|
||||
- 始祖步骤的返回操作回到 G03 默认创建步骤;默认创建步骤沿用 `uni.navigateBack()`。
|
||||
|
||||
## 验证
|
||||
|
||||
1. 先写 G03 流程收敛契约,并确认其在 G04 仍存在时失败。
|
||||
2. 静态契约检查唯一 G03 路由、G04 删除、两步 URL、两组校验/数据调用、位图资产与禁止 CSS 视觉面。
|
||||
3. Chrome 运行时冒烟:填写创建页,真实进入始祖步骤;填写始祖,真实进入 T01;刷新带参数 URL 仍显示始祖步骤;默认 G03 仍显示创建步骤。
|
||||
4. 截图 360×800、412×915;把 G03 默认态与已验收 G01 视觉基准并排审视,检查无黑角、横向裁切、图片未加载或固定按钮遮挡。
|
||||
5. 运行受影响路由、资产、编译、A01/A02/A04/A05/A06/G01 回归与 `git diff --check`。
|
||||
@@ -0,0 +1,45 @@
|
||||
# G06 公开家谱搜索流程合并设计
|
||||
|
||||
## 背景与依据
|
||||
|
||||
- 用户已授权继续推进,并已将 G03 双步骤流程视为通过;G01、G03 与认证页的已验收可见效果不在本轮改动范围内。
|
||||
- 真实运行基线已保存为 `docs/design/screens/runtime/2026-07-14/route-audit/G06-before-360x800.png` 与 `G07-before-360x800.png`。
|
||||
- 基线审视发现:G06 在尚未搜索时直接展示一条结果;G07 使用另一套通用列表壳。两页实际是同一条“查找—得到结果—申请加入”的连续旅程。
|
||||
|
||||
## 选择的方案
|
||||
|
||||
采用单一 G06 路由、页面内三态的方案:
|
||||
|
||||
1. 初始态:仅显示检索提示与输入控件,不预先泄露公开家谱结果。
|
||||
2. 有结果态:输入并提交后显示匹配的 `GenealogyCard` 列表;点选任一条仅跳转既有 G08 申请页,并携带 `genealogyId`。
|
||||
3. 无结果态:输入无匹配条件时,在同一页面显示明确的无结果说明与重新检索引导。
|
||||
|
||||
不保留 G07 兼容路由、跳转或占位页面。G07 的“结果列表”语义由 G06 的有结果态唯一拥有。
|
||||
|
||||
曾考虑保留 G07 作为可深链结果页,以及让 G06 默认展示热门家谱。前者重复了同一任务并增加路由;后者会让“尚未搜索”和“已搜索”混淆,均不采用。
|
||||
|
||||
## 视觉与交互
|
||||
|
||||
- G06 继续使用现有 `PageHeader`、`page-paper.jpg`、`footer-mountain-bamboo.png` 和 `GenealogyCard` 的已登记资产,不改动已验收页面。
|
||||
- G06 顶部的 `PageHeader` 必须高于纸纹底图。公开检索是单步任务,不使用大型检索面板;用户最后选定「朱砂题签 + 宽输入框 + 搜索按钮」方向:`g06-search-title-strip.png`(1122×220)、`g06-search-input-wide.png`(1120×248)和 `g06-search-button.png`(300×132)作为独立完整表面直接置于页面纸纹。题签中的实际谱印必须叠放项目 `brand-seal.png`,不得使用生成图中的通用印玺;Vue 仅叠放真实输入框、文本和点击层,不用 CSS 伪造边框、卡片、按钮或装饰面。
|
||||
- 结果条目继续复用 `GenealogyCard` 已有的完整题签框和谱印框位图,以保留与 G01 一致的家谱信息密度;传入“可申请”作为条目角色。
|
||||
- 初始、加载、无结果状态不是额外页面或卡片。它们在题签和控件下方以留白、现有云纹资产和清晰文案表达。
|
||||
|
||||
## 状态所有权与行为
|
||||
|
||||
- `g06-search-genealogies.vue` 是本流程唯一状态拥有者:`keyword`、公开家谱数据、`searchState` 和筛选结果都只在这里维护。
|
||||
- `searchState` 的合法值是 `initial`、`results`、`empty`、`loading`。初始加载完成后保持 `initial`,只有用户提交搜索才进入 `results` 或 `empty`。
|
||||
- 搜索匹配范围维持现有数据契约:`name`、`surname`、`location`;空关键词视为查看全部公开家谱,仍属于 `results`。
|
||||
- 点选结果不再直接调用 `appApi.applyToJoin` 或弹确认框;改为导航到 `/pages/genealogy/g08-join-application?genealogyId=<id>`,把填写申请作为 G08 的独立任务。
|
||||
|
||||
## 契约与验证
|
||||
|
||||
- 静态契约先红灯后转绿:G06 路由存在,G07 路由与文件不存在;G06 包含四态、可见页头、无大型控件面板、朱砂题签/宽输入/按钮三张完整位图、G08 导航与位图表面约束;三张位图的尺寸和四角 alpha 均正确。
|
||||
- 运行冒烟先红灯后转绿:默认进入 G06 能看到初始态且没有结果卡;搜索“汤”显示结果卡;搜索不存在关键词显示无结果态;点选结果进入 G08。最后选定样式已重跑该契约和冒烟;视觉证据当前只确认 `G06-selected-strip-final-initial-360x800.png`,结果/无结果同版截图与用户验收仍待补。
|
||||
- 全量页面契约和 A03 路由计数从 56 更新为 55,文档中的当前路由数和 G03 验收状态同步更新。
|
||||
|
||||
## 范围外
|
||||
|
||||
- 不修改 G01、G03、A01、A02、A04、A05、A06 的可见效果。
|
||||
- 不重做 G08 的申请表设计,不引入新 API 字段,不实现真实远端搜索协议。
|
||||
- 不执行任何 Git 暂存、提交、推送、重置或 worktree 操作。
|
||||
@@ -0,0 +1,38 @@
|
||||
# 移除 A03 重复认证页设计
|
||||
|
||||
> 状态:用户已于 2026-07-14 确认本规格;路由迁移已实施并完成相关验证。
|
||||
> 范围:仅移除重复的 A03 独立页面与其合同,不改 A01、A02、G01 的可见效果。
|
||||
|
||||
## 1. 决策
|
||||
|
||||
1. A02 的“手机验证码登录”Tab 是手机号验证码登录的唯一入口;它拥有手机号、验证码、获取验证码和登录校验。
|
||||
2. 删除独立的 `A03 手机验证` 路由与页面,不再保留第二个手机验证码表单。
|
||||
3. 绑定手机号属于个人中心的安全设置流程,后续由个人中心的明确按钮跳转到独立页面;本轮不实现该入口或页面。
|
||||
4. 微信授权取消、失败、受限等结果仍属于 A06 登录状态;A01 的“微信登录功能准备中”提示不变,不新增真实授权或跳转。
|
||||
|
||||
## 2. 合同迁移
|
||||
|
||||
- 唯一所有者:`pages/auth/a02-login.vue` 的短信 Tab 拥有手机号验证码登录;A03 不再拥有登录或授权职责。
|
||||
- 删除:`pages/auth/a03-mobile-verify.vue`、`pages.json` 中的 A03 路由、`data/page-catalog.js` 的 `a03` 条目。
|
||||
- 路由合同:最终页面数量从 59 调整为 58;`tests/full-page-visual-contract.ps1` 是唯一页面路径清单,必须同时更新数量与期望数组。
|
||||
- 现有入口:A01 不指向 A03;A02 的两个 Tab 和 A04/A05 跳转保持现状。不存在 A03 兼容跳转或重定向。
|
||||
|
||||
## 3. 文档边界
|
||||
|
||||
- 更新当前事实来源:`docs/规划.md`、`docs/交接记录.md`、`docs/design/视觉设计交接手册.md`、`docs/design/A01_启动登录引导_设计记录.md` 与 A02 设计记录,使它们不再把 A03 视为待做页面。
|
||||
- 历史日期计划和设计证据保留当时决策,但在仍被引用为现行范围的位置注明“已被本规格取代”;不重写历史执行事实。
|
||||
- 页面总数、账户模块清单与推进顺序均以删除 A03 后的 58 条最终路由为准。
|
||||
|
||||
## 4. 最小验证
|
||||
|
||||
1. 先写失败的路由合同:A03 不存在于 `pages.json`、`pageCatalog`、期望页面数组,且最终路由数为 58。
|
||||
2. 删除 A03 后运行该合同并确认绿灯。
|
||||
3. 运行 `tests/compile-audit.ps1` 与更新后的 `tests/full-page-visual-contract.ps1`;A01/A02 相关合同仍须通过,确保冻结页未受影响。
|
||||
4. 使用 Chrome 访问 A02,确认其手机验证码 Tab 仍可切换;A03 URL 不再是注册路由。
|
||||
5. 运行 `git diff --check`。不执行 Git 暂存、提交、推送、上传或重置。
|
||||
|
||||
## 5. 非目标
|
||||
|
||||
- 不做个人中心的绑定手机号入口或跳转页。
|
||||
- 不新增真实短信、微信授权、登录、注册或后端接口。
|
||||
- 不重做 A04、A05、A06,也不改变 A01、A02、G01 的可见效果。
|
||||
@@ -0,0 +1,31 @@
|
||||
# T01 世系树状态收敛设计
|
||||
|
||||
## 运行审视依据
|
||||
|
||||
- `T01-before-360x800.png`:无当前家谱时只显示“暂未录入族人”,无法说明是空数据、加载失败还是未选择家谱。
|
||||
- `T01-populated-before-360x800.png`:已载入树的节点使用 CSS 方框且没有关系连线,底部信息条与页面视觉语言脱节。
|
||||
- `T02-before-360x800.png`:小屏提示、无成员与加载失败被做成另一个通用状态页,和 T01 是同一个阅读任务的重复路由。
|
||||
|
||||
## 决定
|
||||
|
||||
删除 T02 路由与文件。`t01-tree-overview.vue` 是世系阅读任务的唯一所有者,并以 `state=tree|landscape|empty|error` 驱动同页状态:
|
||||
|
||||
1. `tree`:有 `genealogyId` 且树数据存在时,显示横向可滚动的世系图,点选节点保留现有的资料/添加亲属跳转。
|
||||
2. `landscape`:小屏阅读提示,说明可横向拖动查看;不新增页面。
|
||||
3. `empty`:没有当前家谱、没有成员或显式状态时,清晰引导用户先录入首代。
|
||||
4. `error`:加载失败或显式状态时,说明无法加载并提供重新查看入口。
|
||||
|
||||
空关键词、无上下文和远端异常不再复用一条模糊文案;页面状态从查询参数和实际数据得出,T02 不保留兼容入口。
|
||||
|
||||
## 视觉
|
||||
|
||||
- 保留 `PageHeader`、暖宣纸与朱砂/古金/墨褐的已验收语言,不触及 A01、A02、A04--A06、G01、G03。
|
||||
- 新增不透明位图:世系画布 `t01-tree-canvas.png`、成员节点 `t01-member-node.png`、底部成员信息条 `t01-member-sheet.png`。它们承载纸纹、边框、关系线和卡片表面;Vue 只叠放真实文本、滚动和点击层。
|
||||
- 完整画布含轻古金三代关系线,适配当前 mock 的一祖、两中代、三后代布局;远端节点仍使用同一空白节点皮肤,保持可读优先。
|
||||
- `landscape`、`empty`、`error` 使用画布内留白与现有透明云纹,不再生成一个通用状态卡页。
|
||||
|
||||
## 契约与验证
|
||||
|
||||
- 先红灯:T01 存在且 T02 路由/文件不存在;T01 有四态、三张位图、成员资料与新增亲属跳转;节点和信息条不允许 CSS 构造表面。
|
||||
- 运行冒烟:默认 `?state=landscape`、`?state=empty`、`?state=error` 分别显示同页状态;`?genealogyId=1001` 显示节点并点选进入 T03。
|
||||
- 更新全量路由契约至 54,更新交接/P00/规划;截图至少包含 tree、empty、error 与 412×915 tree。
|
||||
Reference in New Issue
Block a user