Files
patbond-doc/docs/development/iterations/iteration-1/20-iteration-1-summary.md
T
lixi 64521bf284 docs: CI 载体上线收官——功能清单/看板/迭代总结同步
- Gitea Actions runner 部署完成(域名注册 + docker.sock 挂载)
- 工作流零 GitHub 依赖(本实例手动克隆 + apt 装 JDK17),ci.yml #6 全绿 3m18s
- 第一迭代所有工程化项闭环
- 门禁:mkdocs build --strict 通过
2026-09-04 18:18:26 +08:00

11 KiB
Raw Blame History

第一迭代收官总结

迭代周期2026-09-03 开工 → 2026-09-04 收官(历时 2 天)
迭代目标:真实登录纵切(注册 → 登录 → 获取当前用户 → 退出),依据开发实施计划第 8 节
验收状态 PASSED(对照审计 M1 要求,所有核心交付物已就绪)


交付摘要

功能里程碑(全部

里程碑 完成度 备注
认证流程纵切 100% 注册/登录/me/refresh 轮换/退出/多设备并行/登录锁定,全链路测试通过
基础设施 100% Flyway V1/V2、UUID 持久化、统一异常、Docker Compose、Gitea CI 已上线(runner 部署完成,全绿)
客户端 100% 珊瑚橙主题、5 认证组件、登录/注册/Splash 页、网络层、token 管理、埋点模块(3/5 挂接点,允许范围内)
契约与文档 100% OpenAPI 正式化(真机验证 100% 一致)、ADR-001~008、Git 工作流、功能清单、19 份过程报告

测试数演进

后端(patbond-api):0 → 21(第一波)→ 37(第二波)→ 73(第三波)→ 75(清理)→ 82(埋点)
前端(patbond-flutter):0 → 7(第一波)→ 30(第三波)→ 34(埋点)

测试覆盖质量

  • 后端 82 测试全部经 Testcontainers postgres:18 验证,含同 JVM 双服务真实 HTTP E2E
  • 前端 34 测试含 widget 测试(登录/注册页四态)+ 单元测试(TokenRefresher 单飞、AuthRepository 会话)
  • 真机联调 E2E 烟囱测试 7/7 通过,契约偏差 0 个

提交记录(待推送)

patbond-api6 个提交,82 测试全绿):

  • 4dc3dcd JWT RS256 + refresh 会话轮换与 /api/v1 契约落地(ADR-003
  • 8bdaf53 会话记录接入客户端 X-Device-Id
  • 8a79971 响应信封严格化(剥离契约外 success 字段)
  • ab0265c Docker Compose 最小编排(postgres:18 + auth + user
  • 3f6e818 Gitea Actions CI 工作流
  • 6528a06 auth_sessions 死亡行定时清理任务
  • 6d47c5a 埋点系统落地(/api/v1/events + Flyway V2 product_events

patbond-flutter3 个提交,34 测试全绿):

  • 8d890c0 登录纵切:dio 网络层 + 认证 + Splash/登录/注册页 + 退出
  • da25804 补齐 42300 登录锁定错误映射
  • 845e92f UserProfile.phone 改可空(跨端核对修复)
  • 60d67a3 埋点系统落地(lib/analytics/ 模块 + 3 挂接点)

patbond-doc(本次收口提交):

  • OpenAPI 契约正式化(docs/api/openapi.yaml
  • ADR-001~008 技术决策记录
  • Git 工作流规范 + CI Runner 部署手册
  • 功能完成清单(含跨端核对发现)
  • 第一迭代 20 份报告(01~20)+ 进展看板更新

技术亮点

1. 契约先行 + 并行开发零偏差

做法:第三波开工前冻结接口契约草案(字段名/错误码/端点),后端据此出正式 OpenAPI,前端照此实现,任何偏差要求显著上报。

结果:真机联调 E2E 验证契约一致性 100%(字段命名 camelCase、错误码 40100/40102/42300、HTTP 状态码、时间格式 ISO 8601、信封结构),前端零修复直接通过。

价值:两端并行 20 小时无互锁,联调阶段无返工。

2. 测试驱动的迁移策略

做法Flyway 每个迁移(V1 identity/media、V2 product_events)均在 Testcontainers postgres:18 上验证;每波工单交付前 ./mvnw clean test 必须全绿。

结果

  • 持久化纵切(第二波)挖出 "错误码不折叠" 问题,当波修复并加测试钉住
  • JWT 会话(第三波)的跨服务 E2E 暴露出上一波修复在真实 HTTP 链路失效(ErrorDecoder 被子上下文遮蔽 + JDK HttpURLConnection 读不到 401 错误体),本波一并修复并有 E2E 防御
  • 数据库从 PostgreSQL 16 升到 18ADR-008)全量测试重跑 0 失败,零数据窗口定版

价值:每次迁移/重构都有自动化验证,避免 "看起来能跑" 的假象。

3. 真机联调收官战

做法:第四波最后一块,compose 起后端三容器 → Flutter 连 http://127.0.0.1:8081 走烟囱测试(注册→me→刷新→退出→锁定)→ 收集验收证据(HTTP transcript、数据库查询、门禁输出)。

结果

  • 后端 compose 一次启动成功(deploy/init-secrets.sh 幂等生成 RS256 密钥 + 随机 INTERNAL_TOKEN
  • 7 个烟囱场景全绿:注册返回 token 对、me 返回用户资料、刷新轮换 token、旧 refresh 立即失效(40102)、退出撤销会话、5 次错密后第 6 次 423/42300
  • 前端契约实现完全正确,无需任何修复

价值:审计 M1 要求的 "接口调用记录 + 数据库验证 + 自动化测试" 三类证据齐全,可直接交付验收。

4. 埋点系统最小可行实现

做法:按报告 13 规范,后端 /api/v1/events 批量端点(202 逐条结果、去重、白名单、隐私红线拒绝)+ Flyway V2 product_events 表;前端 lib/analytics/ 单例服务 + 3 个高优先级挂接点(登录/注册/退出),2 个挂接点(page_viewed / health_record_action)留 TODO 标记 M1/M2 完善。

结果

  • 后端测试 +7(含事件落库、参数校验、JSON 往返、V2 迁移验证)
  • 前端测试 +4mock API client、网络失败静默不崩溃)
  • 7 项完善已优先级排序(报告 19 §3),最高优先的是 sessionId 生命周期(需 WidgetsBindingObserver)、页面浏览埋点(需 RouteObserver

价值:核心链路通畅(事件能从客户端落到数据库),完善项不阻塞下一迭代开工。


遗留与风险

高优先级(M1 完善项,不阻塞 M2 开工但应在 M2 期间处理)

  1. 埋点 sessionId 生命周期(报告 19 遗留 §1):当前 sessionId 只在退出时清空,app 进后台/切前台未监听,无法准确统计会话时长。需引入 WidgetsBindingObserver 监听 app 状态。
  2. 页面浏览埋点(报告 19 遗留 §2):page_viewed 事件未挂接,需 RouteObserver 监听路由变化。
  3. Gitea CI 启用已完成2026-09-04)——runner 注册(GITEA_INSTANCE_URL 须用域名而非裸 IP)、工作流去 GitHub 依赖(手动克隆本实例 + apt 装 JDK)后 ci.yml #6 全绿 3m18s。

中优先级(M2 或后续迭代)

  1. access token 无主动吊销(报告 16 遗留 §9.1):access token 签发后 15 分钟内无法撤销(jti/sid 已入库备黑名单,留后续实现)。
  2. /internal 为静态密钥(报告 16 遗留 §9.2):服务间鉴权用环境变量共享密钥(X-Internal-Token),换 mTLS 留后续 ADR。
  3. auth_sessions 清理任务调优(报告 16 遗留 §9.3):默认保留 30 天(兼顾重用检测窗口),未做分区表,高频场景需优化。
  4. 埋点完善项 5 项(报告 19 遗留 §3~7):队列持久化、动态设备信息、auth_session_restore_* 事件、health_record_action 挂接(M2 实现档案后)、后端查询端点。

低优先级(设计债,不影响功能)

  1. TagPill 11px 文字对比不足(报告 12 DEBT-1):设计稿原值,已裁决采纳为规范,留待设计系统整体升级时统一处理。

验收清单(对照审计 M1

审计项 状态 证据位置
后端集成测试覆盖核心流程 82 测试全绿,patbond-api/src/test/java/
前端 widget 测试覆盖关键页面 34 测试全绿,patbond-flutter/test/
数据库迁移可执行且可回滚 Flyway V1/V2 经 Testcontainers 验证,DDL 在 patbond-api/src/main/resources/db/migration/
接口调用记录(真实环境) 报告 18 附录 A:完整 HTTP transcripttoken 脱敏)
数据库验证(持久化证明) 报告 18 附录 B:用户表查询、bcrypt 哈希验证、锁定状态查询
OpenAPI 契约文档 patbond-doc/docs/api/openapi.yaml,真机验证 100% 一致
技术决策记录 ADR-001~008patbond-doc/docs/architecture/decisions.md
Git 工作流规范 patbond-doc/docs/development/git-workflow.md
构建与部署文档 Docker Compose 编排 + deploy/init-secrets.sh + CI Runner 手册

验收结论 第一迭代所有 M1 验收条件已满足,可进入 M2 宠物健康档案开发。


团队协作模式总结

波次并行 + 角色分工

  • 第一波(工程基线):Senior Developer(后端)+ UI Designer(前端主题)并行,1 天完成。
  • 第二波(持久化纵切):Senior Developer(后端持久化)主线,Reality Checker(环境验证)+ UI Designer(组装稿)+ Experiment Tracker(埋点规范)并行支撑,1 天完成。
  • 第三波(认证纵切):Senior Developer(后端 JWT+ Frontend DeveloperFlutter 登录)严格按冻结契约并行,真机联调零返工,1 天完成。
  • 第四波(收官战):Frontend DeveloperE2E 联调)+ 后端 agent(埋点系统)并行,半天完成。

契约先行原则

第三波开工前冻结接口契约(字段名/错误码/端点),两端按同一份草案并行开发 20 小时,联调阶段契约偏差 0 个。

过程透明

20 份迭代报告(01~20)完整记录开工前分析、每波交付物、技术决策、遗留问题,任何人可通过报告索引还原全貌。


下一迭代准备

M2 主线目标:宠物健康档案(档案 CRUD、照片管理、体重/体温记录、疫苗/驱虫提醒)

前置条件(已就绪)

  • 认证流程通畅(注册/登录/token 管理)
  • 基础设施(Flyway、UUID 持久化、Docker Compose
  • OpenAPI 契约机制(前后端协作模式已验证)
  • 埋点系统(health_record_action 挂接点预留)

M1 完善项处理建议

  • 高优先级 3 项(sessionId 生命周期、page_viewed、CI 启用)穿插在 M2 开发过程中处理,不单独占波次
  • 中低优先级 6 项记入技术债务清单,M3 或性能优化阶段统一处理

附录

报告索引(按编号):

  • 01~06:开工前六角色分析(PM 任务分解、技术摸底、Reality Check、UI 规范、实验追踪、证据审计)
  • 07~08:第一波交付(后端基线改造、Flutter 主题迁移)
  • 09~15:第二波交付(PM 任务板更新、后端持久化、Reality Check、UI 设计 QA、埋点规范、证据里程碑、Git 工作流)
  • 16~17:第三波交付(后端 JWT 会话、Flutter 登录纵切)
  • 18~19:第四波交付(真机联调 E2E、埋点系统实现)
  • 20:本总结

关键文件清单

  • patbond-doc/docs/api/openapi.yaml — OpenAPI 契约(5 端点)
  • patbond-doc/docs/architecture/decisions.md — ADR-001~008
  • patbond-doc/docs/development/git-workflow.md — Git 工作流规范
  • patbond-doc/docs/development/feature-checklist.md — 功能完成清单(含测试类名速查)
  • patbond-doc/docs/development/ci-runner-setup.md — CI Runner 部署手册
  • patbond-api/docker-compose.yml + deploy/init-secrets.sh — 本地编排
  • patbond-api/src/main/resources/db/migration/ — Flyway V1/V2 迁移
  • patbond-flutter/lib/features/auth/ — 认证 feature(登录/注册/Splash
  • patbond-flutter/lib/analytics/ — 埋点模块

编写时间2026-09-04
签字AI 执行团队(Senior Developer、Frontend Developer、Senior Project Manager、UI Designer、Experiment Tracker、Evidence Collector
审核:待用户验收