# 功能模块划分文档
## 文档说明
本文档按照功能模块对武术评分系统进行清晰的划分,便于开发和维护。每个模块包含功能说明、涉及页面、API接口、数据结构等信息。
---
## 模块总览
```
武术评分系统
├── 1. 用户认证模块
├── 2. 比赛信息模块
├── 3. 场地管理模块
├── 4. 项目管理模块
├── 5. 选手管理模块
├── 6. 评分管理模块
├── 7. 评分修改模块(裁判长)
├── 8. 扣分项管理模块
├── 9. 统计分析模块
└── 10. 实时推送模块
```
---
## 一、用户认证模块
### 1.1 模块概述
负责用户登录、权限验证、Token管理等功能。
### 1.2 涉及页面
- **登录页** (`pages/login/login.vue`)
### 1.3 核心功能
#### 1.3.1 登录认证
**功能描述**: 用户通过比赛编码和邀请码进行登录
**涉及字段**:
- `matchCode`: 比赛编码
- `inviteCode`: 邀请码 (pub/admin)
**业务流程**:
```
用户输入 → 验证非空 → 调用登录API → 保存Token和用户信息 → 根据角色跳转
```
**角色跳转规则**:
- `pub` (普通评委) → 评分列表页
- `admin` (裁判长) → 多场地列表页
#### 1.3.2 Token管理
**功能描述**: 管理JWT Token的存储、验证、刷新
**存储方式**:
```javascript
// 存储Token
uni.setStorageSync('auth_token', token)
// 获取Token
const token = uni.getStorageSync('auth_token')
// 清除Token
uni.removeStorageSync('auth_token')
```
#### 1.3.3 权限验证
**功能描述**: 验证用户角色和访问权限
**权限控制**:
```javascript
// 获取用户角色
const userRole = getApp().globalData.userRole
// 权限检查
if (userRole !== 'admin') {
uni.showToast({ title: '权限不足', icon: 'none' })
uni.navigateBack()
}
```
### 1.4 API接口
- `POST /api/auth/login` - 用户登录
- `POST /api/auth/logout` - 退出登录
- `GET /api/auth/verify` - Token验证
### 1.5 数据结构
```typescript
// 登录凭证
interface LoginCredentials {
matchCode: string
inviteCode: string
}
// 认证响应
interface AuthResponse {
token: string
userRole: 'pub' | 'admin'
matchId: string
matchName: string
judgeId: string
judgeName: string
// ...
}
// 全局数据
getApp().globalData = {
userRole: 'pub' | 'admin',
matchCode: string,
token: string
}
```
### 1.6 待开发功能
- [ ] 找回密码
- [ ] 修改密码
- [ ] Token自动刷新
- [ ] 登录日志记录
---
## 二、比赛信息模块
### 2.1 模块概述
管理比赛的基本信息、时间、地点等。
### 2.2 涉及页面
- **评分列表页** (`pages/score-list/score-list.vue`)
- **多场地列表页** (`pages/score-list-multi/score-list-multi.vue`)
### 2.3 核心功能
#### 2.3.1 比赛信息展示
**显示内容**:
- 比赛名称
- 比赛时间
- 比赛地点
- 场地数量
- 项目数量
**示例**:
```
2025年全国武术散打锦标赛暨第十七届世界武术锦标赛选拔赛
比赛时间:2025年6月25日 9:00
```
#### 2.3.2 比赛状态管理
**状态类型**:
- `upcoming`: 未开始
- `ongoing`: 进行中
- `finished`: 已结束
### 2.4 API接口
- `GET /api/matches/{matchId}` - 获取比赛详情
### 2.5 数据结构
```typescript
interface Match {
matchId: string
matchName: string
matchTime: string
matchEndTime: string
location: string
status: 'upcoming' | 'ongoing' | 'finished'
venueCount: number
projectCount: number
athleteCount: number
}
```
### 2.6 待开发功能
- [ ] 比赛日程管理
- [ ] 比赛公告
- [ ] 比赛规则说明
---
## 三、场地管理模块
### 3.1 模块概述
管理比赛的各个场地信息,支持多场地切换(裁判长专用)。
### 3.2 涉及页面
- **多场地列表页** (`pages/score-list-multi/score-list-multi.vue`)
### 3.3 核心功能
#### 3.3.1 场地列表展示
**功能描述**: 显示所有场地,支持横向滚动切换
**场地数量**: 5个场地
- 第一场地
- 第二场地
- 第三场地
- 第四场地
- 第五场地
**展示信息**:
- 场地名称
- 选手数量
- 已评分数量
- 评分进度
#### 3.3.2 场地切换
**交互方式**: 横向滚动选择
**实现方式**:
```vue
{{ venue.name }}
```
**切换效果**:
- 当前场地高亮显示
- 底部绿色下划线
- 自动加载对应选手列表
### 3.4 API接口
- `GET /api/venues` - 获取场地列表
### 3.5 数据结构
```typescript
interface Venue {
venueId: string
venueName: string
order: number
athleteCount: number
scoredCount: number
status: 'active' | 'completed' | 'paused'
}
// 前端数据
data() {
return {
currentVenue: 1,
venues: [
{ id: 1, name: '第一场地' },
{ id: 2, name: '第二场地' },
{ id: 3, name: '第三场地' },
{ id: 4, name: '第四场地' },
{ id: 5, name: '第五场地' }
]
}
}
```
### 3.6 权限说明
- **普通评委**: 只能查看分配的场地
- **裁判长**: 可以查看所有场地
---
## 四、项目管理模块
### 4.1 模块概述
管理比赛的各个项目类型,支持多项目切换。
### 4.2 涉及页面
- **评分列表页** (`pages/score-list/score-list.vue`)
- **多场地列表页** (`pages/score-list-multi/score-list-multi.vue`)
### 4.3 核心功能
#### 4.3.1 项目列表展示
**功能描述**: 显示所有项目,支持横向滚动切换
**项目数量**: 8个项目
1. 女子组长拳
2. 男子组陈氏太极拳
3. 女子组双剑(含长穗双剑)
4. 男子组杨氏太极拳
5. 女子组刀术
6. 男子组棍术
7. 女子组枪术
8. 男子组剑术
**展示信息**:
- 项目名称
- 参赛选手数
- 评分范围
#### 4.3.2 项目切换
**交互方式**: 横向滚动选择
**实现方式**:
```vue
{{ project }}
```
**切换效果**:
- 当前项目背景变绿
- 文字变白
- 自动加载对应选手列表
### 4.4 API接口
- `GET /api/projects` - 获取项目列表
- `GET /api/projects/{projectId}` - 获取项目详情
### 4.5 数据结构
```typescript
interface Project {
projectId: string
projectName: string
category: string
order: number
athleteCount: number
minScore: 5.0
maxScore: 10.0
scoreStep: 0.001
}
// 前端数据
data() {
return {
currentProject: 0,
projects: [
'女子组长拳',
'男子组陈氏太极拳',
// ...
]
}
}
```
---
## 五、选手管理模块
### 5.1 模块概述
管理参赛选手信息,展示选手列表,支持查询和筛选。
### 5.2 涉及页面
- **评分列表页** (`pages/score-list/score-list.vue`)
- **评分详情页** (`pages/score-detail/score-detail.vue`)
- **多场地列表页** (`pages/score-list-multi/score-list-multi.vue`)
- **修改评分页** (`pages/modify-score/modify-score.vue`)
### 5.3 核心功能
#### 5.3.1 选手列表展示
**普通评委视图**:
- 选手姓名
- 身份证号
- 队伍名称
- 比赛编号
- 我的评分(已评分)
- 总分(已评分)
- 评分按钮(未评分)
**裁判长视图**:
- 选手姓名
- 身份证号
- 队伍名称
- 比赛编号
- 总分
- 修改按钮
#### 5.3.2 选手详情展示
**显示内容**:
```
姓名:张三
身份证:123456789000000000
队伍:少林寺武术大学院
编号:123-4567898275
```
#### 5.3.3 选手状态管理
**状态类型**:
- `waiting`: 等待表演
- `performing`: 正在表演
- `finished`: 已完成
### 5.4 API接口
- `GET /api/athletes` - 获取选手列表(普通评委)
- `GET /api/athletes/all` - 获取选手列表(裁判长)
- `GET /api/athletes/{athleteId}` - 获取选手详情
### 5.5 数据结构
```typescript
// 普通评委���图
interface AthleteListItem {
athleteId: string
name: string
idCard: string
team: string
number: string
myScore?: number
totalScore?: number
scored: boolean
}
// 裁判长视图
interface AthleteListItemAdmin {
athleteId: string
name: string
idCard: string
team: string
number: string
totalScore?: number
judgeCount: number
totalJudges: number
canModify: boolean
}
```
### 5.6 待开发功能
- [ ] 选手照片展示
- [ ] 选手历史成绩
- [ ] 选手搜索功能
- [ ] 选手分组管理
---
## 六、评分管理模块(普通评委)
### 6.1 模块概述
普通评委对选手进行评分的核心功能模块。
### 6.2 涉及页面
- **评分列表页** (`pages/score-list/score-list.vue`)
- **评分详情页** (`pages/score-detail/score-detail.vue`)
### 6.3 核心功能
#### 6.3.1 评分界面
**评分控制**:
- 当前分数显示(精度0.001,3位小数)
- 减分按钮(-0.001)
- 加分按钮(+0.001)
- 分数范围:5.000 - 10.000
**实现方式**:
```javascript
decreaseScore() {
if (this.currentScore > this.minScore) {
this.currentScore = parseFloat((this.currentScore - 0.001).toFixed(3))
}
}
increaseScore() {
if (this.currentScore < this.maxScore) {
this.currentScore = parseFloat((this.currentScore + 0.001).toFixed(3))
}
}
```
#### 6.3.2 扣分项选择
**功能描述**: 多选扣分项
**扣分项数量**: 8项
**交互方式**:
```javascript
toggleDeduction(index) {
this.deductions[index].checked = !this.deductions[index].checked
}
```
**显示方式**:
- 2列网格布局
- 圆形复选框
- 选中变绿
#### 6.3.3 备注填写
**功能描述**: 填写评分备注(选填)
**限制**:
- 最大200字
- 多行文本输入
#### 6.3.4 提交评分
**提交流程**:
```
验证分数范围 → 收集扣分项 → 调用API → 显示成功提示 → 返回列表页
```
**验证规则**:
- 分数必须在5.000-10.000之间
- 精度必须为0.001
- 不可重复提交
### 6.4 API接口
- `POST /api/scores` - 提交评分
- `GET /api/scores/my-records` - 获取我的评分记录
### 6.5 数据结构
```typescript
// 评分提交
interface ScoreSubmit {
matchId: string
athleteId: string
judgeId: string
projectId: string
venueId: string
score: number
deductions: string[]
note?: string
}
// 页面数据
data() {
return {
currentScore: 8.907,
note: '',
minScore: 5.0,
maxScore: 10.0,
deductions: [
{ text: '扣分项描述', checked: false },
// ...
]
}
}
```
### 6.6 业务规则
1. **评分范围**: 5.000 - 10.000
2. **评分精度**: 0.001(3位小数)
3. **重复提交**: 不允许重复提交
4. **备注长度**: 最多200字
5. **扣分项**: 支持多选
---
## 七、评分修改模块(裁判长)
### 7.1 模块概述
裁判长查看所有评分并进行修改的功能模块。
### 7.2 涉及页面
- **多场地列表页** (`pages/score-list-multi/score-list-multi.vue`)
- **修改评分页** (`pages/modify-score/modify-score.vue`)
### 7.3 核心功能
#### 7.3.1 评分详情查看
**显示内容**:
- 选手基本信息
- 当前总分
- 各评委评分明细
**评委评分明细**:
```
共有6位评委完成评分
欧阳丽娜:8.907
张三:8.901
裁判姓名:8.902
裁判姓名:8.907
裁判姓名:8.905
裁判姓名:8.904
```
#### 7.3.2 修改总分
**修改控制**:
- 原始总分显示
- 修改后分数(可调整)
- "可不改"提示
- 分数范围:5.000 - 10.000
**实现方式**:
```javascript
decreaseScore() {
if (this.currentScore > this.minScore) {
this.currentScore = parseFloat((this.currentScore - 0.001).toFixed(3))
}
}
increaseScore() {
if (this.currentScore < this.maxScore) {
this.currentScore = parseFloat((this.currentScore + 0.001).toFixed(3))
}
}
```
#### 7.3.3 修改备注
**功能描述**: 填写修改原因(可选填)
**限制**:
- 最大200字
- 多行文本输入
- "可不填"提示
#### 7.3.4 提交修改
**提交流程**:
```
验证权限 → 验证分数 → 调用API → 记录修改日志 → 返回列表页
```
### 7.4 API接口
- `GET /api/scores/{athleteId}` - 获取评分详情
- `PUT /api/scores/{athleteId}/modify` - 修改评分
### 7.5 数据结构
```typescript
// 修改提交
interface ScoreModifySubmit {
athleteId: string
modifierId: string
originalScore: number
modifiedScore: number
note: string
}
// 评委评分
interface JudgeScore {
scoreId: string
judgeId: string
judgeName: string
score: number
deductions: Deduction[]
note?: string
scoreTime: string
}
// 修改记录
interface ScoreModification {
modifyId: string
modifierId: string
modifierName: string
originalScore: number
modifiedScore: number
note: string
modifyTime: string
}
```
### 7.6 权限控制
- 只有裁判长可以修改评分
- 修改前验证用户角色
- 记录修改人和修改时间
### 7.7 业务规则
1. **权限**: 只有admin角色可以修改
2. **修改范围**: 5.000 - 10.000
3. **修改精度**: 0.001
4. **修改记录**: 保留完整的修改历史
5. **备注**: 建议填写修改原因
---
## 八、扣分项管理模块
### 8.1 模块概述
管理各项目的扣分项,用于评分时选择。
### 8.2 涉及页面
- **评分详情页** (`pages/score-detail/score-detail.vue`)
### 8.3 核心功能
#### 8.3.1 扣分项展示
**显示方式**:
- 2列网格布局
- 圆形复选框
- 扣分项描述
**扣分项数量**: 8项(当前为Mock数据)
#### 8.3.2 扣分项选择
**功能描述**: 支持多选
**交互方式**:
- 点击切换选中状态
- 选中后复选框变绿
- 显示白色对勾
### 8.4 API接口
- `GET /api/deductions` - 获取扣分项列表
### 8.5 数据结构
```typescript
// 扣分项
interface Deduction {
deductionId: string
projectId: string
text: string
score: number // 扣分值(负数)
category?: string
order: number
}
// 前端选择项
interface DeductionItem {
deductionId?: string
text: string
checked: boolean
}
// 前端数据
data() {
return {
deductions: [
{ text: '扣分项描述', checked: false },
{ text: '扣分项描述', checked: false },
{ text: '扣分项描述', checked: true },
// ... 共8项
]
}
}
```
### 8.6 待开发功能
- [ ] 动态加载扣分项
- [ ] 扣分项分类
- [ ] 扣分值显示
- [ ] 扣分项说明
---
## 九、统计分析模块
### 9.1 模块概述
提供比赛的统计数据和分析报表(裁判长专用)。
### 9.2 当前状态
**状态**: 待开发
### 9.3 规划功能
#### 9.3.1 比赛总览
**统计内容**:
- 总选手数
- 已完成评分数
- 评分进度
- 平均分
- 最高分/最低分
#### 9.3.2 场地统计
**统计内容**:
- 各场地选手数
- 各场地完成度
- 各场地平均分
#### 9.3.3 项目统计
**统计内容**:
- 各项目选手数
- 各项目完成度
- 各项目平均分
- 各项目最高分/最低分
#### 9.3.4 评委统计
**统计内容**:
- 评委评分数量
- 评委平均给分
- 评委评分分布
- 评委评分时间统计
#### 9.3.5 数据导出
**导出功能**:
- 导出Excel报表
- 导出PDF报告
- 导出选手成绩单
### 9.4 API接口
- `GET /api/statistics/match/{matchId}` - 比赛统计
- `GET /api/statistics/judges` - 评委统计
- `POST /api/export/excel` - 导出Excel
- `POST /api/export/pdf` - 导出PDF
### 9.5 数据结构
```typescript
// 比赛统计
interface MatchStatistics {
matchId: string
totalAthletes: number
finishedAthletes: number
totalJudges: number
activeJudges: number
totalScores: number
averageScore: number
highestScore: number
lowestScore: number
venueStats: VenueStatistics[]
projectStats: ProjectStatistics[]
}
```
---
## 十、实时推送模块
### 10.1 模块概述
通过WebSocket实现评分数据的实时推送和更新。
### 10.2 当前状态
**状态**: 待开发
### 10.3 规划功能
#### 10.3.1 评分实时更新
**功能描述**: 其他评委评分后实时推送
**推送内容**:
- 选手ID
- 评委姓名
- 评分
- 当前总分
#### 10.3.2 评分修改通知
**功能描述**: 裁判长修改评分后推送通知
**推送内容**:
- 选手ID
- 原始分数
- 修改后分数
- 修改原因
#### 10.3.3 选手状态更新
**功能描述**: 选手表演状态实时更新
**推送内容**:
- 选手ID
- 状态变化(等待→表演中→完成)
### 10.4 WebSocket连接
```javascript
// 连接WebSocket
const connectWebSocket = () => {
const token = uni.getStorageSync('auth_token')
uni.connectSocket({
url: `wss://api.example.com/ws?token=${token}`,
success: () => {
console.log('WebSocket连接成功')
}
})
// 监听消息
uni.onSocketMessage((res) => {
const message = JSON.parse(res.data)
handleWebSocketMessage(message)
})
}
// 处理推送消息
const handleWebSocketMessage = (message) => {
switch (message.type) {
case 'new_score':
// 处理新评分
break
case 'score_modified':
// 处理评分修改
break
case 'athlete_status':
// 处理选手状态更新
break
}
}
```
### 10.5 数据结构
```typescript
// 新评分推送
interface NewScoreMessage {
type: 'new_score'
data: {
athleteId: string
athleteName: string
judgeId: string
judgeName: string
score: number
totalScore: number
judgeCount: number
timestamp: string
}
}
// 评分修改推送
interface ScoreModifiedMessage {
type: 'score_modified'
data: {
athleteId: string
athleteName: string
modifierId: string
modifierName: string
originalScore: number
modifiedScore: number
note: string
timestamp: string
}
}
// 选手状态推送
interface AthleteStatusMessage {
type: 'athlete_status'
data: {
athleteId: string
athleteName: string
status: 'waiting' | 'performing' | 'finished'
timestamp: string
}
}
```
---
## 模块依赖关系
```
用户认证模块
↓
├─→ 比赛信息模块
│ ↓
│ ├─→ 场地管理模块
│ │ ↓
│ │ └─→ 选手管理模块
│ │ ↓
│ │ ├─→ 评分管理模块
│ │ │ ↓
│ │ │ └─→ 扣分项管理模块
│ │ │
│ │ └─→ 评分修改模块
│ │
│ └─→ 项目管理模块
│ ↓
│ └─→ 选手管理模块
│
└─→ 统计分析模块
↓
└─→ 实时推送模块
```
---
## 开发优先级建议
### 第一阶段(核心功能)
1. **用户认证模块** - 必须先完成
2. **比赛信息模块** - 基础数据
3. **选手管理模块** - 核心业务
4. **评分管理模块** - 核心业务
5. **扣分项管理模块** - 配合评分
**预计时间**: 2-3周
### 第二阶段(管理功能)
1. **场地管理模块** - 裁判长功能
2. **项目管理模块** - 裁判长功能
3. **评分修改模块** - 裁判长功能
**预计时间**: 1-2周
### 第三阶段(增强功能)
1. **统计分析模块** - 数据分析
2. **实时推送模块** - 实时更新
**预计时间**: 2-3周
---
## 模块测试要点
### 用户认证模块
- [ ] 登录成功/失败
- [ ] Token存储和获取
- [ ] 角色判断和跳转
- [ ] Token过期处理
### 评分管理模块
- [ ] 评分范围验证
- [ ] 评分精度验证
- [ ] 扣分项多选
- [ ] 重复提交防止
- [ ] 备注长度限制
### 评分修改模块
- [ ] 权限验证
- [ ] 修改记录保存
- [ ] 修改通知推送
- [ ] 修改历史查询
### 选手管理模块
- [ ] 列表分页加载
- [ ] 选手详情展示
- [ ] 状态实时更新
- [ ] 搜索和筛选
---
## 附录:模块接口对应表
| 模块 | 主要接口 | 涉及页面 |
|------|---------|---------|
| 用户认证 | POST /api/auth/login | login.vue |
| 比赛信息 | GET /api/matches/{matchId} | score-list.vue, score-list-multi.vue |
| 场地管理 | GET /api/venues | score-list-multi.vue |
| 项目管理 | GET /api/projects | score-list.vue, score-list-multi.vue |
| 选手管理 | GET /api/athletes | score-list.vue |
| 评分管理 | POST /api/scores | score-detail.vue |
| 评分修改 | PUT /api/scores/{athleteId}/modify | modify-score.vue |
| 扣分项管理 | GET /api/deductions | score-detail.vue |
| 统计分析 | GET /api/statistics/match/{matchId} | 待开发 |
| 实时推送 | WebSocket连接 | 所有页面 |
---
## 总结
本文档按功能模块清晰地划分了武术评分系统的所有功能,每个模块都包含了详细的功能说明、涉及页面、API接口和数据结构。建议按照开发优先级进行分阶段开发,确保核心功能先完成,再逐步添加增强功能。