--- name: legacy-ecommerce-demo-repo overview: 创建一个 Java Spring Boot 电商订单系统的"烂代码"演示仓库,涵盖理解老代码、重构、补测试、修Bug、技术栈升级、添加新功能等6大AI辅助场景,约12-15个文件,适合30-45分钟培训实战。 todos: - id: create-project-skeleton content: 创建Maven项目骨架:pom.xml(Spring Boot 2.1.18 + H2 + JDBC依赖)、application.properties、schema.sql status: completed - id: create-models content: 创建数据模型层:Order.java(java.util.Date、无Lombok)、OrderItem.java、OrderStatus.java枚举 status: completed dependencies: - create-project-skeleton - id: create-db-util content: 创建DbUtil.java工具类:硬编码连接串、手动管理Connection、带明显设计缺陷的单例模式 status: completed dependencies: - create-project-skeleton - id: create-dao-layer content: 创建OrderDao.java:原始JDBC操作、SQL字符串拼接(含SQL注入风险)、无连接池、无try-with-resources status: completed dependencies: - create-models - create-db-util - id: create-god-service content: 创建OrderService.java上帝类:400+行、static可变计数器并发Bug、3处重复价格计算、200+行长方法createOrder、System.out日志、无异常处理 status: completed dependencies: - create-dao-layer - id: create-controller content: 创建OrderController.java:混合校验/业务/DAO调用、无DTO分层、硬编码错误消息、search接口暴露SQL注入 status: completed dependencies: - create-god-service - id: create-main-and-readme content: 创建LegacyOrderApplication.java主启动类,以及README.md培训指南(含6大场景操作步骤和学员任务说明) status: completed dependencies: - create-controller - id: verify-and-test content: 使用 [subagent:code-explorer] 验证项目结构完整性,确认可编译、H2自动建表、5个预埋Bug存在、所有API可访问 status: completed dependencies: - create-main-and-readme --- ## 用户需求 为一线开发团队制作一个用于AI编码培训的"传统烂代码"演示仓库,让学员在培训过程中跟着实操,学习如何用AI辅助老旧项目维护。 ## 产品概述 一个刻意设计为"遗留系统"风格的Java Spring Boot电商订单管理后端,包含订单创建、查询、取消等基本功能。代码刻意引入典型遗留系统问题:上帝类、长函数、重复代码、SQL注入风险、硬编码、无测试、无异常处理等。支持一键启动(H2内存数据库),学员无需配置环境即可运行。 ## 核心功能 - 订单CRUD REST API(创建、查询、取消、列表) - H2内存数据库,零配置启动 - 预留6大AI辅助实操场景 ## 六大培训场景设计 1. **理解老代码+添加注释**:学员面对无注释、命名混乱的代码,用AI快速理解业务逻辑并生成文档 2. **重构(拆分大函数/消除重复)**:OrderService中故意放置200+行方法和3处重复的价格计算逻辑 3. **补单元测试**:项目零测试覆盖,学员用AI为关键路径生成JUnit测试 4. **修Bug(埋典型bug)**:预埋SQL注入、并发竞态、空指针、整型溢出、日期比较错误共5个bug 5. **技术栈升级**:从Spring Boot 2.1.x + Java 8 迁移到 Spring Boot 3.x + Java 17(或更高) 6. **添加新功能**:在烂代码基础上增加订单退款、优惠券等新需求 ## 技术栈选择 - **语言**: Java 8(刻意使用旧版本,为升级场景留空间) - **框架**: Spring Boot 2.1.18.RELEASE - **构建工具**: Maven 3.6+ - **数据库**: H2(内存模式,零配置) - **数据访问**: 原始JDBC + 手动连接管理(不使用任何ORM) - **依赖**: spring-boot-starter-web, h2, spring-boot-starter-jdbc ## 实现方案 ### 整体策略 创建一个刻意劣化的Spring Boot应用,每个文件都包含典型遗留代码特征。关键设计原则: - **不用ORM**:直接JDBC操作,手动管理连接,SQL字符串拼接 - **不分层**:Controller直接调用DAO,Service是上帝类 - **不写测试**:整个项目零测试文件 - **不用现代API**:java.util.Date、旧式for循环、避免Stream/Lambda - **全局状态**:使用static可变字段管理订单号序列 ### 遗留代码特征清单 | 特征 | 体现位置 | 培训价值 | | --- | --- | --- | | 上帝类 | OrderService.java (400+行) | 演示AI拆分大类的过程 | | 长方法 | createOrder() 200+行 | 演示AI提取方法 | | 重复代码 | 价格计算在3处重复 | 演示AI消除重复 | | SQL拼接 | OrderDao.java | 演示AI发现安全漏洞 | | 硬编码 | 税率0.17、连接串 | 演示AI提取配置 | | 无日志 | 全部System.out | 演示AI添加日志框架 | | 无异常处理 | 整个项目 | 演示AI添加异常处理 | | 静态可变状态 | orderNumberSequence | 演示AI发现并发问题 | ### 预埋Bug清单 1. **SQL注入**:OrderDao.getOrderByName()使用字符串拼接用户输入 2. **并发竞态**:OrderService中static int orderNumberSequence++无同步 3. **空指针异常**:computeTotalPrice()未检查OrderItem列表是否为空 4. **整型溢出**:折扣计算 int discount = price * discountPercent / 100(price可为大值) 5. **日期比较错误**:使用java.util.Date的before/after而非推荐方式,跨年场景有边界问题 ### 项目结构 ``` legacy-order-system/ ├── pom.xml # [NEW] Maven配置,Spring Boot 2.1.18 + H2 ├── README.md # [NEW] 培训指南,含6大场景操作说明 └── src/main/ ├── java/com/legacy/order/ │ ├── LegacyOrderApplication.java # [NEW] 主启动类,无任何配置分离 │ ├── controller/ │ │ └── OrderController.java # [NEW] REST控制器,600+行,混合了校验、业务、DAO调用 │ ├── service/ │ │ └── OrderService.java # [NEW] 上帝类,400+行,包含所有业务逻辑 │ ├── dao/ │ │ └── OrderDao.java # [NEW] 原始JDBC操作,SQL拼接,连接手动管理 │ ├── model/ │ │ ├── Order.java # [NEW] 订单实体,java.util.Date,无Lombok │ │ ├── OrderItem.java # [NEW] 订单项实体 │ │ └── OrderStatus.java # [NEW] 订单状态枚举 │ └── util/ │ └── DbUtil.java # [NEW] 硬编码连接工具类,单例模式 └── resources/ ├── application.properties # [NEW] 最小化配置,H2内存库 └── schema.sql # [NEW] 建表DDL,自动执行 ``` ### 数据流架构 ```mermaid graph LR A[HTTP Request] --> B[OrderController] B --> C[OrderService
上帝类/全局状态] C --> D[OrderDao
原始JDBC/SQL拼接] D --> E[H2内存数据库] C -.-> F[DbUtil
硬编码连接] F -.-> E ``` ### API设计 | 方法 | 路径 | 说明 | | --- | --- | --- | | POST | /api/orders | 创建订单 | | GET | /api/orders/{id} | 查询单个订单 | | GET | /api/orders | 列出所有订单 | | PUT | /api/orders/{id}/cancel | 取消订单 | | GET | /api/orders/search?name=xxx | 按商品名搜索(含SQL注入风险) | ## 实现注意事项 - **性能**:H2内存库保证启动速度(<2秒),学员无需安装任何外部依赖 - **可移植性**:纯Maven项目,克隆后mvn spring-boot:run即可启动 - **日志**:刻意使用System.out.println模拟旧项目无日志框架的情况 - **编码规范**:刻意使用坏命名(如tmp、data、list、flag等)、魔法数字、无注释 - **向后兼容**:使用Java 8语法,避免模块化系统,兼容JDK 8-17 ## 使用的扩展 ### SubAgent - **code-explorer** - 用途:验证生成的仓库文件结构完整性和代码一致性 - 预期结果:确认所有文件存在、包引用正确、Maven配置有效