Files
EveryPublish/docs/web-only-v1-plan.md
T

106 lines
6.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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/` 只读材料。