# Competition Management System - Cursor User Rules (DEPRECATED) ⚠️ **此文件已废弃** - 请使用新的规则系统: - 项目规则:`.cursor/rules/*.mdc` - 快速参考:`AGENTS.md` - 说明文档:`.cursor/RULES_README.md` --- 以下内容保留作为备份,但不再使用: # Competition Management System - Cursor User Rules ## 项目概述 这是一个多租户的竞赛管理系统,采用前后端分离架构: - **后端**: NestJS + TypeScript + Prisma + MySQL - **前端**: Vue 3 + TypeScript + Vite + Ant Design Vue + Pinia - **认证**: JWT + RBAC (基于角色的访问控制) - **架构**: 多租户架构,数据完全隔离 ## 后端开发规范 ### 1. 模块结构 - 每个功能模块应包含:`module.ts`, `controller.ts`, `service.ts`, `dto/` 目录 - 模块命名使用复数形式(如 `users`, `roles`, `contests`) - 子模块放在父模块目录下(如 `contests/works/`, `contests/teams/`) ### 2. 服务层 (Service) - 所有数据库操作必须通过 PrismaService,禁止直接使用 SQL - 服务方法必须处理租户隔离:所有查询必须包含 `tenantId` 条件 - 使用 `@Injectable()` 装饰器 - 构造函数注入依赖,使用 private readonly - 方法命名:`create`, `findAll`, `findOne`, `update`, `remove` - 查询方法应支持分页:使用 `skip` 和 `take` 参数 ### 3. 控制器层 (Controller) - 使用 `@Controller()` 装饰器,路径使用复数形式 - 所有路由默认需要认证(除非使用 `@Public()` 装饰器) - 使用 `@Get()`, `@Post()`, `@Put()`, `@Delete()`, `@Patch()` 装饰器 - 从请求中获取租户ID:使用 `@CurrentTenantId()` 装饰器或从 JWT token 中提取 - 使用 `@CurrentUser()` 装饰器获取当前用户信息 - 权限控制:使用 `@RequirePermission()` 装饰器 - 返回统一响应格式:使用 TransformInterceptor(自动处理) ### 4. DTO (Data Transfer Object) - 所有 DTO 放在 `dto/` 目录下 - 使用 `class-validator` 进行验证 - 命名规范: - 创建:`CreateXxxDto` - 更新:`UpdateXxxDto` - 查询:`QueryXxxDto` - 必填字段使用验证装饰器(如 `@IsString()`, `@IsNumber()`) - 可选字段使用 `@IsOptional()` - 数组字段使用 `@IsArray()` 和 `@IsNumber({}, { each: true })` ### 5. 数据库操作 (Prisma) - 所有表必须包含 `tenantId` 字段(租户隔离) - 所有表必须包含审计字段:`creator`, `modifier`, `createTime`, `modifyTime` - 使用 Prisma 的 `include` 和 `select` 优化查询 - 关联查询使用嵌套 include,避免 N+1 问题 - 删除操作使用软删除(`validState` 字段)或级联删除 - 事务操作使用 `prisma.$transaction()` ### 6. 多租户处理 - **必须**:所有业务数据查询必须包含 `tenantId` 条件 - 从 JWT token 或请求头中获取租户ID - 创建数据时自动设置 `tenantId` - 更新/删除时验证数据属于当前租户 - 超级租户(`isSuper = 1`)可以访问所有租户数据 ### 7. 权限控制 - 使用 `@RequirePermission()` 装饰器进行权限检查 - 权限字符串格式:`模块:操作`(如 `contest:create`, `user:update`) - 角色权限通过 RolesGuard 自动检查 - 权限验证失败返回 403 Forbidden ### 8. 错误处理 - 使用 NestJS 内置异常:`NotFoundException`, `BadRequestException`, `UnauthorizedException`, `ForbiddenException` - 自定义异常消息使用中文 - 错误信息要清晰明确,便于调试 ### 9. 代码风格 - 使用 TypeScript 严格模式 - 使用 ESLint 和 Prettier 格式化代码 - 导入顺序:NestJS 核心 → 第三方库 → 本地模块 - 使用 async/await,避免 Promise.then() - 使用解构赋值提高代码可读性 ## 前端开发规范 ### 1. 组件结构 - 页面组件放在 `views/` 目录下,按模块组织 - 公共组件放在 `components/` 目录下 - 使用 `