Files
EveryPublish/docs/delivery-plan.md
T

154 lines
10 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 交付文档(技术栈定版 · 页面构成 · 日计划)
> 2026-08-20 · 开发顺序:网站端(含API) → 客户端(Windows) → 联调交付(含两个用户确认检查点)。基础仓库已拉取:apps/web(Tencent/tdesign-react-starter,MIT)。技术栈定版见 docs/tech-stack.md(MySQL + 前后端 Go 统一)。
## 1. 技术栈定版
| 层 | 选型 | 依据 |
|---|---|---|
| 网页端 | React 18 + TDesign React(Tencent starter,MIT) | 已拉取预览:Vite + TS + Router6 + Redux Toolkit + axios;自带后台页面与 mock,无需装饰 |
| 网页端后端(服务器) | **Go**(gin + coder/websocket + asynq + GORM) | 见 Rust/Go 对比;与 agent-core 同语言共享协议模块;页面层仍为 React+TDesign |
| 客户端 UI | **WinUI 3(C#/.NET 8)原生** | 系统原生控件,无需自写 UI;QR 用 QRCoder 本地渲染 token |
| 客户端核心 | **Go**(WSS 客户端 + go-rod CDP 自动化 + 凭据保险库) | 单二进制、无运行时、可二期抽 Windows 服务/跑 VPS |
| 数据库/队列 | **MySQL 8.x(GORM)+ Redis(asynq)** | 任务队列/排期靠 Redis;MySQL 存业务数据 |
| 素材存储 | 一期服务器本地盘(签名直链);二期 OSS | StorageDriver 抽象预留 |
### 1.1 Rust 还是 Go:结论选 Go
| 维度 | Go | Rust |
|---|---|---|
| 本项目规模 | 性能绰绰有余(WS 网关 goroutine-per-conn,千级连接轻松) | 性能过剩,无收益 |
| 开发与 AI 协作 | AI 生成质量高、迭代快、编译秒级 | borrow checker 调试成本高、编译慢 |
| 单二进制部署 | 静态编译、零依赖(Windows 端尤其省心) | 更小,但构建链复杂 |
| 浏览器自动化 | go-rod(CDP)成熟可用 | 生态弱 |
| Windows 常驻/服务 | kardianos/service 简单 | 复杂度高 |
| 生态(队列/WS/DB) | asynq / coder-websocket / GORM(MySQL) 齐全 | 可选少 |
**性能保障**:①WSS 网关 goroutine-per-conn,单机万级并发无压力;②GORM(MySQL 连接池)+ Redis 承载队列;③大文件绝不走 WSS(签名直链),网关只传 <1KB 消息;④服务无状态可水平扩展;⑤验收硬指标:任务下发 <300ms(tools/diag-connection.mjs 实测基线)。
## 2. 样式方案
- **网页端**:TDesign starter 默认主题(企业后台风格,深浅色可切换),全部页面用 TDesign 组件,不写自定义样式;示例页清理后按菜单骨架填充。
- **客户端**:WinUI 3 Fluent 原生风格(与 Windows 11 一致),托盘用 H.NotifyIcon.WinUI(或 Win32 interop),扫码/挑战用对话框页。
## 3. 网页端页面构成
### 3.1 用户端(客户工作台)
| 菜单 | 页面 | 关键功能 | 角色 |
|---|---|---|---|
| 工作台 | 仪表盘 | 今日发布统计、待处理挑战数、Agent 在线状态、最近任务 | 全部 |
| 发布管理 | 任务列表 / 新建发布 / 排期日历 / 任务详情 | 状态筛选、批量重试/取消;选素材→平台账号→标题话题→定时/立即→提交审核;月/周视图;事件时间线+回执截图+失败原因 | 运营/审核/管理员 |
| 素材库 | 素材列表 / 上传 / 预览 | 拖拽上传(multipart+进度)、分组标签、sha256、删除 | 运营/审核 |
| 账号管理 | 账号台账 / 绑定向导 / 挑战弹窗 | 平台/绑定状态/健康度/代理/最后活跃;发起扫码→QR 弹窗;重新扫码/解绑 | 管理员 |
| 审核中心 | 待审列表 | 分平台预览、通过/驳回+批注(可配置跳过) | 审核/管理员 |
| 通知与挑战 | 挑战中心 / 通知列表 | QR 从 token 本地渲染、验证码输入、APP确认指引、超时挂起/一键重发 | 相关角色 |
| 成员与权限 | 成员列表 / 邀请 | 邀请链接、角色分配 | 管理员 |
| 设置 | 工作区资料 / 安全 / 通知渠道 / Agent 设备 | 2FA 开关(默认关)、企微/钉钉/邮件、设备列表与吊销 | 管理员 |
| 审计日志 | 日志列表 | 谁在何时做了什么、筛选 | 管理员 |
### 3.2 平台端(admin 角色,同部署加一个角色即可)
| 菜单 | 页面 | 功能 |
|---|---|---|
| 租户管理 | 客户列表/详情 | 状态、配额(简单)、停用 |
| Agent 总览 | 设备列表 | 在线/版本/强制吊销/远程指令 |
| 渠道状态(后置) | 适配器列表 | 平台模块状态、灰度 |
| 风控台账(后置) | 事件列表 | 风控/冷却记录 |
## 4. 调用方式设计
```mermaid
flowchart LR
subgraph WEB["网页端 React+TDesign"]
U["用户端页面 / 平台端admin"]
end
subgraph SRV["Go 服务器"]
API["REST /api/*"]
WS["WSS 网关"]
end
subgraph CLIENT["Windows 客户端"]
UI["WinUI 3 壳 C#"] -->|"localhost HTTP+随机token"| CORE["agent-core Go"]
end
U -->|"REST(axios) + 实时WS(JWT)"| API
U -->|"实时状态推送"| WS
CORE -->|"WSS Ed25519设备签名"| WS
CORE -->|"素材直链下载(签名token)"| API
CORE -->|"CDP 驱动系统Chrome/Edge"| CH["浏览器"]
```
- ① 网页端 → 服务器:REST(axios,JWT 15min + refresh 轮换)+ 原生 WebSocket(实时状态推送)。
- ② 客户端 WinUI 壳 → agent-core:localhost HTTP/WS + 随机 token(仅回环,配对时写入本地配置)。
- ③ agent-core → 服务器:WSS + Ed25519 设备签名(配对码注册公钥)。
- ④ 素材:multipart 上传 + 签名直链下载(大文件不走 WSS)。
## 5. 后台常驻方案(Windows)
- **开机自启**:安装时写注册表 HKCU Run。
- **最小化到托盘**:H.NotifyIcon.WinUI / Win32 Shell_NotifyIcon。
- **进程模型**:WinUI 主进程(UI)spawn agent-core 子进程(随机端口+token);主进程做 watchdog——心跳检测、崩溃自拉起、3 次失败弹窗提示。
- **断线自愈**:core 内 WSS 指数退避重连(1s/5s/15s/60s)。
- **二期**:core 抽离为 Windows 服务(kardianos/service),支持无 UI 部署与客户 VPS 形态。
## 6. 开发日计划(1 人 + AI,顺序开发,D1-D13 + 2 天缓冲)
### 阶段一 网站端(D1-D7)
| 日 | 任务 | 验收标准 |
|---|---|---|
| D1 | 预览与工程化:starter 跑通 → 依赖升级评估(Vite2→5/TS4.8→5) → 清理示例页与 mock → 按页面清单搭菜单/路由空壳;Go 后端初始化(health/配置/DB/Redis) | dev 无报错、菜单空壳可点、/health 200、DB 连上 |
| D2 | 认证与工作区 API:Argon2 登录/refresh 轮换/登出(2FA 代码留位默认关)、成员/邀请/角色、审计埋点 | 单测过;前端登录页真实登录 |
| D3 | 业务 API:账号台账(bind→challenge)、素材(multipart+签名直链+sha256)、任务 CRUD+状态机+排期、审核动作、通知 | 单测+接口文档;curl 全接口可跑 |
| D4 | WSS 网关(hello 验签/心跳/断线、task.push/ack/result、challenge 双向) + 假执行器脚本 + 前端实时推送 | localhost 假执行器闭环:任务→下发→执行→回传→页面变绿,<300ms |
| D5 | 页面①:登录、仪表盘、成员、设置 | 页面与真实 API 联通 |
| D6 | 页面②:素材库、账号台账+绑定挑战弹窗、任务列表+新建+排期日历 | 全流程可点通(与假执行器) |
| D7 | 页面③:审核中心、挑战中心(QR 本地渲染+验证码)、通知、审计 + admin(租户列表/Agent 总览) | 角色权限正确、admin 入口可用 |
> **检查点①(暂停)**:D7 完成后暂停目标 → 执行网页端手动测试(§7 第 1-5 项 + 全页面冒烟)→ 输出测试报告 → 等待用户确认通过后再进入阶段二。
### 阶段二 客户端(D8-D11)
| 日 | 任务 | 验收标准 |
|---|---|---|
| D8 | agent-core(Go):WSS 客户端(重连/幂等)、凭据保险库(加密)、执行器框架、代理配置、挑战处理 + 假平台执行器 | core 单测过;与服务器假执行闭环 |
| D9 | WinUI 3 壳:托盘、配对引导、扫码/挑战窗口、状态页;localhost 调 core;开机自启+watchdog;打包脚本 | Windows 实机:安装→配对→假任务→回传 |
| D10 | 真实平台:B站(投稿协议,无浏览器)先行 | B站真实发布成功 |
| D11 | 抖音/快手/小红书(go-rod CDP:系统 Chrome、独立档案、指纹、代理绑定;参考 social-auto-upload) | 三平台真实发布+截图回执(可先交付可跑子集) |
> **检查点②(暂停)**:D11 完成后暂停目标 → 打包并交付用户测试(附测试清单)→ 等待用户确认测试通过后再进入阶段三联调。
### 阶段三 联调与交付(D12-D13)
| 日 | 任务 | 验收标准 |
|---|---|---|
| D12 | 内网联调+异常注入:断线重连/重复任务/登录过期挑战/失败退避;延迟基线 | 验收清单全过 |
| D13 | 打包(安装器+自动更新)、内部试用、修复、部署手册 | 新机安装走通、交付物齐 |
| D14-15 | 缓冲(主要给平台逆向) | — |
## 7. 最终验收清单
1. 登录/刷新/登出/角色权限正常(2FA 默认关)。
2. 任务全生命周期:草稿→审核→排期→队列→执行→成功/失败→重试。
3. 任务下发 <300ms;断线重连 <10s 恢复;同任务不重复执行(幂等)。
4. 挑战全流程:扫码/验证码/APP确认/超时挂起/一键重发。
5. 素材:上传、签名直链下载、sha256 校验。
6. 四平台真实发布成功 + 回执截图入库。
7. Windows 新机:安装→配对→绑定账号→真实发布。
8. 凭据不出本机;审计日志完整。
9. 安装包 + 自动更新可用。
## 8. 交付物清单
- 代码:web/(网页端)、server/(Go 服务器)、client/(WinUI+agent-core)。
- 文档:docs/prd.md(需求)、docs/tech-stack.md(技术栈)、docs/system-design.md(设计)、docs/logic-diagrams.md(逻辑图)、docs/page-wireframes.md(页面线框图)、docs/frontend-guide.md(前端指南)、本交付文档(排期)、部署手册、验收报告。
- 工具:tools/diag-connection.mjs 联调诊断。
## 9. 风险与应对
| 风险 | 应对 |
|---|---|
| starter 依赖过旧(Vite2/TS4.8) | D1 升级评估,必要则升 Vite5+TS5,锁定 LTS Node |
| 平台逆向不可预测 | D14-15 缓冲;B站先行;卡住降级为可跑子集 |
| WinUI 托盘无官方控件 | H.NotifyIcon.WinUI 或 Win32 interop(D9 前验证) |
| 系统 Chrome 版本兼容 | go-rod 用 CDP,绑定系统 Edge 兜底 |