Files
patbond-doc/docs/development/iterations/iteration-1/07-backend-baseline-report.md
T
lixi 209021e7d2 docs: 迁入第一迭代过程报告并建立进展看板
- 新增 development/iterations/iteration-1/:15 份角色报告 + 进展看板(已完成/未闭环/下一步),作为双人协作的进度事实来源
- 新增 ADR-006:测试与交付容器化策略(Testcontainers / 交付 Docker 包 / 本机库仅个人联调)
- Git 工作流规范补充:敏感信息只进忽略文件或 sample、测试数据不入库、测试代码限标准测试目录
- 门禁:mkdocs build --strict 通过(零警告)
2026-09-04 10:45:05 +08:00

7.6 KiB
Raw Blame History

07 后端工程基线改造报告(第一迭代)

  • 执行人:Senior Developer
  • 日期:2026-09-03
  • 仓库:patbond-api(改动全部留在工作区,未提交)
  • 范围:ADR-001(升 Boot 3)、ADR-002(移除 Nacos)落地 + 审计问题 B1(零测试)、M2(common 依赖污染)、M3(无 Maven Wrapper)、M4(启动文档/配置)整改。不含数据库、JWT、refresh token、OpenAPI(后续工单)。

1. 所升版本

原值 新值 说明
Spring Boot 2.7.18 3.5.16 3.5 线最新补丁版(写作时 Maven Central 实查)
Spring Cloud 2021.0.9 2025.0.3 与 Boot 3.5 配套版本线;仅使用 OpenFeign
Spring Cloud Alibaba 2021.0.6.0 移除 ADR-002BOM、两个 nacos starter、spring.config.import 全部删除
Java 基线 17source/target 17<release>17</release> + <parameters>true</parameters> release 严格锁定 API 基线;-parameters 是 Boot 3.2+ 参数名推断的硬要求
命名空间 javax.validation jakarta.validation 6 个源文件迁移,源码中已无任何 javax.*
构建工具 依赖本机 mvn Maven WrappermvnwMaven 3.9.16 mvn wrapper:wrapper 生成

本机默认 JDK 为 26,构建/运行统一以 JAVA_HOME=/usr/lib/jvm/java-17-openjdk 执行(README 已写明)。

2. 改动文件清单

pom4 个,修改)

  • pom.xmlBoot/Cloud 版本升级、删 Alibaba BOM、compiler 改 release+parameters、pin surefire 3.5.2。
  • patbond-common/pom.xml瘦身为纯契约模块——只保留 jakarta.validation-apicompile+ spring-boot-starter-testtest);删除 web/amqp/openfeign/loadbalancer/nacos-discovery/nacos-config/hutool/lombokM2 关闭,对齐开发计划 4.1)。
  • patbond-user/pom.xml:自持 starter-webstarter-validation(原经 common 传递),保留 spring-security-crypto,新增 starter-test
  • patbond-auth/pom.xml:自持 starter-webstarter-validationspring-cloud-starter-openfeign(不显式引 loadbalancer),新增 starter-test

Java 源码(6 个,修改)

  • patbond-auth/.../client/UserClient.java@FeignClient(name = "patbond-user", url = "${patbond.user-service.url}")ADR-002 静态地址)。
  • AuthController.javaLoginRequest.javaRegisterRequest.javaUserController.javaCreateUserRequest.javaVerifyPasswordRequest.javajavax→jakarta。

配置(按用户中途指示采用 sample 模式:application.yml 保持 git 忽略,sample 入库)

  • 更新 patbond-user/src/main/resources/application.yml.sample(去 NacosPATBOND_USER_PORT:8082)。
  • 更新 patbond-auth/src/main/resources/application.yml.sample(去 NacosPATBOND_AUTH_PORT:8081patbond.user-service.url: ${PATBOND_USER_SERVICE_URL:http://127.0.0.1:8082})。
  • .gitignore:保留 application.yml 忽略 + .sample 白名单规则(去掉的是 Nacos 时代的内容而非规则本身)。
  • 新增 patbond-auth/src/test/resources/application.yml(测试专用配置):干净检出无 application.yml@SpringBootTest 仍可启动上下文,./mvnw clean test 不依赖复制步骤(已实测:移走本地 yml 后 clean test 依旧 BUILD SUCCESS)。
  • 本机的两个真实 application.yml 保留在磁盘(被忽略,不入库),供本地 spring-boot:run 使用。

测试(5 新增,共 21 个用例)

  • patbond-common/src/test/.../ApiResponseTest.java3)。
  • patbond-user/src/test/.../UserApplicationTests.javacontext loads+ UserControllerTest.java(9:创建成功/重复 409/参数非法 400、verify-password 成功/错密码 401/未知用户 401、getById 200/404、getByUsername 200+404)。
  • patbond-auth/src/test/.../AuthApplicationTests.javacontext loads+ AuthControllerTest.java7):UserClient@MockitoBean 替换,不依赖 user 进程;按现状行为断言(业务失败折叠为 400、FeignException 未翻译逃逸 MVC 层)。

其他

  • Readme.md:重写——技术栈更新、去 Nacos/RabbitMQ、Maven Wrapper 真实启动命令(含 sample→yml 复制步骤)、环境变量表、内存存储现状注记(M4 关闭)。
  • 新增 mvnwmvnw.cmd.mvn/wrapper/maven-wrapper.properties
  • 清理三个模块旧 target/(其中 auth/user 的 target/classes/application.yml 曾硬编码 http://patbond.cn:8848/nacos);全仓 grep 确认除测试注释中对 ADR-002 的引用外无任何 nacos/8848 残留。

3. 验收执行记录

3.1 JAVA_HOME=/usr/lib/jvm/java-17-openjdk ./mvnw clean test

[INFO] Tests run: 3, ...  -- in com.patbond.patbond.common.response.ApiResponseTest
[INFO] Tests run: 1, ...  -- in com.patbond.patbond.user.UserApplicationTests
[INFO] Tests run: 9, ...  -- in com.patbond.patbond.user.controller.UserControllerTest
[INFO] Tests run: 7, ...  -- in com.patbond.patbond.auth.controller.AuthControllerTest
[INFO] Tests run: 1, ...  -- in com.patbond.patbond.auth.AuthApplicationTests
[INFO] patbond-api ........................................ SUCCESS
[INFO] patbond-common ..................................... SUCCESS
[INFO] patbond-user ....................................... SUCCESS
[INFO] patbond-auth ....................................... SUCCESS
[INFO] BUILD SUCCESS

合计 21 个测试,0 失败 0 错误B1 的"0 测试空转"状态解除)。 首轮曾失败:@PathVariable 参数名反射不可用——Boot 3.2+ 行为变化,已在父 pom 加 -parameters 修复后全绿。 补充验证:临时移走两个本地 application.yml(模拟干净检出)后重跑 clean test,仍 BUILD SUCCESS——测试不依赖被忽略的本地配置。

3.2 干净配置启动验证(真实进程,验证后已全部停止)

./mvnw -pl patbond-common install 后两个服务分别 spring-boot:run

Tomcat started on port 8082 ... Started UserApplication in 1.691 seconds
Tomcat started on port 8081 ... Started AuthApplication in 1.789 seconds

端到端冒烟(auth 经静态 URL Feign 调 user):

POST /auth/register → {"code":0,...,"userId":1,"username":"smoketest",...}
POST /auth/login    → {"code":0,...,"accessToken":"5c44a5d3...",...}
POST /auth/login(错密码) → HTTP 500        ← 已知问题,见 4.1
GET  /internal/users/18082 → {"code":0,...,"username":"smoketest",...}

验证后进程已终止,ss 确认 8081/8082 端口释放,无遗留后台进程。

注意事项:单独 -pl 启动前必须先 install patbond-common,否则会从 ~/.m2 拿到旧快照(首次启动失败正是踩到旧 common 里的 nacos 依赖);README 启动步骤已包含该命令。

4. 遗留问题(均为计划内后续工单,非本次回归)

  1. 错误状态码折叠(审计 M1user 返回的 401/409 经 Feign 变成 auth 侧 500/400。AuthControllerTest.loginPropagatesFeignExceptionUnhandled 已把现状钉死为基线,统一异常契约工单动工时该测试会按新契约改写。
  2. B2 三件套未动:内存用户存储、不可验证 token、/internal/** 无访问控制——属数据库/JWT 后续工单,本次仅在 README 中如实标注。
  3. 无 CI 配置(审计 M3 后半)Wrapper 已就位,./mvnw clean test 已可作为门禁命令,但 CI 载体(如 GitHub Actions)仍缺。
  4. AuthTokenResponse.expiresAt 仍为无时区 LocalDateTime,不符 ISO 8601 约定,随 token 重构一并处理。
  5. 旧 common 快照仍在本机 ~/.m2,已被本次 install 覆盖;其他开发机拉取后需重新 ./mvnw -pl patbond-common install