接口开始5%
@@ -1,34 +0,0 @@
|
||||
# 家谱 App 项目计划
|
||||
|
||||
## 已确定的产品规则
|
||||
|
||||
- 端:uni-app 用户端,面向 Android 与 iOS 的 HBuilderX 打包。
|
||||
- 导航:家谱、家族、我的;通知入口只做提醒与跳转。
|
||||
- 主流程:管理员创建家谱并录入首代关系,族人申请加入后由管理员审核。
|
||||
- 访问规则:家谱默认仅成员可见;管理员可开放为可搜索、可申请加入。
|
||||
- 视觉:家祠卷轴——朱砂红、宣纸暖白、黛青、鎏金细线、竖式人物牌位。
|
||||
- 素材:自制图标均为透明背景 PNG;必要时采用可商用在线 PNG 图标并统一风格。
|
||||
- 接口:`APP.openapi.yaml` 是 App 端接口契约;地址、`clientid`、`tenantId` 与测试账号通过本地配置注入。
|
||||
|
||||
## 进度
|
||||
|
||||
- [x] 阅读思维导图、现有界面稿、参考 uni-app 工程与 OpenAPI 文档。
|
||||
- [x] 确定三 Tab 信息架构、核心创建流程、加入审核规则和视觉方向。
|
||||
- [x] 创建 uni-app 工程骨架、设计令牌与透明 PNG 图标资产。
|
||||
- [x] 完成登录、我的家谱、创建家谱、家谱总览、世系树、成员档案和申请审核的首版界面与本地交互闭环。
|
||||
- [x] 实现登录、我的家谱、创建家谱与公开家谱申请加入。
|
||||
- [x] 修复 Vue 3 工程入口:补齐根目录 `index.html`,并加入配置与入口自检。
|
||||
- [x] 完成当前已实现页面的 HBuilderX Web 编译、全量语言诊断与缓存排查;本地 H5 发行构建仍受 HBuilderX 登录状态限制。
|
||||
- [x] 参照完整 uni-app 工程修复 Sass 注入:令牌直接置于 `uni.scss`,重启 Vite 后登录页样式请求已验证为 200。
|
||||
- [x] 完成显式 Mock/Remote 模式、密码登录链路、token 保存、接口 `data` 解包与当前家谱 ID 上下文。
|
||||
- [x] 完成创建家谱后录入首代,并按当前家谱加载详情、世系树、成员档案、申请审核与通知已读。
|
||||
- [x] 完成家族动态发布、谱文/相册/祭祀/族务内容入口,以及动态个人资料读取。
|
||||
- [ ] 实现家谱总览、世系树、成员资料和亲属关系编辑。
|
||||
- [ ] 实现家族圈、谱文、相册、祭祀、贺礼、成长记录、备忘和功德。
|
||||
- [ ] 实现通知、个人中心、帮助、反馈、VIP 与接口配置。
|
||||
- [ ] 在 HBuilderX 验证运行、Android/iOS 打包配置和关键流程。
|
||||
|
||||
## 当前接口限制
|
||||
|
||||
- 已支持:认证、家谱、成员、字辈、世系树、家族圈、文章、相册、祭祀、族务记录、通知、反馈与 VIP。
|
||||
- 暂不实现为可用功能:邀请码、视频与多管理员分级权限;接口文档尚未提供对应端点。
|
||||
@@ -1,28 +0,0 @@
|
||||
# 参考 uni-app 工程结构核对
|
||||
|
||||
参考工程:`C:\Users\Rain\Desktop\软件\JOB\3dyjsapp`
|
||||
|
||||
## 已确认并采纳
|
||||
|
||||
- 参考工程是完整的 HBuilderX uni-app 工程,根目录使用 `App.vue`、`main.js`、`pages.json`、`manifest.json`、`index.html` 与 `uni.scss`。
|
||||
- 参考工程的 `manifest.json` 已声明 Vue 3;`main.js` 同时保留 Vue 2 与 Vue 3 的条件入口。家谱项目固定使用 Vue 3,因此保留精简的 Vue 3 入口即可。
|
||||
- 参考工程的 `uni.scss` 直接定义 Sass 变量,而不是在其中使用相对路径导入。家谱项目已按此方式调整:`uni.scss` 是唯一的设计令牌来源。
|
||||
- 参考工程把页面清单集中在 `pages.json`,家谱项目已用自动审计校验每条路由都有对应页面文件。
|
||||
|
||||
## 本项目的对应实现
|
||||
|
||||
- `uni.scss`:朱砂红、宣纸暖白、墨色、鎏金等 Sass 令牌。
|
||||
- `styles/global.scss`:只由 `App.vue` 从根目录引入的全局通用样式。
|
||||
- `tests/compile-audit.ps1`:校验路由、入口、Sass 引用与模块引用。
|
||||
- `tests/uni-scss-injection.ps1`:防止在 `uni.scss` 中再次写入会被页面按错误目录解析的相对 Sass 导入。
|
||||
|
||||
## 不照搬的部分
|
||||
|
||||
- 彩票业务页面、接口、数据模型与大量业务组件。
|
||||
- 参考工程中的第三方 UI 模块、OAuth 配置和过宽设备权限;家谱 App 按实际功能逐项添加,避免无关权限与凭据进入工程。
|
||||
|
||||
## 后续仍需补齐
|
||||
|
||||
- 家谱 App 的 Android/iOS 应用图标尺寸与启动图资源。
|
||||
- 登录后的真实接口配置与测试账号联调。
|
||||
- HBuilderX 登录后的本地 H5 发行构建及 Android/iOS 云打包验证。
|
||||
@@ -1,45 +0,0 @@
|
||||
# 全活动页面业务所有权审计(2026-07-20)
|
||||
|
||||
## 结论
|
||||
|
||||
52 条活动路由已经完成业务所有权收敛。活动页面不再引用 `ModulePage.vue` 或 `page-catalog.js`;共享层只保留按钮、弹层、Toast、加载、页头、背景和视觉卡片等原语。每个路由自行维护本页的模拟数据、状态、校验、动作及去向,仍未连接接口。
|
||||
|
||||
`ModulePage.vue`、`page-catalog.js` 和 `TreeMemberForm.vue` 按“不删除既有源码”的约束保留为历史文件,但活动路由不再消费这些通用业务母版。
|
||||
|
||||
## 五个方案与选择
|
||||
|
||||
1. 继续使用单一通用业务母版:改动最少,但页面语义、状态和真实入口继续失真,不采用。
|
||||
2. 扩大 `page-catalog.js` 配置:能增加字段,却会把校验、状态机和导航也塞入配置,不采用。
|
||||
3. 每个模块保留一个大型业务母版:比全局母版稍好,但 F、R、N、M 内部页面仍然职责不同,不采用。
|
||||
4. 建立无头 schema 渲染器:扩展性高,但会引入当前项目不需要的抽象和维护成本,不采用。
|
||||
5. 共享视觉原语、路由拥有业务内容:既保持统一国风视觉,又允许列表、详情、编辑器、时间线、消息、安全和服务页表达真实任务,采用。
|
||||
|
||||
## 本轮收敛范围
|
||||
|
||||
- F:动态详情、谱文列表/详情/编辑、相册列表/详情/上传、视频状态及 F01 八个真实入口形成闭环。
|
||||
- R:人物、贺礼、礼仪、成长、人生事、备忘、功德分别拥有专属数据结构、字段、状态和动作。
|
||||
- N/M:消息卡进入消息详情;资料、安全、密码、手机号、帮助、反馈、推广、订单和关于均为独立页面。
|
||||
- G:家谱上下文、成员身份、加入申请来源、驳回/撤回再申请、设置草稿和字辈容量由路由参数与数据决定。
|
||||
- T:T01 根据 `generation`/`parentId` 计算树布局;T03—T08 按人物、关系及权限状态工作,不再用演示标签切状态。
|
||||
- 共享组件:按钮改为原生可聚焦按钮;弹层补齐对话框语义、焦点和 Escape;Toast/Loading 补齐 live region 与减少动态效果;页头返回支持深链兜底。
|
||||
|
||||
## 数据与布局边界
|
||||
|
||||
- 普通列表和卡片由数据循环与自然高度撑开,不依赖固定条数或绝对坐标。
|
||||
- T01 的布局尺寸从成员关系计算,测试覆盖 10 世代、每代 12 人的 120 节点压力数据。
|
||||
- 容量合同覆盖 50 条列表、50 条弹层、30 项媒体、三倍长文本和 1.3 倍字号;103 个保留风险均精确到文件、选择器和风险类型。
|
||||
- 定位合同扫描所有 `position` 值(包括 `relative`);必要定位精确白名单之外无违规,也无失效白名单。
|
||||
|
||||
## 验证证据
|
||||
|
||||
- 52 条活动路由及 2 个共享组件 Vite 转换:54/54。
|
||||
- PowerShell 合同:119 项中 118 项通过;唯一失败为既有基础资产候选式命名。A01 预览已从可复现管线重新生成,G06 一致性合同已改读长期 handoff 证据,不再依赖已清理的 runtime 目录。
|
||||
- 浏览器运行时 smoke:排除会写回已清理长期目录的旧 T07 baseline 后,26/26 通过。
|
||||
- 52 个活动页面均在 360×800 捕获当前图到 `%TEMP%`,按 A/G/T、F、R、N/M 生成联系表,并与现有同模块长期候选图复核;未发现横向溢出、明显裁切、错误复用母版或不可达主动作。
|
||||
- 四档视口:320×568、360×640、360×800、412×915;覆盖模块响应式、数据压力和主要业务状态。
|
||||
|
||||
## 明确边界
|
||||
|
||||
- 本轮结论是 H5 本地模拟数据阶段的页面实现与内部审核完成,不代表接口、持久化、上传权限、微信能力、Android/HBuilderX、软键盘或真机性能完成。
|
||||
- F01、T01、A05 及大量业务页发生可见变化;自动审计不能替用户维持或新增 `[x]`。这些页面保持“待用户复核”,只有用户再次明确说“通过”才更新视觉冻结状态。
|
||||
- `foundation-asset-audit` 仍未通过,未放宽规则或删除实际资产。`repository-handoff-size-contract` 通过补齐可再生成目录的忽略规则后已真实通过(35 个长期截图、19.51MB、52 个索引链接),没有删除长期资料或放宽阈值。
|
||||
@@ -1,58 +0,0 @@
|
||||
# 全项目数据驱动布局审计(2026-07-20)
|
||||
|
||||
## 审计基线
|
||||
|
||||
- 权威基线:`main` / `01d246c 保存视觉审核与文档流迁移进度`。
|
||||
- 范围:`pages/`、`components/`、活动路由与封存 A06;当前只验证 H5,不接接口,不宣称 Android 完成。
|
||||
- 首次容量合同发现 279 项待解释风险。修正“固定网格容量”规则后为 276 项:普通 `repeat(2/3/4, ...)` 是响应式列数,不等于数据容量上限;只有 12 列及以上的固定重复网格才按固定容量画布拦截。
|
||||
- 当前截图证据:G01 切换家谱弹层在 412×915、6 条数据下可以自然增高并滚动,作为弹层容量参考;这不代表其他页面已经通过。
|
||||
|
||||
## 统一五方案决策
|
||||
|
||||
每个确认问题均评估以下五种方案:
|
||||
|
||||
1. 扩大固定尺寸:改动小,但只推迟溢出,淘汰。
|
||||
2. 增加响应式断点:只解决设备宽高差异,不能解决未知数据量;仅作补充。
|
||||
3. `max-height` 加内部滚动:适合弹层、独立列表和结构化画布,不用于普通内容卡片。
|
||||
4. 正常文档流自然撑高:适合普通页面、列表卡、表单、状态说明和长文案,作为默认最优方案。
|
||||
5. 由数据计算布局边界:适合世系树、可变列媒体和结构化关系画布。
|
||||
|
||||
## 已确认问题与选择
|
||||
|
||||
| 类别 | 已确认风险 | 五方案结论 | 最优方案 |
|
||||
| --- | --- | --- | --- |
|
||||
| 共享 `GenealogyCard` | 谱名省略、地点/人数/角色/更新时间不换行 | 1 不能覆盖未知长度;2 只能缓解窄屏;3 不应让普通卡片内部滚动;4 可保持完整数据并自然撑高;5 无结构坐标需求 | 4 |
|
||||
| T07 成员目录 | 成员卡固定 192/196rpx,姓名和元信息强制单行省略 | 1 仍有上限;2 仍依赖样本;3 破坏页面主滚动;4 与普通列表语义一致;5 无结构坐标需求 | 4 |
|
||||
| G06 搜索结果 | 结果卡虽有 `min-height`,仍用 `overflow: hidden` 裁切增长内容 | 1 无法解决裁切;2 无法覆盖长字段;3 普通结果卡不应独立滚动;4 删除裁切后由内容撑高;5 无结构坐标需求 | 4 |
|
||||
| G05 家谱概览 | 内容区使用百分比/固定 grid 行,长标题与详情可能互相挤压 | 1/2 只能推迟;3 不适合普通概览正文;4 可让各段按内容增长;5 当前无坐标关系 | 4 |
|
||||
| T01 世系树 | 固定 900rpx 画布、180×180 网格和固定世代轨道隐含容量上限 | 1/2 仍有容量上限;3 只能承担视口滚动;4 无法表达节点坐标与连线;5 可由世代数、单代节点数和间距推导画布 | 5,外层配合方案 3 |
|
||||
|
||||
## 保留边界
|
||||
|
||||
下列固定视觉边界不会因合同扫描被机械删除:图标尺寸、媒体缩略图比例与必要裁切、固定导航、真实弹窗/遮罩/Toast、装饰背景槽位。它们必须进入精确白名单并说明理由;普通正文、按钮文案、表单、列表卡和状态说明不得借白名单隐藏容量问题。
|
||||
|
||||
## 再审核要求
|
||||
|
||||
修复后必须重新运行全局容量合同、聚焦合同和压力数据 smoke,并在 320×568、360×640、360×800、412×915 下检查横向溢出、文本裁切、末项可达和滚动所有权。凡产生可见变化的既有 `[x]` 页面,只能作为新的视觉候选,必须由用户再次明确说“通过”后才能维持或新增 `[x]`。
|
||||
|
||||
## 实施与二次审核结果
|
||||
|
||||
- 容量合同从初始 279 项、规则纠正后的 276 项,收敛为 0 个未解释风险和 0 个失效白名单。最终 103 个白名单键均精确到文件、选择器和风险类型,只保留图标/印章/装饰分隔、固定导航、媒体缩略图裁切、G01/F01/T01 明确内部滚动壳及 T01 结构化节点边界。
|
||||
- 共享 `GenealogyCard`、T07、G06、F01、N01、M01、R01/R02、表单控件、状态卡与 G08—G12/T03/T08 的普通内容改为 `min-height`、换行和自然撑高;根容器不再用 `overflow-x: hidden` 掩盖横向问题。
|
||||
- G08/G11/G12 文本域使用 `auto-height`;G09 状态与操作分为独立数据行。二次截图发现的 G08/G11 原生 textarea 固有高度和 G09 状态操作重叠均已再次修正并复核。
|
||||
- T01 的画布宽高、行列数、世代轨、节点和关系线全部由成员数据计算。外层纵向滚动与内层横向滚动分工明确;120 节点(10 世代×每代 12 人)压力通过。
|
||||
- G01 弹层已验证 2/6/12/50 条:少量内容自然增长,达到安全上限后仅列表区滚动,50 条末项可达。
|
||||
- `data-driven-layout-runtime-smoke.js` 已验证:T07 50 条、G09 50 条、F09 30 项、3 倍长中文与 1.3 倍字号压力、四档视口、末项可达、横向溢出和表单自动增高。
|
||||
- 二次视觉对比覆盖 G05、T01、G08—G12、T03、T07、T08;对照长期 handoff 图检查了边框、装饰资产、间距和内容区。当前结果只能作为新的 H5 视觉候选,不能代替用户重新确认。
|
||||
|
||||
## 验证边界
|
||||
|
||||
- 相关静态合同(排除已知独立失败/缺失生成物项)全通过;21 个既有核心 runtime smoke、G01 50 条弹层压力和新增数据容量 smoke 通过。
|
||||
- `foundation-asset-audit` 与 `repository-handoff-size-contract` 的既有失败未通过删资料或放宽阈值处理;G06 runtime 截图一致性脚本因已授权清理 `docs/design/screens/runtime/` 不计入通过项。
|
||||
- 未运行会恢复长期目录外短期截图且含旧行为断言的 `t07-module-baseline-runtime-smoke.js`;T03—T08 核心流程由独立 smoke 通过。
|
||||
- 没有新的 Android/HBuilderX、系统字体缩放或真实接口证据;A06 仍为封存静态检查。
|
||||
|
||||
## 用户复核结论
|
||||
|
||||
- 用户已明确说“通过”,确认 G05、T01、G08—G12、T03、T07、T08 的本轮数据驱动布局迁移候选。
|
||||
- T01、T07 原有 `[x]` 可以维持;其他页面的本次确认只覆盖迁移后的 H5 可见效果,不替代真实入口、适用状态和整页流程验收。
|
||||
@@ -1,56 +0,0 @@
|
||||
# A01、G01 与 A02 视觉审视
|
||||
|
||||
> 日期:2026-07-13
|
||||
> 方法:通过用户授权的 Chrome 调试端口捕获真实 360 × 800 页面画面,并逐张检查。
|
||||
> 范围:只审视 A01、G01 两张已验收基准页与 A02 当前登录页;本记录不是用户最终验收。
|
||||
|
||||
## 1. 截图证据
|
||||
|
||||
| 页面 | 状态 | 截图 |
|
||||
| --- | --- | --- |
|
||||
| A01 启动/登录引导 | 用户已验收的认证基准 | `screens/runtime/2026-07-13/A01-360x800.png` |
|
||||
| G01 我的家谱 | 用户已验收的家谱基准 | `screens/runtime/2026-07-13/G01-360x800.png` |
|
||||
| A02 账号登录 | 当前实现,未验收 | `screens/runtime/2026-07-13/A02-before-360x800.png` |
|
||||
|
||||
## 2. A01、G01 共同的可继承规则
|
||||
|
||||
1. **完整资产承担外观。** 朱砂页头、纸纹、主/次按钮、题签框、谱印框、云纹和分区线都有明确的图片资产;文字与交互位于图片之上。
|
||||
2. **一屏只有一个视觉主角。** A01 是“家谱”标题与两枚操作按钮;G01 是当前家谱题签。其余山水、竹影和金线只托住主角。
|
||||
3. **信息层级有节奏。** 大号楷体标题、常规正文、弱化元信息分明;每一段间保留足够纸面,不把内容挤成普通管理表单。
|
||||
4. **朱砂只表达关键动作或当前状态。** A01 的登录、G01 的当前谱印与选中 Tab 使用朱砂;古金负责边框、图标和分隔。
|
||||
5. **同一类元素使用同一套成品。** A01 两枚按钮保持一致比例;G01 的当前题签、列表题签、谱印、快捷图标和底部导航形成连续的组件语言。
|
||||
6. **背景不抢任务。** 纸纹先提供可读底色,淡墨山水只落在空白和底部,不能穿过输入区或元信息。
|
||||
|
||||
## 3. A02 当前状态
|
||||
|
||||
### 可保留项
|
||||
|
||||
- 已有 A01 同源的纸纹、祠堂页头、谱印、淡墨背景和朱砂按钮皮肤。
|
||||
- 账号密码/手机验证码双 Tab、真实 input、忘记密码入口、协议判断与 A05 跳转仍应保留。
|
||||
- 360 × 800 下页面没有横向裁切,主按钮可见。
|
||||
|
||||
### 必须解决的可见问题
|
||||
|
||||
1. **登录面板是普通的细金线矩形。** 它没有完整纸面、双线、角纹或题签结构,和 A01 的完整按钮、G01 的完整谱签不属于同一视觉系统。
|
||||
2. **卡片内容过小且过密。** 标题、双 Tab、标签、占位文本、忘记密码与协议提示都落在一张矮卡内,用户进入后感受到的是“填写控件”,不是“进入家谱”。
|
||||
3. **按钮比例被压扁。** 当前主按钮使用约 4.49:1 的 A01 皮肤,却放入更扁的容器,边角和纹样失去端正的卷轴比例。
|
||||
4. **标题装饰没有成为层级。** 单侧云纹和细小返回符号像零散点缀,无法支撑“登录家谱”作为当前任务标题。
|
||||
5. **底部留白失衡。** 表单卡结束后到山水背景之间有大块无任务留白,而面板内部反而拥挤;需要把留白放在卡片外、把可读空间还给表单。
|
||||
|
||||
## 4. A02 设计决策
|
||||
|
||||
- 继续使用“家祠卷轴 · 庄重留白”,不另起现代渐变、玻璃卡片或圆角后台表单画风。
|
||||
- 认证头部与 A01 使用同一祠堂高度和谱印位置;头部以下先给清楚的“登录家谱”题签标题,再给完整不透明的认证面板资产。
|
||||
- 认证面板只承载 Tab、输入、忘记密码与协议说明;面板自身纸纹、金边和角纹由一张完整不透明 PNG 提供。
|
||||
- 主按钮只能按完整皮肤原比例显示;空间不足时缩小宽度或增加高度,不能纵向压缩图片。
|
||||
- 淡墨山水放到卡片结束后的留白与底部,作为收束,不穿过输入行。
|
||||
|
||||
## 5. 可见性与无障碍风险
|
||||
|
||||
- A02 的弱提示和协议文字在 360 × 800 下偏小,后续实现要保证正文至少 24rpx,主要点击区至少约 44dp。
|
||||
- 截图不能证明键盘焦点、读屏标签、错误提示朗读和真实 Android 字体回退;实施后仍需在 HBuilderX/Android 复核。
|
||||
- 本次只验证了正常态,没有验证输入错误、验证码倒计时或网络失败态;这些状态保持现有功能边界,不在本轮扩展接口。
|
||||
|
||||
## 6. 下一步
|
||||
|
||||
先为 A02 建立完整认证面板和正确比例按钮的资产合同,再做 A02 四尺寸前后对比;用户确认 A02 后,才将它作为 A03–A05 的认证样板。
|
||||
@@ -1,73 +0,0 @@
|
||||
# 页面与状态合并审计
|
||||
|
||||
> 审计日期: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,81 +0,0 @@
|
||||
# A-01 启动 / 登录引导设计记录
|
||||
|
||||
> 状态: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` 仅保留为失效历史,不可作为实现或推进下一页的依据。
|
||||
|
||||
## 1. 已归档的美术锚点
|
||||
|
||||
- v1–v3 早期整页效果稿已于 2026-07-17 上传前清理;历史入口结构保留在本记录与项目外完整归档中,不再作为当前方案依据。
|
||||
- 当前可恢复美术源:[`assets/a01-vnext/source/A01-layered-source-v1.psd`](assets/a01-vnext/source/A01-layered-source-v1.psd) 与 [`a01-psd-manifest.json`](assets/a01-vnext/source/a01-psd-manifest.json)。
|
||||
- 当前运行时视觉基准:[`screens/A01-启动登录引导-栅格验收-412x915.png`](screens/A01-启动登录引导-栅格验收-412x915.png),用于 A-01 协议未勾选状态的同尺寸像素比对;`pages/auth/entry.vue` 必须使用真实页面结构还原,不得将整张效果图作为页面内容。
|
||||
- 用途:保留本轮已确认的“家祠卷轴”欢迎页美术方向,不作为可直接还原的代码布局图,也不作为功能图标资产。
|
||||
- 画面方向:朱砂家祠红头、暖宣纸主体、古金细线与云纹、墨褐标题、两侧淡墨建筑/竹影与底部山水。登录欢迎页后续必须使用独立的红头/宣纸背景组合,不复用 G01 的列表页大山水底图。
|
||||
|
||||
## 2. 已确认的页面结构与交互
|
||||
|
||||
- 标题区保留“家谱 / 为家族留存可传承的记忆”,使用美术锚点中的朱砂家祠红头、暖宣纸、古金云纹、墨褐文字与淡墨建筑/竹影层次。
|
||||
- 操作区只保留两个大按钮和一个文字入口:朱砂主按钮“登录”、古金描边按钮“微信登录”,以及其下方的“还没有账号?注册账号”。“注册账号”仅为朱砂红可点击文字,不再作为独立大按钮。
|
||||
- 入口顺序:登录为主入口;微信登录为次入口;注册账号为辅助文字入口。
|
||||
- 已勾选协议后,“登录”前往 `A-02`,且 `A-02` 内固定使用“账号密码登录 / 手机验证码登录”双标签切换,默认显示账号密码登录。微信授权取消、失败与受限状态以后归 `A-06`;当前入口继续提示“微信登录功能准备中”,不新增真实授权跳转。
|
||||
- 注册账号入口仍归 `A-04`;忘记密码仍归 `A-05`。这两页完成设计前,当前入口只提示页面准备中,不伪造跳转。
|
||||
- 协议必须为用户主动勾选:初始未勾选,可分别打开《家谱用户协议》和《隐私政策》。不得使用“登录即表示同意”或任何默认同意文案;未勾选时登录操作应明确提示用户先确认协议。
|
||||
|
||||
## 3. 固定布局与状态边界
|
||||
|
||||
- 页面采用纵向滚动;`320 × 568` 下两个按钮、注册文字和协议行可以滚动,但任一按钮文字、注册文字、协议行和底部内容不得被系统导航区遮挡。
|
||||
- A-01 的登录与微信功能图标均需采用独立本地透明 PNG;微信标志只使用官方或许可来源的原色透明 PNG,不自行重绘或改色。账号密码与手机号验证码的表单图标归 A-02 设计时确定。
|
||||
- A-01 只设计欢迎、入口与协议未勾选提示。账号密码与手机号验证码表单均归 `A-02`,微信授权取消、失败与受限结果归 `A-06`,注册归 `A-04`,忘记密码归 `A-05`。绑定手机号以后归个人中心安全设置。
|
||||
- A-01 正常态必须展示两个按钮、注册文字入口和未勾选协议;点击任一需要授权的入口但未勾选协议时,仅提示“请先阅读并同意相关协议”,不视为用户已同意。
|
||||
- 页面根容器宽度必须为 100%,不可写死为 `750rpx` 或使用整张效果图。固定设计画布仍以 `750rpx` 为测量基准,运行时由真实 DOM 按当前屏宽响应式还原。
|
||||
#### 412 × 915 运行时校准表
|
||||
|
||||
| 元素 | 412 × 915 像素基准 | 750rpx 实现基准 |
|
||||
| --- | --- | --- |
|
||||
| 朱砂家祠头图 | 高 139px | 高 253rpx |
|
||||
| 红头谱印 | 比头图顶边低约 38px | `top: 70rpx` |
|
||||
| 标题区起点 | 红头后约 82px | `padding-top: 150rpx` |
|
||||
| 标题两侧云纹 | 紧贴标题两侧,不扩张标题组宽度 | 独立透明素材 `auth-title-cloud-v1.png`,`64rpx × 40rpx`,标题左右各 12rpx |
|
||||
| 标题分隔饰线 | 宽约 234px,中心为对称小结 | 宽 426rpx;中结使用独立透明素材 `auth-divider-knot-v1.png`,上、下间距独立 |
|
||||
| 两个按钮 | x=60px,宽约 291px,高约 65px | `margin: 95rpx 110rpx 0`,高 118rpx |
|
||||
| 两按钮间距 | 约 28px | `margin-top: 51rpx` |
|
||||
| 按钮内框与内容组 | 内框距外边约 3px,四角有卷草角花;图标与文字整体偏左 | `inset: 6rpx`;四角使用同一张 `auth-button-corner-v1.png` 镜像;内容组 `translateX(-20rpx)` |
|
||||
| 注册入口 | 微信按钮后约 56px;无左右短线 | `margin-top: 98rpx` |
|
||||
| 协议行 | 注册入口后约 77px;复选框与全部文案同一水平线 | `margin-top: 141rpx`,字号与行高均为 20rpx / 30rpx,复选框 30rpx,`align-items: center`、`white-space: nowrap`,加安全区 |
|
||||
|
||||
- 上表是 A-01 运行时布局数值的唯一所有者。320 × 568 时页面允许纵向滚动,根容器不得以 `overflow: hidden` 截断协议行或系统安全区;底部内边距包含 `env(safe-area-inset-bottom)`。
|
||||
- 仅作静态设计验证,不代表 uni-app 运行时验收;页面实现后仍须在 Android 320 × 568、360 × 640、360 × 800、412 × 915 上重新验收。
|
||||
|
||||
| 状态 | 触发 | A-01 可见结果 | 去向 |
|
||||
| --- | --- | --- | --- |
|
||||
| 初始未勾选 | 首次进入 | 两个按钮、注册文字与空复选框 | 留在 A-01 |
|
||||
| 未同意协议 | 点击登录、微信登录或注册账号 | 提示“请先阅读并同意相关协议”,不跳转、不改变勾选状态 | 留在 A-01 |
|
||||
| 登录已确认协议 | 点击“登录” | 结束 A-01 引导 | A-02,默认账号密码登录标签 |
|
||||
| 微信已确认协议 | 点击“微信登录” | 提示“微信登录功能准备中” | 留在 A-01;真实授权取消、失败与受限状态以后归 A-06 |
|
||||
| 注册已确认协议 | 点击“注册账号”文字 | 提示“注册页面准备中” | 留在 A-01,等待 A-04 设计完成 |
|
||||
|
||||
### A-01 资产清单
|
||||
|
||||
| 资产 | 用途 | 来源或生成提示 | 尺寸与验收 |
|
||||
| --- | --- | --- | --- |
|
||||
| `docs/design/assets/a01-vnext/source/A01-layered-source-v1.psd` | A-01 可恢复视觉源 | 当前分层 PSD 与清单 | 页面以真实 DOM 和导出位图还原,不把整页设计图作为页面内容 |
|
||||
| `static/assets/backgrounds/auth-ancestral-header-v1.png`、`auth-rice-paper-v1.jpg`、`auth-ink-scenery-v1.png` | A-01 分层页面背景 | 2026-07-13 内置图像生成 | 当前 A-01 使用;不得复用 G-01 背景 |
|
||||
| `static/assets/icons/auth/login-outline-v1.png`、`static/assets/icons/auth/wechat-licensed-v1.png` | A-01 两个按钮图标 | 登录图标复用项目既有资产;微信图标来源与许可见旧记录 | 当前 A-01 使用;微信图标免费使用须在应用“关于/设置”及应用商店描述中保留 Icons8 署名链接 |
|
||||
| `static/assets/foundation/opaque/a01-primary-button.png`、`a01-secondary-button.png` | A01 登录与微信登录的完整按钮皮肤 | 2026-07-13 以运行时视觉基准的比例与画风生成;不裁切设计图 | `1877 × 418px`、`1881 × 419px` 不透明 PNG;分别承担底色、双线边框和四角纹样,DOM 仅叠放图标与文案 |
|
||||
| `static/assets/icons/auth/auth-divider-knot-v1.png` | 标题上下金线的中心对称中结 | 2026-07-13 根据 412 × 915 视觉基准生成,去绿幕后保存 | `160 × 96px` 透明 PNG;不得改用长祥云 |
|
||||
| `static/assets/icons/auth/auth-title-cloud-v1.png` | “家谱”标题左右祥云 | 2026-07-13 根据 412 × 915 视觉基准生成,去绿幕后保存 | `200 × 120px` 透明 PNG;右侧只允许镜像该素材 |
|
||||
|
||||
## 4. 静态设计验收与剩余缺口
|
||||
|
||||
- 静态设计验收已覆盖 320 × 568、360 × 640、360 × 800、412 × 915;四个尺寸均保持两个大按钮与单行文字注册入口。`412 × 915` 图是 A-01 协议未勾选状态的运行时像素基准;A-01 本地页以真实 DOM 还原其层级和比例,运行时仍须截图对比,不得以整图页面替代。
|
||||
- 归档文件:[320 × 568](screens/A01-启动登录引导-栅格验收-320x568.png)、[360 × 640](screens/A01-启动登录引导-栅格验收-360x640.png)、[360 × 800](screens/A01-启动登录引导-栅格验收-360x800.png)、[412 × 915](screens/A01-启动登录引导-栅格验收-412x915.png)。
|
||||
- 此结论只验证设计稿与固定栅格,不替代 uni-app 页面实现后的 Android 运行时验收。
|
||||
- 2026-07-13 用户已验收当前连续背景、完整按钮边框与单行协议区的 `412 × 915` 运行截图,A-01 当前视觉基准标记为完成;本轮不再授权继续微调视觉细节。
|
||||
- 页面实现阶段仍须按本记录在 Android 实机或同等运行环境复核四个尺寸的安全区、滚动与文字折行。
|
||||
- A-01 的协议最终页面去向及 A-04 至 A-06 的设计仍未完成;A-03 已删除。这些后续范围不影响当前 A-01 视觉基准的验收结论。
|
||||
|
||||
## 5. 推进约束
|
||||
|
||||
- `A-01` 与 `A-02` 的本地 UI 已按本记录及实现合同落地并获用户视觉验收;A-03 已删除,后续仅在 A04--A06 获得明确授权后推进。
|
||||
- 当前 A-01 视觉基准已完成;后续只在协议页面、认证接口或新页面范围获得明确授权后继续推进。
|
||||
- 用户已于 2026-07-13 授权落地 A-01 欢迎入口与 A-02 双标签登录页的本地 UI;仍不接接口、不执行真实登录、不改 Android 打包配置。实现细节的唯一所有者见 `docs/superpowers/specs/2026-07-13-a01-a02-static-ui-implementation-design.md`。
|
||||
@@ -1,73 +0,0 @@
|
||||
# A02 账号登录设计记录
|
||||
|
||||
> 状态:已于 2026-07-14 获用户视觉验收,A02 可见效果冻结。
|
||||
> 路由:`pages/auth/a02-login`;A01 已确认协议进入时附带 `?agreed=1`。
|
||||
> 视觉来源:已验收的 A01 启动/登录引导与 G01 我的家谱。
|
||||
|
||||
## 1. 页面任务
|
||||
|
||||
让用户在“账号密码登录”与“手机验证码登录”之间切换并进入家谱。A02 自己提供协议确认:直接进入默认未同意,A01 已确认协议进入时默认已同意;没有账号的新用户可从协议行下方进入既有 A04 注册路由。页面只保留本地字段校验、A04 注册跳转、A05 忘记密码跳转与待接入 toast;不新增真实账号、短信、微信或后端逻辑。
|
||||
|
||||
手机号验证码登录只由 A02 的“手机验证码登录”Tab 承接;重复的 A03 页面已于 2026-07-14 删除。绑定手机号以后属于个人中心安全设置,微信授权取消、失败与受限状态以后属于 A06。
|
||||
|
||||
## 2. 视觉结构
|
||||
|
||||
1. 使用与 A01 同高度的朱砂祠堂头和居中谱印,保证认证入口属于同一品牌场景。
|
||||
2. 头部下方放置一张完整不透明的卷轴认证面板,而不是普通 CSS 矩形卡;标题、双 Tab、输入、辅助链接和按钮文字都是可编辑的 Vue 内容层。
|
||||
3. 面板上部承载任务标题和双 Tab,中部承载两行输入与辅助操作,下部留给原比例朱砂按钮、可点击协议确认行、轻量文字注册入口与淡墨山水收束。
|
||||
4. 主按钮继续复用 A01 的 `a01-primary-button.png`,显示槽高度为 128rpx;不把约 4.49:1 的皮肤压进旧的 100rpx 矮按钮。
|
||||
5. 背景山水只出现在认证面板之外和面板底部,保证输入、标签与占位文本的对比度。
|
||||
|
||||
## 3. 资产合同
|
||||
|
||||
| 路径 | 属性/原图尺寸 | 页面显示与职责 |
|
||||
| --- | --- | --- |
|
||||
| `static/assets/foundation/opaque/auth-header.png` | opaque / 750×196 | 认证祠堂头,A01 与 A02 共用。 |
|
||||
| `static/assets/foundation/transparent/brand-seal.png` | transparent / 240×288 | 头部谱印。 |
|
||||
| `static/assets/modules/auth/opaque/a02-login-panel.png` | opaque / 940×1672 | 完整卷轴登录面板,承载纸纹、双金线、角纹、云纹与底部山水;A02 容器 666rpx × 1184rpx。 |
|
||||
| `static/assets/foundation/opaque/a01-primary-button.png` | opaque / 1877×418 | A02 唯一主操作按钮皮肤,显示槽 128rpx 高。 |
|
||||
| `static/assets/foundation/transparent/chevron-right.png` | transparent / 96×96 | 返回图标,水平翻转后使用,不再用文字符号或 CSS 圆框。 |
|
||||
| `static/assets/modules/auth/transparent/a02-agreement-unchecked.png` | transparent / 96×96 | A02 本页未同意协议图标;四角透明,不以 CSS 圆环代替。 |
|
||||
| `static/assets/modules/auth/transparent/a02-agreement-checked.png` | transparent / 96×96 | A02 本页已同意协议图标;四角透明,不以文字勾号或 CSS 底色代替。 |
|
||||
|
||||
认证面板由内置 ImageGen 根据 A01、G01 的已验收截图生成;提示词约束为“完整不透明暖宣纸、双古金线、角纹、边缘淡云竹、中央留给真实控件、无文字无按钮无图标”。生成源保留在 Codex 生成目录,项目运行时只引用上表中的最终资产。
|
||||
|
||||
## 4. 交互与可读性
|
||||
|
||||
- 两个 Tab 仍由 `activeTab` 切换;已验证手机验证码 Tab 的真实页面状态。
|
||||
- 账号、密码、手机号、验证码继续使用原生 `input`,不烘焙到图片。
|
||||
- A02 不绘制面板或主按钮的 CSS `border`/`background`;对应完整外观由图片资产承担。
|
||||
- A02 的 `agreed` 是本页登录提交的唯一协议状态;H5 从当前 `location.hash` 读取 `agreed=1`,Android 从当前 uni 页面选项读取,直接进入默认未同意。
|
||||
- 协议行点击可切换两枚透明图标;未同意提交时在本页提示“请先阅读并同意相关协议”,不再要求返回 A01。协议名称仍沿用“协议页面准备中”提示,不新增协议正文路由。
|
||||
- 协议行下方显示“还没有账号? 注册账号”;只有朱砂色“注册账号”具有 88rpx 高的文字触点,点击进入既有 `/pages/auth/a04-register`。该入口不依赖协议状态,也不在本轮重做 A04。
|
||||
- 320 × 568 下可纵向滚动,主按钮位于首屏可达区域;360 × 640、360 × 800、412 × 915 均无横向裁切。
|
||||
|
||||
## 5. 运行时证据
|
||||
|
||||
| 状态 | 截图 |
|
||||
| --- | --- |
|
||||
| 改造前,账号密码 Tab,360×800 | `screens/runtime/2026-07-13/A02-before-360x800.png` |
|
||||
| 改造后,账号密码 Tab,320×568 | `screens/runtime/2026-07-13/A02-after-320x568.png` |
|
||||
| 改造后,账号密码 Tab,360×640 | `screens/runtime/2026-07-13/A02-after-360x640.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,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. 自动检查
|
||||
|
||||
- `tests/a02-asset-alpha-audit.ps1`:A02 卷轴面板稳定;两枚协议图标均为 96×96、带 Alpha、四角透明且包含不透明图形。
|
||||
- `tests/a01-a02-ui-contract.ps1`:A02 使用完整卷轴面板与完整主按钮;协议行、双状态图标、H5/Android 路由初始化和本页提交门禁可审计;保留 Tab、原生输入、A05 跳转;拒绝 CSS 面板、主按钮和协议图标外观。
|
||||
- `tests/a02-register-entry-contract.ps1`:A02 注册入口的文案、阅读顺序、88rpx 触点、A04 跳转与目标路由均可审计。
|
||||
- `tests/a03-route-removal-contract.ps1`:A03 页面、路由和临时目录条目均不存在;G02/G04 合并后,56 条最终路由与 A02 的唯一短信入口职责同步收敛。
|
||||
- `tests/compile-audit.ps1`:Vue 结构可编译。
|
||||
- `tests/capture-chrome-page-contract.ps1`:Chrome 截图在目标 URL、新文档、页面选择器和全部图片资源就绪后再采集,防止复用状态、黑块或半渲染证据。
|
||||
|
||||
用户已确认本页视觉结果。后续认证页可参考其已验收的品牌层级与完整位图面板规则,但不得直接复制其登录表单或改变 A02 的可见效果。
|
||||
@@ -1,60 +0,0 @@
|
||||
# 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 可见效果。
|
||||
@@ -1,57 +0,0 @@
|
||||
# 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 可见效果。
|
||||
@@ -1,50 +0,0 @@
|
||||
# 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,69 +0,0 @@
|
||||
# D1 安卓视觉地基规范
|
||||
|
||||
> 状态:P-00 实施中。
|
||||
> 本文件是 Android 页面视觉、资产与公共组件的唯一施工规范;与历史设计记录冲突时,以本文件和用户最新确认优先。
|
||||
|
||||
## 1. 冻结视觉锚点
|
||||
|
||||
- A01 启动/登录引导:`screens/A01-启动登录引导-栅格验收-412x915.png`
|
||||
- G01 我的家谱:`screens/G01-我的家谱-紧凑版设计稿-v5-Tabbar安全区.png`
|
||||
|
||||
两页已获用户验收。P-00 可以重整文件、组件和资产路径,但在 412 × 915 下不得改变两页可见布局、色彩、纹样、按钮或背景组合。
|
||||
|
||||
## 2. 视觉语言
|
||||
|
||||
| 元素 | 规则 |
|
||||
| --- | --- |
|
||||
| 页面基调 | 暖宣纸、朱砂、古金、墨褐、淡墨山水/竹影;禁止绿色页面背景。 |
|
||||
| 文字 | 标题与重要文字用楷体语气;正文首先保证 Android 小屏可读性。 |
|
||||
| 主操作 | 朱砂完整按钮图片,含自身纹理、边框与四角;不可由 CSS 色块和零散图片拼装。 |
|
||||
| 次操作 | 纸白完整按钮图片,含自身金边、四角与纹理;不可借用主按钮角标。 |
|
||||
| 页面背景 | 使用完整不透明纸纹/页头/面板图片,必要时可叠加透明山水或竹影 PNG;不能使用截图拼接。 |
|
||||
| 装饰 | 云纹、谱印、分隔纹、图标、边框均为透明 PNG;不使用 CSS/SVG 临时绘制。 |
|
||||
|
||||
## 3. 资产分类与目录
|
||||
|
||||
所有最终资产放在 `static/assets/`,路径必须表达所属范围、背景属性和语义:
|
||||
|
||||
```text
|
||||
static/assets/
|
||||
foundation/
|
||||
opaque/ # 自带底色/纹理:纸纹、页头、完整按钮、卡片、导航
|
||||
transparent/ # 透明 PNG:Logo、图标、云纹、边框、分隔纹
|
||||
modules/
|
||||
genealogy/
|
||||
opaque/
|
||||
transparent/
|
||||
tree/
|
||||
opaque/
|
||||
transparent/
|
||||
family/
|
||||
opaque/
|
||||
transparent/
|
||||
```
|
||||
|
||||
- `opaque` 资产不能依赖页面 CSS 背景色才显示完整外观。
|
||||
- `transparent` 资产必须是 RGBA PNG;其使用位置要在资产清单中写明宿主不透明底图。
|
||||
- 每项资产都在 P00 清单中登记用途、显示尺寸、引用组件、引用页面和保留/删除状态。
|
||||
- 不再创建长期使用的 `-v1`、`-v2`、`-source`、`-copy` 文件;同一语义只保留一个已验收版本。
|
||||
|
||||
## 4. 页面与组件
|
||||
|
||||
- 页面文件:`<页面编号>-<语义名>.vue`;没有确认页面编号的临时骨架要标明 `skeleton`,不能伪装成完成页面。
|
||||
- 公共组件只收纳已被两个或以上确认页面使用的稳定结构:页面纸纹壳、顶部栏、底部导航、完整图片按钮、完整图片卡片、状态容器。
|
||||
- 页面与组件开头写中文用途注释;模板按背景、页头、主体、操作、状态分段;资产图层和复杂交互写中文约束说明。
|
||||
- CSS 只负责布局、尺寸、文字、可见/隐藏与交互状态;不能再用 CSS 绘制边角、金线、云纹、分隔结、纸纹、按钮或卡片外观。
|
||||
|
||||
## 5. Android 约束
|
||||
|
||||
- 核验尺寸:320 × 568、360 × 640、360 × 800、412 × 915。
|
||||
- 正文不小于 24rpx;主操作最小高度 88rpx;可点击区不小于约 44dp。
|
||||
- 使用 Flex、边距和基础布局;不依赖 CSS Grid、`flex gap`、复杂滤镜、大面积动画或全屏截图背景。
|
||||
- 顶部和底部预留状态栏、三键/手势导航安全区;固定底栏不得遮挡页面操作。
|
||||
|
||||
## 6. 验收和代码纪律
|
||||
|
||||
- 资产先验收,页面后验收;资产不通过不进入页面。
|
||||
- 所有页面只实现明确设计与交互;不增加推测性的 JS、接口、依赖、变量、方法和分支。
|
||||
- 每次结构迁移必须同时更新页面路径、`pages.json`、跳转、测试和文档;旧路径确认无引用后立即删除。
|
||||
- 每次完成后执行受影响审计、编译检查与 `git diff --check`;A01、G01 还需做截图回归。
|
||||
@@ -1,60 +0,0 @@
|
||||
# F/R/N/M 全量候选设计记录
|
||||
|
||||
> 日期:2026-07-14
|
||||
> 状态:F01–F10、R01–R11、N01–N02、M01–M10 共 33 个页面候选已形成,统一标记 `[~]`,等待用户逐页视觉审核。
|
||||
|
||||
## 1. Product Design 处理方式
|
||||
|
||||
- 先捕获旧通用壳的 `detail|list|form|timeline|settings|status` 六类真实运行基线,再升级共享母版。
|
||||
- 共享母版只统一视觉表面和状态机制;每条路由仍拥有独立页面编号、标题、字段、列表内容和业务任务,没有合并不同功能页面。
|
||||
- F01、F02、N01、M01 四个根页独立重做,保留家族/我的底部导航与关键跳转。
|
||||
- 接口文档只用于功能位置和字段语义;页面候选全部使用本地模拟数据,不调用 `appApi`,不修改 API 边界。
|
||||
|
||||
## 2. 位图与母版
|
||||
|
||||
- `g03-create-flow-panel.png`:表单、详情、设置、服务说明和统一状态的完整宣纸表面。
|
||||
- `g06-search-input-wide.png`:真实输入、详情段落和设置行的完整位图底层。
|
||||
- `application-status-card.png`:列表、时间轴、通知、动态与状态卡。
|
||||
- `a01-primary-button.png`/`a01-secondary-button.png`:所有主次操作。
|
||||
- CSS 不绘制卡片、按钮、边框、圆角或伪元素装饰,只负责布局、文字、控件和状态。
|
||||
|
||||
## 3. 截图证据
|
||||
|
||||
### 六类母版
|
||||
|
||||
目录:`screens/runtime/2026-07-14/module-page-audit/`
|
||||
|
||||
- 基线与候选:`00-*-before-360x800.png`、`01-f03-detail-360x800.png` 至 `10-f04-list-412x915.png`。
|
||||
- 同画布对比:`11-template-before-after-comparison.png`。
|
||||
- 共享空/成功/失败:`12-shared-states-comparison.png`。
|
||||
|
||||
### 29 个共享母版页面
|
||||
|
||||
目录:`screens/runtime/2026-07-14/all-page-candidates/`
|
||||
|
||||
- 每条路由均有独立 `*-360x800.png`。
|
||||
- 模块联系表:`00-family-contact-sheet.png`、`00-records-contact-sheet.png`、`00-profile-notification-contact-sheet.png`。
|
||||
|
||||
### F01/F02/N01/M01
|
||||
|
||||
目录:`screens/runtime/2026-07-14/root-pages-audit/`
|
||||
|
||||
- 基线:`00-f01-before-360x800.png`、`00-f02-before-360x800.png`、`00-n01-before-360x800.png`、`00-m01-before-360x800.png`。
|
||||
- 候选与状态:`01-f01-list-360x800.png` 至 `10-m01-ready-412x915.png`。
|
||||
- 同画布对比:`11-root-before-after-states.png`。
|
||||
|
||||
## 4. 审视结果
|
||||
|
||||
- 六类母版在 360 下没有卡片、按钮或文字裁切;列表较长时自然纵向滚动,完整面板保持一致的视觉终点。
|
||||
- 共享状态统一使用同一宣纸面板,但标题、动作和业务名称来自当前页面,避免“万能空态”丢失上下文。
|
||||
- F01、M01 的根页保留底部导航;F02 的发布编辑区和 N01 的消息卡均使用真实控件与本地可操作结果。
|
||||
- Product Design 对比中未发现 P1/P2 级裁切、假按钮槽或风格漂移;最终 Android 真机字体放大、读屏和触摸目标仍需后续设备复核。
|
||||
|
||||
## 5. 验证入口
|
||||
|
||||
- `tests/module-page-visual-contract.ps1`
|
||||
- `tests/module-page-runtime-smoke.js`
|
||||
- `tests/root-pages-visual-contract.ps1`
|
||||
- `tests/root-pages-runtime-smoke.js`
|
||||
- `tests/capture-chrome-page-contract.ps1`
|
||||
|
||||
@@ -1,75 +0,0 @@
|
||||
# G01 列表背景候选与换机重建
|
||||
|
||||
> 日期:2026-07-16
|
||||
> 状态:A/B/C 历史母版与旗舰长屏母版均已保存并通过本机确定性构建;用户已确认旗舰长屏方向作为 9 个活动 G 页面的公共背景,并确认共享图片画层使用 28% 不透明度。当前仅有 H5 运行证据,不得写成任一页面整页已验收或 Android 已通过。
|
||||
|
||||
## 1. 为什么重做
|
||||
|
||||
现有 `footer-mountain-bamboo.png` 为 `750×360`,视觉主体集中在底部,上半部留白较大;页面又把它定位到整个内容末尾并使用 `scaleToFill` 拉伸,因此列表变长时山水被推到“添加家谱”下方。用户提出背景应更早出现,并进一步提出 G01 可能只滚动下方列表、上方当前家谱与快捷入口固定。
|
||||
|
||||
连续长背景只替换各 G 页面最底层视觉。G01 固定区/独立滚动边界已在后续同日按用户确认方案单独实施,不影响其他 G 页面;具体合同见 `docs/superpowers/specs/2026-07-16-g01-fixed-header-independent-list-scroll-design.md`。
|
||||
|
||||
## 2. 稳定输入
|
||||
|
||||
稳定输入位于:
|
||||
|
||||
- `docs/design/assets/g01-background/masters/g01-list-background-direction-a-chroma-master.png`
|
||||
- `docs/design/assets/g01-background/masters/g01-list-background-direction-b-chroma-master.png`
|
||||
- `docs/design/assets/g01-background/masters/g01-list-background-direction-c-paper-master.png`
|
||||
- `docs/design/assets/g01-background/masters/genealogy-page-background-long-flagship-imagegen-source.png`(原始 ImageGen 输出,793×1983)
|
||||
- `docs/design/assets/g01-background/masters/genealogy-page-background-long-flagship-master.png`(确定性归一化母版,1536×3840)
|
||||
|
||||
准确提示词、标题、处理模式、源尺寸、目标尺寸、选择状态和运行输出路径由 `design-pipeline/manifests/g01-background-candidates.json` 单一维护。A/B 使用纯 `#00ff00` 绿幕并提取透明叠加层;C 与旗舰长屏图保留完整暖宣纸底。当前公共运行输出是 `static/assets/modules/genealogy/opaque/genealogy-page-background-long.png`,由 `components/GenealogyPageBackground.vue` 唯一持有路径、贴底规则和 `opacity: 0.28` 显示规则;各 G 页面不得重复覆盖。旧 `genealogy-page-background.png` 不覆盖、不删除,仅作为上一轮 C 输出保留。
|
||||
|
||||
## 3. 跨电脑重建
|
||||
|
||||
要求:Windows、Node.js 22+、npm、Python 3.12+。本机验证环境为 Node `24.15.0`、npm `11.12.1`、Python `3.14.6`、Pillow `12.3.0`。
|
||||
|
||||
在项目根目录执行:
|
||||
|
||||
```powershell
|
||||
python --version
|
||||
node --version
|
||||
npm.cmd --version
|
||||
python -m venv design-pipeline/.venv
|
||||
design-pipeline/.venv/Scripts/python.exe -m pip install --upgrade pip
|
||||
design-pipeline/.venv/Scripts/python.exe -m pip install -r design-pipeline/requirements.txt
|
||||
npm.cmd --prefix design-pipeline run build:g01-background-candidates
|
||||
design-pipeline/.venv/Scripts/python.exe -m unittest design-pipeline/tests/test_build_g01_backgrounds.py -v
|
||||
node --test design-pipeline/tests/g01-background-candidates.test.mjs
|
||||
```
|
||||
|
||||
构建输出进入已忽略目录 `design-pipeline/generated/g01-background/`:
|
||||
|
||||
- `g01-list-background-direction-a.png`
|
||||
- `g01-list-background-direction-b.png`
|
||||
- `g01-list-background-direction-c.png`
|
||||
- `genealogy-page-background-long-flagship.png`
|
||||
- `build-report.json`
|
||||
|
||||
Node 入口只使用内置模块做路径与清单编排;图片解码、尺寸检查和像素处理由锁定版本的 Pillow 统一负责,因此 G01 候选构建不依赖已删除的 `node_modules`。项目其他使用 Sharp 的旧流水线仍需执行 `npm.cmd ci --prefix design-pipeline`。
|
||||
|
||||
## 4. 当前质量基线
|
||||
|
||||
本机输出:
|
||||
|
||||
| 候选 | 模式 | 像素 | 字节 | SHA-256 |
|
||||
| --- | --- | ---: | ---: | --- |
|
||||
| A | chroma-key | 1024×1536 | 2,280,297 | `7b8a8abecc651b1bc4c589607780c8ff00ea0f13de018ca4b27a479b2a870fe4` |
|
||||
| B | chroma-key | 1024×1536 | 1,890,556 | `3a0420eaaac9a2821da0f9a2ddbbbd6fb29b463fa6f41be7fa5c23948f782e2a` |
|
||||
| C | opaque-paper | 1024×1536 | 2,407,477 | `f14aeed81046d2d5e7ae78b1e62f572689c38261a2cc043142bef9f70200dc5b` |
|
||||
| 旗舰长屏 | opaque-paper-resize | 1440×3600 | 6,538,134 | `9aa9ebdd231eddbc151e238ba340a00f8603f23143117ad8c93009947dcca2e2` |
|
||||
|
||||
四张输出均通过清单尺寸、处理模式和 sRGB 构建检查;A/B/C 继续保持原质量基线。旗舰长屏原始 ImageGen 输出为 2,333,286 字节、SHA-256 `3d5ada7a23edd8db98b3511d308d2d240d80fdd4ff9280a8c434b50fb68cac3a`;1536×3840 归一化母版为 6,822,092 字节、SHA-256 `2fb3aa9be7772beb6f620c49f096ed6d9c045a56cfe7ae342664ee05ca58862b`。若另一台电脑因 Python、Pillow 或压缩实现差异产生不同文件哈希,应先核对锁定依赖,再比较解码后的 RGBA 像素和质量报告,不能只凭压缩字节差异判定视觉失败。
|
||||
|
||||
## 5. 可复现边界
|
||||
|
||||
- 精确可复现:从仓库内保存的母版执行清单、Python 和 Node 流程,得到相同 RGBA 像素处理结果。
|
||||
- 方向可复现但非逐像素:在另一台电脑上使用清单中的提示词重新调用图像模型。
|
||||
- 不可依赖:Codex 本机生成目录、`tmp/`、`node_modules/`、`.venv/`、`generated/` 或未进入仓库的聊天图片。
|
||||
|
||||
## 6. 下一步
|
||||
|
||||
1. 用户查看 G01 固定信息区/独立列表滚动的实际 H5 页面;当前五档 runtime 截图仍是内部候选证据。
|
||||
2. 用户确认 G01 整页后,再保存一张长期代表证据并更新视觉证据索引。
|
||||
3. 完成 Android/HBuilderX 真机或模拟器复核,并专项检查区域滚动手感及 4GB Android 上约 19.8MiB 解码内存、切页与回收。
|
||||
@@ -1,134 +0,0 @@
|
||||
# G-01:我的家谱设计记录
|
||||
|
||||
> 状态:设计验收完成(2026-07-13,用户确认)
|
||||
> 美术锚点:[G01 我的家谱美术锚点](references/G01-我的家谱-美术锚点.png)
|
||||
> 布局锚点:[D1 安卓视觉规范与页面壳](D1_安卓视觉规范与页面壳.md#62-g-01-固定设计栅格360--800dp)
|
||||
|
||||
## 页面目标
|
||||
|
||||
让已登录用户一眼查看当前家谱、进入四个高频入口、切换已创建 / 已加入家谱。无家谱的创建或搜索加入状态归属 `G-02`。
|
||||
|
||||
## 背景组合
|
||||
|
||||
- 红头:`static/assets/backgrounds/header-hall-lineart.png` 叠加朱砂底色。
|
||||
- 内容纸面:`static/assets/backgrounds/paper-rice-texture.jpg`。
|
||||
- 页面底部:`static/assets/backgrounds/footer-mountain-bamboo.png`,只用于列表尾部与新建按钮附近。
|
||||
|
||||
## 图标资产清单
|
||||
|
||||
所有项目完成后均为独立、紧凑的 RGBA 透明 PNG;不能从大图裁切后直接使用。
|
||||
|
||||
| 区域 | 语义 | 目标文件 | 风格 | 状态 |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| 顶部左侧 | 项目 Logo | `brand/jiapu-seal-logo.png` | 用户确认的家祠 Logo 原图 | 已确认使用;待页面小尺寸摆放验收 |
|
||||
| 顶部右侧 | 通知 | `common/notice-v3.png` | 古金双线 + 轻云纹 | 已生成;`70 × 94px` 主体通过紧凑尺寸检查 |
|
||||
| 列表入口 | 右箭头 | `common/chevron-right-v2.png` | 古金简洁单线 | 已生成;`96 × 96px`、RGBA 四角透明、48px 检查通过 |
|
||||
| 快捷入口 | 世系图 | `genealogy/tree-v2.png` | 古金双线简化版 | 已生成;`96 × 96px`、RGBA 四角透明、48px 检查通过 |
|
||||
| 快捷入口 | 家族成员 | `genealogy/members-v2.png` | 古金双线简化版 | 已生成;`96 × 96px`、RGBA 四角透明、48px 检查通过 |
|
||||
| 快捷入口 | 字辈诗 | `genealogy/generation-poem-v2.png` | 古金双线简化版 | 已生成;`96 × 96px`、RGBA 四角透明、48px 检查通过 |
|
||||
| 快捷入口 | 申请审核 | `genealogy/application-v2.png` | 古金双线简化版 | 已生成;`96 × 96px`、RGBA 四角透明、48px 检查通过 |
|
||||
| 主操作 | 新建家谱 | `action/add-v2.png` | 古金双线 + 轻云纹 | 已生成;`96 × 96px`、RGBA 四角透明、48px 检查通过 |
|
||||
| 底部 Tab | 家谱 | `tab/genealogy-v4.png`、`genealogy-active-v4.png` | 简洁谱册 / 世系语义 | 已生成;同轮廓墨褐 / 朱砂成对导出,`96 × 96px`、48px 检查通过 |
|
||||
| 底部 Tab | 家族 | `tab/family-v4.png`、`family-active-v4.png` | 简洁双人群组语义 | 已生成;同轮廓墨褐 / 朱砂成对导出,`96 × 96px`、48px 检查通过 |
|
||||
| 底部 Tab | 我的 | `tab/profile-v4.png`、`profile-active-v4.png` | 简洁人物档案语义 | 已生成;同轮廓墨褐 / 朱砂成对导出,`96 × 96px`、48px 检查通过 |
|
||||
|
||||
## 页面完成条件
|
||||
|
||||
- [ ] 图标资产清单全部生成并在 `46rpx` / `24dp` 下逐个检查。
|
||||
- [ ] 背景组合在 `320 × 568` 下不遮挡标题、按钮和列表。
|
||||
- [ ] 按固定栅格完成正常态、无家谱态与加载态设计。
|
||||
- [ ] 不存在横线占位、重复家谱层级或无业务含义的颜色差异。
|
||||
|
||||
## Tabbar 重设计规则
|
||||
|
||||
- 当前 `static/assets/icons/tab/` 和 `static/icons/tab-*.png` 的图标不通过验收,不得使用。
|
||||
- 三个 Tab 重新采用等视觉重量的简洁符号:家谱为“世系关系 / 谱册”语义,家族为“双人群组”语义,我的为“人物档案”语义。
|
||||
- 三个图标同为 `24dp` 标准视口、无文字嵌入、无枝叶和云纹等细碎装饰;默认态为墨褐 / 古金描边,选中态为朱砂色的同一图形加粗或填充。
|
||||
- Logo 是品牌标识,不能拿来代替家谱 Tab 图标;Tab 图标只服务于快速识别目的地。
|
||||
|
||||
## 2026-07-11 当日确认记录
|
||||
|
||||
- 当前交接视觉稿:[G01-我的家谱-紧凑版设计稿-v5-Tabbar安全区.png](screens/G01-我的家谱-紧凑版设计稿-v5-Tabbar安全区.png)。它是明日施工时的美术与布局锚点,不替代真实页面和资产验收。
|
||||
- 顶部品牌使用项目原有 `static/assets/icons/brand/jiapu-seal-logo.png`;缩小后固定在左上安全区,避免与居中标题及殿宇线稿争夺视觉焦点。
|
||||
- 底部 Tabbar 仍然贴合屏幕底部;三个图标和文字整体上移至 Android 手势/三键导航安全区内,标签“家谱 / 家族 / 我的”加大,任何屏幕尺寸下不得被底边裁切。
|
||||
- 上述确认只锁定 G-01 的方向和版式。真实透明 PNG 图标、背景组合、320 × 568 小屏校验、空状态与加载状态尚未完成,因此 **G-01 仍不勾选为设计完成**。
|
||||
- 明日从 G-01 的可施工项开始:先按 D1 规范落实真实图标与背景资产、再还原页面布局;全量页面设计完成前,不恢复接口联调或 Android 打包工作。
|
||||
|
||||
## 2026-07-12 施工记录
|
||||
|
||||
- 已完成 G-01 独立图标资产:四个快捷入口、主操作、列表右箭头,以及三组 Tab 默认 / 选中态;全部为 `96 × 96px` RGBA PNG,四角透明,并按实际 `48px` 显示尺寸检查。
|
||||
- 已完成 G-01 首轮页面还原:朱砂祠堂红头、左上原 Logo、条件式消息圆点、宣纸与山水背景、当前家谱题签、快捷入口、已创建 / 已加入列表、空状态、加载状态和 Android 安全区 Tabbar。
|
||||
- 本页暂时使用 `data/mock.js` 的展示数据;已移除 G-01 的远程接口调用,接口联调仍按总规划暂停。
|
||||
- 已通过:`g01-visual-contract.ps1`、`compile-audit.ps1`、`uni-scss-injection.ps1`、`vue3-entry.ps1`。
|
||||
- 待完成:在已打开的 HBuilderX 中按 `360 × 800`、`320 × 568` 预览并记录无重叠、无底部裁切的证据。完成前不勾选本页“设计完成”条件。
|
||||
|
||||
## 2026-07-12 视觉校正记录
|
||||
|
||||
- 用户预览反馈首轮还原与确认稿差异过大。已定位为:祠堂线稿直接铺在红头导致视觉过满,且题签 / 列表使用普通圆角边框而不是确认稿的纸签资产。
|
||||
- 红头已改为纯朱砂底 + 独立 `header-hall-lineart.png` 低对比背景层(不透明度 `0.22`);Logo 放大并上移,标题与通知保持独立层级。
|
||||
- 已新增并接入 `backgrounds/genealogy-current-slip-frame.png` 与 `backgrounds/genealogy-list-slip-frame.png`;两者为透明 PNG 双金线纸签框,透明角检查通过。
|
||||
- 此次只修正可见还原偏差,不改变 G-01 的数据、路由和状态范围;仍待用户重新运行后的两组小屏预览确认。
|
||||
|
||||
## 2026-07-12 尺寸校正记录
|
||||
|
||||
- 原始品牌 Logo 的透明留白导致顶部显示偏小,已从同一原图无损裁切为 `brand/jiapu-seal-logo-header.png` 后接入;不改变 Logo 的图形、配色或品牌含义。
|
||||
- 快捷入口图标由 `52rpx` 调整为 `68rpx`;Tab 图标由 `48rpx` 调整为 `56rpx`,标签由 `24rpx` 调整为 `28rpx`,使实际显示尺寸靠近确认稿。
|
||||
- 校正后已重新通过 G-01 资产/页面契约、编译审计和 SCSS 注入审计;仍需 HBuilderX 截图作最终视觉依据。
|
||||
|
||||
## 2026-07-12 第三轮背景与栅格校正
|
||||
|
||||
- 红头高度由 `216rpx` 收至 `184rpx`,改用 `backgrounds/header-cinnabar-texture-v2.jpg`;祠堂线稿仅作为 `0.16` 不透明度的独立底纹层。
|
||||
- 内容左右边距由 `32rpx` 调整为 `48rpx`,当前家谱题签高度收至 `250rpx`,并在快捷入口和列表之间恢复 `backgrounds/genealogy-section-divider-v2.png` 金线云纹分隔。
|
||||
- 页面底色改用浅宣纸 `backgrounds/paper-rice-texture-v2.jpg`;山水竹影改用透明 `backgrounds/footer-mountain-bamboo-v2.png` 作为整页底部淡层,不再出现矩形背景块;已检查不含绿色像素。
|
||||
- 标题、分区标题与家谱名称增加宋/楷书本机回退链;题签框统一压为古金 `#B58A4B`。
|
||||
- 已通过:G-01 页面/资产契约、编译审计、SCSS 注入审计及页脚透明区域检查。仍待新截图比对,页面不标记为完成。
|
||||
|
||||
## 2026-07-12 第四轮底图与题签边角校正
|
||||
|
||||
- 根因核验:`genealogy-current-slip-frame.png` 与 `genealogy-list-slip-frame.png` 的四个角均为 Alpha 0;白色直角边并非 PNG 资产本身,而是题签容器在透明镂空角下铺了接近白色的矩形底色。
|
||||
- 已移除当前家谱题签和两条列表题签的矩形底色,让透明镂空角直接透出宣纸底纹;文字、边框和点击区域不变。
|
||||
- 已撤回错误的 `footer-mountain-bamboo-v2.png`(该图是连续实心灰山,无法还原设计稿的淡墨层次),恢复使用带亭、远山和竹影的 `footer-mountain-bamboo.png`,以 `0.48` 透明度贴在 Tabbar 上沿,不形成独立灰色矩形带。
|
||||
- `tests/g01-visual-contract.ps1` 先新增回归断言并确认旧实现失败,再完成最小改动后通过;仍需在 HBuilderX 的同一设备尺寸下由新截图确认最终观感,G-01 不标记为完成。
|
||||
|
||||
## 2026-07-12 第五轮信息层级与谱印施工
|
||||
|
||||
- 施工依据固定为 `screens/G01-我的家谱-紧凑版设计稿-v5-Tabbar安全区.png`,对应用户箭头指出的谱印、元信息、快捷入口、两条列表和新建按钮;未改接口、路由、页头、背景或 Tabbar。
|
||||
- 新增并接入透明 PNG:`common/location-v1.png`、`common/member-meta-v1.png`、`common/admin-v1.png`、`genealogy/seal-current-frame-v1.png`、`genealogy/seal-row-frame-v1.png`、`action/create-cloud-v1.png`。谱印框只承载朱砂和金白边框,谱印固定显示“家谱”,家谱名称和数值仍为动态文本。
|
||||
- 当前家谱改为地点、成员数、管理员三组图标化元信息;快捷入口显示框提升至 `82rpx`;新建按钮加入两侧云纹 PNG。
|
||||
- 家谱列表改为谱印框、标题、地点/成员元信息和“更新于”日期的两层结构;`320px` 小屏隐藏更新时间,优先保证标题、元信息、角色和箭头不重叠。
|
||||
- 已新增资产透明角/有效图形审计。验证通过:`g01-visual-contract.ps1`、`g01-asset-alpha-audit.ps1`、`compile-audit.ps1`、`uni-scss-injection.ps1`。待 HBuilderX 新截图与参考稿并排确认后,G-01 才能标记设计完成。
|
||||
|
||||
## 2026-07-12 第六轮参考稿字段与右侧基线校正
|
||||
|
||||
- 预览字段已切换为参考稿:当前家谱“汤氏家谱 / 河南·洛阳 / 158 位成员 / 管理员”,已加入家谱“汤氏宗谱 / 山东·济宁 / 286 位成员 / 成员”;不再使用四川、达州、刘氏等旧演示字段。
|
||||
- 当前题签恢复标题与元信息之间的细金线;短字段确保 430px 验收宽度内三组元信息同一行显示。
|
||||
- 列表谱印固定为竖排“家谱”;右侧角色与箭头改为同一水平基线;“更新于”保留为文本,移除参考稿中不存在的日历图标和对应闲置资产。
|
||||
- 新增字段/基线契约先失败后通过。完整验证再次通过:G-01 视觉契约、PNG 透明角审计、编译审计、SCSS 注入审计、Vue 3 入口审计。仍待用户提供 HBuilderX 新截图完成视觉验收。
|
||||
|
||||
## 2026-07-13 第七轮结构、屋檐与祥云校正
|
||||
|
||||
- 当前家谱题签由“谱印 + 右侧文案列”改为两层结构:上层为谱印和名称,下层为金线分隔后的地点、成员数、管理员三组元信息;三组元信息不再受谱印列宽挤压。
|
||||
- 家谱列表由独立的左侧内容列与右侧操作列改为单一主内容区:第一行是标题、角色与箭头,第二行是地点、成员数与“更新于”日期;`320px` 宽度仅隐藏日期,保留其余信息。
|
||||
- 根页头收窄至 `164rpx`;放大并提高现有祠堂屋檐线稿的可见度,保持其位于 Logo 和标题之后。Tabbar 容器收窄,图标和标签同步提升视觉重量。
|
||||
- 内容左右边距收至 `32rpx`,快捷入口到列表的无效留白减少;山水竹影扩展至两条列表和新建按钮后方,仍低于所有文字和操作层。
|
||||
- `action/create-cloud-v1.png` 已由独立透明 PNG `action/create-cloud-v2.png` 替换;v2 使用项目生成的古金线描祥云,四角透明且有效图形审计通过,旧资产已移除。
|
||||
- 已通过:更新后的 G-01 视觉契约、PNG 透明审计和编译审计。仍待 HBuilderX 的 `360 × 800`、`320 × 568` 截图与 v5 参考稿并排确认,G-01 不标记为设计完成。
|
||||
|
||||
## 2026-07-13 第八轮预览字号校正
|
||||
|
||||
- 根据 HBuilderX 预览,列表第二行的地点、成员数与更新时间分别提升至可读字号,元信息图标同步放大;`320px` 继续只隐藏更新时间。
|
||||
- 新建家谱按钮保留单行文字:缩小云纹和加号的占位宽度,并为按钮文字设置不换行约束,避免“新建家谱”折为两行。
|
||||
- 已通过更新后的 G-01 视觉契约与编译审计;仍待下一张 HBuilderX 截图复核实际观感。
|
||||
|
||||
## 2026-07-13 第九轮顶部状态栏兼容
|
||||
|
||||
- 用户确认根页 `124rpx` 的可视朱砂导航高度符合视觉稿;不再扩大其内容区。
|
||||
- 根页头总高度改为可视导航高度加 `var(--status-bar-height, 0px)`,并以相同变量作为顶部内边距;状态栏不会压缩 Logo、标题和通知入口。
|
||||
- 宣纸纸纹起点使用同一计算高度,避免状态栏存在时红头结束处出现错层。
|
||||
- Android App 配置朱砂状态栏背景和浅色系统图标;仍需在有刘海、无刘海与三键导航 Android 真机复核。
|
||||
|
||||
## 2026-07-13 最终视觉验收
|
||||
|
||||
- 用户已提供 `360 × 800` 正常页、`320 × 568` 顶部与滚动到底部的响应式预览截图:顶部、题签、四个快捷入口、两条列表、新建按钮、山水与 Tabbar 均无重叠;`320 × 568` 下新建按钮可完整滚动至 Tabbar 上方。
|
||||
- 用户已提供 HBuilderX Web 浏览器中 `Pixel 2 XL` 的常规屏预览:页面内容、山水和 Tabbar 均无裁切。
|
||||
- 用户于 2026-07-13 明确确认“没事你标记吧可以了”,据此将 G-01 标记为设计验收完成。该确认不等同于 Android 原生包、真机刘海/三键导航或接口联调验收,以上工作仍按总规划暂停。
|
||||
@@ -1,79 +0,0 @@
|
||||
# G05 家谱总览设计记录
|
||||
|
||||
> 日期:2026-07-14
|
||||
> 状态:视觉候选已实现并完成本轮 Product Design 截图审计;未获用户审美确认,等待 G 模块完成后集中查看。
|
||||
|
||||
## 1. 技能与证据
|
||||
|
||||
- 已调用 `Product Design:index`,将任务路由为现有产品的 `audit`、`get-context` 与实现后设计检查。
|
||||
- 已调用 `Product Design:audit`,以本轮新截的真实 H5 画面为证据,不用旧截图代替。
|
||||
- 已调用 ImageGen 生成完整不透明位图表面;没有用 CSS 伪造卡片、边框或装饰。
|
||||
- 改前证据:`screens/runtime/2026-07-14/g-module-audit/before/01-g05-before-360x800.png`。
|
||||
- 改后证据:`screens/runtime/2026-07-14/g-module-audit/g05/01-g05-ready-360x800.png`、`02-g05-empty-360x800.png`、`03-g05-error-360x800.png`、`04-g05-ready-412x915.png`。
|
||||
- 同画布对照:`screens/runtime/2026-07-14/g-module-audit/g05/05-g05-before-after-comparison.png`,左侧改前、右侧改后;所有判断均基于这张合并输入,不把两个分离预览冒充并排比较。
|
||||
|
||||
## 2. 产品与思维导图参考
|
||||
|
||||
外部只读参考位于 `C:\Users\Rain\Desktop\软件\JOB\app设计`。已查看 `思维导图.png`、`家谱主页.png`、`加入家谱.png` 与 `字辈谱.png`。
|
||||
|
||||
采用的只有信息结构:谱名、堂号、地点和成员概况置顶;世系、录入、字辈、审核作为核心入口;家族内容作为下一层。没有采用外部灰绿色卡片、现代图标、邀请码加入或底部双按钮视觉。
|
||||
|
||||
外部“邀请码加入”与当前产品不一致。当前唯一加入流程是 G06 公开检索 → G08 提交申请 → G09 查看进度 → G10 管理员审核,因此不把邀请码或邀请按钮加入 G05。
|
||||
|
||||
## 3. 路由与状态所有权
|
||||
|
||||
- 唯一路由:`pages/genealogy/g05-genealogy-overview`。
|
||||
- 唯一上下文查询键:`genealogyId`;G01 的旧 `id` 链接已同步迁移,不保留兼容读取。
|
||||
- 同页状态:`loading`、`ready`、`empty`、`error`,不为加载、空数据、无权或失败另建页面。
|
||||
- “录入族人”进入 G03 `step=ancestor&genealogyId=...`;已删除的 G04 不再被引用。
|
||||
- G05 不再把 G08 申请加入表单误写成管理员的“邀请亲人”。
|
||||
|
||||
## 4. OpenAPI 设计边界
|
||||
|
||||
| 页面内容/动作 | OpenAPI 依据 | 页面阶段处理 |
|
||||
| --- | --- | --- |
|
||||
| 谱名、堂号、地区、成员数、可见范围 | `GET /genealogy/app/genealogies/{genealogyId}/overview` | 正常态展示真实接口所需字段;本轮继续使用现有 mock |
|
||||
| 管理设置 | `GET/PUT /genealogy/app/genealogies/{genealogyId}` | 只进入 G11,不在 G05 复制设置表单 |
|
||||
| 世系树 | `GET /genealogy/app/genealogies/{genealogyId}/lineage/tree` | 进入 T01,不在总览加载完整树 |
|
||||
| 录入首代 | `POST /genealogy/app/genealogies/{genealogyId}/lineage/persons` | 进入 G03 的始祖步骤 |
|
||||
| 字辈谱 | `GET/POST /genealogy/app/genealogies/{genealogyId}/generation-poems` | 进入 G12 |
|
||||
| 入谱审核 | `GET .../join-applies/pending`、`PUT .../{applyId}/audit` | 进入 G10 |
|
||||
|
||||
接口响应仍使用通用 `JsonObject/ListResult`,因此页面不臆造邀请码、分享码、视频或多级管理员字段。
|
||||
|
||||
## 5. 位图资产
|
||||
|
||||
- 最终资产:`static/assets/modules/genealogy/opaque/g05-overview-surface.png`。
|
||||
- 尺寸:1122×1506;`Format24bppRgb`,四角 alpha 均为 255。
|
||||
- 内容:墨蓝谱名区、四个完整宣纸入口槽、古金分隔、底部访问说明面;文字和点击层不烘焙进图片。
|
||||
- ImageGen 使用 `ui-mockup` 模式,参考 G05 改前 360×800 截图,明确要求无文字、无图标、无占位符、无现代玻璃拟态。
|
||||
|
||||
## 6. Product Design 审计
|
||||
|
||||
### 改前主要风险
|
||||
|
||||
1. G05 的“录入族人”指向已删除 G04,核心动作实际不可达。
|
||||
2. “邀请亲人”跳到申请者填写的 G08,角色和任务语义错误;OpenAPI 也没有邀请端点。
|
||||
3. 深色头、四宫格卡片和底部邀请面均由 CSS 拼接,不符合完整视觉表面必须使用位图的项目规则。
|
||||
4. 只有模糊载入文案,没有区分空数据、无权限和加载失败。
|
||||
|
||||
### 改后步骤与健康度
|
||||
|
||||
1. `ready`:健康。谱名和成员概况在墨蓝区,四个核心任务在首屏可见,家族近况和访问说明层级清楚。
|
||||
2. `empty`:健康。仍在 G05 路由内说明缺少上下文,并返回“我的家谱”。
|
||||
3. `error`:健康。说明网络、数据或权限三类可能原因,提供同页重试。
|
||||
4. 412×915:健康。位图、文字和点击槽同步放大,没有横向溢出或裁切。
|
||||
|
||||
### 可访问性边界
|
||||
|
||||
- 本轮从截图确认了文字未裁切、主要入口具有完整卡片面积、按钮文案可见。
|
||||
- 审计后已提高谱名区元信息、入口说明、近况和底部说明字号,降低 360 宽屏小字风险。
|
||||
- 截图不能证明读屏语义、键盘焦点和 Android 字体放大行为;这些留到真机与可访问性专项验证,不能宣称完整 WCAG 合规。
|
||||
|
||||
## 7. 验证
|
||||
|
||||
- `tests/g05-overview-contract.ps1`
|
||||
- `tests/g05-overview-runtime-smoke.js`
|
||||
- `tests/g01-visual-contract.ps1`
|
||||
|
||||
以上在实现后均已通过;最终集中审美确认前不将 G05 标记为视觉冻结。
|
||||
@@ -1,81 +0,0 @@
|
||||
# G08–G10 入谱申请链路设计记录
|
||||
|
||||
> 日期:2026-07-14
|
||||
> 状态:页面候选、本地模拟交互与本轮 Product Design 截图审计已完成;标记为 `[~]`,等待后续逐页视觉审核。
|
||||
|
||||
## 1. Product Design 工作流
|
||||
|
||||
- `Product Design:index`:将工作路由为现有产品的上下文确认、截图审计和实现后设计检查。
|
||||
- `Product Design:audit`:本轮重新捕获 G08–G10 的表单、成功、列表、空态和 412 宽屏,不使用旧通用壳图冒充最终证据。
|
||||
- ImageGen:生成 `application-record-card.png`,并在截图审计发现假按钮后精确编辑出 `application-status-card.png`。
|
||||
- TDD:`tests/g08-g10-application-flow-contract.ps1` 与运行冒烟先因通用壳和缺少同页状态红灯,再由最小实现转绿。
|
||||
|
||||
## 2. 思维导图与外部参考
|
||||
|
||||
已查看 `C:\Users\Rain\Desktop\软件\JOB\app设计\思维导图.png` 与 `加入家谱.png`。外部参考的“加入家谱”依赖邀请码,但当前 OpenAPI 没有邀请码端点,因此不采用该流程。
|
||||
|
||||
当前申请链路唯一结构是:G06 公开家谱检索 → G08 填写真实身份与关系 → G09 查看自己的全部申请 → G10 管理员审核。三个阶段是不同用户任务,保留三条路由;各自的加载、空、失败、提交成功和审核结果只作为原路由状态,不再拆页。
|
||||
|
||||
## 3. 页面与状态
|
||||
|
||||
| 页面 | 独立任务 | 同页状态 |
|
||||
| --- | --- | --- |
|
||||
| G08 | 对某一 `genealogyId` 提交加入申请 | `form`、提交中、`success`、`error` |
|
||||
| G09 | 当前用户查看全部申请 | `loading`、`list`、`empty`、`error`;`PENDING/APPROVED/REJECTED` 为卡内状态 |
|
||||
| G10 | 当前家谱管理员审核待处理申请 | `loading`、`list`、`empty`、`error`;审核确认与结果留在卡内 |
|
||||
|
||||
G07/G08/G09 的旧 `ModulePage` 目录条目已经删除;G07 结果态继续只归 G06。
|
||||
|
||||
## 4. OpenAPI 功能参考
|
||||
|
||||
| 页面动作 | OpenAPI |
|
||||
| --- | --- |
|
||||
| G08 提交 | `POST /genealogy/app/genealogies/{genealogyId}/join-applies` |
|
||||
| G09 我的申请 | `GET /genealogy/app/genealogies/join-applies/mine` |
|
||||
| G09 撤销边界 | `DELETE /genealogy/app/genealogies/join-applies/{applyId}`;本轮页面不展示未接入的撤销按钮 |
|
||||
| G10 待审核列表 | `GET /genealogy/app/genealogies/{genealogyId}/join-applies/pending` |
|
||||
| G10 审核 | `PUT /genealogy/app/genealogies/{genealogyId}/join-applies/{applyId}/audit` |
|
||||
|
||||
OpenAPI 的申请体仍是 `JsonObject`,页面只使用已有业务能解释的 `realName`、`relation`、`message`,没有臆造邀请码、推荐人层级或多管理员审批字段。本阶段只据此安排字段、状态和动作位置;三页均使用页面内模拟数据与交互,不调用 `appApi`,不进行接口对接。
|
||||
|
||||
## 5. 视觉资产
|
||||
|
||||
- G08 复用 `g03-create-flow-panel.png` 的完整宣纸表单面,以及 `g06-search-input-wide.png` 的完整输入框皮肤;没有复制近似资产。
|
||||
- `application-record-card.png`:1050×360、24 位 RGB、不透明;右下留双审核槽,只供 G10 列表。
|
||||
- `application-status-card.png`:1050×360、24 位 RGB、不透明;移除双审核槽,供 G09 列表和 G09/G10 空/失败状态。
|
||||
- 主次操作分别使用 `a01-primary-button.png` 与 `a01-secondary-button.png`,CSS 只负责位置、文字和点击层。
|
||||
|
||||
## 6. 截图证据
|
||||
|
||||
- G08:`screens/runtime/2026-07-14/g-module-audit/applications/01-g08-form-360x800.png`、`02-g08-success-360x800.png`、`03-g08-form-412x915.png`。
|
||||
- G09:`04-g09-list-360x800.png`、`05-g09-empty-360x800.png`。
|
||||
- G10:`06-g10-list-360x800.png`、`07-g10-empty-360x800.png`、`08-g10-list-412x915.png`。
|
||||
- 同画布对照:`09-g08-form-success-comparison.png`、`10-g09-list-empty-comparison.png`、`11-g10-list-empty-comparison.png`。
|
||||
|
||||
## 7. Product Design 审计结果
|
||||
|
||||
### 强项
|
||||
|
||||
1. G08 表单在 360/412 下均完整显示,姓名、关系、说明和提交按钮顺序清楚;提交后仍在 G08 显示成功结果。
|
||||
2. G09 的申请状态以审核中、已通过、未通过映射接口枚举;通过项才可进入家谱。
|
||||
3. G10 的拒绝/通过使用主次完整位图按钮,动作前有确认弹窗,避免误审。
|
||||
4. 三页的空态均留在原路由,没有新增状态页。
|
||||
|
||||
### 已修复问题
|
||||
|
||||
- P2:第一张共享卡为审核按钮预留了两个槽,放到 G09 和空态时形成假按钮。已生成无按钮槽的状态卡并重新截图,问题消失。
|
||||
- P2:运行冒烟最初在面板出现后立即查找原生输入,可能早于 `uni-input` 内部节点渲染。测试改为等待真实输入节点,再填写和点击;真实提交已到达同页成功态。
|
||||
|
||||
### 可访问性边界
|
||||
|
||||
- 截图可确认主按钮、审核按钮、表单顺序和文字未裁切。
|
||||
- G10 审核按钮在 360 下仍有完整卡内点击区域,但最终 Android 真机仍需验证触摸目标、字体放大和读屏标签。
|
||||
- 截图不能证明弹窗焦点管理或读屏状态播报,不宣称完整无障碍合规。
|
||||
|
||||
## 8. 验证
|
||||
|
||||
- `G08-G10-APPLICATION-FLOW-CONTRACT PASS`
|
||||
- `G08-G10-APPLICATION-FLOW-RUNTIME-SMOKE PASS`,包含真实控件填写与本地模拟提交
|
||||
- `PASS compile audit`
|
||||
|
||||
三页仅标记为候选完成,用户集中看样式前不标记为视觉冻结。
|
||||
@@ -1,51 +0,0 @@
|
||||
# G11–G12 家谱设置与字辈诗设计记录
|
||||
|
||||
> 日期:2026-07-14
|
||||
> 状态:页面候选、同页状态、运行截图与 Product Design 对比审视已完成;标记为 `[~]`,等待用户后续逐页视觉审核。
|
||||
|
||||
## 1. 设计边界
|
||||
|
||||
- 继续使用项目已冻结的宣纸、朱砂、藏青与古金视觉体系,不照搬外部参考的颜色、卡片或按钮。
|
||||
- OpenAPI 只用于确认可设计的功能位置与数据语义,不导入 `appApi`、不新增 API 方法、不进行接口联调。
|
||||
- G11 与 G12 的空、失败、成功、编辑状态全部留在原路由,不为同一任务新增页面。
|
||||
- G11 不放置“转让管理权”假入口:该动作需要成员选择上下文,当前页面只安排名称、公开范围和访问说明。
|
||||
|
||||
## 2. 页面与状态
|
||||
|
||||
| 页面 | 核心任务 | 同页状态 |
|
||||
| --- | --- | --- |
|
||||
| G11 | 编辑家谱名称、公开范围、访问说明 | `loading`、`form`、`success`、`error` |
|
||||
| G12 | 查看逐代字辈、批量录入连续字辈 | `loading`、`list`、`empty`、`edit`、`error` |
|
||||
|
||||
G11 的公开范围提供“仅成员可见”和“公开可申请”两个明确选项,并给出权限解释。G12 采用外部思维导图可借鉴的逐世代行结构,但视觉表面仍完全使用本项目资产;编辑区保留接口清单所描述的连续 `content` 与“缺失旧世代时停止”策略位置。
|
||||
|
||||
## 3. 视觉资产
|
||||
|
||||
- 两页复用 `g03-create-flow-panel.png` 作为完整双金线宣纸面板。
|
||||
- 输入、字辈行使用 `g06-search-input-wide.png` 完整位图皮肤。
|
||||
- 主次操作分别使用 `a01-primary-button.png` 与 `a01-secondary-button.png`。
|
||||
- CSS 只负责布局、真实文字和点击层,不绘制卡片背景、边框、圆角或装饰。
|
||||
- 现有资产已能覆盖页面,因此本轮没有调用 ImageGen 新增近似资产。
|
||||
|
||||
## 4. 截图证据
|
||||
|
||||
目录:`screens/runtime/2026-07-14/g-module-audit/settings-poems/`
|
||||
|
||||
- 改前基线:`00-g11-before-360x800.png`、`00-g12-before-360x800.png`。
|
||||
- G11:`01-g11-form-360x800.png`、`02-g11-success-360x800.png`、`03-g11-form-412x915.png`。
|
||||
- G12:`04-g12-list-360x800.png`、`05-g12-empty-360x800.png`、`06-g12-edit-360x800.png`、`07-g12-list-412x915.png`。
|
||||
- 同画布对比:`08-g11-before-after-comparison.png`、`09-g12-before-after-comparison.png`。
|
||||
|
||||
## 5. Product Design 审视
|
||||
|
||||
- G11 相比通用设置壳,信息层级变为“设置目的 → 名称 → 公开范围及权限解释 → 访问说明 → 保存”,不再出现无法完成的管理权转让入口。
|
||||
- G12 相比通用详情壳,逐世代字辈可直接扫描,当前字辈使用朱砂强调;空态与编辑态仍保持同一页面语义。
|
||||
- 360 × 800 与 412 × 915 下,完整面板、按钮和底部山水均未被裁切;编辑态主次动作层级清楚。
|
||||
- 截图不能证明 Android 字体放大、读屏播报和真机触摸区域,留到最终真机验证阶段。
|
||||
|
||||
## 6. 验证
|
||||
|
||||
- `G11-G12-SETTINGS-POEMS-CONTRACT PASS`
|
||||
- `G11-G12-SETTINGS-POEMS-RUNTIME-SMOKE PASS`
|
||||
- 页面代码不引用 `@/utils/api.js` 或 `appApi`。
|
||||
|
||||
@@ -1,192 +0,0 @@
|
||||
# P00 页面结构与资产清单
|
||||
|
||||
> 状态覆盖:当前实际为 52 条活动路由、52 页全部 `[~]` 待审核、0 页冻结;A06 已封存且保留实现。页面状态以 `docs/交接记录.md` 与 `docs/验收规划.md` 为准。
|
||||
> 目的:让页面、路由和资产都有唯一、可读、可审计的归属;本文件是 P-00 的执行清单。
|
||||
|
||||
## 1. 页面命名规则
|
||||
|
||||
最终页面文件遵循 `<页面编号>-<语义名>.vue`:
|
||||
|
||||
- 账户:`a01-entry.vue`、`a02-login.vue`、`a04-register.vue`、`a05-reset-password.vue`、`a06-auth-status.vue`
|
||||
- 家谱:`g01-my-genealogies.vue`、`g03-create-genealogy.vue`
|
||||
- 世系:`t01-tree-overview.vue`、`t03-member-profile.vue`
|
||||
- 家族:`f01-family-feed.vue`、`f02-publish-feed.vue`
|
||||
- 消息:`n01-message-center.vue`
|
||||
- 我的:`m01-profile-home.vue`
|
||||
|
||||
尚未被全量设计确认、但为了保留现有功能骨架的通用页面,必须在文件名中使用 `skeleton`,不能使用含义不明的 `index.vue`、`list.vue`、`detail.vue`。
|
||||
|
||||
## 2. 首批 15 个路由的历史迁移映射
|
||||
|
||||
| 当前路由 | 当前可确认用途 | 目标文件 | 处理状态 |
|
||||
| --- | --- | --- | --- |
|
||||
| `pages/auth/a01-entry` | A01 启动/登录引导 | `pages/auth/a01-entry.vue` | 7 类非滑动验证视觉状态已获用户确认;真实滑动验证用接口组件自带样式,待接入审核;Android 复核前保持 `[~]` |
|
||||
| `pages/auth/a04-register` | A04 注册账号 | `pages/auth/a04-register.vue` | 当前 8 类 H5 视觉状态已获用户确认;真实滑动验证、接口结果态与 Android/HBuilderX 待审核;保持 `[~]` |
|
||||
| `pages/auth/a05-reset-password` | A05 重置密码 | `pages/auth/a05-reset-password.vue` | 当前 7 类 H5 视觉状态已获用户确认;接口回流手机号/焦点、真实滑动验证与 Android/HBuilderX 待审核;保持 `[~]` |
|
||||
| (已从 `pages.json` 移除) | A06 登录阻断状态(封存) | `pages/auth/a06-auth-status.vue` | 用户确认当前样式没有问题,但当前流程暂时不用;源码、测试和证据保留,不计入活动验收统计,恢复时重新接入真实入口并审核 |
|
||||
| `pages/auth/a02-login` | A02 账号登录 | `pages/auth/a02-login.vue` | 已迁移;已验收,视觉冻结 |
|
||||
| `pages/genealogy/g01-my-genealogies` | G01 我的家谱 | `pages/genealogy/g01-my-genealogies.vue` | 用户已选择 C 作为 9 个 G 页面的公共背景;完整宽度显示、固定贴底与上方宣纸承接的新四档 H5 候选待复核,整页仍为 `[~]`,固定区/独立滚动和 Android 待审核 |
|
||||
| `pages/genealogy/g03-create-genealogy` | G03 创建家谱/始祖录入 | `pages/genealogy/g03-create-genealogy.vue` | `step=create|ancestor`;已获用户验收,视觉冻结 |
|
||||
| `pages/genealogy/g05-genealogy-overview` | G05 家谱总览 | `pages/genealogy/g05-genealogy-overview.vue` | `loading|ready|empty|error`;视觉候选已实现,待集中审美确认 |
|
||||
| `pages/genealogy/g06-search-genealogies` | G06 公开家谱搜索/结果/无结果 | `pages/genealogy/g06-search-genealogies.vue` | 已收敛 G07;朱砂题签三态候选已截图,待集中审美确认 |
|
||||
| `pages/genealogy/g08-join-application` | G08 申请加入家谱 | `pages/genealogy/g08-join-application.vue` | `form|success|error`;本地模拟提交已验证,待集中审美确认 |
|
||||
| `pages/genealogy/g09-my-applications` | G09 我的申请 | `pages/genealogy/g09-my-applications.vue` | `loading|list|empty|error`;待集中审美确认 |
|
||||
| `pages/genealogy/g10-application-review` | G10 管理员入谱审核 | `pages/genealogy/g10-application-review.vue` | `loading|list|empty|error`;待集中审美确认 |
|
||||
| `pages/tree/t01-tree-overview` | T01 世系树总览 | `pages/tree/t01-tree-overview.vue` | 已收敛 T02 四态;视觉候选待审 |
|
||||
| `pages/tree/t03-member-profile` | T03 成员档案 | `pages/tree/t03-member-profile.vue` | 详情/失败候选待审 |
|
||||
| `pages/family/f01-family-feed` | F01 家族动态 | `pages/family/f01-family-feed.vue` | 已迁移;未验收 |
|
||||
| `pages/family/f02-publish-feed` | F02 发布动态 | `pages/family/f02-publish-feed.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` | 已迁移;未验收 |
|
||||
|
||||
上述表仅保留首批迁移的历史背景;当前最终 54 路由、文件存在性和中文编号注释的唯一合同是 `tests/full-page-visual-contract.ps1`。临时 `content-list-skeleton` 已由谱文、相册、礼仪、备忘录和字辈诗最终页面替代并移除。
|
||||
|
||||
迁移要求:同一轮更新页面文件、`pages.json`、所有跳转路径、测试和中文文件头注释;未完成全部引用更新时,不得删除旧路径。
|
||||
|
||||
## 3. 最终资产目录
|
||||
|
||||
```text
|
||||
static/assets/
|
||||
foundation/
|
||||
opaque/
|
||||
page-paper.jpg
|
||||
auth-page-paper.jpg
|
||||
auth-header.png
|
||||
a01-primary-button.png
|
||||
a01-secondary-button.png
|
||||
root-header-cinnabar.jpg
|
||||
transparent/
|
||||
brand-seal.png
|
||||
auth-title-cloud.png
|
||||
auth-divider-knot.png
|
||||
...
|
||||
modules/
|
||||
auth/
|
||||
opaque/
|
||||
a02-login-panel.png
|
||||
transparent/
|
||||
a02-agreement-unchecked.png
|
||||
a02-agreement-checked.png
|
||||
genealogy/
|
||||
opaque/
|
||||
g01-empty-panel.png
|
||||
g03-create-flow-panel.png
|
||||
g05-overview-surface.png
|
||||
g06-search-title-strip.png
|
||||
g06-search-input-wide.png
|
||||
g06-search-button.png
|
||||
application-record-card.png
|
||||
application-status-card.png
|
||||
transparent/
|
||||
tree/
|
||||
opaque/
|
||||
transparent/
|
||||
family/
|
||||
opaque/
|
||||
transparent/
|
||||
```
|
||||
|
||||
当前已迁入的资产以第 4 节台账为准。A01 已引用版本化的卷轴祥云四件套 v3:主/次按钮与弹窗使用 `aspectFit`,Toast 使用固定切片的 `border-image`;文字和交互由代码承载。旧资产与 v2 试点资产保留,不覆盖、不删除。v3 已通过本机自动质量门和 H5 四尺寸检查,但尚未获得 Android 与用户验收。
|
||||
|
||||
## 4. 当前资产台账
|
||||
|
||||
以下为当前唯一可用资产路径。尺寸为原始像素;页面中的显示尺寸仍以组件/页面样式为准。
|
||||
|
||||
| 路径 | 属性/尺寸 | 用途 | 引用位置 | 状态 |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| `foundation/opaque/auth-page-paper.jpg` | opaque / 750×1334 | 认证页纸纹底色 | A01、A02、A04、A05、A06 | 保留 |
|
||||
| `foundation/opaque/auth-header.png` | opaque / 750×196 | 认证页红色页头 | A01、A02、A04、A05、A06 | 保留 |
|
||||
| `foundation/opaque/page-paper.jpg` | opaque / 852×1846 | 根页宣纸底图 | G、T、F、R、N、M 非认证页面 | 保留 |
|
||||
| `foundation/opaque/root-header-cinnabar.jpg` | opaque / 720×184 | 根页朱砂页头 | `PageHeader` | 保留 |
|
||||
| `foundation/transparent/auth-ink-scenery.png` | transparent / 750×1334 | 认证页淡墨叠层 | A01、A02、A04、A05、A06 | 保留 |
|
||||
| `foundation/transparent/auth-title-cloud.png` | transparent / 200×120 | 认证标题右侧云纹 | A01、A02、A04、A05、A06 | 保留 |
|
||||
| `foundation/transparent/auth-divider-knot.png` | transparent / 160×96 | 认证标题与正文结饰 | A01、A04、A05、A06 | 保留 |
|
||||
| `foundation/opaque/a01-primary-button.png` | opaque / 1877×418 | 旧朱砂主按钮皮肤 | 其他仍实际引用的模块页面 | 暂时保留;A01、A04、A05、A06 已停止引用,其他页面需逐页迁移 |
|
||||
| `foundation/opaque/a01-secondary-button.png` | opaque / 1881×419 | 旧宣纸次按钮皮肤 | 其他仍实际引用的页面 | 暂时保留;A01 可见按钮和 Toast 已停止引用,其他页面未逐页迁移 |
|
||||
| `foundation/transparent/a01-primary-button-v2.png` | transparent / 1866×276 | A01 固定槽位主按钮历史试点 | 当前 A01 已停止引用 | 保留,不覆盖、不删除 |
|
||||
| `foundation/transparent/a01-secondary-button-v2.png` | transparent / 1866×300 | A01 固定槽位次按钮历史试点 | 当前 A01 已停止引用 | 保留,不覆盖、不删除 |
|
||||
| `foundation/transparent/a01-scroll-primary-v3.png` | transparent / 1866×276 | 卷轴祥云朱砂主按钮皮肤 | A01 登录、A04 注册、A05 重设、A06 恢复入口及弹层按钮 | A01/A04/A05 当前 H5 状态已获用户确认;A06 待逐态审核;均待 Android 复核 |
|
||||
| `foundation/transparent/a01-scroll-secondary-v3.png` | transparent / 1866×300 | 卷轴祥云宣纸次按钮皮肤 | A01 微信按钮 | 用户 H5 视觉审核通过;待 Android 复核 |
|
||||
| `foundation/transparent/a01-scroll-toast-v3.png` | transparent / 1770×246 | 卷轴祥云 Toast 可切片表面 | A01、A04、A05 自定义反馈 Toast | A01/A04 用户 H5 审核通过;A05 待逐态审核;均待 Android 复核 |
|
||||
| `modules/auth/transparent/a01-scroll-dialog-v3.png` | transparent indexed PNG / 1860×1560 | 卷轴祥云对话容器 | A01 历史验证占位、A05 成功结果、A06 恢复说明 | A01 不得用于最终滑动验证;A05/A06 仅用于本地结果或说明候选 |
|
||||
| `modules/auth/opaque/a02-login-panel.png` | opaque / 940×1672 | 旧认证完整卷轴面板 | 当前认证页无引用 | 历史保留,不覆盖、不删除 |
|
||||
| `modules/auth/transparent/a02-agreement-unchecked.png` | transparent / 96×96 | 认证未同意协议图标 | A01、A04 协议确认行 | 保留;A01/A04 用户 H5 审核通过 |
|
||||
| `modules/auth/transparent/a02-agreement-checked.png` | transparent / 96×96 | 认证已同意协议图标 | A01、A04 协议确认行 | 保留;A01/A04 用户 H5 审核通过 |
|
||||
| `foundation/transparent/auth-login-outline.png` | transparent / 96×96 | 登录/状态图标 | A01、A06 | 保留 |
|
||||
| `foundation/transparent/auth-wechat.png` | transparent / 96×96 | 微信图标 | A01 | 保留 |
|
||||
| `foundation/transparent/brand-seal.png` | transparent / 240×288 | 品牌谱印 | A01、A02、A04、A05、A06、G06、`PageHeader` | 保留 |
|
||||
| `foundation/transparent/root-header-hall.png` | transparent / 750×300 | 根页祠堂线稿 | `PageHeader` | 保留 |
|
||||
| `foundation/transparent/footer-mountain-bamboo.png` | transparent / 750×360 | 根页底部山水竹影 | G01、G06 | 保留 |
|
||||
| `foundation/transparent/notice.png` | transparent / 96×96 | 通知图标 | `PageHeader` | 保留 |
|
||||
| `foundation/transparent/chevron-right.png` | transparent / 96×96 | 返回与列表箭头 | A02、A04、A05、A06、`GenealogyCard` | 保留 |
|
||||
| `docs/design/assets/g01-background/masters/g01-list-background-direction-a-chroma-master.png` | candidate master / 1024×1536 | G01 背景 A,绿幕透明历史候选 | 未接入 | 母版保留,不删除 |
|
||||
| `docs/design/assets/g01-background/masters/g01-list-background-direction-b-chroma-master.png` | candidate master / 1024×1536 | G01 背景 B,绿幕透明历史候选 | 未接入 | 母版保留,不删除 |
|
||||
| `docs/design/assets/g01-background/masters/g01-list-background-direction-c-paper-master.png` | historical selected master / 1024×1536 | 上一轮 G 模块公共暖宣纸背景 C 的稳定母版 | `genealogy-page-background.png` | 历史方向保留,不删除 |
|
||||
| `docs/design/assets/g01-background/masters/genealogy-page-background-long-flagship-imagegen-source.png` | source master / 793×1983 | 用户确认的连续长背景原始 ImageGen 输出 | 归一化母版输入 | 原稿保留,不删除 |
|
||||
| `docs/design/assets/g01-background/masters/genealogy-page-background-long-flagship-master.png` | selected master / 1536×3840 | G 模块旗舰长屏连续背景稳定母版 | `genealogy-page-background-long.png` | 当前选定母版;确定性输出输入 |
|
||||
| `modules/genealogy/opaque/genealogy-page-background.png` | opaque / 1024×1536 | 上一轮 C 公共运行图 | 当前无页面入口 | 历史输出保留,不删除 |
|
||||
| `modules/genealogy/opaque/genealogy-page-background-long.png` | opaque / 1440×3600 | G 模块公共旗舰长屏云竹亭台连续宣纸景 | 9 个活动 G 页面通过 `GenealogyPageBackground.vue` 使用,`widthFix` 固定贴底 | 当前公共运行输出;H5 候选已覆盖五档,待逐页审核及 Android 复核 |
|
||||
| `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、G08、G11、G12、T01、T03 至 T06、T08、F/R/N/M 表单/详情/设置/状态 | 保留;由 ImageGen 生成,G03 已获用户验收,复用页待审 |
|
||||
| `modules/genealogy/opaque/g05-overview-surface.png` | opaque / 1122×1506 | 家谱总览完整视觉表面,含墨蓝谱名区、四宫格宣纸槽、金线近况分隔与底部访问说明面 | G05 `loading|ready|empty|error` | 保留;由 ImageGen 参考 G05 改前截图生成,页面只叠放真实文字和点击层;待集中审美确认 |
|
||||
| `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 | 宽版独立宣纸字段完整皮肤,含古金双线与角饰 | G、T 与 F/R/N/M 输入、详情段落、设置行 | 保留;真实文字与控件叠放其上 |
|
||||
| `modules/genealogy/opaque/g06-search-input.png` | opaque / 720×248 | 早期窄版输入框完整皮肤 | 当前无引用 | 已停用;仅因用户要求停止工作而保留,恢复工作后需在引用扫描通过且用户允许时删除 |
|
||||
| `modules/genealogy/opaque/g06-search-button.png` | opaque / 300×132 | 独立朱砂搜索按钮完整皮肤,含古金双线与角饰 | G06 真实搜索点击控件底层 | 保留;由 ImageGen 生成,真实点击控件与文本叠放其上 |
|
||||
| `modules/genealogy/opaque/application-record-card.png` | opaque / 1050×360 | 带右下双审核槽的完整申请记录卡 | G10 待审核申请 | 保留;由 ImageGen 参考 G09/G10 改前截图生成,按钮另用完整位图叠放 |
|
||||
| `modules/genealogy/opaque/application-status-card.png` | opaque / 1050×360 | 无按钮槽的完整信息状态卡 | G09/G10、T01/T07/T08、F/R/N/M 列表/时间轴/通知/状态 | 保留;由 ImageGen 精确移除审核槽,避免无操作状态出现假按钮 |
|
||||
| `foundation/transparent/meta-location.png` | transparent / 96×96 | 地点元信息 | G01、`GenealogyCard` | 保留 |
|
||||
| `foundation/transparent/meta-member.png` | transparent / 96×96 | 成员元信息 | G01、`GenealogyCard` | 保留 |
|
||||
| `foundation/transparent/meta-admin.png` | transparent / 96×96 | 管理员元信息 | G01 | 保留 |
|
||||
| `foundation/transparent/tab-genealogy.png` | transparent / 96×96 | 家谱 Tab 默认态 | `AppTabbar` | 保留 |
|
||||
| `foundation/transparent/tab-genealogy-active.png` | transparent / 96×96 | 家谱 Tab 选中态 | `AppTabbar` | 保留 |
|
||||
| `foundation/transparent/tab-family.png` | transparent / 96×96 | 家族 Tab 默认态 | `AppTabbar` | 保留 |
|
||||
| `foundation/transparent/tab-family-active.png` | transparent / 96×96 | 家族 Tab 选中态 | `AppTabbar` | 保留 |
|
||||
| `foundation/transparent/tab-profile.png` | transparent / 96×96 | 我的 Tab 默认态 | `AppTabbar` | 保留 |
|
||||
| `foundation/transparent/tab-profile-active.png` | transparent / 96×96 | 我的 Tab 选中态 | `AppTabbar` | 保留 |
|
||||
| `modules/genealogy/transparent/current-slip-frame.png` | transparent / 720×272 | 当前家谱题签框 | G01 | 保留 |
|
||||
| `modules/genealogy/transparent/list-slip-frame.png` | transparent / 720×144 | 家谱列表题签框 | `GenealogyCard` | 保留 |
|
||||
| `modules/genealogy/transparent/section-divider.png` | transparent / 720×30 | G01 分区金线 | G01 | 保留 |
|
||||
| `modules/genealogy/transparent/current-seal-frame.png` | transparent / 144×208 | 当前家谱谱印框 | G01 | 保留 |
|
||||
| `modules/genealogy/transparent/row-seal-frame.png` | transparent / 112×160 | 列表谱印框 | `GenealogyCard` | 保留 |
|
||||
| `modules/genealogy/transparent/create-cloud.png` | transparent / 192×96 | 新建/搜索状态云纹 | G01、G06 | 保留 |
|
||||
| `modules/genealogy/transparent/add.png` | transparent / 96×96 | 新建入口加号 | G01 | 保留 |
|
||||
| `modules/genealogy/transparent/shortcut-tree.png` | transparent / 96×96 | 世系图入口 | G01 | 保留 |
|
||||
| `modules/genealogy/transparent/shortcut-members.png` | transparent / 96×96 | 成员入口 | G01 | 保留 |
|
||||
| `modules/genealogy/transparent/shortcut-generation-poem.png` | transparent / 96×96 | 字辈诗入口 | G01 | 保留 |
|
||||
| `modules/genealogy/transparent/shortcut-application.png` | transparent / 96×96 | 审核入口 | G01 | 保留 |
|
||||
|
||||
本轮已迁入 38 项在用资产,删除 24 项运行时零引用的旧副本。A01 的两张完整按钮皮肤与 G06 检索资产均由图像生成工具制作,不是设计图裁切;G06 不再使用大型检索面板,当前使用朱砂题签、宽版输入框与搜索按钮三张独立位图,页面只叠放真实品牌印、文字与交互控件。旧版设计记录中的历史路径不再是资产依据;后续只按本台账引用和维护。
|
||||
|
||||
## 5. 混合资产属性规则
|
||||
|
||||
完整生产、质量门和换机恢复方法以 `docs/design/设计资产生产流水线规范.md` 为准。P00 只登记最终资产归属,不重复维护算法和阈值。
|
||||
|
||||
| 类型 | 文件格式与内容 | 典型用途 | 页面使用规则 |
|
||||
| --- | --- | --- | --- |
|
||||
| 代码原生 | Vue/SCSS,不产生图片 | 布局、文字、间距、普通分隔线、纯色和交互状态 | 不伪造复杂品牌装饰;普通内容保持正常布局流 |
|
||||
| 固定比例位图 | JPG、PNG 或 WebP;比例与槽位一致 | 宗祠、水墨背景、固定比例复杂视觉面 | manifest 声明槽位和 `uniform-only`;禁止变形拉伸 |
|
||||
| 透明叠加图 | RGBA PNG/WebP;外缘透明、主体边界干净 | Logo、图标、祥云、谱印、分隔纹 | manifest 声明 Alpha 与边缘策略;禁止白边、绿边 |
|
||||
| 可伸缩装饰框 | 九宫格或经过验证的等价组件资产 | 多宽度按钮框、卡片框、弹窗框 | 必须先验证 H5 与 Android;四角和边线不得被整体拉伸 |
|
||||
| 平铺纹理 | 可无缝重复的小图 | 宣纸、无方向纹理 | manifest 明确平铺/覆盖策略,不承担文字或边框 |
|
||||
|
||||
禁止项:整页截图、设计图局部页面裁切、半边边框、按钮角标拼接、临时 CSS/SVG 伪造复杂品牌装饰、未声明的 `scaleToFill`/`fit: 'fill'`、同一语义的多版本长期共存。
|
||||
|
||||
## 6. 资产清理登记规则
|
||||
|
||||
每项现有资产必须登记以下字段后才可以决定保留或删除:
|
||||
|
||||
| 字段 | 含义 |
|
||||
| --- | --- |
|
||||
| 当前路径 | 盘点时的真实文件路径 |
|
||||
| 语义用途 | 它服务的视觉元素,而不是模糊类别 |
|
||||
| 背景属性 | `opaque` 或 `transparent` |
|
||||
| 代码引用 | 页面、组件、配置或测试中的引用位置 |
|
||||
| 替代资产 | 若要迁移,写入唯一的新路径;无替代则留空 |
|
||||
| 决定 | `保留`、`迁移后删除` 或 `无引用删除` |
|
||||
|
||||
执行顺序固定为:扫描引用 → 填写登记 → 迁移引用 → 编译与截图验证 → 删除旧资产 → 再次扫描确认零引用。任何一步失败都停止删除。
|
||||
|
||||
## 7. 中文注释约定
|
||||
|
||||
每个页面和组件文件以中文注释写清页面编号、用途和关键依赖;模板至少区分背景、页头、主体、操作、状态五类区域。资产图层、路由跳转、非直观状态和防回归样式要解释“为什么这样写”。显而易见的单行 CSS 不写噪声注释。
|
||||
@@ -1,46 +0,0 @@
|
||||
# T01–T08 世系与成员设计记录
|
||||
|
||||
> 日期:2026-07-14
|
||||
> 状态:T02 已收敛至 T01;T01、T03–T08 共 7 个页面候选、运行截图和 Product Design 审视完成,统一标记 `[~]`。
|
||||
|
||||
## 1. 信息架构
|
||||
|
||||
- T01 是阅读世系的唯一页面,`tree|landscape|empty|error` 为同页状态;T02 路由、文件和目录条目已删除。
|
||||
- T03 负责成员档案;T04 新增亲属、T05 编辑成员、T06 维护关系分别保留独立任务页,但共享同一高质量表单母版。
|
||||
- T07 是成员检索目录;T08 将隐私、离世纪念和无权限保留为同一路由的三个状态,不拆成重复页面。
|
||||
- 接口文档仅用于确定成员字段、关系冲突、隐私和状态位置;所有候选使用页面内模拟数据,不调用 `appApi`。
|
||||
|
||||
## 2. 视觉体系
|
||||
|
||||
- 延续已确认的宣纸、朱砂、古金与墨褐体系。
|
||||
- 世系画布和成员表单复用 `g03-create-flow-panel.png` 完整宣纸面;成员节点/字段使用 `g06-search-input-wide.png`;信息条、目录卡和状态卡使用 `application-status-card.png`。
|
||||
- 主次操作使用 `a01-primary-button.png`/`a01-secondary-button.png`,CSS 仅负责布局、文字和点击层。
|
||||
- 现有完整位图已覆盖需要,因此没有生成语义重复的新资产。
|
||||
|
||||
## 3. Product Design 截图审视
|
||||
|
||||
### T01
|
||||
|
||||
目录:`screens/runtime/2026-07-14/t01-audit/`
|
||||
|
||||
- 候选:`04-t01-tree-360x800.png`、`05-t01-landscape-360x800.png`、`06-t01-empty-360x800.png`、`07-t01-error-360x800.png`、`08-t01-tree-412x915.png`。
|
||||
- 对比:`09-t01-before-after-comparison.png`。
|
||||
- 首轮状态截图发现状态文案位于 1180rpx 横向画布中导致右侧裁切;先更新契约要求 `tree-canvas--state`,再将非树状态画布收窄到当前视口,重新截图后已完整显示。
|
||||
|
||||
### T03–T08
|
||||
|
||||
目录:`screens/runtime/2026-07-14/t-module-audit/`
|
||||
|
||||
- 关键候选:`01-t03-detail-360x800.png` 至 `13-t07-list-412x915.png`。
|
||||
- 同画布对比:`14-t03-comparison.png`、`15-t04-t06-comparison.png`、`16-t07-t08-comparison.png`。
|
||||
- 360/412 下表单字段、成员卡、状态切换和主次操作均未裁切;T06 冲突动作与 T08 三种权限状态层级清楚。
|
||||
|
||||
## 4. 验证
|
||||
|
||||
- `T01-TREE-STATE-CONTRACT PASS`
|
||||
- `T01-TREE-STATE-RUNTIME-SMOKE PASS`
|
||||
- `T03-T08-MEMBER-FLOW-CONTRACT PASS`
|
||||
- `T03-T08-MEMBER-FLOW-RUNTIME-SMOKE PASS`
|
||||
- `PASS compile audit`
|
||||
|
||||
H5 截图不能替代 Android 真机字体放大、读屏和触摸目标验证;这些留到全量候选后的设备复核。
|
||||
|
Before Width: | Height: | Size: 1.9 MiB |
@@ -1,45 +0,0 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"canvas": {
|
||||
"width": 1236,
|
||||
"height": 2745,
|
||||
"logicalWidth": 412,
|
||||
"logicalHeight": 915,
|
||||
"scale": 3,
|
||||
"resolution": 72
|
||||
},
|
||||
"groups": [
|
||||
{ "name": "00-参考", "visible": false },
|
||||
{ "name": "10-背景", "visible": true },
|
||||
{ "name": "20-卷轴", "visible": true },
|
||||
{ "name": "30-品牌与标题装饰", "visible": true },
|
||||
{ "name": "40-公共控件皮肤", "visible": true },
|
||||
{ "name": "50-密码登录", "visible": true },
|
||||
{ "name": "60-验证码登录", "visible": false },
|
||||
{ "name": "70-内容与标注", "visible": true }
|
||||
],
|
||||
"layers": [],
|
||||
"states": [
|
||||
{
|
||||
"name": "password-hidden",
|
||||
"show": ["50-密码登录"],
|
||||
"hide": ["60-验证码登录"]
|
||||
},
|
||||
{
|
||||
"name": "password-visible",
|
||||
"show": ["50-密码登录"],
|
||||
"hide": ["60-验证码登录"]
|
||||
},
|
||||
{
|
||||
"name": "sms-default",
|
||||
"show": ["60-验证码登录"],
|
||||
"hide": ["50-密码登录"]
|
||||
},
|
||||
{
|
||||
"name": "sms-countdown",
|
||||
"show": ["60-验证码登录"],
|
||||
"hide": ["50-密码登录"]
|
||||
}
|
||||
],
|
||||
"exports": []
|
||||
}
|
||||
|
Before Width: | Height: | Size: 1.5 MiB |
|
Before Width: | Height: | Size: 1.4 MiB |
|
Before Width: | Height: | Size: 1.6 MiB |
|
Before Width: | Height: | Size: 957 KiB |
|
Before Width: | Height: | Size: 2.3 MiB |
|
Before Width: | Height: | Size: 2.0 MiB |
|
Before Width: | Height: | Size: 2.3 MiB |
|
Before Width: | Height: | Size: 2.2 MiB |
|
After Width: | Height: | Size: 1.6 MiB |
|
Before Width: | Height: | Size: 289 KiB |
|
Before Width: | Height: | Size: 365 KiB |
|
Before Width: | Height: | Size: 432 KiB |
|
Before Width: | Height: | Size: 569 KiB |
|
Before Width: | Height: | Size: 1.8 MiB |
|
Before Width: | Height: | Size: 260 KiB |
|
Before Width: | Height: | Size: 262 KiB |
|
Before Width: | Height: | Size: 266 KiB |
|
Before Width: | Height: | Size: 1.5 MiB |
|
Before Width: | Height: | Size: 1.7 MiB |
|
Before Width: | Height: | Size: 2.0 MiB |
|
Before Width: | Height: | Size: 254 KiB |
|
Before Width: | Height: | Size: 308 KiB |
|
Before Width: | Height: | Size: 256 KiB |
|
Before Width: | Height: | Size: 297 KiB |
|
Before Width: | Height: | Size: 314 KiB |
|
Before Width: | Height: | Size: 317 KiB |
|
Before Width: | Height: | Size: 320 KiB |
|
Before Width: | Height: | Size: 269 KiB |
|
Before Width: | Height: | Size: 302 KiB |
|
Before Width: | Height: | Size: 498 KiB |
|
Before Width: | Height: | Size: 477 KiB |
|
Before Width: | Height: | Size: 479 KiB |
|
Before Width: | Height: | Size: 488 KiB |
|
Before Width: | Height: | Size: 626 KiB |
|
Before Width: | Height: | Size: 476 KiB |
|
Before Width: | Height: | Size: 451 KiB |
|
Before Width: | Height: | Size: 693 KiB |
|
Before Width: | Height: | Size: 424 KiB |
|
Before Width: | Height: | Size: 475 KiB |
|
Before Width: | Height: | Size: 420 KiB |
|
Before Width: | Height: | Size: 497 KiB |
|
Before Width: | Height: | Size: 496 KiB |
|
Before Width: | Height: | Size: 698 KiB |
|
Before Width: | Height: | Size: 493 KiB |
@@ -1,34 +0,0 @@
|
||||
# 上传前文件清理审计(2026-07-17 更新)
|
||||
|
||||
## 审计边界
|
||||
|
||||
- 生成资产所需的母版、清单、脚本、测试、`requirements.txt` 和 APP 正在引用的运行图一律保留。
|
||||
- 只删除可再生成的本机缓存,以及已经被新版长期代表证据或正式母版替代的旧截图。
|
||||
- 不修改仓库体积阈值,不执行 Git 暂存、提交、推送、重置或检出。
|
||||
- `unpackage/` 中已有的 tracked 缓存修改不覆盖、不删除,上传时单独排除。
|
||||
|
||||
## 已清理的本机缓存
|
||||
|
||||
- `design-pipeline/.venv/`、`design-pipeline/generated/` 和 Python `__pycache__/`。
|
||||
- `.superpowers/`、`tmp/` 与 `tmp-g01-icon-audit.png`。
|
||||
- `docs/design/screens/runtime/`:113 个文件,共 40,858,831 字节。该目录受 Git 忽略,只是本机运行截图缓存。
|
||||
|
||||
删除 `.venv` 和 `generated` 不影响换机恢复;新电脑按 `requirements.txt` 重建环境后,由正式母版、清单和脚本重新生成输出。
|
||||
|
||||
## 已清理的长期截图
|
||||
|
||||
用户于 2026-07-17 确认删除 20 张已被新版联系表、当前代表图或 A01 正式 PSD 母版替代的旧 handoff 截图,共 12,987,496 字节。长期索引已迁移到:
|
||||
|
||||
- `docs/design/screens/handoff/2026-07-16/` 中 A01、A04、A05、A06、G01、G03、G05、G08–G12、T01、T04 的当前联系表或代表图。
|
||||
- `docs/design/assets/a01-vnext/source/A01-layered-source-v1.psd` 与 `a01-psd-manifest.json`。
|
||||
|
||||
此前 2026-07-16 已删除的两张无引用 A01 旧全页图继续保持删除状态。
|
||||
|
||||
仓库体积合同还会统计 `docs/design/screens/` 根目录。为满足同一合同,另删除 7 张早期整页设计稿:A01 v1–v3 已由正式分层 PSD 和保留的四档栅格证据替代,G01 v1–v4 已由仍保留的 v5 安全区稿和 2026-07-16 当前联系表替代。相关长期文档引用已迁移。
|
||||
|
||||
## 清理结果
|
||||
|
||||
- `docs/design/screens/handoff/`:30 个文件,16,899,601 字节,低于 35 个文件/20MB 合同。
|
||||
- `docs/design/screens/` 全目录:35 个文件,低于 20MB,满足仓库截图体积合同。
|
||||
- 正式 G01 与 T/F/R/N/M 生成输入、运行资产和恢复脚本均保留。
|
||||
- `design-pipeline/generated/`、`.venv/`、runtime 与 tmp 不属于长期交接材料,换机后按需重建。
|
||||
@@ -1,46 +0,0 @@
|
||||
# 全模块长背景与 A 系列控件交接
|
||||
|
||||
## 当前决定
|
||||
|
||||
- A 系列现有按钮、弹窗、Toast 和对话框视觉已经由用户确认,作为全局唯一标准。
|
||||
- G01 是 G 系列风格母体;9 个活动 G 页面继续共用 `GenealogyPageBackground.vue` 与既定 G01 长背景。
|
||||
- T、F、R、N、M 各自保留模块性格,但共享浅色国风、楷体、宣纸、朱砂、古金与 A 系列控件。
|
||||
- 本轮按用户要求不生成新的运行截图;页面仍需用户逐页审核和 Android/HBuilderX 复核。
|
||||
|
||||
## 公共组件
|
||||
|
||||
- `components/AppButton.vue`:A 系列主/次卷轴按钮。
|
||||
- `components/AppDialog.vue`:A 系列单/双按钮卷轴对话框。
|
||||
- `components/AppToast.vue`:A 系列卷轴轻提示。
|
||||
- `components/AppLoading.vue`:项目自定义水墨加载。
|
||||
- `components/PageHeader.vue`:普通页使用真实返回箭头,根页保留品牌头部。
|
||||
- `components/ModulePageBackground.vue`:T、F、R、N、M 背景唯一映射入口。
|
||||
|
||||
## 可恢复输入与运行资产
|
||||
|
||||
| 模块 | ImageGen 原始输入 | APP 运行资产 | SHA-256 |
|
||||
| --- | --- | --- | --- |
|
||||
| T | `tree-page-background-imagegen-source.png` | `static/assets/modules/tree/opaque/tree-page-background-long.png` | `b4322e6d8294c1e30d03baa005aa77122dd49257504da2462db74bfe79e44b37` |
|
||||
| F | `family-page-background-imagegen-source.png` | `static/assets/modules/family/opaque/family-page-background-long.png` | `9c65aa0526d392e6d03e6c0216e9f5f9f9f917aa539e15c045283195882b5fec` |
|
||||
| R | `records-page-background-imagegen-source.png` | `static/assets/modules/records/opaque/records-page-background-long.png` | `a420ac3791acc13e25ae68f68782e07754c0040b7f9fbde037bf1588f2ff7007` |
|
||||
| N | `notification-page-background-imagegen-source.png` | `static/assets/modules/notification/opaque/notification-page-background-long.png` | `7f707153f6ecf53183fc360e6a34b4312975babeb5ccb3f36e048f1f64c65ca5` |
|
||||
| M | `profile-page-background-imagegen-source.png` | `static/assets/modules/profile/opaque/profile-page-background-long.png` | `c5adb199e5773582775f9f0bab1fef62e0948755c9f22aca647d236f8d4ef8b8` |
|
||||
|
||||
所有原始输入位于 `docs/design/assets/module-backgrounds/masters/`;运行资产统一为 `1440×3600` RGB PNG。
|
||||
|
||||
## 换机重建
|
||||
|
||||
```powershell
|
||||
design-pipeline/.venv/Scripts/python.exe design-pipeline/scripts/build_module_page_backgrounds.py
|
||||
powershell -NoProfile -ExecutionPolicy Bypass -File tests/global-heritage-visual-system-contract.ps1
|
||||
```
|
||||
|
||||
清单:`design-pipeline/manifests/module-page-backgrounds.json`。
|
||||
|
||||
## 验证边界
|
||||
|
||||
- 当前静态合同和无截图 H5 运行 smoke 已覆盖主要页面状态、按钮事件、导航与自定义弹层。
|
||||
- 尚未完成 Android/HBuilderX 字体、状态栏、返回手势、软键盘与不同面板亮度复核。
|
||||
- 五张 `1440×3600` 图片在 4GB Android 上的解码、切页与回收仍需专项检查。
|
||||
- 当前仅为全线基础样式候选,不表示 52 页已由用户正式验收或冻结。
|
||||
|
||||
@@ -1,217 +0,0 @@
|
||||
# 家谱 APP 视觉设计交接手册
|
||||
|
||||
> **2026-07-16 状态覆盖说明:** 本手册中的截图方法、资产规则和验证流程继续有效;旧路由与验收数字不再有效。当前为 52 条活动路由、52 页全部 `[~]` 待审核、0 页冻结;A06 已从路由与活动验收队列封存但保留实现。接管时先读 `docs/交接记录.md` 与 `docs/验收规划.md`。
|
||||
|
||||
> 更新日期:2026-07-14
|
||||
> 用途:在新电脑或交给新的 GPT 后,按本手册恢复当前工作;它只记录已发生的事实,不把待验收写成已完成。
|
||||
|
||||
## 0. 给新 GPT 的可直接执行指令
|
||||
|
||||
你接手的是一个 **uni-app Android 家谱项目的高质量视觉设计任务**,全程中文工作;它不是只改 CSS 的任务。先不修改代码,完整阅读:`AGENTS.md`、`docs/交接记录.md`、本手册、`docs/规划.md`、`docs/design/D1_安卓视觉规范与页面壳.md`、`docs/design/P00_页面结构与资产清单.md`、`docs/design/设计资产生产流水线规范.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 验收/冻结记录只作历史证据;本轮 52 个活动页面全部重新待审核。A06 已封存,G07 是 G06 的页面内状态,不得重新建为独立页。
|
||||
|
||||
当前实际为 52 条活动路由,52 页全部标 `[~]`,0 页冻结;已有 14 个活动页面内部 H5 候选,A06 候选另行封存,均不得写成用户已正式验收。用户下一活动审核页是 G01;无人审核时下一施工页是 T07。接口只作功能布局参考,本轮没有对接。
|
||||
|
||||
新环境必须可用并实际调用:`product-design:index`、`product-design:audit`、`imagegen`、`superpowers:test-driven-development`、`superpowers:systematic-debugging`、`superpowers:verification-before-completion`。没有这些能力时,先安装/启用同等能力,不得假装已经完成设计审视或位图生成。
|
||||
|
||||
## 1. 当前停点:先看这一节
|
||||
|
||||
项目实际有 52 条活动路由;A02 已合并进 A01,A06 已封存,T02 已合并进 T01且遗留占位文件已删除。`docs/验收规划.md` 中 52 个活动页面全部为 `[~]`,0 页已验收,0 页冻结。
|
||||
|
||||
- 已有 14 个活动页面内部 H5 候选:A01、A04、A05、G01、G03、G05、G06、G08、G09、G10、G11、G12、T01、T04。A06 的 H5 候选、源码、测试和证据已封存保留。
|
||||
- 这些候选、内部 smoke、GPT 审视和旧 QA 都不等于用户正式验收。
|
||||
- 用户下一活动审核页是 G01;无人审核时下一施工页是 T07 成员目录。
|
||||
- 基础版本只做浅色国风主题;深色和跟随系统延期。
|
||||
- 不提交、不推送、不上传 Git;由用户自行处理版本库操作。
|
||||
|
||||
下一位执行者先读 `docs/交接记录.md` 和 `docs/验收规划.md`,再按 `[~]` 清单协助用户逐页审核。默认只打开一张代表图或一张复杂状态联系表;多尺寸、before/after 与历史废稿仅在发现问题时展开。
|
||||
|
||||
## 1.1 迁移前必须保留的文件
|
||||
|
||||
本手册、G06 最终候选资产和截图工具均是接管所需文件;换电脑前,用户需在自行提交/上传时包含它们,或完整复制当前工作区。我没有执行任何 Git 暂存、提交、推送或上传操作。
|
||||
|
||||
至少要保留:`docs/design/视觉设计交接手册.md`、`docs/交接记录.md`、`docs/design/视觉证据索引.md`、`scripts/capture-chrome-page.js`、全部页面/资产/测试、`docs/design/screens/runtime/` 的运行证据,以及现有计划与设计记录。只复制已提交的旧版本会丢失当前停点。
|
||||
|
||||
## 2. 必读文件与唯一职责
|
||||
|
||||
| 文件 | 负责什么 |
|
||||
| --- | --- |
|
||||
| `AGENTS.md` | 最小修改、保护既有未提交内容、验证后再交付的项目规则。 |
|
||||
| `docs/规划.md` | 54 条独立路由的范围、模块顺序和“完成”的定义。 |
|
||||
| `docs/design/D1_安卓视觉规范与页面壳.md` | Android 页面、资产、布局与中文注释的硬约束。 |
|
||||
| `docs/design/P00_页面结构与资产清单.md` | 路由、页面文件和资产台账的唯一清单。 |
|
||||
| `docs/design/设计资产生产流水线规范.md` | 混合代码/位图落地、manifest、Node/Sharp/Python 分工、质量门和跨电脑恢复合同。 |
|
||||
| `docs/superpowers/plans/2026-07-13-product-design-visual-refinement.md` | 已批准的分模块视觉精修计划和验收顺序。 |
|
||||
| `docs/design/2026-07-13-A01-G01-A02-视觉审视.md` | A01/G01 视觉证据与旧 A02 的问题定位。 |
|
||||
| `docs/design/A02_账号登录_设计记录.md` | A02 当前实现、资产、截图和测试记录。 |
|
||||
| `design-qa.md` | A02 的 Design QA;当前 `final result: accepted`。 |
|
||||
| `docs/交接记录.md` | 简版当前状态与恢复入口;本手册提供完整操作细节。 |
|
||||
|
||||
发生冲突时,按“用户最新明确指令 > AGENTS.md > 上表中的当前台账/计划 > 历史文档”的顺序处理。不要以旧的草案或已废弃的截图切片方案为依据。
|
||||
|
||||
## 3. 已验收的风格与绝对禁区
|
||||
|
||||
### A01 与 G01 是可观察的品牌真源
|
||||
|
||||
- A01 参考图:`docs/design/screens/A01-启动登录引导-栅格验收-412x915.png`
|
||||
- G01 参考图:`docs/design/screens/G01-我的家谱-紧凑版设计稿-v5-Tabbar安全区.png`
|
||||
|
||||
共同语言是“家祠卷轴”:暖宣纸、朱砂主色、古金框线和元数据、墨褐字、低对比淡墨山水。主信息应先于背景被读到,留白是结构的一部分。
|
||||
|
||||
必须遵守:
|
||||
|
||||
1. 最新生产方法以 `docs/design/设计资产生产流水线规范.md` 为准:代码承担布局、文字、间距、状态和普通结构;复杂水墨、品牌装饰和代码无法忠实表达的视觉使用真实位图。
|
||||
2. 固定比例完整位图、透明叠加资产和经 H5/Android 验证的九宫格必须在 manifest 中声明真实槽位、缩放和 Alpha 策略;不得默认使用 `scaleToFill` 或 Sharp `fit: 'fill'` 掩盖比例错误。
|
||||
3. 不能把整张设计截图或局部截图裁进运行页面;运行资产必须是可复用的独立元素。
|
||||
4. A01/G01 历史证据仍是品牌观察真源,但不等于本轮已验收或冻结;当前状态以 `docs/交接记录.md` 与 `docs/验收规划.md` 为准。
|
||||
5. 不要用一个通用卡片母版覆盖所有模块。家谱、世系树、内容档案、人物记录、通知和设置必须在同一视觉语言下有各自的信息密度与层级。
|
||||
|
||||
## 4. A02 的精确状态
|
||||
|
||||
> 本节是 2026-07-14 的历史实现记录,不是当前路由或验收状态。当前 A02 已删除并合入 A01,本轮不得恢复 A02 路由;最新状态以 `docs/交接记录.md` 为准。
|
||||
|
||||
### 实现内容
|
||||
|
||||
- 路由与页面:`pages/auth/a02-login.vue`
|
||||
- 新面板资产:`static/assets/modules/auth/opaque/a02-login-panel.png`
|
||||
- 实际尺寸:940 × 1672
|
||||
- 属性:四角不透明,承载宣纸底、双古金框、角饰与淡纹样
|
||||
- 主按钮继续复用已验收完整资产:`static/assets/foundation/opaque/a01-primary-button.png`
|
||||
- 账号密码与短信验证码 Tab、输入、忘记密码跳转和原有交互均保留;短信 Tab 已经通过真实 Chrome 调试点击截图。
|
||||
|
||||
### 已保存的运行证据
|
||||
|
||||
默认只查看 `docs/design/screens/handoff/2026-07-16/A01-current-password-sms-contact-824x915.png`。A02 已并入 A01;小屏、大屏和 before/after 历史证据保存在项目外完整归档中,按需展开,不在交接正文连续罗列。
|
||||
|
||||
### 通过/未通过的界线
|
||||
|
||||
已通过的是:资产尺寸与不透明角审计、A01/A02 页面契约、编译检查、A02 的多尺寸运行截图和短信 Tab 交互。
|
||||
|
||||
已通过的是:用户对 A02 的最终审美确认,`design-qa.md` 为 `accepted`,A02 可见效果冻结。用户若提出新的明确调整,只改动被指出的区域并重新截图复核;不要无根据改动面板框、输入区或交互。
|
||||
|
||||
## 5. 换电脑后如何恢复截图与审视能力
|
||||
|
||||
### 必备环境
|
||||
|
||||
- Windows、Chrome、HBuilderX(项目当前以 Android `uni-app` 为目标)。
|
||||
- Node.js 22 或更高版本;当前脚本已在 Node 24 环境使用原生 `fetch` 与 `WebSocket`。
|
||||
- 先在 HBuilderX 启动本地 H5 调试页,并确认它能在 `http://localhost:5173` 打开。不要臆测项目的 npm 启动命令。
|
||||
|
||||
用专用 Chrome 调试实例开启远程端口;它与用户日常 Chrome 隔离:
|
||||
|
||||
```powershell
|
||||
$chrome = "$env:ProgramFiles\Google\Chrome\Application\chrome.exe"
|
||||
Start-Process -FilePath $chrome -ArgumentList `
|
||||
'--remote-debugging-port=9222', `
|
||||
"--user-data-dir=$env:TEMP\jiapu-chrome-debug", `
|
||||
'http://localhost:5173/#/pages/auth/a02-login?agreed=1'
|
||||
```
|
||||
|
||||
确认调试端口与应用页面存在:
|
||||
|
||||
```powershell
|
||||
Invoke-RestMethod 'http://127.0.0.1:9222/json/list' | Select-Object title, url
|
||||
```
|
||||
|
||||
使用项目内的正式脚本截图。它会导航**专用调试 Chrome**的当前标签页、写出 PNG,并在结束时清除设备尺寸覆盖;不能操作或关闭用户的日常 Chrome。
|
||||
|
||||
```powershell
|
||||
node scripts/capture-chrome-page.js `
|
||||
'http://localhost:5173/#/pages/auth/a02-login?agreed=1' `
|
||||
'.login-page' `
|
||||
'docs/design/screens/runtime/2026-07-14/A02-after-360x800.png' `
|
||||
360 800
|
||||
```
|
||||
|
||||
新截图先保存到已忽略的 `docs/design/screens/runtime/<日期>/`,绝不能放回 `static/assets/` 作为运行资源。每个代表页面至少做 360 × 800;只有出现比例风险或用户要求时再展开 320 × 568、360 × 640、412 × 915,多状态页面优先合成一张联系表。用户确认需要长期交接时,只把代表图复制到 `docs/design/screens/handoff/`。最终 Android/HBuilderX 截图仍需补做,H5 Chrome 截图不能替代它。
|
||||
|
||||
## 6. 后续执行顺序与每轮产物
|
||||
|
||||
### 历史门禁记录(本轮已失效)
|
||||
|
||||
以下内容只解释旧阶段为何保留某些资产,不得据此把任何页面写成当前已验收或冻结。
|
||||
|
||||
1. A02 与 A04 均已通过;不因后续页面改动而触碰其可见效果。
|
||||
2. 若用户提出明确调整:只在对应页面修正,先调整对应契约测试,再改页面/资产,重新截图复核。
|
||||
3. A05、A06 与 G01 空状态均已通过并完成状态同步;G04 已合并为 G03 `step=ancestor`,该双步骤已获用户通过;G07 已合并为 G06 三态。G06 三态候选和内部审视已完成,仍待用户视觉确认。
|
||||
|
||||
### 当前唯一顺序:逐页视觉审核
|
||||
|
||||
54 条路由候选已经全部覆盖。用户从 `docs/规划.md` 指定或按清单顺序审核页面;只有用户明确通过才改 `[x]`,要求返工则改 `[!]` 并只修改对应页面。接口、Android 打包和真机复核均留在视觉审核之后。
|
||||
|
||||
### 每个模块的固定工作流
|
||||
|
||||
1. 用 Product Design 对已运行页面截图审视,明确该模块与 A01/G01 的继承点、不同的信息结构与验收尺寸。
|
||||
2. 先补/改最小的页面契约测试并看到失败,再实现页面;只有缺少真实视觉资产时才生成资产。
|
||||
3. 资产生成后记录路径、尺寸、是否不透明、用途和引用页到 P00;生成图必须经过本地检查后进入 `static/assets/`。
|
||||
4. 保留既有可用跳转和返回行为,删除本轮替换后不再使用的临时导入、目录项和样式。
|
||||
5. 运行受影响的测试、编译审计、真实路由截图,再更新设计记录、规划和交接状态。
|
||||
6. 在用户验收之前,状态统一写“实现与截图完成,视觉待用户验收”。
|
||||
|
||||
## 7. 下一位 GPT 需要具备并实际调用的能力
|
||||
|
||||
这不是“只改 CSS”的任务。执行视觉页前应先读取对应技能说明,并在对用户的工作说明中指出正在使用的技能及目的。
|
||||
|
||||
| 能力/技能 | 何时使用 | 项目中的正确做法 |
|
||||
| --- | --- | --- |
|
||||
| `product-design:index`、`product-design:audit` | 审视、评价或设计一个已运行页面/流程时。 | 先拿到真实路由截图,再依据 A01/G01 与页面任务写审视结论;不要靠源码猜好不好看。 |
|
||||
| Product Design 的 `user-context`、`get-context`、`ideate`、`image-to-code`、Design QA 流程 | 需要探索方向、选择视觉方案、将已选样稿落地、或交付前比对时。 | 有明确视觉真源时先忠实落地;没有真源且需要新方向时先给可比较方案,选定后再实现;最后在 `design-qa.md` 诚实记录通过或阻塞。 |
|
||||
| `imagegen` | 现有资产无法承担完整视觉面时。 | 先用 A01/G01 实图作为参考,明确输出是完整不透明面板还是透明叠加件;检查实际尺寸/Alpha 后再放入项目。不能用截图代替资产。 |
|
||||
| `superpowers:brainstorming` 与 `superpowers:writing-plans` | 新模块或会改变页面行为的创作工作开始前。 | 先写清用户目标、交互和验收,不以“尽快”跳过设计决定。 |
|
||||
| `superpowers:test-driven-development` | 修改功能、路由契约、可审计视觉结构前。 | 先让最小契约测试失败,再做实现;视觉资产同样写尺寸/Alpha/引用审计。 |
|
||||
| `superpowers:systematic-debugging` | 截图、路由、构建或测试出现意外时。 | 先复现和定位单一根因,禁止靠删测试、盲改样式掩盖问题。 |
|
||||
| `superpowers:verification-before-completion` | 任何“完成/修好/通过”的表述前。 | 以命令输出、运行截图和用户确认作证据;不能用意图代替验证。 |
|
||||
|
||||
若新电脑没有 Product Design 或 ImageGen 插件,应先安装/启用同等能力;在能力缺失时不能假装完成视觉审计或资产生成。新环境先执行 `python --version`、`node --version` 确认可用环境;当前用户已确认 Python 已安装。若 Product Design 的持久 context 预检仍失败,记录原因即可,不得阻塞对项目内真实截图、资产和测试的接管。
|
||||
|
||||
## 8. 验证命令
|
||||
|
||||
先看工作区,再运行与改动相匹配的聚焦测试;模块阶段结束前运行全量 PowerShell 审计:
|
||||
|
||||
```powershell
|
||||
git status --short
|
||||
|
||||
Get-ChildItem tests -Filter *.ps1 | Sort-Object Name | ForEach-Object {
|
||||
& powershell.exe -NoProfile -ExecutionPolicy Bypass -File $_.FullName
|
||||
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
|
||||
}
|
||||
|
||||
git diff --check
|
||||
```
|
||||
|
||||
A02 当前的最小回归集合:
|
||||
|
||||
```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/compile-audit.ps1
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/full-page-visual-contract.ps1
|
||||
git diff --check
|
||||
```
|
||||
|
||||
G06 当前候选继续或验收前的最小回归集合:
|
||||
|
||||
```powershell
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/g06-search-flow-contract.ps1
|
||||
node tests/g06-search-flow-runtime-smoke.js http://localhost:5173
|
||||
node scripts/capture-chrome-page.js "http://localhost:5173/#/pages/genealogy/g06-search-genealogies" ".search-page" "docs/design/screens/runtime/<日期>/G06-selected-strip-initial-360x800.png" 360 800
|
||||
git diff --check
|
||||
```
|
||||
|
||||
若 G06 发生视觉改动,必须用真实输入分别截取有结果和无结果状态,再用 Product Design 审视;只有三态、相关测试与用户确认齐全,才能更新为验收通过。
|
||||
|
||||
`git diff --check` 可能提示仓库既有的 CRLF 行尾警告;只有真正的空白错误或非零退出码才算失败。不要 reset、checkout、清空或覆盖用户已有改动。
|
||||
|
||||
## 9. 文档与资源维护清单
|
||||
|
||||
每次完成一个页面/模块,按事实更新:
|
||||
|
||||
- `docs/规划.md`:用户验收状态与下一个模块。
|
||||
- `docs/design/P00_页面结构与资产清单.md`:新旧资产、尺寸、透明属性、引用位置与去留。
|
||||
- `docs/design/<页面>_设计记录.md`:设计意图、截图、交互与测试。
|
||||
- `docs/design/screens/runtime/<日期>/`:真实运行截图。
|
||||
- `design-qa.md`:修复项、未决项与最终 `passed/blocked` 结果。
|
||||
- `docs/交接记录.md` 与本手册:真实停点、风险、下一步;未获得用户确认就不能写成“已完成”。
|
||||
|
||||
当前工作区已经存在用户和历史任务的未提交改动。后续工作只能触及当前任务需要的文件;若改动与当前设计目标无关,只报告,不清理。
|
||||
@@ -1,82 +0,0 @@
|
||||
# 视觉证据索引
|
||||
|
||||
## 当前换机检查点
|
||||
|
||||
- A01 当前密码/短信登录联系表(待审核,不代表通过):[824×915 真实运行代表图](screens/handoff/2026-07-16/A01-current-password-sms-contact-824x915.png)
|
||||
- A04 当前注册页(待审核,不代表通过):[412×915 真实运行代表图](screens/handoff/2026-07-16/A04-current-register-412x915.png)
|
||||
- A05 当前重设密码页(待审核,不代表通过):[412×915 真实运行代表图](screens/handoff/2026-07-16/A05-current-reset-412x915.png)
|
||||
- A06 封存前风险限制页(样式无异议但不代表完整验收):[412×915 真实运行代表图](screens/handoff/2026-07-16/A06-current-risk-412x915.png)
|
||||
- G01 当前默认/空态联系表(待审核,不代表通过):[720×800 真实运行联系表](screens/handoff/2026-07-16/G01-current-default-empty-contact-720x800.png)
|
||||
- G06 当前搜索初始/结果/邀请码联系表(待审核,不代表通过):[1080×800 真实运行联系表](screens/handoff/2026-07-16/G06-current-initial-results-invite-contact-1080x800.png)
|
||||
- G08 当前搜索申请/邀请码直加联系表(待审核,不代表通过):[720×800 真实运行联系表](screens/handoff/2026-07-16/G08-current-search-invite-contact-720x800.png)
|
||||
- G09 当前申请列表/空态联系表(待审核,不代表通过):[720×800 真实运行联系表](screens/handoff/2026-07-16/G09-current-list-empty-contact-720x800.png)
|
||||
- G03 当前创建/首代人物联系表(待审核,不代表通过):[720×800 真实运行联系表](screens/handoff/2026-07-16/G03-current-create-ancestor-contact-720x800.png)
|
||||
- G05 当前成员总览/公开预览联系表(待审核,不代表通过):[720×800 真实运行联系表](screens/handoff/2026-07-16/G05-current-member-public-contact-720x800.png)
|
||||
- G10 当前审核列表/无权限联系表(待审核,不代表通过):[720×800 真实运行联系表](screens/handoff/2026-07-16/G10-current-list-permission-contact-720x800.png)
|
||||
- G11 当前设置/无权限联系表(待审核,不代表通过):[720×800 真实运行联系表](screens/handoff/2026-07-16/G11-current-form-permission-contact-720x800.png)
|
||||
- G12 当前字辈列表/编辑联系表(待审核,不代表通过):[720×800 真实运行联系表](screens/handoff/2026-07-16/G12-current-list-edit-contact-720x800.png)
|
||||
- T01 当前世系树/空态联系表(待审核,不代表通过):[720×800 真实运行联系表](screens/handoff/2026-07-16/T01-current-tree-empty-contact-720x800.png)
|
||||
- T04 当前新增亲属表单/成功态联系表(待审核,不代表通过):[720×800 真实运行联系表](screens/handoff/2026-07-16/T04-current-form-success-contact-720x800.png)
|
||||
- 当前实际为 52 个活动页面全部 `[~]` 待审核;A06 证据封存保留,不计入活动验收统计。下方旧“已验收”图片只作为历史视觉基础,不计入本轮完成状态。
|
||||
|
||||
> 本仓库只保留低负担交接证据:每页一张代表图,复杂模块使用联系表。完整 before/after、多尺寸、历史废稿和全部运行截图保存在项目外本地归档,不进入 Git。
|
||||
|
||||
## 完整本地归档
|
||||
|
||||
Windows 路径:`C:\Users\Rain\Desktop\job\jiapuapp-design-evidence-archive-2026-07-15`
|
||||
|
||||
归档内的 `design-full/` 是精简前完整 `docs/design/`,`tmp/` 是 ImageGen 与调试临时源文件。新电脑默认不需要这份归档;只有追溯历史决策或检查旧尺寸时才单独复制。
|
||||
|
||||
## 历史视觉基准(不计本轮通过)
|
||||
|
||||
- A01/已合并的 A02:[密码与短信联系表](screens/handoff/2026-07-16/A01-current-password-sms-contact-824x915.png)
|
||||
- A04:[注册账号](screens/handoff/2026-07-16/A04-current-register-412x915.png)
|
||||
- A05:[重置密码](screens/handoff/2026-07-16/A05-current-reset-412x915.png)
|
||||
- A06(封存):[登录状态](screens/handoff/2026-07-16/A06-current-risk-412x915.png)
|
||||
- G01:[默认态与空态联系表](screens/handoff/2026-07-16/G01-current-default-empty-contact-720x800.png)
|
||||
- G03:[创建与始祖联系表](screens/handoff/2026-07-16/G03-current-create-ancestor-contact-720x800.png)
|
||||
|
||||
## F、R、N、M 默认审核入口
|
||||
|
||||
- [F03–F10 联系表](screens/handoff/2026-07-14/all-page-candidates/00-family-contact-sheet.png)
|
||||
- [R01–R11 联系表](screens/handoff/2026-07-14/all-page-candidates/00-records-contact-sheet.png)
|
||||
- [N02、M02–M10 联系表](screens/handoff/2026-07-14/all-page-candidates/00-profile-notification-contact-sheet.png)
|
||||
- [F01 家族动态](screens/handoff/2026-07-14/root-pages-audit/01-f01-list-360x800.png)
|
||||
- [F02 发布动态](screens/handoff/2026-07-14/root-pages-audit/03-f02-form-360x800.png)
|
||||
- [N01 消息中心](screens/handoff/2026-07-14/root-pages-audit/05-n01-list-360x800.png)
|
||||
- [M01 我的首页](screens/handoff/2026-07-14/root-pages-audit/07-m01-ready-360x800.png)
|
||||
|
||||
## G 家谱候选
|
||||
|
||||
- [G05 家谱总览](screens/handoff/2026-07-16/G05-current-member-public-contact-720x800.png)
|
||||
- G06:[初始态](screens/handoff/2026-07-14/G06-selected-strip-final-initial-recheck-360x800.png)、[结果态](screens/handoff/2026-07-14/G06-selected-strip-final-results-360x800.png)、[无结果态](screens/handoff/2026-07-14/G06-selected-strip-final-empty-360x800.png)
|
||||
- [G08 申请入谱](screens/handoff/2026-07-16/G08-current-search-invite-contact-720x800.png)
|
||||
- [G09 我的申请](screens/handoff/2026-07-16/G09-current-list-empty-contact-720x800.png)
|
||||
- [G10 申请审核](screens/handoff/2026-07-16/G10-current-list-permission-contact-720x800.png)
|
||||
- [G11 家谱设置](screens/handoff/2026-07-16/G11-current-form-permission-contact-720x800.png)
|
||||
- [G12 字辈诗](screens/handoff/2026-07-16/G12-current-list-edit-contact-720x800.png)
|
||||
|
||||
## T 世系与成员候选
|
||||
|
||||
- [T01 世系树](screens/handoff/2026-07-16/T01-current-tree-empty-contact-720x800.png)
|
||||
- [T03 成员档案](screens/handoff/2026-07-14/t-module-audit/01-t03-detail-360x800.png)
|
||||
- [T04 新增亲属](screens/handoff/2026-07-16/T04-current-form-success-contact-720x800.png)
|
||||
- [T05 编辑成员](screens/handoff/2026-07-14/t-module-audit/04-t05-form-360x800.png)
|
||||
- [T06 编辑关系](screens/handoff/2026-07-14/t-module-audit/05-t06-form-360x800.png)
|
||||
- [T07 成员目录](screens/handoff/2026-07-14/t-module-audit/07-t07-list-360x800.png)
|
||||
- [T08 成员状态](screens/handoff/2026-07-14/t-module-audit/09-t08-privacy-360x800.png)
|
||||
|
||||
## 风格锚点与设计记录
|
||||
|
||||
- [G01 美术锚点](references/G01-我的家谱-美术锚点.png)
|
||||
- [公共操作图标锚点](references/公共操作图标-风格锚点.png)
|
||||
- [页面与状态合并审计](2026-07-14_页面与状态合并审计.md)
|
||||
- [G05 设计记录](G05_家谱总览_设计记录.md)
|
||||
- [G08–G10 设计记录](G08-G10_入谱申请链路_设计记录.md)
|
||||
- [G11–G12 设计记录](G11-G12_设置与字辈诗_设计记录.md)
|
||||
- [T01–T08 设计记录](T01-T08_世系与成员_设计记录.md)
|
||||
- [F/R/N/M 设计记录](F-R-N-M_全量候选设计记录.md)
|
||||
|
||||
## 后续截图规则
|
||||
|
||||
新的运行截图仍输出到 `docs/design/screens/runtime/<日期>/`,该目录已被 `.gitignore` 排除。用户确认需要作为长期交接基准时,再把单张代表图复制到 `docs/design/screens/handoff/` 并更新本索引;不要把整轮截图重新加入 Git。
|
||||
@@ -1,374 +0,0 @@
|
||||
# 家谱 APP 设计资产生产流水线规范
|
||||
|
||||
> 状态:已批准并完成 A01 卷轴祥云四件套 v3 的本机 H5 试点;仍待 Android/HBuilderX、跨电脑复现和用户正式验收。
|
||||
> 更新日期:2026-07-16。
|
||||
> 适用范围:本项目后续页面重设计、独立视觉资产生产、跨电脑恢复与质量审计。
|
||||
> 当前边界:manifest v2、Python/Pillow 质量门和 A01 主按钮、次按钮、Toast、验证弹窗四张 v3 资产已经落地并通过本机 H5 四尺寸检查;这不代表 Android 已复核、用户已验收或流水线可以推广到其他页面。
|
||||
|
||||
## 1. 目标
|
||||
|
||||
本项目采用“混合落地”方式,不把所有视觉都做成整张位图,也不把复杂国风装饰退化为临时 CSS 或手绘 SVG。
|
||||
|
||||
目标是:
|
||||
|
||||
1. 设计稿中的布局、文字、间距、状态和普通结构由 Vue/SCSS 负责。
|
||||
2. 复杂水墨、宗祠、品牌印、专用图标和难以代码复现的装饰由真实位图资产负责。
|
||||
3. 可复用且需要伸缩的装饰框优先进入经过 Android/H5 验证的九宫格或组件化资产方案。
|
||||
4. Node.js、Sharp 与 Python 读取同一份 JSON manifest,禁止在脚本、页面和文档中重复维护尺寸规则。
|
||||
5. 自动化负责消除机械错误;真实运行截图和用户逐页审核仍是最终视觉判断来源。
|
||||
|
||||
流水线不能保证任意扁平设计图自动拆成一比一资产。要获得稳定质量,页面设计阶段必须同时明确组件边界、目标槽位、伸缩策略和独立资产任务。
|
||||
|
||||
## 2. 已有雏形与升级原则
|
||||
|
||||
仓库现有可复现雏形:
|
||||
|
||||
- `design-pipeline/package.json`
|
||||
- `design-pipeline/package-lock.json`
|
||||
- `design-pipeline/manifests/a01.json`
|
||||
- `design-pipeline/scripts/build-a01.mjs`
|
||||
- `tests/a01-code-pipeline-contract.ps1`
|
||||
|
||||
原 schema v1 雏形已经具备 Node.js、Sharp、JSON 清单、路径约束、尺寸/Alpha/体积检查和 A01 预览组合能力,但单独使用时仍不是合格的资产生产线,原因包括:
|
||||
|
||||
- 对所有资产统一使用 `fit: 'fill'`,不能阻止比例拉伸。
|
||||
- manifest 只记录文件像素,不记录页面真实槽位和允许的缩放策略。
|
||||
- 没有检查白边、绿边、半透明脏边、预乘 Alpha、色彩空间和边缘污染。
|
||||
- 代码预览不是 uni-app 真实运行截图。
|
||||
- `source === output` 主要保证换机可验证,不能替代新资产的生产与质量处理。
|
||||
|
||||
升级时保留已有目录、Node/Sharp 依赖和清单入口,不另建一条互相冲突的流水线。新合同升级为 manifest v2;A01 试点通过前不得批量迁移其他页面。
|
||||
|
||||
2026-07-16 已实现的 v2 试点包括:
|
||||
|
||||
- `design-pipeline/manifests/a01-buttons-v2.json`:尺寸、槽位、缩放、透明边、质量阈值和消费者的单一机器合同。
|
||||
- `design-pipeline/scripts/rebuild-a01-buttons.mjs` 与 `rebuild_a01_buttons.py`:Node 编排、Pillow 横向三段式离线重建。
|
||||
- `design-pipeline/scripts/verify-assets.mjs`、`verify-assets.py` 与 `asset_quality.py`:尺寸、Alpha 外圈、绿边、浅色半透明边、透明 RGB、体积和色彩声明检查。
|
||||
- `design-pipeline/requirements.txt`:锁定 `Pillow==12.3.0`。
|
||||
- Node/Python 单元测试、A01 静态契约、资产审计和四档 H5 运行时检查。
|
||||
|
||||
在双按钮试点基础上,用户选择“方案 2:卷轴祥云”并批准扩展为四件套 v3:
|
||||
|
||||
- `design-pipeline/manifests/a01-scroll-skins-v3.json`:四件套源母图、输出槽位、缩放、透明边、体积和消费者的唯一机器合同。
|
||||
- `build-a01-scroll-skins.mjs`、`build_scroll_skins.py`:Node 编排与 Pillow 确定性构建;构建会清除外缘绿边、浅色半透明脏边和透明 RGB 残留。
|
||||
- 主/次按钮和弹窗按固定比例等比输出;Toast 输出可切片透明 PNG,由页面 `border-image` 承担自适应宽度。
|
||||
- 弹窗采用带透明度表的索引 PNG 控制体积,质量门读取真实透明通道,不通过放宽阈值换取通过。
|
||||
|
||||
旧 schema v1 仍保留给现有 A01 预览流程;不得把它的 `fit: 'fill'` 规则复制到 v2 固定比例资产。
|
||||
|
||||
## 3. 资产分类与唯一落地方式
|
||||
|
||||
每个设计元素在 manifest 中只能属于以下一种主要类型:
|
||||
|
||||
| 类型 | `assetClass` | 正确落地 | 典型内容 |
|
||||
| --- | --- | --- | --- |
|
||||
| 代码原生 | `code-native` | Vue/SCSS | 布局、文字、间距、纯色、普通分隔线、状态与交互 |
|
||||
| 固定比例位图 | `fixed-bitmap` | 精确槽位比例的 PNG/WebP,不允许变形 | 宗祠头图、复杂水墨、固定比例品牌视觉面 |
|
||||
| 透明叠加资产 | `transparent-overlay` | 干净 RGBA PNG/WebP | Logo、印章、云纹、专用图标、结饰 |
|
||||
| 可伸缩装饰框 | `nine-slice` | 经 H5/Android 验证的九宫格或等价组件 | 多宽度按钮框、卡片框、弹窗框 |
|
||||
| 平铺纹理 | `tile-texture` | 明确的重复或覆盖策略 | 小尺寸宣纸纹、无方向噪声纹理 |
|
||||
|
||||
禁止:
|
||||
|
||||
- 把整页设计截图或局部页面截图直接裁入运行页面。
|
||||
- 用 emoji、文本符号、临时第三方 SVG、CSS 拼画代替缺失的品牌装饰或图标。
|
||||
- 同一资产既声明固定比例又在页面中随意拉伸。
|
||||
- 未经 manifest 授权使用 `scaleToFill` 或 Sharp `fit: 'fill'`。
|
||||
- 把候选图、审阅图、runtime 截图或 `generated/` 中间文件当成唯一正式源。
|
||||
|
||||
## 4. 单一 manifest v2 合同
|
||||
|
||||
manifest 是资产生产、页面接入和质量验证的唯一机器可读所有者。建议结构:
|
||||
|
||||
```json
|
||||
{
|
||||
"schemaVersion": 2,
|
||||
"page": "A01",
|
||||
"assets": [
|
||||
{
|
||||
"id": "a01-primary-button-v2",
|
||||
"assetClass": "fixed-bitmap",
|
||||
"source": "static/assets/foundation/transparent/a01-primary-button-v2.png",
|
||||
"output": "static/assets/foundation/transparent/a01-primary-button-v2.png",
|
||||
"logicalSlot": {
|
||||
"widthRpx": 622,
|
||||
"heightRpx": 92
|
||||
},
|
||||
"outputPixels": {
|
||||
"width": 1866,
|
||||
"height": 276
|
||||
},
|
||||
"render": {
|
||||
"scalePolicy": "uniform-only",
|
||||
"uniMode": "aspectFit",
|
||||
"allowDistortion": false
|
||||
},
|
||||
"alpha": {
|
||||
"required": true,
|
||||
"transparentOutsideFrame": true,
|
||||
"cornerMaxAlpha": 0
|
||||
},
|
||||
"edge": {
|
||||
"forbidChromaResidue": true,
|
||||
"forbidLightFringe": true,
|
||||
"premultipliedAlphaCheck": true
|
||||
},
|
||||
"quality": {
|
||||
"maxBytes": 500000,
|
||||
"symmetry": "horizontal",
|
||||
"colorSpace": "sRGB"
|
||||
},
|
||||
"consumers": [
|
||||
"pages/auth/a01-entry.vue"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
正式实现时应为 schema v2 编写 JSON Schema 或等价的严格校验器。未知字段、缺失字段、越出工作区的路径、重复 ID 和未登记消费者都应尽早失败。
|
||||
|
||||
## 5. Node.js 与 Sharp 的职责
|
||||
|
||||
Node.js 是流水线编排层,继续复用当前 `design-pipeline/`:
|
||||
|
||||
1. 解析并校验 manifest。
|
||||
2. 检查路径只能位于工作区内。
|
||||
3. 调用 Sharp 读取元数据、裁切、等比缩放、格式转换、压缩和预览组合。
|
||||
4. 根据 `scalePolicy` 选择算法;`uniform-only` 禁止 `fit: 'fill'`。
|
||||
5. 扫描 Vue/SCSS 中的资产引用、`mode` 和显示槽位。
|
||||
6. 检查资源比例与页面逻辑槽位比例,默认容差不超过 0.5%。
|
||||
7. 禁止页面引用未进入 manifest 的新视觉资产。
|
||||
8. 生成包含 SHA-256、尺寸、字节数、Alpha、消费者和检查结果的构建报告。
|
||||
9. 使用现有 Chrome CDP 9222 对真实 H5 页面做尺寸、资源加载和局部截图验证。
|
||||
|
||||
Node/Sharp 不负责艺术判断,也不把代码组合预览当作用户验收证据。
|
||||
|
||||
## 6. Python 的职责
|
||||
|
||||
Python 是像素质量层,建议使用 Pillow;只有 Pillow 无法稳定完成的边缘分析再引入 OpenCV,避免不必要的重依赖。
|
||||
|
||||
职责:
|
||||
|
||||
1. 验证 PNG/WebP 解码、实际尺寸、通道数和 sRGB 色彩空间。
|
||||
2. 检查透明角、外框外 Alpha、可见内容边界和空白边距。
|
||||
3. 检测绿幕残留、异常高亮边缘和半透明脏边。
|
||||
4. 对透明边缘执行去污染与正确的 Alpha 处理,避免 Android 缩放后出现白边或绿边。
|
||||
5. 检查预乘 Alpha 风险;完全透明像素不得保留会渗出的异常 RGB。
|
||||
6. 对要求对称的按钮和装饰框检查左右差异。
|
||||
7. 生成局部边缘放大图、资产联系表和机器可读报告。
|
||||
8. 质量不达标时返回非零退出码,禁止继续接入页面。
|
||||
|
||||
白边检测不能简单地“禁止白色”,因为次按钮内部可能本来就是暖白宣纸。检查必须只针对外框外区域、半透明边界和 manifest 声明的允许色板。
|
||||
|
||||
## 7. 资产生产流程
|
||||
|
||||
### 7.1 设计阶段
|
||||
|
||||
设计或 ImageGen 输出页面方向时,同时登记:
|
||||
|
||||
- 页面逻辑尺寸和目标视口。
|
||||
- 组件边界与逻辑槽位。
|
||||
- 哪些内容必须由代码渲染。
|
||||
- 哪些内容需要独立透明资产。
|
||||
- 哪些装饰允许伸缩以及不可伸缩安全区。
|
||||
- 字体、字号、颜色和状态。
|
||||
|
||||
不接受只有一张扁平页面图而没有资产任务单的“最终设计”。
|
||||
|
||||
### 7.2 候选生产
|
||||
|
||||
1. 只有缺少完整位图资产时使用 ImageGen。
|
||||
2. 输入图必须明确角色:编辑目标、风格参考或组合参考。
|
||||
3. 生成内容不包含应由代码渲染的按钮文字、表单文字和状态文案。
|
||||
4. 中间候选进入忽略目录,不覆盖正式资产。
|
||||
5. 选择一个母图后再进入确定性处理;候选图不长期堆入仓库。
|
||||
|
||||
ImageGen 的艺术输出不能保证跨电脑逐像素复现。跨电脑可复现的是“已选择母图之后的处理、验证和页面接入”。需要长期重建的唯一母图必须进入受控正式路径或由最终资产本身承担稳定输入。
|
||||
|
||||
### 7.3 确定性处理
|
||||
|
||||
1. 按 manifest 裁切或补透明边距。
|
||||
2. 以目标槽位比例导出 2×/3×文件。
|
||||
3. 清理 Alpha、白边、绿边和异常 RGB。
|
||||
4. 转为 sRGB,使用高质量等比缩放。
|
||||
5. 输出新的版本化文件,不直接覆盖当前正式资产。
|
||||
6. Python 质量门通过后,才允许更新页面引用。
|
||||
|
||||
### 7.4 页面接入
|
||||
|
||||
1. 先写或调整资产合同并看到预期失败。
|
||||
2. 页面使用 manifest 指定的渲染模式。
|
||||
3. 文字、图标和交互状态保持独立可访问节点。
|
||||
4. 只在真正需要叠层的地方使用定位;普通内容保持正常布局流。
|
||||
5. 禁止为了匹配截图而恢复错误比例或无依据的定位。
|
||||
|
||||
### 7.5 运行验证
|
||||
|
||||
最低验证层级:
|
||||
|
||||
1. manifest/schema 合同。
|
||||
2. Python 像素质量检查。
|
||||
3. Node/Sharp 构建和引用检查。
|
||||
4. H5 Chrome 真实运行:320×568、360×640、360×800、412×915。
|
||||
5. 一张代表图或一张复杂状态联系表。
|
||||
6. Android/HBuilderX 真机或模拟器复核。
|
||||
7. 用户明确逐页验收。
|
||||
|
||||
H5、自动截图差异、内部 smoke 和 GPT 审视都不能替代第 6、7 层。
|
||||
|
||||
## 8. 质量门槛
|
||||
|
||||
### 8.1 通用门槛
|
||||
|
||||
- 输出像素必须与 manifest 完全一致。
|
||||
- 固定比例资产与逻辑槽位比例误差默认不超过 0.5%。
|
||||
- `uniform-only` 资产不得出现非等比缩放。
|
||||
- PNG 声明透明时必须真正包含 Alpha 通道。
|
||||
- 声明透明角时,指定角点 Alpha 必须为 0。
|
||||
- 禁止绿幕残留和未授权的浅色外缘。
|
||||
- 文件必须为 sRGB;不得依赖另一台电脑上的专有字体、PSD 或本机临时目录。
|
||||
- 体积超过 `maxBytes` 时失败,不通过降低清晰度或删除证据掩盖。
|
||||
|
||||
### 8.2 固定按钮门槛
|
||||
|
||||
- 图片中不包含按钮文字和微信图标。
|
||||
- 外框之外透明,内部视觉面完整。
|
||||
- 四角、双边和装饰连续,不得出现切口或拼接缝。
|
||||
- 3×输出缩小到真实槽位后,金线仍连续且不过度发虚。
|
||||
- 按钮点击区域由代码控制,不由图片透明区决定。
|
||||
|
||||
### 8.3 自动差异的边界
|
||||
|
||||
截图差异只比较同视口、同状态和同字体环境。字体抗锯齿、WebView 与 Chrome 的细小差异不能用单一全屏像素阈值判死刑;应优先比较资产局部裁图、尺寸、边缘和结构,再由人工判断整体视觉。
|
||||
|
||||
## 9. A01 卷轴祥云资产试点
|
||||
|
||||
流水线首先用两张 v2 按钮验证固定槽位,随后按用户选定方向升级为四件套 v3。当前 A01 实际引用:
|
||||
|
||||
- `a01-scroll-primary-v3.png`:`1866×276px`,登录主按钮。
|
||||
- `a01-scroll-secondary-v3.png`:`1866×300px`,微信次按钮。
|
||||
- `a01-scroll-toast-v3.png`:`1770×246px`,反馈 Toast 九宫格/切片表面。
|
||||
- `a01-scroll-dialog-v3.png`:`1860×1560px`,安全验证弹窗表面。
|
||||
|
||||
当前 `a01-primary-button.png`、`a01-secondary-button.png` 的原始比例与页面槽位不一致,且次按钮外缘存在高亮白/浅绿色像素,不能作为新流水线质量样板。
|
||||
|
||||
本机 H5 试点结果:
|
||||
|
||||
- 四张 v3 输出通过尺寸、Alpha 外圈、透明 RGB、绿边、浅色半透明边、体积和色彩声明检查;旧资产和 v2 试点资产原样保留。
|
||||
- A01 主/次按钮与弹窗使用 v3 路径和 `aspectFit`;Toast 使用 v3 切片资产;所有文字、微信图标和交互仍由页面代码独立承载。
|
||||
- 自动质量门与 `320×568`、`360×640`、`360×800`、`412×915` H5 运行检查通过。
|
||||
- 412×915 默认态、Toast 和验证弹窗真实运行截图未见原来的外缘白/浅绿边、角饰断裂或整体比例拉伸;仍需 Android/HBuilderX 与用户确认。
|
||||
|
||||
试点规则:
|
||||
|
||||
1. 保留当前资产,不覆盖、不删除。
|
||||
2. 新资产使用版本化路径。
|
||||
3. 先通过 Python/Node 自动质量门,再接入 A01。
|
||||
4. 接入后只保存一张 412×915 代表图;四尺寸可以自动检查但不连续保存大量相似截图。
|
||||
5. H5 通过只能写“内部候选”;Android 和用户确认之前,A01 仍为 `[~]`。
|
||||
6. 只有用户确认试点资产质量达到标准,才把 manifest v2 和混合流水线推广到其他页面。
|
||||
|
||||
## 10. 跨电脑环境合同
|
||||
|
||||
### G01 列表背景候选扩展
|
||||
|
||||
2026-07-16 已把混合流水线扩展到 G 模块公共背景。A/B/C 历史母版、旗舰长屏原稿、1536×3840 归一化母版、准确提示和处理模式保存在 `docs/design/assets/g01-background/masters/` 与 `design-pipeline/manifests/g01-background-candidates.json`;`build-g01-backgrounds.mjs` 使用 Node 内置模块编排,`build_g01_backgrounds.py` 使用锁定的 Pillow 完成绿幕转 Alpha、去绿边、不透明归一化、Lanczos 锁定尺寸缩放、sRGB 写入和确定性 PNG 输出。用户已选择旗舰长屏方向,清单以 `selectedCandidateId` 和 `runtimeOutput` 记录唯一运行方向;正式输出为 `static/assets/modules/genealogy/opaque/genealogy-page-background-long.png`,G01、G03、G05、G06、G08、G09、G10、G11、G12 通过 `GenealogyPageBackground.vue` 共用。图片使用 `widthFix` 按页面宽度等比完整显示并固定贴底,左右不裁剪、不使用 `scaleToFill` 拉伸;1440×3600 长图覆盖当前最高压力档,不再拼接纯色上层。A/B/C 母版与旧 C 运行图仅作为历史输入/输出保留,不进入当前页面。
|
||||
|
||||
执行 `npm.cmd --prefix design-pipeline run build:g01-background-candidates` 可在另一台电脑从仓库母版重建 A/B/C 和旗舰长屏四个输出。模型重新生成不能保证逐像素一致;精确重建必须使用仓库内母版。完整步骤、当前哈希和质量基线见 `docs/design/G01_列表背景候选与换机重建.md`。
|
||||
|
||||
### 10.1 当前已可运行的 Node 雏形
|
||||
|
||||
新电脑需要 Windows、Node.js 22 或更高版本、npm、HBuilderX、Chrome 和项目完整工作区。当前 Node 24 已验证可用。
|
||||
|
||||
```powershell
|
||||
node --version
|
||||
npm --version
|
||||
npm.cmd ci --prefix design-pipeline
|
||||
npm.cmd --prefix design-pipeline run build:a01
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a01-code-pipeline-contract.ps1
|
||||
```
|
||||
|
||||
这些命令只证明现有 schema v1 雏形可运行,不证明新质量门已经实现。
|
||||
|
||||
### 10.2 manifest v2 的 Python 环境
|
||||
|
||||
`design-pipeline/` 已提供锁定依赖、统一 Node 入口和 Python 质量脚本;不得要求接管者凭经验安装不确定版本。当前结构:
|
||||
|
||||
```text
|
||||
design-pipeline/
|
||||
package.json
|
||||
package-lock.json
|
||||
requirements.txt
|
||||
manifests/
|
||||
scripts/
|
||||
rebuild-a01-buttons.mjs
|
||||
rebuild_a01_buttons.py
|
||||
verify-assets.mjs
|
||||
verify-assets.py
|
||||
generated/ # 忽略,可再生成
|
||||
```
|
||||
|
||||
恢复和验证命令:
|
||||
|
||||
```powershell
|
||||
python --version
|
||||
python -m venv design-pipeline/.venv
|
||||
design-pipeline/.venv/Scripts/python.exe -m pip install --upgrade pip
|
||||
design-pipeline/.venv/Scripts/python.exe -m pip install -r design-pipeline/requirements.txt
|
||||
npm.cmd ci --prefix design-pipeline
|
||||
npm.cmd --prefix design-pipeline run test:v2
|
||||
npm.cmd --prefix design-pipeline run validate:a01-buttons
|
||||
npm.cmd --prefix design-pipeline run rebuild:a01-buttons
|
||||
npm.cmd --prefix design-pipeline run verify:assets
|
||||
npm.cmd --prefix design-pipeline run validate:a01-scroll-skins
|
||||
npm.cmd --prefix design-pipeline run build:a01-scroll-skins
|
||||
npm.cmd --prefix design-pipeline run verify:a01-scroll-skins
|
||||
design-pipeline/.venv/Scripts/python.exe -m unittest discover -s design-pipeline/tests -p "test_*.py" -v
|
||||
```
|
||||
|
||||
Node 入口优先使用 `PYTHON` 环境变量,其次自动使用 `design-pipeline/.venv/Scripts/python.exe`,最后才回退到系统 `python`。本机已按以上依赖完成验证;跨电脑仍必须真实执行并保存输出,不能只因文件齐全就写成换机复现通过。
|
||||
|
||||
### 10.3 可迁移文件
|
||||
|
||||
至少保留:
|
||||
|
||||
- `design-pipeline/package.json`
|
||||
- `design-pipeline/package-lock.json`
|
||||
- 实施后新增的 Python 锁定依赖文件
|
||||
- manifest、JSON Schema、构建/质量脚本和对应测试
|
||||
- manifest 引用的正式资产
|
||||
- 页面源码和真实截图工具
|
||||
- 本规范、`docs/交接记录.md` 与 P00 资产台账
|
||||
|
||||
不得依赖:
|
||||
|
||||
- `node_modules/`
|
||||
- Python 虚拟环境
|
||||
- `design-pipeline/generated/`
|
||||
- `tmp/`
|
||||
- 本机 Chrome 用户目录
|
||||
- Photoshop/PSD
|
||||
- 未进入仓库的候选图或 runtime 截图
|
||||
|
||||
## 11. 失败处理
|
||||
|
||||
- 依赖安装失败:停止并报告缺失环境,不绕过锁文件。
|
||||
- manifest 不合法:修正单一数据源,不在页面里增加例外。
|
||||
- 比例不匹配:回到目标槽位或重新导出,禁止 `fill` 掩盖。
|
||||
- 白边/绿边:回到 Alpha 去污染步骤,禁止用页面背景色遮盖。
|
||||
- H5 与组合预览不同:以真实 H5 为准并查明差异。
|
||||
- H5 与 Android 不同:不得冻结资产,记录 WebView/字体/缩放差异后修正。
|
||||
- 自动检查通过但用户认为不好看:状态仍为待审核,视觉判断以用户最新决定为准。
|
||||
|
||||
## 12. 推广条件
|
||||
|
||||
以下条件全部满足后,才能从 A01 推广:
|
||||
|
||||
1. A01 四张 v3 卷轴祥云资产通过 manifest、Python、Node 和四尺寸检查。
|
||||
2. 412×915 真实 H5 代表图没有白边、绿边、拉伸或模糊。
|
||||
3. Android/HBuilderX 已复核。
|
||||
4. 用户明确确认四件套资产质量和 A01 整页达到标准。
|
||||
5. 新电脑按文档能够从锁文件恢复环境并得到一致的质量报告。
|
||||
|
||||
当前仅满足第 1、2 项;第 3、4、5 项尚未满足。因此本规范和 A01 试点仍不是整项目推广或用户验收完成证明。
|
||||
@@ -1,62 +0,0 @@
|
||||
# 真实接口核心流程 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:** 让家谱 App 的认证、当前家谱上下文、创建首代和世系浏览形成可验证的 Mock/远端双模式核心闭环。
|
||||
|
||||
**Architecture:** `utils/config.js` 显式决定数据模式;`utils/api.js` 是唯一远端响应解包和错误转换位置;`utils/session.js` 与新增的上下文模块持久化 token 和当前家谱 ID。页面只调用 `appApi` 并从路由读取对象 ID。
|
||||
|
||||
**Tech Stack:** uni-app Vue 3、HBuilderX、uni.request、PowerShell 合同测试。
|
||||
|
||||
## Global Constraints
|
||||
|
||||
- 不将测试账号、密码或 token 写入源码、测试或文档。
|
||||
- 远端模式失败必须显示错误,不能自动返回 Mock 数据。
|
||||
- 所有新增页面必须登记在 `pages.json` 并纳入编译审计。
|
||||
|
||||
---
|
||||
|
||||
### Task 1: API 会话与响应契约
|
||||
|
||||
**Files:**
|
||||
- Modify: `utils/config.js`, `utils/session.js`, `utils/api.js`
|
||||
- Create: `utils/genealogy-context.js`, `tests/core-flow-contract.ps1`
|
||||
|
||||
- [x] 写失败测试,要求存在显式模式、登录方法、`data` 解包、token 与当前家谱 ID 持久化。
|
||||
- [x] 运行 PowerShell 合同测试并确认因方法缺失失败。
|
||||
- [x] 实现最小 API 适配层和上下文模块。
|
||||
- [x] 重跑合同测试,确认通过。
|
||||
|
||||
### Task 2: 认证与我的家谱
|
||||
|
||||
**Files:**
|
||||
- Modify: `pages/auth/login.vue`, `pages/genealogy/index.vue`, `components/GenealogyCard.vue`
|
||||
- Test: `tests/core-flow-contract.ps1`
|
||||
|
||||
- [x] 写失败测试,要求登录页调用 API、保存 token,家谱卡片和列表使用真实 ID。
|
||||
- [x] 运行测试确认失败。
|
||||
- [x] 实现密码登录、错误状态与列表加载状态。
|
||||
- [ ] 重跑测试并在 Mock 模式下手动走通登录至列表。
|
||||
|
||||
### Task 3: 当前家谱与首代录入
|
||||
|
||||
**Files:**
|
||||
- Modify: `pages.json`, `pages/genealogy/create.vue`, `pages/genealogy/detail.vue`, `pages/tree/index.vue`, `pages/member/detail.vue`
|
||||
- Create: `pages/lineage/first-person.vue`
|
||||
- Test: `tests/core-flow-contract.ps1`
|
||||
|
||||
- [x] 写失败测试,要求新页面、路由参数和 API 方法存在,且不得写死 `1001`/`3`。
|
||||
- [x] 运行测试确认失败。
|
||||
- [x] 实现创建家谱后录入首代、按路由 ID 加载详情/树/成员。
|
||||
- [x] 重跑合同测试与 HBuilderX Sass/语言诊断。
|
||||
|
||||
### Task 4: 加入审核与通知的上下文修复
|
||||
|
||||
**Files:**
|
||||
- Modify: `pages/genealogy/search.vue`, `pages/genealogy/applications.vue`, `pages/notification/index.vue`, `utils/api.js`
|
||||
- Test: `tests/core-flow-contract.ps1`
|
||||
|
||||
- [x] 写失败测试,要求申请和审核使用当前家谱 ID,通知读取操作有对应 API 方法。
|
||||
- [x] 运行测试确认失败。
|
||||
- [x] 实现上下文传递与明确的本地状态更新。
|
||||
- [x] 重跑所有项目测试及 HBuilderX 实际样式/模块请求验证。
|
||||
@@ -1,230 +0,0 @@
|
||||
# G01 信息层级与谱印校正 Implementation Plan
|
||||
|
||||
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
|
||||
|
||||
**Goal:** 让“我的家谱”内容区按已确认的 v5 参考稿呈现谱印、元信息、快捷入口、列表和新建按钮的视觉层级。
|
||||
|
||||
**Architecture:** 视觉资产只放在 `static/assets/icons/`,页面和卡片组件只引用资产与渲染动态数据。`pages/genealogy/index.vue` 负责当前家谱、快捷入口和新建按钮;`components/GenealogyCard.vue` 负责每条列表的谱印、两层元信息和右侧操作列。
|
||||
|
||||
**Tech Stack:** uni-app Vue 3、SCSS、项目本地 RGBA PNG、PowerShell 契约审计。
|
||||
|
||||
## Global Constraints
|
||||
|
||||
- 视觉基准:`docs/design/screens/G01-我的家谱-紧凑版设计稿-v5-Tabbar安全区.png`。
|
||||
- Android only;继续使用 rpx、flex、小屏 `max-width: 340px` 规则,不使用 `clip-path` 或 CSS 绘图。
|
||||
- 所有新增可见图标、谱印框、云纹均为项目内透明 PNG;动态姓名/数字使用 Vue 文本,不嵌死在图片中。
|
||||
- 不改接口、路由、页头、背景、Tabbar 或其他页面;仅为现有展示用 `data/mock.js` 家谱条目补充 `updatedAt` 日期字段。
|
||||
- 工作目录不是 Git 仓库,本轮不初始化仓库、不创建提交。
|
||||
|
||||
---
|
||||
|
||||
### Task 1: 谱印与元信息 PNG 资产
|
||||
|
||||
**Files:**
|
||||
- Create: `static/assets/icons/common/location-v1.png`
|
||||
- Create: `static/assets/icons/common/member-meta-v1.png`
|
||||
- Create: `static/assets/icons/common/admin-v1.png`
|
||||
- Create: `static/assets/icons/genealogy/seal-current-frame-v1.png`
|
||||
- Create: `static/assets/icons/genealogy/seal-row-frame-v1.png`
|
||||
- Create: `static/assets/icons/action/create-cloud-v1.png`
|
||||
- Modify: `tests/g01-visual-contract.ps1`
|
||||
|
||||
**Interfaces:**
|
||||
- Produces 96×96 RGBA metadata icons, separate transparent current/list seal-frame PNGs, and a transparent cloud ornament consumed by Tasks 2–3.
|
||||
- Each asset corner alpha must be 0; the current seal frame must have taller visible bounds than the row seal frame.
|
||||
|
||||
- [x] **Step 1: Write the failing asset contract**
|
||||
|
||||
Add the six paths to `$requiredAssets`, then add these assertions to `tests/g01-visual-contract.ps1`:
|
||||
|
||||
```powershell
|
||||
foreach ($asset in @('location-v1.png', 'member-meta-v1.png', 'admin-v1.png', 'seal-current-frame-v1.png', 'seal-row-frame-v1.png', 'create-cloud-v1.png')) {
|
||||
if ($page -notmatch [regex]::Escape($asset) -and $card -notmatch [regex]::Escape($asset)) {
|
||||
throw "G-01 does not consume $asset"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
- [x] **Step 2: Run the contract and verify it fails**
|
||||
|
||||
Run: `powershell -ExecutionPolicy Bypass -File tests\g01-visual-contract.ps1`
|
||||
Expected: `FAIL` because the asset files and component references do not exist.
|
||||
|
||||
- [x] **Step 3: Generate and inspect the assets**
|
||||
|
||||
Generate one asset at a time on a flat chroma-key background, remove the chroma key to alpha, and inspect the selected PNG before adding it. Use this visual language: antique-gold single/double outline, Chinese genealogy motif, no text, no shadow, transparent canvas. For the seal frames, generate only the red-and-gold frame; do not include surname or “家谱” text.
|
||||
|
||||
- [x] **Step 4: Verify transparent corners**
|
||||
|
||||
Run a PowerShell `System.Drawing.Bitmap` alpha audit that checks the four canvas corners of every new PNG are 0.
|
||||
|
||||
Expected: all six assets report `PASS ... transparent corners`.
|
||||
|
||||
### Task 2: 当前家谱题签、快捷入口与新建按钮
|
||||
|
||||
**Files:**
|
||||
- Modify: `pages/genealogy/index.vue`
|
||||
- Modify: `tests/g01-visual-contract.ps1`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes the Task 1 metadata icons, `seal-current-frame-v1.png`, and `create-cloud-v1.png`.
|
||||
- Keeps `currentGenealogy` as the data owner; does not add API calls.
|
||||
|
||||
- [x] **Step 1: Write the failing page-layout contract**
|
||||
|
||||
Require the current title block to render three `.current-meta-item` entries and the current seal to include a `.current-seal-frame` image. Require the shortcut display size and create cloud image:
|
||||
|
||||
```powershell
|
||||
foreach ($token in @('current-meta-item', 'current-seal-frame', 'location-v1.png', 'member-meta-v1.png', 'admin-v1.png', 'create-cloud-v1.png')) {
|
||||
if ($page -notmatch $token) { throw "G-01 current panel is missing $token" }
|
||||
}
|
||||
if ($page -notmatch 'width:\s*82rpx') { throw 'G-01 shortcut icons remain below the reference visual size.' }
|
||||
```
|
||||
|
||||
- [x] **Step 2: Run the contract and verify it fails**
|
||||
|
||||
Run: `powershell -ExecutionPolicy Bypass -File tests\g01-visual-contract.ps1`
|
||||
Expected: `FAIL` because current content is still a pure text metadata row and has no seal/cloud image references.
|
||||
|
||||
- [x] **Step 3: Implement the minimum current-panel markup**
|
||||
|
||||
Replace the pure red `current-seal` block with an image layer and dynamic text overlay:
|
||||
|
||||
```vue
|
||||
<view class="current-seal">
|
||||
<image class="current-seal-frame" src="/static/assets/icons/genealogy/seal-current-frame-v1.png" mode="scaleToFill" />
|
||||
<text class="current-seal-title">家谱</text>
|
||||
</view>
|
||||
```
|
||||
|
||||
Render three icon/text metadata groups using the created `location-v1.png`, `member-meta-v1.png`, and `admin-v1.png`; retain `currentGenealogy.location` and `currentGenealogy.memberCount` as the text values.
|
||||
|
||||
- [x] **Step 4: Implement the spacing-only CSS changes**
|
||||
|
||||
Set shortcut image box to `82rpx`; increase label size and give the shortcut grid the reference-like vertical space. Use flex wrapping for current metadata and keep the existing `@media screen and (max-width: 340px)` behavior so no item overlaps.
|
||||
|
||||
- [x] **Step 5: Implement the create-button ornament**
|
||||
|
||||
Place two instances of `create-cloud-v1.png` inside `.create-action`; mirror only the right PNG with `transform: scaleX(-1)`. Keep the existing add PNG and navigation handler.
|
||||
|
||||
- [x] **Step 6: Run the contract and verify it passes**
|
||||
|
||||
Run: `powershell -ExecutionPolicy Bypass -File tests\g01-visual-contract.ps1`
|
||||
Expected: `PASS G-01 visual contract`.
|
||||
|
||||
### Task 3: 家谱列表谱印与信息层级
|
||||
|
||||
**Files:**
|
||||
- Modify: `components/GenealogyCard.vue`
|
||||
- Modify: `data/mock.js`
|
||||
- Modify: `tests/g01-visual-contract.ps1`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes `genealogy` (`surname`, `name`, `location`, `memberCount`, `updatedAt`), `role`, and the Task 1 row seal asset.
|
||||
- Emits the unchanged `select` event.
|
||||
|
||||
- [x] **Step 1: Write the failing card-layout contract**
|
||||
|
||||
Require `seal-row-frame-v1.png` and an explicit `.card-detail-row`:
|
||||
|
||||
```powershell
|
||||
foreach ($token in @('seal-row-frame-v1.png', 'card-detail-row', 'card-updated')) {
|
||||
if ($card -notmatch $token) { throw "G-01 list card is missing $token" }
|
||||
}
|
||||
if ($card -match 'background:\s*#b93b2e') { throw 'G-01 list seal is still a plain CSS red block.' }
|
||||
```
|
||||
|
||||
- [x] **Step 2: Run the contract and verify it fails**
|
||||
|
||||
Run: `powershell -ExecutionPolicy Bypass -File tests\g01-visual-contract.ps1`
|
||||
Expected: `FAIL` because the current list card has no frame asset or two-level detail markup.
|
||||
|
||||
- [x] **Step 3: Implement the minimal list-card markup**
|
||||
|
||||
Use a `.surname-seal` image frame with text overlay, then split metadata into title/detail/update rows:
|
||||
|
||||
```vue
|
||||
<view class="card-detail-row">
|
||||
<text class="card-meta">{{ genealogy.location }} · {{ genealogy.memberCount }} 位成员</text>
|
||||
<view class="card-updated"><text>更新于 {{ genealogy.updatedAt }}</text></view>
|
||||
</view>
|
||||
```
|
||||
|
||||
On narrow screens, hide `.card-updated`; preserve the role and chevron column.
|
||||
|
||||
- [x] **Step 3a: Add the visual fixture dates**
|
||||
|
||||
Add `updatedAt: '2024-05-12'` to genealogy `1001` and `updatedAt: '2024-04-28'` to genealogy `1002` in `data/mock.js`. These fields are display-only fixtures and do not change the API contract.
|
||||
|
||||
- [x] **Step 4: Implement CSS sizing and small-screen fallback**
|
||||
|
||||
Increase card name/title prominence, keep row-frame as the only paper frame, set right-side role/chevron to a centered fixed column, and make `.card-updated` disappear at `max-width: 340px` before text can collide.
|
||||
|
||||
- [x] **Step 5: Run the contract and verify it passes**
|
||||
|
||||
Run: `powershell -ExecutionPolicy Bypass -File tests\g01-visual-contract.ps1`
|
||||
Expected: `PASS G-01 visual contract`.
|
||||
|
||||
### Task 4: Documentation and full verification
|
||||
|
||||
**Files:**
|
||||
- Modify: `docs/design/G01_我的家谱_设计记录.md`
|
||||
- Modify: `docs/规划.md`
|
||||
|
||||
**Interfaces:**
|
||||
- Records only completed implementation and verification; leaves G01 unchecked until an HBuilderX comparison screenshot is accepted.
|
||||
|
||||
- [x] **Step 1: Record the completed implementation scope**
|
||||
|
||||
Append the new asset paths, the explicit visual reference, and the small-screen fallback to the G01 design record. Mark the implementation subtask complete in `docs/规划.md`; do not mark the full G01 design complete.
|
||||
|
||||
- [x] **Step 2: Run focused verification**
|
||||
|
||||
Run:
|
||||
|
||||
```powershell
|
||||
powershell -ExecutionPolicy Bypass -File tests\g01-visual-contract.ps1
|
||||
powershell -ExecutionPolicy Bypass -File tests\compile-audit.ps1
|
||||
powershell -ExecutionPolicy Bypass -File tests\uni-scss-injection.ps1
|
||||
```
|
||||
|
||||
Expected: three `PASS` lines and no warnings.
|
||||
|
||||
- [ ] **Step 3: Capture visual evidence in HBuilderX**
|
||||
|
||||
At the same phone viewport as the supplied comparison, capture G01 and compare it side-by-side with the v5 reference. Confirm the current title/meta row, all three seals, four shortcut icon sizes, list row hierarchy, and cloud button ornament. If a mismatch remains, record it rather than marking G01 complete.
|
||||
|
||||
## Plan self-review
|
||||
|
||||
- Spec coverage: Tasks 1–3 implement every asset, layout, small-screen, and visual hierarchy requirement; Task 4 records and verifies it.
|
||||
- No placeholders: all new paths, CSS tokens, component classes, commands, and expected outputs are named.
|
||||
- Consistency: page uses current panel assets; card uses row seal and metadata assets; both are enforced by one G01 visual contract.
|
||||
|
||||
### Task 5: 参考稿字段与列表基线校正
|
||||
|
||||
**Files:**
|
||||
- Modify: `data/mock.js`
|
||||
- Modify: `pages/genealogy/index.vue`
|
||||
- Modify: `components/GenealogyCard.vue`
|
||||
- Modify: `tests/g01-visual-contract.ps1`
|
||||
|
||||
**Interfaces:**
|
||||
- Produces reference-matched visual fixture fields without changing any remote API contract.
|
||||
- Keeps the existing navigation and card `select` event unchanged.
|
||||
|
||||
- [x] **Step 1: Write the failing visual-fixture contract**
|
||||
|
||||
Require the four reference names/locations/counts, `.current-info-divider`, a row-direction `.card-side`, and no `calendar-v1.png` use in the list component.
|
||||
|
||||
- [x] **Step 2: Run the contract and verify it fails**
|
||||
|
||||
Run: `powershell -ExecutionPolicy Bypass -File tests\g01-visual-contract.ps1`
|
||||
Expected: `FAIL` because the old demonstration fields, missing current divider, vertical role/arrow, and calendar icon are still present.
|
||||
|
||||
- [x] **Step 3: Apply the smallest source correction**
|
||||
|
||||
Replace only G01 mock fixture fields with the strings in the approved reference. Add the current-panel divider; render fixed vertical “家谱” list seal text; remove the list calendar icon; align `.card-role` and `.card-chevron` horizontally.
|
||||
|
||||
- [x] **Step 4: Run focused verification**
|
||||
|
||||
Run the G01 visual contract, PNG alpha audit, compile audit, SCSS injection audit, and Vue 3 entry audit. Keep Task 4 visual capture unchecked until the user accepts a new HBuilderX screenshot.
|
||||
@@ -1,221 +0,0 @@
|
||||
# G-01 Visual Shell 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:** Rebuild the Android “我的家谱” G-01 page as the approved 家祠卷轴 design with verified local PNG assets and stable mock presentation data.
|
||||
|
||||
**Architecture:** pages/genealogy/index.vue owns local visual states only. It composes a heritage header, paper-slip list items, and safe bottom navigation; it does not make remote API calls during this visual-construction phase.
|
||||
|
||||
**Tech Stack:** uni-app, Vue 3 script setup, SCSS/rpx, local RGBA PNG/JPG assets, PowerShell checks.
|
||||
|
||||
## Global Constraints
|
||||
|
||||
- Android only; verify 360 × 800 and 320 × 568 without overlap.
|
||||
- No API, authentication, packaging, dependency, or unrelated-flow changes.
|
||||
- Every functional icon is a local RGBA PNG under static/assets/icons/.
|
||||
- Header uses the confirmed original brand/jiapu-seal-logo.png in the left safe area; title is centered; notification dot renders only for unread messages.
|
||||
- Tabbar is fixed at the bottom, has 64dp content plus Android navigation inset, and keeps the icon and label clear of the lower edge.
|
||||
- Do not mark G-01 design complete until assets, normal/empty/loading states, and small-screen checks have evidence.
|
||||
|
||||
## File Responsibilities
|
||||
|
||||
| File | Responsibility |
|
||||
| --- | --- |
|
||||
| static/assets/icons/genealogy/*-v2.png | Four compact antique-gold G-01 shortcut icons. |
|
||||
| static/assets/icons/action/add-v2.png | The compact 新建家谱 icon. |
|
||||
| static/assets/icons/common/chevron-right-v2.png | Compact right-arrow asset for the paper-slip list row. |
|
||||
| static/assets/icons/tab/*-v4.png | Default and active 24dp tab icon pairs. |
|
||||
| components/PageHeader.vue | Heritage header, original Logo, notification PNG and optional dot. |
|
||||
| components/AppTabbar.vue | Fixed Android-safe three-tab navigation. |
|
||||
| components/GenealogyCard.vue | Compact paper-slip genealogy list row. |
|
||||
| pages/genealogy/index.vue | G-01 content, local state and route actions. |
|
||||
| tests/g01-visual-contract.ps1 | Asset and static page-contract checks. |
|
||||
|
||||
## Task 1: Produce and register G-01 visual assets
|
||||
|
||||
**Files:**
|
||||
- Create: static/assets/icons/genealogy/tree-v2.png
|
||||
- Create: static/assets/icons/genealogy/members-v2.png
|
||||
- Create: static/assets/icons/genealogy/generation-poem-v2.png
|
||||
- Create: static/assets/icons/genealogy/application-v2.png
|
||||
- Create: static/assets/icons/action/add-v2.png
|
||||
- Create: static/assets/icons/common/chevron-right-v2.png
|
||||
- Create: static/assets/icons/tab/{genealogy,family,profile}-v4.png
|
||||
- Create: static/assets/icons/tab/{genealogy,family,profile}-active-v4.png
|
||||
- Create: tests/g01-visual-contract.ps1
|
||||
- Modify: docs/design/G01_我的家谱_设计记录.md
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: D1 icon rules and the G-01 asset table.
|
||||
- Produces: the listed asset paths; no legacy static/icons/tab-*.png consumer remains.
|
||||
|
||||
- [x] **Step 1: Write the failing asset contract**
|
||||
|
||||
$root = Split-Path -Parent $PSScriptRoot
|
||||
$requiredAssets = @(
|
||||
'static/assets/icons/brand/jiapu-seal-logo.png',
|
||||
'static/assets/icons/common/notice-v3.png',
|
||||
'static/assets/icons/genealogy/tree-v2.png',
|
||||
'static/assets/icons/genealogy/members-v2.png',
|
||||
'static/assets/icons/genealogy/generation-poem-v2.png',
|
||||
'static/assets/icons/genealogy/application-v2.png',
|
||||
'static/assets/icons/action/add-v2.png',
|
||||
'static/assets/icons/common/chevron-right-v2.png',
|
||||
'static/assets/icons/tab/genealogy-v4.png',
|
||||
'static/assets/icons/tab/genealogy-active-v4.png',
|
||||
'static/assets/icons/tab/family-v4.png',
|
||||
'static/assets/icons/tab/family-active-v4.png',
|
||||
'static/assets/icons/tab/profile-v4.png',
|
||||
'static/assets/icons/tab/profile-active-v4.png'
|
||||
)
|
||||
foreach ($asset in $requiredAssets) {
|
||||
if (-not (Test-Path -LiteralPath (Join-Path $root $asset))) {
|
||||
throw "Missing G-01 visual asset: $asset"
|
||||
}
|
||||
}
|
||||
Write-Output 'PASS G-01 visual contract'
|
||||
|
||||
- [x] **Step 2: Run the contract and confirm it fails**
|
||||
|
||||
Run: powershell -ExecutionPolicy Bypass -File C:\Users\Rain\Desktop\job\jiapuapp\tests\g01-visual-contract.ps1
|
||||
|
||||
Expected: an error that names tree-v2.png as missing.
|
||||
|
||||
- [x] **Step 3: Generate and validate every icon**
|
||||
|
||||
Generate each asset separately as a tight 96 × 96px transparent PNG. Shortcut and add icons use antique-gold #B58A4B with the approved restrained double-line style. Tab pairs use the same 24dp silhouette in default ink #342A24 and selected cinnabar #A33B2B; no text, clouds, leaves, shadows, or excess transparent padding.
|
||||
|
||||
- [x] **Step 4: Inspect and register accepted assets**
|
||||
|
||||
Inspect Tabs at 46rpx and shortcuts at 48rpx. Reject opaque corners, excess canvas padding, unrecognizable semantics, and any default/selected silhouette mismatch. Update the G-01 asset table with actual path, 96 × 96px, transparency result, and display-size result. Do not tick page-completion boxes yet.
|
||||
|
||||
- [x] **Step 5: Re-run the asset contract**
|
||||
|
||||
Expected: PASS G-01 visual contract.
|
||||
|
||||
## Task 2: Rebuild header and Android-safe Tabbar
|
||||
|
||||
**Files:**
|
||||
- Modify: components/PageHeader.vue
|
||||
- Modify: components/AppTabbar.vue
|
||||
- Modify: tests/g01-visual-contract.ps1
|
||||
|
||||
**Interfaces:**
|
||||
- Produces: PageHeader title=我的家谱 with unreadCount, and AppTabbar active=genealogy.
|
||||
|
||||
- [x] **Step 1: Extend the failing static contract**
|
||||
|
||||
$header = Get-Content -Raw -Encoding UTF8 (Join-Path $root 'components/PageHeader.vue')
|
||||
$tabbar = Get-Content -Raw -Encoding UTF8 (Join-Path $root 'components/AppTabbar.vue')
|
||||
if ($header -notmatch 'jiapu-seal-logo\.png') { throw 'Header does not use the approved brand PNG.' }
|
||||
if ($header -notmatch 'notice-v3\.png') { throw 'Header does not use the approved notice PNG.' }
|
||||
if ($header -notmatch 'unreadCount\s*>\s*0') { throw 'Header badge is not conditional on unread count.' }
|
||||
if ($tabbar -match '/static/icons/tab-') { throw 'Tabbar still references rejected legacy tab assets.' }
|
||||
if ($tabbar -notmatch 'safe-area-inset-bottom') { throw 'Tabbar has no Android safe-area padding.' }
|
||||
if ($tabbar -notmatch 'font-size:\s*24rpx') { throw 'Tabbar label size is below the approved G-01 size.' }
|
||||
|
||||
- [x] **Step 2: Confirm the contract fails before components change**
|
||||
|
||||
Run the focused contract.
|
||||
|
||||
Expected: failure describing the legacy header or Tabbar implementation.
|
||||
|
||||
- [x] **Step 3: Implement the header**
|
||||
|
||||
Use image-only controls: an 88rpx Logo touch area, centered title, and equal-width 88rpx notice touch area using notice-v3.png. Add v-if unreadCount > 0 for the cinnabar dot. Use the header line-art PNG over a cinnabar base. Do not render text labels for Logo or notification action.
|
||||
|
||||
- [x] **Step 4: Implement the Tabbar**
|
||||
|
||||
Map every item to its v4 default/active PNG paths and choose by active === item.key. Keep a paper-white fixed bar, visible content height 128rpx, padding-bottom env(safe-area-inset-bottom), icon 48rpx, label 24rpx, and each touch target at least 96rpx. Do not use gap.
|
||||
|
||||
- [x] **Step 5: Re-run the contract**
|
||||
|
||||
Expected: PASS G-01 visual contract.
|
||||
|
||||
## Task 3: Rebuild G-01 content and presentation states
|
||||
|
||||
**Files:**
|
||||
- Modify: components/GenealogyCard.vue
|
||||
- Modify: pages/genealogy/index.vue
|
||||
- Modify: tests/g01-visual-contract.ps1
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: genealogies and notifications from @/data/mock.js.
|
||||
- Produces: isLoading, hasGenealogies, createdGenealogies, and joinedGenealogies visual branches.
|
||||
|
||||
- [x] **Step 1: Add the failing local-state contract**
|
||||
|
||||
$page = Get-Content -Raw -Encoding UTF8 (Join-Path $root 'pages/genealogy/index.vue')
|
||||
if ($page -match "from '@/utils/api\.js'") { throw 'G-01 visual phase must not call the remote API.' }
|
||||
foreach ($state in @('isLoading', 'hasGenealogies', 'createdGenealogies', 'joinedGenealogies')) {
|
||||
if ($page -notmatch $state) { throw "G-01 is missing presentation state: $state" }
|
||||
}
|
||||
foreach ($asset in @('tree-v2.png', 'members-v2.png', 'generation-poem-v2.png', 'application-v2.png', 'add-v2.png')) {
|
||||
if ($page -notmatch [regex]::Escape($asset)) { throw "G-01 does not consume $asset" }
|
||||
}
|
||||
|
||||
- [x] **Step 2: Confirm the contract fails on the legacy page**
|
||||
|
||||
Expected: failure for the API import or missing visual state.
|
||||
|
||||
- [x] **Step 3: Implement the page state owner**
|
||||
|
||||
Remove appApi, genealogyContext, and the mounted API call. Import genealogies and notifications from @/data/mock.js, then define:
|
||||
|
||||
const isLoading = ref(false)
|
||||
const list = ref(genealogies)
|
||||
const hasGenealogies = computed(() => list.value.length > 0)
|
||||
const createdGenealogies = computed(() => list.value.filter((item, index) => index === 0))
|
||||
const joinedGenealogies = computed(() => list.value.filter((item, index) => index > 0))
|
||||
|
||||
Retain only route navigation: tree /pages/tree/index, members /pages/genealogy/detail, generation poem /pages/content/list?type=poem, applications /pages/genealogy/applications, create /pages/genealogy/create, search /pages/genealogy/search, and notifications /pages/notification/index.
|
||||
|
||||
- [x] **Step 4: Implement approved compact layout**
|
||||
|
||||
Compose heritage header, current-genealogy paper slip, four equal shortcut entries with v2 assets, separate 我创建的 / 我加入的 groups, compact paper-slip rows, and the add button. Implement a distinct loading state and an empty paper/scroll state with 新建家谱 and 搜索并申请加入. Apply paper texture to the page and mountain/bamboo only to the lower content region. Add bottom content padding that clears the fixed Tabbar.
|
||||
|
||||
- [x] **Step 5: Simplify GenealogyCard.vue**
|
||||
|
||||
Use a seal-style surname block, title, short location/member metadata, identity label, and common/chevron-right-v2.png. Remove the legacy navy cover, motto, and active-member count. Ensure long copy uses min-width: 0, overflow: hidden, and text-overflow: ellipsis.
|
||||
|
||||
- [x] **Step 6: Re-run the focused contract**
|
||||
|
||||
Expected: PASS G-01 visual contract.
|
||||
|
||||
## Task 4: Verify and update the project record
|
||||
|
||||
**Files:**
|
||||
- Modify: docs/design/G01_我的家谱_设计记录.md
|
||||
- Modify: docs/规划.md
|
||||
- Test: tests/g01-visual-contract.ps1
|
||||
- Test: tests/compile-audit.ps1
|
||||
- Test: tests/uni-scss-injection.ps1
|
||||
|
||||
- [x] **Step 1: Run the automated checks**
|
||||
|
||||
Run:
|
||||
|
||||
powershell -ExecutionPolicy Bypass -File C:\Users\Rain\Desktop\job\jiapuapp\tests\g01-visual-contract.ps1
|
||||
powershell -ExecutionPolicy Bypass -File C:\Users\Rain\Desktop\job\jiapuapp\tests\compile-audit.ps1
|
||||
powershell -ExecutionPolicy Bypass -File C:\Users\Rain\Desktop\job\jiapuapp\tests\uni-scss-injection.ps1
|
||||
|
||||
Expected: each command prints its PASS result.
|
||||
|
||||
- [ ] **Step 2: Verify at Android reference sizes**
|
||||
|
||||
Inspect 360 × 800 and 320 × 568. Confirm no overlap among Logo, title, and bell; notice dot only appears with unread entries; shortcut labels remain one line; list text truncates instead of overlaps; create action clears the Tabbar; all three Tab labels remain fully visible above system navigation.
|
||||
|
||||
- [ ] **Step 3: Update only verified design state**
|
||||
|
||||
In the G-01 record, tick only conditions backed by Tasks 1–2 and the two viewport checks. In the overall planning document, leave G-01 unchecked if even one state, asset, or viewport condition remains incomplete; otherwise record visual shell implemented and verified.
|
||||
|
||||
- [ ] **Step 4: Commit only when Git becomes available**
|
||||
|
||||
If a Git worktree exists, commit changed visual-shell files with message: feat: build G01 genealogy visual shell. If Git remains unavailable, report that no commit was created and do not initialize a repository.
|
||||
|
||||
## Plan Self-Review
|
||||
|
||||
- Task 1 covers local assets and transparency checks.
|
||||
- Task 2 covers the Logo, conditional notification dot, and safe Tabbar.
|
||||
- Task 3 covers G-01 normal, loading, and empty states plus approved compact layout.
|
||||
- Task 4 requires automated and small-screen verification before any completion status changes.
|
||||
@@ -1,123 +0,0 @@
|
||||
# A-01 / A-02 本地 UI 落地执行计划
|
||||
|
||||
> **执行说明:** 当前实现仅覆盖 `A-01 启动登录引导` 与 `A-02 双标签登录页` 的本地 UI 和本地交互;不接后端、不写 token、不跳转家谱页、不改 Android 打包配置。
|
||||
|
||||
**目标:** 将已确认的 A-01 / A-02 设计落实为可运行的 uni-app 页面,并把“显式阅读并同意协议”作为进入登录页的唯一前置条件。
|
||||
|
||||
**实现合同:** `docs/superpowers/specs/2026-07-13-a01-a02-static-ui-implementation-design.md`
|
||||
|
||||
**技术边界:** Vue 3 `<script setup>`、uni-app;仅改路由入口和认证页;仅复用 `static/assets/backgrounds/auth-*`、`static/assets/icons/auth/*` 中的资源。
|
||||
|
||||
---
|
||||
|
||||
## 任务 1:先建立 A-01 / A-02 页面合同检查
|
||||
|
||||
**文件:**
|
||||
- 新建:`tests/a01-a02-ui-contract.ps1`
|
||||
|
||||
**步骤:**
|
||||
1. 编写 PowerShell 合同测试,读取 `pages.json`、`pages/auth/entry.vue`、`pages/auth/login.vue`。
|
||||
2. 使用 UTF-8 Base64 常量保存中文断言,避免 PowerShell 文件编码影响中文匹配。
|
||||
3. 断言 `pages/auth/entry` 是第一个页面,A-01 有显式协议勾选、账号登录、微信登录、文字注册入口,A-02 有两个标签、忘记密码和本地待接入反馈。
|
||||
4. 断言认证页中不再出现 `appApi`、`calcMD5`、`loginWithPassword`、`uni.reLaunch` 和旧的“登录即表示同意”文案。
|
||||
5. 在页面改造前运行该测试,预期因 A-01 页面尚不存在而失败;不提交红灯状态。
|
||||
|
||||
**验证:**
|
||||
|
||||
```powershell
|
||||
& .\tests\a01-a02-ui-contract.ps1
|
||||
```
|
||||
|
||||
预期:失败,指出缺少 `pages/auth/entry.vue`。
|
||||
|
||||
---
|
||||
|
||||
## 任务 2:创建 A-01 启动登录引导页并注册路由
|
||||
|
||||
**文件:**
|
||||
- 修改:`pages.json`
|
||||
- 新建:`pages/auth/entry.vue`
|
||||
|
||||
**步骤:**
|
||||
1. 在 `pages.json` 的 `pages` 数组首位加入 `pages/auth/entry`,保留现有认证页路径和所有其余路由。
|
||||
2. 建立 `entry.vue`:使用祖祠红色横幅、宣纸和山水背景资源,呈现标题、品牌说明、账号密码登录、微信登录、文字注册入口和协议区域。
|
||||
3. 以 `agreed` 作为唯一的本地状态。账号登录在勾选后仅执行:
|
||||
|
||||
```js
|
||||
uni.navigateTo({ url: '/pages/auth/login?agreed=1' })
|
||||
```
|
||||
|
||||
4. 所有 A-01 操作在未勾选时统一提示:
|
||||
|
||||
```js
|
||||
uni.showToast({ title: '请先阅读并同意相关协议', icon: 'none' })
|
||||
```
|
||||
|
||||
5. 勾选后,微信登录提示“微信登录功能准备中”,注册入口提示“注册页面准备中”;协议文字本身提示“协议页面准备中”。不创建尚未设计的协议、注册或微信授权页面。
|
||||
6. 用页面内最小样式匹配已验收的 A-01:窄红色顶部、宣纸主体、红色主按钮、金色描边次按钮、底部山水留白;主内容最大宽度控制为移动端阅读尺寸,并预留安全区。
|
||||
|
||||
**验证:**
|
||||
|
||||
```powershell
|
||||
& .\tests\a01-a02-ui-contract.ps1
|
||||
```
|
||||
|
||||
预期:仍失败,仅因 A-02 旧页面含 API / 旧同意逻辑。
|
||||
|
||||
---
|
||||
|
||||
## 任务 3:将现有 login 页面替换为 A-02 双标签本地 UI
|
||||
|
||||
**文件:**
|
||||
- 修改:`pages/auth/login.vue`
|
||||
|
||||
**步骤:**
|
||||
1. 删除 `appApi`、`calcMD5`、密码加密、网络请求和登录后 `reLaunch`;不保留兼容分支。
|
||||
2. 用 `onLoad` 读取 `agreed=1`,并仅以此本地参数决定是否允许提交;缺少该参数时,任何提交均提示“请先返回登录引导确认协议”。
|
||||
3. 默认显示“账号密码登录”标签,字段为账号/手机号与密码;下方保留“忘记密码”文字入口,点击提示“忘记密码页面准备中”。
|
||||
4. 增加“手机验证码登录”标签,字段为手机号与验证码,并提供不发请求的“获取验证码”次级按钮,点击提示“获取验证码功能待接入”。
|
||||
5. 两种登录提交完成本地必填校验后均只提示“登录接口待接入”,不得调用网络、写入本地登录态或跳转业务页。
|
||||
6. 延续 A-01 视觉语言:同款顶部和纸质背景、红金色标签与主按钮、输入区域清晰分组;不复写协议同意逻辑或出现“登录即表示同意”文案。
|
||||
|
||||
**验证:**
|
||||
|
||||
```powershell
|
||||
& .\tests\a01-a02-ui-contract.ps1
|
||||
```
|
||||
|
||||
预期:通过。
|
||||
|
||||
---
|
||||
|
||||
## 任务 4:做最小可编译验证并更新交接状态
|
||||
|
||||
**文件:**
|
||||
- 修改:`docs/交接记录.md`
|
||||
- 修改:`docs/规划.md`
|
||||
|
||||
**步骤:**
|
||||
1. 运行认证页合同测试和现有 Vue 编译审计;若项目现有全部 PowerShell 测试可在合理时间内运行,则一并运行。
|
||||
2. 检查变更只覆盖 A-01/A-02、路由入口、对应合同测试和状态记录;不触碰用户已有的三个脏文件。
|
||||
3. 在交接记录与规划中明确记录:A-01/A-02 已完成本地 UI,所有认证接口、协议正文、真实微信授权、注册、找回密码仍未接入并等待后续页面设计/接口阶段。
|
||||
4. 提交仅包含本轮 A-01/A-02 代码、测试和文档的文件。
|
||||
|
||||
**验证:**
|
||||
|
||||
```powershell
|
||||
& .\tests\a01-a02-ui-contract.ps1
|
||||
& .\tests\vue3-compile-audit.ps1
|
||||
git diff --check
|
||||
git status --short
|
||||
```
|
||||
|
||||
预期:前两项通过、`git diff --check` 无输出,状态中只出现本轮受管文件及已知用户脏文件。
|
||||
|
||||
---
|
||||
|
||||
## 自检
|
||||
|
||||
- [x] 实现范围只含 A-01、A-02 和它们的入口路由。
|
||||
- [x] 以实现合同为唯一行为来源,没有引入新认证合同。
|
||||
- [x] 明确列出红灯、绿灯以及不提交红灯状态的规则。
|
||||
- [x] 每个任务都给出精确文件和可执行验证命令。
|
||||
- [x] 无 API、无 token、无伪造完成页、无 Android 配置改动。
|
||||
@@ -1,63 +0,0 @@
|
||||
# A01 Complete Button Assets Implementation Plan
|
||||
|
||||
> **For agentic workers:** REQUIRED SUB-SKILL: Use `superpowers:subagent-driven-development` or `superpowers:executing-plans` task by task. Steps use checkbox syntax for tracking.
|
||||
|
||||
**Goal:** Replace A01's temporary CSS-and-corner construction with two audited, complete opaque button images that match the approved A01 button proportion.
|
||||
|
||||
**Architecture:** `pages/auth/a01-entry.vue` remains the owner of button text, icons, agreement gating, and navigation. `a01-primary-button.png` and `a01-secondary-button.png` own each button's paper/vermillion surface, double border, and all four corner ornaments; they render as one non-interactive image beneath the DOM content.
|
||||
|
||||
**Tech Stack:** uni-app Vue 3, scoped SCSS, local opaque PNG assets, PowerShell/System.Drawing audits.
|
||||
|
||||
## Global Constraints
|
||||
|
||||
- Use the approved `docs/design/screens/A01-启动登录引导-栅格验收-412x915.png` only as the visual reference; never crop it into a runtime asset.
|
||||
- Both final assets are opaque, complete button skins at a 4.492:1 native ratio; preserve DOM labels, icons, events, and agreement behaviour.
|
||||
- Do not use CSS, SVG, or four independently placed corner images to render the final visible border or ornament.
|
||||
- Work directly in the current checkout. Do not commit, push, or upload Git changes; the user will do that.
|
||||
- Change only A01 assets, its page, focused audits, and the affected asset ledger/record.
|
||||
|
||||
---
|
||||
|
||||
### Task 1: Define the complete-button contracts
|
||||
|
||||
**Files:**
|
||||
- Modify: `tests/a01-asset-alpha-audit.ps1`
|
||||
- Modify: `tests/a01-a02-ui-contract.ps1`
|
||||
|
||||
**Interfaces:** Produces assertions for `a01-primary-button.png`, `a01-secondary-button.png`, and a single `.entry-button__skin` image per A01 button.
|
||||
|
||||
- [x] Add a `$buttons` list containing the two final assets. For each, load the bitmap, require fully opaque four corners, require an aspect ratio within `0.01` of `4.492`, and output a pass message. Do not add these assets to the transparent-icon loop.
|
||||
- [x] Require `a01-primary-button.png`, `a01-secondary-button.png`, and `entry-button__skin`; reject `auth-button-corner.png`, `button-corner-asset`, `.entry-button::after`, and the button CSS `background`/`border` construction.
|
||||
- [x] Verify RED with `powershell -ExecutionPolicy Bypass -File tests\a01-asset-alpha-audit.ps1` and `powershell -ExecutionPolicy Bypass -File tests\a01-a02-ui-contract.ps1`. Both failed because the final assets and page structure did not exist.
|
||||
|
||||
### Task 2: Generate and audit complete opaque button skins
|
||||
|
||||
**Files:**
|
||||
- Create: `static/assets/foundation/opaque/a01-primary-button.png`
|
||||
- Create: `static/assets/foundation/opaque/a01-secondary-button.png`
|
||||
|
||||
**Interfaces:** Each asset is a complete opaque PNG skin at 4.492:1. Primary uses muted cinnabar with antique-gold double rules and compact symmetrical corner curls; secondary uses warm rice paper with antique-gold double rules and matching curls. Neither contains copy, icons, a screenshot crop, watermark, or transparency.
|
||||
|
||||
- [x] Generate one source for each skin from the approved A01 visual reference. The sources contain no Chinese text, icon, shadow, or external background in the final crop.
|
||||
- [x] Crop only the generated source's own button surface. The central paper/vermillion field and vertical side rules were extended without scaling the corner artwork; both skins are within `0.01` of `4.492` and contain no cropped A01 reference pixels.
|
||||
- [x] Verify asset GREEN with `powershell -ExecutionPolicy Bypass -File tests\a01-asset-alpha-audit.ps1`; all transparent-asset checks and both opaque-button checks pass.
|
||||
|
||||
### Task 3: Replace the A01 temporary construction and document ownership
|
||||
|
||||
**Files:**
|
||||
- Modify: `pages/auth/a01-entry.vue`
|
||||
- Modify: `docs/design/P00_页面结构与资产清单.md`
|
||||
- Modify: `docs/交接记录.md`
|
||||
|
||||
**Interfaces:** `openLogin`, `prepareWechatLogin`, `prepareRegister`, `prepareAgreement`, and `toggleAgreement` remain unchanged. Each `.entry-button` contains one `.entry-button__skin` image below `.entry-button__content`.
|
||||
|
||||
- [x] Delete the eight `button-corner-asset` images and their CSS. Add the primary/secondary `.entry-button__skin` image as the visual layer inside each button. Remove button borders, pseudo-element inner borders, and button CSS backgrounds; keep dimensions, text, icons, event handlers, and `entry-button__content` stacking unchanged.
|
||||
- [x] Replace the two unapproved candidate rows in P00 with the two final opaque assets, their actual dimensions, A01 ownership, page reference, and retained status. Update the handoff record to say that the candidates were replaced locally and that runtime screenshot regression remains pending.
|
||||
- [x] Verify page GREEN with `powershell -ExecutionPolicy Bypass -File tests\a01-a02-ui-contract.ps1`, `powershell -ExecutionPolicy Bypass -File tests\a01-asset-alpha-audit.ps1`, `powershell -ExecutionPolicy Bypass -File tests\a01-design-record-audit.ps1`, `powershell -ExecutionPolicy Bypass -File tests\compile-audit.ps1`, and `git diff --check`. Every command exits `0`.
|
||||
|
||||
### Task 4: Complete local verification
|
||||
|
||||
**Files:** None unless a focused audit exposes a defect.
|
||||
|
||||
- [x] Run `Get-ChildItem -LiteralPath tests -Filter *.ps1 | Sort-Object Name | ForEach-Object { & powershell -ExecutionPolicy Bypass -File $_.FullName; if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } }` and `git diff --check`. All scripts pass and diff check exits `0`.
|
||||
- [ ] The user captures unchecked A01 screenshots at `412 × 915` and `320 × 568` in HBuilderX/Android. Do not mark visual acceptance complete until those screenshots confirm the button borders, text placement, and small-screen agreement row.
|
||||
@@ -1,260 +0,0 @@
|
||||
# A-01 启动 / 登录引导设计证据执行计划
|
||||
|
||||
> 已失效:本计划基于“四个独立按钮”入口结构。当前方案改为“登录 + 微信登录 + 文字注册入口”,不得继续执行;待设计记录复核后另写新计划。
|
||||
|
||||
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to execute this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
|
||||
|
||||
**Goal:** 完成 A-01 的可归档效果稿、固定栅格、状态设计、本地 PNG 资产和小屏验收;不实现任何 uni-app 页面或接口。
|
||||
|
||||
**Architecture:** `docs/design/A01_启动登录引导_设计记录.md` 是唯一需求所有者。整页效果稿只作为美术锚点,真实背景和图标分别存入 `static/assets/backgrounds/` 与 `static/assets/icons/`,并由 PowerShell 审计脚本验证归档、文件存在和透明 PNG 条件。
|
||||
|
||||
**Tech Stack:** Markdown、PNG/JPG 静态资产、PowerShell 5.1 审计、HBuilderX Web 浏览器预览。
|
||||
|
||||
## Global Constraints
|
||||
|
||||
- 只做 Android `uni-app` 的页面设计;不改 Vue 页面、接口、真实登录、打包或依赖。
|
||||
- A-01 的唯一需求所有者是 `docs/design/A01_启动登录引导_设计记录.md`;本计划不可重定义页面规则。
|
||||
- 账号密码、手机验证码、微信、注册账号四个入口顺序固定;协议默认不勾选,禁止“登录即同意”。
|
||||
- 登录欢迎页使用独立的红头/宣纸欢迎背景,不复用 G-01 的列表页大山水背景。
|
||||
- 所有功能图标必须为项目内 `96 × 96px` RGBA 透明 PNG;微信标志必须为本地官方或许可的原色透明 PNG,并记录来源。
|
||||
- 每个视觉产物先归档到项目并写入设计记录,再展示或进入下一关;全页效果稿不能代替真实图标资产或小屏验收。
|
||||
|
||||
---
|
||||
|
||||
### Task 1: 建立 A-01 设计归档关口
|
||||
|
||||
**Files:**
|
||||
- Create: `tests/a01-design-record-audit.ps1`
|
||||
- Modify: `docs/design/A01_启动登录引导_设计记录.md`
|
||||
- Test: `tests/a01-design-record-audit.ps1`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: `docs/design/A01_启动登录引导_设计记录.md`、`docs/design/assets/a01-vnext/source/A01-layered-source-v1.psd`
|
||||
- Produces: Exit code `0` only when设计记录包含四个入口、显式协议规则与 v2 效果稿归档路径。
|
||||
|
||||
- [ ] **Step 1: 写入会失败的归档审计脚本**
|
||||
|
||||
```powershell
|
||||
function ConvertFrom-Utf8Base64 {
|
||||
param([string]$Value)
|
||||
return [Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($Value))
|
||||
}
|
||||
|
||||
$recordPath = ConvertFrom-Utf8Base64 'ZG9jcy9kZXNpZ24vQTAxX+WQr+WKqOeZu+W9leW8leWvvF/orr7orqHorrDlvZUubWQ='
|
||||
$effect = ConvertFrom-Utf8Base64 'ZG9jcy9kZXNpZ24vc2NyZWVucy9BMDEt5ZCv5Yqo55m75b2V5byV5a+8LeaViOaenOeovy12Mi3ni6znq4vms6jlhowucG5n'
|
||||
$record = Get-Content -LiteralPath $recordPath -Raw -Encoding utf8
|
||||
$rules = @(
|
||||
(ConvertFrom-Utf8Base64 '6LSm5Y+35a+G56CB55m75b2V'),
|
||||
(ConvertFrom-Utf8Base64 '5omL5py66aqM6K+B56CB55m75b2V'),
|
||||
(ConvertFrom-Utf8Base64 '5b6u5L+h55m75b2V'),
|
||||
(ConvertFrom-Utf8Base64 '5rOo5YaM6LSm5Y+3'),
|
||||
(ConvertFrom-Utf8Base64 '5Yid5aeL5pyq5Yu+6YCJ')
|
||||
)
|
||||
|
||||
foreach ($rule in $rules) {
|
||||
if ($record -notmatch [regex]::Escape($rule)) {
|
||||
throw "Missing A01 rule: $rule"
|
||||
}
|
||||
}
|
||||
|
||||
if (-not (Test-Path -LiteralPath $effect)) {
|
||||
throw "Missing archived A01 effect: $effect"
|
||||
}
|
||||
|
||||
Write-Output 'A01-DESIGN-RECORD-AUDIT PASS'
|
||||
```
|
||||
|
||||
- [ ] **Step 2: 运行审计并确认因 v2 效果稿不存在而失败**
|
||||
|
||||
Run: `powershell -ExecutionPolicy Bypass -File tests\a01-design-record-audit.ps1`
|
||||
Expected: `Missing archived A01 effect`。
|
||||
|
||||
- [ ] **Step 3: 将 v2 效果稿路径写入设计记录的已归档美术锚点章节**
|
||||
|
||||
```markdown
|
||||
- 早期效果稿 v2 已转入项目外历史归档;当前使用分层 PSD 与 412×915 栅格证据确认完整层级。
|
||||
```
|
||||
|
||||
- [ ] **Step 4: 暂不运行通过态审计**
|
||||
|
||||
Run: 不运行;通过态必须在 Task 2 的图稿实际归档后执行。
|
||||
|
||||
### Task 2: 生成并归档 A-01 效果稿 v2
|
||||
|
||||
**Files:**
|
||||
- Keep: `docs/design/assets/a01-vnext/source/A01-layered-source-v1.psd`
|
||||
- Modify: `docs/design/A01_启动登录引导_设计记录.md`
|
||||
- Test: `tests/a01-design-record-audit.ps1`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: v1 美术锚点、A-01 四入口结构、D1 的独立登录欢迎背景规则。
|
||||
- Produces: 仅作为美术锚点的 v2 PNG;不作为 UI 背景或图标来源。
|
||||
|
||||
- [ ] **Step 1: 生成竖屏 A-01 效果稿**
|
||||
|
||||
生成条件:朱砂祠堂红头与金色“谱”牌居中;暖宣纸主体;标题“家谱”和副句;四个纵向单行按钮,第一项朱砂实心,其余三项纸白古金描边;第四项文字为“注册账号”;底部为未勾选协议;淡墨建筑与竹影只作低对比背景,不遮挡文字。
|
||||
|
||||
- [ ] **Step 2: 先将生成文件保存为精确路径,再更新设计记录**
|
||||
|
||||
Run: `Get-Item -LiteralPath 'docs\design\assets\a01-vnext\source\A01-layered-source-v1.psd' | Select-Object Name,Length`
|
||||
Expected: 文件存在且 `Length` 大于 `0`。
|
||||
|
||||
- [ ] **Step 3: 运行归档审计并确认通过**
|
||||
|
||||
Run: `powershell -ExecutionPolicy Bypass -File tests\a01-design-record-audit.ps1`
|
||||
Expected: `A01-DESIGN-RECORD-AUDIT PASS`。
|
||||
|
||||
- [ ] **Step 4: 人工比对 v2 与 A-01 记录**
|
||||
|
||||
检查:四个入口顺序正确;注册按钮独立且不换行;协议未勾选;没有“登录即同意”;没有把 G-01 底部山水直接复制为登录背景。
|
||||
|
||||
### Task 3: 固定 Android 栅格与状态说明
|
||||
|
||||
**Files:**
|
||||
- Modify: `docs/design/A01_启动登录引导_设计记录.md`
|
||||
- Test: `tests/a01-design-record-audit.ps1`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: D1 的 `750rpx` 基准、`32rpx` 安全边距、正文最小 `24rpx`、主按钮最小 `88rpx`。
|
||||
- Produces: A-01 的四种验收尺寸布局表,以及正常态、协议未勾选提示、页面加载三种状态定义。
|
||||
|
||||
- [ ] **Step 1: 先在归档审计脚本中加入栅格和状态断言**
|
||||
|
||||
```powershell
|
||||
$requiredDesignText = @('320 × 568', '360 × 640', '360 × 800', '412 × 915', '协议未勾选提示', '页面加载')
|
||||
foreach ($item in $requiredDesignText) {
|
||||
if ($record -notmatch [regex]::Escape($item)) {
|
||||
throw "缺少 A-01 栅格或状态说明:$item"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 2: 运行审计并确认因新字段未写入而失败**
|
||||
|
||||
Run: `powershell -ExecutionPolicy Bypass -File tests\a01-design-record-audit.ps1`
|
||||
Expected: `缺少 A-01 栅格或状态说明`。
|
||||
|
||||
- [ ] **Step 3: 在设计记录新增固定栅格表和状态表**
|
||||
|
||||
表格必须为 `320 × 568`、`360 × 640`、`360 × 800`、`412 × 915` 分别写明:红头、标题区、四按钮区、协议区、可滚动区域和底部安全边距。状态表必须说明:正常态、协议未勾选提示、页面加载;微信授权的结果页只链接到 A-03,不在 A-01 重复设计。
|
||||
|
||||
- [ ] **Step 4: 运行审计并确认通过**
|
||||
|
||||
Run: `powershell -ExecutionPolicy Bypass -File tests\a01-design-record-audit.ps1`
|
||||
Expected: `A01-DESIGN-RECORD-AUDIT PASS`。
|
||||
|
||||
### Task 4: 生成并验收本地背景与功能 PNG 资产
|
||||
|
||||
**Files:**
|
||||
- Create: `static/assets/backgrounds/auth-welcome-hall-v1.png`
|
||||
- Create: `static/assets/backgrounds/auth-welcome-paper-v1.jpg`
|
||||
- Create: `static/assets/backgrounds/auth-welcome-ink-side-v1.png`
|
||||
- Create: `static/assets/icons/auth/account-login-v1.png`
|
||||
- Create: `static/assets/icons/auth/phone-code-login-v1.png`
|
||||
- Create: `static/assets/icons/auth/register-v1.png`
|
||||
- Create: `static/assets/icons/brand/wechat-login-v1.png`
|
||||
- Modify: `docs/design/A01_启动登录引导_设计记录.md`
|
||||
- Test: `tests/a01-design-record-audit.ps1`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: D1 背景和 PNG 规则。
|
||||
- Produces: 可由后续 A-01 页面本地引用的独立背景和图标,及其来源/Alpha 验收清单。
|
||||
|
||||
- [ ] **Step 1: 将资产存在、尺寸和透明角检查加入审计脚本**
|
||||
|
||||
```powershell
|
||||
$pngAssets = @(
|
||||
'static/assets/backgrounds/auth-welcome-hall-v1.png',
|
||||
'static/assets/backgrounds/auth-welcome-ink-side-v1.png',
|
||||
'static/assets/icons/auth/account-login-v1.png',
|
||||
'static/assets/icons/auth/phone-code-login-v1.png',
|
||||
'static/assets/icons/auth/register-v1.png',
|
||||
'static/assets/icons/brand/wechat-login-v1.png'
|
||||
)
|
||||
foreach ($asset in $pngAssets) {
|
||||
if (-not (Test-Path -LiteralPath $asset)) { throw "缺少 A-01 PNG:$asset" }
|
||||
}
|
||||
if (-not (Test-Path -LiteralPath 'static/assets/backgrounds/auth-welcome-paper-v1.jpg')) {
|
||||
throw '缺少 A-01 宣纸背景:auth-welcome-paper-v1.jpg'
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 2: 运行审计并确认因资产不存在而失败**
|
||||
|
||||
Run: `powershell -ExecutionPolicy Bypass -File tests\a01-design-record-audit.ps1`
|
||||
Expected: `缺少 A-01 PNG` 或 `缺少 A-01 宣纸背景`。
|
||||
|
||||
- [ ] **Step 3: 创建独立背景与图标资产,并在设计记录登记用途和来源**
|
||||
|
||||
规则:自定义背景及账号/手机/注册图标单独生成;微信图标从官方或许可来源获取,不改色、不从截图裁切;账号/手机/注册图标导出 `96 × 96px` RGBA PNG,微信图标保留原色透明背景;设计记录逐项记录路径、用途、来源和透明角检查结果。
|
||||
|
||||
- [ ] **Step 4: 扩展审计脚本,检查四个登录入口图标为 `96 × 96px` RGBA 且四角 Alpha 为 0**
|
||||
|
||||
```powershell
|
||||
Add-Type -AssemblyName System.Drawing
|
||||
$iconPaths = @(
|
||||
'static/assets/icons/auth/account-login-v1.png',
|
||||
'static/assets/icons/auth/phone-code-login-v1.png',
|
||||
'static/assets/icons/auth/register-v1.png',
|
||||
'static/assets/icons/brand/wechat-login-v1.png'
|
||||
)
|
||||
foreach ($iconPath in $iconPaths) {
|
||||
$bitmap = [System.Drawing.Bitmap]::FromFile((Resolve-Path -LiteralPath $iconPath))
|
||||
try {
|
||||
if ($bitmap.Width -ne 96 -or $bitmap.Height -ne 96) { throw "图标尺寸不符:$iconPath" }
|
||||
foreach ($point in @(@(0,0), @(95,0), @(0,95), @(95,95))) {
|
||||
if ($bitmap.GetPixel($point[0], $point[1]).A -ne 0) { throw "图标透明角不符:$iconPath" }
|
||||
}
|
||||
} finally { $bitmap.Dispose() }
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 5: 运行完整审计并确认通过**
|
||||
|
||||
Run: `powershell -ExecutionPolicy Bypass -File tests\a01-design-record-audit.ps1`
|
||||
Expected: `A01-DESIGN-RECORD-AUDIT PASS`。
|
||||
|
||||
### Task 5: 小屏视觉验收与正式状态更新
|
||||
|
||||
**Files:**
|
||||
- Modify: `docs/design/A01_启动登录引导_设计记录.md`
|
||||
- Modify: `docs/规划.md`
|
||||
- Modify: `docs/交接记录.md`
|
||||
- Test: `tests/a01-design-record-audit.ps1`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: 已归档 v2、已验收资产、A-01 栅格和状态记录。
|
||||
- Produces: A-01 的设计完成结论;下一页才可解除冻结并开始设计。
|
||||
|
||||
- [ ] **Step 1: 将四个预览尺寸和无底部遮挡检查加入审计脚本**
|
||||
|
||||
```powershell
|
||||
$evidenceLabels = @('320 × 568', '360 × 640', '360 × 800', '412 × 915', '无重叠', '无裁切', '无底部遮挡')
|
||||
foreach ($label in $evidenceLabels) {
|
||||
if ($record -notmatch [regex]::Escape($label)) {
|
||||
throw "缺少 A-01 验收证据:$label"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 2: 在 HBuilderX Web 浏览器中逐一预览四种尺寸,并记录截图结论**
|
||||
|
||||
验收条件:四个按钮均可见且文字不换行;协议行可到达、默认未选且不被系统导航遮挡;背景不压住文字;点击区不小于 `88rpx`;没有远程图标或 CSS 图形替代。
|
||||
|
||||
- [ ] **Step 3: 在设计记录写入截图来源、尺寸、正常/协议未勾选提示状态和结论**
|
||||
|
||||
记录必须明确区分 HBuilderX Web 浏览器预览与未来 Android 原生包验证;不得把后者写成已完成。
|
||||
|
||||
- [ ] **Step 4: 运行完整审计并确认通过**
|
||||
|
||||
Run: `powershell -ExecutionPolicy Bypass -File tests\a01-design-record-audit.ps1`
|
||||
Expected: `A01-DESIGN-RECORD-AUDIT PASS`。
|
||||
|
||||
- [ ] **Step 5: 更新总规划和交接记录,然后提交**
|
||||
|
||||
```powershell
|
||||
git add -- tests/a01-design-record-audit.ps1 docs/design/A01_启动登录引导_设计记录.md docs/design/assets/a01-vnext/source/A01-layered-source-v1.psd static/assets/backgrounds/auth-welcome-hall-v1.png static/assets/backgrounds/auth-welcome-paper-v1.jpg static/assets/backgrounds/auth-welcome-ink-side-v1.png static/assets/icons/auth/account-login-v1.png static/assets/icons/auth/phone-code-login-v1.png static/assets/icons/auth/register-v1.png static/assets/icons/brand/wechat-login-v1.png docs/规划.md docs/交接记录.md
|
||||
git commit -m "docs: complete A01 login guide design"
|
||||
```
|
||||
|
||||
Expected: 仅 A-01 设计证据、资产与状态记录进入提交;不包含 Vue 页面、接口或构建缓存。
|
||||
@@ -1,322 +0,0 @@
|
||||
# A-01 启动/登录引导页 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:** 新增不接接口的 A-01 登录方式选择页,以账号密码为主入口,并要求用户主动勾选协议后才允许进入已设计完成的下一页。
|
||||
|
||||
**Architecture:** A-01 使用独立的 `pages/auth/entry.vue`,不改动现有 `pages/auth/login.vue` 的临时密码登录骨架,避免破坏现有核心流程合同。页面状态只包含 `consented` 和点击守卫;视觉由现有本地纸纹、朱砂红头、祠堂线描与山水资产组合,微信图标以本地透明 PNG 引入。A-02/A-03 的最终跳转仅在两页都完成设计并注册路由后接通。
|
||||
|
||||
**Tech Stack:** uni-app、Vue 3 `<script setup>`、SCSS、PowerShell 静态合同测试、本地 PNG/JPG 资产。
|
||||
|
||||
## Global Constraints
|
||||
|
||||
- 仅 Android 手机端视觉和本地交互;不调用 `appApi`、不接真实微信授权、短信服务或后端接口。
|
||||
- A-01 只能有账号密码、手机号验证码、微信三个入口;不得出现注册、忘记密码、输入框、底部 Tab 或“登录即表示同意”。
|
||||
- 协议默认未勾选;未勾选点击任一登录入口必须阻止跳转并提示;协议文字分别可点击。
|
||||
- 账号密码是唯一朱砂实底主按钮;手机号验证码、微信为同层纸白古金描边按钮;微信标识不可改色。
|
||||
- 只使用项目本地资产;第三方品牌 PNG 必须写入 D1 的来源、用途、路径与透明角检查记录。
|
||||
- 页面视觉先于接口;在 A-02、A-03 设计与路由完成前,不得把 A-01 接到临时或错误的登录页。
|
||||
|
||||
## Execution Gate
|
||||
|
||||
本计划的视觉与协议部分可以在 A-01 实施时执行;**实际 `navigateTo` 跳转必须等 A-02、A-03 的页面设计获批、对应路由存在后再执行**。这是《规划.md》“页面全部设计后再处理接口/跨页联动”的硬约束,而不是兼容分支。
|
||||
|
||||
---
|
||||
|
||||
### Task 1: 先建立 A-01 静态合同测试
|
||||
|
||||
**Files:**
|
||||
- Create: `tests/a01-login-guide-contract.ps1`
|
||||
- Modify: none
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: `pages.json`、未来的 `pages/auth/entry.vue`、`docs/design/D1_安卓视觉规范与页面壳.md`
|
||||
- Produces: `tests/a01-login-guide-contract.ps1`,输出 `PASS A-01 login guide contract`
|
||||
|
||||
- [ ] **Step 1: 写入先失败的合同测试**
|
||||
|
||||
```powershell
|
||||
$ErrorActionPreference = 'Stop'
|
||||
$root = Split-Path -Parent $PSScriptRoot
|
||||
$pages = Get-Content -Raw -Encoding UTF8 (Join-Path $root 'pages.json') | ConvertFrom-Json
|
||||
$paths = @($pages.pages | ForEach-Object { $_.path })
|
||||
|
||||
if ($paths[0] -ne 'pages/auth/entry') { throw 'A-01 is not the application entry route.' }
|
||||
if ('pages/auth/entry' -notin $paths) { throw 'Missing A-01 route.' }
|
||||
|
||||
$entry = Get-Content -Raw -Encoding UTF8 (Join-Path $root 'pages/auth/entry.vue')
|
||||
foreach ($copy in @('账号密码登录', '手机号验证码登录', '微信登录', '我已阅读并同意《用户协议》与《隐私政策》')) {
|
||||
if (-not $entry.Contains($copy)) { throw "Missing A-01 copy: $copy" }
|
||||
}
|
||||
foreach ($forbidden in @('登录即表示同意', '注册账号', '忘记密码', 'appApi', 'calcMD5', '<input')) {
|
||||
if ($entry.Contains($forbidden)) { throw "Forbidden A-01 content: $forbidden" }
|
||||
}
|
||||
if ($entry -notmatch 'const consented = ref\(false\)') { throw 'A-01 consent must default to false.' }
|
||||
if ($entry -notmatch 'if \(!consented\.value\)') { throw 'A-01 does not block unchecked login.' }
|
||||
if ($entry -notmatch '请先阅读并同意相关协议') { throw 'A-01 has no unchecked-consent prompt.' }
|
||||
foreach ($asset in @('header-cinnabar-texture-v2.jpg', 'header-hall-lineart.png', 'paper-rice-texture-v2.jpg', 'footer-mountain-bamboo.png', 'wechat-login.png')) {
|
||||
if (-not $entry.Contains($asset)) { throw "A-01 does not consume required asset: $asset" }
|
||||
}
|
||||
|
||||
$d1 = Get-Content -Raw -Encoding UTF8 (Join-Path $root 'docs/design/D1_安卓视觉规范与页面壳.md')
|
||||
foreach ($token in @('wechat-login.png', 'A-01')) {
|
||||
if (-not $d1.Contains($token)) { throw "D1 brand-asset record is missing: $token" }
|
||||
}
|
||||
|
||||
Write-Output 'PASS A-01 login guide contract'
|
||||
```
|
||||
|
||||
- [ ] **Step 2: 运行测试,确认当前因路由与页面缺失而失败**
|
||||
|
||||
Run: `powershell -ExecutionPolicy Bypass -File tests\a01-login-guide-contract.ps1`
|
||||
Expected: FAIL with `A-01 is not the application entry route.` or missing `pages/auth/entry.vue`.
|
||||
|
||||
- [ ] **Step 3: 提交测试合同**
|
||||
|
||||
```powershell
|
||||
git add tests/a01-login-guide-contract.ps1
|
||||
git commit -m "test: define A01 login guide contract"
|
||||
```
|
||||
|
||||
### Task 2: 准备并登记 A-01 本地资产
|
||||
|
||||
**Files:**
|
||||
- Create: `static/assets/icons/brand/wechat-login.png`
|
||||
- Modify: `docs/design/D1_安卓视觉规范与页面壳.md`
|
||||
- Test: `tests/a01-login-guide-contract.ps1`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: D1 的第三方品牌资产规则与现有 `static/assets/backgrounds/header-cinnabar-texture-v2.jpg`、`header-hall-lineart.png`、`paper-rice-texture-v2.jpg`、`footer-mountain-bamboo.png`
|
||||
- Produces: `wechat-login.png`(RGBA 透明 PNG)及 D1 中唯一的品牌资产记录
|
||||
|
||||
- [ ] **Step 1: 取得微信官方或许可渠道的透明 PNG,并保存为 `static/assets/icons/brand/wechat-login.png`**
|
||||
|
||||
资产要求:图形为官方绿色微信标识;无文字、无白底、无阴影;四角透明;实际显示 `44rpx` 时清晰。不得从用户截图、整页效果图或生成图裁切。
|
||||
|
||||
- [ ] **Step 2: 在 D1 的第三方品牌资产记录中追加唯一一行**
|
||||
|
||||
使用 Step 1 实际下载的页面 URL 写入来源栏,并在同一行写明“RGBA,四角透明”。下载页没有可验证的授权或使用说明时,停止本任务,不得改用截图、生成图或未知来源图标。
|
||||
|
||||
- [ ] **Step 3: 运行透明角检查**
|
||||
|
||||
```powershell
|
||||
Add-Type -AssemblyName System.Drawing
|
||||
$image = [System.Drawing.Bitmap]::new('static/assets/icons/brand/wechat-login.png')
|
||||
try {
|
||||
if (-not [System.Drawing.Image]::IsAlphaPixelFormat($image.PixelFormat)) { throw 'WeChat icon has no alpha channel.' }
|
||||
if ($image.GetPixel(0, 0).A -ne 0) { throw 'WeChat icon top-left corner is not transparent.' }
|
||||
if ($image.Width -lt 48 -or $image.Height -lt 48) { throw 'WeChat icon is too small for mobile display.' }
|
||||
Write-Output 'PASS WeChat login asset alpha audit'
|
||||
} finally {
|
||||
$image.Dispose()
|
||||
}
|
||||
```
|
||||
|
||||
Expected: `PASS WeChat login asset alpha audit`.
|
||||
|
||||
- [ ] **Step 4: 重跑 A-01 合同,确认它仍仅因页面尚未实现失败**
|
||||
|
||||
Run: `powershell -ExecutionPolicy Bypass -File tests\a01-login-guide-contract.ps1`
|
||||
Expected: FAIL with missing A-01 route or page; it must not report a missing brand-asset record.
|
||||
|
||||
- [ ] **Step 5: 提交资产与 D1 记录**
|
||||
|
||||
```powershell
|
||||
git add static/assets/icons/brand/wechat-login.png docs/design/D1_安卓视觉规范与页面壳.md
|
||||
git commit -m "assets: add local WeChat login mark"
|
||||
```
|
||||
|
||||
### Task 3: 实现 A-01 独立欢迎页与协议显式同意
|
||||
|
||||
**Files:**
|
||||
- Create: `pages/auth/entry.vue`
|
||||
- Modify: `pages.json`
|
||||
- Test: `tests/a01-login-guide-contract.ps1`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: Task 2 的 `wechat-login.png`,现有朱砂红头、祠堂线描、纸纹、山水资产
|
||||
- Produces: `pages/auth/entry.vue`,其状态名固定为 `consented`,点击守卫固定为 `enterLogin`
|
||||
|
||||
- [ ] **Step 1: 在 `pages.json` 的第一项新增 A-01 路由**
|
||||
|
||||
```json
|
||||
{
|
||||
"path": "pages/auth/entry",
|
||||
"style": { "navigationStyle": "custom", "enablePullDownRefresh": false }
|
||||
}
|
||||
```
|
||||
|
||||
保留现有 `pages/auth/login` 路由与其顺序关系,不删除或重命名现有页面。
|
||||
|
||||
- [ ] **Step 2: 创建 `pages/auth/entry.vue` 的状态与协议守卫**
|
||||
|
||||
```vue
|
||||
<script setup>
|
||||
import { ref } from 'vue'
|
||||
|
||||
const consented = ref(false)
|
||||
|
||||
const toggleConsent = () => {
|
||||
consented.value = !consented.value
|
||||
}
|
||||
|
||||
const openAgreement = (name) => {
|
||||
uni.showToast({ title: `${name}将在协议页开放`, icon: 'none' })
|
||||
}
|
||||
|
||||
const enterLogin = (entry) => {
|
||||
if (!consented.value) {
|
||||
uni.showToast({ title: '请先阅读并同意相关协议', icon: 'none' })
|
||||
return
|
||||
}
|
||||
|
||||
uni.showToast({ title: `${entry}入口已确认`, icon: 'none' })
|
||||
}
|
||||
</script>
|
||||
```
|
||||
|
||||
本任务阶段不得引入 `appApi`、`calcMD5`、真实登录、真实微信授权或不存在的 A-02/A-03 路由;跨页跳转在 Task 5 的执行门槛满足后替换。
|
||||
|
||||
- [ ] **Step 3: 写入页面主体,保持三种入口与显式复选框**
|
||||
|
||||
```vue
|
||||
<template>
|
||||
<view class="auth-entry-page">
|
||||
<view class="auth-hero"><image class="auth-hall" src="/static/assets/backgrounds/header-hall-lineart.png" mode="aspectFit" /><image class="auth-seal" src="/static/assets/icons/brand/jiapu-seal-logo.png" mode="aspectFit" /></view>
|
||||
<view class="auth-paper">
|
||||
<image class="auth-side-ink" src="/static/assets/backgrounds/footer-mountain-bamboo.png" mode="aspectFit" />
|
||||
<view class="auth-title"><text>家谱</text><text>为家族留存可传承的记忆</text></view>
|
||||
<view class="auth-actions">
|
||||
<button class="auth-button auth-button--primary" @click="enterLogin('账号密码登录')">账号密码登录</button>
|
||||
<button class="auth-button" @click="enterLogin('手机号验证码登录')">手机号验证码登录</button>
|
||||
<button class="auth-button" @click="enterLogin('微信登录')"><image src="/static/assets/icons/brand/wechat-login.png" mode="aspectFit" />微信登录</button>
|
||||
</view>
|
||||
<view class="auth-consent" @click="toggleConsent"><view class="auth-checkbox" :class="{ 'auth-checkbox--checked': consented }" /><text>我已阅读并同意</text><text class="auth-link" @click.stop="openAgreement('用户协议')">《用户协议》</text><text>与</text><text class="auth-link" @click.stop="openAgreement('隐私政策')">《隐私政策》</text></view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
```
|
||||
|
||||
- [ ] **Step 4: 完成最小 SCSS 外观**
|
||||
|
||||
要求:用 `background-image` 组合 `header-cinnabar-texture-v2.jpg`、`paper-rice-texture-v2.jpg`;红头可见祠堂线描;纸面底部可见但低对比的 `footer-mountain-bamboo.png`;按钮高度至少 `88rpx`;不使用 CSS Grid、`gap`、`clip-path`、滤镜或外部 URL。协议区域不得使用“登录即表示同意”文案,未选中复选框只显示古金圆圈,选中后显示朱砂对勾。
|
||||
|
||||
- [ ] **Step 5: 运行合同测试,确认通过**
|
||||
|
||||
Run: `powershell -ExecutionPolicy Bypass -File tests\a01-login-guide-contract.ps1`
|
||||
Expected: `PASS A-01 login guide contract`.
|
||||
|
||||
- [ ] **Step 6: 做一次静态构建健康检查**
|
||||
|
||||
Run: `powershell -ExecutionPolicy Bypass -File tests\compile-audit.ps1`
|
||||
Expected: `PASS compile audit`.
|
||||
|
||||
- [ ] **Step 7: 提交独立 A-01 页面**
|
||||
|
||||
```powershell
|
||||
git add pages/auth/entry.vue pages.json tests/a01-login-guide-contract.ps1
|
||||
git commit -m "feat: add A01 login guide"
|
||||
```
|
||||
|
||||
### Task 4: 视觉验收与设计状态记录
|
||||
|
||||
**Files:**
|
||||
- Modify: `docs/规划.md`
|
||||
- Test: `tests/a01-login-guide-contract.ps1`, HBuilderX Android 小屏预览
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: Task 3 完成的页面与合同
|
||||
- Produces: D2 阶段下 A-01 的真实设计状态
|
||||
|
||||
- [ ] **Step 1: 在 HBuilderX 中预览 `pages/auth/entry` 的 `360 × 800dp` 画面**
|
||||
|
||||
检查:红头、标题、三个按钮和未勾选协议同时可见;账号密码为唯一红色主操作;宣纸与山水不压住协议;没有底部 Tab。
|
||||
|
||||
- [ ] **Step 2: 手动验证两种协议状态**
|
||||
|
||||
1. 初始未勾选,分别点击三个入口,均显示“请先阅读并同意相关协议”,且不跳转。
|
||||
2. 勾选后复选框显示朱砂对勾;三个入口只显示本地确认提示,不请求网络。
|
||||
|
||||
- [ ] **Step 3: 仅在上述视觉和手动检查通过后更新 `docs/规划.md`**
|
||||
|
||||
将 `A-01 启动 / 登录引导页` 改为“视觉完成(已验收)”;D2 保持“进行中”,因为 A-02 至 A-06 尚未完成。
|
||||
|
||||
- [ ] **Step 4: 重跑最终验证**
|
||||
|
||||
Run:
|
||||
|
||||
```powershell
|
||||
powershell -ExecutionPolicy Bypass -File tests\a01-login-guide-contract.ps1
|
||||
powershell -ExecutionPolicy Bypass -File tests\compile-audit.ps1
|
||||
powershell -ExecutionPolicy Bypass -File tests\uni-scss-injection.ps1
|
||||
```
|
||||
|
||||
Expected: 三条命令均输出 `PASS`.
|
||||
|
||||
- [ ] **Step 5: 提交验收记录**
|
||||
|
||||
```powershell
|
||||
git add docs/规划.md
|
||||
git commit -m "docs: mark A01 visual review"
|
||||
```
|
||||
|
||||
### Task 5: D2 跨页设计完成后的路由接通(执行门槛任务)
|
||||
|
||||
**Precondition:** A-02 与 A-03 的设计说明、页面文件和 `pages.json` 路由均已通过各自视觉验收;否则此任务不得开始。
|
||||
|
||||
**Files:**
|
||||
- Modify: `pages/auth/entry.vue`
|
||||
- Test: `tests/a01-login-guide-contract.ps1`(扩展路由断言)
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: A-02 的已验收密码页路由;A-03 的已验收验证码/微信回跳页路由
|
||||
- Produces: `entryRoutes`,键固定为 `password`、`phone`、`wechat`
|
||||
|
||||
- [ ] **Step 1: 扩展合同,要求所有目标路由已在 `pages.json` 注册**
|
||||
|
||||
```powershell
|
||||
foreach ($route in @('pages/auth/password-login', 'pages/auth/phone-login')) {
|
||||
if ($route -notin $paths) { throw "Missing approved auth target route: $route" }
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 2: 将 Task 3 的本地确认提示替换为唯一的目标映射**
|
||||
|
||||
```js
|
||||
const entryRoutes = {
|
||||
password: '/pages/auth/password-login',
|
||||
phone: '/pages/auth/phone-login',
|
||||
wechat: '/pages/auth/phone-login?source=wechat'
|
||||
}
|
||||
|
||||
const enterLogin = (entry) => {
|
||||
if (!consented.value) {
|
||||
uni.showToast({ title: '请先阅读并同意相关协议', icon: 'none' })
|
||||
return
|
||||
}
|
||||
uni.navigateTo({ url: entryRoutes[entry] })
|
||||
}
|
||||
```
|
||||
|
||||
模板调用固定为 `enterLogin('password')`、`enterLogin('phone')`、`enterLogin('wechat')`。不得在 A-01 增加任何接口调用或注册入口。
|
||||
|
||||
- [ ] **Step 3: 运行合同和 A-02/A-03 各自的视觉合同**
|
||||
|
||||
Run: `powershell -ExecutionPolicy Bypass -File tests\a01-login-guide-contract.ps1`
|
||||
Expected: `PASS A-01 login guide contract`.
|
||||
|
||||
- [ ] **Step 4: 提交跨页接通**
|
||||
|
||||
```powershell
|
||||
git add pages/auth/entry.vue tests/a01-login-guide-contract.ps1
|
||||
git commit -m "feat: connect A01 auth routes"
|
||||
```
|
||||
|
||||
## Self-Review
|
||||
|
||||
- **规格覆盖:** Task 1 和 Task 3 覆盖三入口、主次层级、本地资产、无接口和显式协议;Task 4 覆盖小屏视觉与两种协议状态;Task 5 覆盖 A-02/A-03 的跳转契约且被 D2 设计完成门槛锁住。
|
||||
- **占位检查:** 没有未落实的实现步骤。Task 2 的来源 URL 是执行时取得的审计事实;没有可验证来源即停止该任务,不得提交资产。
|
||||
- **命名一致性:** 页面状态固定为 `consented`,守卫固定为 `enterLogin`,跨页唯一映射固定为 `entryRoutes`;Task 1 与 Task 5 的测试和实现使用同一命名。
|
||||
# 已失效历史记录(2026-07-13)
|
||||
|
||||
> 本计划在未完成设计归档与验收前被错误建立,现禁止执行。唯一有效的 A-01 归档为 `docs/design/A01_启动登录引导_设计记录.md`;当前工作仍以 `docs/交接记录.md` 的 G-01 验收为准。
|
||||
@@ -1,150 +0,0 @@
|
||||
# A01 Reference Asset Rebuild 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:** Rebuild A01's visible red header, paper scene, title lockup, divider knots, and button frames from the approved 412 × 915 reference while preserving real DOM interactions.
|
||||
|
||||
**Architecture:** `pages/auth/entry.vue` remains the only interactive owner. Reference-derived raster assets own decorative visual details, while DOM owns button labels, icons, agreement state, and navigation. A small local asset-preparation command reads only the approved source screen, exports composited header/body layers and alpha PNG foreground assets, then leaves no runtime dependency on that command.
|
||||
|
||||
**Tech Stack:** Uni-app Vue 3, scoped SCSS, PowerShell/System.Drawing asset preparation, existing PowerShell contract and alpha audits.
|
||||
|
||||
## Global Constraints
|
||||
|
||||
- Visual truth is `docs/design/screens/A01-启动登录引导-栅格验收-412x915.png` at 412 × 915.
|
||||
- Do not render the whole reference image as page content; header, body scene, title lockup, divider knot, and button frames are distinct assets.
|
||||
- Preserve A01 agreement gating and `'/pages/auth/login?agreed=1'` navigation.
|
||||
- Do not modify `components/GenealogyCard.vue` or `unpackage/dist/cache/.vite/deps/*`.
|
||||
- New v2 frame/title/knot assets must have transparent outer corners; remove A01's unused v1 generated ornaments.
|
||||
|
||||
---
|
||||
|
||||
### Task 1: Encode the v2 reference-asset contract
|
||||
|
||||
**Files:**
|
||||
- Modify: `tests/a01-a02-ui-contract.ps1`
|
||||
- Modify: `tests/a01-asset-alpha-audit.ps1`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: current `pages/auth/entry.vue` and existing v1 A01 assets.
|
||||
- Produces: a failing contract requiring `auth-header-reference-v2.png`, `auth-body-scene-v2.png`, `auth-brand-lockup-v2.png`, `auth-divider-knot-v2.png`, `auth-primary-frame-v2.png`, and `auth-secondary-frame-v2.png`.
|
||||
|
||||
- [ ] **Step 1: Write the failing test**
|
||||
|
||||
Add these required paths to the A01 entry contract:
|
||||
|
||||
```powershell
|
||||
foreach ($asset in @(
|
||||
'auth-header-reference-v2.png', 'auth-body-scene-v2.png',
|
||||
'auth-brand-lockup-v2.png', 'auth-divider-knot-v2.png',
|
||||
'auth-primary-frame-v2.png', 'auth-secondary-frame-v2.png'
|
||||
)) {
|
||||
Assert-Contains -Content $entry -Expected $asset -Message "Missing A01 reference asset: $asset"
|
||||
}
|
||||
Assert-NotContains -Content $entry -Unexpected 'auth-button-corner-v1.png' -Message 'A01 must not retain the rejected generated corner asset'
|
||||
```
|
||||
|
||||
Replace the alpha-audit icon list with the four transparent v2 foreground assets and assert their source dimensions: brand lockup `240 × 110`, divider knot `80 × 48`, primary frame `291 × 65`, secondary frame `291 × 65`. Assert header `412 × 139` and body scene `412 × 776` exist as opaque scene layers.
|
||||
|
||||
- [ ] **Step 2: Run test to verify it fails**
|
||||
|
||||
Run: `powershell -ExecutionPolicy Bypass -File tests\a01-a02-ui-contract.ps1; powershell -ExecutionPolicy Bypass -File tests\a01-asset-alpha-audit.ps1`
|
||||
|
||||
Expected: FAIL because the six `v2` paths are not referenced or do not exist.
|
||||
|
||||
- [ ] **Step 3: Commit the contract only after Task 2 passes**
|
||||
|
||||
Do not commit an intentionally failing contract. It is staged with the asset and page changes in Task 3.
|
||||
|
||||
### Task 2: Prepare exact reference-derived v2 assets
|
||||
|
||||
**Files:**
|
||||
- Create: `static/assets/backgrounds/auth-header-reference-v2.png`
|
||||
- Create: `static/assets/backgrounds/auth-body-scene-v2.png`
|
||||
- Create: `static/assets/icons/auth/auth-brand-lockup-v2.png`
|
||||
- Create: `static/assets/icons/auth/auth-divider-knot-v2.png`
|
||||
- Create: `static/assets/icons/auth/auth-primary-frame-v2.png`
|
||||
- Create: `static/assets/icons/auth/auth-secondary-frame-v2.png`
|
||||
- Delete: `static/assets/icons/auth/auth-button-corner-v1.png`
|
||||
- Delete: `static/assets/icons/auth/auth-divider-knot-v1.png`
|
||||
- Delete: `static/assets/icons/auth/auth-title-cloud-v1.png`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: `docs/design/screens/A01-启动登录引导-栅格验收-412x915.png`.
|
||||
- Produces: fixed-pixel v2 assets used by `entry.vue`; no asset contains a clickable control or agreement copy.
|
||||
|
||||
- [ ] **Step 1: Export the visual layers from the approved source**
|
||||
|
||||
Use System.Drawing to read the 412 × 915 source. Crop rows `0..138` to `auth-header-reference-v2.png`. Crop rows `139..914` to `auth-body-scene-v2.png`, replacing the title, divider, button, register and agreement foreground rectangles with sampled rice-paper pixels before saving. The retained side architecture, bamboo, and lower mountain must stay in their original reference positions.
|
||||
|
||||
- [ ] **Step 2: Export alpha foregrounds**
|
||||
|
||||
Use the same source to create: a `240 × 110` brand lockup (dark title plus both gold clouds), an `80 × 48` divider knot, and two `291 × 65` button frame images. For the foregrounds, make the paper/background pixels transparent, preserve the exact colored ornament pixels, and for each frame clear its center rectangle while retaining the double rule and all four reference corner curls.
|
||||
|
||||
- [ ] **Step 3: Inspect and audit the assets**
|
||||
|
||||
Open the three frame/title/knot PNGs and confirm their outer corners are transparent and their visible artwork has no green matte. Run: `powershell -ExecutionPolicy Bypass -File tests\a01-asset-alpha-audit.ps1`.
|
||||
|
||||
Expected: PASS once the Task 1 audit rules are in place.
|
||||
|
||||
### Task 3: Replace the A01 decorative layer implementation
|
||||
|
||||
**Files:**
|
||||
- Modify: `pages/auth/entry.vue`
|
||||
- Modify: `docs/design/A01_启动登录引导_设计记录.md`
|
||||
- Modify: `design-qa.md`
|
||||
- Modify: `tests/a01-a02-ui-contract.ps1`
|
||||
- Modify: `tests/a01-asset-alpha-audit.ps1`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: all six v2 assets from Task 2.
|
||||
- Produces: reference-derived visuals with unchanged `toggleAgreement`, `openLogin`, `prepareWechatLogin`, `prepareRegister`, and `prepareAgreement` functions.
|
||||
|
||||
- [ ] **Step 1: Update page asset ownership**
|
||||
|
||||
Replace the generated header plus `header-seal` overlay with `auth-header-reference-v2.png`. Replace the current paper/scenery pair with the prepared body scene layer. Replace the text/cloud title group with `auth-brand-lockup-v2.png`; retain its wrapper only for layout. Keep CSS gold rules but replace each v1 divider ornament with `auth-divider-knot-v2.png`.
|
||||
|
||||
For both button types, remove all four `.button-corner-asset` images. Add one absolute `.entry-button__frame` image that uses the matching primary or secondary frame asset. Keep the DOM icon/text group above the frame and preserve existing click handlers.
|
||||
|
||||
- [ ] **Step 2: Update visual calibration values and records**
|
||||
|
||||
Set the lockup and divider image dimensions to their source ratios, keep the validated vertical anchors, and remove stale v1 asset statements from the A01 design record. Update `design-qa.md` to list the latest screenshot as pending visual confirmation rather than passed.
|
||||
|
||||
- [ ] **Step 3: Run the focused tests**
|
||||
|
||||
Run: `powershell -ExecutionPolicy Bypass -File tests\a01-a02-ui-contract.ps1; powershell -ExecutionPolicy Bypass -File tests\a01-asset-alpha-audit.ps1; powershell -ExecutionPolicy Bypass -File tests\a01-design-record-audit.ps1; powershell -ExecutionPolicy Bypass -File tests\compile-audit.ps1`
|
||||
|
||||
Expected: all four scripts print `PASS` with exit code 0.
|
||||
|
||||
- [ ] **Step 4: Run full regression verification**
|
||||
|
||||
Run: `Get-ChildItem -LiteralPath tests -Filter *.ps1 | Sort-Object Name | ForEach-Object { & powershell -ExecutionPolicy Bypass -File $_.FullName; if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } }; git diff --check`
|
||||
|
||||
Expected: every test script passes and `git diff --check` reports no errors.
|
||||
|
||||
- [ ] **Step 5: Commit the reference rebuild**
|
||||
|
||||
```powershell
|
||||
git add -- pages/auth/entry.vue tests/a01-a02-ui-contract.ps1 tests/a01-asset-alpha-audit.ps1 docs/design/A01_启动登录引导_设计记录.md design-qa.md static/assets/backgrounds/auth-header-reference-v2.png static/assets/backgrounds/auth-body-scene-v2.png static/assets/icons/auth/auth-brand-lockup-v2.png static/assets/icons/auth/auth-divider-knot-v2.png static/assets/icons/auth/auth-primary-frame-v2.png static/assets/icons/auth/auth-secondary-frame-v2.png static/assets/icons/auth/auth-button-corner-v1.png static/assets/icons/auth/auth-divider-knot-v1.png static/assets/icons/auth/auth-title-cloud-v1.png
|
||||
git commit -m "fix: rebuild A01 reference visual assets"
|
||||
```
|
||||
|
||||
### Task 4: Obtain runtime evidence
|
||||
|
||||
**Files:**
|
||||
- Modify: `design-qa.md` after receiving user-provided HBuilderX/Android screenshots.
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: rendered unchecked A01 screenshots at 412 × 915 and 320 × 568.
|
||||
- Produces: a visual QA verdict grounded in those screenshots.
|
||||
|
||||
- [ ] **Step 1: Compare the two same-state screenshots**
|
||||
|
||||
At 412 × 915, verify: header bottom gold band and seal, side architecture/bamboo/lower mountain placements, brand lockup scale, both frame corner curls, divider knots, and agreement baseline.
|
||||
|
||||
- [ ] **Step 2: Check narrow-screen safety**
|
||||
|
||||
At 320 × 568, scroll to the agreement row and verify that the checkbox and all copy remain visible above the system navigation area.
|
||||
|
||||
- [ ] **Step 3: Record evidence status**
|
||||
|
||||
Set `design-qa.md` to `final result: passed` only if both screenshots satisfy the checks; otherwise document the remaining pixel difference and keep it pending.
|
||||
@@ -1,273 +0,0 @@
|
||||
# A-01 Runtime Visual Calibration Implementation Plan
|
||||
|
||||
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
|
||||
|
||||
**Goal:** Make the A-01 unchecked entry page's real DOM match the approved 412 x 915 visual reference for its header, title, dividers, buttons, registration entry, and agreement row.
|
||||
|
||||
**Architecture:** `docs/design/A01_启动登录引导_设计记录.md` owns the calibrated A-01 layout contract. `pages/auth/entry.vue` consumes that contract through local scoped styles and named A-01 elements; it retains the existing local interaction handlers. `tests/a01-a02-ui-contract.ps1` guards the layout anchors and blocks the rejected registration side lines and button-corner construction.
|
||||
|
||||
**Tech Stack:** uni-app Vue 3, scoped SCSS, local PNG assets, PowerShell contract scripts.
|
||||
|
||||
## Global Constraints
|
||||
|
||||
- Use `docs/design/screens/A01-启动登录引导-栅格验收-412x915.png` as the sole visual reference for the unchecked state.
|
||||
- Keep real DOM, local-only interaction, the existing route to A-02, and explicit agreement gating.
|
||||
- Do not use the whole reference image as page content, call APIs, modify A-02, or alter the existing authentication backgrounds in this task.
|
||||
- Preserve vertical scrolling and `env(safe-area-inset-bottom)` for 320 x 568.
|
||||
- Use local transparent PNG assets for title cloud imagery; do not use text glyphs or emoji as ornaments.
|
||||
|
||||
---
|
||||
|
||||
### Task 1: Make the A-01 record the sole measured-layout owner and add a red visual contract
|
||||
|
||||
**Files:**
|
||||
- Modify: `docs/design/A01_启动登录引导_设计记录.md:30-33`
|
||||
- Modify: `docs/superpowers/specs/2026-07-13-a01-runtime-visual-calibration-design.md:7-31`
|
||||
- Modify: `docs/superpowers/specs/2026-07-13-a01-a02-static-ui-implementation-design.md:19`
|
||||
- Modify: `tests/a01-a02-ui-contract.ps1:74-87`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: approved `A01-启动登录引导-栅格验收-412x915.png` and the current local route/interaction contract.
|
||||
- Produces: one permanent 750rpx coordinate table and a contract that rejects the old visual construction.
|
||||
|
||||
- [ ] **Step 1: Replace the old prose layout values in the A-01 design record with the calibrated table**
|
||||
|
||||
Replace the current fixed-layout bullets with this table. It is the only owner of these values:
|
||||
|
||||
```markdown
|
||||
| 元素 | 412 × 915 像素基准 | 750rpx 实现基准 |
|
||||
| --- | --- | --- |
|
||||
| 朱砂家祠头图 | 高 139px | 高 253rpx |
|
||||
| 标题区起点 | 红头后约 82px | `padding-top: 150rpx` |
|
||||
| 标题分隔饰线 | 宽约 234px | 宽 426rpx;上、下间距独立 |
|
||||
| 两个按钮 | x=60px,宽约 291px,高约 65px | `margin: 95rpx 110rpx 0`,高 118rpx |
|
||||
| 两按钮间距 | 约 28px | `margin-top: 51rpx` |
|
||||
| 注册入口 | 微信按钮后约 56px;无左右短线 | `margin-top: 98rpx` |
|
||||
| 协议行 | 注册入口后约 70px | `margin-top: 128rpx` 加安全区 |
|
||||
```
|
||||
|
||||
- [ ] **Step 2: Remove the superseded dimensions from the static UI implementation contract**
|
||||
|
||||
In `2026-07-13-a01-runtime-visual-calibration-design.md`, replace its numeric coordinate table with this ownership statement so the design record remains the only permanent coordinate source:
|
||||
|
||||
```markdown
|
||||
## Contract ownership
|
||||
|
||||
`docs/design/A01_启动登录引导_设计记录.md` owns the calibrated 412 × 915 coordinate table and acceptance thresholds. This implementation specification records scope and component strategy only; it does not define duplicate layout values.
|
||||
```
|
||||
|
||||
Then replace the static UI implementation contract's layout sentence with:
|
||||
|
||||
```markdown
|
||||
- A-01 的运行时布局唯一遵循 `docs/design/A01_启动登录引导_设计记录.md` 中的“412 × 915 运行时校准表”;本文件不再重复或定义按钮与间距数值。
|
||||
```
|
||||
|
||||
- [ ] **Step 3: Extend the PowerShell contract before changing the page**
|
||||
|
||||
Add these assertions immediately after the existing A-01 DOM-structure assertions:
|
||||
|
||||
```powershell
|
||||
foreach ($requiredVisualAnchor in @(
|
||||
'brand-divider--top',
|
||||
'brand-divider--bottom',
|
||||
'entry-button--primary',
|
||||
'entry-button--secondary',
|
||||
'height: 253rpx',
|
||||
'padding: 150rpx 56rpx 0',
|
||||
'width: 426rpx',
|
||||
'margin: 95rpx 110rpx 0',
|
||||
'height: 118rpx',
|
||||
'margin-top: 51rpx',
|
||||
'margin-top: 98rpx',
|
||||
'margin-top: 128rpx'
|
||||
)) {
|
||||
Assert-Contains -Content $entry -Expected $requiredVisualAnchor -Message "Missing A-01 calibrated visual anchor: $requiredVisualAnchor"
|
||||
}
|
||||
foreach ($rejectedVisualConstruction in @('link-line', 'button-corner', 'class="auth-button primary-button"')) {
|
||||
Assert-NotContains -Content $entry -Unexpected $rejectedVisualConstruction -Message "A-01 retains rejected visual construction: $rejectedVisualConstruction"
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 4: Run the focused contract to prove it is red**
|
||||
|
||||
Run: `powershell -ExecutionPolicy Bypass -File tests\a01-a02-ui-contract.ps1`
|
||||
|
||||
Expected: failure mentioning `Missing A-01 calibrated visual anchor` or `A-01 retains rejected visual construction`.
|
||||
|
||||
### Task 2: Rebuild A-01's measured DOM layout without changing its interaction contract
|
||||
|
||||
**Files:**
|
||||
- Modify: `pages/auth/entry.vue:11-65,145-324`
|
||||
- Test: `tests/a01-a02-ui-contract.ps1`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: the measured A-01 table from the design record and existing `openLogin`, `prepareWechatLogin`, `prepareRegister`, and `toggleAgreement` handlers.
|
||||
- Produces: `brand-divider--top`, `brand-divider--bottom`, `entry-button--primary`, and `entry-button--secondary` rendered from real DOM.
|
||||
|
||||
- [ ] **Step 1: Replace the entry markup that creates the rejected decorations**
|
||||
|
||||
Keep the existing cloud `image` source, but split the dividers by purpose, remove the registration side lines, remove the four corner views, and use A-01-specific button classes:
|
||||
|
||||
```vue
|
||||
<view class="brand-divider brand-divider--top">
|
||||
<view class="brand-divider__line" />
|
||||
<image class="brand-divider__ornament" src="/static/assets/icons/action/create-cloud-v2.png" mode="aspectFit" />
|
||||
<view class="brand-divider__line" />
|
||||
</view>
|
||||
|
||||
<view class="entry-actions">
|
||||
<view class="entry-button entry-button--primary" hover-class="entry-button--pressed" @click="openLogin">
|
||||
<image class="entry-button__icon" src="/static/assets/icons/auth/login-outline-v1.png" mode="aspectFit" />
|
||||
<text>登录</text>
|
||||
</view>
|
||||
<view class="entry-button entry-button--secondary" hover-class="entry-button--pressed" @click="prepareWechatLogin">
|
||||
<image class="entry-button__icon entry-button__icon--wechat" src="/static/assets/icons/auth/wechat-licensed-v1.png" mode="aspectFit" />
|
||||
<text>微信登录</text>
|
||||
</view>
|
||||
<view class="register-link" hover-class="link-hover" @click="prepareRegister">
|
||||
<text>还没有账号?<text class="register-emphasis">注册账号</text></text>
|
||||
</view>
|
||||
</view>
|
||||
```
|
||||
|
||||
Render the second divider after `brand-subtitle` with the same child structure and class `brand-divider--bottom`.
|
||||
|
||||
- [ ] **Step 2: Replace the old generic layout selectors with these calibrated scoped rules**
|
||||
|
||||
Keep the existing background and script blocks unchanged. Replace `.auth-header` through `.link-hover` with the following A-01 rules:
|
||||
|
||||
```scss
|
||||
.auth-header { position: relative; height: 253rpx; overflow: hidden; }
|
||||
|
||||
.brand-intro {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
padding: 150rpx 56rpx 0;
|
||||
color: #3f2c1d;
|
||||
}
|
||||
|
||||
.brand-divider {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 426rpx;
|
||||
}
|
||||
.brand-divider--top { margin: 47rpx 0 21rpx; }
|
||||
.brand-divider--bottom { margin: 34rpx 0 30rpx; }
|
||||
.brand-divider__line { flex: 1; height: 1rpx; background: #d5a34f; }
|
||||
.brand-divider__ornament { width: 44rpx; height: 24rpx; margin: 0 14rpx; }
|
||||
|
||||
.entry-actions { margin: 95rpx 110rpx 0; }
|
||||
.entry-button {
|
||||
position: relative;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
box-sizing: border-box;
|
||||
width: 100%;
|
||||
height: 118rpx;
|
||||
border: 2rpx solid #d8ad63;
|
||||
border-radius: 6rpx;
|
||||
font-family: STKaiti, KaiTi, serif;
|
||||
font-size: 38rpx;
|
||||
letter-spacing: 4rpx;
|
||||
}
|
||||
.entry-button::after {
|
||||
position: absolute;
|
||||
inset: 10rpx;
|
||||
border: 1rpx solid rgba(225, 180, 105, 0.92);
|
||||
border-radius: 2rpx;
|
||||
content: '';
|
||||
pointer-events: none;
|
||||
}
|
||||
.entry-button--primary {
|
||||
border-color: #9e170e;
|
||||
background: #b7170d;
|
||||
color: #fffaf0;
|
||||
}
|
||||
.entry-button--primary::after { border-color: #edc67c; }
|
||||
.entry-button--secondary {
|
||||
margin-top: 51rpx;
|
||||
background: rgba(255, 252, 245, 0.82);
|
||||
color: #60442f;
|
||||
}
|
||||
.entry-button__icon { width: 46rpx; height: 46rpx; margin-right: 18rpx; }
|
||||
.entry-button__icon--wechat { width: 52rpx; }
|
||||
.entry-button--primary .entry-button__icon { filter: brightness(0) invert(1); }
|
||||
.entry-button > text { position: relative; z-index: 1; }
|
||||
.entry-button--pressed { opacity: 0.84; }
|
||||
|
||||
.register-link {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
margin-top: 98rpx;
|
||||
color: #60442f;
|
||||
font-family: STKaiti, KaiTi, serif;
|
||||
font-size: 30rpx;
|
||||
letter-spacing: 2rpx;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.agreement-row { margin-top: 128rpx; }
|
||||
```
|
||||
|
||||
Delete `.gold-divider`, `.divider-line`, `.divider-ornament`, `.auth-button`, `.primary-button`, `.secondary-button`, `.button-icon`, `.wechat-icon`, `.button-hover`, `.button-corner`, all `.corner-*` selectors, and `.link-line`. Do not change any handler or copy.
|
||||
|
||||
- [ ] **Step 3: Run the focused contract and relevant compilation audits**
|
||||
|
||||
Run:
|
||||
|
||||
```powershell
|
||||
powershell -ExecutionPolicy Bypass -File tests\a01-a02-ui-contract.ps1
|
||||
powershell -ExecutionPolicy Bypass -File tests\vue3-entry.ps1
|
||||
powershell -ExecutionPolicy Bypass -File tests\compile-audit.ps1
|
||||
```
|
||||
|
||||
Expected: all three scripts print `PASS`; the focused contract prints `A01-A02-UI-CONTRACT PASS`.
|
||||
|
||||
### Task 3: Record the completed static change and request runtime evidence
|
||||
|
||||
**Files:**
|
||||
- Modify: `docs/design/A01_启动登录引导_设计记录.md:51-57`
|
||||
- Modify: `design-qa.md:1-31`
|
||||
- Test: `tests/a01-a02-ui-contract.ps1`, `tests/vue3-entry.ps1`, `tests/compile-audit.ps1`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: passing static contract and a page that still needs HBuilderX/Android visual evidence.
|
||||
- Produces: an honest handoff that separates static verification from runtime screenshot acceptance.
|
||||
|
||||
- [ ] **Step 1: Update the design record's verification state**
|
||||
|
||||
Add this sentence under the runtime-verification gap:
|
||||
|
||||
```markdown
|
||||
- 2026-07-13 已按 412 × 915 参考图重新校准真实 DOM 的标题区、分隔饰线、双按钮、注册入口与协议行;静态合同通过,但仍须由同尺寸 HBuilderX 或 Android 截图叠图确认,未确认前不得标记 A-01 完成。
|
||||
```
|
||||
|
||||
- [ ] **Step 2: Replace the stale QA finding with the exact next capture**
|
||||
|
||||
Set `design-qa.md` to state that the source remains `A01-启动登录引导-栅格验收-412x915.png`, static calibration has passed, and the sole remaining evidence is an unchecked `412 x 915` HBuilderX/Android capture without browser chrome plus a `320 x 568` safety/scroll capture.
|
||||
|
||||
- [ ] **Step 3: Run the final static verification and inspect the scoped diff**
|
||||
|
||||
Run:
|
||||
|
||||
```powershell
|
||||
powershell -ExecutionPolicy Bypass -File tests\a01-a02-ui-contract.ps1
|
||||
powershell -ExecutionPolicy Bypass -File tests\vue3-entry.ps1
|
||||
powershell -ExecutionPolicy Bypass -File tests\compile-audit.ps1
|
||||
git diff --check
|
||||
git diff -- pages/auth/entry.vue tests/a01-a02-ui-contract.ps1 docs/design/A01_启动登录引导_设计记录.md docs/superpowers/specs/2026-07-13-a01-runtime-visual-calibration-design.md docs/superpowers/specs/2026-07-13-a01-a02-static-ui-implementation-design.md design-qa.md
|
||||
```
|
||||
|
||||
Expected: all scripts pass, `git diff --check` is silent, and no interaction, route, or API code is changed.
|
||||
|
||||
- [ ] **Step 4: Commit only the A-01 calibration work**
|
||||
|
||||
```powershell
|
||||
git add -- pages/auth/entry.vue tests/a01-a02-ui-contract.ps1 docs/design/A01_启动登录引导_设计记录.md docs/superpowers/specs/2026-07-13-a01-runtime-visual-calibration-design.md docs/superpowers/specs/2026-07-13-a01-a02-static-ui-implementation-design.md design-qa.md
|
||||
git commit -m "fix: calibrate A01 entry visual layout"
|
||||
```
|
||||
|
||||
Expected: the commit includes only the listed A-01 files; it must not include `components/GenealogyCard.vue` or Vite cache files.
|
||||
@@ -1,312 +0,0 @@
|
||||
# A-01 Text Registration Entry Design Evidence 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:** 完成 A-01“登录 + 微信登录 + 文字注册入口”的可归档设计证据与 Android 固定栅格验收口径,不修改 uni-app 页面、接口或打包。
|
||||
|
||||
**Architecture:** `docs/design/A01_启动登录引导_设计记录.md` 是 A-01 当前规则的唯一所有者。PowerShell 审计脚本只验证该记录、归档效果稿和项目内静态资产;四个尺寸的效果稿是静态设计验证,不冒充 uni-app 运行时验收。
|
||||
|
||||
**Tech Stack:** Markdown、PNG/JPG 静态资产、PowerShell 5.1、内置图像生成工具、HBuilderX Web 浏览器(仅在页面实现阶段用于运行时验收)。
|
||||
|
||||
## Global Constraints
|
||||
|
||||
- 只做 `D2 / A-01` 的设计证据;不改 `.vue`、路由、接口、真实登录、Android 打包或依赖。
|
||||
- 当前设计唯一所有者是 `docs/design/A01_启动登录引导_设计记录.md`;本计划和所有审计脚本不得重复定义入口规则。
|
||||
- A-01 只有朱砂红“登录”主按钮、古金描边“微信登录”按钮和“还没有账号?注册账号”文字入口。
|
||||
- 登录进入 A-02;A-02 承接“账号密码登录 / 手机验证码登录”双标签;微信授权属于 A-03,注册属于 A-04,忘记密码属于 A-05。
|
||||
- 协议复选框默认未勾选。任何进入操作都不能默认视为用户同意协议;未勾选仅提示用户先确认协议。
|
||||
- 使用 Android `rpx + flex` 设计口径,不使用 CSS Grid 或 `gap`;底部安全区规则必须使用 `env(safe-area-inset-bottom)`。
|
||||
- 登录欢迎页的头图、宣纸和山水必须是 A-01 独立资产,不复用 G-01 的 `footer-mountain-bamboo.png`。
|
||||
- 功能图标必须为项目内 `96 × 96px` RGBA 透明 PNG;微信标志只使用官方或许可来源的原色透明 PNG,不重绘或改色。
|
||||
- 效果稿 v1、v2 是历史证据,保留但不可作为当前入口结构依据;当前整页效果稿 v3 也不能充当真实背景或图标资产。
|
||||
|
||||
## File Structure
|
||||
|
||||
| 文件 | 职责 |
|
||||
| --- | --- |
|
||||
| `docs/design/A01_启动登录引导_设计记录.md` | A-01 当前入口、栅格、状态、资产清单与静态验收结论的唯一设计来源。 |
|
||||
| `tests/a01-design-record-audit.ps1` | 验证当前入口、路由归属、栅格约束和 v3 效果稿的归档存在。 |
|
||||
| `static/assets/backgrounds/auth-ancestral-header-v1.png` | A-01 独立朱砂家祠头图,`750 × 196px`。 |
|
||||
| `static/assets/backgrounds/auth-rice-paper-v1.jpg` | A-01 独立暖宣纸纹理,`750 × 1334px`。 |
|
||||
| `static/assets/backgrounds/auth-ink-scenery-v1.png` | A-01 独立淡墨建筑、竹影与山水叠层,`750 × 1334px`。 |
|
||||
| `static/assets/icons/auth/login-outline-v1.png` | 登录按钮使用的 `96 × 96px` 透明 PNG。 |
|
||||
| `static/assets/icons/auth/wechat-licensed-v1.png` | 微信按钮使用的 `96 × 96px` 许可来源、原色透明 PNG。 |
|
||||
| `tests/a01-asset-alpha-audit.ps1` | 验证 A-01 图标的尺寸、透明角和可见像素,以及 A-01 独立背景文件。 |
|
||||
| `docs/design/screens/A01-启动登录引导-栅格验收-320x568.png` | 320 × 568 静态设计效果稿。 |
|
||||
| `docs/design/screens/A01-启动登录引导-栅格验收-360x640.png` | 360 × 640 静态设计效果稿。 |
|
||||
| `docs/design/screens/A01-启动登录引导-栅格验收-360x800.png` | 360 × 800 静态设计效果稿。 |
|
||||
| `docs/design/screens/A01-启动登录引导-栅格验收-412x915.png` | 412 × 915 静态设计效果稿。 |
|
||||
|
||||
---
|
||||
|
||||
### Task 1: 锁定当前入口与固定栅格的审计关口
|
||||
|
||||
**Files:**
|
||||
|
||||
- Modify: `tests/a01-design-record-audit.ps1`
|
||||
- Test: `tests/a01-design-record-audit.ps1`
|
||||
|
||||
**Interfaces:**
|
||||
|
||||
- Consumes: UTF-8 Base64 文本解码函数 `ConvertFrom-Utf8Base64`、A-01 设计记录和效果稿 v3。
|
||||
- Produces: 退出码 `0` 与 `A01-DESIGN-RECORD-AUDIT PASS`;缺少任何规则或效果稿时抛出明确错误。
|
||||
|
||||
- [x] **Step 1: 写入会失败的栅格规则断言**
|
||||
|
||||
在现有 `$rules` 数组后增加以下代码;这些规则在本任务开始时尚未写入设计记录,因此审计应失败。
|
||||
|
||||
```powershell
|
||||
$layoutRules = @(
|
||||
(ConvertFrom-Utf8Base64 '5YaF5a655a695bqmIDYzOHJweA=='),
|
||||
(ConvertFrom-Utf8Base64 '5Li75oyJ6ZKu6auY5bqmIDEwOHJweA=='),
|
||||
(ConvertFrom-Utf8Base64 'ZW52KHNhZmUtYXJlYS1pbnNldC1ib3R0b20p'),
|
||||
(ConvertFrom-Utf8Base64 '6LSm5Y+35a+G56CB55m75b2VIC8g5omL5py66aqM6K+B56CB55m75b2V')
|
||||
)
|
||||
|
||||
foreach ($rule in $layoutRules) {
|
||||
if ($record -notmatch [regex]::Escape($rule)) {
|
||||
throw "Missing A01 layout rule: $rule"
|
||||
}
|
||||
}
|
||||
|
||||
$currentStructure = [regex]::Match($record, '(?s)## 2\\..*?(?=## 3\\.)').Value
|
||||
$currentStructureRule = ConvertFrom-Utf8Base64 '5Lik5Liq5aSn5oyJ6ZKu5ZKM5LiA5Liq5paH5a2X5YWl5Y+j'
|
||||
if ($currentStructure -notmatch [regex]::Escape($currentStructureRule)) {
|
||||
throw "Missing current A01 structure rule: $currentStructureRule"
|
||||
}
|
||||
```
|
||||
|
||||
- [x] **Step 2: 运行审计并确认它先失败**
|
||||
|
||||
Run:
|
||||
|
||||
```powershell
|
||||
powershell -NoProfile -ExecutionPolicy Bypass -File tests/a01-design-record-audit.ps1
|
||||
```
|
||||
|
||||
Expected: `Missing A01 layout rule: 内容宽度 638rpx`。
|
||||
|
||||
- [x] **Step 3: 保持红灯测试未提交并进入 Task 2**
|
||||
|
||||
红灯只用于证明固定栅格规则确实缺失。不要单独提交失败测试;在 Task 2 将设计记录补齐并转绿后,再与设计记录一起提交。
|
||||
|
||||
### Task 2: 写入 A-01 固定栅格与状态边界
|
||||
|
||||
**Files:**
|
||||
|
||||
- Modify: `docs/design/A01_启动登录引导_设计记录.md`
|
||||
- Test: `tests/a01-design-record-audit.ps1`
|
||||
|
||||
**Interfaces:**
|
||||
|
||||
- Consumes: Task 1 的 `$layoutRules` 与当前入口结构断言。
|
||||
- Produces: 以 750rpx 设计画布表达的固定栅格、四类进入状态和明确的非运行时验收边界。
|
||||
|
||||
- [x] **Step 1: 在第 3 节加入固定栅格**
|
||||
|
||||
在“固定布局与状态边界”中加入以下内容,保持现有的入口与协议规则不变:
|
||||
|
||||
```markdown
|
||||
- 固定设计画布为 `750rpx` 宽;内容宽度 638rpx,左右各 56rpx。朱砂家祠头图高 196rpx;标题与副标题区域从头图下方开始,操作区首按钮顶边固定为 646rpx。
|
||||
- 主按钮高度 108rpx,微信按钮高度 108rpx,二者间距 30rpx;注册文字在微信按钮下方 56rpx,字号 28rpx,整行居中且不得换行。两个按钮文字字号 36rpx,均单行居中。
|
||||
- 协议行使用 26rpx 字号,页面最小底部内边距为 `calc(32rpx + env(safe-area-inset-bottom))`。320 × 568 时页面允许纵向滚动,协议行与任一入口均不得落入系统导航区。
|
||||
- 仅作静态设计验证,不代表 uni-app 运行时验收;页面实现后仍须在 Android 320 × 568、360 × 640、360 × 800、412 × 915 上重新验收。
|
||||
```
|
||||
|
||||
- [x] **Step 2: 在第 3 节加入状态表**
|
||||
|
||||
紧接固定栅格条目,加入以下表格:
|
||||
|
||||
```markdown
|
||||
| 状态 | 触发 | A-01 可见结果 | 去向 |
|
||||
| --- | --- | --- | --- |
|
||||
| 初始未勾选 | 首次进入 | 两个按钮、注册文字与空复选框 | 留在 A-01 |
|
||||
| 未同意协议 | 点击登录、微信登录或注册账号 | 提示“请先阅读并同意相关协议”,不跳转、不改变勾选状态 | 留在 A-01 |
|
||||
| 登录已确认协议 | 点击“登录” | 结束 A-01 引导 | A-02,默认账号密码登录标签 |
|
||||
| 微信已确认协议 | 点击“微信登录” | 结束 A-01 引导 | A-03,显示授权中、取消或失败回跳 |
|
||||
| 注册已确认协议 | 点击“注册账号”文字 | 结束 A-01 引导 | A-04 |
|
||||
```
|
||||
|
||||
- [x] **Step 3: 运行审计并确认通过**
|
||||
|
||||
Run:
|
||||
|
||||
```powershell
|
||||
powershell -NoProfile -ExecutionPolicy Bypass -File tests/a01-design-record-audit.ps1
|
||||
```
|
||||
|
||||
Expected: `A01-DESIGN-RECORD-AUDIT PASS`。
|
||||
|
||||
- [x] **Step 4: 检查文档差异并提交**
|
||||
|
||||
```powershell
|
||||
git diff --check
|
||||
git add docs/design/A01_启动登录引导_设计记录.md tests/a01-design-record-audit.ps1
|
||||
git commit -m "docs: define A01 grid and entry states"
|
||||
```
|
||||
|
||||
### Task 3: 归档 A-01 独立背景和透明图标
|
||||
|
||||
**Files:**
|
||||
|
||||
- Create: `static/assets/backgrounds/auth-ancestral-header-v1.png`
|
||||
- Create: `static/assets/backgrounds/auth-rice-paper-v1.jpg`
|
||||
- Create: `static/assets/backgrounds/auth-ink-scenery-v1.png`
|
||||
- Create: `static/assets/icons/auth/login-outline-v1.png`
|
||||
- Create: `static/assets/icons/auth/wechat-licensed-v1.png`
|
||||
- Create: `tests/a01-asset-alpha-audit.ps1`
|
||||
- Modify: `docs/design/A01_启动登录引导_设计记录.md`
|
||||
- Test: `tests/a01-asset-alpha-audit.ps1`
|
||||
|
||||
**Interfaces:**
|
||||
|
||||
- Consumes: Task 2 的 A-01 独立美术方向和项目现有 `tests/g01-asset-alpha-audit.ps1` 的透明角审计方式。
|
||||
- Produces: 可由页面实现消费的独立背景与两个 `96 × 96px` RGBA 透明图标;设计记录中带来源、用途、路径、尺寸和 Alpha 验收结论的资产清单。
|
||||
|
||||
- [x] **Step 1: 创建先失败的资产审计脚本**
|
||||
|
||||
创建 `tests/a01-asset-alpha-audit.ps1`,内容如下:
|
||||
|
||||
```powershell
|
||||
$ErrorActionPreference = 'Stop'
|
||||
|
||||
$root = Split-Path -Parent $PSScriptRoot
|
||||
Add-Type -AssemblyName System.Drawing
|
||||
|
||||
$backgrounds = @(
|
||||
'static/assets/backgrounds/auth-ancestral-header-v1.png',
|
||||
'static/assets/backgrounds/auth-rice-paper-v1.jpg',
|
||||
'static/assets/backgrounds/auth-ink-scenery-v1.png'
|
||||
)
|
||||
$icons = @(
|
||||
'static/assets/icons/auth/login-outline-v1.png',
|
||||
'static/assets/icons/auth/wechat-official-v1.png'
|
||||
)
|
||||
|
||||
foreach ($asset in $backgrounds + $icons) {
|
||||
if (-not (Test-Path -LiteralPath (Join-Path $root $asset))) {
|
||||
throw "Missing A01 asset: $asset"
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($asset in $icons) {
|
||||
$bitmap = [System.Drawing.Bitmap]::FromFile((Join-Path $root $asset))
|
||||
$width = [int]$bitmap.Width
|
||||
$height = [int]$bitmap.Height
|
||||
$corners = @(
|
||||
$bitmap.GetPixel(0, 0).A,
|
||||
$bitmap.GetPixel(($width - 1), 0).A,
|
||||
$bitmap.GetPixel(0, ($height - 1)).A,
|
||||
$bitmap.GetPixel(($width - 1), ($height - 1)).A
|
||||
)
|
||||
$visiblePixels = 0
|
||||
for ($y = 0; $y -lt $height; $y++) {
|
||||
for ($x = 0; $x -lt $width; $x++) {
|
||||
if ($bitmap.GetPixel($x, $y).A -gt 24) { $visiblePixels++ }
|
||||
}
|
||||
}
|
||||
$bitmap.Dispose()
|
||||
|
||||
if ($width -ne 96 -or $height -ne 96) { throw "$asset must be 96 x 96px." }
|
||||
if (($corners | Where-Object { $_ -ne 0 }).Count -ne 0) { throw "$asset has opaque outer corners." }
|
||||
if ($visiblePixels -lt 80) { throw "$asset has no usable visible artwork." }
|
||||
Write-Output "PASS $asset transparent corners and visible artwork"
|
||||
}
|
||||
|
||||
Write-Output 'A01-ASSET-ALPHA-AUDIT PASS'
|
||||
```
|
||||
|
||||
- [x] **Step 2: 运行资产审计并确认它先失败**
|
||||
|
||||
Run:
|
||||
|
||||
```powershell
|
||||
powershell -NoProfile -ExecutionPolicy Bypass -File tests/a01-asset-alpha-audit.ps1
|
||||
```
|
||||
|
||||
Expected: `Missing A01 asset: static/assets/backgrounds/auth-ancestral-header-v1.png`。
|
||||
|
||||
- [x] **Step 3: 生成或下载并记录资产**
|
||||
|
||||
生成以下三张独立背景,不能裁切或复用 G-01 背景:朱砂家祠头图 `750 × 196px`、暖宣纸纹理 `750 × 1334px`、淡墨建筑竹影山水叠层 `750 × 1334px`。将它们存到本任务列出的精确路径。
|
||||
|
||||
为登录按钮准备古金或白色线性人物图标,保存为 `login-outline-v1.png`;从官方或明确许可来源取得未经改色的微信图标,保存为 `wechat-licensed-v1.png`。两个文件均为 `96 × 96px` RGBA PNG,四个角完全透明。
|
||||
|
||||
在 A-01 设计记录新增“资产清单”表格,并写入以下列:资产路径、用途、来源或生成提示、尺寸、透明验收。微信条目必须填入直接来源页面与获取日期;其余四项必须写入生成提示或公开许可证来源。
|
||||
|
||||
- [x] **Step 4: 运行资产审计并确认通过**
|
||||
|
||||
Run:
|
||||
|
||||
```powershell
|
||||
powershell -NoProfile -ExecutionPolicy Bypass -File tests/a01-asset-alpha-audit.ps1
|
||||
```
|
||||
|
||||
Expected: 每个图标输出一行 `PASS`,最后输出 `A01-ASSET-ALPHA-AUDIT PASS`。
|
||||
|
||||
- [x] **Step 5: 提交可消费资产与审计**
|
||||
|
||||
```powershell
|
||||
git add static/assets/backgrounds/auth-ancestral-header-v1.png static/assets/backgrounds/auth-rice-paper-v1.jpg static/assets/backgrounds/auth-ink-scenery-v1.png static/assets/icons/auth/login-outline-v1.png static/assets/icons/auth/wechat-licensed-v1.png tests/a01-asset-alpha-audit.ps1 docs/design/A01_启动登录引导_设计记录.md
|
||||
git commit -m "assets: add A01 login design resources"
|
||||
```
|
||||
|
||||
### Task 4: 归档四个 Android 尺寸的静态设计验收稿
|
||||
|
||||
**Files:**
|
||||
|
||||
- Create: `docs/design/screens/A01-启动登录引导-栅格验收-320x568.png`
|
||||
- Create: `docs/design/screens/A01-启动登录引导-栅格验收-360x640.png`
|
||||
- Create: `docs/design/screens/A01-启动登录引导-栅格验收-360x800.png`
|
||||
- Create: `docs/design/screens/A01-启动登录引导-栅格验收-412x915.png`
|
||||
- Modify: `docs/design/A01_启动登录引导_设计记录.md`
|
||||
- Modify: `docs/规划.md`
|
||||
- Modify: `docs/交接记录.md`
|
||||
- Test: `tests/a01-design-record-audit.ps1`
|
||||
|
||||
**Interfaces:**
|
||||
|
||||
- Consumes: Task 2 的 750rpx 栅格、Task 3 的独立资产和当前 v3 的视觉方向。
|
||||
- Produces: 四张按目标尺寸生成的静态设计验收稿;设计记录明确区分静态验收与页面实现后的运行时验收。
|
||||
|
||||
- [x] **Step 1: 生成四张静态验收稿**
|
||||
|
||||
使用当前 v3 作为样式参考,为每个精确尺寸单独生成整页效果稿,不裁切同一张长图。每一张都必须显示:朱砂家祠头图、标题与副标题、两个大按钮、单行文字注册入口、未勾选协议和安全区留白。
|
||||
|
||||
验收时逐项检查:320 × 568 的“还没有账号?注册账号”不换行;四个尺寸的两个按钮文字均单行;协议行完整可见;底部内容不进入 `env(safe-area-inset-bottom)` 预留区;没有账号密码或手机验证码的独立大按钮。
|
||||
|
||||
- [x] **Step 2: 在设计记录写入静态验收结论**
|
||||
|
||||
在第 4 节增加四个效果稿链接和以下结论:
|
||||
|
||||
```markdown
|
||||
- 静态设计验收已覆盖 320 × 568、360 × 640、360 × 800、412 × 915;四个尺寸均保持两个大按钮与单行文字注册入口。
|
||||
- 此结论只验证设计稿与固定栅格,不替代 uni-app 页面实现后的 Android 运行时验收。
|
||||
```
|
||||
|
||||
- [x] **Step 3: 运行设计记录审计并检查差异**
|
||||
|
||||
Run:
|
||||
|
||||
```powershell
|
||||
powershell -NoProfile -ExecutionPolicy Bypass -File tests/a01-design-record-audit.ps1
|
||||
git diff --check
|
||||
```
|
||||
|
||||
Expected: `A01-DESIGN-RECORD-AUDIT PASS`,且 `git diff --check` 没有错误输出。
|
||||
|
||||
- [x] **Step 4: 更新阶段状态并提交**
|
||||
|
||||
仅当四张静态验收稿和 Task 3 资产审计均通过时,将 `docs/规划.md` 与 `docs/交接记录.md` 更新为“A-01 静态设计证据已完成,等待页面实现阶段的运行时验收”;不得写成页面已实现、接口已接通或 Android 已打包。
|
||||
|
||||
```powershell
|
||||
git add docs/design/screens/A01-启动登录引导-栅格验收-320x568.png docs/design/screens/A01-启动登录引导-栅格验收-360x640.png docs/design/screens/A01-启动登录引导-栅格验收-360x800.png docs/design/screens/A01-启动登录引导-栅格验收-412x915.png docs/design/A01_启动登录引导_设计记录.md docs/规划.md docs/交接记录.md
|
||||
git commit -m "docs: archive A01 static size evidence"
|
||||
```
|
||||
|
||||
## Plan Self-Review
|
||||
|
||||
- 规格覆盖:入口层级由 Task 1 审计、Task 2 固定;协议、路由和状态由 Task 2 记录;独立背景、透明图标与微信来源由 Task 3 归档;四个 Android 尺寸由 Task 4 归档。
|
||||
- 范围检查:所有任务限于设计记录、静态资源、效果稿和审计;没有 Vue、接口、登录逻辑或打包步骤。
|
||||
- 一致性检查:A-02 只承接账号密码与手机验证码双标签;A-03 只承接微信授权;A-04 只承接注册;A-05 只承接忘记密码。
|
||||
- 验收边界:四张效果稿是静态设计验证,不能替代页面实现后的真实 Android 运行时验收。
|
||||
@@ -1,165 +0,0 @@
|
||||
# A-01 V3 Visual Fidelity Implementation Plan
|
||||
|
||||
> 状态:已失效。用户否决“整张效果图作为页面视觉层”的方案;当前 A-01 必须以真实 DOM 还原 v3,见 `docs/design/A01_启动登录引导_设计记录.md`。
|
||||
|
||||
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
|
||||
|
||||
**Goal:** Make the running A-01 page reproduce the selected 412×915 visual baseline at mobile width while preserving its existing local-only interactions.
|
||||
|
||||
**Architecture:** The accepted v3 image is a complete 852 × 1846 mobile visual, including typography, ornamental borders, header, ink scenery and the empty agreement circle. `pages/auth/entry.vue` renders it at a logical width of 750rpx and layers only transparent interaction regions above it. The existing `agreed` state and local-only toast/navigation functions remain the sole interaction owner.
|
||||
|
||||
**Tech Stack:** uni-app Vue 3 `<script setup>`, local PNG imported with `@/`, PowerShell contract audit.
|
||||
|
||||
## Global Constraints
|
||||
|
||||
- Visual source of truth: `docs/design/screens/A01-启动登录引导-栅格验收-412x915.png`.
|
||||
- Do not generate artwork, redraw v3 ornaments in CSS, add API calls, write login state, or create routes.
|
||||
- A-01 stays vertically scrollable below 430 × 932; render the source with width-fixed scaling.
|
||||
- A-01 is unchecked by default and retains the exact guard message `请先阅读并同意相关协议`.
|
||||
- Only `pages/auth/entry.vue`, `tests/a01-a02-ui-contract.ps1`, and A-01 design/hand-off records may change.
|
||||
|
||||
---
|
||||
|
||||
### Task 1: Change the A-01 contract to the selected v3 source
|
||||
|
||||
**Files:**
|
||||
- Modify: `tests/a01-a02-ui-contract.ps1`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: the local v3 visual source and existing `openLogin`, `prepareWechatLogin`, `prepareRegister`, `prepareAgreement` functions.
|
||||
- Produces: a source-level guard that rejects the former hand-built header, title, cloud and button decorations.
|
||||
|
||||
- [ ] **Step 1: Write the failing visual-source assertions**
|
||||
|
||||
Add these checks while retaining agreement, route, local-toast and forbidden-API checks:
|
||||
|
||||
```powershell
|
||||
Assert-Contains -Content $entry -Expected "import entryGuideVisual from '@/docs/design/screens/A01-启动登录引导-栅格验收-412x915.png'" -Message 'A-01 must import the selected visual source'
|
||||
foreach ($requiredClass in @('guide-art', 'entry-login-hit', 'entry-wechat-hit', 'entry-register-hit', 'entry-agreement-hit')) {
|
||||
Assert-Contains -Content $entry -Expected $requiredClass -Message "Missing A-01 interaction region: $requiredClass"
|
||||
}
|
||||
foreach ($forbiddenClass in @('auth-header', 'brand-intro', 'entry-actions', 'cloud')) {
|
||||
Assert-NotContains -Content $entry -Unexpected $forbiddenClass -Message "A-01 must not redraw the v3 visual with $forbiddenClass"
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 2: Run the contract test before changing the page**
|
||||
|
||||
Run: `& .\tests\a01-a02-ui-contract.ps1`
|
||||
|
||||
Expected: failure stating that A-01 does not import the selected v3 visual source.
|
||||
|
||||
- [ ] **Step 3: Do not commit red state**
|
||||
|
||||
Leave the failing contract uncommitted until Task 2 passes.
|
||||
|
||||
---
|
||||
|
||||
### Task 2: Replace the hand-built A-01 visual with the accepted v3 source
|
||||
|
||||
**Files:**
|
||||
- Modify: `pages/auth/entry.vue`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: `entryGuideVisual`, `agreed`, `requireAgreement`, `openLogin`, `prepareWechatLogin`, `prepareRegister`, and `prepareAgreement`.
|
||||
- Produces: the v3 presentation plus four screen-coordinate interaction regions.
|
||||
|
||||
- [ ] **Step 1: Import and render the accepted source width-fixed**
|
||||
|
||||
```vue
|
||||
<script setup>
|
||||
import { ref } from 'vue'
|
||||
import entryGuideVisual from '@/docs/design/screens/A01-启动登录引导-栅格验收-412x915.png'
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<view class="entry-page">
|
||||
<image class="guide-art" :src="entryGuideVisual" mode="widthFix" />
|
||||
</view>
|
||||
</template>
|
||||
```
|
||||
|
||||
Set the root to `width: 750rpx; min-height: 1625rpx;` with no `overflow: hidden`, so 320 × 568 remains scrollable.
|
||||
|
||||
- [ ] **Step 2: Add only invisible v3 hit regions**
|
||||
|
||||
```vue
|
||||
<view class="entry-hit entry-login-hit" hover-class="entry-hit-active" @click="openLogin" />
|
||||
<view class="entry-hit entry-wechat-hit" hover-class="entry-hit-active" @click="prepareWechatLogin" />
|
||||
<view class="entry-hit entry-register-hit" hover-class="entry-hit-active" @click="prepareRegister" />
|
||||
<view class="entry-hit entry-agreement-hit" @click="toggleAgreement" />
|
||||
<view v-if="agreed" class="agreement-confirmed">✓</view>
|
||||
```
|
||||
|
||||
Use v3’s 750rpx logical coordinates: login `top: 799rpx; left: 99rpx; width: 552rpx; height: 126rpx`; WeChat `top: 960rpx`; register `top: 1155rpx; left: 200rpx; width: 350rpx; height: 72rpx`; agreement toggle `top: 1362rpx; left: 126rpx; width: 60rpx; height: 60rpx`. Display the check marker only after a user toggle.
|
||||
|
||||
- [ ] **Step 3: Preserve the existing local-only behavior**
|
||||
|
||||
```js
|
||||
const requireAgreement = () => {
|
||||
if (agreed.value) return true
|
||||
uni.showToast({ title: '请先阅读并同意相关协议', icon: 'none' })
|
||||
return false
|
||||
}
|
||||
|
||||
const openLogin = () => {
|
||||
if (!requireAgreement()) return
|
||||
uni.navigateTo({ url: '/pages/auth/login?agreed=1' })
|
||||
}
|
||||
```
|
||||
|
||||
Keep prepared-state toasts for WeChat, registration and agreement pages. Do not add `appApi`, `calcMD5`, `loginWithPassword`, `uni.reLaunch`, or an implicit agreement sentence.
|
||||
|
||||
- [ ] **Step 4: Run the focused test cycle**
|
||||
|
||||
Run: `& .\tests\a01-a02-ui-contract.ps1`
|
||||
|
||||
Expected: `A01-A02-UI-CONTRACT PASS`.
|
||||
|
||||
---
|
||||
|
||||
### Task 3: Record the v3 runtime source and verify
|
||||
|
||||
**Files:**
|
||||
- Modify: `docs/design/A01_启动登录引导_设计记录.md`
|
||||
- Modify: `docs/交接记录.md`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: selected v3 source and current A-01 local interaction contract.
|
||||
- Produces: one documented visual source for the next Android screenshot comparison.
|
||||
|
||||
- [ ] **Step 1: Update the A-01 record**
|
||||
|
||||
State that v3 is the runtime visual source, not merely archived evidence. Correct the principal button copy to `登录`; its destination remains A-02’s default account/password tab after explicit agreement.
|
||||
|
||||
- [ ] **Step 2: Update hand-off status**
|
||||
|
||||
Record that the first local preview diverged from v3 in header height, button width and vertical rhythm, and that the correction uses v3 directly. Keep four-size Android runtime comparison pending.
|
||||
|
||||
- [ ] **Step 3: Run project verification**
|
||||
|
||||
```powershell
|
||||
$tests = Get-ChildItem -LiteralPath .\tests -Filter *.ps1 | Sort-Object Name
|
||||
foreach ($test in $tests) { & $test.FullName }
|
||||
git diff --check
|
||||
git status --short
|
||||
```
|
||||
|
||||
Expected: all scripts pass, `git diff --check` is silent, and only these four files changed besides user-owned dirty files.
|
||||
|
||||
- [ ] **Step 4: Commit scoped work**
|
||||
|
||||
```powershell
|
||||
git add -- pages/auth/entry.vue tests/a01-a02-ui-contract.ps1 docs/design/A01_启动登录引导_设计记录.md docs/交接记录.md
|
||||
git commit -m "fix: match A01 v3 visual reference"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Self-Review
|
||||
|
||||
- [x] The target is the exact saved v3 image the user displayed, not a new interpretation.
|
||||
- [x] The plan replaces hand-drawn visible ornaments with the existing visual asset and keeps interactions local.
|
||||
- [x] The contract goes red before the page change, then verifies the visual source and interaction regions.
|
||||
- [x] No API, new route, Android configuration, or non-A-01 screen is included.
|
||||
- [x] Android runtime screenshot comparison remains follow-up work, not an unverified claim.
|
||||
@@ -1,226 +0,0 @@
|
||||
# 家谱 APP 地基重整 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:** 在不改变 A01、G01 已验收视觉结果的前提下,完成页面路由命名、图片资产包、代码中文注释和无引用资源清理的可维护地基。
|
||||
|
||||
**Architecture:** `pages.json` 继续作为唯一实际路由源;P00 文档提供页面语义映射。跨模块图片归入 `static/assets/foundation/{opaque,transparent}`,模块专用图片归入 `static/assets/modules/<module>/`。页面只引用语义路径;公共组件仅复用两个及以上已确认页面的稳定结构。
|
||||
|
||||
**Tech Stack:** Vue 3、uni-app、SCSS、PowerShell 审计脚本、HBuilderX Android 预览。
|
||||
|
||||
## Global Constraints
|
||||
|
||||
- Android `uni-app`;不新增依赖、接口、业务功能或未确认页面状态。
|
||||
- A01、G01 在 412 × 915 的可见结果冻结,迁移后必须回归验证。
|
||||
- 可见装饰一律为图片:`opaque` 负责完整底色,`transparent` 为 RGBA 叠加;禁止 CSS/SVG 装饰和截图切片。
|
||||
- 页面路径采用 `<编号>-<语义名>.vue`;旧入口必须在所有引用更新并验证后删除。
|
||||
- 关键结构、路由、资产图层和复杂逻辑使用中文注释;不得保留无用代码、资产、依赖或兼容入口。
|
||||
|
||||
---
|
||||
|
||||
### Task 1: 建立可重复的地基审计
|
||||
|
||||
**Files:**
|
||||
- Create: `tests/foundation-structure-audit.ps1`
|
||||
- Modify: `docs/design/P00_页面结构与资产清单.md`
|
||||
- Test: `tests/foundation-structure-audit.ps1`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: `pages.json` 的 `pages[*].path`,P00 的目标页面命名规则。
|
||||
- Produces: 退出码 `0` 表示路由、文件、资产目录和中文文件头满足当前迁移阶段;非 `0` 输出具体缺失路径。
|
||||
|
||||
- [ ] **Step 1: 写出会失败的结构审计**
|
||||
|
||||
在 `tests/foundation-structure-audit.ps1` 定义下列检查:
|
||||
|
||||
```powershell
|
||||
$pages = (Get-Content -Raw pages.json | ConvertFrom-Json).pages
|
||||
foreach ($page in $pages) {
|
||||
$file = "$($page.path).vue"
|
||||
if (-not (Test-Path $file)) { throw "缺少路由页面:$file" }
|
||||
if ($file -match '/(index|list|detail)\.vue$') { throw "最终页面名不允许使用:$file" }
|
||||
if (-not (Get-Content -Raw $file -Encoding utf8).StartsWith('<!-- 页面编号:')) {
|
||||
throw "缺少中文页面文件头:$file"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 2: 运行并确认当前版本失败**
|
||||
|
||||
Run: `powershell -ExecutionPolicy Bypass -File tests/foundation-structure-audit.ps1`
|
||||
Expected: FAIL,指出当前 `index.vue`、`list.vue` 或缺少中文文件头的路由。
|
||||
|
||||
- [ ] **Step 3: 增加迁移阶段允许项**
|
||||
|
||||
在同一脚本中把未迁移前的旧路径列为显式 `legacyPaths`,并要求其只在迁移批次开始前存在;迁移完成后删除该数组。检查 `static/assets/foundation/opaque` 和 `static/assets/foundation/transparent` 两个目录存在。
|
||||
|
||||
- [ ] **Step 4: 运行审计确认其仅报告真实缺失项**
|
||||
|
||||
Run: `powershell -ExecutionPolicy Bypass -File tests/foundation-structure-audit.ps1`
|
||||
Expected: FAIL,但每项错误都能对应 P00 中的未迁移项目。
|
||||
|
||||
### Task 2: 迁移页面文件、路由与中文文件头
|
||||
|
||||
**Files:**
|
||||
- Modify: `pages.json`
|
||||
- Move: `pages/auth/entry.vue` → `pages/auth/a01-entry.vue`
|
||||
- Move: `pages/auth/login.vue` → `pages/auth/a02-login.vue`
|
||||
- Move: `pages/genealogy/index.vue` → `pages/genealogy/g01-my-genealogies.vue`
|
||||
- Move: `pages/genealogy/create.vue` → `pages/genealogy/g03-create-genealogy.vue`
|
||||
- Move: `pages/lineage/first-person.vue` → `pages/genealogy/g04-first-ancestor.vue`
|
||||
- Move: `pages/genealogy/detail.vue` → `pages/genealogy/g05-genealogy-overview.vue`
|
||||
- Move: `pages/genealogy/search.vue` → `pages/genealogy/g06-search-genealogies.vue`
|
||||
- Move: `pages/genealogy/applications.vue` → `pages/genealogy/g10-application-review.vue`
|
||||
- Move: `pages/tree/index.vue` → `pages/tree/t01-tree-overview.vue`
|
||||
- Move: `pages/member/detail.vue` → `pages/tree/t03-member-profile.vue`
|
||||
- Move: `pages/family/index.vue` → `pages/family/f01-family-feed.vue`
|
||||
- Move: `pages/content/editor.vue` → `pages/family/f02-publish-feed.vue`
|
||||
- Move: `pages/content/list.vue` → `pages/skeleton/content-list-skeleton.vue`
|
||||
- Move: `pages/notification/index.vue` → `pages/notification/n01-message-center.vue`
|
||||
- Move: `pages/profile/index.vue` → `pages/profile/m01-profile-home.vue`
|
||||
- Modify: every file that navigates to one of the 15 paths
|
||||
- Modify: `docs/design/P00_页面结构与资产清单.md`
|
||||
- Modify: `tests/a01-a02-ui-contract.ps1`, `tests/g01-visual-contract.ps1`
|
||||
- Test: `tests/foundation-structure-audit.ps1`, `tests/compile-audit.ps1`, `tests/manifest-json.ps1`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: P00 第 2 节的逐项映射。
|
||||
- Produces: `pages.json` 中每个路径指向一个存在、带中文文件头的语义页面文件。
|
||||
|
||||
- [ ] **Step 1: 搜索全部旧路由引用**
|
||||
|
||||
Run: `rg -n "pages/(auth/entry|auth/login|genealogy/index|genealogy/create|genealogy/detail|genealogy/search|genealogy/applications|lineage/first-person|content/list|content/editor|tree/index|member/detail|family/index|profile/index|notification/index)" --glob '!unpackage/**'`
|
||||
|
||||
Expected: 得到 `pages.json`、Vue 跳转和测试中的完整引用列表;将结果逐项写入 P00 的迁移备注。
|
||||
|
||||
- [ ] **Step 2: 移动一个文件并在文件头加入中文身份注释**
|
||||
|
||||
每个迁移页面使用固定文件头:
|
||||
|
||||
```vue
|
||||
<!-- 页面编号:A-01;用途:启动/登录引导;视觉基准已由用户验收,重构时不得改变可见效果。 -->
|
||||
<template>
|
||||
```
|
||||
|
||||
A01、G01 文件头额外注明“视觉冻结”;`content-list-skeleton.vue` 明确注明“功能骨架,不计为设计完成页面”。
|
||||
|
||||
- [ ] **Step 3: 在同一批次更新路由和跳转**
|
||||
|
||||
`pages.json` 的路径去掉 `.vue` 后必须与新文件完全一致,例如:
|
||||
|
||||
```json
|
||||
{ "path": "pages/auth/a01-entry", "style": { "navigationStyle": "custom" } }
|
||||
```
|
||||
|
||||
所有 `uni.navigateTo`、`uni.reLaunch`、测试断言同步改为新 URL;不留下旧 URL 回退分支。
|
||||
|
||||
- [ ] **Step 4: 运行路由审计**
|
||||
|
||||
Run: `powershell -ExecutionPolicy Bypass -File tests/foundation-structure-audit.ps1`
|
||||
Expected: PASS,所有 `pages.json` 路径对应真实 Vue 文件并带中文文件头。
|
||||
|
||||
- [ ] **Step 5: 运行现有编译与 manifest 审计**
|
||||
|
||||
Run: `powershell -ExecutionPolicy Bypass -File tests/compile-audit.ps1`
|
||||
Expected: PASS,所有 `pages.json` 路由和本地模块引用均存在。
|
||||
|
||||
Run: `powershell -ExecutionPolicy Bypass -File tests/manifest-json.ps1`
|
||||
Expected: PASS,`manifest.json` 仍是有效 JSON。
|
||||
|
||||
### Task 3: 建立图片资产清单并迁移 A01/G01 资产
|
||||
|
||||
**Files:**
|
||||
- Create: `static/assets/foundation/opaque/`
|
||||
- Create: `static/assets/foundation/transparent/`
|
||||
- Create: `static/assets/modules/genealogy/opaque/`
|
||||
- Create: `static/assets/modules/genealogy/transparent/`
|
||||
- Create: `tests/foundation-asset-audit.ps1`
|
||||
- Modify: `pages/auth/a01-entry.vue`, `pages/auth/a02-login.vue`, `pages/genealogy/g01-my-genealogies.vue`, `components/PageHeader.vue`, `components/AppTabbar.vue`
|
||||
- Modify: `tests/a01-a02-ui-contract.ps1`, `tests/a01-asset-alpha-audit.ps1`, `tests/g01-asset-alpha-audit.ps1`, `tests/g01-visual-contract.ps1`
|
||||
- Modify: `docs/design/P00_页面结构与资产清单.md`
|
||||
- Test: `tests/foundation-asset-audit.ps1`, `tests/a01-asset-alpha-audit.ps1`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: 当前已验收 A01/G01 图片、D1 的 `opaque`/`transparent` 规则。
|
||||
- Produces: 每一项保留图片有唯一语义路径、透明属性与至少一个明确代码引用。
|
||||
|
||||
- [ ] **Step 1: 写出会失败的资产审计**
|
||||
|
||||
`tests/foundation-asset-audit.ps1` 扫描 `pages/`、`components/`、`pages.json` 和测试内的 `/static/assets/` 路径;对每个路径检查文件存在。脚本还读取 P00 中的资产登记表,拒绝 `-v1`、`-v2`、`-source`、重复语义文件作为最终 `foundation/` 路径。
|
||||
|
||||
- [ ] **Step 2: 运行并确认当前版本失败**
|
||||
|
||||
Run: `powershell -ExecutionPolicy Bypass -File tests/foundation-asset-audit.ps1`
|
||||
Expected: FAIL,指出当前资源仍在旧 `backgrounds/`、`icons/` 路径且没有最终登记。
|
||||
|
||||
- [ ] **Step 3: 按属性迁移已验收资源**
|
||||
|
||||
迁移时不修改像素内容,只改路径和名称:
|
||||
|
||||
```text
|
||||
auth-rice-paper-v1.jpg -> foundation/opaque/auth-page-paper.jpg
|
||||
auth-ancestral-header-v1.png -> foundation/opaque/auth-header.png
|
||||
auth-ink-scenery-v1.png -> foundation/transparent/auth-ink-scenery.png
|
||||
auth-title-cloud-v1.png -> foundation/transparent/auth-title-cloud.png
|
||||
auth-divider-knot-v1.png -> foundation/transparent/auth-divider-knot.png
|
||||
auth-button-corner-v1.png -> foundation/transparent/auth-button-frame.png
|
||||
```
|
||||
|
||||
G01 的纸纹、页头、导航底图归 `opaque`;谱印、云纹、功能图标、Tab 图标、分隔纹归 `transparent`。如果某个当前按钮仍依赖 CSS 填色或四角拼接,记录为“待完整按钮图片替代”,不得把它伪装为已完成。
|
||||
|
||||
- [ ] **Step 4: 更新所有引用并写中文图层注释**
|
||||
|
||||
每个页面的图片层在模板中标明,例如:
|
||||
|
||||
```vue
|
||||
<!-- 不透明纸纹底图:承担页面底色,不能由 CSS 替代。 -->
|
||||
<image class="paper-background" src="/static/assets/foundation/opaque/auth-page-paper.jpg" mode="aspectFill" />
|
||||
```
|
||||
|
||||
透明 PNG 注释注明叠加的宿主底图。不得新增新图片或改变 A01/G01 的尺寸、层级或 `mode`。
|
||||
|
||||
- [ ] **Step 5: 运行资产审计和透明度审计**
|
||||
|
||||
Run: `powershell -ExecutionPolicy Bypass -File tests/foundation-asset-audit.ps1`
|
||||
Expected: PASS,所有代码图片引用存在且最终资产路径没有临时版本名。
|
||||
|
||||
Run: `powershell -ExecutionPolicy Bypass -File tests/a01-asset-alpha-audit.ps1`
|
||||
Expected: PASS,A01 中登记为透明的 PNG 保持 RGBA 属性。
|
||||
|
||||
### Task 4: 删除无引用旧资产并做视觉回归
|
||||
|
||||
**Files:**
|
||||
- Delete: 资产审计确定为 `无引用删除` 或 `迁移后删除` 的旧文件
|
||||
- Modify: `docs/design/P00_页面结构与资产清单.md`
|
||||
- Test: `tests/foundation-asset-audit.ps1`, `tests/a01-a02-ui-contract.ps1`, `tests/compile-audit.ps1`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: Task 3 的通过资产审计和 P00 中的去留状态。
|
||||
- Produces: 不存在无引用旧资产;A01、G01 仍引用唯一的语义资产。
|
||||
|
||||
- [ ] **Step 1: 输出删除候选并二次扫描**
|
||||
|
||||
Run: `rg -n "/static/assets/" pages components tests pages.json --glob '!unpackage/**'`
|
||||
|
||||
Expected: 每一个候选旧文件均不在输出中;若仍有输出,保留文件并回到 Task 3。
|
||||
|
||||
- [ ] **Step 2: 删除已确认路径并立即更新 P00**
|
||||
|
||||
仅删除 P00 表格中标记为 `无引用删除` 或 `迁移后删除` 的文件;不递归删除目录,不删除用户未确认的模块资产。
|
||||
|
||||
- [ ] **Step 3: 运行视觉与编译回归**
|
||||
|
||||
Run: `powershell -ExecutionPolicy Bypass -File tests/a01-a02-ui-contract.ps1`
|
||||
Expected: PASS。
|
||||
|
||||
Run: `powershell -ExecutionPolicy Bypass -File tests/compile-audit.ps1`
|
||||
Expected: PASS。
|
||||
|
||||
在 HBuilderX 以 412 × 915 复核 A01、G01:纸纹、页头、按钮、祥云、谱印、导航无断裂、无缺失、无拼接痕迹。
|
||||
|
||||
- [ ] **Step 4: 检查差异与文档状态**
|
||||
|
||||
Run: `git diff --check`
|
||||
Expected: PASS。
|
||||
|
||||
将 P00 每个页面和资产的处理状态更新为真实结论;仅在上述检查均通过后将总规划的 P-00 标记为完成。
|
||||
@@ -1,42 +0,0 @@
|
||||
# 59 页面视觉全量交付执行计划
|
||||
|
||||
**Goal:** 在 2026-07-17 前完成 59 个规划页面/状态单元的统一移动端视觉与本地可浏览流程。
|
||||
|
||||
**Architecture:** 以 A01/G01 的宣纸、朱砂、古金、淡墨视觉为唯一系统。新增共享页面壳、六类精致母版与本地页面目录:页面目录只维护内容,母版拥有各自的视觉比例、卡片层级、空状态和操作区;现有页面保留已可用逻辑并接入对应母版。所有页面先覆盖正常/空/待接入可见状态,接口后置。
|
||||
|
||||
**Global Constraints:** 不改 A01/G01 的已验收可见结构;不接真实接口;只在当前工作目录改动;不执行 Git 提交、推送或上传;每页必须有编号语义路径和中文用途注释。
|
||||
|
||||
### Task 1: 建立全量路由红灯合同
|
||||
|
||||
- Create `tests/full-page-visual-contract.ps1`,固定 A01-A06、G01-G12、T01-T08、F01-F10、R01-R11、N01-N02、M01-M10 共 59 条最终路由;检查每条路由对应 Vue 文件、中文页面注释和页面壳引用。
|
||||
- 先运行该测试,预期因缺少 44 条路由/页面失败。
|
||||
|
||||
### Task 2: 建立共享页面壳与本地页面目录
|
||||
|
||||
- Create `components/ModulePage.vue`:负责纸纹、认证/业务页头、分区、信息卡、表单、列表、空状态、主按钮及安全区;按认证、列表详情、表单编辑、成员档案、内容流、个人消息六种精致母版渲染,禁止只替换标题的单一通用卡片。
|
||||
- Create `data/page-catalog.js`:唯一维护每个新增页面的标题、类型、说明、分组和本地操作反馈。
|
||||
- Create `components/ModulePage` 所需的最小本地样式,不引入依赖。
|
||||
|
||||
### Task 3: 补齐账户与家谱模块
|
||||
|
||||
- Create A03-A06、G02、G07-G09、G11-G12 的页面与路由。
|
||||
- Update A02、G03-G06、G10 的样式壳/跳转,保留现有功能逻辑。
|
||||
- 每页使用 `ModulePage` 与页面目录的唯一配置;本地操作只提示待接入或进入已设计页面。
|
||||
|
||||
### Task 4: 补齐世系与家族内容模块
|
||||
|
||||
- Create T02、T04-T08、F03-F10 的页面与路由。
|
||||
- Update T01、T03、F01、F02 的样式壳/跳转,保留当前可用逻辑。
|
||||
- 通过成员、关系、动态、谱文、相册、视频的列表/详情/表单三类母版覆盖全部状态。
|
||||
|
||||
### Task 5: 补齐人物、消息和个人中心模块
|
||||
|
||||
- Create R01-R11、N02、M02-M10 的页面与路由。
|
||||
- Update N01、M01 的样式壳/跳转。
|
||||
- 完成档案、礼仪、礼物、成长记录、消息、设置、帮助、VIP 等页面的本地展示与操作反馈。
|
||||
|
||||
### Task 6: 替换临时入口并完成全量回归
|
||||
|
||||
- Update `pages.json`、现有跳转路径、`docs/规划.md`、`docs/design/P00_页面结构与资产清单.md`,让 59 路由与页面目录一致;确认零引用后移除临时 `content-list-skeleton` 入口。
|
||||
- Run `full-page-visual-contract.ps1`、现有页面/编译审计、`git diff --check`。
|
||||
- 在 320×568、360×640、360×800、412×915 集中检查模块代表页;记录用户接下来逐页精修的起点。
|
||||
@@ -1,159 +0,0 @@
|
||||
# G01 v5 Structural Alignment 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:** Rebuild G01’s title slip and list hierarchy, and align its header, hall eave, cloud button, background, and Tabbar to the v5 reference.
|
||||
|
||||
**Architecture:** `pages/genealogy/index.vue` owns the current title slip, spacing, lower background, and new cloud asset. `GenealogyCard.vue` owns the two-row list entry. `PageHeader.vue` and `AppTabbar.vue` keep their existing APIs and receive only scoped CSS changes.
|
||||
|
||||
**Tech Stack:** uni-app Vue 3, scoped SCSS, local RGBA PNG, PowerShell static contracts.
|
||||
|
||||
## Global Constraints
|
||||
|
||||
- Android only: use rpx and flexbox; do not add CSS Grid, `gap`, `clip-path`, filters, routes, APIs, or data fields.
|
||||
- Visual source: `docs/design/screens/G01-我的家谱-紧凑版设计稿-v5-Tabbar安全区.png`.
|
||||
- Dynamic values remain Vue text; visible ornaments remain local transparent PNGs.
|
||||
- At `max-width: 340px`, hide only `更新于`.
|
||||
- Keep G-01 unchecked until HBuilderX evidence exists at `360 × 800` and `320 × 568`.
|
||||
|
||||
---
|
||||
|
||||
### Task 1: Add failing structural and asset contracts
|
||||
|
||||
**Files:**
|
||||
- Modify: `tests/g01-visual-contract.ps1`
|
||||
- Modify: `tests/g01-asset-alpha-audit.ps1`
|
||||
|
||||
**Interfaces:** Requires `create-cloud-v2.png`, `.current-summary`, `.card-main`, and `.card-title-row`; rejects the v1 asset and `.card-copy`.
|
||||
|
||||
- [ ] **Step 1: Replace the old assertions**
|
||||
|
||||
Replace v1 with v2 in both test asset lists. Add this contract block:
|
||||
|
||||
```powershell
|
||||
if ($header -notmatch 'height:\s*164rpx') { throw 'Header height does not match the approved narrow red-head proportion.' }
|
||||
if ($header -notmatch 'opacity:\s*\.29') { throw 'Header hall line-art is not visible enough for the approved eave layer.' }
|
||||
if ($tabbar -notmatch 'font-size:\s*30rpx') { throw 'Tabbar label size does not match the approved visual weight.' }
|
||||
if ($tabbar -notmatch 'width:\s*64rpx') { throw 'Tabbar icon size does not match the approved visual weight.' }
|
||||
foreach ($token in @('current-summary', 'create-cloud-v2.png')) { if ($page -notmatch $token) { throw "G-01 current panel is missing $token" } }
|
||||
foreach ($token in @('card-main', 'card-title-row', 'card-detail-row')) { if ($card -notmatch $token) { throw "G-01 list card is missing $token" } }
|
||||
if ($page -match 'create-cloud-v1\.png' -or $card -match 'card-copy') { throw 'G-01 retains a superseded visual structure.' }
|
||||
```
|
||||
|
||||
- [ ] **Step 2: Verify old code fails**
|
||||
|
||||
Run `powershell -ExecutionPolicy Bypass -File tests\g01-visual-contract.ps1`.
|
||||
|
||||
Expected: `FAIL` because v2, title-slip/list structure, and new shared sizes do not yet exist.
|
||||
|
||||
- [ ] **Step 3: Commit the failing contract**
|
||||
|
||||
```powershell
|
||||
git add tests/g01-visual-contract.ps1 tests/g01-asset-alpha-audit.ps1; git commit -m "test: define G01 v5 structural alignment"
|
||||
```
|
||||
|
||||
### Task 2: Replace the cloud ornament
|
||||
|
||||
**Files:**
|
||||
- Create: `static/assets/icons/action/create-cloud-v2.png`
|
||||
- Delete: `static/assets/icons/action/create-cloud-v1.png`
|
||||
- Modify: `pages/genealogy/index.vue`
|
||||
|
||||
**Interfaces:** v2 is a 96px RGBA transparent antique-gold horizontal cloud ornament rendered once normally and once with the existing mirror class.
|
||||
|
||||
- [ ] **Step 1: Generate and inspect v2**
|
||||
|
||||
Create one transparent-background 96px asset: two compact, symmetrical antique-gold Chinese cloud curls joined by a short fine line; no text, shadow, red fill, border, or background. The artwork fills the middle 70% of the canvas and matches the reference’s line weight.
|
||||
|
||||
- [ ] **Step 2: Install v2 and remove v1**
|
||||
|
||||
Point both button images to `/static/assets/icons/action/create-cloud-v2.png`. Set `.create-action` to `width: 350rpx`, `.create-cloud` to `74rpx × 36rpx`, `.create-action .create-icon` to `48rpx × 48rpx`, and its text to `34rpx`. Run `rg -n 'create-cloud-v1\.png' -g '!unpackage/**'`; expected no output. Remove v1 only after this check.
|
||||
|
||||
- [ ] **Step 3: Verify alpha and commit**
|
||||
|
||||
Run `powershell -ExecutionPolicy Bypass -File tests\g01-asset-alpha-audit.ps1`; expected `PASS static/assets/icons/action/create-cloud-v2.png transparent corners and visible artwork`.
|
||||
|
||||
```powershell
|
||||
git add static/assets/icons/action/create-cloud-v2.png static/assets/icons/action/create-cloud-v1.png pages/genealogy/index.vue; git commit -m "feat: replace G01 create cloud ornament"
|
||||
```
|
||||
|
||||
### Task 3: Rebuild the current title slip and list rows
|
||||
|
||||
**Files:**
|
||||
- Modify: `pages/genealogy/index.vue`
|
||||
- Modify: `components/GenealogyCard.vue`
|
||||
|
||||
**Interfaces:** Page owns `.current-summary` and full-width `.current-meta`; card owns `.card-main`, `.card-title-row`, and `.card-detail-row`. Props and `select` event stay unchanged.
|
||||
|
||||
- [ ] **Step 1: Replace current title-slip hierarchy**
|
||||
|
||||
Use this markup around the existing images and text bindings:
|
||||
|
||||
```vue
|
||||
<view class="current-summary"><view class="current-seal"><image class="current-seal-frame" src="/static/assets/icons/genealogy/seal-current-frame-v1.png" mode="scaleToFill" /><text class="current-seal-title">家谱</text></view><text class="current-name">{{ currentGenealogy.name }}</text></view><view class="current-info-divider"></view><view class="current-meta"><view class="current-meta-item"><image class="current-meta-icon" src="/static/assets/icons/common/location-v1.png" mode="aspectFit" /><text class="current-meta-item-text">{{ currentGenealogy.location }}</text></view><view class="current-meta-item"><image class="current-meta-icon" src="/static/assets/icons/common/member-meta-v1.png" mode="aspectFit" /><text class="current-meta-item-text">{{ currentGenealogy.memberCount }} 位成员</text></view><view class="current-meta-item"><image class="current-meta-icon" src="/static/assets/icons/common/admin-v1.png" mode="aspectFit" /><text class="current-meta-item-text">管理员</text></view></view>
|
||||
```
|
||||
|
||||
Delete `.current-copy`. Use `.current-slip { display: block; min-height: 268rpx; padding: 30rpx 34rpx 28rpx; }`, `.current-summary { display: flex; align-items: center; }`, `.current-meta { display: flex; justify-content: space-between; }`, and `.current-meta-item { margin: 0; }`.
|
||||
|
||||
- [ ] **Step 2: Replace the list’s split columns**
|
||||
|
||||
Use this layout after the existing seal:
|
||||
|
||||
```vue
|
||||
<view class="card-main"><view class="card-title-row"><text class="card-name">{{ genealogy.name }}</text><view class="card-side"><text class="card-role">{{ role }}</text><image class="card-chevron" src="/static/assets/icons/common/chevron-right-v2.png" mode="aspectFit" /></view></view><view class="card-detail-row"><view class="card-metas"><view class="card-meta-item"><image class="card-meta-icon" src="/static/assets/icons/common/location-v1.png" mode="aspectFit" /><text class="card-meta">{{ genealogy.location }}</text></view><view class="card-meta-item"><image class="card-meta-icon" src="/static/assets/icons/common/member-meta-v1.png" mode="aspectFit" /><text class="card-meta">{{ genealogy.memberCount }} 位成员</text></view></view><view class="card-updated"><text>更新于 {{ genealogy.updatedAt }}</text></view></view></view>
|
||||
```
|
||||
|
||||
Use `.card-main { display: flex; min-width: 0; flex: 1; flex-direction: column; }`, `.card-title-row { display: flex; align-items: center; justify-content: space-between; }`, and remove the fixed-width `.card-side` column. Preserve `.card-updated { display: none; }` at 340px.
|
||||
|
||||
- [ ] **Step 3: Reduce spacing and expand landscape coverage**
|
||||
|
||||
Set `.genealogy-content` to `padding: 24rpx 32rpx 176rpx`; set `.page-footer-landscape` to `bottom: 112rpx`, `height: 480rpx`, and `opacity: 0.5`. Reduce only existing shortcut/list margins; do not alter handlers or states.
|
||||
|
||||
- [ ] **Step 4: Verify and commit**
|
||||
|
||||
Run `powershell -ExecutionPolicy Bypass -File tests\g01-visual-contract.ps1`; expected `PASS G-01 visual contract`.
|
||||
|
||||
```powershell
|
||||
git add pages/genealogy/index.vue components/GenealogyCard.vue; git commit -m "feat: restructure G01 information hierarchy"
|
||||
```
|
||||
|
||||
### Task 4: Calibrate shared shell, document, and verify
|
||||
|
||||
**Files:**
|
||||
- Modify: `components/PageHeader.vue`
|
||||
- Modify: `components/AppTabbar.vue`
|
||||
- Modify: `docs/design/G01_我的家谱_设计记录.md`
|
||||
- Modify: `docs/规划.md`
|
||||
|
||||
**Interfaces:** Header events and Tabbar routes remain unchanged; docs record implementation without checking off G-01.
|
||||
|
||||
- [ ] **Step 1: Implement narrow header and visible eave**
|
||||
|
||||
Set `.page-header--root` to `height: 164rpx`. Set `.header-hall` to `bottom: -2rpx`, `left: -48rpx`, `width: 476rpx`, `height: 166rpx`, and `opacity: .29`. Keep all click targets at least `88rpx` high.
|
||||
|
||||
- [ ] **Step 2: Compact the Tabbar while increasing its visual weight**
|
||||
|
||||
Set `.app-tabbar` to `height: 112rpx`, `.tab-item` padding to `4rpx 0`, `.tab-icon` to `64rpx × 64rpx`, and `.tab-label` to `30rpx`. Preserve the safe area and active/default assets.
|
||||
|
||||
- [ ] **Step 3: Record and run focused checks**
|
||||
|
||||
Append a dated record covering the new current slip, list rows, header/eave, compact spacing, landscape, and v2 cloud. Leave G-01 unchecked in `docs/规划.md`. Then run:
|
||||
|
||||
```powershell
|
||||
powershell -ExecutionPolicy Bypass -File tests\g01-visual-contract.ps1; powershell -ExecutionPolicy Bypass -File tests\g01-asset-alpha-audit.ps1; powershell -ExecutionPolicy Bypass -File tests\compile-audit.ps1; powershell -ExecutionPolicy Bypass -File tests\uni-scss-injection.ps1; powershell -ExecutionPolicy Bypass -File tests\vue3-entry.ps1
|
||||
```
|
||||
|
||||
Expected: five `PASS` results. Capture HBuilderX at `360 × 800` and `320 × 568`; only a direct v5 comparison can complete G-01.
|
||||
|
||||
- [ ] **Step 4: Commit**
|
||||
|
||||
```powershell
|
||||
git add components/PageHeader.vue components/AppTabbar.vue docs/design/G01_我的家谱_设计记录.md docs/规划.md; git commit -m "feat: align G01 shared visual shell"
|
||||
```
|
||||
|
||||
## Plan self-review
|
||||
|
||||
- Task 1 locks every structural and asset change before runtime edits.
|
||||
- Task 2 replaces only the mismatched cloud asset and removes its old path.
|
||||
- Task 3 covers title-slip/list structure, compact spacing, and landscape coverage.
|
||||
- Task 4 covers header/eave, Tabbar, docs, static checks, and HBuilderX evidence.
|
||||
@@ -1,366 +0,0 @@
|
||||
# 家谱 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 小屏上成立的家祠卷轴界面。
|
||||
|
||||
**Architecture:** A01、G01 是唯一的视觉源,不把它们当作可以随意模仿的截图,而是提炼为“完整图片资产承担可见外观,Vue/CSS 只承担布局、文字和状态”的设计系统。每个模块先完成一张可截图验收的代表页,再将已确认的面板、按钮、列表或状态结构复用到同模块;不得用 `ModulePage.vue` 的单一通用卡片替代不同任务的页面设计。
|
||||
|
||||
**Tech Stack:** Vue 3、`<script setup>`、uni-app、SCSS、uni-app 原生 `image/input/textarea/button`、现有 PowerShell 合同审计、Product Design(`index`、`user-context`、`audit`、`image-to-code`)和 ImageGen(仅为缺失的最终图片资产生成)。
|
||||
|
||||
## Global Constraints
|
||||
|
||||
- 用户已经验收 A01 启动/登录引导与 G01 我的家谱;这两页的可见结果冻结,不能“顺手优化”。
|
||||
- 不新增路由、后端接口、依赖、登录逻辑或 Android 打包范围;只做已存在页面的视觉和必要的页面内交互保持。
|
||||
- 可见的主按钮、次按钮、题签、卡片边框、分隔纹和云纹必须使用真实图片资产;禁止 CSS 色块、`border`、伪元素、SVG 或文字符号拼出最终装饰。
|
||||
- 只使用用户正在使用的 Chrome 进行 Product Design 截图;没有可用的浏览器捕获能力时,不得把静态代码检查说成视觉验收。
|
||||
- 所有新资产先独立检查透明属性、原图尺寸和显示比例;禁止拉伸 A01 两个约 4.49:1 的按钮皮肤。
|
||||
- 所有视觉页面在 H5 的 320×568、360×640、360×800、412×915 预览;模块收尾前在 HBuilderX/Android 至少复核 360×800、412×915。
|
||||
- 不执行 `git add`、`git commit`、`git push`、上传或覆盖未知改动;用户自行处理 Git。
|
||||
|
||||
---
|
||||
|
||||
## 已确认的视觉基准与当前判断
|
||||
|
||||
### A01 提炼出的规则
|
||||
|
||||
- 上方使用完整朱砂祠堂页头,品牌谱印居中;主内容从纸面中段开始,留白有节奏,不让背景压住任务。
|
||||
- 标题是画面主角:大号楷体墨褐字、左右小云纹、上下金线/如意结,副文案只承担解释。
|
||||
- 两个操作都是完整皮肤:朱砂主按钮、宣纸次按钮;按钮字体、图标和边角纹样都保持完整,不能缩成普通表单按钮。
|
||||
- 淡墨山水只压在背景层,底部成为收束,不能侵入输入内容或降低对比度。
|
||||
|
||||
### G01 提炼出的规则
|
||||
|
||||
- 首页先给“当前家谱”一张有分量的双线题签卡,再给功能快捷入口和列表;信息优先级非常清楚。
|
||||
- 金色线条不是装饰噪音:只用于题签边框、分区线、图标和关键元信息,朱砂只标记品牌、当前项与主要操作。
|
||||
- 图标、谱印框、题签框、分区线、底部山水和 Tab 均是成套资产,形成统一密度,不是若干孤立 CSS 卡片。
|
||||
- 正文保持可读,标题/姓名用楷体形成“谱”的气质,元信息用更小但仍清楚的常规字。
|
||||
|
||||
### A02 当前截图的失败点
|
||||
|
||||
- 登录卡片窄且短,文本、标签和输入线过小;用户首先看到的是背景,而不是“我要登录”。
|
||||
- A01 的祠堂头、A02 的普通表单卡和红色按钮像三套不同完成度的设计,标题云纹也没有形成真正的层级。
|
||||
- 红色主按钮虽然替换了皮肤,但当前容器比例不匹配原图,压扁后失去 A01 的端正感。
|
||||
- 这不是“再加几个装饰”能解决的问题;必须先重新确定 A02 的任务层级、卡片占比和资产比例。
|
||||
|
||||
### 本轮选定方向
|
||||
|
||||
**家祠卷轴 · 庄重留白。** 所有页面以温暖宣纸作为底,朱砂用于品牌和唯一主操作,古金用于题签与层级,墨褐用于信息。不同任务采用不同完整面板:认证是“卷轴登录页”,家谱是“题签/谱册”,世系是“关系图谱”,内容是“档案与相册”,记录是“簿册与时间线”,设置是“折页清单”。
|
||||
|
||||
## 文件职责
|
||||
|
||||
| 文件/目录 | 责任 |
|
||||
| --- | --- |
|
||||
| `docs/design/screens/` | 只存设计基准与运行时验收图,绝不作为页面运行时图片。 |
|
||||
| `docs/design/D1_安卓视觉规范与页面壳.md` | 视觉和资产硬规则的唯一规范;本计划实施后补充已确认的组件比例。 |
|
||||
| `docs/design/P00_页面结构与资产清单.md` | 运行时资产的唯一台账;必须消除其中过时的“按钮未生成”描述。 |
|
||||
| `static/assets/foundation/` | 所有模块共享的纸纹、页头、完整按钮、全局导航和透明装饰。 |
|
||||
| `static/assets/modules/<module>/` | 仅归属于认证、家谱、世系、家族、档案或个人模块的完整面板与透明装饰。 |
|
||||
| `components/PageHeader.vue`、`components/AppTabbar.vue`、`components/GenealogyCard.vue` | 已存在稳定公共结构;只有验收后仍被至少两页使用的视觉结构才加入公共组件。 |
|
||||
| `components/ModulePage.vue`、`data/page-catalog.js` | 第一版页面覆盖工具;逐模块被确认页面替代后,只保留尚未替换路由所需内容,不把它升级成全站视觉答案。 |
|
||||
| `tests/*.ps1` | 路由、资产、行为与可见资产锚点的回归;截图是独立的人工/Product Design 验收证据。 |
|
||||
| `docs/交接记录.md` | 下一个 GPT 的唯一施工停点:已验收页、资产路径、证据、未完成模块、命令和禁区。 |
|
||||
|
||||
## Task 1: 建立真实基线与 Product Design 设计审视
|
||||
|
||||
**Files:**
|
||||
- Create: `docs/design/screens/runtime/2026-07-13/A01-360x800.png`
|
||||
- Create: `docs/design/screens/runtime/2026-07-13/G01-360x800.png`
|
||||
- Create: `docs/design/screens/runtime/2026-07-13/A02-before-360x800.png`
|
||||
- Create: `docs/design/2026-07-13-A01-G01-A02-视觉审视.md`
|
||||
- Modify: `docs/规划.md`
|
||||
- Modify: `docs/交接记录.md`
|
||||
|
||||
**Consumes:** 冻结图 `docs/design/screens/A01-启动登录引导-栅格验收-412x915.png`、`docs/design/screens/G01-我的家谱-紧凑版设计稿-v5-Tabbar安全区.png`;当前 A02 路由 `/#/pages/auth/a02-login?agreed=1`。
|
||||
|
||||
**Produces:** 可复核的同尺寸“基准/当前”截图和只针对 A02 的审视结论;没有截图不得进入 A02 实施。
|
||||
|
||||
- [ ] **Step 1: 运行 Product Design 上下文预检并读取现有视觉依据。**
|
||||
|
||||
使用 `Product Design:index` → `Product Design:user-context`。若本机 Python 或已保存的 Product Design context 不可用,在审视文档明确写“无持久上下文,依据项目内冻结图与本轮 Chrome 截图”,不要伪造已保存上下文。
|
||||
|
||||
- [ ] **Step 2: 用用户当前 Chrome 捕获并检查 360×800 的 A01、G01、A02。**
|
||||
|
||||
使用 `Product Design:audit` 的捕获顺序:观察已打开页 → 截图 → 保存 → 打开检查 → 记录。每张图必须没有 DevTools 覆盖页面主体、加载态、裁切或错误页。
|
||||
|
||||
- [ ] **Step 3: 写审视结论。**
|
||||
|
||||
`docs/design/2026-07-13-A01-G01-A02-视觉审视.md` 必须包含:视觉源、A01/G01 的 6 条可继承规则、A02 的至少 5 个可见问题、每项问题的解决策略、截图文件名、截图不能验证的限制。不得宣称无障碍完全合规。
|
||||
|
||||
- [ ] **Step 4: 纠正文档事实。**
|
||||
|
||||
在 `docs/规划.md` 和 `docs/交接记录.md` 中明确:只有 A01、G01 用户验收;`ModulePage` 是第一版覆盖而非最终视觉;A02 当前未验收;P00 中“A01 按钮尚未生成”的文字过期。
|
||||
|
||||
- [ ] **Step 5: 检查。**
|
||||
|
||||
运行:`powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/full-page-visual-contract.ps1`。
|
||||
|
||||
预期:`FULL-PAGE-VISUAL-CONTRACT PASS`。再运行 `git diff --check`,预期仅允许换行符警告,不允许空白错误。
|
||||
|
||||
## Task 2: 固化 A02 视觉合同与所需资产,而不是继续堆 CSS
|
||||
|
||||
**Files:**
|
||||
- Create: `docs/design/A02_账号登录_设计记录.md`
|
||||
- Create: `static/assets/modules/auth/opaque/a02-login-panel.png`
|
||||
- Create only if A01 皮肤无法按原比例容纳登录区: `static/assets/modules/auth/opaque/a02-primary-button.png`
|
||||
- Create only if A01 次按钮无法按原比例容纳辅助操作: `static/assets/modules/auth/opaque/a02-secondary-button.png`
|
||||
- Create: `tests/a02-asset-alpha-audit.ps1`
|
||||
- Modify: `docs/design/P00_页面结构与资产清单.md`
|
||||
|
||||
**Consumes:** Task 1 的已接受截图、A01 标题/云纹/祠堂/按钮资产和 D1 规则。
|
||||
|
||||
**Produces:** A02 的单一资产合同:完整登录面板、正确比例的完整按钮以及每个资产的路径、原图尺寸、显示比例、透明属性和引用位置。
|
||||
|
||||
- [ ] **Step 1: 写 A02 设计记录,不写代码。**
|
||||
|
||||
记录必须把 A02 固定为:同 A01 高度的祠堂头;头下为可见主任务标题;完整卷轴/题签面板承载两个 Tab、输入区和辅助操作;底部山水只在表单后留白出现;主按钮按原图比例显示且高度不低于 88rpx。记录 A02 不新增微信、真实短信或后端登录。
|
||||
|
||||
- [ ] **Step 2: 为缺失的可见面板生成真实图片资产。**
|
||||
|
||||
使用 `Product Design:image-to-code` 所依据的 A01/G01 视觉源和 `imagegen`。面板必须是完整不透明 PNG,包含自身纸面纹理、双金线、角纹;不要生成整页图、截图切片、文字或不可替换的表单字段。透明云纹、图标仍使用已有 PNG。
|
||||
|
||||
- [ ] **Step 3: 先写并运行红灯资产审计。**
|
||||
|
||||
`tests/a02-asset-alpha-audit.ps1` 至少验证:资产存在;完整面板四角不是透明;若生成 A02 按钮,四角也不是透明;原图宽高比与页面显示宽高比误差不超过 3%;透明资产仍保留 alpha 像素。先运行脚本,预期失败原因只能是“资产尚不存在”。
|
||||
|
||||
- [ ] **Step 4: 生成并检查资产后转绿。**
|
||||
|
||||
运行:`powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a02-asset-alpha-audit.ps1`。
|
||||
|
||||
预期:`A02-ASSET-ALPHA-AUDIT PASS`。然后将所有最终路径、用途、尺寸写入 P00,候选图不进入 `static/assets/`。
|
||||
|
||||
## Task 3: 将 A02 做成认证模块的已验收样板
|
||||
|
||||
**Files:**
|
||||
- Modify: `pages/auth/a02-login.vue`
|
||||
- Modify: `tests/a01-a02-ui-contract.ps1`
|
||||
- Modify: `docs/design/A02_账号登录_设计记录.md`
|
||||
- Create: `docs/design/screens/runtime/2026-07-13/A02-after-320x568.png`
|
||||
- Create: `docs/design/screens/runtime/2026-07-13/A02-after-360x640.png`
|
||||
- Create: `docs/design/screens/runtime/2026-07-13/A02-after-360x800.png`
|
||||
- Create: `docs/design/screens/runtime/2026-07-13/A02-after-412x915.png`
|
||||
|
||||
**Consumes:** Task 2 的资产合同。保留现有双 Tab、协议回跳判断、忘记密码跳 A05、字段校验与 toast。
|
||||
|
||||
**Produces:** 唯一可用于 A03–A05 的认证表单样板;页面不是 `ModulePage` 的变体。
|
||||
|
||||
- [ ] **Step 1: 先写红灯页面合同。**
|
||||
|
||||
在 `tests/a01-a02-ui-contract.ps1` 增加 A02 锚点:完整面板图片、正确比例按钮图片、`login-panel` 的可访问文字层、两个真实 input、两个真实 Tab、A05 跳转。拒绝 A02 主面板/主按钮用 `border`、`background: $brand-red`、伪元素拼出最终外观。运行该脚本,预期因新资产或新锚点缺失失败。
|
||||
|
||||
- [ ] **Step 2: 最小实现。**
|
||||
|
||||
A02 模板只保留“背景 → 同 A01 祠堂页头 → 页面标题 → 完整面板 → 表单 → 主按钮 → 底部背景”的层级。图片使用绝对底层,输入、Tab、标题和按钮文字使用相对文字层;不要把任何文字烘焙进图片。表单面板宽度跟随安全边距,按钮按资产比例设置高度,不能 `scaleToFill` 压扁。
|
||||
|
||||
- [ ] **Step 3: 检查逻辑和四尺寸。**
|
||||
|
||||
运行:
|
||||
|
||||
```powershell
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a01-a02-ui-contract.ps1
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a02-asset-alpha-audit.ps1
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/compile-audit.ps1
|
||||
```
|
||||
|
||||
预期:三个脚本均 PASS。再用 `Product Design:audit` 检查四尺寸截图:320 宽不横向裁切;360×640 能滚动且主按钮可达;360×800 卡片仍为主角;412×915 底部山水不侵入输入区。
|
||||
|
||||
- [ ] **Step 4: 用户视觉门。**
|
||||
|
||||
只在用户确认 A02 后,将 `docs/规划.md` 状态更新为“认证样板已验收”。用户未确认时,记录为“实现完成,视觉待验收”,不得假称完成。
|
||||
|
||||
## Task 4: 完成认证模块 A04–A06
|
||||
|
||||
**Files:**
|
||||
- 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 A04–A06 entry is removed from the temporary motherplate
|
||||
- Modify: `tests/full-page-visual-contract.ps1`
|
||||
- Modify: `docs/design/P00_页面结构与资产清单.md`
|
||||
|
||||
**Consumes:** 已验收的 A02 面板、按钮和文字层级。
|
||||
|
||||
**Produces:** 认证五页同一入口体验:登录、注册、重设和结果状态各有对应任务,不能仍显示泛化的“功能完善中”。
|
||||
|
||||
- [ ] **Step 1: 分别写四条红灯合同。**
|
||||
|
||||
A04 有手机号、密码、确认密码和协议提示;A05 有手机号、验证码、新密码;A06 有状态图标、说明和明确返回登录操作,并承接微信授权取消、失败与受限。合同只验证存在的交互和资产锚点,不宣称后端已接入。
|
||||
|
||||
- [ ] **Step 2: 用 A02 的已确认结构分别实现。**
|
||||
|
||||
只在两页以上完全相同的面板结构出现时创建 `AuthFormPanel.vue`;否则页面内实现。每页使用同一头部、卡片比例、输入高度、按钮比例和淡墨留白,但标题、辅助文案、状态图和行动文案按任务不同。
|
||||
|
||||
- [ ] **Step 3: 模块截图与回归。**
|
||||
|
||||
对 A04、A05、A06 至少各保存 360×800 一张截图;运行认证合同、`compile-audit.ps1`、`git diff --check`。A01 不改动且至少复核 412×915。
|
||||
|
||||
## Task 5: 完成家谱模块 G02–G12
|
||||
|
||||
**Files:**
|
||||
- Modify: `pages/genealogy/g02-empty-genealogies.vue`, `g03-create-genealogy.vue`, `g04-first-ancestor.vue`, `g05-genealogy-overview.vue`, `g06-search-genealogies.vue`, `g07-search-result.vue`, `g08-join-application.vue`, `g09-my-applications.vue`, `g10-application-review.vue`, `g11-genealogy-settings.vue`, `g12-generation-poems.vue`
|
||||
- Create as needed after Product Design review: `static/assets/modules/genealogy/opaque/*.png`, `static/assets/modules/genealogy/transparent/*.png`
|
||||
- Modify: `components/GenealogyCard.vue`, `components/ModulePage.vue`, `data/page-catalog.js` only when a confirmed G page replaces the temporary motherplate route
|
||||
- Modify: `tests/g01-visual-contract.ps1`, `tests/core-flow-contract.ps1`, `tests/full-page-visual-contract.ps1`
|
||||
- Modify: `docs/design/P00_页面结构与资产清单.md`
|
||||
|
||||
**Consumes:** G01 题签框、谱印、快捷图标、分区线、底部山水和 Tab;G01 页面本身不改。
|
||||
|
||||
**Produces:** G03(创建家谱)作为表单样板、G07(搜索结果)作为列表样板、G09(申请)作为时间线样板、G12(字辈诗)作为详情样板;其他 G 页只能复用已确认样板,不再保留通用 `ModulePage` 视觉。
|
||||
|
||||
- [ ] **Step 1: Product Design 审视 G03、G07、G09、G12 的任务和截图。**
|
||||
|
||||
明确每页首要动作分别为创建、选择、查看进度、阅读/维护;每页只用一个主操作。生成缺失的完整题签/表单/时间线面板资产前,先把显示槽尺寸写入 P00。
|
||||
|
||||
- [ ] **Step 2: 逐样板写红灯合同、实现、截图。**
|
||||
|
||||
每一类样板先有一个页面通过合同和 360×800、412×915 截图,再应用到同类页。按钮统一使用正确比例的完整朱砂或宣纸皮肤;列表和审核卡使用完整题签图,不得继续用圆角 CSS 卡片。
|
||||
|
||||
- [ ] **Step 3: 保持真实跳转。**
|
||||
|
||||
G01→G03/G05/G06/G10/G12、G05→G08/G11/G12 的现有跳转不得回退。修改每条路径时,同轮更新合同;无效旧路径不能保留。
|
||||
|
||||
- [ ] **Step 4: 回归。**
|
||||
|
||||
运行 `tests/g01-visual-contract.ps1`、`tests/core-flow-contract.ps1`、`tests/compile-audit.ps1`、`tests/full-page-visual-contract.ps1`。G01 至少复核 412×915 以证明未被公共组件改坏。
|
||||
|
||||
## Task 6: 完成世系树与成员模块 T01–T08
|
||||
|
||||
**Files:**
|
||||
- Modify: `pages/tree/t01-tree-overview.vue` through `pages/tree/t08-member-states.vue`
|
||||
- Create as needed: `static/assets/modules/tree/opaque/*.png`, `static/assets/modules/tree/transparent/*.png`
|
||||
- Modify: `components/ModulePage.vue`, `data/page-catalog.js`, `tests/core-flow-contract.ps1`, `tests/full-page-visual-contract.ps1`, `docs/design/P00_页面结构与资产清单.md`
|
||||
|
||||
**Consumes:** 已验收 G 模块的表单、题签、列表资产比例;世系图自身需要独立的关系节点和小屏状态设计。
|
||||
|
||||
**Produces:** T01 为横向世系主样板,T03 为人物档案样板,T04 为亲属表单样板,T02/T08 为明确状态样板。
|
||||
|
||||
- [ ] **Step 1: 先完成 T01 与 T03 的 Product Design 截图审视。**
|
||||
|
||||
T01 必须在小屏给出清楚的“横向查看/进入成员目录”出口,不能硬塞一张缩小关系图;T03 先突出人物、世代和关系,再给资料和操作。
|
||||
|
||||
- [ ] **Step 2: 建立真实节点、人物题签和状态资产。**
|
||||
|
||||
关系节点、状态徽记、人物题签必须使用图片资产;信息文本保留在 Vue 中。没有至少两个复用点不要抽取组件。
|
||||
|
||||
- [ ] **Step 3: 逐页替换临时母版并测试。**
|
||||
|
||||
每页保留已有编辑/查看跳转;运行 T 模块合同、编译检查和 360×800、412×915 截图验收。
|
||||
|
||||
## Task 7: 完成家族内容模块 F01–F10
|
||||
|
||||
**Files:**
|
||||
- Modify: `pages/family/f01-family-feed.vue` through `pages/family/f10-video-list.vue`
|
||||
- Create as needed: `static/assets/modules/family/opaque/*.png`, `static/assets/modules/family/transparent/*.png`
|
||||
- Modify: `components/ModulePage.vue`, `data/page-catalog.js`, `tests/core-flow-contract.ps1`, `tests/full-page-visual-contract.ps1`, `docs/design/P00_页面结构与资产清单.md`
|
||||
|
||||
**Consumes:** G01 底部导航;F01 已有动态流和现有跳转。
|
||||
|
||||
**Produces:** F01 为家族动态样板,F04 为文章档案列表,F07 为相册封面列表,F08 为照片墙,F02/F06/F09 为发布/编辑表单,F10 为未开放状态。
|
||||
|
||||
- [ ] **Step 1: 用 Product Design 先决定“内容不是家谱列表”。**
|
||||
|
||||
动态、文章、相册和视频保持纸本档案感,但各自有内容缩略、时间、作者和操作层级;不要复刻 G01 的家谱题签。
|
||||
|
||||
- [ ] **Step 2: 只生成能反复使用的内容资产。**
|
||||
|
||||
例如文章档案题签、相册封面框、媒体上传框、评论分隔纹;照片和视频先使用现实感本地 mock,不把纯色方块当最终封面。
|
||||
|
||||
- [ ] **Step 3: 保持 F01 的原有入口。**
|
||||
|
||||
F01→F04/F07/R05/R10 的现有导航继续可用;每个进入详情、编辑或上传的路径都要有可返回操作。
|
||||
|
||||
- [ ] **Step 4: 截图和回归。**
|
||||
|
||||
F01、F04、F07、F09 在四尺寸预览;其余页面至少 360×800。运行受影响流程合同、编译检查和空白检查。
|
||||
|
||||
## Task 8: 完成 R、N、M 模块
|
||||
|
||||
**Files:**
|
||||
- Modify: `pages/records/r01-people-list.vue` through `pages/records/r11-merit-records.vue`
|
||||
- Modify: `pages/notification/n01-message-center.vue`, `pages/notification/n02-message-detail.vue`
|
||||
- Modify: `pages/profile/m01-profile-home.vue` through `pages/profile/m10-about-settings.vue`
|
||||
- Create as needed: `static/assets/modules/records/*`, `static/assets/modules/notification/*`, `static/assets/modules/profile/*`
|
||||
- Modify: `components/ModulePage.vue`, `data/page-catalog.js`, `tests/core-flow-contract.ps1`, `tests/full-page-visual-contract.ps1`, `docs/design/P00_页面结构与资产清单.md`
|
||||
|
||||
**Consumes:** 已确认的列表、详情、表单、时间线和设置样板。
|
||||
|
||||
**Produces:** R 采用簿册/时间线,N 采用清楚的通知层级,M 采用个人身份与设置折页;每个模块都有自己的图标和面板密度,不能留在相同母版外观。
|
||||
|
||||
- [ ] **Step 1: R 先做人物录、礼仪活动、成长日志三类代表页。**
|
||||
|
||||
代表页分别确定人物档案、活动簿册和生命时间线资产与布局后,再完成其余 R 页。
|
||||
|
||||
- [ ] **Step 2: N 先做消息中心和详情的已读层级。**
|
||||
|
||||
未读、已读、时间和空状态必须在不靠颜色的情况下可区分;点击后的 N02 跳转保持真实。
|
||||
|
||||
- [ ] **Step 3: M 先做 M01 个人首页和 M03 安全设置。**
|
||||
|
||||
M01 是身份入口,不是普通列表;M03–M10 使用已确认的设置行/表单,而不是单一通用卡。
|
||||
|
||||
- [ ] **Step 4: 每完成一个模块立即替换对应临时母版入口。**
|
||||
|
||||
删除本轮不再使用的 `pageCatalog` 条目、导入和临时样式;运行全部受影响路由与合同,不能留下“新旧两套页面都可走”的兼容入口。
|
||||
|
||||
## Task 9: 全量视觉回归与真实交接
|
||||
|
||||
**Files:**
|
||||
- Modify: `docs/规划.md`
|
||||
- Modify: `docs/交接记录.md`
|
||||
- Modify: `docs/design/D1_安卓视觉规范与页面壳.md`
|
||||
- Modify: `docs/design/P00_页面结构与资产清单.md`
|
||||
- Create: `docs/design/视觉设计交接手册.md`
|
||||
- Modify: all affected `tests/*.ps1`
|
||||
|
||||
**Consumes:** 每个模块的已验收截图、资产台账、页面合同和实际执行结果。
|
||||
|
||||
**Produces:** 下一位 GPT 无需猜测即可继续的交接包;文档只写已经发生的事实,未用户验收的页面明确标注为待验收。
|
||||
|
||||
- [ ] **Step 1: 跑全量可自动验证项。**
|
||||
|
||||
```powershell
|
||||
Get-ChildItem tests -Filter *.ps1 | Sort-Object Name | ForEach-Object {
|
||||
& powershell.exe -NoProfile -ExecutionPolicy Bypass -File $_.FullName
|
||||
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
|
||||
}
|
||||
git diff --check
|
||||
```
|
||||
|
||||
预期:每个脚本 PASS;`git diff --check` 没有空白错误。若任何一项失败,按 `superpowers:systematic-debugging` 先复现、定位、修复并重跑,不能用改测试掩盖问题。
|
||||
|
||||
- [ ] **Step 2: 完成四尺寸视觉门。**
|
||||
|
||||
每个路由至少在 360×800 留一张验收截图;每个模块代表页还须有 320×568、360×640、360×800、412×915。将每张图的页面、尺寸、状态、通过/问题写入交接手册。
|
||||
|
||||
- [ ] **Step 3: 写交接手册。**
|
||||
|
||||
`docs/design/视觉设计交接手册.md` 必须包含:
|
||||
|
||||
- 两张冻结视觉源和其禁止改动的可见元素;
|
||||
- 每个模块的代表页、状态、截图路径与未完成项;
|
||||
- 每项最终资产的路径、`opaque/transparent` 属性、原图尺寸、显示槽和引用页面;
|
||||
- 哪些临时 `ModulePage`/`pageCatalog` 条目已经移除,哪些仍待替换;
|
||||
- 路由总数、关键跳转、可运行的检查命令;
|
||||
- 下一位 GPT 的能力清单:先读 `AGENTS.md`、D1、P00、交接;再调用 `Product Design:index`→`user-context`→`audit`,有选择的视觉源时调用 `image-to-code`,缺真实图片资产时调用 `imagegen`,每次改行为前用 TDD,完成前做视觉截图和自动回归;
|
||||
- 禁区:不动 A01/G01、不可把截图当页面资产、不可用 CSS 伪造完整装饰、不可提交/上传、不可把未验收写成已完成。
|
||||
|
||||
- [ ] **Step 4: 用户最终验收。**
|
||||
|
||||
按模块而不是一次塞 59 张截图给用户;只有用户确认的模块才在 `docs/规划.md` 勾选完成。没有用户回复时,状态保持“实现/截图完成,视觉待用户验收”。
|
||||
|
||||
## 执行顺序与停点
|
||||
|
||||
1. 先执行 Task 1–3,只做 A02,直到用户确认它是认证样板。
|
||||
2. 再执行 Task 4,完成 A 模块后更新一次交接记录。
|
||||
3. 按 Task 5 → 6 → 7 → 8 逐模块推进;任何模块出现不合格截图,先在该模块修复,不跳到下一个模块。
|
||||
4. Task 9 最后执行,不能提前把 57 页写成“验收完成”。
|
||||
|
||||
## 实施前自检
|
||||
|
||||
- 计划覆盖 59 个路由:A、G、T、F、R、N、M 均有明确代表页和替换路径。
|
||||
- 计划把 A01、G01 作为唯一视觉源,禁止全局母版继续掩盖页面差异。
|
||||
- 计划把 Product Design 截图审视、真实图片资产、自动合同、四尺寸截图和用户确认串成顺序,避免“代码 PASS 但页面不好看”。
|
||||
- 本计划不包含 Git 提交步骤,因为用户明确自行上传 Git。
|
||||
@@ -1,109 +0,0 @@
|
||||
# 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` 没有真实空白错误。
|
||||
@@ -1,70 +0,0 @@
|
||||
# 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 设计记录中标注本轮平衡修订的截图和结论。
|
||||
@@ -1,96 +0,0 @@
|
||||
# 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 开始。
|
||||
@@ -1,87 +0,0 @@
|
||||
# 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,因此将它写为已验收并冻结。
|
||||
@@ -1,117 +0,0 @@
|
||||
# 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:项目规则覆盖计划模板中的提交建议。
|
||||
@@ -1,198 +0,0 @@
|
||||
# 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 警告但无空白错误。
|
||||
@@ -1,163 +0,0 @@
|
||||
# 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 警告,不存在空白错误。
|
||||
@@ -1,215 +0,0 @@
|
||||
# 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 三态作最终审美确认。**用户已要求停止当前工作并转交到另一台电脑,禁止擅自继续。**
|
||||
@@ -1,176 +0,0 @@
|
||||
# 移除 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 已完成。
|
||||
@@ -1,37 +0,0 @@
|
||||
# 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、页面内模拟数据、现有完整位图资产、PowerShell 静态契约、Chrome DevTools Protocol 冒烟。
|
||||
|
||||
## Global Constraints
|
||||
|
||||
- 仅修改 T01/T02 收敛涉及的文件,不触碰已验收页面可见效果。
|
||||
- 位图承载完整画布、节点、信息条、边框和装饰;CSS 只负责布局、文字、状态与交互。
|
||||
- 不执行 Git 暂存、提交、推送、重置或 worktree 操作。
|
||||
|
||||
### Task 1: TDD 契约(RED)
|
||||
|
||||
- [x] 创建 `tests/t01-tree-state-contract.ps1` 与 `tests/t01-tree-state-runtime-smoke.js`。
|
||||
- [x] 静态契约要求 T02 路由/文件不存在,T01 含 `tree|landscape|empty|error`、三类完整位图、T03/T04 跳转和无 CSS 表面;运行冒烟要求三种查询状态及 `genealogyId=1001` 节点跳转。
|
||||
- [x] 运行两个新测试,确认当前实现因 T02 仍存在和 T01 缺少状态节点而红灯。
|
||||
|
||||
### Task 2: 位图资产复用
|
||||
|
||||
- [x] 审视现有完整资产后,复用 `g03-create-flow-panel.png`、`g06-search-input-wide.png` 与 `application-status-card.png`,不生成语义重复资产。
|
||||
- [x] 在 P00 登记 T01 与后续 T 页面引用。
|
||||
|
||||
### Task 3: T01 同页状态与 T02 删除(GREEN)
|
||||
|
||||
- [x] 修改 `pages/tree/t01-tree-overview.vue`:由状态和页面内模拟成员确定 `treeState`;画布、节点、信息条使用完整位图;保留 T03/T04/T06/T07 跳转。
|
||||
- [x] 从 `pages.json` 删除 `pages/tree/t02-tree-states`,删除文件并移除 `page-catalog.js` 的 `t02`。
|
||||
- [x] 运行新契约和运行冒烟转绿。
|
||||
|
||||
### Task 4: 收口
|
||||
|
||||
- [x] 全量路由契约和 A03 路由计数更新为 54;当前文档同步 T02→T01 已完成。
|
||||
- [x] 截图并审视 T01 tree/landscape/empty/error 与 412×915 tree;相关静态契约和冒烟通过。最终全量 `git diff --check` 留到所有模块候选完成前统一执行。
|
||||
@@ -1,102 +0,0 @@
|
||||
# A01 资产优先设计落地计划
|
||||
|
||||
> 本计划由 `superpowers:writing-plans` 生成并在当前会话内直接执行。遵守用户最新约束:不使用子代理、不使用 worktree、不执行 `git add/commit/push/reset/checkout`,资产与设计验收通过前不修改 A01 页面代码。
|
||||
|
||||
**目标:** 以冻结的密码/验证码视觉真源为依据,制作一套可投入 uni-app Android 的 A01 最终资产,并使用同一批资产组装可编辑 Figma 设计。
|
||||
|
||||
**架构:** 密码与验证码状态共用唯一的背景、宗祠、卷轴、纹理、按钮和排版组件,仅切换标签、第二输入行和辅助操作。复杂装饰使用最终 PNG,文字、输入框布局、点击区域和状态切换保持可编辑;Figma 和应用后续必须引用相同资产文件与尺寸规则。
|
||||
|
||||
**技术栈:** Figma Design、Figma Plugin API、ImageGen 位图资产、uni-app/Vue、Android WebView/HBuilderX。
|
||||
|
||||
## 全局约束
|
||||
|
||||
- 唯一 Logo:`static/assets/foundation/transparent/brand-seal.png`;后续 Android 桌面图标也以它为源。
|
||||
- 密码状态:左侧使用 `static/assets/modules/auth/transparent/a01-icon-lock-v1.png`,右侧是眼睛按钮,“忘记密码”在输入横线下方右对齐。
|
||||
- 验证码状态:使用“消息气泡+三点”图标和“获取验证码”,不显示眼睛或忘记密码。
|
||||
- 除 `brand-seal` 与 `a01-icon-lock-v1` 外,A01 可见装饰资产全部制作新版本;旧文件保留但最终不引用。
|
||||
- 不使用原生 UniApp 提示组件作为最终视觉;本阶段不做接口对接。
|
||||
- 基础版本只覆盖当前浅色国风主题,以及 320×568、360×640、360×800、412×915;深色与跟随系统延期到下一版本。
|
||||
- 设计审核必须基于真实截图;H5 仅为候选证据,最终需要 Android/HBuilderX 复核。
|
||||
|
||||
---
|
||||
|
||||
### 任务 1:冻结视觉真源
|
||||
|
||||
**文件:**
|
||||
|
||||
- 密码与验证码的可恢复源:`docs/design/assets/a01-vnext/source/A01-layered-source-v1.psd`
|
||||
- 图层与导出清单:`docs/design/assets/a01-vnext/source/a01-psd-manifest.json`
|
||||
|
||||
**验收:**
|
||||
|
||||
- 密码稿 SHA256:`A93F201349C1BB1F2DFAB50BA0B5372A6FC1C4762661326ADE17AA29F31960EF`
|
||||
- 验证码稿 SHA256:`31D023A523DA8CA25DF00736793FAF40086B5B46F32664B724E570F432BF9D9E`
|
||||
- 两张均为 `841×1870`,后续按 `412×915` 等比参考,不从聊天缩略图反推。
|
||||
|
||||
### 任务 2:建立 Figma 视觉真源与资产板
|
||||
|
||||
**目标文件:** [A01 登录页重设计(可编辑)](https://www.figma.com/design/fWhC0maHCxh5STQsjlOoWw)
|
||||
|
||||
**页面结构:**
|
||||
|
||||
- `00 视觉真源`:密码与验证码全尺寸参考图并排放置,标注文件名和 SHA256。
|
||||
- `01 资产板`:Logo、宗祠、卷轴分片、纹理、标题纹样、按钮分片、输入图标、Android 图标安全区。
|
||||
- `02 页面状态`:密码隐藏、密码显示、验证码默认、验证码倒计时。
|
||||
- `03 响应式验收`:当前浅色国风主题的四档尺寸状态。
|
||||
|
||||
**验收:** 每个 Figma 写入步骤返回节点 ID,并对新增 Frame 生成截图检查裁切、比例、文字和图标。
|
||||
|
||||
### 任务 3:制作新资产
|
||||
|
||||
**候选目录:** `docs/design/assets/a01-vnext/candidates/`
|
||||
|
||||
**最终目录:**
|
||||
|
||||
- `static/assets/modules/auth/opaque/`
|
||||
- `static/assets/modules/auth/transparent/`
|
||||
- `static/assets/foundation/opaque/`
|
||||
|
||||
**资产边界:**
|
||||
|
||||
- 宗祠头图:独立不透明宽图,包含 `brand-seal` 安全槽,但 Logo 本体仍单独引用。
|
||||
- 卷轴:顶部卷轴、中央纸纹理、左右边框、底部卷轴分离,禁止整张卷轴跨尺寸压缩。
|
||||
- 按钮:左端、中部可延展纹理、右端分离,避免边角被拉伸。
|
||||
- 图标:手机、开眼、闭眼保留瞳孔、消息气泡三点制作新版本;锁继续使用 `a01-icon-lock-v1.png`。
|
||||
- Android 图标:以 `brand-seal.png` 生成自适应图标前景、安全区预览与纯色背景方案,不改变 Logo 本体。
|
||||
|
||||
**验收:** 检查像素尺寸、ARGB/Alpha、透明边角、主体覆盖率、边缘杂色和小尺寸可读性;不合格资产不进入 `static`。
|
||||
|
||||
### 任务 4:用最终资产组装可编辑状态
|
||||
|
||||
**Figma Frame:**
|
||||
|
||||
- `A01 / Password / Hidden / 412×915`
|
||||
- `A01 / Password / Visible / 412×915`
|
||||
- `A01 / SMS / Default / 412×915`
|
||||
- `A01 / SMS / Countdown / 412×915`
|
||||
|
||||
**状态差异:**
|
||||
|
||||
- 密码隐藏:掩码文本、闭眼保留瞳孔。
|
||||
- 密码显示:明文文本、开眼图标。
|
||||
- 验证码默认:气泡三点图标、“获取验证码”。
|
||||
- 验证码倒计时:气泡三点图标、不可点击倒计时文案。
|
||||
|
||||
**验收:** 背景和共用资产必须为同一组件实例;切换状态时公共区域位置不得漂移。
|
||||
|
||||
### 任务 5:设计验收后进入代码实现
|
||||
|
||||
**后续才允许修改:**
|
||||
|
||||
- `pages/auth/a01-entry.vue`
|
||||
- A01 最终资产引用
|
||||
- `manifest.json` 或 HBuilderX Android 图标配置
|
||||
- `tests/a01-a02-ui-contract.ps1`
|
||||
|
||||
**验证命令:**
|
||||
|
||||
```powershell
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a01-a02-ui-contract.ps1
|
||||
```
|
||||
|
||||
**完成标准:** 合同测试通过,四档 H5 截图通过视觉比较,并取得 Android/HBuilderX 真机或模拟器截图;在此之前不得声明 A01 完成或验收通过。
|
||||
@@ -1,199 +0,0 @@
|
||||
# A01 纯代码资产流水线与页面落地实施计划
|
||||
|
||||
> **For agentic workers:** REQUIRED SUB-SKILL: Use `superpowers:executing-plans` to implement this plan task-by-task. 本项目明确禁止 worktree、子代理和任何 Git 提交操作,执行时以项目规则为准。
|
||||
|
||||
**Goal:** 不依赖 Photoshop,用同一份清单和源资产生成 A01 正式 PNG、设计预览与状态联系表,并将选定视觉一比一落到 `pages/auth/a01-entry.vue`。
|
||||
|
||||
**Architecture:** `design-pipeline/manifests/a01.json` 是 A01 源资产、正式输出、状态和尺寸的唯一机器可读所有者。Node.js 调用 Sharp 完成缩放、PNG 优化、同源预览与联系表生成;A01 页面只引用确认后的正式资产,真实运行截图仍是最终视觉证据。
|
||||
|
||||
**Tech Stack:** Node.js 24、Sharp、PowerShell 契约测试、Vue 3 `<script setup>`、uni-app、SCSS。
|
||||
|
||||
## Global Constraints
|
||||
|
||||
- 当前只修改 A01、新流水线、A01 测试和 A01 证据,不修改其他页面。
|
||||
- 基础版本只支持当前浅色国风主题;深色与跟随系统延期到下一版本。
|
||||
- 保留全部 Photoshop、PSD、候选图、未跟踪文件和用户已有修改,不删除、不移动、不覆盖。
|
||||
- 不接接口;密码、短信、微信和行为验证只实现当前页面样式与 Mock 状态。
|
||||
- `brand-seal.png` 与 `a01-icon-lock-v1.png` 继续作为唯一正式来源,不重绘。
|
||||
- 闭眼图标保留中心瞳孔;短信图标是消息气泡并且仅有三个点。
|
||||
- 320×568 下核心入口同屏且页面不依赖纵向滚动;同时检查 360×640、360×800、412×915。
|
||||
- 所有可见提示使用项目自定义组件,不使用原生 UniApp Toast、Modal、Loading 或 ActionSheet。
|
||||
- 不执行 `git add`、commit、push、reset、checkout、上传、worktree 或多代理。
|
||||
|
||||
---
|
||||
|
||||
### Task 1: 建立纯代码流水线契约
|
||||
|
||||
**Files:**
|
||||
- Create: `tests/a01-code-pipeline-contract.ps1`
|
||||
- Create later: `design-pipeline/package.json`
|
||||
- Create later: `design-pipeline/manifests/a01.json`
|
||||
- Create later: `design-pipeline/scripts/build-a01.mjs`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: 当前工作区和 A01 规格。
|
||||
- Produces: 缺少入口、清单、脚本或正式输出时失败,全部满足时输出 `A01-CODE-PIPELINE-CONTRACT PASS`。
|
||||
|
||||
- [ ] **Step 1: 写入失败契约测试**
|
||||
|
||||
测试必须断言:入口文件存在;清单 `schemaVersion=1`;逻辑画布为 412×915;状态包含 `password-hidden`、`password-visible`、`sms-default`、`sms-countdown`;正式输出全部位于 `static/assets/modules/auth/`;运行资产不存在 Photoshop/PSD/整页截图依赖;每个正式 PNG 存在且尺寸、Alpha 和最大体积符合清单。
|
||||
|
||||
- [ ] **Step 2: 运行 RED**
|
||||
|
||||
```powershell
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a01-code-pipeline-contract.ps1
|
||||
```
|
||||
|
||||
Expected: FAIL,首个原因是缺少 `design-pipeline/package.json` 或 `design-pipeline/manifests/a01.json`。
|
||||
|
||||
---
|
||||
|
||||
### Task 2: 实现 A01 同源资产生成器
|
||||
|
||||
**Files:**
|
||||
- Create: `design-pipeline/package.json`
|
||||
- Create: `design-pipeline/package-lock.json`(由 `npm.cmd install` 生成)
|
||||
- Create: `design-pipeline/manifests/a01.json`
|
||||
- Create: `design-pipeline/scripts/build-a01.mjs`
|
||||
- Generate: `design-pipeline/generated/a01/`
|
||||
- Generate: `static/assets/modules/auth/opaque/a01-vnext-header-v1.png`
|
||||
- Generate: `static/assets/modules/auth/transparent/a01-vnext-scroll-v1.png`
|
||||
- Generate: `static/assets/modules/auth/transparent/a01-vnext-title-ornament-v1.png`
|
||||
- Generate: `static/assets/modules/auth/transparent/a01-vnext-divider-v1.png`
|
||||
- Generate: `static/assets/modules/auth/opaque/a01-vnext-primary-button-v1.png`
|
||||
- Generate: `static/assets/modules/auth/opaque/a01-vnext-secondary-button-v1.png`
|
||||
- Generate: `static/assets/modules/auth/transparent/a01-vnext-phone-v1.png`
|
||||
- Generate: `static/assets/modules/auth/transparent/a01-vnext-eye-open-v1.png`
|
||||
- Generate: `static/assets/modules/auth/transparent/a01-vnext-eye-closed-pupil-v1.png`
|
||||
- Generate: `static/assets/modules/auth/transparent/a01-vnext-sms-three-dots-v1.png`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: `docs/design/assets/a01-vnext/candidates/*.png`、现有 `brand-seal.png`、现有锁和微信资产。
|
||||
- Produces: 正式槽位尺寸 PNG、四尺寸预览、密码/短信联系表及 `build-report.json`。
|
||||
|
||||
- [ ] **Step 1: 声明最小依赖**
|
||||
|
||||
`design-pipeline/package.json` 只包含 `sharp` 和 `build:a01` 命令,不引入前端框架或通用构建系统。
|
||||
|
||||
- [ ] **Step 2: 安装 Sharp**
|
||||
|
||||
```powershell
|
||||
Set-Location design-pipeline
|
||||
npm.cmd install
|
||||
```
|
||||
|
||||
Expected: 生成锁文件,`npm.cmd audit` 不报告高危漏洞。
|
||||
|
||||
- [ ] **Step 3: 写入 A01 清单**
|
||||
|
||||
清单明确每个源文件、正式输出、目标像素尺寸、Alpha、最大体积、复用角色和四个页面状态;正式资源不得指向 `review/page-v2` 的整页 PNG 或 PSD。
|
||||
|
||||
- [ ] **Step 4: 实现生成脚本**
|
||||
|
||||
脚本必须:校验所有源文件;拒绝源输出路径越出工作区;用 Sharp 生成版本化 PNG;用同一正式 PNG 组合 412×915 密码/短信设计预览;生成四尺寸检查图;输出尺寸、Alpha、SHA256 和体积报告;任一失败返回非零退出码。
|
||||
|
||||
- [ ] **Step 5: 生成并验证 GREEN**
|
||||
|
||||
```powershell
|
||||
npm.cmd --prefix design-pipeline run build:a01
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a01-code-pipeline-contract.ps1
|
||||
```
|
||||
|
||||
Expected: `A01-CODE-PIPELINE BUILD PASS` 与 `A01-CODE-PIPELINE-CONTRACT PASS`。
|
||||
|
||||
---
|
||||
|
||||
### Task 3: 先收紧 A01 页面契约
|
||||
|
||||
**Files:**
|
||||
- Modify: `tests/a01-a02-ui-contract.ps1`
|
||||
- Modify later: `pages/auth/a01-entry.vue`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: Task 2 的正式资产文件名与 A01 验收合同。
|
||||
- Produces: 页面没有引用新资产、仍依赖旧头部/旧卷轴、缺少小屏同屏结构或恢复原生提示时失败。
|
||||
|
||||
- [ ] **Step 1: 更新页面契约断言**
|
||||
|
||||
要求 A01 引用全部 `a01-vnext-*` 正式资源、`brand-seal.png`、现有锁、闭眼瞳孔和短信三点图标;禁止引用 `a01-login-header-exact-v2.png`、旧卷轴框、PSD、设计预览和整页截图;要求密码/短信独立状态、协议页内错误、验证码倒计时文案和自定义行为验证层继续存在。
|
||||
|
||||
- [ ] **Step 2: 运行 RED**
|
||||
|
||||
```powershell
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a01-a02-ui-contract.ps1
|
||||
```
|
||||
|
||||
Expected: FAIL,原因是 A01 尚未引用 `a01-vnext-header-v1.png`。
|
||||
|
||||
---
|
||||
|
||||
### Task 4: 一比一落地 A01 页面
|
||||
|
||||
**Files:**
|
||||
- Modify: `pages/auth/a01-entry.vue`
|
||||
- Test: `tests/a01-a02-ui-contract.ps1`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: Task 2 正式资产、选定联系表和 Task 3 契约。
|
||||
- Produces: 可交互的密码/短信登录页;首次密码态、上次方式恢复、眼睛切换、验证码按钮状态、协议错误、行为验证层和自定义反馈保持可用。
|
||||
|
||||
- [ ] **Step 1: 替换视觉壳**
|
||||
|
||||
页面结构固定为宗祠头部、独立 `brand-seal`、完整卷轴容器、标题装饰、Tab、两行表单、主按钮、其他登录方式、微信入口、注册和协议。所有文字保持 DOM 文本和真实控件,不把整页预览当背景。
|
||||
|
||||
- [ ] **Step 2: 保持两种登录状态**
|
||||
|
||||
密码态使用现有锁、显示/隐藏眼睛和横线下方忘记密码;短信态使用消息气泡三点图标、验证码输入和“获取验证码/Ns 后重试”位置,不显示眼睛或忘记密码。
|
||||
|
||||
- [ ] **Step 3: 实现四尺寸响应式布局**
|
||||
|
||||
默认以 412×915 为视觉基准;对高度不超过 640px 的设备压缩宗祠头部、标题装饰和非触控间距,不把输入框、按钮、协议或交互热区压缩到约 44dp 以下;根容器禁止因主体布局产生纵向滚动。
|
||||
|
||||
- [ ] **Step 4: 运行 GREEN**
|
||||
|
||||
```powershell
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a01-a02-ui-contract.ps1
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a01-code-pipeline-contract.ps1
|
||||
```
|
||||
|
||||
Expected: 两项均 PASS。
|
||||
|
||||
---
|
||||
|
||||
### Task 5: 真实运行截图与视觉闭环
|
||||
|
||||
**Files:**
|
||||
- Generate: `docs/design/screens/runtime/2026-07-15/A01-*.png`
|
||||
- Modify: `design-qa.md`
|
||||
- Preserve: `docs/design/assets/a01-vnext/review/page-v2/A01-page-password-sms-contact-v2-824x915.png`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: 已运行的 A01 H5、选定联系表、四尺寸与状态动作。
|
||||
- Produces: 真实密码/短信截图、四尺寸内部证据和基于同视口比较的 QA 结论。
|
||||
|
||||
- [ ] **Step 1: 确认 H5 服务与真实路由**
|
||||
|
||||
```powershell
|
||||
Invoke-WebRequest 'http://localhost:5173/#/pages/auth/a01-entry' -UseBasicParsing
|
||||
```
|
||||
|
||||
Expected: HTTP 200;若服务未运行,只报告需要 HBuilderX 启动,不伪造截图。
|
||||
|
||||
- [ ] **Step 2: 捕获密码/短信状态**
|
||||
|
||||
使用现有 `scripts/capture-chrome-page.js` 捕获 412×915 两种状态,并生成一张联系表;再内部捕获 320×568、360×640、360×800。
|
||||
|
||||
- [ ] **Step 3: 执行 Product Design 视觉比对**
|
||||
|
||||
把选定联系表与真实运行联系表放在同一比较输入中,检查结构、比例、间距、字体、裁切、触控区和资源清晰度。P0/P1/P2 必须修复后重截;无法获取真实截图时把 `design-qa.md` 标为 `blocked`,不得写 `passed`。
|
||||
|
||||
- [ ] **Step 4: 最终验证**
|
||||
|
||||
```powershell
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a01-code-pipeline-contract.ps1
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a01-a02-ui-contract.ps1
|
||||
git diff --check
|
||||
git status --short
|
||||
```
|
||||
|
||||
Expected: 两项测试 PASS、无空白错误;A01 仍保持待用户验收,不修改其他页面状态。
|
||||
@@ -1,380 +0,0 @@
|
||||
# A01 分层 PSD 与正式 PNG 资产实施计划
|
||||
|
||||
> **执行要求:** 只允许在当前会话内使用 `superpowers:executing-plans` 逐任务执行。用户明确禁止子代理、worktree、`git add`、`commit`、`push`、`reset`、`checkout` 和上传,因此本计划不包含这些动作;每个任务以测试输出和用户视觉确认作为检查点。
|
||||
|
||||
**目标:** 使用本机 Adobe Photoshop 2021 建立 A01 真正分层的 PSD,并从同一 PSD 导出可直接投入 uni-app 的干净 PNG 资产与密码/验证码代表图。
|
||||
|
||||
**架构:** `a01-psd-manifest.json` 是 PSD 图层、坐标、导出尺寸和文件路径的唯一机器可读所有者;PowerShell 负责校验环境并调用 Photoshop COM,ExtendScript 负责建立 PSD、切换状态和导出。ImageGen 只逐项生成缺少的原始美术层,所有候选先进入设计候选目录,经检查和用户确认后才进入 PSD 与正式资产目录。
|
||||
|
||||
**技术栈:** Windows PowerShell、Adobe Photoshop 2021 COM、ExtendScript JSX、PNG/PSD、ImageGen、uni-app 现有 PowerShell 合同测试。
|
||||
|
||||
## 全局约束
|
||||
|
||||
- 当前只处理 A01 分层 PSD 和 PNG 资产,不修改 `pages/auth/a01-entry.vue`,不进行接口对接。
|
||||
- 不使用 Figma,不把整张效果图作为页面资产,不从扁平图硬裁被遮挡的脏素材。
|
||||
- PSD 工作画布为 `1236 × 2745`,对应 `412 × 915` 的三倍密度基准。
|
||||
- `brand-seal` 唯一来源为 `static/assets/foundation/transparent/brand-seal.png`。
|
||||
- 宗祠背景不得生成空牌匾、替代牌匾或新 Logo 底座;现有 `brand-seal.png` 直接作为独立图层叠放在宗祠中央。
|
||||
- 密码锁唯一复用来源为 `static/assets/modules/auth/transparent/a01-icon-lock-v1.png`。
|
||||
- 闭眼图标必须保留中心瞳孔;短信验证码图标必须是消息气泡加且仅加三个点。
|
||||
- 密码和验证码为独立图层组,共用背景、卷轴、品牌和按钮资产。
|
||||
- 所有生成资产先写入 `docs/design/assets/a01-vnext/candidates/`,不得覆盖现有候选或正式文件。
|
||||
- Photoshop 自动化不得保存、关闭或覆盖用户原先打开的文档,只处理脚本自己创建或打开的临时文档。
|
||||
- 没有 PSD 图层复核、PNG Alpha 检查、412 × 915 代表图和用户确认,不得宣称资产完成。
|
||||
|
||||
## 文件边界
|
||||
|
||||
**新建:**
|
||||
|
||||
- `docs/design/assets/a01-vnext/source/a01-psd-manifest.json`:图层、组、位置、状态和导出规格的唯一机器可读所有者。
|
||||
- `docs/design/assets/a01-vnext/source/A01-layered-source-v1.psd`:最终分层源文件。
|
||||
- `scripts/photoshop/a01-build-layered-psd.jsx`:按清单建立 PSD、组和图层。
|
||||
- `scripts/photoshop/a01-export-layered-assets.jsx`:从 PSD 导出 PNG 与四状态代表图。
|
||||
- `scripts/build-a01-layered-psd.ps1`:验证环境和路径后调用构建 JSX。
|
||||
- `scripts/export-a01-layered-assets.ps1`:调用导出 JSX 并校验输出。
|
||||
- `tests/a01-layered-psd-contract.ps1`:审计清单、脚本、PSD 和 PNG 契约。
|
||||
- `docs/design/assets/a01-vnext/review/`:透明检查图、联系表和代表图候选。
|
||||
|
||||
**仅在资产通过用户确认后修改:**
|
||||
|
||||
- `docs/design/A01_启动登录引导_设计记录.md`
|
||||
- `docs/design/P00_页面结构与资产清单.md`
|
||||
- `docs/交接记录.md`
|
||||
|
||||
**本计划禁止修改:**
|
||||
|
||||
- `pages/auth/a01-entry.vue`
|
||||
- `pages.json`
|
||||
- A01 之外的页面、测试和资产
|
||||
|
||||
---
|
||||
|
||||
### 任务 1:建立 PSD 资产契约测试
|
||||
|
||||
**文件:**
|
||||
|
||||
- 新建:`tests/a01-layered-psd-contract.ps1`
|
||||
- 读取:`docs/superpowers/specs/2026-07-15-a01-layered-psd-assets-design.md`
|
||||
|
||||
**接口:** 缺少文件或契约时抛出明确错误;全部满足时输出 `A01-LAYERED-PSD-CONTRACT PASS`。
|
||||
|
||||
- [ ] **步骤 1:编写失败测试**
|
||||
|
||||
测试至少包含以下可执行断言:
|
||||
|
||||
```powershell
|
||||
$ErrorActionPreference = 'Stop'
|
||||
$root = Split-Path -Parent $PSScriptRoot
|
||||
$requiredFiles = @(
|
||||
'docs/design/assets/a01-vnext/source/a01-psd-manifest.json',
|
||||
'scripts/build-a01-layered-psd.ps1',
|
||||
'scripts/export-a01-layered-assets.ps1',
|
||||
'scripts/photoshop/a01-build-layered-psd.jsx',
|
||||
'scripts/photoshop/a01-export-layered-assets.jsx'
|
||||
)
|
||||
foreach ($relative in $requiredFiles) {
|
||||
if (-not (Test-Path -LiteralPath (Join-Path $root $relative))) {
|
||||
throw "Missing layered PSD contract file: $relative"
|
||||
}
|
||||
}
|
||||
$manifestPath = Join-Path $root $requiredFiles[0]
|
||||
$manifest = Get-Content -Raw -Encoding UTF8 -LiteralPath $manifestPath | ConvertFrom-Json
|
||||
if ($manifest.canvas.width -ne 1236 -or $manifest.canvas.height -ne 2745) {
|
||||
throw 'PSD canvas must be 1236x2745.'
|
||||
}
|
||||
foreach ($group in @('00-参考','10-背景','20-卷轴','30-品牌与标题装饰','40-公共控件皮肤','50-密码登录','60-验证码登录','70-内容与标注')) {
|
||||
if ($manifest.groups.name -notcontains $group) { throw "Missing PSD group: $group" }
|
||||
}
|
||||
foreach ($state in @('password-hidden','password-visible','sms-default','sms-countdown')) {
|
||||
if ($manifest.states.name -notcontains $state) { throw "Missing PSD state: $state" }
|
||||
}
|
||||
Write-Output 'A01-LAYERED-PSD-CONTRACT PASS'
|
||||
```
|
||||
|
||||
- [ ] **步骤 2:运行测试并确认按预期失败**
|
||||
|
||||
```powershell
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a01-layered-psd-contract.ps1
|
||||
```
|
||||
|
||||
预期:失败并显示 `Missing layered PSD contract file`。
|
||||
|
||||
- [ ] **步骤 3:观察并保留工作区状态**
|
||||
|
||||
```powershell
|
||||
git status --short
|
||||
```
|
||||
|
||||
预期:只记录输出,不清理、暂存或提交任何文件。
|
||||
|
||||
---
|
||||
|
||||
### 任务 2:建立清单和 Photoshop 自动化空壳
|
||||
|
||||
**文件:**
|
||||
|
||||
- 新建:`docs/design/assets/a01-vnext/source/a01-psd-manifest.json`
|
||||
- 新建:`scripts/build-a01-layered-psd.ps1`
|
||||
- 新建:`scripts/export-a01-layered-assets.ps1`
|
||||
- 新建:`scripts/photoshop/a01-build-layered-psd.jsx`
|
||||
- 新建:`scripts/photoshop/a01-export-layered-assets.jsx`
|
||||
- 测试:`tests/a01-layered-psd-contract.ps1`
|
||||
|
||||
**接口:**
|
||||
|
||||
- 清单提供 `canvas`、`groups`、`layers`、`states`、`exports`。
|
||||
- `build-a01-layered-psd.ps1 -ManifestPath <path> -OutputPath <path>` 使用 `Photoshop.Application.150`。
|
||||
- `export-a01-layered-assets.ps1 -ManifestPath <path> -PsdPath <path>` 使用同一 COM 接口。
|
||||
- JSX 从 `JIAPU_A01_ROOT`、`JIAPU_A01_MANIFEST`、`JIAPU_A01_PSD` 读取路径,不硬编码用户名。
|
||||
|
||||
- [ ] **步骤 1:创建最小清单**
|
||||
|
||||
```json
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"canvas": { "width": 1236, "height": 2745, "logicalWidth": 412, "logicalHeight": 915, "scale": 3 },
|
||||
"groups": [
|
||||
{ "name": "00-参考", "visible": false },
|
||||
{ "name": "10-背景", "visible": true },
|
||||
{ "name": "20-卷轴", "visible": true },
|
||||
{ "name": "30-品牌与标题装饰", "visible": true },
|
||||
{ "name": "40-公共控件皮肤", "visible": true },
|
||||
{ "name": "50-密码登录", "visible": true },
|
||||
{ "name": "60-验证码登录", "visible": false },
|
||||
{ "name": "70-内容与标注", "visible": true }
|
||||
],
|
||||
"layers": [],
|
||||
"states": [
|
||||
{ "name": "password-hidden", "show": ["50-密码登录"], "hide": ["60-验证码登录"] },
|
||||
{ "name": "password-visible", "show": ["50-密码登录"], "hide": ["60-验证码登录"] },
|
||||
{ "name": "sms-default", "show": ["60-验证码登录"], "hide": ["50-密码登录"] },
|
||||
{ "name": "sms-countdown", "show": ["60-验证码登录"], "hide": ["50-密码登录"] }
|
||||
],
|
||||
"exports": []
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **步骤 2:创建 PowerShell COM 包装**
|
||||
|
||||
核心调用固定为:
|
||||
|
||||
```powershell
|
||||
$app = New-Object -ComObject 'Photoshop.Application.150'
|
||||
$env:JIAPU_A01_ROOT = $root
|
||||
$env:JIAPU_A01_MANIFEST = $resolvedManifest
|
||||
$env:JIAPU_A01_PSD = $resolvedOutput
|
||||
$jsx = (Resolve-Path -LiteralPath (Join-Path $root 'scripts/photoshop/a01-build-layered-psd.jsx')).Path
|
||||
$escaped = $jsx.Replace('\', '\\')
|
||||
$app.DoJavaScript("$.evalFile(new File('$escaped'));", @(), 1)
|
||||
```
|
||||
|
||||
调用前验证 Photoshop 正在运行、输入输出位于项目根目录,并拒绝覆盖不符合 `A01-layered-source-v*.psd` 的文件。
|
||||
|
||||
- [ ] **步骤 3:创建 JSX 空壳构建器**
|
||||
|
||||
```javascript
|
||||
#target photoshop
|
||||
app.displayDialogs = DialogModes.NO;
|
||||
var created = null;
|
||||
try {
|
||||
var manifestFile = File($.getenv('JIAPU_A01_MANIFEST'));
|
||||
var psdFile = File($.getenv('JIAPU_A01_PSD'));
|
||||
manifestFile.encoding = 'UTF8';
|
||||
manifestFile.open('r');
|
||||
var manifest = eval('(' + manifestFile.read() + ')');
|
||||
manifestFile.close();
|
||||
created = app.documents.add(manifest.canvas.width, manifest.canvas.height, 72, 'JIAPU_A01_SCRIPT_SOURCE', NewDocumentMode.RGB, DocumentFill.TRANSPARENT);
|
||||
for (var i = 0; i < manifest.groups.length; i++) {
|
||||
var group = created.layerSets.add();
|
||||
group.name = manifest.groups[i].name;
|
||||
group.visible = manifest.groups[i].visible;
|
||||
}
|
||||
var options = new PhotoshopSaveOptions();
|
||||
options.layers = true;
|
||||
created.saveAs(psdFile, options, true, Extension.LOWERCASE);
|
||||
created.close(SaveOptions.DONOTSAVECHANGES);
|
||||
created = null;
|
||||
} catch (error) {
|
||||
if (created) { created.close(SaveOptions.DONOTSAVECHANGES); }
|
||||
throw error;
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **步骤 4:运行契约测试**
|
||||
|
||||
```powershell
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a01-layered-psd-contract.ps1
|
||||
```
|
||||
|
||||
预期:`A01-LAYERED-PSD-CONTRACT PASS`。
|
||||
|
||||
- [ ] **步骤 5:运行空壳 PSD 冒烟检查**
|
||||
|
||||
```powershell
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File scripts/build-a01-layered-psd.ps1
|
||||
```
|
||||
|
||||
预期:生成 `docs/design/assets/a01-vnext/source/A01-layered-source-v1.psd`,Photoshop 中包含八个命名组;脚本执行前已打开的用户文档未被保存或关闭。
|
||||
|
||||
---
|
||||
|
||||
### 任务 3:制作三类母图并由 Photoshop 拆出干净图层
|
||||
|
||||
**文件:**
|
||||
|
||||
- 新建候选:`docs/design/assets/a01-vnext/candidates/` 下的版本化 PNG
|
||||
- 修改:`docs/design/assets/a01-vnext/source/a01-psd-manifest.json`
|
||||
- 新建检查图:`docs/design/assets/a01-vnext/review/`
|
||||
|
||||
**接口:** ImageGen 只生成完整无字卷轴、无字按钮与装饰板、四枚功能图标板三类母图;Photoshop 将母图拆成每个只承载一个清单图层的 PNG。每个 `layers` 项包含 `name`、`group`、`source`、`x`、`y`、`width`、`height`、`visible`、`exportName`、`alpha`。
|
||||
|
||||
- [ ] **步骤 1:制作宗祠背景候选**
|
||||
|
||||
使用用户已认可的宗祠母图,不再重新生成。保留 ImageGen 原始母图,再由 Photoshop 裁剪为 `1236 × 510` 候选;现有 `brand-seal.png` 后续作为独立图层叠放。
|
||||
|
||||
验收:中央为 `brand-seal` 留出干净视觉空间,但建筑本身不出现空牌匾、替代牌匾或新 Logo 底座;四边没有被截断的文字或控件。
|
||||
|
||||
- [ ] **步骤 2:生成一张完整无字卷轴母图并拆分**
|
||||
|
||||
一次生成完整无字卷轴母图,使用可清除的纯色背景。Photoshop 从同一母图拆出顶部卷轴、无字宣纸平铺纹理、左边框、右边框和底部卷轴,不从完整登录页面截图裁切。
|
||||
|
||||
验收:在纯黑、纯白和项目暖宣纸底色上检查透明边缘;拼接处没有亮线、断纹或重复阴影。
|
||||
|
||||
- [ ] **步骤 3:生成一张无字按钮与装饰母图并拆分**
|
||||
|
||||
主按钮先形成无字完整皮肤,再由 Photoshop 分出左端、可横向延展中段和右端;标题云纹、分隔纹样和四角回纹分别独立。
|
||||
|
||||
验收:按钮三段重新拼接后与完整皮肤一致;所有纹样不包含文字、Logo 或不可复用背景。
|
||||
|
||||
- [ ] **步骤 4:生成一张四图标母板并拆分**
|
||||
|
||||
在同一高分辨率纯色背景母板中生成彼此完全分离的手机、睁眼、保留瞳孔的闭眼、短信气泡三点图标,再由 Photoshop 分别导出;密码锁继续引用 `a01-icon-lock-v1.png`,Logo 继续引用 `brand-seal.png`。微信标志不由 ImageGen 重绘,继续使用具有来源记录的项目资产,只重新制作其容器皮肤。
|
||||
|
||||
验收:目标显示尺寸下仍清楚;短信气泡只有三个点;闭眼中心瞳孔可见。
|
||||
|
||||
- [ ] **步骤 5:每类输出一张检查联系表并等待确认**
|
||||
|
||||
联系表包含原尺寸、白底、黑底和页面底色预览。未收到用户确认前,不把该类候选写入正式导出清单,也不修改 A01 页面。
|
||||
|
||||
---
|
||||
|
||||
### 任务 4:组装真实 PSD
|
||||
|
||||
**文件:**
|
||||
|
||||
- 修改:`docs/design/assets/a01-vnext/source/a01-psd-manifest.json`
|
||||
- 修改:`scripts/photoshop/a01-build-layered-psd.jsx`
|
||||
- 生成:`docs/design/assets/a01-vnext/source/A01-layered-source-v1.psd`
|
||||
- 测试:`tests/a01-layered-psd-contract.ps1`
|
||||
|
||||
**接口:** JSX 读取 `layers`,打开 PNG,复制到目标组并设置名称、位置和可见性。目标层名与 `exportName` 一一对应;每次从清单重建,不在旧 PSD 上堆叠。
|
||||
|
||||
- [ ] **步骤 1:扩展失败测试**
|
||||
|
||||
验证每个源文件存在,坐标和尺寸为整数,源路径位于工作区,`exportName` 唯一,且可导出层属于 `10` 至 `60` 的合法组。
|
||||
|
||||
- [ ] **步骤 2:先运行测试确认不完整清单失败**
|
||||
|
||||
```powershell
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a01-layered-psd-contract.ps1
|
||||
```
|
||||
|
||||
预期:报告第一项缺失或重复的图层契约。
|
||||
|
||||
- [ ] **步骤 3:实现 PNG 导入与精确定位**
|
||||
|
||||
JSX 只复制脚本打开的源 PNG 合并像素层,复制后立即关闭源文档且不保存;位置按 `x × 3`、`y × 3` 和清单目标尺寸设置,不手工拖动猜测。
|
||||
|
||||
- [ ] **步骤 4:重建并复核 PSD**
|
||||
|
||||
```powershell
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File scripts/build-a01-layered-psd.ps1
|
||||
```
|
||||
|
||||
预期:八个组顺序正确,密码和验证码可单独显示,公共图层只有一份,参考图默认隐藏。
|
||||
|
||||
- [ ] **步骤 5:确认用户原文档未受影响**
|
||||
|
||||
检查 Photoshop:脚本运行前用户已打开文档的数量、名称和未保存状态保持不变;脚本临时文档已关闭。
|
||||
|
||||
---
|
||||
|
||||
### 任务 5:从 PSD 导出 PNG 与四状态代表图
|
||||
|
||||
**文件:**
|
||||
|
||||
- 修改:`scripts/photoshop/a01-export-layered-assets.jsx`
|
||||
- 生成候选:`docs/design/assets/a01-vnext/exports/v1/`
|
||||
- 生成联系表:`docs/design/assets/a01-vnext/review/A01-layered-states-v1-contact-sheet.png`
|
||||
- 测试:`tests/a01-layered-psd-contract.ps1`
|
||||
|
||||
**接口:** `exports` 定义来源层、裁切矩形、尺寸、Alpha 和文件名;四状态固定为 `password-hidden`、`password-visible`、`sms-default`、`sms-countdown`。
|
||||
|
||||
- [ ] **步骤 1:添加导出失败测试**
|
||||
|
||||
验证每个 `exports.path` 存在、PNG 文件头正确、像素尺寸与清单一致;透明资产四角 Alpha 为 0,不透明资产四角 Alpha 为 255。未执行导出时测试必须失败。
|
||||
|
||||
- [ ] **步骤 2:实现独立图层导出**
|
||||
|
||||
JSX 打开 PSD 后记录原可见性,只显示目标层或组,按清单矩形复制到新的透明临时文档并保存 PNG;完成后关闭脚本打开的 PSD 副本且不写回可见性变化。
|
||||
|
||||
- [ ] **步骤 3:实现四状态代表图和联系表**
|
||||
|
||||
按清单切换密码/验证码组以及眼睛、倒计时等状态专用层,分别导出 412 × 915 预览,再组合为一张两行两列联系表。代表图只进入 `review`,页面不得引用。
|
||||
|
||||
- [ ] **步骤 4:运行导出验证**
|
||||
|
||||
```powershell
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File scripts/export-a01-layered-assets.ps1
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a01-layered-psd-contract.ps1
|
||||
git diff --check
|
||||
```
|
||||
|
||||
预期:导出成功,合同输出 `A01-LAYERED-PSD-CONTRACT PASS`,无新增空白错误。
|
||||
|
||||
- [ ] **步骤 5:只展示一张联系表并等待用户确认**
|
||||
|
||||
确认宗祠、卷轴、按钮、图标、密码/验证码状态和公共区域。用户未明确通过前,导出仍是候选,不复制到 `static/assets`,不修改页面。
|
||||
|
||||
---
|
||||
|
||||
### 任务 6:冻结资产证据并停在页面实施门禁前
|
||||
|
||||
**文件:**
|
||||
|
||||
- 修改:`docs/design/A01_启动登录引导_设计记录.md`
|
||||
- 修改:`docs/design/P00_页面结构与资产清单.md`
|
||||
- 修改:`docs/交接记录.md`
|
||||
- 保留:`docs/design/assets/a01-vnext/source/A01-layered-source-v1.psd`
|
||||
- 保留:`docs/design/assets/a01-vnext/exports/v1/`
|
||||
|
||||
**接口:** A01 设计记录拥有用户视觉决定;P00 拥有正式资产路径、尺寸、Alpha 和引用状态;交接记录只保存真实停点。
|
||||
|
||||
- [ ] **步骤 1:记录文件证据**
|
||||
|
||||
```powershell
|
||||
Get-FileHash -Algorithm SHA256 docs/design/assets/a01-vnext/source/A01-layered-source-v1.psd
|
||||
Get-ChildItem docs/design/assets/a01-vnext/exports/v1 -File | Get-FileHash -Algorithm SHA256
|
||||
```
|
||||
|
||||
把 PSD 和已确认 PNG 的哈希、尺寸、Alpha、用途写入 A01 设计记录和 P00。
|
||||
|
||||
- [ ] **步骤 2:更新真实状态**
|
||||
|
||||
只能写“PSD 与 PNG 资产已获用户确认,A01 页面实现尚未开始”或事实对应的更早状态;不得写 A01 已验收、已冻结或页面已完成。
|
||||
|
||||
- [ ] **步骤 3:运行最终验证**
|
||||
|
||||
```powershell
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a01-layered-psd-contract.ps1
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a01-a02-ui-contract.ps1
|
||||
git diff --check
|
||||
git status --short
|
||||
git status --short --ignored
|
||||
```
|
||||
|
||||
预期:PSD 合同通过;既有 A01/A02 合同保持当前事实,若因页面尚未切换而失败则如实记录、不改页面;所有既有修改和未跟踪文件继续保留。
|
||||
|
||||
- [ ] **步骤 4:停止**
|
||||
|
||||
只有用户再次确认进入页面落地,才新建独立的 A01 image-to-code/TDD 实施计划;不得在本计划中顺手修改页面。
|
||||