# 技术侧 API 设计

## 目标

本文档定义产品化阶段建议新增或调整的 API，覆盖：

- 认证与安全
- 文件与阅读
- TTS 生成
- 配额与用量
- 异步任务
- 管理员后台

设计原则：

- 尽量兼容现有接口
- REST 风格优先
- 返回结构统一
- 为前台页面和后台管理预留字段

## 1. 通用返回结构

成功：

```json
{
  "success": true,
  "data": {}
}
```

失败：

```json
{
  "success": false,
  "error": {
    "code": "quota_exceeded",
    "message": "今日配额已用尽"
  }
}
```

## 2. 认证与安全

## 2.1 注册

`POST /api/auth/register`

请求体：

```json
{
  "username": "demo_user",
  "password": "strong_password",
  "email": "demo@example.com"
}
```

返回：

```json
{
  "success": true,
  "data": {
    "user_id": 1001
  }
}
```

## 2.2 登录

`POST /api/auth/login`

请求体：

```json
{
  "username": "demo_user",
  "password": "strong_password",
  "remember_me": true
}
```

返回：

```json
{
  "success": true,
  "data": {
    "username": "demo_user",
    "is_admin": false,
    "plan_code": "free"
  }
}
```

## 2.3 登出

`POST /api/auth/logout`

## 2.4 当前用户

`GET /api/auth/me`

返回：

```json
{
  "success": true,
  "data": {
    "id": 1001,
    "username": "demo_user",
    "is_admin": false,
    "is_active": true,
    "plan": {
      "code": "free",
      "name": "免费版"
    }
  }
}
```

## 2.5 修改密码

`POST /api/auth/change-password`

请求体：

```json
{
  "old_password": "oldpass",
  "new_password": "newpass"
}
```

## 3. 文件与阅读

## 3.1 上传 PDF

`POST /api/files/upload`

表单：

- `file`

返回：

```json
{
  "success": true,
  "data": {
    "file_id": 2001,
    "file_name": "sample.pdf",
    "file_url": "/static/files/demo_user/sample.pdf"
  }
}
```

限制建议：

- 文件大小限制
- 仅允许 PDF
- 每用户文件数量上限

## 3.2 文件列表

`GET /api/files`

返回：

```json
{
  "success": true,
  "data": {
    "items": [
      {
        "file_id": 2001,
        "file_name": "sample.pdf",
        "file_url": "/static/files/demo_user/sample.pdf",
        "updated_at": "2026-04-30 12:00:00"
      }
    ]
  }
}
```

## 3.3 删除文件

`DELETE /api/files/{file_id}`

## 3.4 保存阅读进度

`POST /api/reader/progress`

请求体：

```json
{
  "file_path": "/static/files/demo_user/sample.pdf",
  "page": 12
}
```

## 3.5 获取阅读进度

`GET /api/reader/progress?file_path=...`

## 4. TTS 生成

## 4.1 短文本同步生成

`POST /api/tts/generate`

适合：

- 单句
- 短段落

请求体：

```json
{
  "text": "This is a test sentence.",
  "voice": "af_sky",
  "speed": 1.0,
  "file_path": "/static/files/demo_user/sample.pdf",
  "page": 12,
  "sentence_index": 4
}
```

返回头建议：

- `X-Cache-Hit: 1/0`
- `X-Request-Id: xxx`

返回体：

- 直接 `audio/wav`

## 4.2 长文本异步生成

`POST /api/tts/tasks`

请求体：

```json
{
  "text": "very long content ...",
  "voice": "af_sky",
  "speed": 1.0,
  "file_path": "/static/files/demo_user/sample.pdf",
  "page": 12
}
```

返回：

```json
{
  "success": true,
  "data": {
    "task_id": "task_123456",
    "status": "queued"
  }
}
```

## 4.3 查询任务状态

`GET /api/tts/tasks/{task_id}`

返回：

```json
{
  "success": true,
  "data": {
    "task_id": "task_123456",
    "status": "processing",
    "progress": 60,
    "audio_url": null
  }
}
```

## 4.4 获取任务结果

`GET /api/tts/tasks/{task_id}/result`

返回：

- 音频流
- 或音频下载地址

## 4.5 用户当前配额

`GET /api/tts/quota`

返回：

```json
{
  "success": true,
  "data": {
    "plan_code": "free",
    "daily_tts_chars_used": 5200,
    "daily_tts_chars_limit": 10000,
    "monthly_tts_chars_used": 23000,
    "monthly_tts_chars_limit": 100000
  }
}
```

## 5. 用量与统计

## 5.1 我的使用情况

`GET /api/me/usage/summary`

返回：

```json
{
  "success": true,
  "data": {
    "today_requests": 21,
    "today_chars": 5200,
    "today_audio_seconds": 910,
    "month_requests": 210,
    "month_chars": 23000
  }
}
```

## 5.2 我的套餐

`GET /api/me/plan`

## 6. 管理员后台 API

## 6.1 仪表盘统计

`GET /api/admin/dashboard`

返回：

```json
{
  "success": true,
  "data": {
    "today_active_users": 18,
    "today_tts_requests": 540,
    "today_cache_hit_rate": 0.63,
    "running_tasks": 3,
    "failed_tasks_today": 6
  }
}
```

## 6.2 用户列表

`GET /api/admin/users?page=1&page_size=20&keyword=demo`

## 6.3 用户详情

`GET /api/admin/users/{user_id}`

返回建议包含：

- 基本信息
- 当前套餐
- 今日/月度用量
- 最近任务

## 6.4 创建或编辑用户

`POST /api/admin/users`

## 6.5 禁用/启用用户

`POST /api/admin/users/{user_id}/status`

请求体：

```json
{
  "is_active": false
}
```

## 6.6 重置密码

`POST /api/admin/users/{user_id}/reset-password`

## 6.7 套餐列表

`GET /api/admin/plans`

## 6.8 创建或更新套餐

`POST /api/admin/plans`

请求体：

```json
{
  "code": "pro_monthly",
  "name": "专业版月付",
  "daily_tts_chars": 50000,
  "monthly_tts_chars": 500000,
  "daily_tts_requests": 200,
  "max_text_length": 3000,
  "max_parallel_tasks": 2,
  "price_month": 29.00
}
```

## 6.9 分配用户套餐

`POST /api/admin/users/{user_id}/plan`

请求体：

```json
{
  "plan_code": "pro_monthly",
  "start_at": "2026-05-01 00:00:00",
  "end_at": "2026-06-01 00:00:00"
}
```

## 6.10 TTS 日志列表

`GET /api/admin/tts-logs?page=1&page_size=20&status=failed&user_id=1001`

## 6.11 异步任务列表

`GET /api/admin/tasks?page=1&page_size=20&status=processing`

## 6.12 重试任务

`POST /api/admin/tasks/{task_id}/retry`

## 6.13 缓存概览

`GET /api/admin/cache/summary`

返回建议：

- 缓存文件数
- 总体积
- 命中率
- 最近热点项

## 6.14 清理缓存

`POST /api/admin/cache/cleanup`

请求体：

```json
{
  "mode": "expired_only"
}
```

可选值：

- `expired_only`
- `least_recently_used`
- `all`

## 7. 监控与健康检查

## 7.1 健康检查

`GET /api/health`

返回：

```json
{
  "success": true,
  "data": {
    "app": "ok",
    "db": "ok",
    "tts_upstream": "ok",
    "redis": "ok"
  }
}
```

## 7.2 系统指标摘要

`GET /api/admin/system/metrics`

返回建议：

- CPU
- 内存
- 磁盘
- 队列长度
- 错误率

## 8. 接口中间件建议

### 统一中间件建议做这些事

- 生成 `request_id`
- 记录访问日志
- 计算耗时
- 捕获异常
- 注入当前用户信息

### 对关键接口加的通用逻辑

- 认证校验
- 配额校验
- 限流校验
- 缓存命中判断
- 日志落库

## 9. API 实施优先级

### 第一批必须上线

- `/api/auth/*`
- `/api/files/*`
- `/api/reader/progress`
- `/api/tts/generate`
- `/api/tts/quota`
- `/api/me/usage/summary`
- `/api/health`

### 第二批建议上线

- `/api/tts/tasks`
- `/api/tts/tasks/{task_id}`
- `/api/admin/dashboard`
- `/api/admin/tts-logs`
- `/api/admin/users/{user_id}/plan`

### 第三批按商业需要上线

- 套餐管理
- 缓存清理
- 任务重试
- 系统指标页

## 总结

API 设计的目标不是一次做大，而是先把“认证、文件、TTS、配额、后台”这五条主链路跑通。第一批接口上线后，你就已经具备一个可运营的基础版 SaaS 雏形。
