- Swift 6 + SwiftUI + SwiftData 直接调用阿里云 VOD API - 自实现 POP 签名,无需 Node 后端 - 视频列表、搜索、批量下载到用户选择目录 - 下载文件自动使用视频标题重命名 - 浏览器下载与下载工具(aria2/wget)两种方式 - Web 版标记为废弃,README/AGENTS/MEMORY 更新
This commit is contained in:
@@ -4,68 +4,75 @@
|
||||
|
||||
## 当前状态
|
||||
|
||||
- **版本**:v0.1.0(MVP)
|
||||
- **阶段**:基础功能已完成,前后端均可构建并运行
|
||||
- **最后更新**:2026-06-29
|
||||
- **版本**:v0.2.0(macOS 原生版 MVP)
|
||||
- **阶段**:已废弃 Web 版,macOS SwiftUI 原生版可构建运行
|
||||
- **最后更新**:2026-06-30
|
||||
|
||||
## 已完成的里程碑
|
||||
|
||||
### MVP(v0.1.0)
|
||||
### v0.1.0(Web 版,已废弃)
|
||||
|
||||
- [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 配置
|
||||
- [x] React + Express 前后端项目
|
||||
- [x] JWT 登录、SQLite 持久化
|
||||
- [x] VOD 账号配置与 API 代理
|
||||
- [x] 视频列表、批量下载/删除
|
||||
|
||||
### v0.2.0(macOS 原生版)
|
||||
|
||||
- [x] SwiftUI macOS 项目结构
|
||||
- [x] 自实现阿里云 POP 签名(CryptoKit HMAC-SHA1)
|
||||
- [x] 直接调用 VOD OpenAPI,无需 Node 后端
|
||||
- [x] SwiftData 持久化(Account / OperationLog / DownloadTask)
|
||||
- [x] 视频列表、搜索
|
||||
- [x] 批量下载到用户选择目录
|
||||
- [x] 下载文件自动重命名(清理非法字符)
|
||||
- [x] 浏览器下载与下载工具(aria2 / wget)两种方式
|
||||
- [x] 下载任务历史
|
||||
- [x] 操作日志
|
||||
- [x] App Sandbox entitlements 配置
|
||||
|
||||
## 架构决策
|
||||
|
||||
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. **原生 macOS 应用**:使用 SwiftUI + SwiftData,目标上架 Mac App Store。
|
||||
2. **直接调用阿里云 API**:不依赖后端服务,VODClient actor 直接发起 HTTPS 请求并自实现签名。
|
||||
3. **本地持久化**:SwiftData 存储账号、日志、下载任务。
|
||||
4. **下载目录**:由用户通过 NSOpenPanel 选择,符合 App Sandbox 要求。
|
||||
5. **文件名处理**:使用视频标题 + 清晰度组合命名,自动替换非法字符,避免乱码。
|
||||
6. **Web 版废弃**:`apps/web` 与 `apps/server` 保留作为历史参考,不再维护。
|
||||
|
||||
## 已知问题 / 待优化
|
||||
|
||||
1. 下载地址获取是同步串行循环,后续应改为异步队列并增加进度条。
|
||||
2. 前端构建产物单文件较大(>1MB),可考虑按路由懒加载。
|
||||
3. 尚未接入真实阿里云 VOD 环境进行端到端验证,字段映射可能需要根据实际 API 响应微调。
|
||||
4. 单元测试覆盖较少,目前仅覆盖 crypto 工具函数。
|
||||
5. 分类树目前只读取一层子分类,未做递归展开。
|
||||
1. 当前 `swift run` 可编译但 GUI 需在真实 macOS 桌面会话运行。
|
||||
2. 下载进度目前只有开始/完成两种状态,未实现实时百分比(URLSessionDownloadTask 进度回调未接入)。
|
||||
3. 尚未接入真实阿里云账号进行端到端验证。
|
||||
4. 缺少单元测试。
|
||||
5. AccessKey Secret 目前明文存储在 SwiftData,后续应迁移到 Keychain。
|
||||
6. 需要创建正式的 Xcode 工程以配置 Signing、Bundle ID,满足 App Store 提交要求。
|
||||
|
||||
## 后续规划
|
||||
|
||||
### v0.2.0
|
||||
|
||||
- [ ] 真实 VOD 环境联调与字段校准
|
||||
- [ ] 批量任务异步队列与进度展示
|
||||
- [ ] 标签管理
|
||||
- [ ] 更完善的错误提示
|
||||
|
||||
### v0.3.0
|
||||
|
||||
- [ ] 支持 STS 临时凭证
|
||||
- [ ] 下载任务导出 CSV
|
||||
- [ ] 前端路由懒加载优化
|
||||
- [ ] 接入真实账号联调
|
||||
- [ ] 下载进度实时显示
|
||||
- [ ] Keychain 存储 AccessKey Secret
|
||||
- [ ] 分类树展示
|
||||
|
||||
### v0.4.0
|
||||
|
||||
- [ ] 批量删除视频
|
||||
- [ ] 视频详情页面
|
||||
- [ ] 操作日志写入(目前只展示,下载/删除未写入日志)
|
||||
|
||||
### v1.0.0
|
||||
|
||||
- [ ] Xcode 工程与签名配置
|
||||
- [ ] TestFlight / Mac App Store 提交
|
||||
- [ ] 中英文国际化
|
||||
- [ ] 完善测试覆盖
|
||||
- [ ] 发布正式 Release
|
||||
|
||||
## 部署注意
|
||||
|
||||
- 生产环境必须设置 `JWT_SECRET` 和 `APP_ENCRYPTION_KEY`。
|
||||
- 默认管理员账号 `admin/admin` 仅用于首次登录,务必修改。
|
||||
- SQLite 数据库文件位于 `apps/server/data/vod-manager.db`,Docker 部署时通过 volume 持久化。
|
||||
- macOS 应用默认使用 SwiftData 自动管理的数据库路径(Application Support)。
|
||||
- App Store 版本必须开启 Sandbox,使用 `VODManager.entitlements` 中的配置。
|
||||
- 用户选择下载目录后,应用才拥有该目录的写入权限。
|
||||
|
||||
Reference in New Issue
Block a user