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

6.5 KiB
Raw Blame History

EveryPublish Web-only V1 方案

版本:V1-web · 2026-08-21 当前交付面只有网页端。macOS/Windows 客户端、Agent 配对、设备管理和 Agent WSS 暂停,不属于本阶段验收。

1. 目标

EveryPublish V1 是部署在当前设备上的本地 Web 控制台:用户打开浏览器登录,在同一个网页里管理平台账号、素材、发布任务、审核、挑战和结果。发布执行在服务器进程内的本地 worker 完成,不要求安装客户端、不要求生成配对码、不要求绑定设备。

浏览器(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。

打开网页
  ├─ 未登录 ──> 登录页 ──失败/限速──> 保留表单并说明原因
  └─ 已登录 ──> 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。

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/ 只读材料。