feat: 新增 macOS 原生 SwiftUI 客户端
CI / lint-and-build (push) Has been cancelled

- Swift 6 + SwiftUI + SwiftData 直接调用阿里云 VOD API

- 自实现 POP 签名,无需 Node 后端

- 视频列表、搜索、批量下载到用户选择目录

- 下载文件自动使用视频标题重命名

- 浏览器下载与下载工具(aria2/wget)两种方式

- Web 版标记为废弃,README/AGENTS/MEMORY 更新
This commit is contained in:
2026-06-30 08:38:43 +06:00
parent 50e5a4182a
commit e8c3e4644e
21 changed files with 1557 additions and 176 deletions
+42 -67
View File
@@ -1,33 +1,34 @@
# AGENTS.md
> 本项目(阿里云 VOD 媒体库管理器)的代理开发指南。
> 本项目(火炬 VOD 管理器)的代理开发指南。
## 项目背景
一个轻量、开源、可自托管的阿里云视频点播(VOD)媒体资源管理后台。核心目标是解决阿里云官方 VOD 控制台在查看、批量下载、批量删除大量视频时操作繁琐的问题。
一个轻量、开源的阿里云视频点播(VOD)媒体资源管理工具,核心目标是解决阿里云官方 VOD 控制台在查看、批量下载、批量删除大量视频时操作繁琐的问题。
- 名称:火炬 VOD 管理器
- 许可证:MIT
- 用户群体:开发者、内容运营人员
- 部署方式:Docker / 源码运行
- 部署方式:macOS 原生应用(目标上架 Mac App Store
## 技术栈
- **端**React 18 + TypeScript + Vite + Ant Design 5 + Zustand
- **后端**Node.js 20 + Express + TypeScript + SQLite
- **阿里云 SDK**`@alicloud/pop-core`
- **容器化**Docker + Docker Compose
- **客户端**Swift 6 + SwiftUI + SwiftData
- **阿里云 API**:自实现 POP 签名,直接调用 VOD OpenAPI
- **网络**URLSession
- **持久化**SwiftDataSQLite
> 历史版本(已废弃):React 18 + Express + SQLite 的 Web 版保留在 `apps/web` 和 `apps/server`,不再维护。
## 目录结构
```
.
├── apps/
│ ├── web/ # React 前端
│ └── server/ # Express 后端
├── docker/
── Dockerfile
│ ├── docker-compose.yml
│ └── .env.example
│ ├── macos/ # macOS 原生 SwiftUI 应用
│ └── VODManager/
│ ├── web/ # React 前端(已废弃,历史参考)
── server/ # Express 后端(已废弃,历史参考)
├── docs/ # 部署与使用文档
├── PRD.md # 产品需求文档
├── README.md
@@ -38,74 +39,48 @@
### 代码风格
- 使用 TypeScript,严格模式开启
- 后端统一使用 `asyncHandler` 包装异步路由处理器,避免未捕获异常导致进程崩溃
- 后端数据库查询结果使用 camelCase 别名与 TypeScript 接口保持一致
- 前端使用函数组件 + Hooks,状态管理使用 Zustand
- API 响应统一格式:`{ code: number, data: T, message?: string }`
- 使用 Swift 6,严格并发检查
- SwiftData 模型类使用 `@Model`,避免在并发任务中直接传递 `@Model` 实例
- UI 使用 SwiftUI,状态管理使用 `@StateObject` / `@ObservedObject` / `@Query`
- 阿里云 API 调用统一封装在 `VODClient` actor 中
- 下载任务使用 `URLSessionDownloadTask`,文件名自动清理非法字符
### 安全要求
- AccessKey Secret 必须加密存储(`APP_ENCRYPTION_KEY`),生产环境必须设置
- JWT 密钥生产环境必须修改,默认密钥不允许用于生产
- 阿里云 API 调用仅在后端进行,禁止前端直接持有密钥。
- AccessKey Secret 存储在 SwiftData 中,建议后续接入 Keychain 加密存储
- 阿里云 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
# 构建 macOS 应用
cd apps/macos/VODManager
swift build
# 开发启动(同时启动前后端)
npm run dev
# 运行
cd apps/macos/VODManager
swift run
# 单独启动后端
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
# 在 Xcode 中打开
open apps/macos/VODManager/Package.swift
```
## 后端路由约定
## App Store 注意事项
- `/api/auth`:登录与当前用户
- `/api/accounts`:阿里云账号配置(需管理员权限修改)
- `/api/videos`:视频列表、详情、批量下载/删除/更新
- `/api/categories`VOD 分类树
- `/api/logs`:操作日志
- 必须开启 App Sandbox。
- 使用 `com.apple.security.network.client` 访问阿里云 API。
- 使用 `com.apple.security.files.user-selected.read-write` 让用户选择下载目录。
- 默认下载到应用沙盒内部,提供「导出」功能让用户移动到外部目录。
## 数据库
## 数据库模型
- `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, ...
- `Account`:阿里云账号配置
- `OperationLog`:操作日志
- `DownloadTask`:下载任务历史
## 贡献注意事项
1. 修改前后端代码后,必须跑通 `npm run lint``npm run test`
2. 后端新增接口建议同步写入 `docs/api.md`(如存在)
3. 涉及数据库 schema 变更时,需考虑现有部署的兼容性
4. 提交信息使用中文,描述清晰。
1. macOS 修改后必须能通过 `swift build`
2. 提交信息使用中文,描述清晰
3. 涉及 SwiftData schema 变更时,需考虑现有用户数据迁移