feat: 添加完整的项目设计文档,替换旧的原型需求文档

This commit is contained in:
史悦
2025-09-11 15:13:38 +08:00
parent e922bacfb8
commit b8d081bd8a
10 changed files with 4755 additions and 155 deletions

View File

@@ -0,0 +1,268 @@
# API接口设计详设文档
> **文档版本**: v1.0
> **撰写人**: 后端架构师
> **创建日期**: 2024年9月11日
## 1. 设计原则与规范
- **RESTful风格**: API遵循RESTful设计原则使用标准的HTTP方法 (`GET`, `POST`, `PUT`, `DELETE`)。
- **JSON格式**: 所有请求体和响应体均使用`application/json`格式。
- **URL版本控制**: API版本通过URL前缀进行管理例如 `/api/v1/...`
- **身份认证**: 所有需要认证的接口都通过`Authorization: Bearer <JWT>`头进行身份验证。
- **统一响应格式**: 所有API响应都遵循统一的数据结构便于客户端处理。
- **错误处理**: 使用标准的HTTP状态码表示请求结果并在响应体中提供详细的错误信息。
## 2. 统一响应格式
### 2.1 成功响应 (`2xx`)
```json
{
"success": true,
"code": 200,
"message": "操作成功",
"data": {
"key1": "value1",
"key2": "value2"
}
}
```
### 2.2 失败响应 (`4xx`, `5xx`)
```json
{
"success": false,
"code": 401,
"message": "身份认证失败",
"error": {
"type": "AuthenticationError",
"details": "JWT token is invalid or expired."
}
}
```
## 3. API接口详解
### 3.1 用户认证模块 (`/api/v1/auth`)
#### 3.1.1 `POST /auth/login`
- **功能**: 微信小程序登录。客户端使用`wx.login()`获取`code`后调用此接口。
- **请求体**:
```json
{
"code": "wx-login-code-from-miniprogram"
}
```
- **成功响应 (`200 OK`)**:
- **描述**: 返回JWT和新/老用户信息。
- **响应体**:
```json
{
"success": true,
"code": 200,
"message": "登录成功",
"data": {
"token": "jwt.string.here",
"isNewUser": false,
"user": {
"id": "user-openid",
"nickname": "张三",
"avatarUrl": "url-to-avatar"
}
}
}
```
- **失败响应**:
- `400 Bad Request`: `code`无效或缺失。
- `500 Internal Server Error`: 微信服务器接口调用失败。
#### 3.1.2 `PUT /auth/profile`
- **功能**: 更新用户信息(昵称、头像)。
- **认证**: 需要JWT。
- **请求体**:
```json
{
"nickname": "新的昵称",
"avatarUrl": "新的头像URL"
}
```
- **成功响应 (`200 OK`)**:
- **描述**: 返回更新后的用户信息。
- **响应体**:
```json
{
"success": true,
"code": 200,
"message": "用户信息更新成功",
"data": {
"id": "user-openid",
"nickname": "新的昵称",
"avatarUrl": "新的头像URL"
// ...
}
}
```
### 3.2 用户信息模块 (`/api/v1/users`)
#### 3.2.1 `GET /users/me`
- **功能**: 获取当前登录用户的详细信息。
- **认证**: 需要JWT。
- **成功响应 (`200 OK`)**:
- **描述**: 返回包含统计数据的完整用户信息。
- **响应体**:
```json
{
"success": true,
"code": 200,
"message": "获取成功",
"data": {
"id": "user-openid",
"nickname": "张三",
"avatarUrl": "url-to-avatar",
"stats": {
"gamesPlayed": 100,
"gamesWon": 60,
"winRate": 60.0,
"eloRating": 1350
},
"createdAt": "2024-09-10T..."
}
}
```
#### 3.2.2 `GET /users/:id`
- **功能**: 获取指定ID用户的公开信息。
- **认证**: 可选。
- **成功响应 (`200 OK`)**:
- **描述**: 返回用户的公开信息(不含敏感数据)。
- **响应体**:
```json
{
"success": true,
"code": 200,
"message": "获取成功",
"data": {
"id": "other-user-id",
"nickname": "李四",
"avatarUrl": "url-to-avatar",
"stats": {
"gamesPlayed": 120,
"winRate": 55.0,
"eloRating": 1300
}
}
}
```
- **失败响应**:
- `404 Not Found`: 用户不存在。
### 3.3 游戏模块 (`/api/v1/games`)
#### 3.3.1 `GET /games/history`
- **功能**: 获取当前用户的历史对局列表(分页)。
- **认证**: 需要JWT。
- **查询参数**:
- `page` (number, default: 1): 页码。
- `limit` (number, default: 10): 每页数量。
- **成功响应 (`200 OK`)**:
- **描述**: 返回分页的游戏历史记录。
- **响应体**:
```json
{
"success": true,
"code": 200,
"message": "获取成功",
"data": {
"games": [
{
"gameId": "game-id-1",
"opponent": { "id": "user-id-2", "nickname": "李四" },
"result": "win", // "win" | "loss"
"finishedAt": "2024-09-11T...",
"duration": 600 // 秒
}
],
"pagination": {
"currentPage": 1,
"totalPages": 10,
"totalGames": 100
}
}
}
```
#### 3.3.2 `GET /games/:id`
- **功能**: 获取指定游戏对局的详细信息(用于复盘)。
- **认证**: 需要JWT且用户必须是该对局的参与者。
- **成功响应 (`200 OK`)**:
- **描述**: 返回完整的游戏会话数据。
- **响应体**: (完整的 `GameSession` 对象)
- **失败响应**:
- `403 Forbidden`: 无权访问该对局。
- `404 Not Found`: 游戏不存在。
### 3.4 排行榜模块 (`/api/v1/leaderboard`)
#### 3.4.1 `GET /leaderboard`
- **功能**: 获取Elo积分排行榜。
- **认证**: 可选。
- **查询参数**:
- `limit` (number, default: 100): 返回的条目数。
- **成功响应 (`200 OK`)**:
- **描述**: 返回排名列表。
- **响应体**:
```json
{
"success": true,
"code": 200,
"message": "获取成功",
"data": {
"ranking": [
{
"rank": 1,
"user": { "id": "user-id-1", "nickname": "高手" },
"eloRating": 2000
},
{
"rank": 2,
"user": { "id": "user-id-2", "nickname": "大师" },
"eloRating": 1950
}
],
"lastUpdatedAt": "2024-09-11T..."
}
}
```
## 4. WebSocket API
WebSocket通信不属于RESTful API但其认证和初始状态获取与HTTP API紧密相关。
- **连接地址**: `wss://your-domain.com/ws`
- **认证流程**:
1. 客户端通过`POST /api/v1/auth/login`获取JWT。
2. 建立WebSocket连接。
3. 连接成功后,发送第一条消息进行认证。
- **认证消息**:
```json
{
"type": "AUTHENTICATE",
"payload": {
"token": "jwt.string.here"
}
}
```
- **认证成功响应**:
```json
{
"type": "AUTHENTICATED",
"payload": {
"userId": "user-id",
// ...
}
}
```
- **后续通信**: 详见《实时通信模块详设文档》。