Administrator 13d9e2358a docs: 添加 API 文档和开发指南
- 添加完整的 API 接口文档 (docs/API.md)
  - 6 个主要接口的详细说明
  - 请求/响应示例
  - 错误码说明
  - 多语言使用示例

- 添加开发指南 (docs/DEVELOPMENT.md)
  - 项目技术栈说明
  - 目录结构详解
  - 模块化开发教程
  - 数据库设计说明
  - 扩展建议
2026-03-18 12:41:15 +08:00

463 lines
8.2 KiB
Markdown
Raw 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 文档
## 概述
运动会记分板系统提供完整的 RESTful API 接口,支持比赛项目管理、队伍管理、成绩录入和积分统计等功能。
**Base URL**: `http://localhost:3000`
---
## 通用响应格式
### 成功响应
```json
{
"success": true,
"data": { ... }
}
```
### 错误响应
```json
{
"success": false,
"message": "错误信息"
}
```
---
## 接口列表
### 1. 配置接口
#### 获取系统配置
获取系统预置的配置信息,包括比赛类别、组别和项目类型。
| 项目 | 说明 |
|------|------|
| **URL** | `/api/config` |
| **方法** | `GET` |
| **认证** | 无 |
**请求示例**
```bash
curl -X GET http://localhost:3000/api/config
```
**响应示例**
```json
{
"success": true,
"data": {
"categories": [
{ "value": "田赛", "label": "田赛" },
{ "value": "径赛", "label": "径赛" },
{ "value": "团体赛", "label": "团体赛" }
],
"groups": [
{ "value": "教师组", "label": "教师组" },
{ "value": "航空班组", "label": "航空班组" },
{ "value": "体育班组", "label": "体育班组" },
{ "value": "文化班甲组", "label": "文化班甲组" },
{ "value": "文化班乙组", "label": "文化班乙组" }
],
"eventTypes": {
"田赛": [
{ "name": "跳高", "unit": "米" },
{ "name": "跳远", "unit": "米" },
{ "name": "掷铅球", "unit": "米" }
],
"径赛": [
{ "name": "100m", "unit": "秒" },
{ "name": "200m", "unit": "秒" },
{ "name": "400m", "unit": "秒" },
{ "name": "4×100m", "unit": "秒" },
{ "name": "4×400m", "unit": "秒" },
{ "name": "20×50m", "unit": "秒" }
],
"团体赛": [
{ "name": "旱地龙舟", "unit": "秒" },
{ "name": "跳长绳", "unit": "次" },
{ "name": "折返跑", "unit": "秒" }
]
}
}
}
```
---
### 2. 比赛项目接口
#### 获取比赛项目列表
| 项目 | 说明 |
|------|------|
| **URL** | `/api/events` |
| **方法** | `GET` |
| **认证** | 无 |
**查询参数**
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `category` | string | 否 | 比赛类别(田赛/径赛/团体赛) |
| `group` | string | 否 | 组别 |
**请求示例**
```bash
# 获取所有项目
curl -X GET http://localhost:3000/api/events
# 按类别筛选
curl -X GET "http://localhost:3000/api/events?category=田赛"
# 按组别筛选
curl -X GET "http://localhost:3000/api/events?group=文化班甲组"
```
**响应示例**
```json
{
"success": true,
"data": [
{
"id": 1,
"name": "跳高",
"category": "田赛",
"event_group": "文化班甲组",
"unit": "米",
"status": "pending",
"created_at": "2026-03-17T10:00:00.000Z"
}
]
}
```
#### 创建比赛项目
| 项目 | 说明 |
|------|------|
| **URL** | `/api/events` |
| **方法** | `POST` |
| **认证** | 无 |
**请求体**
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `name` | string | 是 | 项目名称 |
| `category` | string | 是 | 比赛类别 |
| `event_group` | string | 是 | 组别 |
| `unit` | string | 是 | 单位(米/秒/次) |
**请求示例**
```bash
curl -X POST http://localhost:3000/api/events \
-H "Content-Type: application/json" \
-d '{
"name": "跳高",
"category": "田赛",
"event_group": "文化班甲组",
"unit": "米"
}'
```
---
### 3. 队伍管理接口
#### 获取队伍列表
| 项目 | 说明 |
|------|------|
| **URL** | `/api/teams` |
| **方法** | `GET` |
| **认证** | 无 |
**查询参数**
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `group` | string | 否 | 组别 |
**请求示例**
```bash
curl -X GET "http://localhost:3000/api/teams?group=文化班甲组"
```
**响应示例**
```json
{
"success": true,
"data": [
{
"id": 1,
"name": "高一1班",
"team_group": "文化班甲组",
"created_at": "2026-03-17T10:00:00.000Z"
}
]
}
```
#### 创建队伍
| 项目 | 说明 |
|------|------|
| **URL** | `/api/teams` |
| **方法** | `POST` |
| **认证** | 无 |
**请求体**
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `name` | string | 是 | 队伍名称 |
| `team_group` | string | 是 | 组别 |
**请求示例**
```bash
curl -X POST http://localhost:3000/api/teams \
-H "Content-Type: application/json" \
-d '{
"name": "高一1班",
"team_group": "文化班甲组"
}'
```
---
### 4. 成绩管理接口
#### 获取成绩列表
| 项目 | 说明 |
|------|------|
| **URL** | `/api/results` |
| **方法** | `GET` |
| **认证** | 无 |
**查询参数**
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `event_id` | number | 否 | 比赛项目ID |
| `team_id` | number | 否 | 队伍ID |
**请求示例**
```bash
# 获取所有成绩
curl -X GET http://localhost:3000/api/results
# 按项目筛选
curl -X GET "http://localhost:3000/api/results?event_id=1"
```
**响应示例**
```json
{
"success": true,
"data": [
{
"id": 1,
"event_id": 1,
"team_id": 1,
"score": "2.10",
"rank": 1,
"event_name": "跳高",
"category": "田赛",
"unit": "米",
"team_name": "高一1班",
"team_group": "文化班甲组",
"created_at": "2026-03-17T10:00:00.000Z"
}
]
}
```
#### 录入成绩
| 项目 | 说明 |
|------|------|
| **URL** | `/api/results` |
| **方法** | `POST` |
| **认证** | 无 |
**请求体**
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `event_id` | number | 是 | 比赛项目ID |
| `team_id` | number | 是 | 队伍ID |
| `score` | string | 是 | 成绩 |
| `rank` | number | 否 | 名次1-3自动计分 |
**积分规则**
| 名次 | 积分 | 奖牌 |
|------|------|------|
| 第1名 | 7分 | 金牌 |
| 第2名 | 5分 | 银牌 |
| 第3名 | 3分 | 铜牌 |
**请求示例**
```bash
curl -X POST http://localhost:3000/api/results \
-H "Content-Type: application/json" \
-d '{
"event_id": 1,
"team_id": 1,
"score": "2.10",
"rank": 1
}'
```
---
### 5. 记分板接口
#### 获取记分板数据
获取所有队伍的总分、金牌、银牌、铜牌统计。
| 项目 | 说明 |
|------|------|
| **URL** | `/api/scoreboard` |
| **方法** | `GET` |
| **认证** | 无 |
**查询参数**
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `group` | string | 否 | 组别筛选 |
**请求示例**
```bash
curl -X GET http://localhost:3000/api/scoreboard
```
**响应示例**
```json
{
"success": true,
"data": [
{
"id": 1,
"name": "高一1班",
"team_group": "文化班甲组",
"total_score": 25,
"gold_count": 3,
"silver_count": 1,
"bronze_count": 2
}
]
}
```
---
### 6. 数据初始化接口
#### 初始化示例数据
创建示例队伍和比赛项目数据(仅在首次使用时调用)。
| 项目 | 说明 |
|------|------|
| **URL** | `/api/seed` |
| **方法** | `POST` |
| **认证** | 无 |
**请求示例**
```bash
curl -X POST http://localhost:3000/api/seed
```
**响应示例**
```json
{
"success": true,
"message": "初始化数据成功",
"data": {
"teams": 9,
"events": 9
}
}
```
---
## 错误码说明
| 错误码 | 说明 |
|--------|------|
| 400 | 请求参数错误 |
| 404 | 资源不存在 |
| 500 | 服务器内部错误 |
---
## 使用示例
### JavaScript/TypeScript
```typescript
// 使用 fetch
const events = await fetch('/api/events').then(r => r.json())
// 使用 $fetch (Nuxt)
const { data } = await useFetch('/api/events')
```
### Python
```python
import requests
# 获取比赛项目
response = requests.get('http://localhost:3000/api/events')
events = response.json()
# 录入成绩
requests.post('http://localhost:3000/api/results', json={
'event_id': 1,
'team_id': 1,
'score': '10.5',
'rank': 1
})
```
### cURL
```bash
# 获取记分板
curl http://localhost:3000/api/scoreboard
# 创建队伍
curl -X POST http://localhost:3000/api/teams \
-H "Content-Type: application/json" \
-d '{"name": "测试队伍", "team_group": "教师组"}'
```