Best Practices

Optimus CMS development best practices to help you build high-quality, maintainable applications.

Code Organization

模块化架构

  • 按功能组织: 将相关代码组织在同一目录下
    src/
    ├── business/           # 业务模块
    │   ├── partner/       # 合伙人模块
    │   ├── points/        # 积分模块
    │   └── tasks/         # 任务模块
    ├── shared/            # 共享代码
    │   ├── decorators/    # 装饰器
    │   ├── guards/        # 守卫
    │   └── utils/         # 工具函数
    └── system/            # 系统模块
  • 单一职责: 每个模块/类/函数只做一件事情
  • 依赖注入: 使用 NestJS 的依赖注入系统

API 设计

RESTful 规范

方法路径示例说明
GET/api/users获取用户列表
GET/api/users/:id获取单个用户
POST/api/users创建用户
PUT/PATCH/api/users/:id更新用户
DELETE/api/users/:id删除用户

统一响应格式

// 成功响应
{
  "success": true,
  "data": { ... },
  "message": "操作成功"
}

// 错误响应
{
  "success": false,
  "code": "USER_NOT_FOUND",
  "message": "用户不存在"
}

错误处理

✓ 使用自定义异常

throw new BusinessException('用户不存在', 'USER_NOT_FOUND');

✓ 记录详细日志

this.logger.error('创建用户失败', {
  error: error.message,
  userId: dto.id,
  timestamp: new Date().toISOString()
});

✓ 使用 try-catch 包装异步操作

try {
  const user = await this.userService.create(dto);
  return { success: true, data: user };
} catch (error) {
  this.logger.error('创建用户失败', error);
  throw error;
}

数据验证

使用 class-validator

import { IsString, IsEmail, MinLength } from 'class-validator';

export class CreateUserDto {
  @IsString()
  @MinLength(2)
  name: string;

  @IsEmail()
  email: string;

  @IsString()
  @MinLength(8)
  password: string;
}

安全性

  • 密码加密: 使用 bcrypt 加密存储密码
  • JWT 认证: 使用短期 access token + 长期 refresh token
  • 输入验证: 永远不要信任用户输入,进行严格验证
  • SQL 注入防护: 使用 ORM 参数化查询
  • CORS 配置: 只允许授权的域名访问

性能优化

数据库查询优化

  • • 使用索引提高查询速度
  • • 避免 N+1 查询问题,使用 eager loading
  • • 分页查询大量数据
  • • 使用数据库缓存(Redis)

API 性能

  • • 使用 HTTP 缓存头
  • • 实现请求限流(Rate Limiting)
  • • 压缩响应数据(Gzip)
  • • 异步处理耗时任务

测试

测试金字塔

  • 单元测试 (70%): 测试单个函数/方法
  • 集成测试 (20%): 测试多个模块协作
  • E2E 测试 (10%): 测试完整用户流程