From b6b8e774e748a2cc6e491ecdff65000af962aceb Mon Sep 17 00:00:00 2001 From: Lixi20 Date: Fri, 4 Sep 2026 14:56:06 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E5=8A=9F=E8=83=BD=E6=B8=85=E5=8D=95?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=E5=90=8E=E7=AB=AF=E8=BF=BD=E5=8A=A0=E4=BA=A4?= =?UTF-8?q?=E4=BB=98=E4=B8=8E=20phone=20=E4=BF=AE=E5=A4=8D=E7=8A=B6?= =?UTF-8?q?=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - compose 编排/信封严格化/deviceId/Gitea CI 状态、74 测试数、跨端核对发现由后端线更新 - UserProfile.phone 可空修复标记完成(patbond-flutter@845e92f) - 门禁:mkdocs build --strict 通过 --- docs/development/feature-checklist.md | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/docs/development/feature-checklist.md b/docs/development/feature-checklist.md index a696612..4e3258c 100644 --- a/docs/development/feature-checklist.md +++ b/docs/development/feature-checklist.md @@ -2,7 +2,7 @@ > 目的:直观呈现哪些功能**已完成且有自动化测试**、哪些**部分完成**、哪些**尚未开始**,方便针对性验证与回归。 > 维护约定:每波工单合入后由执行人更新本清单;状态以 `dev` 分支 + 门禁全绿为准。 -> 最后更新:2026-09-04(第三波两端合龙:patbond-api `4dc3dcd` 73 测试、patbond-flutter `da25804` 30 测试,均门禁全绿) +> 最后更新:2026-09-04(第三波两端合龙 + 工程化补波:patbond-api `3f6e818` 74 测试、patbond-flutter `da25804` 30 测试,均门禁全绿;compose 编排冒烟实测通过) 图例:✅ 已完成且已测试 | 🟡 部分完成/有已知限制 | ⬜ 未开始 @@ -40,6 +40,7 @@ | 旧 refresh 重用 → 40102 + 撤销整个 token family | ✅ | `reuseOfRotatedTokenRevokesWholeFamily` + E2E | 并发轮换同样按重用处理 | | refresh 过期/未知 → 40102 | ✅ | `expiredRefreshTokenIsRejected`、`unknownRefreshTokenIsRejected` | | | `POST /api/v1/auth/logout`:仅撤当前会话,幂等 | ✅ | `SessionLifecycleIntegrationTest`(含跨账号撤销不掉用例)+ E2E | 需有效 access token(40101 兜底) | +| 会话记录设备信息(X-Device-Id / UA / IP) | ✅ | `registerForwardsDeviceIdHeaderToTheSessionRecord` + 会话落库断言 | 前端每请求携带 X-Device-Id,为多设备会话列表备数据 | | access 过期/伪造 → 40101 | ✅ | `MeEndpointTest`、`JwtSignerTest`、E2E | | | `/internal/**` 服务间鉴权(X-Internal-Token) | ✅ | `InternalAuthFilterTest`(3 例)+ E2E | 无凭证/错误凭证 401;未配置 fail-closed | | access token 主动吊销(黑名单) | ⬜ | — | 退出后已签发 access 在剩余 ≤15 分钟内仍有效(jti/sid 已入库备用),见报告 16 §9.1 | @@ -61,16 +62,24 @@ | dio API client + 信封解包 + 错误码映射(含 42300) | ✅ | 第三波并行交付(`patbond-flutter@8d890c0`+`da25804`,报告 17),基于 mock 验证 | | Splash/登录/注册页 + secure storage + 登录态恢复 + 真实退出 | ✅ | 同上,登录页四态/注册校验 widget 测试锁定 | | 401 单飞刷新拦截器 | ✅ | `TokenRefresher` 单元测试(刷新单飞、40102 清会话) | -| 与真实后端联调(烟囱测试) | ⬜ | 第四波,前置为 compose 编排 | +| 与真实后端联调(烟囱测试) | ⬜ | 第四波;前置的 compose 编排已就绪(见第 6 节) | + +**跨端核对发现(前端线跟进,后端已按 openapi.yaml 核对全部通过)**: + +1. ~~`UserProfile.fromJson` 将 `phone` 按非空 String 强转~~——**已修复**(`patbond-flutter@845e92f`,phone 改为可空,30 测试全绿)。 +2. 注册请求携带的 `Idempotency-Key` 后端暂未实现幂等语义(开发计划仅要求帖子/预约类写接口支持);「刷新重放沿用同键」的设计正确,待后端实现后自动受益。 +3. 前端每请求携带的 `X-Device-Id` 后端已接入 `auth_sessions.device_id`(`patbond-api@8bdaf53`)。 ## 6. 工程化 | 功能 | 状态 | 说明 | | --- | --- | --- | -| 后端集成测试门禁(本地) | ✅ | `JAVA_HOME=/usr/lib/jvm/java-17-openjdk ./mvnw clean test`,73 测试 | +| 后端集成测试门禁(本地) | ✅ | `JAVA_HOME=/usr/lib/jvm/java-17-openjdk ./mvnw clean test`,74 测试 | | 跨服务真实 HTTP E2E | ✅ | `AuthE2eIntegrationTest`(同 JVM 双服务 + 真实 postgres:18) | -| docker compose 最小编排(postgres + 两服务) | ⬜ | M0 项,任务 8 与联调前置 | -| CI 载体(自动执行门禁) | ⬜ | 审计 M3 后半 | +| docker compose 最小编排(postgres:18 + 两无状态服务容器) | ✅ | `patbond-api@ab0265c`:`./deploy/init-secrets.sh` → `mvnw -DskipTests package` → `docker compose up -d --build`;完整冒烟实测通过(register→me→refresh→旧 token 重用 40102→internal 401→logout);用法见 `patbond-api/Readme.md` | +| 可执行镜像构建(repackage exec jar、非 root 运行) | ✅ | 同上;顺带修复无 starter-parent 时 package 产物不可执行 | +| 信封严格化(`success` 派生字段不再上线) | ✅ | `patbond-api@8a79971`,信封恰为 `{code, message, data}` | +| CI 载体(自动执行门禁) | 🟡 | `.gitea/workflows/ci.yml` 已提交(`patbond-api@3f6e818`,与本地门禁同命令);**待服务器启用 Gitea Actions 并注册带 Docker 的 act_runner**(前提在文件头注释,需用户操作) | ## 针对性测试速查