docs: 初始化项目文档(PRD、AGENTS、MEMORY、README)
This commit is contained in:
@@ -0,0 +1,13 @@
|
||||
node_modules/
|
||||
dist/
|
||||
data/
|
||||
.env
|
||||
.env.*
|
||||
.git/
|
||||
.github/
|
||||
.vscode/
|
||||
.idea/
|
||||
*.md
|
||||
*.log
|
||||
.DS_Store
|
||||
coverage/
|
||||
+42
@@ -0,0 +1,42 @@
|
||||
# Dependencies
|
||||
node_modules/
|
||||
.pnp
|
||||
.pnp.js
|
||||
|
||||
# Build outputs
|
||||
dist/
|
||||
build/
|
||||
*.tsbuildinfo
|
||||
|
||||
# Environment variables
|
||||
.env
|
||||
.env.local
|
||||
.env.*.local
|
||||
|
||||
# Database
|
||||
data/
|
||||
*.db
|
||||
*.sqlite
|
||||
*.sqlite3
|
||||
|
||||
# Logs
|
||||
logs/
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
|
||||
# Editor
|
||||
.idea/
|
||||
.vscode/
|
||||
*.swp
|
||||
*.swo
|
||||
*~
|
||||
|
||||
# OS
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
|
||||
# Test coverage
|
||||
coverage/
|
||||
@@ -0,0 +1,111 @@
|
||||
# AGENTS.md
|
||||
|
||||
> 本项目(阿里云 VOD 媒体库管理器)的代理开发指南。
|
||||
|
||||
## 项目背景
|
||||
|
||||
一个轻量、开源、可自托管的阿里云视频点播(VOD)媒体资源管理后台。核心目标是解决阿里云官方 VOD 控制台在查看、批量下载、批量删除大量视频时操作繁琐的问题。
|
||||
|
||||
- 许可证:MIT
|
||||
- 用户群体:开发者、内容运营人员
|
||||
- 部署方式:Docker / 源码运行
|
||||
|
||||
## 技术栈
|
||||
|
||||
- **前端**:React 18 + TypeScript + Vite + Ant Design 5 + Zustand
|
||||
- **后端**:Node.js 20 + Express + TypeScript + SQLite
|
||||
- **阿里云 SDK**:`@alicloud/pop-core`
|
||||
- **容器化**:Docker + Docker Compose
|
||||
|
||||
## 目录结构
|
||||
|
||||
```
|
||||
.
|
||||
├── apps/
|
||||
│ ├── web/ # React 前端
|
||||
│ └── server/ # Express 后端
|
||||
├── docker/
|
||||
│ ├── Dockerfile
|
||||
│ ├── docker-compose.yml
|
||||
│ └── .env.example
|
||||
├── docs/ # 部署与使用文档
|
||||
├── PRD.md # 产品需求文档
|
||||
├── README.md
|
||||
└── AGENTS.md # 本文件
|
||||
```
|
||||
|
||||
## 开发规范
|
||||
|
||||
### 代码风格
|
||||
|
||||
- 使用 TypeScript,严格模式开启。
|
||||
- 后端统一使用 `asyncHandler` 包装异步路由处理器,避免未捕获异常导致进程崩溃。
|
||||
- 后端数据库查询结果使用 camelCase 别名与 TypeScript 接口保持一致。
|
||||
- 前端使用函数组件 + Hooks,状态管理使用 Zustand。
|
||||
- API 响应统一格式:`{ code: number, data: T, message?: string }`。
|
||||
|
||||
### 安全要求
|
||||
|
||||
- AccessKey Secret 必须加密存储(`APP_ENCRYPTION_KEY`),生产环境必须设置。
|
||||
- JWT 密钥生产环境必须修改,默认密钥不允许用于生产。
|
||||
- 阿里云 API 调用仅在后端进行,禁止前端直接持有密钥。
|
||||
- 建议用户创建最小权限 RAM 子用户。
|
||||
|
||||
### 环境变量
|
||||
|
||||
后端关键配置见 `apps/server/.env.example`:
|
||||
|
||||
- `PORT`:服务端端口
|
||||
- `JWT_SECRET`:JWT 签名密钥
|
||||
- `APP_ENCRYPTION_KEY`:AccessKey Secret 加密密钥
|
||||
- `DEFAULT_ADMIN_USERNAME/PASSWORD`:默认管理员账号
|
||||
- `DB_PATH`:SQLite 数据库路径
|
||||
|
||||
## 常用命令
|
||||
|
||||
```bash
|
||||
# 安装依赖
|
||||
npm install
|
||||
|
||||
# 开发启动(同时启动前后端)
|
||||
npm run dev
|
||||
|
||||
# 单独启动后端
|
||||
npm run dev -w apps/server
|
||||
|
||||
# 单独启动前端
|
||||
npm run dev -w apps/web
|
||||
|
||||
# 代码检查
|
||||
npm run lint
|
||||
|
||||
# 测试
|
||||
npm run test
|
||||
|
||||
# 生产构建
|
||||
npm run build
|
||||
|
||||
# 生产运行
|
||||
npm run start -w apps/server
|
||||
```
|
||||
|
||||
## 后端路由约定
|
||||
|
||||
- `/api/auth`:登录与当前用户
|
||||
- `/api/accounts`:阿里云账号配置(需管理员权限修改)
|
||||
- `/api/videos`:视频列表、详情、批量下载/删除/更新
|
||||
- `/api/categories`:VOD 分类树
|
||||
- `/api/logs`:操作日志
|
||||
|
||||
## 数据库表
|
||||
|
||||
- `users`:用户表(id, username, password_hash, role, created_at)
|
||||
- `accounts`:阿里云账号表(access_key_id, access_key_secret, region, endpoint, is_active, ...)
|
||||
- `operation_logs`:操作日志表(action, target_type, target_ids, details, ...)
|
||||
|
||||
## 贡献注意事项
|
||||
|
||||
1. 修改前后端代码后,必须跑通 `npm run lint` 和 `npm run test`。
|
||||
2. 后端新增接口建议同步写入 `docs/api.md`(如存在)。
|
||||
3. 涉及数据库 schema 变更时,需考虑现有部署的兼容性。
|
||||
4. 提交信息使用中文,描述清晰。
|
||||
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2026 Aliyun VOD Media Library Manager Contributors
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
@@ -0,0 +1,71 @@
|
||||
# MEMORY.md
|
||||
|
||||
> 项目状态与关键决策记录,供跨会话参考。
|
||||
|
||||
## 当前状态
|
||||
|
||||
- **版本**:v0.1.0(MVP)
|
||||
- **阶段**:基础功能已完成,前后端均可构建并运行
|
||||
- **最后更新**:2026-06-29
|
||||
|
||||
## 已完成的里程碑
|
||||
|
||||
### MVP(v0.1.0)
|
||||
|
||||
- [x] 前后端项目初始化
|
||||
- [x] SQLite 数据库与默认管理员账号
|
||||
- [x] JWT 登录认证与管理员/只读角色
|
||||
- [x] 阿里云 VOD 账号配置(多账号、切换、Secret 加密)
|
||||
- [x] 视频列表、搜索、筛选
|
||||
- [x] 视频详情查看
|
||||
- [x] 批量获取下载地址(支持指定清晰度)
|
||||
- [x] 批量删除视频
|
||||
- [x] 批量更新视频元信息
|
||||
- [x] VOD 分类树读取
|
||||
- [x] 操作日志记录
|
||||
- [x] Docker + Docker Compose 部署配置
|
||||
- [x] README 与部署文档
|
||||
- [x] GitHub Actions CI 配置
|
||||
|
||||
## 架构决策
|
||||
|
||||
1. **前后端分离**:React 前端 + Express 后端,生产环境由后端 serve 前端静态资源。
|
||||
2. **数据库选型**:使用 SQLite,零部署成本,适合个人/小团队自托管。
|
||||
3. **密钥安全**:AccessKey Secret 使用 AES-256-GCM 加密,密钥通过 `APP_ENCRYPTION_KEY` 环境变量注入。
|
||||
4. **API 调用代理**:所有阿里云 VOD API 调用均通过后端代理,前端不接触密钥。
|
||||
5. **权限模型**:简单双角色(admin / readonly),admin 可修改账号与执行删除/更新,readonly 仅可查看与下载。
|
||||
|
||||
## 已知问题 / 待优化
|
||||
|
||||
1. 下载地址获取是同步串行循环,后续应改为异步队列并增加进度条。
|
||||
2. 前端构建产物单文件较大(>1MB),可考虑按路由懒加载。
|
||||
3. 尚未接入真实阿里云 VOD 环境进行端到端验证,字段映射可能需要根据实际 API 响应微调。
|
||||
4. 单元测试覆盖较少,目前仅覆盖 crypto 工具函数。
|
||||
5. 分类树目前只读取一层子分类,未做递归展开。
|
||||
|
||||
## 后续规划
|
||||
|
||||
### v0.2.0
|
||||
|
||||
- [ ] 真实 VOD 环境联调与字段校准
|
||||
- [ ] 批量任务异步队列与进度展示
|
||||
- [ ] 标签管理
|
||||
- [ ] 更完善的错误提示
|
||||
|
||||
### v0.3.0
|
||||
|
||||
- [ ] 支持 STS 临时凭证
|
||||
- [ ] 下载任务导出 CSV
|
||||
- [ ] 前端路由懒加载优化
|
||||
|
||||
### v1.0.0
|
||||
|
||||
- [ ] 中英文国际化
|
||||
- [ ] 完善测试覆盖
|
||||
- [ ] 发布正式 Release
|
||||
|
||||
## 部署注意
|
||||
|
||||
- 生产环境必须设置 `JWT_SECRET` 和 `APP_ENCRYPTION_KEY`。
|
||||
- 默认管理员账号 `admin/admin` 仅用于首次登录,务必修改。
|
||||
- SQLite 数据库文件位于 `apps/server/data/vod-manager.db`,Docker 部署时通过 volume 持久化。
|
||||
@@ -0,0 +1,341 @@
|
||||
# 阿里云 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 视频列表字段
|
||||
|
||||
默认展示字段:
|
||||
|
||||
- 视频 ID(VideoId)
|
||||
- 标题(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 配置。
|
||||
- 前端响应式,支持桌面端与平板。
|
||||
- 中文/英文界面(i18n,P1)。
|
||||
|
||||
### 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 前不支持,保持聚焦。
|
||||
@@ -0,0 +1,112 @@
|
||||
# 阿里云 VOD 媒体库管理器
|
||||
|
||||
一个**轻量、开源、可自托管**的阿里云视频点播(VOD)媒体资源管理后台,解决官方控制台操作繁琐、批量处理能力弱的问题。
|
||||
|
||||
## 功能特性
|
||||
|
||||
- 视频库快速查看、搜索、筛选(标题、分类、标签、状态、时间)
|
||||
- 批量获取视频播放/下载地址,支持选择清晰度
|
||||
- 批量删除视频
|
||||
- 多账号/多 Region 切换管理
|
||||
- 内置登录与角色控制(管理员 / 只读)
|
||||
- 操作日志审计
|
||||
- 单 Docker 镜像一键部署
|
||||
|
||||
## 技术栈
|
||||
|
||||
- **前端**:React 18 + TypeScript + Vite + Ant Design 5 + Zustand
|
||||
- **后端**:Node.js 20 + Express + TypeScript + SQLite
|
||||
- **阿里云 SDK**:`@alicloud/pop-core`
|
||||
- **部署**:Docker + Docker Compose
|
||||
|
||||
## 快速开始
|
||||
|
||||
### 方式一:Docker Compose(推荐)
|
||||
|
||||
```bash
|
||||
git clone https://github.com/your-org/Aliyun-VOD-Media-Library-Manager.git
|
||||
cd Aliyun-VOD-Media-Library-Manager/docker
|
||||
cp .env.example .env
|
||||
# 编辑 .env,设置 JWT_SECRET 等
|
||||
sudo docker-compose up -d
|
||||
```
|
||||
|
||||
访问 http://localhost:3001,默认账号密码 `admin` / `admin`。
|
||||
|
||||
### 方式二:源码运行
|
||||
|
||||
```bash
|
||||
# 安装依赖
|
||||
npm install
|
||||
|
||||
# 启动后端(端口 3001)
|
||||
npm run dev -w apps/server
|
||||
|
||||
# 新终端启动前端(端口 5173)
|
||||
npm run dev -w apps/web
|
||||
```
|
||||
|
||||
## 配置说明
|
||||
|
||||
关键环境变量:
|
||||
|
||||
| 变量 | 说明 | 默认值 |
|
||||
| --- | --- | --- |
|
||||
| `JWT_SECRET` | JWT 签名密钥,生产环境必须修改 | `vod-manager-dev-secret-change-me` |
|
||||
| `APP_ENCRYPTION_KEY` | AccessKey Secret 加密密钥 | 空(明文存储,会告警) |
|
||||
| `DEFAULT_ADMIN_USERNAME` | 默认管理员账号 | `admin` |
|
||||
| `DEFAULT_ADMIN_PASSWORD` | 默认管理员密码 | `admin` |
|
||||
| `DB_PATH` | SQLite 数据库路径 | `./data/vod-manager.db` |
|
||||
|
||||
## 阿里云 RAM 最小权限
|
||||
|
||||
建议为本工具单独创建 RAM 子用户,并授予最小权限:
|
||||
|
||||
```json
|
||||
{
|
||||
"Version": "1",
|
||||
"Statement": [
|
||||
{
|
||||
"Effect": "Allow",
|
||||
"Action": [
|
||||
"vod:Get*",
|
||||
"vod:List*",
|
||||
"vod:SearchMedia",
|
||||
"vod:GetPlayInfo",
|
||||
"vod:DeleteVideo",
|
||||
"vod:UpdateVideoInfo"
|
||||
],
|
||||
"Resource": "*"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
如果只需要只读能力,请移除 `DeleteVideo` 和 `UpdateVideoInfo`。
|
||||
|
||||
## 项目结构
|
||||
|
||||
```
|
||||
.
|
||||
├── apps/
|
||||
│ ├── web/ # React 前端
|
||||
│ └── server/ # Express 后端 + SQLite
|
||||
├── docker/
|
||||
│ ├── Dockerfile
|
||||
│ └── docker-compose.yml
|
||||
├── docs/ # 部署与使用文档
|
||||
├── PRD.md # 产品需求文档
|
||||
└── README.md
|
||||
```
|
||||
|
||||
## 贡献指南
|
||||
|
||||
欢迎 Issue 和 Pull Request。请确保:
|
||||
|
||||
1. 代码通过 `npm run lint`
|
||||
2. 核心逻辑补充测试
|
||||
3. 提交信息清晰说明改动
|
||||
|
||||
## License
|
||||
|
||||
[MIT](./LICENSE)
|
||||
Reference in New Issue
Block a user