Files
EveryPublish/docs/web-only-logic-diagrams.md
T

130 lines
5.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 逻辑图
## 1. 系统拓扑
```text
┌───────────────────────┐ REST / Browser WS ┌──────────────────────────────┐
│ 浏览器 │◄────────────────────────────►│ Go server │
│ React + TDesign │ │ Gin API + JWT + GORM │
└───────────┬───────────┘ │ MySQL + Redis │
│ ├──────────────┬───────────────┤
│ │ WebExecutor │ PlatformAdapter│
│ │ mock │ 本机 profile │
│ └──────┬───────┴───────┬───────┘
│ │ │
└────────────────────────────── localhost ─────────┴───────► 目标平台
```
## 2. 登录
```text
输入邮箱/密码
│
├─ POST /auth/login ──> Argon2 校验 ──> access + refresh
│ │
│ └─ 失败:统一错误码、登录限速、审计
└─ GET /auth/me + connectWS ──> 工作台
```
## 3. 素材到任务
```text
拖入文件
│ POST /materials multipart
▼
流式 SHA-256 ── 同工作区查重 ──┬─ 命中:返回已有素材(dedup)
└─ 未命中:写本地存储 + metadata
│
▼
新建发布向导
│
POST /tasks(draft)
│
submit → approve / reject → queued
```
## 4. 任务执行
```text
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. 真实平台登录
```text
网页点击“登录账号”
│
├─ POST /accounts/:id/bind
├─ PlatformAdapter.BeginLogin 生成唯一二维码 token/url
├─ 网页显示 QR;用户使用目标平台手机客户端扫码
├─ worker 轮询 86101/86090/0 等平台状态
├─ confirmed 后保存 workspace/account 隔离的加密凭据
└─ account.status = active / expired / suspended
```
## 6. 凭据导入与检查
```text
网页粘贴 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
```text
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
```text
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 的映射
```text
参考 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(每个平台独立测试)
```