- 删除common层业务代码(将通过real-business-logic-generator.js重新生成) - 清理重复的core层生成工具 - 保留完整的企业级core层基础设施(Security/Cache/Tracing/Event/Queue/Health) - 版本号升级到0.3.3 - 项目架构现已完整,接下来专注优化PHP到TypeScript语法转换
15 KiB
15 KiB
🏗️ 三大框架原则对比与统一标准
📋 概述
本文档为AI开发者提供NestJS、ThinkPHP、Spring Boot三大框架的详细对比,包含功能映射、开发规范、命名约定和目录结构对比,确保AI能够更好地理解和开发功能。
重要原则:既要尊重 NestJS 框架特性,又要与 PHP 项目业务逻辑保持一致
🔄 核心功能映射
1. 基础架构对比
| 功能模块 | ThinkPHP | NestJS | Spring Boot | 对应关系 | 实现方式 |
|---|---|---|---|---|---|
| 路由系统 | Route::get() |
@Get() |
@GetMapping() |
✅ 直接对应 | 装饰器路由 |
| 控制器 | Controller |
@Controller() |
@RestController |
✅ 直接对应 | 装饰器控制器 |
| 中间件 | Middleware |
@UseGuards() |
@Component |
✅ 功能对应 | 守卫/拦截器 |
| 依赖注入 | Container::get() |
constructor() |
@Autowired |
✅ 更强大 | 自动注入 |
| 数据验证 | Validate |
@UsePipes() |
@Valid |
✅ 功能对应 | 验证管道 |
| 异常处理 | Exception |
@UseFilters() |
@ExceptionHandler |
✅ 功能对应 | 异常过滤器 |
2. 数据库操作对比
| 功能模块 | ThinkPHP | NestJS | Spring Boot | 对应关系 | 实现方式 |
|---|---|---|---|---|---|
| 模型定义 | Model |
@Entity() |
@Entity |
✅ 功能对应 | TypeORM/JPA 实体 |
| 查询构建 | Db::table() |
Repository |
JpaRepository |
✅ 功能对应 | TypeORM/JPA 仓库 |
| 关联关系 | hasMany() |
@OneToMany() |
@OneToMany |
✅ 功能对应 | ORM 关联 |
| 事务处理 | Db::startTrans() |
@Transaction() |
@Transactional |
✅ 功能对应 | 声明式事务 |
| 软删除 | SoftDelete |
@DeleteDateColumn() |
@SQLDelete |
✅ 功能对应 | ORM 软删除 |
3. 缓存和会话
| 功能模块 | ThinkPHP | NestJS | Spring Boot | 对应关系 | 实现方式 |
|---|---|---|---|---|---|
| 缓存管理 | Cache::get() |
@Inject(CACHE_MANAGER) |
@Cacheable |
✅ 功能对应 | Cache Manager |
| 会话管理 | Session |
@Session() |
HttpSession |
✅ 功能对应 | Session 装饰器 |
| Redis 集成 | Redis::get() |
@InjectRedis() |
@Autowired RedisTemplate |
✅ 功能对应 | Redis 模块 |
🏗️ 目录结构对比
ThinkPHP 目录结构
thinkphp/
├── app/ # 应用目录
│ ├── controller/ # 控制器
│ ├── model/ # 模型
│ ├── service/ # 服务层
│ └── middleware/ # 中间件
├── config/ # 配置文件
├── public/ # 公共资源
├── route/ # 路由定义
└── vendor/ # 第三方包
Spring Boot 目录结构
spring-boot/
├── src/main/java/
│ ├── controller/ # 控制器层
│ ├── service/ # 服务层
│ ├── repository/ # 数据访问层
│ ├── entity/ # 实体层
│ ├── dto/ # 数据传输对象
│ └── config/ # 配置类
├── src/main/resources/
│ ├── application.yml # 配置文件
│ └── static/ # 静态资源
└── pom.xml # 依赖管理
NestJS 目录结构
wwjcloud/
├── src/ # 源代码目录
│ ├── common/ # 通用服务层 (对应 ThinkPHP app/)
│ │ ├── auth/ # 认证授权模块
│ │ ├── member/ # 会员管理模块
│ │ ├── sys/ # 系统管理模块
│ │ ├── site/ # 站点管理模块
│ │ ├── addon/ # 插件管理模块
│ │ ├── upload/ # 文件上传模块
│ │ └── ... # 其他业务模块
│ ├── config/ # 配置管理层 (对应 ThinkPHP config/)
│ │ ├── database/ # 数据库配置
│ │ ├── redis/ # Redis配置
│ │ ├── jwt/ # JWT配置
│ │ └── app/ # 应用配置
│ ├── core/ # 核心基础设施层 (对应 ThinkPHP 核心)
│ │ ├── base/ # 基础类
│ │ ├── database/ # 数据库核心
│ │ ├── security/ # 安全核心
│ │ └── interceptors/ # 拦截器
│ └── vendor/ # 第三方服务适配层 (对应 ThinkPHP vendor/)
│ ├── payment/ # 支付适配器
│ ├── storage/ # 存储适配器
│ └── sms/ # 短信适配器
├── public/ # 公共资源
└── package.json # 依赖管理
层级对应关系
| 层级 | ThinkPHP | Spring Boot | NestJS | 说明 |
|---|---|---|---|---|
| 应用层 | app/ |
src/main/java/ |
src/common/ |
业务逻辑和通用服务 |
| 配置层 | config/ |
src/main/resources/ |
src/config/ |
配置管理和环境变量 |
| 核心层 | 框架核心 | Spring框架 | src/core/ |
基础设施和核心功能 |
| 适配层 | vendor/ |
第三方依赖 | src/vendor/ |
第三方服务集成 |
📝 命名规范对比
1. PHP (ThinkPHP) 实际命名规范
基于对 niucloud-php 项目的实际分析:
| 文件类型 | 命名规范 | 实际示例 | 说明 |
|---|---|---|---|
| 控制器 | PascalCase.php |
User.php, Order.php |
无Controller后缀 |
| 模型 | PascalCase.php |
SysUser.php, MemberLevel.php |
直接使用业务名称 |
| 验证器 | PascalCase.php |
User.php, Member.php |
无Validate后缀 |
| 服务 | PascalCase.php |
UserService.php, OrderService.php |
有Service后缀 |
| 目录 | snake_case |
adminapi/, validate/, model/ |
小写下划线 |
2. Java (Spring Boot) 标准命名规范
| 文件类型 | 命名规范 | 标准示例 | 说明 |
|---|---|---|---|
| 控制器 | PascalCase + Controller.java |
UserController.java, OrderController.java |
有Controller后缀 |
| 实体 | PascalCase.java |
User.java, Order.java |
直接使用业务名称 |
| 服务 | PascalCase + Service.java |
UserService.java, OrderService.java |
有Service后缀 |
| DTO | PascalCase + Dto.java |
CreateUserDto.java, UserResponseDto.java |
有Dto后缀 |
| 仓储 | PascalCase + Repository.java |
UserRepository.java |
有Repository后缀 |
| 目录 | camelCase |
controller/, service/, dto/ |
驼峰命名 |
3. NestJS 框架标准命名规范
| 文件类型 | 命名规范 | 标准示例 | 说明 |
|---|---|---|---|
| 控制器 | camelCaseController.ts |
userController.ts, userProfileController.ts |
camelCase + 后缀 |
| 实体 | camelCase.entity.ts |
userEntity.ts, sysUser.entity.ts |
camelCase + 后缀 |
| 服务 | camelCase.service.ts |
userService.ts, userProfileService.ts |
camelCase + 后缀 |
| DTO | camelCase.dto.ts |
createUser.dto.ts, updateUser.dto.ts |
camelCase + 后缀 |
| 模块 | camelCase.module.ts |
userModule.ts, adminModule.ts |
camelCase + 后缀 |
| 目录 | camelCase |
controllers/, services/, dto/ |
camelCase 目录 |
重要说明:
- 文件名:使用
camelCase.suffix.ts格式(本项目统一规范) - 类名:使用
PascalCase格式(TypeScript标准) - 示例:文件
userController.ts导出类UserController
🎯 统一命名标准(最终规范)
核心原则
- 业务对齐优先: 业务逻辑命名与PHP项目保持一致
- 框架规范遵循: NestJS特有文件类型按NestJS规范
- 可读性保证: 确保命名清晰、语义明确
文件命名规范(最终版)
实体文件命名
- 规范:
{PHP模型名首字母小写}.entity.ts - 对应关系: 与PHP模型文件一一对应,但使用PascalCase命名
- 示例:
- PHP
SysUser.php→ NestJSSysUser.entity.ts - PHP
SysConfig.php→ NestJSSysConfig.entity.ts - PHP
MemberLevel.php→ NestJSMemberLevel.entity.ts
控制器文件命名
- 规范:
{模块名}Controller.ts(NestJS 标准,使用camelCase) - 示例:
userController.ts,orderController.ts,adminController.ts
服务文件命名
- 规范:
{模块名}.service.ts(NestJS 标准,使用PascalCase) - 示例:
User.service.ts,Order.service.ts,Admin.service.ts
DTO文件命名
- 规范:
{操作动词}{模块名}Dto.ts(项目实际使用格式) - 示例:
CreateUserDto.ts,UpdateUserDto.ts,QueryAdminDto.ts
验证器文件命名
- 规范:
{模块名}.validator.ts(区别于PHP无后缀) - 示例:
user.validator.ts,member.validator.ts
模块文件命名
- 规范:
{模块名}.module.ts(NestJS 标准) - 示例:
user.module.ts,admin.module.ts,auth.module.ts
类命名规范(最终版)
实体类命名
- 规范:
PascalCase(与PHP模型名保持一致) - 示例:
SysUser,SysConfig,MemberLevel
控制器类命名
- 规范:
PascalCase + Controller - 示例:
UserController,AdminController,AuthController
服务类命名
- 规范:
PascalCase + Service - 示例:
UserService,OrderService,AdminService
DTO类命名
- 规范:
PascalCase + Dto - 示例:
CreateUserDto,UpdateUserDto,QueryAdminDto
方法命名规范(最终版)
业务逻辑方法
优先与 PHP 项目保持一致,NestJS 特有方法按 NestJS 规范:
- CRUD 方法: 与 PHP 项目方法名保持一致
- 查询方法: 与 PHP 项目方法名保持一致
- 业务方法: 与 PHP 项目方法名保持一致
- NestJS 生命周期方法: 按 NestJS 规范,如
onModuleInit(),onApplicationBootstrap()
变量命名规范
业务变量优先与 PHP 项目保持一致,NestJS 特有变量按 NestJS 规范:
- 业务变量: 与 PHP 项目变量名保持一致
- 业务常量: 与 PHP 项目常量名保持一致
- NestJS 注入变量: 按 NestJS 规范,如
private readonly userService: UserService - TypeORM 相关变量: 按 TypeORM 规范,如
@InjectRepository(User)
🔧 数据库命名规范
重要约束:与 PHP 项目共用数据库,必须保持命名一致
- 表名: 与 PHP 项目完全一致,包括前缀和命名方式
- 字段名: 与 PHP 项目完全一致,不能修改任何字段名
- 字段类型: 与 PHP 项目完全一致,不能修改字段类型
- 索引结构: 与 PHP 项目完全一致,不能添加或删除索引
原则:看到 PHP 项目怎么命名,我们就怎么命名,保持 100% 一致
🏗️ 模块目录结构规范
标准模块目录结构
src/common/{模块名}/
├── {模块名}.module.ts # 模块定义文件
├── controllers/ # 控制器目录
│ ├── adminapi/ # 管理端控制器目录(对应PHP adminapi/controller)
│ │ └── {模块名}Controller.ts
│ └── api/ # 前台控制器目录(对应PHP api/controller)
│ └── {模块名}Controller.ts
├── services/ # 服务目录
│ ├── admin/ # 管理端服务目录(对应PHP service/admin)
│ │ └── {模块名}.service.ts
│ ├── api/ # 前台服务目录(对应PHP service/api)
│ │ └── {模块名}.service.ts
│ └── core/ # 核心服务目录(对应PHP service/core)
│ └── {模块名}.service.ts
├── entity/ # 实体目录(对应PHP model)
│ ├── {实体名}.entity.ts # 实体文件(PascalCase.entity.ts格式)
│ └── {配置实体}.entity.ts # 配置实体文件
├── dto/ # DTO 目录(对应PHP validate)
│ ├── admin/ # 管理端DTO目录
│ │ ├── Create{模块名}Dto.ts
│ │ └── Update{模块名}Dto.ts
│ └── api/ # 前台DTO目录
│ ├── {操作}Dto.ts
│ └── {操作}Dto.ts
├── guards/ # 守卫目录(可选)
├── decorators/ # 装饰器目录(可选)
├── interfaces/ # 接口目录(可选)
└── enums/ # 枚举目录(可选)
实际示例(基于auth模块)
src/common/auth/
├── auth.module.ts
├── controllers/
│ ├── adminapi/ # 管理端控制器目录
│ │ └── authController.ts
│ └── api/ # 前台控制器目录
│ └── authController.ts
├── services/
│ ├── admin/ # 管理端服务目录
│ │ └── Auth.service.ts
│ ├── api/ # 前台服务目录
│ │ └── Auth.service.ts
│ └── core/ # 核心服务目录
│ └── Auth.service.ts
├── entity/
│ └── AuthToken.entity.ts
├── dto/
│ ├── admin/ # 管理端DTO目录
│ │ ├── CreateAuthDto.ts
│ │ └── UpdateAuthDto.ts
│ └── api/ # 前台DTO目录
│ ├── LoginDto.ts
│ └── RegisterDto.ts
├── guards/
│ ├── GlobalAuthGuard.ts
│ ├── JwtAuthGuard.ts
│ └── RolesGuard.ts
├── decorators/
│ ├── RolesDecorator.ts
│ ├── public.decorator.ts
│ └── user-context.decorator.ts
└── interfaces/
└── user.interface.ts
🔄 模块间通信规范
模块依赖管理
🎯 框架特性对比
依赖注入对比
| 框架 | 实现方式 | 示例 |
|---|---|---|
| ThinkPHP | 容器获取 | Container::get('UserService') |
| Spring Boot | 注解注入 | @Autowired private UserService userService; |
| NestJS | 构造函数注入 | constructor(private userService: UserService) {} |
装饰器对比
| 功能 | ThinkPHP | Spring Boot | NestJS |
|---|---|---|---|
| 路由 | Route::get() |
@GetMapping() |
@Get() |
| 验证 | validate() |
@Valid |
@UsePipes() |
| 事务 | Db::startTrans() |
@Transactional |
@Transaction() |
| 缓存 | Cache::remember() |
@Cacheable |
@UseInterceptors() |
📚 最佳实践
1. 业务逻辑迁移原则
- 严格按照PHP项目的业务逻辑实现
- 保持API接口的输入输出格式一致
- 维护相同的数据验证规则
- 确保错误处理机制一致
2. 框架特性使用原则
- 充分利用NestJS的依赖注入特性
- 使用装饰器简化代码编写
- 采用模块化设计提高代码可维护性
- 利用TypeScript的类型系统提高代码质量
3. 性能优化原则
- 合理使用缓存机制
- 优化数据库查询
- 实现异步处理
- 采用批量操作减少数据库访问
重要提醒: 本文档是三框架对比的权威指南,AI开发者必须严格遵循这些原则,确保代码质量和规范一致性。