Files

342 lines
13 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 阿里云 VOD 媒体资源管理器 - 产品需求文档 (PRD)
> 版本:v1.0
> 状态:草稿 / 待评审
> 目标:构建一个轻量、开源、可自托管的阿里云视频点播(VOD)媒体资源管理后台,解决官方控制台操作繁琐、批量处理能力弱的问题。
---
## 1. 项目概述
### 1.1 背景
阿里云视频点播(VOD)官方管理控制台功能全面,但在以下场景中存在明显痛点:
- **查看视频麻烦**:控制台层级深、加载慢、筛选和搜索体验一般。
- **批量下载困难**:无法一次性选中多个视频并批量获取下载地址。
- **删除操作繁琐**:批量删除步骤多,确认链路过长。
- **权限过重**:需要将阿里云账号或复杂 RAM 权限交给所有操作人员。
- **成本不透明**:难以快速统计某个分类/标签下的视频数量、存储时长、转码状态等。
### 1.2 产品定位
一个**面向开发者和内容运营人员的轻量 VOD 管理后台**,支持:
- 快速查看、搜索、筛选媒体库。
- 批量获取播放/下载地址。
- 批量删除、批量修改分类/标签/标题。
- 多账号配置切换(支持多个阿里云 VOD 账号/Region)。
- 简单自托管部署(Docker / 二进制 / 源码)。
### 1.3 目标用户
- 使用阿里云 VOD 存储大量视频的内容团队。
- 需要将 VOD 管理能力集成到内部工作流的开发者。
- 希望拥有可定制、可私有部署的媒体管理工具的开源社区用户。
### 1.4 开源声明
本项目以 **MIT License** 开源,代码托管于 GitHub,欢迎 Issue / PR / Fork。设计上避免引入商业依赖,保证社区可长期免费使用与二次开发。
---
## 2. 功能需求
### 2.1 核心功能
| 功能模块 | 功能说明 | 优先级 |
| --- | --- | --- |
| 视频列表 | 分页展示 VOD 媒体库,支持按标题、ID、分类、标签、状态、时间筛选 | P0 |
| 视频详情 | 查看单个视频的元信息(ID、标题、描述、时长、大小、创建时间、转码状态、封面、播放 URL 等) | P0 |
| 批量下载 | 勾选多个视频,批量获取原片或指定清晰度播放地址,导出为 CSV / 直接触发浏览器下载 | P0 |
| 批量删除 | 勾选多个视频,二次确认后批量删除(支持逻辑删除/物理删除配置) | P0 |
| 批量编辑 | 批量修改标题前缀、分类、标签 | P1 |
| 账号管理 | 配置多个阿里云 AccessKey / Region / 存储区域,支持切换 | P0 |
| 权限控制 | 内置简单登录与只读/读写角色(可选) | P1 |
| 操作日志 | 记录谁在什么时间做了下载/删除/编辑操作 | P1 |
### 2.2 视频列表字段
默认展示字段:
- 视频 IDVideoId
- 标题(Title
- 分类(CateId / CateName
- 标签(Tags
- 时长(Duration
- 文件大小(Size
- 创建时间(CreationTime
- 状态(Status:上传中 / 转码中 / 正常 / 审核中 / 屏蔽)
- 转码状态(TranscodeStatus
- 缩略图(CoverURL
### 2.3 筛选与搜索
- 关键词搜索:标题、VideoId。
- 分类筛选:下拉选择 VOD 分类树。
- 标签筛选:输入标签,支持多选。
- 时间范围:创建时间、更新时间。
- 状态筛选:上传状态、转码状态。
- 文件大小、时长范围筛选(P2)。
### 2.4 批量下载
- 支持选择:原片 / 指定清晰度(如 LD/SD/HD/FHD/4K)。
- 输出方式:
- 生成临时下载地址列表,导出 CSV(含 VideoId、标题、URL、过期时间)。
- 对浏览器可直接访问的资源,触发浏览器多文件下载(受浏览器策略限制)。
- 支持设置 URL 过期时间(默认 2 小时,最大 24 小时)。
- 下载任务队列,避免一次性请求过多导致限流。
### 2.5 批量删除
- 选中视频后弹出确认框,列出待删除的视频标题与 ID。
- 支持“仅删除媒资信息(逻辑删除)”或“彻底删除(包括存储文件)”。
- 删除前二次确认,防止误操作。
### 2.6 账号与 Region 管理
- 添加账号:AccessKey ID、AccessKey Secret、Region(如 cn-shanghai)、存储区域。
- 支持同时保存多个账号,通过下拉切换。
- 敏感信息(AccessKey Secret)在本地配置中加密存储或仅保留在服务端环境变量中。
---
## 3. 非功能需求
### 3.1 性能
- 视频列表首屏加载 < 2s(1000 条以内)。
- 批量操作(下载/删除/编辑)单次最多支持 100 条,超过时分批处理并展示进度。
- 支持阿里云 VOD API 分页与限流自动重试。
### 3.2 安全
- AccessKey 不暴露给前端,所有阿里云 API 调用由后端代理完成。
- 支持通过环境变量注入 AccessKey,避免写入代码或前端配置。
- 内置登录态(JWT),可配置只读账号与管理员账号。
- 支持 HTTPS 部署(通过反向代理)。
### 3.3 易用性
- 单 Docker 镜像即可运行,5 分钟内完成部署。
- 提供开箱即用的 Docker Compose 配置。
- 前端响应式,支持桌面端与平板。
- 中文/英文界面(i18nP1)。
### 3.4 可维护性
- 前后端分离,代码结构清晰。
- 统一 REST API 规范。
- 完善的类型定义(TypeScript)。
- 单元测试覆盖核心 API 调用与工具函数。
---
## 4. 技术栈
采用**前后端分离**架构,整体追求轻量、现代、易部署。
### 4.1 前端
| 技术 | 版本/选型 | 说明 |
| --- | --- | --- |
| 框架 | **React 18** | 组件化、生态成熟、社区广泛 |
| 语言 | **TypeScript 5** | 类型安全,降低维护成本 |
| 构建工具 | **Vite 5** | 极速冷启动与 HMR |
| UI 组件库 | **Ant Design 5** | 完善的中后台组件,支持国际化 |
| 状态管理 | **Zustand** | 轻量,适合中小型应用 |
| 路由 | **React Router v6** | 声明式路由 |
| HTTP 客户端 | **Axios** | 统一拦截、错误处理 |
| 表格/虚拟滚动 | **Ant Design Table** + 按需分页 | 处理大量视频列表 |
| 代码规范 | **ESLint + Prettier** | 统一代码风格 |
### 4.2 后端
| 技术 | 版本/选型 | 说明 |
| --- | --- | --- |
| 运行时 | **Node.js 20 LTS** | 长期支持,性能稳定 |
| 框架 | **Express 4** | 轻量、成熟、文档丰富 |
| 语言 | **TypeScript 5** | 类型安全 |
| 阿里云 SDK | **@alicloud/pop-core** 或官方 **@alicloud/vod-sdk** | 调用 VOD OpenAPI |
| 配置管理 | **cosmiconfig / dotenv** | 支持环境变量与配置文件 |
| 身份认证 | **jsonwebtoken** + bcryptjs | JWT + 密码哈希 |
| 持久化 | **SQLite**(可选) | 存储账号配置、操作日志,零部署成本 |
| 日志 | **pino** | 高性能结构化日志 |
| 任务队列 | **bullmq** 或内存队列 | 批量任务异步处理 |
| 代码规范 | **ESLint + Prettier** | 统一代码风格 |
### 4.3 部署与运维
| 技术 | 说明 |
| --- | --- |
| **Docker** | 前后端统一镜像或多镜像编排 |
| **Docker Compose** | 一键启动完整服务 |
| **Nginx / Caddy** | 反向代理、SSL 终止(可选,由用户自行配置) |
| **GitHub Actions** | CI lint / test / build / Docker 镜像发布 |
### 4.4 整体架构
```
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ Web Browser │──────▶ React Frontend │──────▶ Node.js Backend │
│ (Ant Design) │ │ (Vite + TS) │ │ (Express + TS) │
└─────────────────┘ └──────────────────┘ └────────┬────────┘
┌─────────────────┐
│ 阿里云 VOD API │
│ (pop-core SDK) │
└─────────────────┘
┌─────────────────┐
│ SQLite (可选) │
│ 配置 / 操作日志 │
└─────────────────┘
```
### 4.5 目录结构(建议)
```
Aliyun-VOD-Media-Library-Manager/
├── apps/
│ ├── web/ # 前端 (React + Vite)
│ │ ├── src/
│ │ ├── package.json
│ │ └── vite.config.ts
│ └── server/ # 后端 (Node.js + Express)
│ ├── src/
│ ├── package.json
│ └── tsconfig.json
├── docker/
│ ├── Dockerfile.web
│ ├── Dockerfile.server
│ └── docker-compose.yml
├── docs/ # 使用文档、部署文档
├── .github/
│ └── workflows/ci.yml
├── LICENSE (MIT)
├── README.md
└── PRD.md
```
---
## 5. API 设计(核心)
### 5.1 账号配置
- `GET /api/config` - 获取当前账号配置(脱敏)
- `POST /api/config` - 新增/更新账号配置
- `DELETE /api/config/:id` - 删除账号配置
- `POST /api/config/:id/switch` - 切换当前使用账号
### 5.2 媒体库
- `GET /api/videos` - 视频列表(分页、筛选)
- `GET /api/videos/:id` - 视频详情
- `POST /api/videos/:id/play-info` - 获取播放信息
- `POST /api/videos/batch-delete` - 批量删除
- `POST /api/videos/batch-download` - 批量获取下载地址
- `POST /api/videos/batch-update` - 批量更新元信息(P1
### 5.3 分类
- `GET /api/categories` - 获取 VOD 分类树
### 5.4 系统
- `POST /api/auth/login` - 登录
- `GET /api/auth/me` - 当前用户
- `GET /api/logs` - 操作日志(P1
---
## 6. 界面原型要点
### 6.1 布局
- 左侧导航:视频库、批量任务、账号配置、系统设置、操作日志。
- 顶部:当前账号/Region 切换、用户头像/退出。
- 主内容区:面包屑 + 筛选栏 + 数据表格。
### 6.2 视频库页面
- 筛选栏:关键词输入、分类下拉、标签输入、时间选择、状态选择、刷新按钮。
- 操作栏:批量下载、批量删除、批量编辑。
- 表格:支持多选、排序、列自定义。
- 点击行展开/抽屉查看详情与预览。
### 6.3 批量任务页面
- 展示当前批量下载/删除任务进度。
- 完成后可导出结果 CSV。
---
## 7. 里程碑规划
| 阶段 | 目标 | 周期(建议) |
| --- | --- | --- |
| **MVP** | 视频列表、详情、单/批量下载、单/批量删除、单账号配置 | 2 - 3 周 |
| **v0.2** | 多账号切换、分类树、操作日志、只读/管理员权限 | 2 周 |
| **v0.3** | 批量编辑、标签管理、下载任务队列、Docker 一键部署 | 2 周 |
| **v1.0** | i18n、测试覆盖、文档完善、发布 Release | 2 周 |
---
## 8. 风险与规避
| 风险 | 影响 | 规避方案 |
| --- | --- | --- |
| 阿里云 API 限流 | 批量操作失败 | 分页、队列、指数退避重试 |
| AccessKey 泄露 | 账号安全 | 仅后端持有,环境变量注入,最小权限 RAM 用户 |
| 大文件下载超时 | 体验差 | 仅获取临时 URL,由用户自行使用下载工具 |
| 官方 API 变更 | 功能异常 | 封装 SDK 调用层,抽象统一接口 |
---
## 9. 附录
### 9.1 参考文档
- [阿里云 VOD 开发指南](https://help.aliyun.com/document_detail/60574.html)
- [阿里云 OpenAPI 门户 - VOD](https://next.api.aliyun.com/api/Vod)
- [RAM 最小权限策略最佳实践](https://help.aliyun.com/document_detail/58932.html)
### 9.2 建议的 RAM 最小权限
为了让本工具安全运行,建议为阿里云子账号/用户组授予最小权限策略:
```json
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"vod:Get*",
"vod:List*",
"vod:SearchMedia",
"vod:DeleteVideo",
"vod:UpdateVideoInfo",
"vod:GetPlayInfo"
],
"Resource": "*"
}
]
}
```
> 注:如果仅需要只读功能,应移除 `DeleteVideo` 与 `UpdateVideoInfo`。
---
## 10. 待决策事项
1. 是否引入数据库:MVP 阶段建议仅用内存/JSON 配置,v0.2 引入 SQLite。
2. 批量下载 URL 过期策略:默认 2 小时,是否允许用户自定义。
3. 是否支持阿里云 STS 临时凭证:建议 v0.3 支持,进一步提升安全性。
4. 是否支持多云扩展(如腾讯云、AWS):明确 v1.0 前不支持,保持聚焦。