主要改进:
1. 清理Core层空壳目录
- 删除traits, transformers, query等空目录
- 删除security, http, queue等空模块
- 删除logger, context, exception等空壳
2. 清理Common层冗余模块
- 删除utils, cache, queue等空壳模块
- 删除dictionary, dict等重复字典模块
- 删除重复的MemberModule.ts文件
3. 优化模块结构
- 移动config到config/common目录
- 统一模块命名规范为{模块名}.module.ts
- 保留业务逻辑模块:auth, member, rbac, admin, settings, upload, notification
4. 代码质量提升
- 更符合NestJS最佳实践
- 项目结构更清晰
- 删除所有空壳和重复代码
- 打包测试通过
技术改进:
- 使用TypeScript枚举替代PHP风格的Dict类
- 优化导入路径和模块引用
- 清理无用的空壳目录和文件
11 KiB
11 KiB
WWJ Cloud AI 开发规范
本文档为AI开发WWJ Cloud项目时必须遵循的规范,确保代码质量和架构一致性
🏗️ 架构分层规范
微服务架构原则
- 按业务领域拆分,不是按技术层级拆分
- 每个微服务 = 一个完整的业务模块
- 服务内部保持分层架构(Controller/Service/Entity)
- 服务间通过接口通信,避免直接依赖
微服务迁移路径
- 阶段1:模块化重构(当前)
- 阶段2:服务边界定义
- 阶段3:微服务拆分部署
目录结构规范
wwjcloud/src/common/{module}/
├── entities/ # 实体层(数据模型)
│ ├── {Entity}.ts # 主实体
│ └── {SubEntity}.ts # 子实体
├── services/ # 服务层
│ ├── core/ # 核心业务逻辑(共用)
│ │ └── Core{Entity}Service.ts
│ ├── api/ # 前台API服务
│ │ └── {Entity}Service.ts
│ └── admin/ # 后台管理服务
│ └── {Entity}Service.ts
├── controllers/ # 控制器层
│ ├── api/ # 前台API控制器
│ │ └── {Entity}Controller.ts
│ └── admin/ # 后台管理控制器
│ └── {Entity}Controller.ts
├── dto/ # 数据传输对象
│ ├── api/ # 前台API DTO
│ │ ├── create-{entity}.dto.ts
│ │ └── update-{entity}.dto.ts
│ └── admin/ # 后台管理 DTO
│ ├── create-{entity}.dto.ts
│ └── update-{entity}.dto.ts
└── {module}.module.ts # 模块定义
命名规范
// 实体类:PascalCase
export class Member {}
export class MemberLevel {}
// 服务类:PascalCase + Service
export class CoreMemberService {}
export class MemberService {}
export class AdminMemberService {}
// 控制器类:PascalCase + Controller
export class ApiMemberController {}
export class AdminMemberController {}
// 文件名:kebab-case
// member.service.ts
// member.controller.ts
🛣️ 路由设计规范
路由前缀规范
// 前台API路由
@Controller('api/member')
export class ApiMemberController {
// 前台用户访问的接口
}
// 后台管理路由
@Controller('admin/member')
export class AdminMemberController {
// 后台管理员访问的接口
}
API路径规范
// 前台API路径
GET /api/member/profile # 获取个人资料
PUT /api/member/profile # 更新个人资料
POST /api/member/sign # 会员签到
GET /api/member/orders # 获取订单列表
// 后台管理路径
GET /admin/member # 获取会员列表
POST /admin/member # 创建会员
GET /admin/member/:id # 获取会员详情
PUT /admin/member/:id # 更新会员
DELETE /admin/member/:id # 删除会员
📚 OpenAPI 文档规范
API分组规范
// 前台API文档
@ApiTags('前台-会员管理')
@Controller('api/member')
export class ApiMemberController {}
// 后台管理文档
@ApiTags('后台-会员管理')
@Controller('admin/member')
export class AdminMemberController {}
认证和权限规范
基础认证规范
// 前台用户认证
@UseGuards(JwtAuthGuard)
@ApiBearerAuth()
@Controller('api/member')
// 后台管理员认证
@UseGuards(JwtAuthGuard, AdminGuard)
@ApiBearerAuth()
@Controller('admin/member')
// 公开接口
@Public()
@Controller('api/member')
RBAC权限控制规范
权限模型设计
用户(User) → 角色(Role) → 权限(Permission) → 资源(Resource)
权限控制层次
- 接口级权限:通过Guard控制API访问
- 数据级权限:通过Service控制数据访问
- 字段级权限:通过DTO控制字段显示
权限装饰器规范
// 角色权限
@Roles('admin', 'manager')
@Controller('admin/member')
// 权限点
@Permissions('member:create', 'member:update')
@Post('member')
// 数据权限
@DataScope('site_id')
async getMemberList() {}
权限验证流程
请求到达 → 验证JWT → 检查角色 → 检查权限 → 访问资源
🔧 服务层职责规范
Core服务层(核心业务逻辑)
// 职责:纯业务逻辑,不涉及HTTP请求
export class CoreMemberService {
// 会员等级计算
calculateMemberLevel(points: number): MemberLevel {}
// 会员积分计算
calculateMemberPoints(actions: MemberAction[]): number {}
// 会员状态验证
validateMemberStatus(member: Member): boolean {}
}
API服务层(前台API服务)
// 职责:前台用户相关的业务逻辑
export class MemberService {
constructor(private coreService: CoreMemberService) {}
// 获取个人资料
async getProfile(memberId: number): Promise<MemberProfile> {}
// 更新个人资料
async updateProfile(memberId: number, data: UpdateProfileDto): Promise<MemberProfile> {}
// 会员签到
async signIn(memberId: number): Promise<SignResult> {}
}
Admin服务层(后台管理服务)
// 职责:后台管理相关的业务逻辑
export class AdminMemberService {
constructor(private coreService: CoreMemberService) {}
// 获取会员列表
async getMemberList(query: QueryMemberDto): Promise<PaginatedResult<Member>> {}
// 创建会员
async createMember(data: CreateMemberDto): Promise<Member> {}
// 更新会员
async updateMember(id: number, data: UpdateMemberDto): Promise<Member> {}
// 删除会员
async deleteMember(id: number): Promise<void> {}
}
🔗 模块间依赖规范
依赖注入原则
- 禁止循环依赖:A模块不能依赖B模块,B模块也不能依赖A模块
- 单向依赖:只能从上层依赖下层,不能从下层依赖上层
- 接口隔离:通过接口定义模块间的契约
模块依赖关系
Auth模块 ← Admin模块 ← RBAC模块
↓ ↓ ↓
Core模块 ← Common模块 ← 其他模块
共享服务规范
- Core服务:可以被多个模块共享
- Common服务:提供通用功能(如工具类、常量等)
- 避免跨模块直接调用:通过接口或事件通信
🔄 数据流规范
前台用户数据流
前台用户 → API控制器 → API服务 → Core服务 → 数据库
后台管理数据流
后台管理员 → Admin控制器 → Admin服务 → Core服务 → 数据库
数据隔离规范
// 前台用户只能访问自己的数据
async getProfile(memberId: number, currentMemberId: number): Promise<MemberProfile> {
if (memberId !== currentMemberId) {
throw new ForbiddenException('无权访问其他用户数据');
}
return this.memberRepository.findOne({ where: { memberId } });
}
// 后台管理员可以访问所有数据
async getMemberList(query: QueryMemberDto): Promise<PaginatedResult<Member>> {
return this.memberRepository.findAndCount({
where: query,
skip: (query.page - 1) * query.limit,
take: query.limit,
});
}
❌ 错误处理规范
统一错误码
export enum ErrorCode {
// 通用错误
SUCCESS = 200,
BAD_REQUEST = 400,
UNAUTHORIZED = 401,
FORBIDDEN = 403,
NOT_FOUND = 404,
// 业务错误
MEMBER_NOT_FOUND = 1001,
MEMBER_ALREADY_EXISTS = 1002,
INSUFFICIENT_PERMISSIONS = 1003,
}
统一响应格式
export interface ApiResponse<T = any> {
code: number;
message: string;
data: T;
timestamp: string;
path: string;
}
🚀 开发流程规范
第一步:创建实体
- 根据数据库表结构创建实体类
- 确保字段名与数据库一致
- 添加必要的装饰器和验证
第二步:创建Core服务
- 实现纯业务逻辑
- 不涉及HTTP请求和响应
- 可被其他服务复用
第三步:创建API服务
- 实现前台用户相关逻辑
- 调用Core服务
- 处理前台特定的业务需求
- 必须完整实现所有业务逻辑,禁止TODO和Mock
第四步:创建Admin服务
- 实现后台管理相关逻辑
- 调用Core服务
- 处理后台管理需求
- 必须完整实现所有业务逻辑,禁止TODO和Mock
第五步:创建控制器
- 实现HTTP接口
- 调用对应的服务
- 处理请求和响应
第六步:配置模块
- 导入所有依赖
- 配置提供者和控制器
- 导出必要的服务
第七步:代码审查
- 检查是否还有TODO标记
- 检查是否还有Mock数据
- 检查是否还有空实现
- 确保所有业务逻辑完整
📋 必须遵循的规则
1. 数据库字段一致性
- 所有实体字段名必须与
sql/wwjcloud.sql中的表结构完全一致 - 使用
@Column({ name: 'field_name' })确保字段映射正确
2. 多租户支持
- 所有业务表必须包含
site_id字段 - 独立版模式
site_id = 0 - SaaS模式
site_id > 0
3. 认证和权限
- 前台API使用
JwtAuthGuard - 后台API使用
JwtAuthGuard + AdminGuard - 公开接口使用
@Public()装饰器
4. 错误处理
- 使用统一的错误码和响应格式
- 前台用户只能访问自己的数据
- 后台管理员可以访问所有数据
5. 代码质量
- 遵循TypeScript严格模式
- 使用ESLint和Prettier规范
- 编写完整的JSDoc注释
- 实现单元测试
6. 业务逻辑完整性
- 禁止TODO标记:所有方法必须完整实现
- 禁止Mock数据:必须使用真实数据库数据
- 禁止空实现:所有方法必须包含完整业务逻辑
- 禁止硬编码:配置值必须从配置文件读取
⚠️ 禁止事项
- 禁止硬编码:所有配置值必须从配置文件或环境变量读取
- 禁止Mock数据:生产环境必须使用真实数据库,禁止返回硬编码的测试数据
- 禁止TODO标记:所有业务逻辑必须完整实现,不允许留下TODO注释
- 禁止混合职责:每个服务层必须职责单一
- 禁止跳过验证:所有输入必须进行验证
- 禁止忽略错误:必须正确处理所有异常情况
- 禁止空实现:所有方法必须包含完整的业务逻辑实现
注意:AI开发时必须严格遵循此规范,确保代码质量和架构一致性!