# book-management-ddd **Repository Path**: netbuffer/book-management-ddd ## Basic Information - **Project Name**: book-management-ddd - **Description**: book-management-ddd based spring boot4,test ddd - **Primary Language**: Java - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-08-27 - **Last Updated**: 2026-08-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: ddd, SpringBoot, Sqlite, Java, JPA ## README # Book Management DDD 一个 DDD(领域驱动设计)教学示范工程:图书管理系统。 用 Spring Boot 4.1 + Java 21 演示"DDD 充血模型"与"MVC 贫血模型"的工程差异。 核心看点: - 业务规则内聚在聚合根里(`Book.borrow()` 自己控制状态机),而不是胖 Service - 自验证值对象(`ISBN` 校验位、`Money`、`BookTitle`)、领域事件、依赖倒置 - 四层架构 + ArchUnit 强制"领域层零框架依赖" - 102 个测试覆盖各层:单测 / Mockito / @DataJpaTest / MockMvc 全链路 ## 架构 ``` interfaces → application → domain ← infrastructure ``` 架构图见 [docs/plantuml/](docs/plantuml/)(四层架构、DDD vs MVC 对比、模块依赖、聚合类图)。 ``` book-management-ddd ├── domain # 领域层:聚合根、值对象、领域事件、仓储接口(零框架依赖) ├── application # 应用层:用例编排、Command、DTO ├── infrastructure # 基础设施层:JPA 实体、仓储实现、MapStruct 映射 └── interfaces # 接口层:REST 控制器、全局异常处理、启动类 ``` ## 跑起来 环境要求:JDK 21+,无需安装 Maven(自带 Wrapper)。 ```bash # 编译 + 全量测试 ./mvnw clean verify # Windows: .\mvnw.cmd clean verify # 启动(8080 端口) ./mvnw -pl interfaces spring-boot:run ``` 启动后: - H2 控制台:http://localhost:8080/h2-console(JDBC URL `jdbc:h2:mem:bookdb`,用户名 `sa`) ## API | 方法 | 路径 | 说明 | |------|------|------| | POST | `/api/books` | 创建书籍 | | GET | `/api/books` | 列表(`?status=AVAILABLE\|BORROWED\|RESERVED`) | | GET | `/api/books/{id}` | 详情 | | DELETE | `/api/books/{id}` | 删除 | | POST | `/api/books/{id}/borrow` | 借书 `{"borrowerName": "张三"}` | | POST | `/api/books/{id}/return` | 还书 | | POST | `/api/books/{id}/reserve` | 预约 | | POST | `/api/books/{id}/cancel-reservation` | 取消预约 | | GET | `/api/books/{id}/price?discount=20` | 折扣价 | 统一响应 `{ success, data, message }`;400 参数错误 / 404 不存在 / 409 状态冲突。 ```bash curl -X POST http://localhost:8080/api/books \ -H "Content-Type: application/json" \ -d '{"title":"呐喊","isbn":"9787111123453","authorName":"鲁迅","price":45.00}' curl -X POST http://localhost:8080/api/books/{id}/borrow \ -H "Content-Type: application/json" \ -d '{"borrowerName":"张三"}' ``` ## License [MIT](LICENSE)