# 比赛平台管理系统 - 前后端开发计划

## 一、项目概述

### 1.1 技术栈
| 层级 | 技术 |
|------|------|
| 前端 | Vue 3 + TypeScript + Ant Design Vue + Vite |
| 后端 | NestJS + Prisma + MySQL |
| 架构 | 多租户 + RBAC权限 + 动态路由菜单 |

### 1.2 系统角色
```
┌─────────────────────────────────────────────────────────────┐
│                        前端应用                              │
├──────────┬──────────┬──────────┬──────────┬─────────────────┤
│  超管端   │ 学校管理端 │  教师端   │  学生端   │    评委端       │
│ (admin)  │ (school) │(teacher) │(student) │   (judge)       │
└──────────┴──────────┴──────────┴──────────┴─────────────────┘
```

---

## 二、超管端需求对照表（根据需求表格）

### 2.1 赛事管理模块

#### 2.1.1 赛事列表页
| 功能点 | 描述 | 后端API | 前端组件 | 完成度 |
|--------|------|---------|----------|--------|
| 列表查询 | 分页、筛选（赛事名称、状态、时间范围） | `GET /contests` ✅ | `contests/Index.vue` | 80% |
| 发布/撤销 | 切换赛事发布状态 | `PATCH /contests/:id/publish` ✅ | 按钮操作 | 100% |
| 编辑 | 跳转编辑页 | `PATCH /contests/:id` ✅ | 路由跳转 | 80% |
| 详情 | 查看赛事详情 | `GET /contests/:id` ✅ | `contests/Detail.vue` | 80% |
| 删除 | 删除赛事（软删除） | `DELETE /contests/:id` ✅ | 按钮+确认 | 100% |
| 标记完结 | 将赛事标记为已完结状态 | 需新增接口 | 按钮操作 | 0% |

#### 2.1.2 赛事新建/编辑页（多Tab表单）
| Tab | 字段 | 后端支持 | 前端组件 | 完成度 |
|-----|------|----------|----------|--------|
| **基本信息** | 赛事名称、赛事类型(个人/团队)、赛事封面、赛事简介、详细说明 | ✅ Contest模型已有 | `ContestForm.vue` | 80% |
| **报名信息** | 报名开始/结束时间、报名范围(年级/班级)、团队人数限制、是否需审核 | ✅ Contest模型已有 | Tab组件 | 60% |
| **作品信息** | 提交开始/结束时间、作品类型、是否允许重复提交、作品要求 | ✅ Contest模型已有 | Tab组件 | 60% |
| **评审信息** | 评审开始/结束时间、评审规则、评分维度、评委分配 | ✅ ReviewRule模型 | Tab组件 | 40% |

#### 2.1.3 赛事公告
| 功能点 | 描述 | 后端API | 前端组件 | 完成度 |
|--------|------|---------|----------|--------|
| 公告列表 | 查询赛事公告 | `GET /contests/notices/contest/:id` ✅ | 需新增页面 | 20% |
| 新建公告 | 创建赛事公告 | `POST /contests/notices` ✅ | 弹窗表单 | 20% |
| 编辑公告 | 修改公告内容 | `PATCH /contests/notices/:id` ✅ | 弹窗表单 | 20% |
| 删除公告 | 删除公告 | `DELETE /contests/notices/:id` ✅ | 按钮操作 | 20% |

---

### 2.2 报名管理模块

#### 2.2.1 个人报名列表
| 功能点 | 描述 | 后端API | 前端组件 | 完成度 |
|--------|------|---------|----------|--------|
| 列表查询 | 筛选（赛事、报名状态、学生姓名） | `GET /contests/registrations` ✅ | `registrations/Index.vue` | 70% |
| 审核通过 | 批量/单个审核通过 | `PATCH /registrations/:id/review` ✅ | 按钮操作 | 70% |
| 审核拒绝 | 批量/单个审核拒绝 | `PATCH /registrations/:id/review` ✅ | 按钮操作 | 70% |
| 导出 | 导出报名名单Excel | 需新增接口 | 按钮操作 | 0% |
| 报名详情 | 查看报名详细信息 | `GET /registrations/:id` ✅ | 弹窗/抽屉 | 50% |

#### 2.2.2 团队报名列表
| 功能点 | 描述 | 后端API | 前端组件 | 完成度 |
|--------|------|---------|----------|--------|
| 列表查询 | 筛选（赛事、团队名称、负责人） | `GET /contests/teams` ✅ | 需新增页面 | 30% |
| 团队详情 | 查看团队成员信息 | `GET /contests/teams/:id` ✅ | 弹窗/抽屉 | 30% |
| 审核操作 | 审核团队报名 | `PATCH /registrations/:id/review` ✅ | 按钮操作 | 30% |

---

### 2.3 参赛作品模块

#### 2.3.1 作品列表
| 功能点 | 描述 | 后端API | 前端组件 | 完成度 |
|--------|------|---------|----------|--------|
| 列表查询 | 筛选（赛事、作品状态、参赛者） | `GET /contests/works` ✅ | `works/Index.vue` | 60% |
| 锁定作品 | 锁定作品不允许再修改 | `PATCH /contests/works/:id` ✅ | 按钮操作 | 50% |
| 分配评委 | 将作品分配给评委 | `POST /contests/reviews` ✅ | 弹窗操作 | 40% |
| 查看详情 | 跳转作品详情页 | `GET /contests/works/:id` ✅ | 路由跳转 | 50% |

#### 2.3.2 作品详情页
| 功能点 | 描述 | 后端API | 前端组件 | 完成度 |
|--------|------|---------|----------|--------|
| 基本信息 | 作品名称、提交者、提交时间、版本号 | `GET /contests/works/:id` ✅ | 详情页 | 50% |
| 作品预览 | 预览作品内容（图片/视频/文档） | 需文件服务 | 预览组件 | 20% |
| 附件列表 | 查看作品附件 | 已有模型 | 附件列表 | 40% |
| 评审记录 | 查看各评委评分 | `GET /contests/reviews` ✅ | 评审列表 | 30% |
| 历史版本 | 查看作品历史版本 | 需扩展接口 | 版本列表 | 20% |

---

### 2.4 评审进度模块

#### 2.4.1 评审进度列表
| 功能点 | 描述 | 后端API | 前端组件 | 完成度 |
|--------|------|---------|----------|--------|
| 进度概览 | 各赛事评审进度统计 | 需新增接口 | `reviews/Index.vue` | 30% |
| 评委完成度 | 各评委评审完成情况 | 需新增接口 | 统计列表 | 20% |
| 作品评审状态 | 各作品评审状态分布 | 需新增接口 | 状态图表 | 20% |

#### 2.4.2 评审进度详情
| 功能点 | 描述 | 后端API | 前端组件 | 完成度 |
|--------|------|---------|----------|--------|
| 作品评审明细 | 单个作品各评委评分详情 | `GET /contests/reviews` ✅ | 详情页 | 30% |
| 评分对比 | 评委评分差异对比 | 需新增接口 | 对比图表 | 0% |
| 最终得分 | 计算并显示最终得分 | 需完善逻辑 | 得分展示 | 20% |

---

### 2.5 评委管理模块

#### 2.5.1 评委池列表
| 功能点 | 描述 | 后端API | 前端组件 | 完成度 |
|--------|------|---------|----------|--------|
| 评委列表 | 查询所有评委 | `GET /contests/judges/contest/:id` ✅ | 需新增页面 | 40% |
| 添加评委 | 从用户中选择添加评委 | `POST /contests/judges` ✅ | 弹窗选择 | 40% |
| 设置权重 | 设置评委权重（加权平均） | `PATCH /contests/judges/:id` ✅ | 表单编辑 | 30% |
| 移除评委 | 移除评委 | `DELETE /contests/judges/:id` ✅ | 按钮操作 | 40% |

#### 2.5.2 评委详情
| 功能点 | 描述 | 后端API | 前端组件 | 完成度 |
|--------|------|---------|----------|--------|
| 基本信息 | 评委姓名、职称、专业领域 | `GET /contests/judges/:id` ✅ | 详情页 | 30% |
| 评审统计 | 已评/待评数量统计 | 需新增接口 | 统计卡片 | 0% |
| 评审记录 | 该评委的评审记录 | `GET /contests/reviews` ✅ | 记录列表 | 20% |

---

### 2.6 评审规则模块

| 功能点 | 描述 | 后端API | 前端组件 | 完成度 |
|--------|------|---------|----------|--------|
| 规则配置 | 在赛事编辑中配置评审规则 | `POST/PATCH /contests/review-rules` ✅ | Tab组件 | 40% |
| 评分维度 | 配置评分维度（JSON配置） | 已支持dimensions字段 | 动态表单 | 30% |
| 计分方式 | 选择计分方式（平均/加权/最高/最低） | 已支持calculation字段 | 下拉选择 | 40% |
| 分数范围 | 设置最低/最高分 | 已支持minScore/maxScore | 数字输入 | 40% |

---

### 2.7 赛果发布模块

#### 2.7.1 赛果列表
| 功能点 | 描述 | 后端API | 前端组件 | 完成度 |
|--------|------|---------|----------|--------|
| 排名列表 | 按最终得分排名 | 需新增接口 | 需新增页面 | 0% |
| 奖项设置 | 设置一二三等奖及比例 | 需新增接口 | 配置表单 | 0% |
| 批量设置 | 批量设置获奖等级 | 需新增接口 | 批量操作 | 0% |
| 发布赛果 | 发布最终结果 | 需新增接口 | 按钮操作 | 0% |

#### 2.7.2 赛果详情
| 功能点 | 描述 | 后端API | 前端组件 | 完成度 |
|--------|------|---------|----------|--------|
| 获奖名单 | 查看获奖名单 | 需新增接口 | 详情页 | 0% |
| 证书生成 | 生成获奖证书 | 需新增接口 | 证书模板 | 0% |
| 导出 | 导出获奖名单 | 需新增接口 | 按钮操作 | 0% |

---

## 三、现状分析

### 3.1 后端模块完成度

| 模块 | 目录 | API完成度 | 说明 |
|------|------|-----------|------|
| 认证模块 | `src/auth/` | 100% | 登录、JWT、权限守卫 |
| 用户模块 | `src/users/` | 100% | 用户CRUD |
| 角色模块 | `src/roles/` | 100% | 角色CRUD、权限分配 |
| 权限模块 | `src/permissions/` | 100% | 权限CRUD |
| 菜单模块 | `src/menus/` | 100% | 菜单CRUD、用户菜单 |
| 租户模块 | `src/tenants/` | 100% | 租户CRUD |
| 字典模块 | `src/dict/` | 100% | 字典CRUD |
| 配置模块 | `src/config/` | 100% | 系统配置CRUD |
| 学校模块 | `src/school/` | 100% | 学校、年级、班级、部门、教师、学生 |
| 赛事核心 | `src/contests/contests/` | 90% | 赛事CRUD、发布 |
| 团队模块 | `src/contests/teams/` | 90% | 团队CRUD、成员管理 |
| 报名模块 | `src/contests/registrations/` | 85% | 报名CRUD、审核 |
| 作品模块 | `src/contests/works/` | 80% | 作品提交、版本管理 |
| 评审规则 | `src/contests/review-rules/` | 70% | 规则CRUD |
| 评委模块 | `src/contests/judges/` | 75% | 评委CRUD |
| 评审模块 | `src/contests/reviews/` | 60% | 分配、评分（需完善统计） |
| 公告模块 | `src/contests/notices/` | 90% | 公告CRUD |
| 日志模块 | `src/logs/` | 0% | **未实现** |
| 赛果模块 | - | 0% | **未实现** |

### 3.2 前端页面完成度

| 模块 | 页面 | 路径 | 完成度 | 说明 |
|------|------|------|--------|------|
| 认证 | 登录页 | `/login` | 100% | ✅ |
| 工作台 | 首页 | `/workbench` | 100% | ✅ |
| 系统管理 | 用户管理 | `/system/users` | 100% | ✅ |
| 系统管理 | 角色管理 | `/system/roles` | 100% | ✅ |
| 系统管理 | 权限管理 | `/system/permissions` | 100% | ✅ |
| 系统管理 | 菜单管理 | `/system/menus` | 100% | ✅ |
| 系统管理 | 租户管理 | `/system/tenants` | 100% | ✅ |
| 系统管理 | 字典管理 | `/system/dict` | 100% | ✅ |
| 系统管理 | 配置管理 | `/system/config` | 100% | ✅ |
| 系统管理 | 日志查询 | `/system/logs` | 0% | 待开发 |
| 学校管理 | 学校信息 | `/school/schools` | 100% | ✅ |
| 学校管理 | 部门管理 | `/school/departments` | 100% | ✅ |
| 学校管理 | 年级管理 | `/school/grades` | 100% | ✅ |
| 学校管理 | 班级管理 | `/school/classes` | 100% | ✅ |
| 学校管理 | 教师管理 | `/school/teachers` | 100% | ✅ |
| 学校管理 | 学生管理 | `/school/students` | 100% | ✅ |
| 赛事管理 | 赛事列表 | `/contests/list` | 70% | 需完善筛选、完结功能 |
| 赛事管理 | 赛事详情 | `/contests/:id` | 60% | 需完善Tab结构 |
| 赛事管理 | 赛事表单 | `ContestForm.vue` | 60% | 需完善多Tab表单 |
| 赛事管理 | 赛事公告 | - | 20% | 需新增页面 |
| 报名管理 | 个人报名 | `/contests/registrations` | 60% | 需完善审核、导出 |
| 报名管理 | 团队报名 | - | 20% | 需新增页面 |
| 参赛作品 | 作品列表 | `/contests/works` | 50% | 需完善分配、锁定 |
| 参赛作品 | 作品详情 | - | 30% | 需完善详情页 |
| 评审进度 | 进度列表 | `/contests/reviews` | 30% | 需重构为进度看板 |
| 评审进度 | 进度详情 | - | 10% | 需新增页面 |
| 评委管理 | 评委列表 | - | 30% | 需新增页面 |
| 评委管理 | 评委详情 | - | 10% | 需新增页面 |
| 评审规则 | 规则配置 | - | 30% | 需集成到赛事表单 |
| 赛果发布 | 赛果列表 | - | 0% | 待开发 |
| 赛果发布 | 赛果详情 | - | 0% | 待开发 |

### 3.3 数据模型完成度（Prisma Schema）

```
✅ 已定义的模型：
├── Tenant（租户）
├── User（用户）
├── Role/UserRole/Permission/RolePermission（权限体系）
├── Menu/TenantMenu（菜单体系）
├── Dict/DictItem（字典）
├── Config（配置）
├── Log（日志）
├── School/Grade/Department/Class/Teacher/Student（学校体系）
├── Contest（赛事）
├── ContestAttachment（赛事附件）
├── ContestReviewRule（评审规则）
├── ContestTeam/ContestTeamMember（团队）
├── ContestRegistration（报名）
├── ContestWork/ContestWorkAttachment（作品）
├── ContestJudge（评委）
├── ContestWorkJudgeAssignment（作品分配）
├── ContestWorkScore（作品评分）
└── ContestNotice（赛事公告）

❌ 需要新增/修改的模型：
├── Contest（需新增 status: 'ongoing'|'finished' 字段）
└── ContestResult（赛果发布）- 可选，也可用现有模型扩展
```

---

## 四、待开发清单（按需求表格）

### 4.1 后端待开发

#### P0 - 核心功能（超管端闭环）

| 序号 | 模块 | 任务 | 现状 | 描述 |
|------|------|------|------|------|
| B1 | 赛事 | 添加赛事完结接口 | 需新增 | `PATCH /contests/:id/finish` |
| B2 | 报名 | 添加报名导出接口 | 需新增 | `GET /registrations/export` Excel导出 |
| B3 | 作品 | 添加作品历史版本接口 | 需新增 | `GET /works/:id/versions` |
| B4 | 评审 | 添加评审进度统计接口 | 需新增 | `GET /reviews/statistics` 按赛事统计 |
| B5 | 评审 | 添加评委完成度统计 | 需新增 | `GET /reviews/judge-statistics` |
| B6 | 评审 | 完善最终得分计算 | 需完善 | 根据规则计算最终得分 |
| B7 | 赛果 | 新增赛果发布模块 | 需新增 | 排名、奖项设置、发布 |
| B8 | 日志 | 日志模块实现 | 需新增 | 操作日志CRUD |

#### P1 - 辅助功能

| 序号 | 模块 | 任务 | 现状 | 描述 |
|------|------|------|------|------|
| B9 | 赛果 | 证书生成接口 | 需新增 | PDF证书生成 |
| B10 | 赛果 | 获奖名单导出 | 需新增 | Excel导出 |
| B11 | 文件 | 文件上传服务完善 | 需完善 | 支持预览URL生成 |

### 4.2 前端待开发

#### P0 - 超管端核心页面

| 序号 | 页面 | 路径 | 组件 | 依赖后端 | 描述 |
|------|------|------|------|----------|------|
| F1 | 赛事列表完善 | `/contests/list` | `contests/Index.vue` | B1 | 添加完结按钮、筛选完善 |
| F2 | 赛事表单重构 | `/contests/create` | `contests/Form.vue` | - | 多Tab表单（基本信息/报名/作品/评审） |
| F3 | 赛事详情重构 | `/contests/:id` | `contests/Detail.vue` | - | 多Tab详情页 |
| F4 | 赛事公告管理 | `/contests/:id/notices` | `contests/notices/Index.vue` | - | 公告CRUD |
| F5 | 团队报名列表 | `/contests/team-registrations` | `contests/team-registrations/Index.vue` | - | 团队报名管理 |
| F6 | 作品详情页 | `/contests/works/:id` | `contests/works/Detail.vue` | B3 | 详情+附件+历史版本 |
| F7 | 评审进度看板 | `/contests/:id/review-progress` | `contests/review-progress/Index.vue` | B4, B5 | 进度统计 |
| F8 | 评委管理页 | `/contests/:id/judges` | `contests/judges/Index.vue` | - | 评委CRUD |
| F9 | 评审规则配置 | 集成到赛事表单 | `contests/components/ReviewRuleTab.vue` | - | 评分维度配置 |
| F10 | 赛果发布页 | `/contests/:id/results` | `contests/results/Index.vue` | B7 | 排名/奖项/发布 |
| F11 | 日志查询页 | `/system/logs` | `system/logs/Index.vue` | B8 | 日志查询 |

#### P1 - 详情与导出

| 序号 | 页面 | 路径 | 组件 | 依赖后端 | 描述 |
|------|------|------|------|----------|------|
| F12 | 报名导出功能 | - | - | B2 | 导出Excel按钮 |
| F13 | 评委详情弹窗 | - | `contests/judges/Detail.vue` | B5 | 评委评审统计 |
| F14 | 评审详情页 | `/contests/reviews/:id` | `contests/reviews/Detail.vue` | - | 各评委评分明细 |
| F15 | 赛果详情页 | `/contests/:id/results/:workId` | `contests/results/Detail.vue` | B7 | 获奖详情 |
| F16 | 证书下载 | - | - | B9 | 证书下载功能 |

---

## 五、开发优先级排期

### Phase 1: 赛事管理闭环（3天）

**目标**：完善赛事列表、赛事表单（多Tab）、赛事详情

```
Day 1:
  - F2: 赛事表单重构（多Tab：基本信息、报名信息、作品信息）

Day 2:
  - F2续: 赛事表单（评审信息Tab + 评审规则配置 F9）
  - B1: 赛事完结接口
  - F1: 赛事列表完善（完结按钮、筛选）

Day 3:
  - F3: 赛事详情页重构（多Tab展示）
  - F4: 赛事公告管理页
```

### Phase 2: 报名与作品管理（2天）

**目标**：完善报名审核、团队管理、作品详情

```
Day 4:
  - F5: 团队报名列表页
  - B2: 报名导出接口
  - F12: 报名导出功能

Day 5:
  - B3: 作品历史版本接口
  - F6: 作品详情页（含附件、历史版本）
```

### Phase 3: 评审进度与评委管理（2天）

**目标**：评审进度可视化、评委管理

```
Day 6:
  - B4: 评审进度统计接口
  - B5: 评委完成度统计接口
  - F7: 评审进度看板

Day 7:
  - F8: 评委管理页
  - F13: 评委详情弹窗
  - F14: 评审详情页
```

### Phase 4: 赛果发布（2天）

**目标**：排名计算、奖项设置、赛果发布

```
Day 8:
  - B6: 最终得分计算逻辑完善
  - B7: 赛果发布模块（排名、奖项设置、发布接口）

Day 9:
  - F10: 赛果发布页
  - F15: 赛果详情页
```

### Phase 5: 辅助功能与优化（2天）

**目标**：日志、证书、文件服务

```
Day 10:
  - B8: 日志模块实现
  - F11: 日志查询页
  - B11: 文件上传服务完善

Day 11:
  - B9: 证书生成接口
  - B10: 获奖名单导出
  - F16: 证书下载功能
  - 联调测试、Bug修复
```

**超管端总计：约11天**

---

## 六、目录结构规划

### 6.1 后端新增/修改

```
backend/src/
├── logs/                          🆕 新增
│   ├── logs.controller.ts
│   ├── logs.service.ts
│   ├── logs.module.ts
│   └── dto/
├── contests/
│   ├── contests/                  🔧 修改
│   │   └── contests.service.ts   # 添加 finish 方法
│   ├── registrations/             🔧 修改
│   │   └── registrations.service.ts  # 添加 export 方法
│   ├── works/                     🔧 修改
│   │   └── works.service.ts      # 添加 getVersions 方法
│   ├── reviews/                   🔧 修改
│   │   └── reviews.service.ts    # 添加统计方法、完善计分
│   └── results/                   🆕 新增
│       ├── results.controller.ts
│       ├── results.service.ts
│       └── dto/
└── files/                         🔧 完善
    └── files.service.ts          # 添加预览URL生成
```

### 6.2 前端新增/修改

```
frontend/src/views/
├── contests/
│   ├── Index.vue                  🔧 修改（添加完结操作）
│   ├── Detail.vue                 🔧 重构（多Tab）
│   ├── Form.vue                   🆕 新增（多Tab表单）
│   ├── components/
│   │   ├── ContestForm.vue        🔧 修改（拆分为Tab组件）
│   │   ├── BasicInfoTab.vue       🆕 新增
│   │   ├── RegistrationTab.vue    🆕 新增
│   │   ├── WorkInfoTab.vue        🆕 新增
│   │   └── ReviewRuleTab.vue      🆕 新增
│   ├── notices/
│   │   └── Index.vue              🆕 新增
│   ├── team-registrations/
│   │   └── Index.vue              🆕 新增
│   ├── works/
│   │   ├── Index.vue              🔧 修改
│   │   └── Detail.vue             🆕 新增
│   ├── review-progress/
│   │   └── Index.vue              🆕 新增
│   ├── judges/
│   │   ├── Index.vue              🆕 新增
│   │   └── Detail.vue             🆕 新增（弹窗组件）
│   ├── reviews/
│   │   ├── Index.vue              🔧 重构
│   │   └── Detail.vue             🆕 新增
│   └── results/
│       ├── Index.vue              🆕 新增
│       └── Detail.vue             🆕 新增
└── system/
    └── logs/
        └── Index.vue              🆕 新增
```

---

## 七、菜单配置

### 7.1 需要修改/新增的菜单

```sql
-- 赛事管理下的子菜单调整
UPDATE menus SET path = '/contests/list', component = 'contests/Index' WHERE name = '赛事列表';

-- 新增菜单项
INSERT INTO menus (tenant_id, name, path, component, icon, parent_id, permission, sort, valid_state) VALUES
-- 赛事管理子菜单
(1, '赛事公告', '/contests/notices', 'contests/notices/Index', 'NotificationOutlined',
  (SELECT id FROM (SELECT id FROM menus WHERE name = '赛事管理') t), 'contest:notice:read', 15, 1),
(1, '团队报名', '/contests/team-registrations', 'contests/team-registrations/Index', 'TeamOutlined',
  (SELECT id FROM (SELECT id FROM menus WHERE name = '赛事管理') t), 'registration:read', 25, 1),
(1, '评审进度', '/contests/review-progress', 'contests/review-progress/Index', 'DashboardOutlined',
  (SELECT id FROM (SELECT id FROM menus WHERE name = '赛事管理') t), 'review:read', 45, 1),
(1, '评委管理', '/contests/judges', 'contests/judges/Index', 'UserSwitchOutlined',
  (SELECT id FROM (SELECT id FROM menus WHERE name = '赛事管理') t), 'judge:read', 55, 1),
(1, '赛果发布', '/contests/results', 'contests/results/Index', 'TrophyOutlined',
  (SELECT id FROM (SELECT id FROM menus WHERE name = '赛事管理') t), 'result:read', 65, 1),

-- 系统管理-日志
(1, '日志查询', '/system/logs', 'system/logs/Index', 'FileTextOutlined',
  (SELECT id FROM (SELECT id FROM menus WHERE name = '系统管理') t), 'log:read', 80, 1);
```

### 7.2 需要新增的权限

```sql
INSERT INTO permissions (tenant_id, code, name, resource, action, valid_state) VALUES
-- 公告权限
(1, 'contest:notice:read', '查看赛事公告', 'contest_notice', 'read', 1),
(1, 'contest:notice:create', '创建赛事公告', 'contest_notice', 'create', 1),
(1, 'contest:notice:update', '编辑赛事公告', 'contest_notice', 'update', 1),
(1, 'contest:notice:delete', '删除赛事公告', 'contest_notice', 'delete', 1),

-- 评委权限
(1, 'judge:read', '查看评委', 'judge', 'read', 1),
(1, 'judge:create', '添加评委', 'judge', 'create', 1),
(1, 'judge:update', '编辑评委', 'judge', 'update', 1),
(1, 'judge:delete', '移除评委', 'judge', 'delete', 1),

-- 赛果权限
(1, 'result:read', '查看赛果', 'result', 'read', 1),
(1, 'result:publish', '发布赛果', 'result', 'publish', 1),
(1, 'result:export', '导出赛果', 'result', 'export', 1),

-- 日志权限
(1, 'log:read', '查看日志', 'log', 'read', 1);
```

---

## 八、验收标准

### 8.1 功能验收清单

**赛事管理**
- [ ] 赛事列表支持按名称、状态、时间筛选
- [ ] 赛事可以发布/撤销/编辑/删除/标记完结
- [ ] 赛事表单包含4个Tab（基本信息/报名/作品/评审）
- [ ] 赛事详情页展示完整信息
- [ ] 赛事公告支持CRUD

**报名管理**
- [ ] 个人报名列表支持筛选、审核、导出
- [ ] 团队报名列表展示团队信息、成员
- [ ] 支持批量审核通过/拒绝

**参赛作品**
- [ ] 作品列表支持筛选、分配评委、锁定
- [ ] 作品详情展示基本信息、附件、历史版本
- [ ] 作品可预览（图片/视频/文档）

**评审进度**
- [ ] 评审进度看板展示整体完成率
- [ ] 可查看各评委评审进度
- [ ] 可查看单个作品各评委评分详情

**评委管理**
- [ ] 评委列表支持添加、设置权重、移除
- [ ] 评委详情显示评审统计

**赛果发布**
- [ ] 支持按得分排名
- [ ] 支持设置奖项等级
- [ ] 支持发布赛果
- [ ] 支持导出获奖名单

### 8.2 技术验收

- [ ] 代码符合 TypeScript 规范
- [ ] API 接口RESTful风格
- [ ] 权限控制前后端一致
- [ ] 关键功能有错误处理

---

## 九、风险与注意事项

| 风险 | 影响 | 应对措施 |
|------|------|----------|
| 评分计算逻辑复杂 | 影响赛果准确性 | 仔细设计计算规则，支持多种计分方式 |
| 多Tab表单数据校验 | 用户体验差 | 分Tab校验+整体校验 |
| 文件预览兼容性 | 部分格式无法预览 | 使用第三方预览服务或限制格式 |
| 大数据量导出 | 性能问题 | 分批导出、后台任务 |
| 证书模板设计 | 设计复杂 | 先用简单模板，后续迭代 |

---

*文档版本：v3.0*
*更新时间：2026-01-06*
*更新内容：根据需求表格详细梳理超管端功能，制定开发计划*
