From e2c88cead883b31e24891dd99de728918885515b Mon Sep 17 00:00:00 2001 From: micrograils Date: Sat, 13 Jun 2026 17:22:06 +0800 Subject: [PATCH] =?UTF-8?q?chore:=20=E6=B7=BB=E5=8A=A0=20.codebuddy=20?= =?UTF-8?q?=E5=88=B0=20gitignore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../legacy-ecommerce-demo-repo_99b9a35c.md | 175 ------------------ .gitignore | 1 + 2 files changed, 1 insertion(+), 175 deletions(-) delete mode 100644 .codebuddy/plans/legacy-ecommerce-demo-repo_99b9a35c.md diff --git a/.codebuddy/plans/legacy-ecommerce-demo-repo_99b9a35c.md b/.codebuddy/plans/legacy-ecommerce-demo-repo_99b9a35c.md deleted file mode 100644 index 8917989..0000000 --- a/.codebuddy/plans/legacy-ecommerce-demo-repo_99b9a35c.md +++ /dev/null @@ -1,175 +0,0 @@ ---- -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配置有效 \ No newline at end of file diff --git a/.gitignore b/.gitignore index ac44a5a..190892d 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ target/ .idea/ *.iml .vscode/ +.codebuddy/ .settings/ .project .classpath