Week 1-8: Spring Boot 学习计划完整项目

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-04-29 23:45:17 +08:00
commit f95aa18724
201 changed files with 18595 additions and 0 deletions

184
week8/教案.md Normal file
View File

@@ -0,0 +1,184 @@
# Week 8工程化能力
**目标**:掌握测试、文档、部署等工程化技能,交付可测试、有文档、容器化的完整项目。
**前置**:完成 Week 7前后端分离项目
**本周产出**:学生管理系统 v4 — 有单元测试、集成测试、API 文档。
**启动方式**
```bash
cd week8
# 运行测试
mvn test
# 启动应用后访问 API 文档
http://localhost:8080/doc.html
```
---
## Day 1JUnit 5 + Mockito 单元测试
**知识点**
- 测试金字塔:单元测试 → 集成测试 → E2E 测试
- JUnit 5 注解:`@Test``@BeforeEach``@DisplayName`
- 断言:`assertEquals``assertTrue``assertThrows`
- Mockito`@Mock`(模拟依赖)、`@InjectMocks`(注入模拟对象)
- `when(...).thenReturn(...)`:控制 Mock 行为
- `verify()`:验证方法被调用
- `@ExtendWith(MockitoExtension.class)`:初始化 Mockito
- 测试覆盖率:行覆盖 vs 分支覆盖
**动手 → 理解**
1. 阅读 `AuthServiceTest.java`,理解每个 `@Mock` 的含义
2. 运行 `mvn test -Dtest=AuthServiceTest`,观察 5 个测试全部通过
3. 故意把 `testLoginBadPassword` 的期望密码改为正确值,观察测试失败信息
4.`when(...)` 中把返回值改成 `false`,看哪个测试会失败
5. 写一个测试:验证 `register` 成功时 `userRepo.save()` 被调用了 1 次
**核心文件**
- `src/test/java/com/learn/service/AuthServiceTest.java` — 单元测试示例
**思考题**:为什么不直接测试 Service 的真实数据库操作,而是用 Mockito 模拟?
---
## Day 2@SpringBootTest 集成测试
**知识点**
- `@SpringBootTest`:启动完整 Spring 容器
- `@AutoConfigureMockMvc`:模拟 HTTP 请求
- `MockMvc``perform(get(...))``andExpect(status().isOk())``jsonPath()`
- H2 内存数据库:`jdbc:h2:mem:testdb` — 不依赖外部 MySQL
- `@ActiveProfiles("test")`:测试专用配置
- `application-test.yml`:测试环境的 H2 + 禁用 Redis
- `@TestMethodOrder` + `@Order`:控制测试顺序
**动手 → 理解**
1. 阅读 `StudentControllerTest.java`,理解测试流程
2. 运行 `mvn test`,观察 Spring Boot 启动日志中的 `Using profile: "test"`
3. 在测试日志中找到 H2 的 `HikariPool-1 - Starting...` 确认使用内存库
4. 访问 `http://localhost:8080/h2-console`(测试模式下),查看表结构
5. 添加一个测试:验证用 user/123456USER 角色)新增学生时返回 403
**核心文件**
- `src/test/java/com/learn/controller/StudentControllerTest.java` — 集成测试
- `src/main/resources/application-test.yml` — 测试环境配置
**思考题**H2 和 Testcontainers真实 MySQL 容器)各有什么优劣?什么时候该用 Testcontainers
---
## Day 3Knife4j API 文档
**知识点**
- 为什么需要 API 文档:前后端协作、接口调试、新人上手
- Swagger / OpenAPI 3.0 规范
- Knife4j国产增强版 Swagger UI界面更友好
- `@Tag``@Operation``@Parameter` 注解增强文档
- `application.yml` 配置:`springdoc.swagger-ui.path=/doc.html`
- `OpenAPI` Bean自定义文档标题、版本、描述
- 在线调试:在文档页面直接发送请求
**动手 → 理解**
1. 启动项目,访问 `http://localhost:8080/doc.html`
2. 点击 "Auth" 标签,展开 `/api/auth/login`,点击"发送"直接测试
3. 在文档右上角设置全局 Token`Bearer <你的JWT>`
4. 用文档页面的"调试"功能完成一次完整的增删改查
5. 在 Controller 方法上添加 `@Operation(summary = "...")` 注解,刷新文档查看效果
**核心文件**
- `config/Knife4jConfig.java` — API 文档配置
- `pom.xml``knife4j-openapi3-jakarta-spring-boot-starter`
- `application.yml``springdoc.*`
**思考题**API 文档应该暴露在生产环境吗?如果不应该,怎么关闭?
**生产环境安全提示**
```yaml
# 生产环境 application-prod.yml 中关闭文档
springdoc:
api-docs:
enabled: false # 关闭 /v3/api-docs
swagger-ui:
enabled: false # 关闭 /doc.html
```
或在 SecurityConfig 中按 Profile 条件放行:
```java
// 开发环境放行文档,生产环境不放行
@Profile("!prod")
```
**原则**API 文档暴露所有接口结构和参数,生产环境应关闭或加认证保护。
---
## Day 4阶段总结 & 里程碑项目 v4
**知识点**
- 回顾 Week 1-8 的技术栈全景图
- 理解"测试金字塔"在项目中的落地
- 对比 v1 → v4 四个版本的进化
**v1 → v4 进化史**
| 版本 | 周次 | 新增能力 |
|------|------|---------|
| v1 | Week 4 | Spring Boot + JPA/MP + 原生 JS 全栈 |
| v2 | Week 5 | Spring Security + JWT + Redis + Actuator |
| v3 | Week 7 | Vue 3 前后端分离 + Axios + 导航守卫 |
| v4 | Week 8 | 单元测试 + 集成测试 + API 文档 |
**Actuator 端点说明**Week 5 遗留问题):
- `/actuator` — 返回所有**可用端点列表**的 JSON这是正常的
- 真正的监控数据在这些端点:
- `/actuator/health` → 健康状态UP/DOWN
- `/actuator/beans` → Spring 容器中所有 Bean
- `/actuator/env` → 环境变量和配置
- `/actuator/mappings` → 所有 URL 映射
- **安全建议**`/actuator/env` 可能泄露数据库密码等敏感信息,生产环境不应暴露
**动手 → 理解**
1. 画出 v4 的完整架构图Vue → Axios → Spring Boot → JPA/MP → MySQL
2. 检查所有测试是否通过:`mvn test`
3. 检查 API 文档是否完整:`http://localhost:8080/doc.html`
4. 确认 `docker-compose up --build` 能成功启动
5. 补充 `.gitignore``README.md`
**最终项目文件清单**
```
week8/
├── pom.xml # 含 test + knife4j 依赖
├── sql/init.sql # 数据库初始化
├── src/main/
│ ├── java/com/learn/
│ │ ├── config/
│ │ │ ├── Knife4jConfig.java # Day 3: API 文档
│ │ │ └── SecurityConfig.java # 含 CORS
│ │ ├── controller/ # REST API
│ │ ├── entity/ # Student + User
│ │ └── service/ # 双 ORM 实现
│ └── resources/
│ ├── application.yml # 主配置 + springdoc
│ └── application-test.yml # Day 2: H2 测试配置
└── src/test/java/com/learn/
├── service/AuthServiceTest.java # Day 1: 单元测试
└── controller/StudentControllerTest.java # Day 2: 集成测试
```
---
## Week 8 总结
| 维度 | 工具 | 掌握程度 |
|------|------|---------|
| 单元测试 | JUnit 5 + Mockito | Service 层全 Mock 测试 |
| 集成测试 | @SpringBootTest + H2 | Controller 全流程测试 |
| API 文档 | Knife4j / SpringDoc | 自动生成 + 在线调试 |
**下一阶段Week 9-12 — AI Agent 开发**
- Week 9AI & LLM 基础,调用大模型 API
- Week 10Agent 架构 + Function Calling
- Week 11算法入门 + Agent 前端
- Week 12最终项目 —— AI Agent 网站