docs:添加AI代码检查执行指南文档
- 添加完整的7步代码检查流程指导 - 包含命名规范、注释标准、代码质量等检查标准 - 提供游戏服务器特殊要求和最佳实践 - 支持NestJS双模式架构和WebSocket实时通信检查 涉及文件: - docs/ai-reading/README.md - 总体执行指南 - docs/ai-reading/step1-naming-convention.md - 命名规范检查 - docs/ai-reading/step2-comment-standard.md - 注释规范检查 - docs/ai-reading/step3-code-quality.md - 代码质量检查 - docs/ai-reading/step4-architecture-layer.md - 架构分层检查 - docs/ai-reading/step5-test-coverage.md - 测试覆盖检查 - docs/ai-reading/step6-documentation.md - 功能文档生成 - docs/ai-reading/step7-code-commit.md - 代码提交规范
This commit is contained in:
304
docs/ai-reading/README.md
Normal file
304
docs/ai-reading/README.md
Normal file
@@ -0,0 +1,304 @@
|
||||
# AI代码检查执行指南 - Whale Town 游戏服务器
|
||||
|
||||
## 🎯 执行前准备
|
||||
|
||||
### 📋 必须收集的用户信息
|
||||
在开始任何检查之前,**必须**收集以下信息:
|
||||
- **用户当前日期**:用于修改记录和时间戳更新
|
||||
- **用户名称**:用于@author字段处理和修改记录
|
||||
|
||||
### 🏗️ 项目特性识别
|
||||
本项目是**NestJS游戏服务器**,具有以下特点:
|
||||
- **双模式架构**:支持数据库模式和内存模式
|
||||
- **实时通信**:基于WebSocket的实时双向通信
|
||||
- **属性测试**:管理员模块使用fast-check进行随机化测试
|
||||
- **分层架构**:Core层(技术实现)+ Business层(业务逻辑)
|
||||
|
||||
## 🔄 执行原则
|
||||
|
||||
### ⚠️ 强制要求
|
||||
- **分步执行**:每次只执行一个步骤,严禁跳步骤或合并执行
|
||||
- **等待确认**:每步完成后必须等待用户确认才能进行下一步
|
||||
- **修改验证**:每次修改文件后必须重新检查该步骤并提供验证报告
|
||||
- **🔥 修改后必须重新执行当前步骤**:如果在当前步骤中发生了任何修改行为(文件修改、重命名、移动等),AI必须立即重新执行该步骤的完整检查,不能直接进入下一步骤
|
||||
- **问题修复后重检**:如果当前步骤出现问题需要修改时,AI必须在解决问题后重新执行该步骤,确保没有其他遗漏的问题
|
||||
- **用户信息使用**:所有日期字段使用用户提供的真实日期,@author字段正确处理
|
||||
|
||||
### 🎯 执行流程
|
||||
```
|
||||
用户请求代码检查
|
||||
↓
|
||||
收集用户信息(日期、名称)
|
||||
↓
|
||||
识别项目特性
|
||||
↓
|
||||
执行步骤1 → 提供报告 → 等待确认
|
||||
↓
|
||||
[如果发生修改] → 🔥 立即重新执行步骤1 → 验证报告 → 等待确认
|
||||
↓
|
||||
执行步骤2 → 提供报告 → 等待确认
|
||||
↓
|
||||
[如果发生修改] → 🔥 立即重新执行步骤2 → 验证报告 → 等待确认
|
||||
↓
|
||||
执行步骤3 → 提供报告 → 等待确认
|
||||
↓
|
||||
[如果发生修改] → 🔥 立即重新执行步骤3 → 验证报告 → 等待确认
|
||||
↓
|
||||
执行步骤4 → 提供报告 → 等待确认
|
||||
↓
|
||||
[如果发生修改] → 🔥 立即重新执行步骤4 → 验证报告 → 等待确认
|
||||
↓
|
||||
执行步骤5 → 提供报告 → 等待确认
|
||||
↓
|
||||
[如果发生修改] → 🔥 立即重新执行步骤5 → 验证报告 → 等待确认
|
||||
↓
|
||||
执行步骤6 → 提供报告 → 等待确认
|
||||
↓
|
||||
[如果发生修改] → 🔥 立即重新执行步骤6 → 验证报告 → 等待确认
|
||||
↓
|
||||
执行步骤7 → 提供报告 → 等待确认
|
||||
↓
|
||||
[如果发生修改] → 🔥 立即重新执行步骤7 → 验证报告 → 等待确认
|
||||
|
||||
⚠️ 关键规则:任何步骤中发生修改行为后,必须立即重新执行该步骤!
|
||||
```
|
||||
|
||||
## 📚 步骤执行指导
|
||||
|
||||
### 步骤1:命名规范检查
|
||||
**执行时读取:** `step1-naming-convention.md`
|
||||
**重点关注:** 文件夹结构扁平化、游戏服务器特殊文件类型
|
||||
**完成后:** 提供检查报告,等待用户确认
|
||||
|
||||
### 步骤2:注释规范检查
|
||||
**执行时读取:** `step2-comment-standard.md`
|
||||
**重点关注:** @author字段处理、修改记录更新、时间戳规则
|
||||
**完成后:** 提供检查报告,等待用户确认
|
||||
|
||||
### 步骤3:代码质量检查
|
||||
**执行时读取:** `step3-code-quality.md`
|
||||
**重点关注:** TODO项处理、未使用代码清理
|
||||
**完成后:** 提供检查报告,等待用户确认
|
||||
|
||||
### 步骤4:架构分层检查
|
||||
**执行时读取:** `step4-architecture-layer.md`
|
||||
**重点关注:** Core层命名规范、依赖关系检查
|
||||
**完成后:** 提供检查报告,等待用户确认
|
||||
|
||||
### 步骤5:测试覆盖检查
|
||||
**执行时读取:** `step5-test-coverage.md`
|
||||
**重点关注:** 严格一对一测试映射、测试文件位置、测试执行验证
|
||||
**完成后:** 提供检查报告,等待用户确认
|
||||
|
||||
#### 🧪 测试文件调试规范
|
||||
**调试测试文件时必须遵循以下流程:**
|
||||
|
||||
1. **读取jest.config.js配置**
|
||||
- 查看jest.config.js了解测试环境配置
|
||||
- 确认testRegex模式和文件匹配规则
|
||||
- 了解moduleNameMapper和其他配置项
|
||||
|
||||
2. **使用package.json中的已有测试指令**
|
||||
- **禁止自定义jest命令**:必须使用package.json中scripts定义的测试命令
|
||||
- **常用测试指令**:
|
||||
- `npm run test` - 运行所有测试
|
||||
- `npm run test:unit` - 运行单元测试(.spec.ts文件)
|
||||
- `npm run test:integration` - 运行集成测试(.integration.spec.ts文件)
|
||||
- `npm run test:e2e` - 运行端到端测试(.e2e.spec.ts文件)
|
||||
- `npm run test:watch` - 监视模式运行测试
|
||||
- `npm run test:cov` - 运行测试并生成覆盖率报告
|
||||
- `npm run test:debug` - 调试模式运行测试
|
||||
- `npm run test:isolated` - 隔离运行测试
|
||||
|
||||
3. **特定模块测试指令**
|
||||
- **Zulip模块测试**:
|
||||
- `npm run test:zulip` - 运行所有Zulip相关测试
|
||||
- `npm run test:zulip:unit` - 运行Zulip单元测试
|
||||
- `npm run test:zulip:integration` - 运行Zulip集成测试
|
||||
- `npm run test:zulip:e2e` - 运行Zulip端到端测试
|
||||
- `npm run test:zulip:performance` - 运行Zulip性能测试
|
||||
|
||||
4. **测试执行验证流程**
|
||||
```
|
||||
发现测试问题 → 读取jest.config.js → 选择合适的npm run test:xxx指令 → 执行测试 → 分析结果 → 修复问题 → 重新执行测试
|
||||
```
|
||||
|
||||
5. **测试指令选择原则**
|
||||
- **单个文件测试**:使用`npm run test -- 文件路径`
|
||||
- **特定类型测试**:使用对应的test:xxx指令
|
||||
- **调试测试**:优先使用`npm run test:debug`
|
||||
- **CI/CD环境**:使用`npm run test:isolated`
|
||||
|
||||
### 步骤6:功能文档生成
|
||||
**执行时读取:** `step6-documentation.md`
|
||||
**重点关注:** API接口文档、WebSocket事件文档
|
||||
**完成后:** 提供检查报告,等待用户确认
|
||||
|
||||
### 步骤7:代码提交
|
||||
**执行时读取:** `step7-code-commit.md`
|
||||
**重点关注:** Git变更校验、修改记录一致性检查、规范化提交流程
|
||||
**完成后:** 提供检查报告,等待用户确认
|
||||
|
||||
## 📋 统一报告模板
|
||||
|
||||
每步完成后使用此模板报告:
|
||||
|
||||
```
|
||||
## 步骤X:[步骤名称]检查报告
|
||||
|
||||
### 🔍 检查结果
|
||||
[发现的问题列表]
|
||||
|
||||
### 🛠️ 修正方案
|
||||
[具体修正建议]
|
||||
|
||||
### ✅ 完成状态
|
||||
- 检查项1 ✓/✗
|
||||
- 检查项2 ✓/✗
|
||||
|
||||
**请确认修正方案,确认后进行下一步骤**
|
||||
```
|
||||
|
||||
## 🚨 全局约束
|
||||
|
||||
### 📝 文件修改记录规范(重要)
|
||||
**每次执行完修改后,文件顶部都需要更新修改记录和相关信息**
|
||||
|
||||
#### 修改类型定义
|
||||
- `代码规范优化` - 命名规范、注释规范、代码清理等
|
||||
- `功能新增` - 添加新的功能或方法
|
||||
- `功能修改` - 修改现有功能的实现
|
||||
- `Bug修复` - 修复代码缺陷
|
||||
- `性能优化` - 提升代码性能
|
||||
- `重构` - 代码结构调整但功能不变
|
||||
|
||||
#### 修改记录格式要求
|
||||
```typescript
|
||||
/**
|
||||
* 最近修改:
|
||||
* - [用户日期]: 代码规范优化 - 清理未使用的导入 (修改者: [用户名称])
|
||||
* - 2024-01-06: Bug修复 - 修复邮箱验证逻辑错误 (修改者: 李四)
|
||||
* - 2024-01-05: 功能新增 - 添加用户验证码登录功能 (修改者: 王五)
|
||||
*
|
||||
* @author [处理后的作者名称]
|
||||
* @version x.x.x
|
||||
* @since [创建日期]
|
||||
* @lastModified [用户日期]
|
||||
*/
|
||||
```
|
||||
|
||||
#### 🔢 最近修改记录数量限制
|
||||
- **最多保留5条**:最近修改记录最多只保留最新的5条记录
|
||||
- **超出自动删除**:当添加新的修改记录时,如果超过5条,自动删除最旧的记录
|
||||
- **保持时间顺序**:记录按时间倒序排列,最新的在最上面
|
||||
- **完整记录保留**:每条记录必须包含完整的日期、修改类型、描述和修改者信息
|
||||
|
||||
#### 版本号递增规则
|
||||
- **修订版本+1**:代码规范优化、Bug修复 (1.0.0 → 1.0.1)
|
||||
- **次版本+1**:功能新增、功能修改 (1.0.1 → 1.1.0)
|
||||
- **主版本+1**:重构、架构变更 (1.1.0 → 2.0.0)
|
||||
|
||||
#### 时间更新规则
|
||||
- **仅检查不修改**:如果只是检查而没有实际修改文件内容,**不更新**@lastModified字段
|
||||
- **实际修改才更新**:只有真正修改了文件内容时才更新@lastModified字段和添加修改记录
|
||||
- **Git变更检测**:通过`git status`和`git diff`检查文件是否有实际变更,只有git显示文件被修改时才需要添加修改记录和更新时间戳
|
||||
|
||||
### @author字段处理规范
|
||||
- **保留原则**:人名必须保留,不得随意修改
|
||||
- **AI标识替换**:只有AI标识(kiro、ChatGPT、Claude、AI等)才可替换为用户名称
|
||||
- **判断示例**:`@author kiro` → 可替换,`@author 张三` → 必须保留
|
||||
|
||||
### 游戏服务器特殊要求
|
||||
- **WebSocket文件**:Gateway文件必须有完整的连接、消息处理测试
|
||||
- **双模式服务**:内存服务和数据库服务都需要完整测试覆盖
|
||||
- **属性测试**:管理员模块使用fast-check进行属性测试
|
||||
- **测试分离**:严格区分单元测试、集成测试、E2E测试、性能测试
|
||||
|
||||
## 🔧 修改验证流程
|
||||
|
||||
### 🔥 修改后立即重新执行规则(重要)
|
||||
**任何步骤中发生修改行为后,AI必须立即重新执行该步骤,不能直接进入下一步骤!**
|
||||
|
||||
#### 修改行为包括但不限于:
|
||||
- 文件内容修改(代码、注释、配置等)
|
||||
- 文件重命名
|
||||
- 文件移动
|
||||
- 文件删除
|
||||
- 新建文件
|
||||
- 文件夹结构调整
|
||||
|
||||
#### 强制执行流程:
|
||||
```
|
||||
步骤执行中 → 发现问题 → 执行修改 → 🔥 立即重新执行该步骤 → 验证无遗漏 → 用户确认 → 下一步骤
|
||||
```
|
||||
|
||||
### 问题修复后的重检流程
|
||||
当在任何步骤中发现问题并进行修改后,必须遵循以下流程:
|
||||
|
||||
1. **执行修改操作**
|
||||
- 根据发现的问题进行具体修改
|
||||
- 确保修改内容准确无误
|
||||
- **更新文件顶部的修改记录、版本号和@lastModified字段**
|
||||
|
||||
2. **🔥 立即重新执行当前步骤**
|
||||
- **不能跳过这一步!**
|
||||
- 完整重新执行该步骤的所有检查项
|
||||
- 不能只检查修改的部分,必须全面重检
|
||||
|
||||
3. **提供验证报告**
|
||||
- 确认之前发现的问题已解决
|
||||
- 确认没有引入新的问题
|
||||
- 确认没有遗漏其他问题
|
||||
|
||||
4. **等待用户确认**
|
||||
- 提供完整的验证报告
|
||||
- 等待用户确认后才能进行下一步骤
|
||||
|
||||
### 验证报告模板
|
||||
```
|
||||
## 步骤X:修改验证报告
|
||||
|
||||
### 🔧 已执行的修改操作
|
||||
- 修改类型:[文件修改/重命名/移动/删除等]
|
||||
- 修改内容:[具体修改描述]
|
||||
- 影响文件:[受影响的文件列表]
|
||||
|
||||
### 📝 已更新的修改记录
|
||||
- 添加修改记录:[用户日期]: [修改类型] - [修改内容] (修改者: [用户名称])
|
||||
- 更新版本号:[旧版本] → [新版本]
|
||||
- 更新时间戳:@lastModified [用户日期]
|
||||
|
||||
### 🔍 重新执行步骤X的完整检查结果
|
||||
[完整重新执行该步骤的所有检查项的结果]
|
||||
|
||||
### ✅ 验证状态
|
||||
- 原问题已解决 ✓
|
||||
- 修改记录已更新 ✓
|
||||
- 无新问题引入 ✓
|
||||
- 无其他遗漏问题 ✓
|
||||
- 步骤X检查完全通过 ✓
|
||||
|
||||
**🔥 重要:本步骤已完成修改并重新验证,请确认后进行下一步骤**
|
||||
```
|
||||
|
||||
### 重检的重要性
|
||||
- **确保完整性**:避免修改过程中遗漏其他问题
|
||||
- **防止新问题**:确保修改没有引入新的问题
|
||||
- **保证质量**:每个步骤都达到完整的检查标准
|
||||
- **维护一致性**:确保整个检查过程的严谨性
|
||||
- **🔥 强制执行**:修改后必须重新执行,不能跳过这个环节
|
||||
|
||||
## ⚡ 关键成功要素
|
||||
|
||||
- **严格按步骤执行**:不跳步骤,不合并执行
|
||||
- **🔥 修改后立即重新执行**:任何修改行为后必须立即重新执行当前步骤,不能直接进入下一步
|
||||
- **问题修复后必须重检**:修改文件后必须重新执行整个步骤,确保无遗漏
|
||||
- **修改记录必须更新**:每次修改文件后都必须更新文件顶部的修改记录、版本号和时间戳
|
||||
- **真实修改验证**:通过工具验证修改效果
|
||||
- **用户信息准确使用**:日期和名称信息正确应用
|
||||
- **项目特性适配**:针对游戏服务器特点优化检查
|
||||
- **完整报告提供**:每步都提供详细的检查报告
|
||||
|
||||
---
|
||||
|
||||
**开始执行前,请确认已收集用户日期和名称信息!**
|
||||
167
docs/ai-reading/step1-naming-convention.md
Normal file
167
docs/ai-reading/step1-naming-convention.md
Normal file
@@ -0,0 +1,167 @@
|
||||
# 步骤1:命名规范检查
|
||||
|
||||
## 🎯 检查目标
|
||||
检查和修正所有命名规范问题,确保项目代码命名一致性。
|
||||
|
||||
## 📋 命名规范标准
|
||||
|
||||
### 文件和文件夹命名
|
||||
- **规则**:snake_case(下划线分隔),保持项目一致性
|
||||
- **示例**:
|
||||
```
|
||||
✅ 正确:user_controller.ts, admin_operation_log_service.ts
|
||||
❌ 错误:UserController.ts, user-service.ts, adminOperationLog.service.ts
|
||||
```
|
||||
|
||||
### 变量和函数命名
|
||||
- **规则**:camelCase(小驼峰命名)
|
||||
- **示例**:
|
||||
```typescript
|
||||
✅ 正确:const userName = 'test'; function getUserInfo() {}
|
||||
❌ 错误:const UserName = 'test'; function GetUserInfo() {}
|
||||
```
|
||||
|
||||
### 类和接口命名
|
||||
- **规则**:PascalCase(大驼峰命名)
|
||||
- **示例**:
|
||||
```typescript
|
||||
✅ 正确:class UserService {} interface GameConfig {}
|
||||
❌ 错误:class userService {} interface gameConfig {}
|
||||
```
|
||||
|
||||
### 常量命名
|
||||
- **规则**:SCREAMING_SNAKE_CASE(全大写+下划线)
|
||||
- **示例**:
|
||||
```typescript
|
||||
✅ 正确:const MAX_RETRY_COUNT = 3; const SALT_ROUNDS = 10;
|
||||
❌ 错误:const maxRetryCount = 3; const saltRounds = 10;
|
||||
```
|
||||
|
||||
### 路由命名
|
||||
- **规则**:kebab-case(短横线分隔)
|
||||
- **示例**:
|
||||
```typescript
|
||||
✅ 正确:@Get('user/get-info') @Post('room/join-room')
|
||||
❌ 错误:@Get('user/getInfo') @Post('room/joinRoom')
|
||||
```
|
||||
|
||||
## 🎮 游戏服务器特殊文件类型
|
||||
|
||||
### WebSocket相关文件
|
||||
```
|
||||
✅ 正确命名:
|
||||
- location_broadcast.gateway.ts # WebSocket网关
|
||||
- websocket_auth.guard.ts # WebSocket认证守卫
|
||||
- realtime_chat.service.ts # 实时通信服务
|
||||
```
|
||||
|
||||
### 双模式服务文件
|
||||
```
|
||||
✅ 正确命名:
|
||||
- users_memory.service.ts # 内存模式服务
|
||||
- users_database.service.ts # 数据库模式服务
|
||||
- file_redis.service.ts # Redis文件存储
|
||||
```
|
||||
|
||||
### 测试文件分类
|
||||
```
|
||||
✅ 正确命名:
|
||||
- user.service.spec.ts # 单元测试
|
||||
- admin.integration.spec.ts # 集成测试
|
||||
- location.property.spec.ts # 属性测试(管理员模块)
|
||||
- auth.e2e.spec.ts # E2E测试
|
||||
- websocket.perf.spec.ts # 性能测试
|
||||
```
|
||||
|
||||
## 🏗️ 文件夹结构检查
|
||||
|
||||
### 检查方法(必须使用工具)
|
||||
1. **使用listDirectory工具**:`listDirectory(path, depth=2)`获取完整结构
|
||||
2. **统计文件数量**:逐个文件夹统计文件数量
|
||||
3. **识别单文件文件夹**:只有1个文件的文件夹
|
||||
4. **执行扁平化**:将文件移动到上级目录
|
||||
5. **更新引用路径**:修改所有import语句
|
||||
|
||||
### 扁平化标准
|
||||
- **≤3个文件**:必须扁平化处理
|
||||
- **≥4个文件**:通常保持独立文件夹
|
||||
- **完整功能模块**:即使文件较少也可保持独立(需特殊说明)
|
||||
|
||||
### 测试文件位置规范(重要)
|
||||
- ✅ **正确**:测试文件与源文件放在同一目录
|
||||
- ❌ **错误**:测试文件放在单独的tests/、test/、spec/、__tests__/文件夹
|
||||
|
||||
```
|
||||
✅ 正确结构:
|
||||
src/business/auth/
|
||||
├── auth.service.ts
|
||||
├── auth.service.spec.ts
|
||||
├── auth.controller.ts
|
||||
└── auth.controller.spec.ts
|
||||
|
||||
❌ 错误结构:
|
||||
src/business/auth/
|
||||
├── auth.service.ts
|
||||
├── auth.controller.ts
|
||||
└── tests/
|
||||
├── auth.service.spec.ts
|
||||
└── auth.controller.spec.ts
|
||||
```
|
||||
|
||||
## 🔧 Core层命名规则
|
||||
|
||||
### 业务支撑模块(使用_core后缀)
|
||||
专门为特定业务功能提供技术支撑:
|
||||
```
|
||||
✅ 正确:
|
||||
- location_broadcast_core/ # 为位置广播业务提供技术支撑
|
||||
- admin_core/ # 为管理员业务提供技术支撑
|
||||
- user_auth_core/ # 为用户认证业务提供技术支撑
|
||||
```
|
||||
|
||||
### 通用工具模块(不使用后缀)
|
||||
提供可复用的数据访问或技术服务:
|
||||
```
|
||||
✅ 正确:
|
||||
- user_profiles/ # 通用用户档案数据访问
|
||||
- redis/ # 通用Redis技术封装
|
||||
- logger/ # 通用日志工具服务
|
||||
```
|
||||
|
||||
### 判断方法
|
||||
```
|
||||
1. 模块是否专门为某个特定业务服务?
|
||||
├─ 是 → 使用_core后缀
|
||||
└─ 否 → 不使用后缀
|
||||
|
||||
2. 实际案例:
|
||||
- user_profiles: 通用数据访问 → 不使用后缀 ✓
|
||||
- location_broadcast_core: 专门为位置广播服务 → 使用_core后缀 ✓
|
||||
```
|
||||
|
||||
## ⚠️ 常见检查错误
|
||||
|
||||
1. **只看文件夹名称,不检查内容**
|
||||
2. **凭印象判断,不使用工具获取准确数据**
|
||||
3. **遗漏≤3个文件文件夹的识别**
|
||||
4. **忽略测试文件夹扁平化**:认为tests文件夹是"标准结构"
|
||||
|
||||
## 🔍 检查执行步骤
|
||||
|
||||
1. **使用listDirectory工具检查目标文件夹结构**
|
||||
2. **逐个检查文件和文件夹命名是否符合规范**
|
||||
3. **统计每个文件夹的文件数量**
|
||||
4. **识别需要扁平化的文件夹(≤3个文件)**
|
||||
5. **检查Core层模块命名是否正确**
|
||||
6. **执行必要的文件移动和重命名操作**
|
||||
7. **更新所有相关的import路径引用**
|
||||
8. **验证修改后的结构和命名**
|
||||
|
||||
## 🔥 重要提醒
|
||||
|
||||
**如果在本步骤中执行了任何修改操作(文件重命名、移动、删除等),必须立即重新执行步骤1的完整检查!**
|
||||
|
||||
- ✅ 执行修改 → 🔥 立即重新执行步骤1 → 提供验证报告 → 等待用户确认
|
||||
- ❌ 执行修改 → 直接进入步骤2(错误做法)
|
||||
|
||||
**不能跳过重新检查环节!**
|
||||
250
docs/ai-reading/step2-comment-standard.md
Normal file
250
docs/ai-reading/step2-comment-standard.md
Normal file
@@ -0,0 +1,250 @@
|
||||
# 步骤2:注释规范检查
|
||||
|
||||
## 🎯 检查目标
|
||||
检查和完善所有注释规范,确保文件头、类、方法注释的完整性和准确性。
|
||||
|
||||
## 📋 注释规范标准
|
||||
|
||||
### 文件头注释(必须包含)
|
||||
```typescript
|
||||
/**
|
||||
* 文件功能描述
|
||||
*
|
||||
* 功能描述:
|
||||
* - 主要功能点1
|
||||
* - 主要功能点2
|
||||
* - 主要功能点3
|
||||
*
|
||||
* 职责分离:
|
||||
* - 职责描述1
|
||||
* - 职责描述2
|
||||
*
|
||||
* 最近修改:
|
||||
* - [用户日期]: 修改类型 - 修改内容 (修改者: [用户名称])
|
||||
* - [历史日期]: 修改类型 - 修改内容 (修改者: 历史修改者)
|
||||
*
|
||||
* @author [处理后的作者名称]
|
||||
* @version x.x.x
|
||||
* @since [创建日期]
|
||||
* @lastModified [用户日期]
|
||||
*/
|
||||
```
|
||||
|
||||
### 类注释(必须包含)
|
||||
```typescript
|
||||
/**
|
||||
* 类功能描述
|
||||
*
|
||||
* 职责:
|
||||
* - 主要职责1
|
||||
* - 主要职责2
|
||||
*
|
||||
* 主要方法:
|
||||
* - method1() - 方法1功能
|
||||
* - method2() - 方法2功能
|
||||
*
|
||||
* 使用场景:
|
||||
* - 场景描述
|
||||
*/
|
||||
@Injectable()
|
||||
export class ExampleService {
|
||||
// 类实现
|
||||
}
|
||||
```
|
||||
|
||||
### 方法注释(必须包含)
|
||||
```typescript
|
||||
/**
|
||||
* 方法功能描述
|
||||
*
|
||||
* 业务逻辑:
|
||||
* 1. 步骤1描述
|
||||
* 2. 步骤2描述
|
||||
* 3. 步骤3描述
|
||||
*
|
||||
* @param paramName 参数描述
|
||||
* @returns 返回值描述
|
||||
* @throws ExceptionType 异常情况描述
|
||||
*
|
||||
* @example
|
||||
* ```typescript
|
||||
* const result = await service.methodName(param);
|
||||
* ```
|
||||
*/
|
||||
async methodName(paramName: ParamType): Promise<ReturnType> {
|
||||
// 方法实现
|
||||
}
|
||||
```
|
||||
|
||||
## 🔧 @author字段处理规范
|
||||
|
||||
### 处理原则
|
||||
- **保留人名**:如果@author是人名,必须保留不变
|
||||
- **替换AI标识**:只有AI标识才可替换为用户名称
|
||||
|
||||
### 判断标准
|
||||
```typescript
|
||||
// ✅ 可以替换的AI标识
|
||||
@author kiro → 替换为 @author [用户名称]
|
||||
@author ChatGPT → 替换为 @author [用户名称]
|
||||
@author Claude → 替换为 @author [用户名称]
|
||||
@author AI → 替换为 @author [用户名称]
|
||||
|
||||
// ❌ 必须保留的人名
|
||||
@author 张三 → 保留为 @author 张三
|
||||
@author John Smith → 保留为 @author John Smith
|
||||
@author 李四 → 保留为 @author 李四
|
||||
```
|
||||
|
||||
## 📝 修改记录规范
|
||||
|
||||
### 检查要点
|
||||
步骤2需要检查文件头注释中的修改记录是否符合全局规范(详见README.md全局约束部分):
|
||||
|
||||
- ✅ 修改记录格式是否正确
|
||||
- ✅ 修改类型是否准确
|
||||
- ✅ 用户日期和名称是否正确使用
|
||||
- ✅ 版本号是否按规则递增
|
||||
- ✅ @lastModified字段是否正确更新
|
||||
|
||||
### 常见检查项
|
||||
```typescript
|
||||
// ✅ 检查修改记录格式
|
||||
/**
|
||||
* 最近修改:
|
||||
* - [用户日期]: 代码规范优化 - 清理未使用的导入 (修改者: [用户名称])
|
||||
* - 历史记录...
|
||||
*/
|
||||
|
||||
// ✅ 检查版本号递增
|
||||
@version 1.0.1 // 代码规范优化应该递增修订版本
|
||||
|
||||
// ✅ 检查时间戳更新
|
||||
@lastModified [用户日期] // 只有实际修改才更新
|
||||
```
|
||||
|
||||
**注意:具体的修改记录规范请参考README.md中的全局约束部分**
|
||||
|
||||
## 📊 版本号递增规则
|
||||
|
||||
### 检查要点
|
||||
步骤2需要检查版本号是否按照全局规范正确递增(详见README.md全局约束部分):
|
||||
|
||||
- ✅ 代码规范优化、Bug修复 → 修订版本+1
|
||||
- ✅ 功能新增、功能修改 → 次版本+1
|
||||
- ✅ 重构、架构变更 → 主版本+1
|
||||
|
||||
### 检查示例
|
||||
```typescript
|
||||
// 检查版本号递增是否正确
|
||||
@version 1.0.0 → @version 1.0.1 // 代码规范优化
|
||||
@version 1.0.1 → @version 1.1.0 // 功能新增
|
||||
@version 1.1.0 → @version 2.0.0 // 重构
|
||||
```
|
||||
|
||||
## ⏰ 时间更新规则
|
||||
|
||||
### 检查要点
|
||||
步骤2需要检查时间戳更新是否符合全局规范(详见README.md全局约束部分):
|
||||
|
||||
- ✅ 仅检查不修改时,不更新@lastModified字段
|
||||
- ✅ 实际修改文件内容时,才更新@lastModified字段
|
||||
- ✅ 使用Git变更检测确认文件是否真正被修改
|
||||
|
||||
### Git变更检测检查
|
||||
```bash
|
||||
git status # 检查是否有文件被修改
|
||||
git diff [filename] # 检查具体修改内容
|
||||
```
|
||||
|
||||
**注意:具体的时间更新规则请参考README.md中的全局约束部分**
|
||||
|
||||
## 🎮 游戏服务器特殊注释要求
|
||||
|
||||
### WebSocket Gateway注释
|
||||
```typescript
|
||||
/**
|
||||
* 位置广播WebSocket网关
|
||||
*
|
||||
* 功能描述:
|
||||
* - 处理客户端WebSocket连接
|
||||
* - 实时广播用户位置更新
|
||||
* - 管理游戏房间成员
|
||||
*
|
||||
* WebSocket事件:
|
||||
* - connection: 客户端连接事件
|
||||
* - position_update: 位置更新事件
|
||||
* - disconnect: 客户端断开事件
|
||||
*/
|
||||
```
|
||||
|
||||
### 双模式服务注释
|
||||
```typescript
|
||||
/**
|
||||
* 用户服务(内存模式)
|
||||
*
|
||||
* 功能描述:
|
||||
* - 提供用户数据的内存存储访问
|
||||
* - 支持开发测试和故障降级场景
|
||||
* - 与数据库模式保持接口一致性
|
||||
*
|
||||
* 模式特点:
|
||||
* - 数据存储在内存Map中
|
||||
* - 应用重启后数据丢失
|
||||
* - 适用于开发测试环境
|
||||
*/
|
||||
```
|
||||
|
||||
### 属性测试注释
|
||||
```typescript
|
||||
/**
|
||||
* 管理员服务属性测试
|
||||
*
|
||||
* 功能描述:
|
||||
* - 使用fast-check进行基于属性的随机测试
|
||||
* - 验证管理员操作的正确性和边界条件
|
||||
* - 自动发现潜在的边界情况问题
|
||||
*
|
||||
* 测试策略:
|
||||
* - 随机生成用户状态变更
|
||||
* - 验证操作结果的一致性
|
||||
* - 检查异常处理的完整性
|
||||
*/
|
||||
```
|
||||
|
||||
## 🔍 检查执行步骤
|
||||
|
||||
1. **检查文件头注释完整性**
|
||||
- 功能描述是否清晰
|
||||
- 职责分离是否明确
|
||||
- 修改记录是否使用用户信息
|
||||
- @author字段是否正确处理
|
||||
|
||||
2. **检查类注释完整性**
|
||||
- 职责描述是否清晰
|
||||
- 主要方法是否列出
|
||||
- 使用场景是否说明
|
||||
|
||||
3. **检查方法注释完整性**
|
||||
- 业务逻辑步骤是否详细
|
||||
- @param、@returns、@throws是否完整
|
||||
- @example是否提供
|
||||
|
||||
4. **验证修改记录和版本号**
|
||||
- 使用git检查文件是否有实际变更
|
||||
- 根据修改类型正确递增版本号
|
||||
- 只有实际修改才更新时间戳
|
||||
|
||||
5. **特殊文件类型注释检查**
|
||||
- WebSocket Gateway的事件说明
|
||||
- 双模式服务的模式特点
|
||||
- 属性测试的测试策略
|
||||
|
||||
## 🔥 重要提醒
|
||||
|
||||
**如果在本步骤中执行了任何修改操作(添加注释、更新修改记录、修正@author字段等),必须立即重新执行步骤2的完整检查!**
|
||||
|
||||
- ✅ 执行修改 → 🔥 立即重新执行步骤2 → 提供验证报告 → 等待用户确认
|
||||
- ❌ 执行修改 → 直接进入步骤3(错误做法)
|
||||
|
||||
**不能跳过重新检查环节!**
|
||||
327
docs/ai-reading/step3-code-quality.md
Normal file
327
docs/ai-reading/step3-code-quality.md
Normal file
@@ -0,0 +1,327 @@
|
||||
# 步骤3:代码质量检查
|
||||
|
||||
## 🎯 检查目标
|
||||
清理和优化代码质量,消除未使用代码、规范常量定义、处理TODO项。
|
||||
|
||||
## 🧹 未使用代码清理
|
||||
|
||||
### 清理未使用的导入
|
||||
```typescript
|
||||
// ❌ 错误:导入未使用的模块
|
||||
import { Injectable, NotFoundException, BadRequestException } from '@nestjs/common';
|
||||
import { User, Admin } from './user.entity';
|
||||
import * as crypto from 'crypto'; // 未使用
|
||||
import { RedisService } from '../redis/redis.service'; // 未使用
|
||||
|
||||
// ✅ 正确:只导入使用的模块
|
||||
import { Injectable, NotFoundException } from '@nestjs/common';
|
||||
import { User } from './user.entity';
|
||||
```
|
||||
|
||||
### 清理未使用的变量
|
||||
```typescript
|
||||
// ❌ 错误:定义但未使用的变量
|
||||
const unusedVariable = 'test';
|
||||
let tempData = [];
|
||||
|
||||
// ✅ 正确:删除未使用的变量
|
||||
// 只保留实际使用的变量
|
||||
```
|
||||
|
||||
### 清理未使用的方法
|
||||
```typescript
|
||||
// ❌ 错误:定义但未调用的私有方法
|
||||
private generateVerificationCode(): string {
|
||||
// 如果这个方法没有被调用,应该删除
|
||||
}
|
||||
|
||||
// ✅ 正确:删除未使用的私有方法
|
||||
// 或者确保方法被正确调用
|
||||
```
|
||||
|
||||
## 📊 常量定义规范
|
||||
|
||||
### 使用SCREAMING_SNAKE_CASE
|
||||
```typescript
|
||||
// ✅ 正确:使用全大写+下划线
|
||||
const SALT_ROUNDS = 10;
|
||||
const MAX_LOGIN_ATTEMPTS = 5;
|
||||
const DEFAULT_PAGE_SIZE = 20;
|
||||
const WEBSOCKET_TIMEOUT = 30000;
|
||||
const MAX_ROOM_CAPACITY = 100;
|
||||
|
||||
// ❌ 错误:使用小驼峰
|
||||
const saltRounds = 10;
|
||||
const maxLoginAttempts = 5;
|
||||
const defaultPageSize = 20;
|
||||
```
|
||||
|
||||
### 提取魔法数字为常量
|
||||
```typescript
|
||||
// ❌ 错误:使用魔法数字
|
||||
if (attempts > 5) {
|
||||
throw new Error('Too many attempts');
|
||||
}
|
||||
setTimeout(callback, 30000);
|
||||
|
||||
// ✅ 正确:提取为常量
|
||||
const MAX_LOGIN_ATTEMPTS = 5;
|
||||
const WEBSOCKET_TIMEOUT = 30000;
|
||||
|
||||
if (attempts > MAX_LOGIN_ATTEMPTS) {
|
||||
throw new Error('Too many attempts');
|
||||
}
|
||||
setTimeout(callback, WEBSOCKET_TIMEOUT);
|
||||
```
|
||||
|
||||
## 📏 方法长度检查
|
||||
|
||||
### 长度限制
|
||||
- **建议**:方法不超过50行
|
||||
- **原则**:一个方法只做一件事
|
||||
- **拆分**:复杂方法拆分为多个小方法
|
||||
|
||||
### 方法拆分示例
|
||||
```typescript
|
||||
// ❌ 错误:方法过长(超过50行)
|
||||
async processUserRegistration(userData: CreateUserDto): Promise<User> {
|
||||
// 验证用户数据
|
||||
// 检查邮箱是否存在
|
||||
// 生成密码哈希
|
||||
// 创建用户记录
|
||||
// 发送欢迎邮件
|
||||
// 记录操作日志
|
||||
// 返回用户信息
|
||||
// ... 超过50行的复杂逻辑
|
||||
}
|
||||
|
||||
// ✅ 正确:拆分为多个小方法
|
||||
async processUserRegistration(userData: CreateUserDto): Promise<User> {
|
||||
await this.validateUserData(userData);
|
||||
await this.checkEmailExists(userData.email);
|
||||
const hashedPassword = await this.generatePasswordHash(userData.password);
|
||||
const user = await this.createUserRecord({ ...userData, password: hashedPassword });
|
||||
await this.sendWelcomeEmail(user.email);
|
||||
await this.logUserRegistration(user.id);
|
||||
return user;
|
||||
}
|
||||
|
||||
private async validateUserData(userData: CreateUserDto): Promise<void> {
|
||||
// 验证逻辑
|
||||
}
|
||||
|
||||
private async checkEmailExists(email: string): Promise<void> {
|
||||
// 邮箱检查逻辑
|
||||
}
|
||||
```
|
||||
|
||||
## 🔄 代码重复消除
|
||||
|
||||
### 识别重复代码
|
||||
```typescript
|
||||
// ❌ 错误:重复的验证逻辑
|
||||
async createUser(userData: CreateUserDto): Promise<User> {
|
||||
if (!userData.email || !userData.name) {
|
||||
throw new BadRequestException('Required fields missing');
|
||||
}
|
||||
if (!this.isValidEmail(userData.email)) {
|
||||
throw new BadRequestException('Invalid email format');
|
||||
}
|
||||
// 创建用户逻辑
|
||||
}
|
||||
|
||||
async updateUser(id: string, userData: UpdateUserDto): Promise<User> {
|
||||
if (!userData.email || !userData.name) {
|
||||
throw new BadRequestException('Required fields missing');
|
||||
}
|
||||
if (!this.isValidEmail(userData.email)) {
|
||||
throw new BadRequestException('Invalid email format');
|
||||
}
|
||||
// 更新用户逻辑
|
||||
}
|
||||
|
||||
// ✅ 正确:抽象为可复用方法
|
||||
async createUser(userData: CreateUserDto): Promise<User> {
|
||||
this.validateUserData(userData);
|
||||
// 创建用户逻辑
|
||||
}
|
||||
|
||||
async updateUser(id: string, userData: UpdateUserDto): Promise<User> {
|
||||
this.validateUserData(userData);
|
||||
// 更新用户逻辑
|
||||
}
|
||||
|
||||
private validateUserData(userData: CreateUserDto | UpdateUserDto): void {
|
||||
if (!userData.email || !userData.name) {
|
||||
throw new BadRequestException('Required fields missing');
|
||||
}
|
||||
if (!this.isValidEmail(userData.email)) {
|
||||
throw new BadRequestException('Invalid email format');
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 🚫 TODO项处理(强制要求)
|
||||
|
||||
### 处理原则
|
||||
**最终文件不能包含TODO项**,必须:
|
||||
1. **真正实现功能**
|
||||
2. **删除未完成代码**
|
||||
|
||||
### 常见TODO处理
|
||||
```typescript
|
||||
// ❌ 错误:包含TODO项的代码
|
||||
async getUserProfile(id: string): Promise<UserProfile> {
|
||||
// TODO: 实现用户档案查询
|
||||
throw new Error('Not implemented');
|
||||
}
|
||||
|
||||
async sendSmsVerification(phone: string): Promise<void> {
|
||||
// TODO: 集成短信服务提供商
|
||||
throw new Error('SMS service not implemented');
|
||||
}
|
||||
|
||||
// ✅ 正确:真正实现功能
|
||||
async getUserProfile(id: string): Promise<UserProfile> {
|
||||
const profile = await this.userProfileRepository.findOne({
|
||||
where: { userId: id }
|
||||
});
|
||||
|
||||
if (!profile) {
|
||||
throw new NotFoundException('用户档案不存在');
|
||||
}
|
||||
|
||||
return profile;
|
||||
}
|
||||
|
||||
// ✅ 正确:如果功能不需要,删除方法
|
||||
// 删除sendSmsVerification方法及其调用
|
||||
```
|
||||
|
||||
## 🎮 游戏服务器特殊质量要求
|
||||
|
||||
### WebSocket连接管理
|
||||
```typescript
|
||||
// ✅ 正确:完整的连接管理
|
||||
const MAX_CONNECTIONS_PER_ROOM = 100;
|
||||
const CONNECTION_TIMEOUT = 30000;
|
||||
const HEARTBEAT_INTERVAL = 10000;
|
||||
|
||||
@WebSocketGateway()
|
||||
export class LocationBroadcastGateway {
|
||||
private readonly connections = new Map<string, Socket>();
|
||||
|
||||
handleConnection(client: Socket): void {
|
||||
this.validateConnection(client);
|
||||
this.setupHeartbeat(client);
|
||||
this.trackConnection(client);
|
||||
}
|
||||
|
||||
private validateConnection(client: Socket): void {
|
||||
// 连接验证逻辑
|
||||
}
|
||||
|
||||
private setupHeartbeat(client: Socket): void {
|
||||
// 心跳检测逻辑
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 双模式服务质量
|
||||
```typescript
|
||||
// ✅ 正确:确保两种模式行为一致
|
||||
const DEFAULT_USER_STATUS = UserStatus.PENDING;
|
||||
const MAX_BATCH_SIZE = 1000;
|
||||
|
||||
@Injectable()
|
||||
export class UsersMemoryService {
|
||||
private readonly users = new Map<string, User>();
|
||||
|
||||
async create(userData: CreateUserDto): Promise<User> {
|
||||
this.validateUserData(userData);
|
||||
const user = this.buildUserEntity(userData);
|
||||
this.users.set(user.id, user);
|
||||
return user;
|
||||
}
|
||||
|
||||
private validateUserData(userData: CreateUserDto): void {
|
||||
// 与数据库模式相同的验证逻辑
|
||||
}
|
||||
|
||||
private buildUserEntity(userData: CreateUserDto): User {
|
||||
// 与数据库模式相同的实体构建逻辑
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 属性测试质量
|
||||
```typescript
|
||||
// ✅ 正确:完整的属性测试实现
|
||||
import * as fc from 'fast-check';
|
||||
|
||||
const PROPERTY_TEST_RUNS = 1000;
|
||||
const MAX_USER_ID = 1000000;
|
||||
|
||||
describe('AdminService Properties', () => {
|
||||
it('should handle any valid user status update', () => {
|
||||
fc.assert(fc.property(
|
||||
fc.integer({ min: 1, max: MAX_USER_ID }),
|
||||
fc.constantFrom(...Object.values(UserStatus)),
|
||||
async (userId, status) => {
|
||||
try {
|
||||
const result = await adminService.updateUserStatus(userId, status);
|
||||
expect(result).toBeDefined();
|
||||
expect(result.status).toBe(status);
|
||||
} catch (error) {
|
||||
expect(error).toBeInstanceOf(NotFoundException || BadRequestException);
|
||||
}
|
||||
}
|
||||
), { numRuns: PROPERTY_TEST_RUNS });
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
## 🔍 检查执行步骤
|
||||
|
||||
1. **扫描未使用的导入**
|
||||
- 检查每个import语句是否被使用
|
||||
- 删除未使用的导入
|
||||
|
||||
2. **扫描未使用的变量和方法**
|
||||
- 检查变量是否被引用
|
||||
- 检查私有方法是否被调用
|
||||
- 删除未使用的代码
|
||||
|
||||
3. **检查常量定义**
|
||||
- 识别魔法数字和字符串
|
||||
- 提取为SCREAMING_SNAKE_CASE常量
|
||||
- 确保常量命名清晰
|
||||
|
||||
4. **检查方法长度**
|
||||
- 统计每个方法的行数
|
||||
- 识别超过50行的方法
|
||||
- 建议拆分复杂方法
|
||||
|
||||
5. **识别重复代码**
|
||||
- 查找相似的代码块
|
||||
- 抽象为可复用的工具方法
|
||||
- 消除代码重复
|
||||
|
||||
6. **处理所有TODO项**
|
||||
- 搜索所有TODO注释
|
||||
- 要求真正实现功能或删除代码
|
||||
- 确保最终文件无TODO项
|
||||
|
||||
7. **游戏服务器特殊检查**
|
||||
- WebSocket连接管理完整性
|
||||
- 双模式服务行为一致性
|
||||
- 属性测试实现质量
|
||||
|
||||
## 🔥 重要提醒
|
||||
|
||||
**如果在本步骤中执行了任何修改操作(删除未使用代码、提取常量、实现TODO项等),必须立即重新执行步骤3的完整检查!**
|
||||
|
||||
- ✅ 执行修改 → 🔥 立即重新执行步骤3 → 提供验证报告 → 等待用户确认
|
||||
- ❌ 执行修改 → 直接进入步骤4(错误做法)
|
||||
|
||||
**不能跳过重新检查环节!**
|
||||
310
docs/ai-reading/step4-architecture-layer.md
Normal file
310
docs/ai-reading/step4-architecture-layer.md
Normal file
@@ -0,0 +1,310 @@
|
||||
# 步骤4:架构分层检查
|
||||
|
||||
## 🎯 检查目标
|
||||
检查架构分层的合规性,确保Core层和Business层职责清晰、依赖关系正确。
|
||||
|
||||
## 🏗️ 架构层级识别
|
||||
|
||||
### 项目分层结构
|
||||
```
|
||||
src/
|
||||
├── core/ # Core层:技术实现层
|
||||
│ ├── db/ # 数据访问
|
||||
│ ├── redis/ # 缓存服务
|
||||
│ └── utils/ # 工具服务
|
||||
├── business/ # Business层:业务逻辑层
|
||||
│ ├── auth/ # 认证业务
|
||||
│ ├── users/ # 用户业务
|
||||
│ └── admin/ # 管理业务
|
||||
└── common/ # 公共层:通用组件
|
||||
```
|
||||
|
||||
### 检查范围
|
||||
- **限制范围**:仅检查当前执行检查的文件夹
|
||||
- **不跨模块**:不考虑其他同层功能模块
|
||||
- **专注职责**:确保当前模块职责清晰
|
||||
|
||||
## 🔧 Core层规范检查
|
||||
|
||||
### 职责定义
|
||||
**Core层专注技术实现,不包含业务逻辑**
|
||||
|
||||
### 命名规范检查
|
||||
|
||||
#### 业务支撑模块(使用_core后缀)
|
||||
专门为特定业务功能提供技术支撑:
|
||||
```typescript
|
||||
✅ 正确示例:
|
||||
src/core/location_broadcast_core/ # 为位置广播业务提供技术支撑
|
||||
src/core/admin_core/ # 为管理员业务提供技术支撑
|
||||
src/core/user_auth_core/ # 为用户认证业务提供技术支撑
|
||||
src/core/zulip_core/ # 为Zulip集成提供技术支撑
|
||||
|
||||
❌ 错误示例:
|
||||
src/core/location_broadcast/ # 应该是location_broadcast_core
|
||||
src/core/admin/ # 应该是admin_core
|
||||
```
|
||||
|
||||
#### 通用工具模块(不使用后缀)
|
||||
提供可复用的数据访问或技术服务:
|
||||
```typescript
|
||||
✅ 正确示例:
|
||||
src/core/db/user_profiles/ # 通用的用户档案数据访问
|
||||
src/core/redis/ # 通用的Redis技术封装
|
||||
src/core/utils/logger/ # 通用的日志工具服务
|
||||
src/core/db/zulip_accounts/ # 通用的Zulip账户数据访问
|
||||
|
||||
❌ 错误示例:
|
||||
src/core/db/user_profiles_core/ # 应该是user_profiles(通用工具)
|
||||
src/core/redis_core/ # 应该是redis(通用工具)
|
||||
```
|
||||
|
||||
### 命名判断流程
|
||||
```
|
||||
1. 模块是否专门为某个特定业务功能服务?
|
||||
├─ 是 → 检查模块名称是否体现业务领域
|
||||
│ ├─ 是 → 使用 _core 后缀
|
||||
│ └─ 否 → 重新设计模块职责
|
||||
└─ 否 → 模块是否提供通用的技术服务?
|
||||
├─ 是 → 不使用 _core 后缀
|
||||
└─ 否 → 重新评估模块定位
|
||||
|
||||
2. 实际案例判断:
|
||||
- user_profiles: 通用的用户档案数据访问 → 不使用后缀 ✓
|
||||
- location_broadcast_core: 专门为位置广播业务服务 → 使用_core后缀 ✓
|
||||
- redis: 通用的缓存技术服务 → 不使用后缀 ✓
|
||||
- zulip_core: 专门为Zulip集成业务服务 → 使用_core后缀 ✓
|
||||
```
|
||||
|
||||
### Core层技术实现示例
|
||||
```typescript
|
||||
// ✅ 正确:Core层专注技术实现
|
||||
@Injectable()
|
||||
export class LocationBroadcastCoreService {
|
||||
/**
|
||||
* 广播位置更新到指定房间
|
||||
*
|
||||
* 技术实现:
|
||||
* 1. 验证WebSocket连接状态
|
||||
* 2. 序列化位置数据
|
||||
* 3. 通过Socket.IO广播消息
|
||||
* 4. 记录广播性能指标
|
||||
* 5. 处理广播异常和重试
|
||||
*/
|
||||
async broadcastToRoom(roomId: string, data: PositionData): Promise<void> {
|
||||
const room = this.server.sockets.adapter.rooms.get(roomId);
|
||||
if (!room) {
|
||||
throw new NotFoundException(`Room ${roomId} not found`);
|
||||
}
|
||||
|
||||
this.server.to(roomId).emit('position-update', data);
|
||||
this.metricsService.recordBroadcast(roomId, data.userId);
|
||||
}
|
||||
}
|
||||
|
||||
// ❌ 错误:Core层包含业务逻辑
|
||||
@Injectable()
|
||||
export class LocationBroadcastCoreService {
|
||||
async broadcastUserPosition(userId: string, position: Position): Promise<void> {
|
||||
// 错误:包含了用户权限检查的业务概念
|
||||
const user = await this.userService.findById(userId);
|
||||
if (user.status !== UserStatus.ACTIVE) {
|
||||
throw new ForbiddenException('用户状态不允许位置广播');
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Core层依赖关系检查
|
||||
```typescript
|
||||
// ✅ 允许的导入
|
||||
import { Injectable } from '@nestjs/common'; # NestJS框架
|
||||
import { Server } from 'socket.io'; # 第三方技术库
|
||||
import { RedisService } from '../redis/redis.service'; # 其他Core层模块
|
||||
import * as crypto from 'crypto'; # Node.js内置模块
|
||||
|
||||
// ❌ 禁止的导入
|
||||
import { UserBusinessService } from '../../business/users/user.service'; # Business层模块
|
||||
import { AdminController } from '../../business/admin/admin.controller'; # Business层模块
|
||||
```
|
||||
|
||||
## 💼 Business层规范检查
|
||||
|
||||
### 职责定义
|
||||
**Business层专注业务逻辑实现,不关心底层技术细节**
|
||||
|
||||
### 业务逻辑完备性检查
|
||||
```typescript
|
||||
// ✅ 正确:完整的业务逻辑
|
||||
@Injectable()
|
||||
export class UserBusinessService {
|
||||
/**
|
||||
* 用户注册业务流程
|
||||
*
|
||||
* 业务逻辑:
|
||||
* 1. 验证用户信息完整性
|
||||
* 2. 检查用户名/邮箱是否已存在
|
||||
* 3. 验证邮箱格式和域名白名单
|
||||
* 4. 生成用户唯一标识
|
||||
* 5. 设置默认用户权限
|
||||
* 6. 发送欢迎邮件
|
||||
* 7. 记录注册日志
|
||||
* 8. 返回注册结果
|
||||
*/
|
||||
async registerUser(registerData: RegisterUserDto): Promise<UserResult> {
|
||||
await this.validateUserBusinessRules(registerData);
|
||||
const user = await this.userCoreService.create(registerData);
|
||||
await this.emailService.sendWelcomeEmail(user.email);
|
||||
await this.logService.recordUserRegistration(user.id);
|
||||
return this.buildUserResult(user);
|
||||
}
|
||||
}
|
||||
|
||||
// ❌ 错误:业务逻辑不完整
|
||||
@Injectable()
|
||||
export class UserBusinessService {
|
||||
async registerUser(registerData: RegisterUserDto): Promise<User> {
|
||||
// 只是简单调用数据库保存,缺少业务验证和流程
|
||||
return this.userRepository.save(registerData);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Business层依赖关系检查
|
||||
```typescript
|
||||
// ✅ 允许的导入
|
||||
import { UserCoreService } from '../../core/user_auth_core/user_core.service'; # 对应Core层业务支撑
|
||||
import { CacheService } from '../../core/redis/cache.service'; # Core层通用工具
|
||||
import { EmailService } from '../../core/utils/email.service'; # Core层通用工具
|
||||
import { OtherBusinessService } from '../other/other.service'; # 其他Business层(谨慎)
|
||||
|
||||
// ❌ 禁止的导入
|
||||
import { createConnection } from 'typeorm'; # 直接技术实现
|
||||
import * as Redis from 'ioredis'; # 直接技术实现
|
||||
import { DatabaseConnection } from '../../core/db/connection'; # 底层技术细节
|
||||
```
|
||||
|
||||
## 🚨 常见架构违规
|
||||
|
||||
### Business层违规示例
|
||||
```typescript
|
||||
// ❌ 错误:Business层包含技术实现细节
|
||||
@Injectable()
|
||||
export class UserBusinessService {
|
||||
async createUser(userData: CreateUserDto): Promise<User> {
|
||||
// 违规:直接操作Redis连接
|
||||
const redis = new Redis({ host: 'localhost', port: 6379 });
|
||||
await redis.set(`user:${userData.id}`, JSON.stringify(userData));
|
||||
|
||||
// 违规:直接写SQL语句
|
||||
const sql = 'INSERT INTO users (name, email) VALUES (?, ?)';
|
||||
await this.database.query(sql, [userData.name, userData.email]);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Core层违规示例
|
||||
```typescript
|
||||
// ❌ 错误:Core层包含业务逻辑
|
||||
@Injectable()
|
||||
export class DatabaseService {
|
||||
async saveUser(userData: CreateUserDto): Promise<User> {
|
||||
// 违规:包含用户注册的业务验证
|
||||
if (userData.age < 18) {
|
||||
throw new BadRequestException('用户年龄必须大于18岁');
|
||||
}
|
||||
|
||||
// 违规:包含业务规则
|
||||
if (userData.email.endsWith('@competitor.com')) {
|
||||
throw new ForbiddenException('不允许竞争对手注册');
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 🎮 游戏服务器架构特殊检查
|
||||
|
||||
### WebSocket Gateway分层
|
||||
```typescript
|
||||
// ✅ 正确:Gateway在Business层,调用Core层服务
|
||||
@WebSocketGateway()
|
||||
export class LocationBroadcastGateway {
|
||||
constructor(
|
||||
private readonly locationBroadcastCore: LocationBroadcastCoreService,
|
||||
private readonly userProfiles: UserProfilesService,
|
||||
) {}
|
||||
|
||||
@SubscribeMessage('position_update')
|
||||
async handlePositionUpdate(client: Socket, data: PositionData): Promise<void> {
|
||||
// 业务逻辑:验证、权限检查
|
||||
await this.validateUserPermission(client.userId);
|
||||
|
||||
// 调用Core层技术实现
|
||||
await this.locationBroadcastCore.broadcastToRoom(client.roomId, data);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 双模式服务分层
|
||||
```typescript
|
||||
// ✅ 正确:Business层统一接口,Core层不同实现
|
||||
@Injectable()
|
||||
export class UsersBusinessService {
|
||||
constructor(
|
||||
@Inject('USERS_SERVICE')
|
||||
private readonly usersCore: UsersMemoryService | UsersDatabaseService,
|
||||
) {}
|
||||
|
||||
async createUser(userData: CreateUserDto): Promise<User> {
|
||||
// 业务逻辑:验证、权限、流程
|
||||
await this.validateUserBusinessRules(userData);
|
||||
|
||||
// 调用Core层(内存或数据库模式)
|
||||
const user = await this.usersCore.create(userData);
|
||||
|
||||
// 业务逻辑:后续处理
|
||||
await this.sendWelcomeNotification(user);
|
||||
return user;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 🔍 检查执行步骤
|
||||
|
||||
1. **识别当前模块的层级**
|
||||
- 确定是Core层还是Business层
|
||||
- 检查文件夹路径和命名
|
||||
|
||||
2. **检查Core层命名规范**
|
||||
- 业务支撑模块是否使用_core后缀
|
||||
- 通用工具模块是否不使用后缀
|
||||
- 根据模块职责判断命名正确性
|
||||
|
||||
3. **检查职责分离**
|
||||
- Core层是否只包含技术实现
|
||||
- Business层是否只包含业务逻辑
|
||||
- 是否有跨层职责混乱
|
||||
|
||||
4. **检查依赖关系**
|
||||
- Core层是否导入了Business层模块
|
||||
- Business层是否直接使用底层技术实现
|
||||
- 依赖注入是否正确使用
|
||||
|
||||
5. **检查架构违规**
|
||||
- 识别常见的分层违规模式
|
||||
- 检查技术实现和业务逻辑的边界
|
||||
- 确保架构清晰度
|
||||
|
||||
6. **游戏服务器特殊检查**
|
||||
- WebSocket Gateway的分层正确性
|
||||
- 双模式服务的架构设计
|
||||
- 实时通信组件的职责分离
|
||||
|
||||
## 🔥 重要提醒
|
||||
|
||||
**如果在本步骤中执行了任何修改操作(调整分层结构、修正依赖关系、重构代码等),必须立即重新执行步骤4的完整检查!**
|
||||
|
||||
- ✅ 执行修改 → 🔥 立即重新执行步骤4 → 提供验证报告 → 等待用户确认
|
||||
- ❌ 执行修改 → 直接进入步骤5(错误做法)
|
||||
|
||||
**不能跳过重新检查环节!**
|
||||
349
docs/ai-reading/step5-test-coverage.md
Normal file
349
docs/ai-reading/step5-test-coverage.md
Normal file
@@ -0,0 +1,349 @@
|
||||
# 步骤5:测试覆盖检查
|
||||
|
||||
## 🎯 检查目标
|
||||
检查测试文件的完整性和覆盖率,确保严格的一对一测试映射和测试分离。
|
||||
|
||||
## 📋 测试文件存在性检查
|
||||
|
||||
### 需要测试文件的类型
|
||||
```typescript
|
||||
✅ 必须有测试文件:
|
||||
- *.service.ts # Service类 - 业务逻辑类
|
||||
- *.controller.ts # Controller类 - 控制器类
|
||||
- *.gateway.ts # Gateway类 - WebSocket网关类
|
||||
- *.guard.ts # Guard类 - 守卫类(游戏服务器安全重要)
|
||||
- *.interceptor.ts # Interceptor类 - 拦截器类(日志监控重要)
|
||||
- *.middleware.ts # Middleware类 - 中间件类(性能监控重要)
|
||||
|
||||
❌ 不需要测试文件:
|
||||
- *.dto.ts # DTO类 - 数据传输对象
|
||||
- *.interface.ts # Interface文件 - 接口定义
|
||||
- *.constants.ts # Constants文件 - 常量定义
|
||||
- *.config.ts # Config文件 - 配置文件
|
||||
- *.utils.ts # 简单Utils工具类(复杂工具类需要)
|
||||
```
|
||||
|
||||
### 测试文件命名规范
|
||||
```typescript
|
||||
✅ 正确的一对一映射:
|
||||
src/business/auth/auth.service.ts
|
||||
src/business/auth/auth.service.spec.ts
|
||||
|
||||
src/core/location_broadcast_core/location_broadcast_core.service.ts
|
||||
src/core/location_broadcast_core/location_broadcast_core.service.spec.ts
|
||||
|
||||
src/business/admin/admin.gateway.ts
|
||||
src/business/admin/admin.gateway.spec.ts
|
||||
|
||||
❌ 错误的命名:
|
||||
src/business/auth/auth_services.spec.ts # 测试多个service,违反一对一原则
|
||||
src/business/auth/auth_test.spec.ts # 命名不对应
|
||||
```
|
||||
|
||||
## 🔥 严格一对一测试映射(重要)
|
||||
|
||||
### 强制要求
|
||||
- **严格对应**:每个测试文件必须严格对应一个源文件
|
||||
- **禁止多对一**:不允许一个测试文件测试多个源文件
|
||||
- **禁止一对多**:不允许一个源文件的测试分散在多个测试文件
|
||||
- **命名对应**:测试文件名必须与源文件名完全对应(除.spec.ts后缀外)
|
||||
|
||||
### 测试范围严格限制
|
||||
```typescript
|
||||
// ✅ 正确:只测试LoginService的功能
|
||||
// 文件:src/business/auth/login.service.spec.ts
|
||||
describe('LoginService', () => {
|
||||
describe('validateUser', () => {
|
||||
it('should validate user credentials', () => {
|
||||
// 只测试LoginService.validateUser方法
|
||||
// 使用Mock隔离UserRepository等外部依赖
|
||||
});
|
||||
|
||||
it('should throw error for invalid credentials', () => {
|
||||
// 测试异常情况
|
||||
});
|
||||
});
|
||||
|
||||
describe('generateToken', () => {
|
||||
it('should generate valid JWT token', () => {
|
||||
// 只测试LoginService.generateToken方法
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
// ❌ 错误:在LoginService测试中测试其他服务
|
||||
describe('LoginService', () => {
|
||||
it('should integrate with UserRepository', () => {
|
||||
// 错误:这是集成测试,应该移到test/integration/
|
||||
});
|
||||
|
||||
it('should work with EmailService', () => {
|
||||
// 错误:测试了EmailService的功能,违反范围限制
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
## 🏗️ 测试分离架构(强制要求)
|
||||
|
||||
### 顶层test目录结构
|
||||
```
|
||||
test/
|
||||
├── integration/ # 集成测试 - 测试多个模块间的交互
|
||||
│ ├── auth_integration.spec.ts
|
||||
│ ├── location_broadcast_integration.spec.ts
|
||||
│ └── zulip_integration.spec.ts
|
||||
├── e2e/ # 端到端测试 - 完整业务流程测试
|
||||
│ ├── user_registration_e2e.spec.ts
|
||||
│ ├── location_broadcast_e2e.spec.ts
|
||||
│ └── admin_operations_e2e.spec.ts
|
||||
├── performance/ # 性能测试 - WebSocket和高并发测试
|
||||
│ ├── websocket_performance.spec.ts
|
||||
│ ├── database_performance.spec.ts
|
||||
│ └── memory_usage.spec.ts
|
||||
├── property/ # 属性测试 - 基于属性的随机测试
|
||||
│ ├── admin_property.spec.ts
|
||||
│ ├── user_validation_property.spec.ts
|
||||
│ └── position_update_property.spec.ts
|
||||
└── fixtures/ # 测试数据和工具
|
||||
├── test_data.ts
|
||||
└── test_helpers.ts
|
||||
```
|
||||
|
||||
### 测试类型分离要求
|
||||
```typescript
|
||||
// ✅ 正确:单元测试只在源文件同目录
|
||||
// 文件位置:src/business/auth/login.service.spec.ts
|
||||
describe('LoginService Unit Tests', () => {
|
||||
// 只测试LoginService的单个方法功能
|
||||
// 使用Mock隔离所有外部依赖
|
||||
});
|
||||
|
||||
// ✅ 正确:集成测试统一在test/integration/
|
||||
// 文件位置:test/integration/auth_integration.spec.ts
|
||||
describe('Auth Integration Tests', () => {
|
||||
it('should integrate LoginService with UserRepository and TokenService', () => {
|
||||
// 测试多个模块间的真实交互
|
||||
});
|
||||
});
|
||||
|
||||
// ✅ 正确:E2E测试统一在test/e2e/
|
||||
// 文件位置:test/e2e/user_auth_e2e.spec.ts
|
||||
describe('User Authentication E2E Tests', () => {
|
||||
it('should handle complete user login flow', () => {
|
||||
// 端到端完整业务流程测试
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
## 🎮 游戏服务器特殊测试要求
|
||||
|
||||
### WebSocket Gateway测试
|
||||
```typescript
|
||||
// ✅ 正确:完整的WebSocket测试
|
||||
// 文件:src/business/location/location_broadcast.gateway.spec.ts
|
||||
describe('LocationBroadcastGateway', () => {
|
||||
let gateway: LocationBroadcastGateway;
|
||||
let mockServer: jest.Mocked<Server>;
|
||||
|
||||
beforeEach(async () => {
|
||||
// 设置Mock服务器和依赖
|
||||
});
|
||||
|
||||
describe('handleConnection', () => {
|
||||
it('should accept valid WebSocket connection with JWT token', () => {
|
||||
// 正常连接测试
|
||||
});
|
||||
|
||||
it('should reject connection with invalid JWT token', () => {
|
||||
// 异常连接测试
|
||||
});
|
||||
|
||||
it('should handle connection when room is at capacity limit', () => {
|
||||
// 边界情况测试
|
||||
});
|
||||
});
|
||||
|
||||
describe('handlePositionUpdate', () => {
|
||||
it('should broadcast position to all room members', () => {
|
||||
// 实时通信测试
|
||||
});
|
||||
|
||||
it('should validate position data format', () => {
|
||||
// 数据验证测试
|
||||
});
|
||||
});
|
||||
|
||||
describe('handleDisconnect', () => {
|
||||
it('should clean up user resources on disconnect', () => {
|
||||
// 断开连接测试
|
||||
});
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
### 双模式服务测试
|
||||
```typescript
|
||||
// ✅ 正确:内存服务测试
|
||||
// 文件:src/core/users/users_memory.service.spec.ts
|
||||
describe('UsersMemoryService', () => {
|
||||
it('should create user in memory storage', () => {
|
||||
// 测试内存模式特定功能
|
||||
});
|
||||
|
||||
it('should handle concurrent access correctly', () => {
|
||||
// 测试内存模式并发处理
|
||||
});
|
||||
});
|
||||
|
||||
// ✅ 正确:数据库服务测试
|
||||
// 文件:src/core/users/users_database.service.spec.ts
|
||||
describe('UsersDatabaseService', () => {
|
||||
it('should create user in database', () => {
|
||||
// 测试数据库模式特定功能
|
||||
});
|
||||
|
||||
it('should handle database transaction correctly', () => {
|
||||
// 测试数据库事务处理
|
||||
});
|
||||
});
|
||||
|
||||
// ✅ 正确:双模式一致性测试(集成测试)
|
||||
// 文件:test/integration/users_dual_mode_integration.spec.ts
|
||||
describe('Users Dual Mode Integration', () => {
|
||||
it('should have identical behavior for user creation', () => {
|
||||
// 测试两种模式行为一致性
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
### 属性测试(管理员模块)
|
||||
```typescript
|
||||
// ✅ 正确:属性测试
|
||||
// 文件:test/property/admin_property.spec.ts
|
||||
import * as fc from 'fast-check';
|
||||
|
||||
describe('AdminService Properties', () => {
|
||||
it('should handle any valid user status update', () => {
|
||||
fc.assert(fc.property(
|
||||
fc.integer({ min: 1, max: 1000000 }), // userId
|
||||
fc.constantFrom(...Object.values(UserStatus)), // status
|
||||
async (userId, status) => {
|
||||
try {
|
||||
const result = await adminService.updateUserStatus(userId, status);
|
||||
expect(result).toBeDefined();
|
||||
expect(result.status).toBe(status);
|
||||
} catch (error) {
|
||||
expect(error).toBeInstanceOf(NotFoundException || BadRequestException);
|
||||
}
|
||||
}
|
||||
));
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
## 📍 测试文件位置规范
|
||||
|
||||
### 正确位置
|
||||
```
|
||||
✅ 正确:测试文件与源文件同目录
|
||||
src/business/auth/
|
||||
├── auth.service.ts
|
||||
├── auth.service.spec.ts # 单元测试
|
||||
├── auth.controller.ts
|
||||
└── auth.controller.spec.ts # 单元测试
|
||||
|
||||
src/core/location_broadcast_core/
|
||||
├── location_broadcast_core.service.ts
|
||||
└── location_broadcast_core.service.spec.ts
|
||||
```
|
||||
|
||||
### 错误位置(必须修正)
|
||||
```
|
||||
❌ 错误:测试文件在单独文件夹
|
||||
src/business/auth/
|
||||
├── auth.service.ts
|
||||
├── auth.controller.ts
|
||||
└── tests/ # 错误:单独的测试文件夹
|
||||
├── auth.service.spec.ts # 应该移到上级目录
|
||||
└── auth.controller.spec.ts
|
||||
|
||||
src/business/auth/
|
||||
├── auth.service.ts
|
||||
├── auth.controller.ts
|
||||
└── __tests__/ # 错误:单独的测试文件夹
|
||||
└── auth.spec.ts # 应该拆分并移到上级目录
|
||||
```
|
||||
|
||||
## 🧪 测试执行验证(强制要求)
|
||||
|
||||
### 测试命令执行
|
||||
```bash
|
||||
# 单元测试(严格限制:只执行.spec.ts文件)
|
||||
npm run test:unit
|
||||
# 等价于: jest --testPathPattern=spec.ts --testPathIgnorePatterns="integration|e2e|performance|property"
|
||||
|
||||
# 集成测试(统一在test/integration/目录执行)
|
||||
npm run test:integration
|
||||
# 等价于: jest test/integration/
|
||||
|
||||
# E2E测试(统一在test/e2e/目录执行)
|
||||
npm run test:e2e
|
||||
# 等价于: jest test/e2e/
|
||||
|
||||
# 属性测试(统一在test/property/目录执行)
|
||||
npm run test:property
|
||||
# 等价于: jest test/property/
|
||||
|
||||
# 性能测试(统一在test/performance/目录执行)
|
||||
npm run test:performance
|
||||
# 等价于: jest test/performance/
|
||||
```
|
||||
|
||||
### 测试执行顺序
|
||||
1. **第一阶段**:单元测试(快速反馈)
|
||||
2. **第二阶段**:集成测试(模块协作)
|
||||
3. **第三阶段**:E2E测试(业务流程)
|
||||
4. **第四阶段**:性能测试(系统性能)
|
||||
|
||||
## 🔍 检查执行步骤
|
||||
|
||||
1. **扫描需要测试的文件类型**
|
||||
- 识别所有.service.ts、.controller.ts、.gateway.ts等文件
|
||||
- 检查是否有对应的.spec.ts测试文件
|
||||
|
||||
2. **验证一对一测试映射**
|
||||
- 确保每个测试文件严格对应一个源文件
|
||||
- 检查测试文件命名是否正确对应
|
||||
|
||||
3. **检查测试范围限制**
|
||||
- 确保测试内容严格限于对应源文件功能
|
||||
- 识别跨文件测试和混合测试
|
||||
|
||||
4. **检查测试文件位置**
|
||||
- 确保单元测试与源文件在同一目录
|
||||
- 识别需要扁平化的测试文件夹
|
||||
|
||||
5. **分离集成测试和E2E测试**
|
||||
- 将集成测试移动到test/integration/
|
||||
- 将E2E测试移动到test/e2e/
|
||||
- 将性能测试移动到test/performance/
|
||||
- 将属性测试移动到test/property/
|
||||
|
||||
6. **执行测试验证**
|
||||
- 运行单元测试命令验证通过
|
||||
- 确保测试覆盖率达标
|
||||
- 验证测试质量和有效性
|
||||
|
||||
7. **游戏服务器特殊检查**
|
||||
- WebSocket Gateway的完整测试覆盖
|
||||
- 双模式服务的一致性测试
|
||||
- 属性测试的正确实现
|
||||
|
||||
## 🔥 重要提醒
|
||||
|
||||
**如果在本步骤中执行了任何修改操作(创建测试文件、移动测试文件、修正测试内容等),必须立即重新执行步骤5的完整检查!**
|
||||
|
||||
- ✅ 执行修改 → 🔥 立即重新执行步骤5 → 提供验证报告 → 等待用户确认
|
||||
- ❌ 执行修改 → 直接进入步骤6(错误做法)
|
||||
|
||||
**不能跳过重新检查环节!**
|
||||
327
docs/ai-reading/step6-documentation.md
Normal file
327
docs/ai-reading/step6-documentation.md
Normal file
@@ -0,0 +1,327 @@
|
||||
# 步骤6:功能文档生成
|
||||
|
||||
## 🎯 检查目标
|
||||
生成和维护功能模块的README文档,确保文档内容完整、准确、实用。
|
||||
|
||||
## 📚 README文档结构
|
||||
|
||||
### 必须包含的章节
|
||||
每个功能模块文件夹都必须有README.md文档,包含以下结构:
|
||||
|
||||
```markdown
|
||||
# [模块名称] [中文描述]
|
||||
|
||||
[模块名称] 是 [一段话总结文件夹的整体功能和作用,说明其在项目中的定位和价值]。
|
||||
|
||||
## 对外提供的接口
|
||||
|
||||
### create()
|
||||
创建新用户记录,支持数据验证和唯一性检查。
|
||||
|
||||
### findByEmail()
|
||||
根据邮箱地址查询用户,用于登录验证和账户找回。
|
||||
|
||||
## 对外API接口(如适用)
|
||||
|
||||
### POST /api/auth/login
|
||||
用户登录接口,支持用户名/邮箱/手机号多种方式登录。
|
||||
|
||||
### GET /api/users/:id
|
||||
根据用户ID获取用户详细信息。
|
||||
|
||||
## WebSocket事件接口(如适用)
|
||||
|
||||
### 'connection'
|
||||
客户端建立WebSocket连接,需要提供JWT认证token。
|
||||
|
||||
### 'position_update'
|
||||
接收客户端位置更新,广播给房间内其他用户。
|
||||
|
||||
## 使用的项目内部依赖
|
||||
|
||||
### UserStatus (来自 business/user-mgmt/enums/user-status.enum)
|
||||
用户状态枚举,定义用户的激活、禁用、待验证等状态值。
|
||||
|
||||
## 核心特性
|
||||
|
||||
### 双存储模式支持
|
||||
- 数据库模式:使用TypeORM连接MySQL,适用于生产环境
|
||||
- 内存模式:使用Map存储,适用于开发测试和故障降级
|
||||
|
||||
## 潜在风险
|
||||
|
||||
### 内存模式数据丢失风险
|
||||
- 内存存储在应用重启后数据会丢失
|
||||
- 建议仅在开发测试环境使用
|
||||
```
|
||||
|
||||
## 🔌 对外接口文档
|
||||
|
||||
### 公共方法描述
|
||||
每个公共方法必须有一句话功能说明:
|
||||
|
||||
```markdown
|
||||
## 对外提供的接口
|
||||
|
||||
### create(userData: CreateUserDto): Promise<User>
|
||||
创建新用户记录,支持数据验证和唯一性检查。
|
||||
|
||||
### findById(id: string): Promise<User>
|
||||
根据用户ID查询用户信息,用于身份验证和数据获取。
|
||||
|
||||
### updateStatus(id: string, status: UserStatus): Promise<User>
|
||||
更新用户状态,支持激活、禁用、待验证等状态切换。
|
||||
|
||||
### delete(id: string): Promise<void>
|
||||
删除用户记录及相关数据,执行软删除保留审计信息。
|
||||
|
||||
### findByEmail(email: string): Promise<User>
|
||||
根据邮箱地址查询用户,用于登录验证和账户找回。
|
||||
```
|
||||
|
||||
## 🌐 API接口文档(Business模块)
|
||||
|
||||
### HTTP API接口
|
||||
如果business模块开放了可访问的API,必须列出所有API:
|
||||
|
||||
```markdown
|
||||
## 对外API接口
|
||||
|
||||
### POST /api/auth/login
|
||||
用户登录接口,支持用户名/邮箱/手机号多种方式登录。
|
||||
|
||||
### GET /api/users/:id
|
||||
根据用户ID获取用户详细信息。
|
||||
|
||||
### PUT /api/users/:id/status
|
||||
更新指定用户的状态(激活/禁用/待验证)。
|
||||
|
||||
### DELETE /api/users/:id
|
||||
删除指定用户账户及相关数据。
|
||||
|
||||
### GET /api/users/search
|
||||
根据条件搜索用户,支持邮箱、用户名、状态等筛选。
|
||||
|
||||
### POST /api/users/batch
|
||||
批量创建用户,支持Excel导入和数据验证。
|
||||
```
|
||||
|
||||
## 🔌 WebSocket接口文档(Gateway模块)
|
||||
|
||||
### WebSocket事件接口
|
||||
Gateway模块需要详细的WebSocket事件文档:
|
||||
|
||||
```markdown
|
||||
## WebSocket事件接口
|
||||
|
||||
### 'connection'
|
||||
客户端建立WebSocket连接,需要提供JWT认证token。
|
||||
- 输入: `{ token: string }`
|
||||
- 输出: 连接成功确认
|
||||
|
||||
### 'position_update'
|
||||
接收客户端位置更新,广播给房间内其他用户。
|
||||
- 输入: `{ x: number, y: number, timestamp: number }`
|
||||
- 输出: 广播给房间成员
|
||||
|
||||
### 'join_room'
|
||||
用户加入游戏房间,建立实时通信连接。
|
||||
- 输入: `{ roomId: string }`
|
||||
- 输出: `{ success: boolean, members: string[] }`
|
||||
|
||||
### 'chat_message'
|
||||
处理聊天消息,支持Zulip集成和消息过滤。
|
||||
- 输入: `{ message: string, roomId: string }`
|
||||
- 输出: 广播给房间成员或转发到Zulip
|
||||
|
||||
### 'disconnect'
|
||||
客户端断开连接,清理相关资源和通知其他用户。
|
||||
- 输入: 无
|
||||
- 输出: 通知房间其他成员
|
||||
```
|
||||
|
||||
## 🔗 内部依赖分析
|
||||
|
||||
### 依赖列表格式
|
||||
```markdown
|
||||
## 使用的项目内部依赖
|
||||
|
||||
### UserStatus (来自 business/user-mgmt/enums/user-status.enum)
|
||||
用户状态枚举,定义用户的激活、禁用、待验证等状态值。
|
||||
|
||||
### CreateUserDto (本模块)
|
||||
用户创建数据传输对象,提供完整的数据验证规则和类型定义。
|
||||
|
||||
### LoggerService (来自 core/utils/logger)
|
||||
日志服务,用于记录用户操作和系统事件。
|
||||
|
||||
### CacheService (来自 core/redis)
|
||||
缓存服务,用于提升用户查询性能和会话管理。
|
||||
|
||||
### EmailService (来自 core/utils/email)
|
||||
邮件服务,用于发送用户注册验证和通知邮件。
|
||||
```
|
||||
|
||||
## ⭐ 核心特性识别
|
||||
|
||||
### 技术特性
|
||||
```markdown
|
||||
## 核心特性
|
||||
|
||||
### 双存储模式支持
|
||||
- 数据库模式:使用TypeORM连接MySQL,适用于生产环境
|
||||
- 内存模式:使用Map存储,适用于开发测试和故障降级
|
||||
- 动态模块配置:通过UsersModule.forDatabase()和forMemory()灵活切换
|
||||
- 自动检测:根据环境变量自动选择存储模式
|
||||
|
||||
### 实时通信能力
|
||||
- WebSocket支持:基于Socket.IO的实时双向通信
|
||||
- 房间管理:支持用户加入/离开游戏房间
|
||||
- 位置广播:实时广播用户位置更新给房间成员
|
||||
- 连接管理:自动处理连接断开和重连机制
|
||||
|
||||
### 数据完整性保障
|
||||
- 唯一性约束检查:用户名、邮箱、手机号、GitHub ID
|
||||
- 数据验证:使用class-validator进行输入验证
|
||||
- 事务支持:批量操作支持回滚机制
|
||||
- 双模式一致性:确保内存模式和数据库模式行为一致
|
||||
|
||||
### 性能优化与监控
|
||||
- 查询优化:使用索引和查询缓存
|
||||
- 批量操作:支持批量创建和更新
|
||||
- 内存缓存:热点数据缓存机制
|
||||
- 性能监控:WebSocket连接数、消息处理延迟等指标
|
||||
- 属性测试:使用fast-check进行随机化测试
|
||||
```
|
||||
|
||||
## ⚠️ 潜在风险评估
|
||||
|
||||
### 风险分类和描述
|
||||
```markdown
|
||||
## 潜在风险
|
||||
|
||||
### 内存模式数据丢失风险
|
||||
- 内存存储在应用重启后数据会丢失
|
||||
- 不适用于生产环境的持久化需求
|
||||
- 建议仅在开发测试环境使用
|
||||
- 缓解措施:提供数据导出/导入功能
|
||||
|
||||
### WebSocket连接管理风险
|
||||
- 大量并发连接可能导致内存泄漏
|
||||
- 网络不稳定时连接频繁断开重连
|
||||
- 房间成员过多时广播性能下降
|
||||
- 缓解措施:连接数限制、心跳检测、分片广播
|
||||
|
||||
### 实时通信性能风险
|
||||
- 高频位置更新可能导致服务器压力
|
||||
- 消息广播延迟影响游戏体验
|
||||
- WebSocket消息丢失或重复
|
||||
- 缓解措施:消息限流、优先级队列、消息确认机制
|
||||
|
||||
### 双模式一致性风险
|
||||
- 内存模式和数据库模式行为可能不一致
|
||||
- 模式切换时数据同步问题
|
||||
- 测试覆盖不完整导致隐藏差异
|
||||
- 缓解措施:统一接口抽象、完整的对比测试
|
||||
|
||||
### 安全风险
|
||||
- WebSocket连接缺少足够的认证验证
|
||||
- 用户位置信息泄露风险
|
||||
- 管理员权限过度集中
|
||||
- 缓解措施:JWT认证、数据脱敏、权限细分
|
||||
```
|
||||
|
||||
## 🎮 游戏服务器特殊文档要求
|
||||
|
||||
### 实时通信协议说明
|
||||
```markdown
|
||||
### 实时通信协议
|
||||
- 协议类型:WebSocket (Socket.IO)
|
||||
- 认证方式:JWT Token验证
|
||||
- 心跳间隔:10秒
|
||||
- 超时设置:30秒无响应自动断开
|
||||
- 重连策略:指数退避,最大重试5次
|
||||
```
|
||||
|
||||
### 双模式切换指南
|
||||
```markdown
|
||||
### 双模式切换指南
|
||||
- 环境变量:`STORAGE_MODE=database|memory`
|
||||
- 切换命令:`npm run switch:database` 或 `npm run switch:memory`
|
||||
- 数据迁移:提供内存到数据库的数据导出/导入工具
|
||||
- 性能对比:内存模式响应时间<1ms,数据库模式<10ms
|
||||
```
|
||||
|
||||
### 属性测试策略说明
|
||||
```markdown
|
||||
### 属性测试策略
|
||||
- 测试框架:fast-check
|
||||
- 测试范围:管理员操作、用户状态变更、权限验证
|
||||
- 随机化参数:用户ID(1-1000000)、状态枚举、权限级别
|
||||
- 执行次数:每个属性测试运行1000次随机用例
|
||||
- 失败处理:自动收集失败用例,生成最小化复现案例
|
||||
```
|
||||
|
||||
## 📝 文档质量标准
|
||||
|
||||
### 内容质量要求
|
||||
- **准确性**:所有信息必须与代码实现一致
|
||||
- **完整性**:覆盖所有公共接口和重要功能
|
||||
- **简洁性**:每个说明控制在一句话内,突出核心要点
|
||||
- **实用性**:提供对开发者有价值的信息和建议
|
||||
|
||||
### 语言表达规范
|
||||
- 使用中文进行描述,专业术语可保留英文
|
||||
- 语言简洁明了,避免冗长的句子
|
||||
- 统一术语使用,保持前后一致
|
||||
- 避免主观评价,客观描述功能和特性
|
||||
|
||||
## 🔍 检查执行步骤
|
||||
|
||||
1. **检查README文件存在性**
|
||||
- 确保每个功能模块文件夹都有README.md
|
||||
- 检查文档结构是否完整
|
||||
|
||||
2. **验证对外接口文档**
|
||||
- 列出所有公共方法
|
||||
- 为每个方法提供一句话功能说明
|
||||
- 确保接口描述准确
|
||||
|
||||
3. **检查API接口文档**
|
||||
- 如果是business模块且开放API,必须列出所有API
|
||||
- 每个API提供一句话功能说明
|
||||
- 包含请求方法和路径
|
||||
|
||||
4. **检查WebSocket接口文档**
|
||||
- Gateway模块必须详细说明WebSocket事件
|
||||
- 包含输入输出格式
|
||||
- 说明事件处理逻辑
|
||||
|
||||
5. **验证内部依赖分析**
|
||||
- 列出所有项目内部依赖
|
||||
- 说明每个依赖的用途
|
||||
- 确保依赖关系准确
|
||||
|
||||
6. **检查核心特性描述**
|
||||
- 识别技术特性、功能特性、质量特性
|
||||
- 突出游戏服务器特殊特性
|
||||
- 描述双模式、实时通信等特点
|
||||
|
||||
7. **评估潜在风险**
|
||||
- 识别技术风险、业务风险、运维风险、安全风险
|
||||
- 提供风险缓解措施
|
||||
- 特别关注游戏服务器特有风险
|
||||
|
||||
8. **验证文档与代码一致性**
|
||||
- 确保文档内容与实际代码实现一致
|
||||
- 检查接口签名、参数类型等准确性
|
||||
- 验证特性描述的真实性
|
||||
|
||||
## 🔥 重要提醒
|
||||
|
||||
**如果在本步骤中执行了任何修改操作(创建README文件、更新文档内容、修正接口描述等),必须立即重新执行步骤6的完整检查!**
|
||||
|
||||
- ✅ 执行修改 → 🔥 立即重新执行步骤6 → 提供验证报告 → 等待用户确认
|
||||
- ❌ 执行修改 → 直接结束检查(错误做法)
|
||||
|
||||
**不能跳过重新检查环节!**
|
||||
368
docs/ai-reading/step7-code-commit.md
Normal file
368
docs/ai-reading/step7-code-commit.md
Normal file
@@ -0,0 +1,368 @@
|
||||
# 步骤7:代码提交
|
||||
|
||||
## 🎯 检查目标
|
||||
完成代码修改后的规范化提交流程,确保代码变更记录清晰、分支管理规范、提交信息符合项目标准。
|
||||
|
||||
## 📋 执行前置条件
|
||||
- 已完成前6个步骤的代码检查和修改
|
||||
- 所有修改的文件已更新修改记录和版本信息
|
||||
- 代码能够正常运行且通过测试
|
||||
|
||||
## 🔍 Git变更检查与校验
|
||||
|
||||
### 1. 检查Git状态和变更内容
|
||||
```bash
|
||||
# 查看当前工作区状态
|
||||
git status
|
||||
|
||||
# 查看具体变更内容
|
||||
git diff
|
||||
|
||||
# 查看已暂存的变更
|
||||
git diff --cached
|
||||
```
|
||||
|
||||
### 2. 文件修改记录校验
|
||||
**重要**:检查每个修改文件的头部信息是否与实际修改内容一致
|
||||
|
||||
#### 校验内容包括:
|
||||
- **修改记录**:最新的修改记录是否准确描述了本次变更
|
||||
- **修改类型**:记录的修改类型(代码规范优化、功能新增等)是否与实际修改匹配
|
||||
- **修改者信息**:是否使用了正确的用户名称
|
||||
- **修改日期**:是否使用了用户提供的真实日期
|
||||
- **版本号**:是否按照规则正确递增
|
||||
- **@lastModified**:是否更新为当前修改日期
|
||||
|
||||
#### 校验方法:
|
||||
1. 逐个检查修改文件的头部注释
|
||||
2. 对比git diff显示的实际修改内容
|
||||
3. 确认修改记录描述与实际变更一致
|
||||
4. 如发现不一致,立即修正文件头部信息
|
||||
|
||||
### 3. 修改记录不一致的处理
|
||||
如果发现文件头部的修改记录与实际修改内容不符:
|
||||
|
||||
```typescript
|
||||
// ❌ 错误示例:记录说是"功能新增",但实际只是代码清理
|
||||
/**
|
||||
* 最近修改:
|
||||
* - 2024-01-12: 功能新增 - 添加新的用户验证功能 (修改者: 张三)
|
||||
*/
|
||||
// 实际修改:只是删除了未使用的导入和注释优化
|
||||
|
||||
// ✅ 正确修正:
|
||||
/**
|
||||
* 最近修改:
|
||||
* - 2024-01-12: 代码规范优化 - 清理未使用导入和优化注释 (修改者: 张三)
|
||||
*/
|
||||
```
|
||||
|
||||
## 🌿 分支管理规范
|
||||
|
||||
### 分支命名规范
|
||||
根据修改类型创建对应的分支:
|
||||
|
||||
```bash
|
||||
# 代码规范优化分支
|
||||
feature/code-standard-optimization-[日期]
|
||||
# 示例:feature/code-standard-optimization-20240112
|
||||
|
||||
# Bug修复分支
|
||||
fix/[具体问题描述]
|
||||
# 示例:fix/room-concurrency-issue
|
||||
|
||||
# 功能新增分支
|
||||
feature/[功能名称]
|
||||
# 示例:feature/user-authentication
|
||||
|
||||
# 重构分支
|
||||
refactor/[模块名称]
|
||||
# 示例:refactor/room-management
|
||||
|
||||
# 性能优化分支
|
||||
perf/[优化内容]
|
||||
# 示例:perf/database-query-optimization
|
||||
|
||||
# 文档更新分支
|
||||
docs/[文档类型]
|
||||
# 示例:docs/api-documentation
|
||||
```
|
||||
|
||||
### 创建和切换分支
|
||||
```bash
|
||||
# 确保在主分支上
|
||||
git checkout main
|
||||
# 或者
|
||||
git checkout develop
|
||||
|
||||
# 拉取最新代码
|
||||
git pull origin main
|
||||
|
||||
# 创建并切换到新分支
|
||||
git checkout -b feature/code-standard-optimization-20240112
|
||||
```
|
||||
|
||||
## 📝 提交信息规范
|
||||
|
||||
### 提交类型映射
|
||||
根据实际修改内容选择正确的提交类型:
|
||||
|
||||
| 修改内容 | 提交类型 | 示例 |
|
||||
|---------|---------|------|
|
||||
| 命名规范调整、注释优化、代码清理 | `style` | `style:统一TypeScript代码风格和注释规范` |
|
||||
| 清理未使用代码、优化导入 | `refactor` | `refactor:清理未使用的导入和死代码` |
|
||||
| 添加新功能、新方法 | `feat` | `feat:添加用户身份验证功能` |
|
||||
| 修复Bug、错误处理 | `fix` | `fix:修复用户登录时的并发问题` |
|
||||
| 性能改进、算法优化 | `perf` | `perf:优化数据库查询性能` |
|
||||
| 代码结构调整、重构 | `refactor` | `refactor:重构用户管理服务架构` |
|
||||
| 添加或修改测试 | `test` | `test:添加用户服务单元测试` |
|
||||
| 更新文档、README | `docs` | `docs:更新API接口文档` |
|
||||
| API接口相关 | `api` | `api:添加用户信息查询接口` |
|
||||
| 数据库相关 | `db` | `db:创建用户表结构` |
|
||||
| WebSocket相关 | `websocket` | `websocket:实现实时消息推送` |
|
||||
| 认证授权相关 | `auth` | `auth:实现JWT身份验证机制` |
|
||||
| 配置文件相关 | `config` | `config:添加Redis缓存配置` |
|
||||
|
||||
### 提交信息格式
|
||||
```bash
|
||||
<类型>:<简短描述>
|
||||
|
||||
[可选的详细描述]
|
||||
|
||||
[可选的关联信息]
|
||||
```
|
||||
|
||||
### 提交信息示例
|
||||
|
||||
#### 单一类型修改
|
||||
```bash
|
||||
# 代码规范优化
|
||||
git commit -m "style:统一命名规范和注释格式
|
||||
|
||||
- 调整文件和变量命名符合项目规范
|
||||
- 优化注释格式和内容完整性
|
||||
- 清理代码格式和缩进问题"
|
||||
|
||||
# Bug修复
|
||||
git commit -m "fix:修复用户注册时的邮箱验证问题
|
||||
|
||||
- 修复邮箱格式验证逻辑错误
|
||||
- 添加重复邮箱检查机制
|
||||
- 优化错误提示信息"
|
||||
|
||||
# 功能新增
|
||||
git commit -m "feat:实现用户权限管理系统
|
||||
|
||||
- 添加角色和权限定义
|
||||
- 实现权限验证中间件
|
||||
- 支持动态权限分配"
|
||||
```
|
||||
|
||||
#### 多文件相关修改
|
||||
```bash
|
||||
git commit -m "refactor:重构用户管理模块架构
|
||||
|
||||
涉及文件:
|
||||
- src/business/user-mgmt/user.service.ts
|
||||
- src/business/user-mgmt/user.controller.ts
|
||||
- src/core/db/users/users.repository.ts
|
||||
|
||||
主要改进:
|
||||
- 分离业务逻辑和数据访问层
|
||||
- 优化服务接口设计
|
||||
- 提升代码可维护性"
|
||||
```
|
||||
|
||||
## 🔄 提交执行流程
|
||||
|
||||
### 1. 分阶段提交(推荐)
|
||||
将不同类型的修改分别提交,保持提交历史清晰:
|
||||
|
||||
```bash
|
||||
# 第一步:提交代码规范优化
|
||||
git add src/business/auth/
|
||||
git commit -m "style:优化auth模块代码规范
|
||||
|
||||
- 统一命名规范和注释格式
|
||||
- 清理未使用的导入
|
||||
- 调整代码结构和缩进"
|
||||
|
||||
# 第二步:提交功能改进(如果有)
|
||||
git add src/business/user-mgmt/
|
||||
git commit -m "feat:添加用户状态管理功能
|
||||
|
||||
- 实现用户激活/禁用功能
|
||||
- 添加状态变更日志记录
|
||||
- 支持批量状态操作"
|
||||
|
||||
# 第三步:提交测试相关(如果有)
|
||||
git add test/
|
||||
git commit -m "test:完善用户管理模块测试覆盖
|
||||
|
||||
- 添加缺失的单元测试
|
||||
- 补充集成测试用例
|
||||
- 提升测试覆盖率到95%以上"
|
||||
|
||||
# 第四步:提交文档更新(如果有)
|
||||
git add docs/ src/**/README.md
|
||||
git commit -m "docs:更新用户管理模块文档
|
||||
|
||||
- 完善API接口文档
|
||||
- 更新功能模块README
|
||||
- 添加使用示例和注意事项"
|
||||
```
|
||||
|
||||
### 2. 使用交互式暂存(精确控制)
|
||||
```bash
|
||||
# 交互式选择要提交的代码块
|
||||
git add -p src/business/auth/login.service.ts
|
||||
|
||||
# 选择代码规范相关的修改
|
||||
# 提交第一部分
|
||||
git commit -m "style:优化login.service代码规范"
|
||||
|
||||
# 暂存剩余的功能修改
|
||||
git add src/business/auth/login.service.ts
|
||||
git commit -m "feat:添加多因素认证支持"
|
||||
```
|
||||
|
||||
### 3. 提交前最终检查
|
||||
```bash
|
||||
# 检查暂存区内容
|
||||
git diff --cached
|
||||
|
||||
# 确认提交信息准确性
|
||||
git commit --dry-run
|
||||
|
||||
# 执行提交
|
||||
git commit -m "提交信息"
|
||||
```
|
||||
|
||||
## 📄 合并文档生成
|
||||
|
||||
### 合并请求文档模板
|
||||
完成所有提交后,生成合并文档:
|
||||
|
||||
```markdown
|
||||
# 代码规范优化合并请求
|
||||
|
||||
## 📋 变更概述
|
||||
本次合并请求包含对 [具体模块/功能] 的代码规范优化和质量提升。
|
||||
|
||||
## 🔍 主要变更内容
|
||||
|
||||
### 代码规范优化
|
||||
- **命名规范**:调整文件、类、方法命名符合项目规范
|
||||
- **注释规范**:完善注释内容,统一注释格式
|
||||
- **代码清理**:移除未使用的导入、变量和死代码
|
||||
- **格式统一**:统一代码缩进、换行和空格使用
|
||||
|
||||
### 功能改进(如适用)
|
||||
- **新增功能**:[具体描述新增的功能]
|
||||
- **Bug修复**:[具体描述修复的问题]
|
||||
- **性能优化**:[具体描述优化的内容]
|
||||
|
||||
### 测试完善(如适用)
|
||||
- **测试覆盖**:补充缺失的单元测试和集成测试
|
||||
- **测试质量**:提升测试用例的完整性和准确性
|
||||
|
||||
### 文档更新(如适用)
|
||||
- **API文档**:更新接口文档和使用说明
|
||||
- **README文档**:完善功能模块说明和使用指南
|
||||
|
||||
## 📊 影响范围
|
||||
- **修改文件数量**:[数量] 个文件
|
||||
- **新增代码行数**:+[数量] 行
|
||||
- **删除代码行数**:-[数量] 行
|
||||
- **测试覆盖率**:从 [原覆盖率]% 提升到 [新覆盖率]%
|
||||
|
||||
## 🧪 测试验证
|
||||
- [ ] 所有单元测试通过
|
||||
- [ ] 集成测试通过
|
||||
- [ ] E2E测试通过
|
||||
- [ ] 性能测试通过(如适用)
|
||||
- [ ] 手动功能验证通过
|
||||
|
||||
## 🔗 相关链接
|
||||
- 相关Issue:#[Issue编号]
|
||||
- 设计文档:[链接]
|
||||
- API文档:[链接]
|
||||
|
||||
## 📝 审查要点
|
||||
请重点关注以下方面:
|
||||
1. **代码规范**:命名、注释、格式是否符合项目标准
|
||||
2. **功能正确性**:新增或修改的功能是否按预期工作
|
||||
3. **测试完整性**:测试用例是否充分覆盖变更内容
|
||||
4. **文档准确性**:文档是否与代码实现保持一致
|
||||
5. **性能影响**:变更是否对系统性能产生负面影响
|
||||
|
||||
## ⚠️ 注意事项
|
||||
- 本次变更主要为代码质量提升,不涉及业务逻辑重大变更
|
||||
- 所有修改都经过充分测试验证
|
||||
- 建议在非高峰期进行合并部署
|
||||
|
||||
## 🚀 部署说明
|
||||
- **部署环境**:[测试环境/生产环境]
|
||||
- **部署时间**:[建议的部署时间]
|
||||
- **回滚方案**:如有问题可快速回滚到上一版本
|
||||
- **监控要点**:关注 [具体的监控指标]
|
||||
```
|
||||
|
||||
## 🔧 执行步骤总结
|
||||
|
||||
### 完整执行流程
|
||||
1. **Git变更检查**
|
||||
- 执行 `git status` 和 `git diff` 查看变更
|
||||
- 确认所有修改文件都在预期范围内
|
||||
|
||||
2. **修改记录校验**
|
||||
- 逐个检查修改文件的头部注释
|
||||
- 确认修改记录与实际变更内容一致
|
||||
- 如有不一致,立即修正
|
||||
|
||||
3. **创建功能分支**
|
||||
- 根据修改类型创建合适的分支
|
||||
- 使用规范的分支命名格式
|
||||
|
||||
4. **分类提交代码**
|
||||
- 按修改类型分别提交(style、feat、fix、docs等)
|
||||
- 使用规范的提交信息格式
|
||||
- 每次提交保持原子性(一次提交只做一件事)
|
||||
|
||||
5. **生成合并文档**
|
||||
- 创建详细的合并请求文档
|
||||
- 说明变更内容、影响范围、测试情况
|
||||
- 提供审查要点和部署说明
|
||||
|
||||
6. **推送和创建PR**
|
||||
- 推送分支到远程仓库
|
||||
- 创建Pull Request并关联合并文档
|
||||
|
||||
## ⚠️ 重要注意事项
|
||||
|
||||
### 提交原则
|
||||
- **原子性**:每次提交只包含一个逻辑改动
|
||||
- **完整性**:每次提交的代码都应该能正常运行
|
||||
- **描述性**:提交信息要清晰描述改动内容和原因
|
||||
- **一致性**:文件修改记录必须与实际修改内容一致
|
||||
|
||||
### 质量保证
|
||||
- 提交前必须验证代码能正常运行
|
||||
- 确保所有测试通过
|
||||
- 检查代码格式和规范符合项目标准
|
||||
- 验证文档与代码实现保持一致
|
||||
|
||||
### 协作规范
|
||||
- 遵循项目的分支管理策略
|
||||
- 提供清晰的合并请求说明
|
||||
- 及时响应代码审查意见
|
||||
- 保持提交历史的清晰和可追溯性
|
||||
|
||||
## 🔥 重要提醒
|
||||
|
||||
**如果在本步骤中执行了任何修改操作(修正文件头部信息、调整提交内容、更新文档等),必须立即重新执行步骤7的完整检查!**
|
||||
|
||||
- ✅ 执行修改 → 🔥 立即重新执行步骤7 → 提供验证报告 → 等待用户确认
|
||||
- ❌ 执行修改 → 直接结束检查(错误做法)
|
||||
|
||||
**不能跳过重新检查环节!**
|
||||
Reference in New Issue
Block a user