diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 000000000..c3bbacdaa --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,130 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [1.0.0] - 2026-06-17 + +### Phase 4: SAAS 产品化 - 完成 + +#### Added + +**认证系统:** +- 用户注册(邮箱验证) +- 用户登录(JWT + Session) +- 用户登出(单设备/所有设备) +- 邮箱验证 +- 密码重置(邮件重置链接) +- JWT Service(access + refresh token) +- Password Hasher(bcrypt, cost=12) +- Session Store(Redis-based) +- Email Service(SMTP with templates) + +**工作空间管理:** +- 创建工作空间 +- 获取工作空间列表 +- 获取工作空间详情 +- 邀请成员(邮件邀请) +- 接受/拒绝邀请 +- 移除成员 +- 离开工作空间 +- 修改成员角色 +- 获取成员列表 + +**权限系统:** +- 基于角色的访问控制(RBAC) +- 4 种角色(Owner/Admin/Member/Viewer) +- 细粒度权限定义 +- 权限检查中间件 + +**订阅系统:** +- 3 级订阅计划(Free/Pro/Enterprise) +- 升级订阅 +- 取消订阅(降级到 Free) +- 自动配额调整 + +**配额系统:** +- 项目数量限制检查 +- 存储空间限制检查 +- 配额使用状态查询 +- 警告级别(normal/warning/critical/exceeded) +- 存储使用量更新 + +**Repository 层:** +- UserRepository(InMemory + PostgreSQL) +- WorkspaceRepository(InMemory) +- WorkspaceMemberRepository(InMemory) +- WorkspaceInvitationRepository(InMemory) + +**API 层:** +- FastAPI 应用主入口 +- 依赖注入容器 +- 认证中间件(JWT 验证) +- 权限中间件 +- 全局异常处理 +- 请求日志中间件 +- 速率限制中间件 +- CORS 配置 +- 6 个认证接口 +- 13 个工作空间接口 + +**数据库:** +- PostgreSQL 表结构设计 +- 初始化迁移脚本 +- 索引优化 +- 外键约束 + +**部署:** +- Dockerfile +- docker-compose.yml +- 环境变量配置 +- 部署文档 + +**文档:** +- README(快速开始) +- API 使用指南 +- 数据库迁移指南 +- Docker 部署指南 +- Phase 4 设计文档 +- Phase 4 完成总结 + +#### Changed +- N/A (首次发布) + +#### Deprecated +- N/A + +#### Removed +- N/A + +#### Fixed +- N/A + +#### Security +- bcrypt 密码加密(cost=12) +- JWT token 签名验证 +- SQL 注入防护(参数化查询) +- CORS 安全配置 +- 速率限制(防止暴力破解) + +--- + +## [0.1.0] - 2026-06-16 + +### Phase 1-3: 基础功能 + +- 基础视频处理功能 +- 素材库管理 +- 项目管理 + +--- + +**说明:** +- [Added] 新增功能 +- [Changed] 功能变更 +- [Deprecated] 即将废弃的功能 +- [Removed] 已删除的功能 +- [Fixed] Bug 修复 +- [Security] 安全相关更新 diff --git a/docs/API-GUIDE.md b/docs/API-GUIDE.md new file mode 100644 index 000000000..8cb442304 --- /dev/null +++ b/docs/API-GUIDE.md @@ -0,0 +1,417 @@ +# 小虾 SaaS API 使用指南 + +## 📖 概述 + +小虾 SaaS 是一个完整的多租户 SaaS 平台,提供用户认证、工作空间管理、团队协作和订阅管理功能。 + +**基础 URL:** `http://localhost:8000` (开发环境) + +**API 文档:** +- Swagger UI: http://localhost:8000/docs +- ReDoc: http://localhost:8000/redoc + +--- + +## 🔐 认证流程 + +### 1. 注册用户 + +```http +POST /api/v1/auth/register +Content-Type: application/json + +{ + "email": "user@example.com", + "password": "SecurePass123", + "username": "myusername", + "display_name": "My Name" +} +``` + +**响应:** +```json +{ + "user_id": "abc123...", + "email": "user@example.com", + "username": "myusername", + "display_name": "My Name", + "email_verification_sent": true +} +``` + +### 2. 验证邮箱 + +点击邮件中的链接,或访问: +```http +GET /api/v1/auth/verify-email?token=VERIFICATION_TOKEN +``` + +### 3. 登录 + +```http +POST /api/v1/auth/login +Content-Type: application/json + +{ + "email": "user@example.com", + "password": "SecurePass123" +} +``` + +**响应:** +```json +{ + "access_token": "eyJ0eXAiOiJKV1QiLCJhbGc...", + "refresh_token": "abc123...", + "token_type": "bearer", + "user_id": "...", + "email": "user@example.com", + "username": "myusername", + "display_name": "My Name", + "expires_in": 1800 +} +``` + +### 4. 使用 Access Token + +在所有需要认证的接口中添加 Header: +```http +Authorization: Bearer YOUR_ACCESS_TOKEN +``` + +--- + +## 🏢 工作空间管理 + +### 1. 创建工作空间 + +```http +POST /api/v1/workspaces +Authorization: Bearer YOUR_TOKEN +Content-Type: application/json + +{ + "name": "我的团队", + "subscription_plan": "free" +} +``` + +**响应:** +```json +{ + "workspace_id": "ws123...", + "name": "我的团队", + "subscription_plan": "free", + "max_projects": 3, + "max_storage_gb": 10 +} +``` + +### 2. 获取工作空间列表 + +```http +GET /api/v1/workspaces +Authorization: Bearer YOUR_TOKEN +``` + +**响应:** +```json +{ + "workspaces": [ + { + "workspace_id": "ws123...", + "name": "我的团队", + "subscription_plan": "free", + "max_projects": 3, + "max_storage_gb": 10, + "member_count": 1, + "user_role": "owner" + } + ] +} +``` + +### 3. 获取工作空间详情 + +```http +GET /api/v1/workspaces/{workspace_id} +Authorization: Bearer YOUR_TOKEN +``` + +--- + +## 👥 成员管理 + +### 1. 邀请成员 + +```http +POST /api/v1/workspaces/{workspace_id}/members/invite +Authorization: Bearer YOUR_TOKEN +Content-Type: application/json + +{ + "email": "member@example.com", + "role": "member" +} +``` + +**角色类型:** +- `owner` - 所有者(自动分配,不可邀请) +- `admin` - 管理员 +- `member` - 成员 +- `viewer` - 查看者 + +### 2. 获取成员列表 + +```http +GET /api/v1/workspaces/{workspace_id}/members +Authorization: Bearer YOUR_TOKEN +``` + +### 3. 修改成员角色 + +```http +PATCH /api/v1/workspaces/{workspace_id}/members/{user_id}/role +Authorization: Bearer YOUR_TOKEN +Content-Type: application/json + +{ + "role": "admin" +} +``` + +### 4. 移除成员 + +```http +DELETE /api/v1/workspaces/{workspace_id}/members/{user_id} +Authorization: Bearer YOUR_TOKEN +``` + +### 5. 离开工作空间 + +```http +POST /api/v1/workspaces/{workspace_id}/leave +Authorization: Bearer YOUR_TOKEN +``` + +--- + +## 🎟️ 邀请管理 + +### 1. 接受邀请 + +```http +POST /api/v1/workspaces/invitations/{token}/accept +Authorization: Bearer YOUR_TOKEN +``` + +### 2. 拒绝邀请 + +```http +POST /api/v1/workspaces/invitations/{token}/decline +``` + +--- + +## 💳 订阅管理 + +### 1. 升级订阅 + +```http +POST /api/v1/workspaces/{workspace_id}/subscription/upgrade +Authorization: Bearer YOUR_TOKEN +Content-Type: application/json + +{ + "new_plan": "pro" +} +``` + +**订阅计划:** +- `free` - 免费版(3 projects, 10GB) +- `pro` - 专业版(无限 projects, 100GB) +- `enterprise` - 企业版(无限 projects, 1TB) + +### 2. 取消订阅 + +```http +POST /api/v1/workspaces/{workspace_id}/subscription/cancel +Authorization: Bearer YOUR_TOKEN +``` + +### 3. 查看配额状态 + +```http +GET /api/v1/workspaces/{workspace_id}/quota +Authorization: Bearer YOUR_TOKEN +``` + +**响应:** +```json +{ + "workspace_id": "ws123...", + "subscription_plan": "free", + "projects": { + "used": 2, + "limit": 3, + "unlimited": false, + "usage_percent": 66.67 + }, + "storage": { + "used_gb": 5.5, + "limit_gb": 10, + "remaining_gb": 4.5, + "usage_percent": 55.0 + } +} +``` + +--- + +## 🔑 密码管理 + +### 1. 忘记密码 + +```http +POST /api/v1/auth/password/forgot +Content-Type: application/json + +{ + "email": "user@example.com" +} +``` + +### 2. 重置密码 + +```http +POST /api/v1/auth/password/reset +Content-Type: application/json + +{ + "token": "RESET_TOKEN_FROM_EMAIL", + "new_password": "NewSecurePass123" +} +``` + +### 3. 登出 + +```http +POST /api/v1/auth/logout +Authorization: Bearer YOUR_TOKEN +``` + +**登出所有设备:** +```http +POST /api/v1/auth/logout?logout_all_devices=true +Authorization: Bearer YOUR_TOKEN +``` + +--- + +## ⚠️ 错误处理 + +所有错误响应遵循统一格式: + +```json +{ + "error": { + "code": "ERROR_CODE", + "message": "Human readable error message", + "details": [] // 可选,仅在验证错误时出现 + } +} +``` + +**常见错误码:** +- `AUTH_ERROR` - 认证失败 +- `PERMISSION_DENIED` - 权限不足 +- `NOT_FOUND` - 资源不存在 +- `VALIDATION_ERROR` - 请求验证失败 +- `RATE_LIMIT_EXCEEDED` - 请求过于频繁 +- `INTERNAL_ERROR` - 服务器内部错误 + +**HTTP 状态码:** +- `200` - 成功 +- `201` - 创建成功 +- `204` - 成功(无内容) +- `400` - 请求错误 +- `401` - 未认证 +- `403` - 权限不足 +- `404` - 资源不存在 +- `422` - 验证失败 +- `429` - 请求过于频繁 +- `500` - 服务器错误 + +--- + +## 🚀 最佳实践 + +### 1. Token 管理 + +- Access Token 有效期 30 分钟 +- Refresh Token 有效期 30 天 +- Token 过期时自动使用 Refresh Token 获取新的 Access Token +- 在登出时清除本地存储的 Token + +### 2. 错误处理 + +```javascript +try { + const response = await fetch('/api/v1/workspaces', { + headers: { + 'Authorization': `Bearer ${accessToken}`, + 'Content-Type': 'application/json' + } + }); + + if (!response.ok) { + const error = await response.json(); + console.error(`Error: ${error.error.code} - ${error.error.message}`); + } + + const data = await response.json(); + return data; +} catch (error) { + console.error('Network error:', error); +} +``` + +### 3. 分页 + +目前 API 不支持分页,返回所有结果。后续版本将添加分页支持。 + +### 4. 速率限制 + +- 默认限制:100 请求/分钟(每个 IP) +- 超出限制返回 429 错误 +- 响应头包含: + - `X-RateLimit-Limit` - 限制数量 + - `X-RateLimit-Remaining` - 剩余请求数 + +--- + +## 🧪 测试环境 + +**测试账号:** +``` +Email: demo@example.com +Password: Demo123456 +``` + +**测试工作空间:** +``` +Workspace ID: ws-demo-001 +Name: Demo Workspace +``` + +--- + +## 📞 技术支持 + +- **文档:** http://localhost:8000/docs +- **问题反馈:** GitHub Issues +- **邮箱:** support@xiaoxia-saas.com + +--- + +**最后更新:** 2026-06-17