188 lines
4.4 KiB
Markdown
188 lines
4.4 KiB
Markdown
# 🗃️ MultiDrive Box PRD (Product Requirements Document)
|
||
|
||
## 🔐 一、产品概述
|
||
|
||
**MultiDrive Box** 是一个前后端一体的系统,用于将多个 Google Drive 账号的免费空间联合成一个统一存储池,支持大文件智能分片上传、多账号分布存储、联合下载以及可共享访问。
|
||
|
||
用户只需上传文件,系统会自动完成压缩、分割、分发与元数据管理。下载者通过一个链接即可还原原始文件,无需了解后台逻辑。
|
||
|
||
---
|
||
|
||
## 🌟 二、核心功能需求
|
||
|
||
### 用户角度
|
||
|
||
#### 文件上传
|
||
|
||
- 登录并绑定多个 Google Drive 账号
|
||
- 拖拽或选择一个大文件上传
|
||
- 系统自动压缩(可选)、分片、上传到各账号
|
||
- 显示上传进度
|
||
- 上传成功后生成唯一分享链接
|
||
|
||
#### 文件下载
|
||
|
||
- 打开分享链接,显示文件名称、大小、分片信息
|
||
- 点击下载,系统联合各账号下载分片并合并
|
||
- 下载后校验文件整体性
|
||
|
||
#### 账号管理
|
||
|
||
- 添加/移除 Google 账号
|
||
- 查看每个账号剩余空间
|
||
- 查看每个账号中存在的文件分片
|
||
|
||
---
|
||
|
||
## 🛠️ 三、系统架构设计
|
||
|
||
```
|
||
用户浏览器
|
||
↕️ (HTTP)
|
||
Reflex 前端 (Web)
|
||
↕️
|
||
FastAPI 后端 (REST API)
|
||
↕️
|
||
SQLite 数据库 + Google Drive API
|
||
```
|
||
|
||
---
|
||
|
||
## ⚙️ 四、技术标准
|
||
|
||
| 组件 | 技术选型 |
|
||
| ---------------- | ------------------------------------- |
|
||
| 后端框架 | FastAPI |
|
||
| 数据库 | SQLite3 |
|
||
| 文件分片 | Python: shutil, os, hashlib, tempfile |
|
||
| Google Drive API | google-api-python-client |
|
||
| 前端框架 | Reflex (Python Web UI) |
|
||
| 授权管理 | Google OAuth2 |
|
||
| 部署 | Docker / 本地部署 / Cloudflare Tunnel |
|
||
|
||
---
|
||
|
||
## 📊 五、数据库设计 (SQLite)
|
||
|
||
### 1. users
|
||
|
||
```sql
|
||
id INTEGER PRIMARY KEY
|
||
email TEXT
|
||
created_at DATETIME
|
||
```
|
||
|
||
### 2. accounts
|
||
|
||
```sql
|
||
id INTEGER PRIMARY KEY
|
||
user_id INTEGER
|
||
google_email TEXT
|
||
access_token TEXT
|
||
refresh_token TEXT
|
||
token_expiry DATETIME
|
||
drive_space_total INTEGER
|
||
drive_space_used INTEGER
|
||
drive_space_reserved INTEGER DEFAULT 1073741824 -- 1GB 预留
|
||
```
|
||
|
||
### 3. files
|
||
|
||
```sql
|
||
id INTEGER PRIMARY KEY
|
||
user_id INTEGER
|
||
filename TEXT
|
||
original_size INTEGER
|
||
sha256 TEXT
|
||
upload_time DATETIME
|
||
download_token TEXT UNIQUE
|
||
```
|
||
|
||
### 4. file\_parts
|
||
|
||
```sql
|
||
id INTEGER PRIMARY KEY
|
||
file_id INTEGER
|
||
part_index INTEGER
|
||
size INTEGER
|
||
account_id INTEGER
|
||
drive_file_id TEXT
|
||
sha256 TEXT
|
||
```
|
||
|
||
---
|
||
|
||
## 🔐 六、API 设计 (FastAPI)
|
||
|
||
| Method | Endpoint | 描述 |
|
||
| ------ | -------------------------- | -------------------- |
|
||
| GET | /api/storage-status | 获取所有账号剩余空间 |
|
||
| POST | /api/upload-file | 文件上传与分片 |
|
||
| GET | /api/file/{token} | 获取分享文件元数据 |
|
||
| GET | /api/file/{token}/download | 联合下载文件 |
|
||
| POST | /api/add-account | 添加 Google 账号 (OAuth) |
|
||
| POST | /api/remove-account | 移除账号 |
|
||
|
||
---
|
||
|
||
## 🖼️ 七、Reflex 前端页面设计
|
||
|
||
### 1. 登录与账号管理
|
||
|
||
- 显示已绑定账号和空间
|
||
- 添加账号(Google OAuth2)
|
||
- 支持移除
|
||
|
||
### 2. 文件上传
|
||
|
||
- 拖拽上传区域
|
||
- 上传进度条
|
||
- 成功后显示分享链接
|
||
|
||
### 3. 分享页面
|
||
|
||
- 显示文件名、大小、分片数
|
||
- 点击下载合并文件
|
||
|
||
---
|
||
|
||
## 🧐 八、上传策略
|
||
|
||
### 分片规则
|
||
|
||
1. 获取所有账号剩余空间(-预留1GB)
|
||
2. 按空间比例分片
|
||
3. 使用 Python tempfile 创建分片文件
|
||
4. 分别上传到 Google Drive (MultidriveBox/ 文件夹)
|
||
5. 记录分片 ID 和元数据
|
||
|
||
---
|
||
|
||
## 📁 九、下载策略
|
||
|
||
1. 通过分享链接加载分片元数据
|
||
2. 使用 access token 输出文件分片
|
||
3. 合并成完整文件
|
||
4. 下载前校验 SHA256
|
||
|
||
---
|
||
|
||
## 🦜 十、測試用例
|
||
|
||
- 上传 <14GB 文件,仅使用一个账号
|
||
- 上传 14.5GB 大文件,分片上传到多账号
|
||
- 没有剩余空间的规避策略
|
||
- 分享链接是否可用,不同浏览器是否适配
|
||
- 下载合并文件是否完整
|
||
- 删除账号后,文件是否仍可下载
|
||
|
||
---
|
||
|
||
## 🚀 十一、后续功能设想
|
||
|
||
- 多云支持(Dropbox, OneDrive)
|
||
- 分片加密 / 下载解密
|
||
- WebDAV 模拟磁盘
|
||
- 用户系统自动分配账号
|
||
|