5.5 KiB
5.5 KiB
EveryPublish Web-only V1 逻辑图
1. 系统拓扑
┌───────────────────────┐ REST / Browser WS ┌──────────────────────────────┐
│ 浏览器 │◄────────────────────────────►│ Go server │
│ React + TDesign │ │ Gin API + JWT + GORM │
└───────────┬───────────┘ │ MySQL + Redis │
│ ├──────────────┬───────────────┤
│ │ WebExecutor │ PlatformAdapter│
│ │ mock │ 本机 profile │
│ └──────┬───────┴───────┬───────┘
│ │ │
└────────────────────────────── localhost ─────────┴───────► 目标平台
2. 登录
输入邮箱/密码
│
├─ POST /auth/login ──> Argon2 校验 ──> access + refresh
│ │
│ └─ 失败:统一错误码、登录限速、审计
└─ GET /auth/me + connectWS ──> 工作台
3. 素材到任务
拖入文件
│ POST /materials multipart
▼
流式 SHA-256 ── 同工作区查重 ──┬─ 命中:返回已有素材(dedup)
└─ 未命中:写本地存储 + metadata
│
▼
新建发布向导
│
POST /tasks(draft)
│
submit → approve / reject → queued
4. 任务执行
queued
│ dispatcher poll / immediate trigger
▼
dispatched → running ── WebExecutor/PlatformAdapter ──┬─ success ──> published URL + receipt
├─ challenge ──> Challenge Center / solve / resume
├─ cancel ──> context cancel + cancelled
└─ failed ──> error category + retry
排期任务在 schedule_at 到期前保持 queued;草稿/驳回任务可在排期日历通过 PUT /tasks/:id 设置或清除时间,已执行任务只读。
5. 真实平台登录
网页点击“登录账号”
│
├─ POST /accounts/:id/bind
├─ PlatformAdapter.BeginLogin 生成唯一二维码 token/url
├─ 网页显示 QR;用户使用目标平台手机客户端扫码
├─ worker 轮询 86101/86090/0 等平台状态
├─ confirmed 后保存 workspace/account 隔离的加密凭据
└─ account.status = active / expired / suspended
6. 凭据导入与检查
网页粘贴 Cookie
│ POST /accounts/:id/credentials
├─ 适配器校验平台必需字段
├─ AES-256-GCM Store.Save(workspaceID, accountID)
└─ 只返回 active;Cookie 不进入响应/日志/WS
点击“检查”
│ POST /accounts/:id/check
├─ adapter.CheckCredentials -> 平台 nav/profile 接口
├─ 有效:active + lastActiveAt
└─ 失效:expired + lastError
7. 参考系统逻辑图:MediaPublishPlatform
Vue 页面
├─ /uploadSave ───────> Flask 保存 videoFile + SQLite file_records
├─ /getAccounts ──────> SQLite user_info
├─ /login (SSE) ──────> Thread + Queue
│ └─ Playwright 可视 Chrome 登录
│ └─ storage_state 写 cookiesFile
├─ /postVideo ────────> SQLite publish_task_records
└─ /postVideos... ────> multiFileUploader
└─ file → platform → account 串行尝试
└─ BaseFileUploader + platform_configs
8. 参考系统逻辑图:social-auto-upload-web-ui
Vue/Element Plus
├─ /login (SSE) ──────> Flask blueprint / platform.login
├─ /importAccount ────> cookie parse → temp file → sync profile
├─ /postVideo ────────> task_id → background executor
└─ /postVideo/status ─> memory/task status polling
Registry
└─ platform id → BasePlatform
├─ login
├─ check_cookie
├─ sync_profile
└─ publish_video
9. 参考逻辑到 EveryPublish 的映射
参考 SSE Queue -> Challenge 表 + Browser WS + REST 刷新
参考 SQLite task record -> Task + TaskEvent + workspace 条件
参考 storage_state cookie -> 服务器本机受保护 profile/credential store
参考 multi-account fallback -> Task adapter 的账号候选与错误分类
参考 platform_configs -> Go PlatformAdapter registry(每个平台独立测试)