Files
wwjcloud/.trae/rules/nestjs_file_generation_standards.md

341 lines
11 KiB
Markdown
Raw Normal View History

# NestJS 文件生成标准(严格规范)
## 🚫 严格禁止条款
### 绝对禁止的行为
1. **禁止自创业务逻辑** - 所有业务逻辑必须严格按照PHP项目实现
2. **禁止假设数据结构** - 所有数据结构必须基于真实数据库表结构
3. **禁止使用默认值** - 所有字段、方法、配置必须基于真实PHP代码
4. **禁止编写骨架代码** - 不允许生成空方法或TODO注释
5. **禁止写死数据** - 不允许硬编码任何业务数据
6. **禁止猜测API接口** - 所有接口必须基于PHP控制器真实方法
## 📋 数据源依据(必须严格遵循)
### 1. 数据库结构依据
- **唯一数据源**: `g:\wwjcloud-nestjs\sql\wwjcloud.sql`
- **字段定义**: 严格按照SQL表结构定义实体字段
- **字段类型**: 完全对应数据库字段类型
- **字段约束**: 包括NOT NULL、DEFAULT、COMMENT等
### 2. PHP业务逻辑依据
- **控制器方法**: `niucloud-php\niucloud\app\adminapi\controller\`
- **服务层逻辑**: `niucloud-php\niucloud\app\service\`
- **模型定义**: `niucloud-php\niucloud\app\model\`
- **验证规则**: `niucloud-php\niucloud\app\validate\`
### 3. Java框架参考标准
- **Spring Boot命名规范**: 文件后缀、类命名、方法命名
- **分层架构**: Controller → Service → Repository → Entity
- **注解使用**: 参考Spring Boot注解模式设计NestJS装饰器
## 🏗️ 文件生成规范
### 实体文件生成 (*.entity.ts)
```typescript
// 基于数据库表: sys_user
// 严格对应字段,不允许增减
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';
@Entity('sys_user')
export class SysUser {
@PrimaryGeneratedColumn({ name: 'uid', comment: '系统用户ID' })
uid: number;
@Column({ name: 'username', type: 'varchar', length: 255, default: '', comment: '用户账号' })
username: string;
@Column({ name: 'head_img', type: 'varchar', length: 255, default: '' })
headImg: string;
@Column({ name: 'password', type: 'varchar', length: 100, default: '', comment: '用户密码' })
password: string;
@Column({ name: 'real_name', type: 'varchar', length: 16, default: '', comment: '实际姓名' })
realName: string;
@Column({ name: 'last_ip', type: 'varchar', length: 50, default: '', comment: '最后一次登录ip' })
lastIp: string;
@Column({ name: 'last_time', type: 'int', unsigned: true, default: 0, comment: '最后一次登录时间' })
lastTime: number;
@Column({ name: 'create_time', type: 'int', unsigned: true, default: 0, comment: '添加时间' })
createTime: number;
@Column({ name: 'login_count', type: 'int', unsigned: true, default: 0, comment: '登录次数' })
loginCount: number;
@Column({ name: 'status', type: 'tinyint', unsigned: true, default: 1, comment: '后台管理员状态 1有效0无效' })
status: number;
@Column({ name: 'is_del', type: 'tinyint', unsigned: true, default: 0 })
isDel: number;
@Column({ name: 'delete_time', type: 'int', default: 0, comment: '删除时间' })
deleteTime: number;
@Column({ name: 'update_time', type: 'int', default: 0, comment: '更新时间' })
updateTime: number;
}
```
### 控制器文件生成 (*.controller.ts)
```typescript
// 基于PHP控制器: app\adminapi\controller\user\User.php
// 严格对应所有public方法
import { Controller, Get, Post, Put, Delete, Param, Body, Query } from '@nestjs/common';
import { UserService } from './user.service';
@Controller('adminapi/user')
export class UserController {
constructor(private readonly userService: UserService) {}
// 对应PHP方法: public function lists()
@Get('lists')
async lists(@Query() query: any) {
const data = {
username: query.username || '',
real_name: query.real_name || '',
last_time: query.last_time || []
};
return await this.userService.getPage(data);
}
// 对应PHP方法: public function info($uid)
@Get('info/:uid')
async info(@Param('uid') uid: number) {
return await this.userService.getInfo(uid);
}
// 对应PHP方法: public function getUserAll()
@Get('getUserAll')
async getUserAll(@Query() query: any) {
const data = {
username: query.username || '',
realname: query.realname || '',
create_time: query.create_time || []
};
return await this.userService.getUserAll(data);
}
// 对应PHP方法: public function getUserSelect()
@Get('getUserSelect')
async getUserSelect(@Query() query: any) {
const data = {
username: query.username || ''
};
return await this.userService.getUserSelect(data);
}
// 对应PHP方法: public function checkUserIsExist()
@Get('checkUserIsExist')
async checkUserIsExist(@Query() query: any) {
const data = {
username: query.username || ''
};
return await this.userService.checkUsername(data.username);
}
// 对应PHP方法: public function add()
@Post('add')
async add(@Body() body: any) {
const data = {
username: body.username || '',
password: body.password || '',
real_name: body.real_name || '',
status: body.status || 1, // UserDict::ON
head_img: body.head_img || '',
create_site_limit: body.create_site_limit || []
};
return await this.userService.add(data);
}
// 对应PHP方法: public function edit($uid)
@Put('edit/:uid')
async edit(@Param('uid') uid: number, @Body() body: any) {
const data = {
password: body.password || '',
real_name: body.real_name || '',
head_img: body.head_img || ''
};
return await this.userService.edit(uid, data);
}
// 对应PHP方法: public function del($uid)
@Delete('del/:uid')
async del(@Param('uid') uid: number) {
return await this.userService.del(uid);
}
// 对应PHP方法: public function getUserCreateSiteLimit($uid)
@Get('getUserCreateSiteLimit/:uid')
async getUserCreateSiteLimit(@Param('uid') uid: number) {
return await this.userService.getUserCreateSiteLimit(uid);
}
// 对应PHP方法: public function getUserCreateSiteLimitInfo($id)
@Get('getUserCreateSiteLimitInfo/:id')
async getUserCreateSiteLimitInfo(@Param('id') id: number) {
return await this.userService.getUserCreateSiteLimitInfo(id);
}
// 对应PHP方法: public function addUserCreateSiteLimit($uid)
@Post('addUserCreateSiteLimit/:uid')
async addUserCreateSiteLimit(@Param('uid') uid: number, @Body() body: any) {
const data = {
uid: body.uid || 0,
group_id: body.group_id || 0,
num: body.num || 1,
month: body.month || 1
};
return await this.userService.addUserCreateSiteLimit(data);
}
// 对应PHP方法: public function editUserCreateSiteLimit($id)
@Put('editUserCreateSiteLimit/:id')
async editUserCreateSiteLimit(@Param('id') id: number, @Body() body: any) {
const data = {
num: body.num || 1,
month: body.month || 1
};
return await this.userService.editUserCreateSiteLimit(id, data);
}
// 对应PHP方法: public function delUserCreateSiteLimit($id)
@Delete('delUserCreateSiteLimit/:id')
async delUserCreateSiteLimit(@Param('id') id: number) {
return await this.userService.delUserCreateSiteLimit(id);
}
}
```
### 服务文件生成 (*.service.ts)
```typescript
// 基于PHP服务: app\service\admin\user\UserService.php
// 严格对应所有public方法签名和业务逻辑
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { SysUser } from './sysUser.entity';
@Injectable()
export class UserService {
constructor(
@InjectRepository(SysUser)
private readonly sysUserRepository: Repository<SysUser>,
) {}
// 对应PHP方法: public function getPage(array $where)
async getPage(where: any): Promise<any> {
// 严格按照PHP逻辑实现
// AuthService::isSuperAdmin(); 对应的权限检查
// 字段选择: 'uid,username,head_img,real_name,last_ip,last_time,login_count,status'
// 搜索条件: username, real_name, last_time
// 排序: uid desc
// 分页查询逻辑
}
// 对应PHP方法: public function getInfo(int $uid)
async getInfo(uid: number): Promise<any> {
// 严格按照PHP逻辑实现
// 权限检查、字段选择、关联查询等
}
// 对应PHP方法: public function add(array $data)
async add(data: any): Promise<any> {
// 严格按照PHP逻辑实现
// 用户名重复检查、事务处理等
}
// ... 其他方法严格对应PHP服务类
}
```
## 🔍 生成检查清单
### 必须检查项
- [ ] 实体字段与数据库表100%对应
- [ ] 控制器方法与PHP控制器100%对应
- [ ] 服务方法与PHP服务100%对应
- [ ] 方法参数与PHP方法参数100%对应
- [ ] 业务逻辑与PHP业务逻辑100%对应
- [ ] 路由定义与PHP路由100%对应
### 禁止检查项
- [ ] 没有自创的业务逻辑
- [ ] 没有假设的数据结构
- [ ] 没有默认的配置值
- [ ] 没有空的方法体
- [ ] 没有TODO注释
- [ ] 没有硬编码数据
## 🎯 质量标准
### A级标准必须达到
- 数据库字段映射准确率: 100%
- PHP方法对应准确率: 100%
- 业务逻辑一致性: 100%
- 代码可直接运行: 100%
### 验证方式
1. 使用 `auto-mapping-checker.js` 检查文件对应关系
2. 对比数据库表结构与实体定义
3. 对比PHP控制器与NestJS控制器方法
4. 对比PHP服务与NestJS服务业务逻辑
## 📝 开发流程
### 标准流程(严格执行)
1. **分析阶段**: 详细分析PHP源码和数据库结构
2. **设计阶段**: 基于真实数据设计NestJS文件结构
3. **实现阶段**: 严格按照PHP逻辑实现NestJS代码
4. **验证阶段**: 使用自动化工具验证对应关系
5. **测试阶段**: 确保生成的代码可以正常运行
### 每个文件生成前必须
1. 查看对应的PHP文件源码
2. 查看相关的数据库表结构
3. 理解真实的业务逻辑
4. 确认所有依赖关系
5. 验证生成的代码正确性
## ⚠️ 违规处理
### 发现违规行为时
1. 立即停止代码生成
2. 重新分析PHP源码
3. 修正错误的假设
4. 重新生成正确代码
5. 验证修正结果
### 常见违规示例
```typescript
// ❌ 错误示例 - 自创字段
@Column()
createdBy: string; // 数据库表中不存在此字段
// ❌ 错误示例 - 假设方法
async someMethod() {
// TODO: 实现业务逻辑
} // PHP中不存在此方法
// ❌ 错误示例 - 默认值
const DEFAULT_PAGE_SIZE = 10; // 应该从PHP代码中获取真实值
// ✅ 正确示例 - 基于真实数据
@Column({ name: 'username', type: 'varchar', length: 255, default: '', comment: '用户账号' })
username: string; // 严格对应数据库字段定义
```
## 🎯 最终目标
确保生成的NestJS项目
1. **业务逻辑100%与PHP一致**
2. **数据结构100%与数据库一致**
3. **API接口100%与PHP接口一致**
4. **代码质量符合NestJS最佳实践**
5. **可以直接投入生产使用**