Files
martial-admin-mini/doc/功能模块划分.md
宅房 7bd197f4ac Mock版本完成 - UI冻结版本
完成内容:
- 5个完整的UI页面(登录、评分列表、评分详情、多场地列表、修改评分)
- 完整的Mock数据展示
- 完整的业务逻辑实现
- 文档体系建立(2000+行文档)

文档包含:
- 项目概述.md
- 页面功能说明.md
- API接口设计.md (17个接口)
- 数据结构设计.md (17个接口定义)
- 功能模块划分.md
- 后端实现对比报告.md
- 数据可行性分析报告.md (95分评估)
- 保护Mock版本的实施方案.md (4层保护机制)
- API对接完成度检查报告.md

此版本为Mock原型版本,所有UI功能完整,数据为硬编码Mock数据。
2025-12-11 13:22:19 +08:00

1103 lines
21 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 功能模块划分文档
## 文档说明
本文档按照功能模块对武术评分系统进行清晰的划分便于开发和维护。每个模块包含功能说明、涉及页面、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
<scroll-view class="venue-scroll" scroll-x="true">
<view
v-for="venue in venues"
:key="venue.id"
:class="['venue-tab', currentVenue === venue.id ? 'active' : '']"
@click="switchVenue(venue.id)"
>
{{ venue.name }}
</view>
</scroll-view>
```
**切换效果**:
- 当前场地高亮显示
- 底部绿色下划线
- 自动加载对应选手列表
### 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
<scroll-view class="project-scroll" scroll-x="true">
<view
v-for="(project, index) in projects"
:key="index"
:class="['project-btn', currentProject === index ? 'active' : '']"
@click="switchProject(index)"
>
{{ project }}
</view>
</scroll-view>
```
**切换效果**:
- 当前项目背景变绿
- 文字变白
- 自动加载对应选手列表
### 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
// 普通评委<E8AF84><E5A794><EFBFBD>
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.0013位小数
- 减分按钮(-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.0013位小数
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接口和数据结构。建议按照开发优先级进行分阶段开发确保核心功能先完成再逐步添加增强功能。