docs:更新代码检查规范和API文档

- 更新AI代码检查规范简洁版
- 完善开发者代码检查规范
- 扩展OpenAPI文档,添加新的接口定义
This commit is contained in:
moyin
2026-01-08 23:03:40 +08:00
parent bb796a2469
commit dd5cc48b49
3 changed files with 1797 additions and 31 deletions

View File

@@ -14,7 +14,7 @@
- **常量**SCREAMING_SNAKE_CASE - **常量**SCREAMING_SNAKE_CASE
- **路由**kebab-case - **路由**kebab-case
- **文件夹优化**:删除单文件文件夹,扁平化结构 - **文件夹优化**:删除单文件文件夹,扁平化结构
- **Core层命名**业务支撑模块用_core后缀工具模块不用 - **Core层命名**业务支撑模块用_core后缀通用工具模块不用
#### 文件夹结构检查要求 #### 文件夹结构检查要求
**必须使用listDirectory工具详细检查每个文件夹的内容** **必须使用listDirectory工具详细检查每个文件夹的内容**
@@ -28,11 +28,19 @@
- 不超过3个文件的文件夹必须扁平化处理 - 不超过3个文件的文件夹必须扁平化处理
- 4个以上文件通常保持独立文件夹 - 4个以上文件通常保持独立文件夹
- 完整功能模块:即使文件较少也可以保持独立(需特殊说明) - 完整功能模块:即使文件较少也可以保持独立(需特殊说明)
- **测试文件位置**测试文件必须与对应源文件放在同一目录不允许单独的tests文件夹
**测试文件位置规范(重要):**
- ✅ 正确:`src/business/admin/admin.service.ts``src/business/admin/admin.service.spec.ts` 同目录
- ❌ 错误:`src/business/admin/tests/admin.service.spec.ts` 单独tests文件夹
- **强制要求**所有tests/、test/等测试专用文件夹必须扁平化,测试文件移动到源文件同目录
- **扁平化处理**包括tests/、test/、spec/、__tests__/等所有测试文件夹都必须扁平化
**常见错误:** **常见错误:**
- 只看文件夹名称,不检查内容 - 只看文件夹名称,不检查内容
- 凭印象判断,不使用工具获取准确数据 - 凭印象判断,不使用工具获取准确数据
- 遗漏3个文件以下文件夹的识别 - 遗漏3个文件以下文件夹的识别
- **忽略测试文件夹**认为tests文件夹是"标准结构"而不进行扁平化检查
### 步骤2注释规范检查 ### 步骤2注释规范检查
- **文件头注释**:功能描述、职责分离、修改记录、@author@version@since@lastModified - **文件头注释**:功能描述、职责分离、修改记录、@author@version@since@lastModified
@@ -44,22 +52,38 @@
- **AI标识替换**只有AI标识kiro、ChatGPT、Claude、AI等才可替换为用户名称 - **AI标识替换**只有AI标识kiro、ChatGPT、Claude、AI等才可替换为用户名称
- **判断示例**`@author kiro` → 可替换,`@author 张三` → 必须保留 - **判断示例**`@author kiro` → 可替换,`@author 张三` → 必须保留
- **版本号递增**:规范优化/Bug修复→修订版本+1功能变更→次版本+1重构→主版本+1 - **版本号递增**:规范优化/Bug修复→修订版本+1功能变更→次版本+1重构→主版本+1
- **时间更新**每次修改必须更新@lastModified字段 - **时间更新**只有真正修改了文件内容时才更新@lastModified字段,仅检查不修改内容时不更新日期
### 步骤3代码质量检查 ### 步骤3代码质量检查
- **清理未使用**:导入、变量、方法 - **清理未使用**:导入、变量、方法
- **常量定义**使用SCREAMING_SNAKE_CASE - **常量定义**使用SCREAMING_SNAKE_CASE
- **方法长度**建议不超过50行 - **方法长度**建议不超过50行
- **代码重复**:识别并消除重复代码 - **代码重复**:识别并消除重复代码
- **魔法数字**:提取为常量定义
- **工具函数**:抽象重复逻辑为可复用函数
### 步骤4架构分层检查 ### 步骤4架构分层检查
- **Core层**专注技术实现不含业务逻辑业务支撑模块用_core后缀 - **检查范围**:仅检查当前执行检查的文件夹,不考虑其他同层功能模块
- **Core层**:专注技术实现,不含业务逻辑
- **Core层命名规则**
- **业务支撑模块**:为特定业务功能提供技术支撑,使用`_core`后缀(如:`location_broadcast_core`
- **通用工具模块**:提供可复用的数据访问或技术服务,不使用后缀(如:`user_profiles``redis_cache`
- **判断方法**:检查模块是否专门为某个业务服务,如果是则使用`_core`后缀,如果是通用服务则不使用
- **Business层**:专注业务逻辑,不含技术实现细节 - **Business层**:专注业务逻辑,不含技术实现细节
- **依赖关系**Core层不能导入Business层Business层通过依赖注入使用Core层 - **依赖关系**Core层不能导入Business层Business层通过依赖注入使用Core层
- **职责分离**:确保各层职责清晰,边界明确 - **职责分离**:确保各层职责清晰,边界明确
### 步骤5测试覆盖检查 ### 步骤5测试覆盖检查
- **测试文件存在性**每个Service必须有.spec.ts文件 - **测试文件存在性**每个Service必须有.spec.ts文件
- **Service定义**:只有以下类型需要测试文件
-**Service类**:文件名包含`.service.ts`的业务逻辑类
-**Controller类**:文件名包含`.controller.ts`的控制器类
-**Gateway类**:文件名包含`.gateway.ts`的WebSocket网关类
-**Middleware类**:中间件不需要测试文件
-**Guard类**:守卫不需要测试文件
-**DTO类**:数据传输对象不需要测试文件
-**Interface文件**:接口定义不需要测试文件
-**Utils工具类**:工具函数不需要测试文件
- **方法覆盖**:所有公共方法必须有测试 - **方法覆盖**:所有公共方法必须有测试
- **场景覆盖**:正常、异常、边界情况 - **场景覆盖**:正常、异常、边界情况
- **测试质量**:真实有效的测试用例,不是空壳 - **测试质量**:真实有效的测试用例,不是空壳
@@ -118,25 +142,40 @@
### 架构分层 ### 架构分层
```typescript ```typescript
// Core层 - 技术实现 // Core层 - 业务支撑模块使用_core后缀
@Injectable() @Injectable()
export class RedisService { export class LocationBroadcastCoreService {
async set(key: string, value: any): Promise<void> { async broadcastPosition(data: PositionData): Promise<void> {
// 专注技术实现 // 为位置广播业务提供技术支撑
}
}
// Core层 - 通用工具模块(不使用后缀)
@Injectable()
export class UserProfilesService {
async findByUserId(userId: bigint): Promise<UserProfile> {
// 通用的用户档案数据访问服务
} }
} }
// Business层 - 业务逻辑 // Business层 - 业务逻辑
@Injectable() @Injectable()
export class UserBusinessService { export class LocationBroadcastService {
constructor(private readonly userCoreService: UserCoreService) {} constructor(
private readonly locationBroadcastCore: LocationBroadcastCoreService,
private readonly userProfiles: UserProfilesService
) {}
async registerUser(data: RegisterDto): Promise<User> { async updateUserLocation(userId: string, position: Position): Promise<void> {
// 业务逻辑验证、调用Core层、返回结果 // 业务逻辑验证、调用Core层、返回结果
} }
} }
``` ```
**Core层命名判断标准**
- **业务支撑模块**:专门为某个业务功能提供技术支撑 → 使用`_core`后缀
- **通用工具模块**:提供可复用的数据访问或基础服务 → 不使用后缀
### 测试覆盖 ### 测试覆盖
```typescript ```typescript
describe('UserService', () => { describe('UserService', () => {

File diff suppressed because it is too large Load Diff

View File

@@ -273,7 +273,7 @@ async validateUser(loginRequest: LoginRequest): Promise<AuthResult> {
**修改记录更新要求:** **修改记录更新要求:**
- **必须添加**:每次修改文件后,必须在"最近修改"部分添加新的修改记录 - **必须添加**:每次修改文件后,必须在"最近修改"部分添加新的修改记录
- **信息完整**:包含修改日期、修改类型、修改内容、修改者姓名 - **信息完整**:包含修改日期、修改类型、修改内容、修改者姓名
- **时间更新**同时更新@lastModified字段为当前修改时间 - **时间更新**只有真正修改了文件内容时才更新@lastModified字段,仅检查不修改内容时不更新日期
- **版本递增**:根据修改类型适当递增版本号 - **版本递增**:根据修改类型适当递增版本号
**版本号递增规则:** **版本号递增规则:**
@@ -364,19 +364,43 @@ src/
**职责:专注技术实现,不包含业务逻辑** **职责:专注技术实现,不包含业务逻辑**
#### 命名规范 #### 命名规范
- **业务支撑模块**:使用`_core`后缀(如`users_core``login_core` - **检查范围**:仅检查当前执行检查的文件夹,不考虑其他同层功能模块
- **底层工具模块**使用`_core`后缀(如`redis``logger` - **业务支撑模块**专门为特定业务功能提供技术支撑,使用`_core`后缀(如`location_broadcast_core``user_auth_core`
- **通用工具模块**:提供可复用的数据访问或基础技术服务,不使用`_core`后缀(如`user_profiles``redis_cache``logger`
**判断标准:**
- **业务支撑模块**:模块名称体现特定业务领域,为该业务提供技术实现 → 使用`_core`后缀
- **通用工具模块**:模块提供通用的数据访问或技术服务,可被多个业务复用 → 不使用后缀
**判断流程:**
```
1. 模块是否专门为某个特定业务功能服务?
├─ 是 → 检查模块名称是否体现业务领域
│ ├─ 是 → 使用 _core 后缀 (如: location_broadcast_core)
│ └─ 否 → 重新设计模块职责
└─ 否 → 模块是否提供通用的技术服务?
├─ 是 → 不使用 _core 后缀 (如: user_profiles, redis)
└─ 否 → 重新评估模块定位
2. 实际案例判断:
- user_profiles: 通用的用户档案数据访问 → 不使用后缀 ✓
- location_broadcast_core: 专门为位置广播业务服务 → 使用_core后缀 ✓
- redis: 通用的缓存技术服务 → 不使用后缀 ✓
- user_auth_core: 专门为用户认证业务服务 → 使用_core后缀 ✓
```
```typescript ```typescript
src/core/db/users_core/ # business/users提供数据层支 src/core/location_broadcast_core/ # 广
src/core/login_core/ # business/auth提供登录技术实现 src/core/user_auth_core/ #
src/core/redis/ # Redis技术封装 src/core/db/user_profiles/ # 访
src/core/utils/logger/ # src/core/redis/ # Redis技术封装
src/core/utils/logger/ #
src/core/db/users/ # users_core src/core/location_broadcast/ # location_broadcast_core
src/core/redis_core/ # redis src/core/db/user_profiles_core/ # user_profiles
src/core/redis_core/ # redis
``` ```
#### 技术实现示例 #### 技术实现示例
@@ -530,19 +554,48 @@ export class DatabaseService {
**规则每个Service都必须有对应的.spec.ts测试文件** **规则每个Service都必须有对应的.spec.ts测试文件**
**⚠️ Service定义重要**
只有以下类型需要测试文件:
-**Service类**:文件名包含`.service.ts`的业务逻辑类
-**Controller类**:文件名包含`.controller.ts`的控制器类
-**Gateway类**:文件名包含`.gateway.ts`的WebSocket网关类
**❌ 以下类型不需要测试文件:**
-**Middleware类**:中间件(`.middleware.ts`)不需要测试文件
-**Guard类**:守卫(`.guard.ts`)不需要测试文件
-**DTO类**:数据传输对象(`.dto.ts`)不需要测试文件
-**Interface文件**:接口定义(`.interface.ts`)不需要测试文件
-**Utils工具类**:工具函数(`.utils.ts`)不需要测试文件
-**Config文件**:配置文件(`.config.ts`)不需要测试文件
**测试文件位置规范(重要):**
-**正确位置**:测试文件必须与对应源文件放在同一目录
-**错误位置**测试文件放在单独的tests/、test/、spec/、__tests__/等文件夹中
```typescript ```typescript
// ✅ 正确:Service与测试文件一一对应 // ✅ 正确:测试文件与源文件同目录
src/core/db/users/users.service.ts src/core/db/users/users.service.ts
src/core/db/users/users.service.spec.ts src/core/db/users/users.service.spec.ts
src/core/db/users/users_memory.service.ts src/business/admin/admin.service.ts
src/core/db/users/users_memory.service.spec.ts src/business/admin/admin.service.spec.ts
// ❌ 错误:测试文件在单独文件夹
src/business/admin/admin.service.ts
src/business/admin/tests/admin.service.spec.ts #
src/business/admin/__tests__/admin.service.spec.ts #
// ❌ 错误:缺少测试文件 // ❌ 错误:缺少测试文件
src/core/login_core/login_core.service.ts src/core/login_core/login_core.service.ts
# src/core/login_core/login_core.service.spec.ts # src/core/login_core/login_core.service.spec.ts
``` ```
**扁平化要求:**
- **强制扁平化**所有tests/、test/、spec/、__tests__/等测试专用文件夹必须扁平化
- **移动规则**:将测试文件移动到对应源文件的同一目录
- **更新引用**移动后必须更新所有import路径引用
- **删除空文件夹**:移动完成后删除空的测试文件夹
### 🎯 测试用例覆盖完整性 ### 🎯 测试用例覆盖完整性
**要求测试文件必须覆盖Service中的所有公共方法** **要求测试文件必须覆盖Service中的所有公共方法**
@@ -792,7 +845,7 @@ npx jest src/core/db/users --coverage --testPathIgnorePatterns="integration.spec
- [ ] 常量使用SCREAMING_SNAKE_CASE全大写+下划线) - [ ] 常量使用SCREAMING_SNAKE_CASE全大写+下划线)
- [ ] 路由使用kebab-case短横线分隔 - [ ] 路由使用kebab-case短横线分隔
- [ ] 避免过度嵌套的文件夹结构 - [ ] 避免过度嵌套的文件夹结构
- [ ] Core层业务支撑模块使用_core后缀 - [ ] Core层业务支撑模块使用_core后缀,通用工具模块不使用后缀
#### 注释规范检查清单 #### 注释规范检查清单
- [ ] 文件头注释包含功能描述、职责分离、修改记录 - [ ] 文件头注释包含功能描述、职责分离、修改记录