# 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, ) {} // 对应PHP方法: public function getPage(array $where) async getPage(where: any): Promise { // 严格按照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 { // 严格按照PHP逻辑实现 // 权限检查、字段选择、关联查询等 } // 对应PHP方法: public function add(array $data) async add(data: any): Promise { // 严格按照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. **可以直接投入生产使用**