add acounts
This commit is contained in:
187
multidrive_box_prd.md
Normal file
187
multidrive_box_prd.md
Normal file
@@ -0,0 +1,187 @@
|
||||
# 🗃️ 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 模拟磁盘
|
||||
- 用户系统自动分配账号
|
||||
|
||||
Reference in New Issue
Block a user