106 lines
6.5 KiB
Markdown
106 lines
6.5 KiB
Markdown
# EveryPublish Web-only V1 方案
|
||
|
||
> 版本:V1-web · 2026-08-21
|
||
> 当前交付面只有网页端。macOS/Windows 客户端、Agent 配对、设备管理和 Agent WSS 暂停,不属于本阶段验收。
|
||
|
||
## 1. 目标
|
||
|
||
EveryPublish V1 是部署在当前设备上的本地 Web 控制台:用户打开浏览器登录,在同一个网页里管理平台账号、素材、发布任务、审核、挑战和结果。发布执行在服务器进程内的本地 worker 完成,不要求安装客户端、不要求生成配对码、不要求绑定设备。
|
||
|
||
```text
|
||
浏览器(React + TDesign)
|
||
│ HTTPS/REST + Browser WebSocket
|
||
▼
|
||
Go server(认证、工作区、素材、任务、挑战、审计)
|
||
│
|
||
├── WebExecutor(V1 本地模拟/联调,默认可用)
|
||
└── PlatformAdapter(真实平台,按平台逐个接入)
|
||
│
|
||
└── 本机浏览器 profile / cookie vault / QR 登录
|
||
```
|
||
|
||
## 2. 明确停止项
|
||
|
||
- 暂停 `client/macos`、`client/desktop`、`client/ui` 的新功能、安装包和启动验收。
|
||
- 暂停网页端 Agent 配对码、Agent 设备列表、Agent 总览、远程吊销和客户端日志入口。
|
||
- 暂停依赖 Agent WSS 的任务下发;V1 任务由 WebExecutor/PlatformAdapter 在 Go server 所在设备执行。
|
||
- 不把当前已有的“假 Agent 在线”当作网页端完成证据。
|
||
|
||
旧客户端代码保留在仓库中作为后续迁移材料,但不得出现在 V1 菜单、默认流程和验收清单中。
|
||
|
||
## 3. V1 页面
|
||
|
||
| 页面 | 必须可用的功能 |
|
||
|---|---|
|
||
| 工作台 | 今日任务统计、成功/失败、待处理挑战、最近任务、执行器健康 |
|
||
| 账号管理 | 添加账号、平台选择、网页扫码登录、Cookie 导入、登录状态检查、重新登录、删除未绑定账号 |
|
||
| 素材库 | 视频/图片上传、进度、SHA-256 去重、预览、分组/标签、删除、下载直链 |
|
||
| 新建发布 | 选择素材、选择一个或多个账号、统一标题/正文/标签、封面、立即/定时、草稿保存 |
|
||
| 任务中心 | 队列/运行/成功/失败/取消、进度、失败原因、重试、取消、详情、状态时间线和结果链接 |
|
||
| 排期日历 | 按日期查看和编辑可编辑任务 |
|
||
| 审核中心 | 待审、通过、驳回和批注;可配置跳过审核的本地模式保留在设置 |
|
||
| 挑战中心 | QR 图片、验证码、APP 确认、过期、重发、解决记录 |
|
||
| 通知 | 任务失败、登录过期、挑战到达、审核结果 |
|
||
| 成员/工作区 | 单机 V1 保留基础工作区和成员模型,权限先保证 owner/admin/operator/reviewer 隔离,并支持成员切换工作区 |
|
||
| 设置 | 工作区资料、安全(密码修改);通知统一使用站内通知页,外部通知渠道不进入 V1 |
|
||
| 审计日志 | 登录、素材、账号、任务、审核、挑战和设置操作 |
|
||
|
||
## 4. 连接与状态
|
||
|
||
V1 只使用网页到 Go server 的两种连接:REST 完成请求,Browser WebSocket 推送任务/挑战/通知。浏览器刷新后通过 REST 补齐状态,不能只依赖 WebSocket。
|
||
|
||
```text
|
||
打开网页
|
||
├─ 未登录 ──> 登录页 ──失败/限速──> 保留表单并说明原因
|
||
└─ 已登录 ──> GET /auth/me + GET /tasks + GET /challenges
|
||
│
|
||
├─ WebSocket 已连接 ──> 实时更新
|
||
└─ WebSocket 失败 ──> 顶部显示“实时连接断开”,REST 轮询兜底
|
||
```
|
||
|
||
任务状态统一为:`draft → pending_review → queued → dispatched → running → success/failed`,可从 `failed → queued` 重试,`draft/rejected → deleted`,可取消状态 → `cancelled`。
|
||
|
||
## 5. 执行器边界
|
||
|
||
`WebExecutor` 是 Go server 的稳定接口,先提供 `mock` 实现保证本地全链路,随后按平台接入真实执行器。真实执行器需要从参考仓库借鉴 Playwright/profile/cookie/QR/SSE 逻辑,但必须隔离在 adapter 目录,不能把 Python 示例代码直接散落到 API handler。
|
||
|
||
```text
|
||
TaskDispatcher
|
||
├─ 读取任务与账号
|
||
├─ 生成短时素材访问令牌
|
||
├─ WebExecutor.Submit(ctx, task)
|
||
├─ 记录 running / progress / result / error
|
||
└─ 广播 task.status
|
||
```
|
||
|
||
当前实现状态:`mock` 固定走本机 mock executor;`web` 对已注册平台走本机 PlatformAdapter,未接入的平台明确保留 mock fallback。B站已接入 QR 登录、加密凭据、UPOS 分片上传和投稿;真实平台成功必须有平台返回的 URL/receipt,`mock://` 只能用于自动化测试。
|
||
|
||
真实平台登录需要用户在浏览器或手机完成扫码;当前无法人工扫码时,只能验证 QR 产生、挑战状态、超时、重发和 mock 解决,不能声称真实账号登录已验收。
|
||
|
||
## 6. 验收门槛
|
||
|
||
### 本地自动验收
|
||
|
||
1. 注册/登录/刷新/退出和过期 token。
|
||
2. 上传素材、重复 SHA-256 去重、预览和删除。
|
||
3. 创建草稿、提交审核、通过/驳回、重提、取消、重试。
|
||
4. mock executor 将任务推进到 success,并写入结果 URL/receipt。
|
||
5. Browser WebSocket 断开后 REST 仍可恢复页面状态。
|
||
6. 账号登录流程可产生 QR,挑战可重发/过期/模拟解决。
|
||
7. 普通成员不能调用管理员动作,workspace 数据不能串租户。
|
||
|
||
自动化 smoke 还必须覆盖:注册后的再次登录、refresh token 轮换、空挑战确认值被拒绝、签名素材直链只能使用一次、未登录账号不能创建发布任务,以及 `EXECUTOR_MODE=mock` 和 `EXECUTOR_MODE=web` 两种本机执行模式。
|
||
|
||
### 人工验收(用户执行)
|
||
|
||
- 用户在目标平台完成一次真实扫码登录。
|
||
- 用户选一个真实账号、上传真实素材、发布一个测试任务。
|
||
- 用户确认目标平台内容、任务结果和失败重试。
|
||
|
||
## 7. 参考代码许可和借鉴边界
|
||
|
||
- `references/social-auto-upload`:MIT,HEAD `1c66b7d`;借鉴 uploader 抽象、统一校验、QR 登录和平台 CLI 参数,不直接复制其当前 Web 层(README 已说明 Web 非主线)。
|
||
- `references/social-auto-upload-web-ui`:MIT,HEAD `85e783c`;借鉴 Flask 蓝图拆分、Registry、SSE 登录、串行任务队列、素材中心和批量发布参数。
|
||
- `references/MediaPublishPlatform`:MIT,HEAD `0813236`;借鉴统一 BaseFileUploader、批量账号轮换、定时参数和发布记录页面,但不复制其 SQLite/明文 Cookie/全局 CORS。
|
||
- 任何复制的 MIT 代码必须保留版权/许可证说明;新增代码优先用当前 Go/React 技术栈重写,参考仓库作为 `references/` 只读材料。
|