docs: 初始化项目文档(PRD、AGENTS、MEMORY、README)

This commit is contained in:
2026-06-29 17:46:36 +06:00
commit 0192c313f4
7 changed files with 711 additions and 0 deletions
+13
View File
@@ -0,0 +1,13 @@
node_modules/
dist/
data/
.env
.env.*
.git/
.github/
.vscode/
.idea/
*.md
*.log
.DS_Store
coverage/
+42
View File
@@ -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/
+111
View File
@@ -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. 提交信息使用中文,描述清晰。
+21
View File
@@ -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.
+71
View File
@@ -0,0 +1,71 @@
# MEMORY.md
> 项目状态与关键决策记录,供跨会话参考。
## 当前状态
- **版本**v0.1.0MVP
- **阶段**:基础功能已完成,前后端均可构建并运行
- **最后更新**2026-06-29
## 已完成的里程碑
### MVPv0.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 持久化。
+341
View File
@@ -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 视频列表字段
默认展示字段:
- 视频 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 前不支持,保持聚焦。
+112
View File
@@ -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)