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
+49 -42
View File
@@ -4,68 +4,75 @@
## 当前状态
- **版本**v0.1.0MVP
- **阶段**基础功能已完成,前后端均可构建运行
- **最后更新**2026-06-29
- **版本**v0.2.0macOS 原生版 MVP
- **阶段**已废弃 Web 版,macOS SwiftUI 原生版可构建运行
- **最后更新**2026-06-30
## 已完成的里程碑
### MVPv0.1.0
### v0.1.0Web 版,已废弃
- [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.0macOS 原生版)
- [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` 中的配置
- 用户选择下载目录后,应用才拥有该目录的写入权限