559 lines
28 KiB
Markdown
559 lines
28 KiB
Markdown
---
|
||
title: "feat: GEO Platform Monetization Closed Loop"
|
||
type: feat
|
||
status: completed
|
||
date: "2026-05-31"
|
||
origin: docs/brainstorms/2026-05-31-geo-next-phase-core-flow-repair-requirements.md
|
||
secondary-origin: docs/brainstorms/2026-05-31-geo-platform-monetization-closed-loop-requirements.md
|
||
---
|
||
|
||
## Summary
|
||
|
||
修复 GEO 诊断系统(当前空输入=0 分)、建设免费 GEO 健康分获客入口、接入真实支付与功能限制、添加 AI 内容生成能力、打通内容分发与效果归因闭环,实现从获客到续费的完整商业变现链路。同时用 API 契约测试驱动核心功能修复,辅以少量 E2E 烟雾测试验证关键用户路径。
|
||
|
||
## Problem Frame
|
||
|
||
GEO 平台已具备 8 个 Agent、6 维度诊断框架、内容 Pipeline、知识库 RAG 等模块,但三个致命问题阻断了变现闭环:(1) 诊断系统使用空输入调用,永远返回 0 分,产品核心价值为零;(2) 内容 Pipeline 只做格式化不生成内容,核心付费功能缺失;(3) 支付是模拟的,没有功能限制,用户无付费动力。此外,Onboarding 缺少付费墙触发点、分发没有实际发布集成、监控没有归因逻辑、邮件服务未接入业务系统——各模块存在但互不连通。
|
||
|
||
## Requirements
|
||
|
||
Origin: `docs/brainstorms/2026-05-31-geo-next-phase-core-flow-repair-requirements.md`
|
||
|
||
- R1. 修复诊断系统:实现自动数据采集,让诊断产出非零有差异的评分 → U1
|
||
- R2. 添加 AI 内容生成阶段:在 ContentPipeline 前端添加 Stage 0 → U5
|
||
- R3. 接入真实支付:微信支付+支付宝+功能限制中间件 → U4
|
||
- R4. 建设免费 GEO 健康分公开页面 → U2
|
||
- R5. 重设计 Onboarding 流程,嵌入付费墙触发点 → U3
|
||
- R6. 执行闭环:内容分发集成微信/知乎/头条 → U5
|
||
- R7. 效果归因系统 → U6
|
||
- R8. 为诊断 API 编写契约测试 → U1
|
||
- R9. 为公开健康分 API 编写契约测试 → U2
|
||
- R10. 为内容生成 API 编写契约测试 → U5
|
||
- R11. 为支付 API 编写契约测试 → U4
|
||
- R12. 编写跨步骤集成测试 → U8
|
||
- R13. 编写获客路径 E2E 烟雾测试 → U9
|
||
- R14. 编写核心流程 E2E 烟雾测试 → U9
|
||
- R15. 完成后端测试目录统一验证 → U8
|
||
- R16. 建立共享 fixture 体系 → U8
|
||
|
||
## Key Technical Decisions
|
||
|
||
KTD-1. **诊断自动数据采集采用"AI 平台查询+CitationRecord 分析"双通道方案(V1 跳过网站爬取)。** 通过调用现有 AI 平台适配器查询品牌关键词分析引用情况,通过分析已有 CitationRecord 数据聚合引用指标。网站爬取通道留待 V2 迭代,降低首版复杂度。AI 平台查询填充"引用就绪度"维度,CitationRecord 分析填充"E-E-A-T/主题权威"维度,品牌官网 URL 解析填充"内容可提取性/Schema 标记"维度(基于简单 HTTP GET + HTML 解析,非完整爬取)。
|
||
|
||
KTD-2. **免费 GEO 健康分页面为独立公开页面,不依赖现有 Dashboard。** 新建 `/health-score` 路由,无需认证即可访问。结果缓存 24 小时(按品牌名+竞品哈希),避免重复查询消耗 API 额度。
|
||
|
||
KTD-3. **支付集成采用微信支付+支付宝双通道。** 使用官方 SDK,后端实现支付回调 Webhook 处理订阅状态更新。
|
||
|
||
KTD-4. **AI 内容生成集成到现有 ContentPipeline 前端。** 在 Stage 1(RuleValidator) 之前添加 Stage 0(AI Generator),基于诊断结果+RAG 知识库+LLM 生成初稿,后续阶段不变。
|
||
|
||
KTD-5. **效果归因采用"内容发布时间窗口+引用变化关联"方案。** 发布内容时记录时间戳和基线引用数据,2-4 周内定期检查引用变化。
|
||
|
||
KTD-6. **微信公众号采用半自动模式。** 生成内容+格式化+一键复制,用户手动粘贴到公众号编辑器。知乎和头条利用 API 实现自动发布。
|
||
|
||
KTD-7. **API 契约测试驱动修复,E2E 仅做烟雾测试。** 每个核心 API 先写契约测试定义期望行为,再修复实现。E2E 只覆盖 2 个最关键路径(获客+核心流程),不追求全面覆盖。
|
||
|
||
## High-Level Technical Design
|
||
|
||
```mermaid
|
||
flowchart TB
|
||
subgraph Phase1["Phase 1: 核心价值修复 + 契约测试"]
|
||
A[品牌名输入] --> B[自动数据采集]
|
||
B --> B1[AI平台查询]
|
||
B --> B2[CitationRecord分析]
|
||
B1 & B2 --> C[GEO诊断引擎]
|
||
C --> D[6维度评分]
|
||
D --> T1[诊断API契约测试]
|
||
end
|
||
|
||
subgraph Phase2["Phase 2: 获客入口 + 契约测试"]
|
||
D --> E[免费健康分页面]
|
||
E --> F{查看详细建议?}
|
||
F -->|免费概要| G[注册]
|
||
F -->|完整分析| G
|
||
G --> H{执行优化?}
|
||
H -->|升级付费| I[订阅支付]
|
||
E --> T2[健康分API契约测试]
|
||
end
|
||
|
||
subgraph Phase3["Phase 3: 执行闭环 + 契约测试"]
|
||
I --> J[AI内容生成]
|
||
J --> K[人工审核]
|
||
K --> L[发布到平台]
|
||
L --> M[效果归因追踪]
|
||
M --> N[ROI报告]
|
||
N --> O[续费/升级]
|
||
J --> T3[内容生成API契约测试]
|
||
I --> T4[支付API契约测试]
|
||
end
|
||
|
||
subgraph Phase4["Phase 4: 集成验证"]
|
||
T1 & T2 & T3 & T4 --> T5[跨步骤集成测试]
|
||
T5 --> T6[E2E烟雾测试]
|
||
end
|
||
```
|
||
|
||
## Implementation Units
|
||
|
||
### U1. GEO 诊断自动数据采集与修复
|
||
|
||
**Goal:** 修复当前诊断系统(空输入=0 分),实现自动数据采集填充 GEODiagnosisInput,让诊断产出真实有价值的分数。
|
||
|
||
**Requirements:** R1, R8
|
||
|
||
**Dependencies:** 无
|
||
|
||
**Files:**
|
||
- `backend/app/services/diagnosis/geo_diagnosis.py` — 修改诊断服务,添加自动数据采集
|
||
- `backend/app/services/diagnosis/data_collector.py` — 新建自动数据采集服务
|
||
- `backend/app/api/diagnosis.py` — 修改 API 端点,支持自动采集+异步诊断
|
||
- `backend/app/schemas/diagnosis.py` — 新建诊断请求/响应 schema
|
||
- `backend/app/models/diagnosis_record.py` — 新建诊断历史记录模型
|
||
- `backend/tests/test_api/test_diagnosis_contract.py` — 新建诊断 API 契约测试
|
||
- `backend/tests/test_services/test_data_collector.py` — 新建数据采集服务测试
|
||
|
||
**Approach:**
|
||
1. 新建 `DataCollectorService`,两个采集通道(V1):
|
||
- AI 平台查询通道:复用现有 `ai_engine` 适配器,查询品牌相关关键词,分析引用情况填充"引用就绪度"维度
|
||
- 历史数据通道:从 CitationRecord 聚合已有引用数据,填充"E-E-A-T/主题权威"维度
|
||
- 品牌官网解析:简单 HTTP GET + HTML 解析(检查 Schema 标记、标题层级等),填充"内容可提取性/Schema 标记"维度
|
||
2. 修改 `GEODiagnosisService.diagnose()` 接受 `DataCollectorOutput` 作为输入
|
||
3. 修改诊断 API 端点:`POST /api/v1/diagnosis/geo/{brand_id}` 触发异步诊断,`GET /api/v1/diagnosis/geo/{brand_id}/result` 轮询结果
|
||
4. 诊断结果持久化到 `diagnosis_records` 表,支持历史对比
|
||
5. 免费版返回综合分+3 核心维度,付费版返回全部 6 维度
|
||
6. **先写契约测试**:定义诊断 API 的期望行为(非零评分、维度结构、免费/付费差异),再修复实现
|
||
|
||
**Execution note:** 先写诊断 API 契约测试(红色),再实现 DataCollectorService 和修改诊断服务(绿色)。
|
||
|
||
**Patterns to follow:**
|
||
- 复用 `backend/app/services/ai_engine/` 下的平台适配器
|
||
- 复用 `backend/app/workers/citation_engine.py` 的查询执行模式
|
||
- 异步任务模式参考 `backend/app/services/detection/detection_scheduler.py`
|
||
- 契约测试参考 `backend/tests/conftest.py` 中的 async_client fixture
|
||
|
||
**Test scenarios:**
|
||
- 输入有效品牌名,自动采集数据并返回非零诊断分数
|
||
- 输入不存在的品牌名,返回低分但非零(基于 AI 平台查询结果)
|
||
- 免费用户请求诊断,只返回 3 个核心维度
|
||
- 付费用户请求诊断,返回全部 6 维度
|
||
- 同一品牌 24 小时内重复请求,返回缓存结果
|
||
- 诊断结果持久化,第二次诊断可展示历史对比
|
||
- 契约测试:POST /api/v1/diagnosis/geo/{brand_id} 返回 202 + task_id
|
||
- 契约测试:GET /api/v1/diagnosis/geo/{brand_id}/result 返回非零 overall_score
|
||
|
||
**Verification:** 调用 `POST /api/v1/diagnosis/geo/{brand_id}` 返回真实非零评分,且不同品牌评分有差异。契约测试全部通过。
|
||
|
||
---
|
||
|
||
### U2. 免费 GEO 健康分公开页面
|
||
|
||
**Goal:** 建设无需注册即可访问的 GEO 健康分页面,作为获客和市场教育的核心入口。
|
||
|
||
**Requirements:** R4, R9
|
||
|
||
**Dependencies:** U1
|
||
|
||
**Files:**
|
||
- `frontend/app/(public)/health-score/page.tsx` — 新建公开健康分页面
|
||
- `frontend/app/(public)/health-score/components/ScoreCard.tsx` — 评分卡片组件
|
||
- `frontend/app/(public)/health-score/components/CompetitorComparison.tsx` — 竞品对比组件
|
||
- `frontend/app/(public)/health-score/components/ShareButton.tsx` — 分享按钮组件
|
||
- `frontend/lib/api/health-score.ts` — 健康分 API 客户端
|
||
- `backend/app/api/health_score.py` — 新建公开健康分 API(无需认证)
|
||
- `backend/app/schemas/health_score.py` — 健康分响应 schema
|
||
- `backend/tests/test_api/test_health_score_contract.py` — 新建健康分 API 契约测试
|
||
|
||
**Approach:**
|
||
1. 新建公开路由 `/health-score`,无需登录即可访问
|
||
2. 页面核心交互:输入品牌名 → 30 秒内展示 GEO 健康分报告
|
||
3. 报告内容:综合评分(大数字+健康等级色标)、3 核心维度雷达图、3 竞品对比柱状图、最严重 3 个问题概要
|
||
4. "查看详细修复建议"按钮 → 触发注册弹窗
|
||
5. 注册后自动关联本次诊断结果到用户账户
|
||
6. 支持生成可分享链接(含品牌名参数)和 PDF 下载
|
||
7. 后端:`GET /api/v1/public/health-score?brand=XXX` 无需认证,返回免费版诊断结果
|
||
8. 结果缓存 24 小时(Redis),避免重复查询
|
||
|
||
**Patterns to follow:**
|
||
- 前端页面参考 `frontend/app/(dashboard)/onboarding/Step4HealthReport.tsx` 的报告展示模式
|
||
- API 参考 `backend/app/api/diagnosis.py` 但无需认证
|
||
- 分享功能参考 `backend/app/api/reports.py` 的 PDF 生成
|
||
|
||
**Test scenarios:**
|
||
- 未登录用户输入品牌名,30 秒内看到健康分报告
|
||
- 报告包含综合评分、3 维度、3 竞品对比
|
||
- 点击"查看详细建议"弹出注册弹窗
|
||
- 注册后诊断结果自动关联到账户
|
||
- 生成可分享链接,他人打开看到相同报告
|
||
- 24 小时内重复查询同一品牌返回缓存结果
|
||
- 契约测试:GET /api/v1/public/health-score?brand=XXX 返回 200 + 非零评分
|
||
- 契约测试:无品牌名参数返回 422
|
||
|
||
**Verification:** 未登录状态下访问 `/health-score`,输入品牌名后看到完整报告且可分享。契约测试通过。
|
||
|
||
---
|
||
|
||
### U3. Onboarding 重设计与转化层
|
||
|
||
**Goal:** 重设计 Onboarding 流程以"查看 GEO 健康分"为第一步,嵌入付费墙触发点。
|
||
|
||
**Requirements:** R5
|
||
|
||
**Dependencies:** U1, U2
|
||
|
||
**Files:**
|
||
- `frontend/app/(dashboard)/onboarding/page.tsx` — 重写 Onboarding 主页面
|
||
- `frontend/app/(dashboard)/onboarding/Step0HealthScore.tsx` — 新建第一步:健康分
|
||
- `frontend/app/(dashboard)/onboarding/Step1BrandName.tsx` — 修改为简化版
|
||
- `frontend/app/(dashboard)/onboarding/Step4HealthReport.tsx` — 修改为含升级提示
|
||
- `frontend/app/(dashboard)/onboarding/Step5ActionSuggestions.tsx` — 修改为含执行按钮+付费墙
|
||
- `frontend/components/subscription/UpgradePrompt.tsx` — 新建升级提示组件
|
||
|
||
**Approach:**
|
||
1. 新流程:Step0(输入品牌名看健康分) → Step1(注册/登录) → Step2(补充竞品信息) → Step3(查看详细报告+升级提示) → Step4(行动建议+执行按钮)
|
||
2. Step0 直接复用 U2 的健康分页面组件,嵌入 Onboarding 流程
|
||
3. 在以下场景嵌入升级提示:
|
||
- 查看详细 6 维度分析时 → "升级 Pro 版查看完整分析"
|
||
- 点击执行优化建议时 → "升级 Starter 版开始优化"
|
||
- 查看效果归因报告时 → "升级 Pro 版追踪优化效果"
|
||
4. 升级提示组件 `UpgradePrompt` 统一管理,显示当前套餐限制和升级收益
|
||
|
||
**Patterns to follow:**
|
||
- 现有 Onboarding 步骤组件模式(Step1-5 的 props 接口)
|
||
- `useOnboardingData` hook 的数据管理模式
|
||
|
||
**Test scenarios:**
|
||
- 新用户进入 Onboarding,第一步看到健康分输入框
|
||
- 输入品牌名后看到免费健康分报告
|
||
- 注册后继续 Onboarding,看到详细报告含升级提示
|
||
- 免费用户点击"执行优化"时看到升级弹窗
|
||
- 已完成 Onboarding 的用户不再看到引导
|
||
|
||
**Verification:** 新用户从健康分开始 Onboarding,在关键节点看到升级提示。
|
||
|
||
---
|
||
|
||
### U4. 真实支付集成与功能限制
|
||
|
||
**Goal:** 接入微信支付+支付宝,实现功能限制中间件,让付费真正生效。
|
||
|
||
**Requirements:** R3, R11
|
||
|
||
**Dependencies:** U3
|
||
|
||
**Files:**
|
||
- `backend/app/services/payment/wechat_pay.py` — 新建微信支付服务
|
||
- `backend/app/services/payment/alipay.py` — 新建支付宝服务
|
||
- `backend/app/services/payment/base.py` — 新建支付基类
|
||
- `backend/app/api/payments.py` — 新建支付 API 端点
|
||
- `backend/app/middleware/subscription_enforcement.py` — 新建功能限制中间件
|
||
- `backend/app/services/subscription.py` — 修改添加真实支付逻辑
|
||
- `backend/app/api/subscriptions.py` — 修改添加支付 Webhook
|
||
- `backend/app/models/subscription.py` — 修改添加支付相关字段
|
||
- `backend/tests/test_api/test_payment_contract.py` — 新建支付 API 契约测试
|
||
- `backend/tests/test_services/test_payment.py` — 新建支付服务测试
|
||
|
||
**Approach:**
|
||
1. 支付基类定义统一接口:`create_order`, `verify_callback`, `refund`
|
||
2. 微信支付:使用官方 SDK,实现 JSAPI 支付(H5 页面)和 Native 支付(扫码)
|
||
3. 支付宝:使用官方 SDK,实现手机网站支付
|
||
4. 支付 Webhook:`POST /api/v1/payments/callback/wechat` 和 `/alipay`,验证签名后更新订阅状态
|
||
5. 功能限制中间件:在 API 路由层检查用户套餐,超限返回 403+升级提示
|
||
6. 限制维度:查询数/品牌数/诊断频率/内容生成数/知识库数/数据保留期
|
||
7. **先写契约测试**:定义支付 API 的期望行为(创建订单、回调处理、功能限制)
|
||
|
||
**Execution note:** 先写支付 API 契约测试(红色),再实现支付服务(绿色)。
|
||
|
||
**Patterns to follow:**
|
||
- 支付回调参考 `backend/app/api/auth.py` 的 Webhook 处理模式
|
||
- 功能限制参考 `backend/app/middleware/rate_limit.py` 的中间件模式
|
||
- 订阅逻辑复用 `backend/app/services/subscription.py` 的 PLANS 配置
|
||
|
||
**Test scenarios:**
|
||
- 创建支付订单,返回支付链接/二维码
|
||
- 支付成功回调,订阅状态更新为 active
|
||
- 免费用户超出查询限制,返回 403+升级提示
|
||
- Pro 用户在限制内正常使用
|
||
- 支付失败回调,订阅状态不变
|
||
- 订阅到期,自动降级为免费版
|
||
- 契约测试:POST /api/v1/payments/orders 返回 201 + order_id + pay_url
|
||
- 契约测试:POST /api/v1/payments/callback/wechat 验证签名后更新订阅
|
||
|
||
**Verification:** 完整支付流程:创建订单→支付→回调→订阅激活→功能解锁。契约测试通过。
|
||
|
||
---
|
||
|
||
### U5. AI 内容生成与分发集成
|
||
|
||
**Goal:** 在 ContentPipeline 前端添加 AI 生成阶段,集成知乎/头条 API 发布和微信半自动发布。
|
||
|
||
**Requirements:** R2, R6, R10
|
||
|
||
**Dependencies:** U1, U4
|
||
|
||
**Files:**
|
||
- `backend/app/services/content/ai_generator.py` — 新建 AI 内容生成服务
|
||
- `backend/app/services/content/content_pipeline.py` — 修改添加 Stage 0
|
||
- `backend/app/services/distribution/publishers/zhihu_publisher.py` — 新建知乎发布器
|
||
- `backend/app/services/distribution/publishers/toutiao_publisher.py` — 新建头条发布器
|
||
- `backend/app/services/distribution/publishers/wechat_publisher.py` — 新建微信半自动发布器
|
||
- `backend/app/services/distribution/publish_engine.py` — 新建发布引擎
|
||
- `backend/app/api/distribution.py` — 修改添加发布 API
|
||
- `backend/tests/test_api/test_content_contract.py` — 新建内容生成 API 契约测试
|
||
- `backend/tests/test_services/test_ai_generator.py` — 新建 AI 生成测试
|
||
- `backend/tests/test_services/test_publishers.py` — 新建发布器测试
|
||
|
||
**Approach:**
|
||
1. AI 内容生成服务:
|
||
- 输入:诊断结果(问题维度)+ RAG 知识库上下文 + 目标关键词 + 目标平台
|
||
- 调用 LLM 生成初稿,基于诊断结果针对性优化
|
||
- 输出传入现有 Pipeline(RuleValidator → SensitiveFilter → SEOOptimizer → HTMLGenerator)
|
||
2. 发布引擎:
|
||
- 知乎:通过知乎创作中心 API 发布文章(需 OAuth 授权)
|
||
- 头条:通过头条号 API 发布文章(需 API Key)
|
||
- 微信:生成格式化内容+复制引导,不直接调用 API
|
||
3. 发布流程:AI 生成 → 人工预览/编辑 → 确认发布 → 调用对应 Publisher → 记录发布状态
|
||
4. 发布记录关联到 Content 模型,用于后续归因
|
||
|
||
**Patterns to follow:**
|
||
- AI 生成参考 `backend/app/services/content/content_generation_service.py` 的 LLM 调用模式
|
||
- RAG 集成参考 `backend/app/services/knowledge/rag_service.py`
|
||
- 平台规则复用 `backend/app/services/distribution/platform_rules.py`
|
||
- Publisher 模式参考 `backend/app/services/ai_engine/` 的适配器模式
|
||
|
||
**Test scenarios:**
|
||
- 基于诊断结果+知识库上下文生成针对性优化内容
|
||
- 生成内容通过 Pipeline 校验(RuleValidator + SensitiveFilter)
|
||
- 知乎 API 发布成功,返回文章 URL
|
||
- 头条 API 发布成功,返回文章 URL
|
||
- 微信半自动模式生成格式化内容+复制引导
|
||
- 发布记录保存到 Content 模型,状态为 published
|
||
- 契约测试:POST /api/v1/content/generate 返回 201 + content_id + 生成内容
|
||
|
||
**Verification:** 从诊断建议到内容生成到发布的完整流程可走通。契约测试通过。
|
||
|
||
---
|
||
|
||
### U6. 效果归因系统与 ROI 报告
|
||
|
||
**Goal:** 建设效果归因系统,追踪已发布内容的 AI 引用变化,生成 ROI 报告证明付费价值。
|
||
|
||
**Requirements:** R7
|
||
|
||
**Dependencies:** U5
|
||
|
||
**Files:**
|
||
- `backend/app/services/attribution/attribution_engine.py` — 新建归因引擎
|
||
- `backend/app/services/attribution/roi_calculator.py` — 新建 ROI 计算器
|
||
- `backend/app/api/attribution.py` — 新建归因 API
|
||
- `backend/app/models/attribution_record.py` — 新建归因记录模型
|
||
- `backend/app/services/monitoring/monitor_service.py` — 修改集成归因
|
||
- `frontend/app/(dashboard)/dashboard/roi/page.tsx` — 新建 ROI 报告页面
|
||
- `frontend/lib/api/attribution.ts` — 新建归因 API 客户端
|
||
- `backend/tests/test_services/test_attribution.py` — 新建归因测试
|
||
|
||
**Approach:**
|
||
1. 归因引擎核心逻辑:
|
||
- 内容发布时记录:发布时间、目标关键词、发布前基线引用数据
|
||
- 定期(每 3 天)检查目标关键词的引用变化
|
||
- 归因判定:引用率上升 + 新引用内容与已发布内容语义相关 → 归因为该内容贡献
|
||
- 归因窗口:2-4 周,窗口内持续追踪
|
||
2. ROI 计算器:输入订阅费用+归因引用提升+行业平均引用价值,输出 GEO ROI 百分比
|
||
3. A/B 对比报告:优化前诊断分数 vs 当前诊断分数,按维度对比
|
||
4. 效果保障:如果 2-4 周内无任何引用提升,提供额外优化建议或延长服务
|
||
|
||
**Patterns to follow:**
|
||
- 监控模式参考 `backend/app/services/monitoring/monitor_service.py`
|
||
- 定期任务参考 `backend/app/services/detection/detection_scheduler.py`
|
||
- 报告生成参考 `backend/app/api/reports.py`
|
||
|
||
**Test scenarios:**
|
||
- 发布内容后自动创建归因追踪记录
|
||
- 3 天后检查引用变化,记录 delta
|
||
- 引用率上升且语义相关,归因为该内容贡献
|
||
- 归因窗口结束后生成 ROI 报告
|
||
- 优化前后 A/B 对比报告展示各维度变化
|
||
- 无引用提升时提供额外优化建议
|
||
|
||
**Verification:** 发布内容→2-4 周后→归因报告展示引用提升和 ROI。
|
||
|
||
---
|
||
|
||
### U7. 邮件集成与 Dashboard 变现 UI
|
||
|
||
**Goal:** 将 EmailService 接入业务系统(周报、续费提醒),Dashboard 添加订阅状态、用量进度、ROI 面板。
|
||
|
||
**Requirements:** R7 (邮件部分)
|
||
|
||
**Dependencies:** U4, U6
|
||
|
||
**Files:**
|
||
- `backend/app/services/email_service.py` — 修改添加新模板
|
||
- `backend/app/services/email/email_scheduler.py` — 新建邮件调度器
|
||
- `backend/app/templates/geo_weekly_report.html` — 新建周报模板
|
||
- `backend/app/templates/renewal_reminder.html` — 新建续费提醒模板
|
||
- `backend/app/templates/trial_expiring.html` — 新建试用期到期模板
|
||
- `frontend/app/(dashboard)/dashboard/page.tsx` — 修改添加变现 UI
|
||
- `frontend/components/subscription/SubscriptionStatus.tsx` — 新建订阅状态组件
|
||
- `frontend/components/subscription/UsageProgress.tsx` — 新建用量进度组件
|
||
- `frontend/components/dashboard/ROICard.tsx` — 新建 ROI 卡片组件
|
||
|
||
**Approach:**
|
||
1. 邮件模板新增:GEO 变化周报、续费提醒(到期前 7 天/3 天/1 天)、试用期到期提醒、欢迎邮件
|
||
2. 邮件调度器:APScheduler 定时任务,每周一发送周报,每日检查续费提醒
|
||
3. Dashboard 变现 UI:顶部订阅状态栏、用量进度条、ROI 卡片、功能锁定 UI
|
||
4. 配置真实 SMTP(支持 SendGrid/阿里云邮件推送)
|
||
|
||
**Patterns to follow:**
|
||
- 邮件模板参考 `backend/app/services/email_service.py` 现有模板格式
|
||
- Dashboard 组件参考 `frontend/app/(dashboard)/dashboard/page.tsx` 的 KPI 卡片模式
|
||
- 订阅状态参考 `backend/app/services/subscription.py` 的 PLANS 配置
|
||
|
||
**Test scenarios:**
|
||
- 每周一自动发送 GEO 变化周报给注册用户
|
||
- 订阅到期前 7 天发送续费提醒
|
||
- 试用期到期前 3 天发送提醒
|
||
- Dashboard 显示当前套餐和用量进度
|
||
- 超出用量时显示升级提示
|
||
- ROI 卡片展示引用率提升和归因内容
|
||
|
||
**Verification:** 注册用户收到周报邮件,Dashboard 显示订阅状态和 ROI 数据。
|
||
|
||
---
|
||
|
||
### U8. API 契约集成测试与测试基础设施
|
||
|
||
**Goal:** 编写跨步骤集成测试验证完整链路,完成后端测试基础设施统一。
|
||
|
||
**Requirements:** R12, R15, R16
|
||
|
||
**Dependencies:** U1, U2, U4, U5
|
||
|
||
**Files:**
|
||
- `backend/tests/test_integration/test_monetization_flow.py` — 新建变现闭环集成测试
|
||
- `backend/tests/conftest.py` — 增强 fixture 体系
|
||
- `backend/tests/fixtures/auth.py` — 新建认证 fixture 模块
|
||
- `backend/tests/fixtures/database.py` — 新建数据库 fixture 模块
|
||
- `backend/tests/fixtures/client.py` — 新建 httpx 客户端 fixture 模块
|
||
- `backend/tests/fixtures/brands.py` — 新建品牌测试数据 fixture 模块
|
||
|
||
**Approach:**
|
||
1. 编写跨步骤集成测试:品牌创建→诊断→方案→内容生成→效果追踪的完整链路
|
||
2. 验证 U1-U5 的 API 契约测试在集成场景下仍然通过
|
||
3. 完成后端测试目录统一验证(原 QA 计划 U1)
|
||
4. 建立共享 fixture 体系:按领域拆分到 `backend/tests/fixtures/` 下
|
||
- auth.py:override_get_current_user、auth_token、auth_headers
|
||
- database.py:async_engine、async_session(含自动 rollback)
|
||
- client.py:async_client(httpx AsyncClient with app)
|
||
- brands.py:预创建的测试品牌和竞品数据
|
||
5. conftest.py 通过 pytest plugin 机制自动加载 fixtures/ 下所有模块
|
||
|
||
**Patterns to follow:**
|
||
- `backend/tests/conftest.py` 现有 fixture 模式
|
||
- `backend/tests/test_integration/test_business_flow.py` 现有集成测试模式
|
||
|
||
**Test scenarios:**
|
||
- 品牌创建→诊断→方案→内容生成→效果追踪全链路通过
|
||
- 数据在步骤间正确传递(品牌 ID、诊断结果 ID、内容 ID)
|
||
- 共享 fixture 可被其他测试复用
|
||
- 数据库 fixture 在测试结束后自动 rollback
|
||
- 多个测试并行运行时 fixture 互不干扰
|
||
|
||
**Verification:** `cd backend && pytest tests/test_integration/test_monetization_flow.py --tb=short` 通过。`cd backend && pytest tests/ -q` 全部测试被发现且无新增失败。
|
||
|
||
---
|
||
|
||
### U9. E2E 烟雾测试
|
||
|
||
**Goal:** 编写 2 个关键路径的 Playwright E2E 烟雾测试,验证最核心的用户路径端到端可用。
|
||
|
||
**Requirements:** R13, R14
|
||
|
||
**Dependencies:** U2, U3
|
||
|
||
**Files:**
|
||
- `frontend/e2e/tests/health-score-smoke.spec.ts` — 新建获客路径烟雾测试
|
||
- `frontend/e2e/tests/core-flow-smoke.spec.ts` — 新建核心流程烟雾测试
|
||
|
||
**Approach:**
|
||
1. 获客路径烟雾测试:访问健康分页面→输入品牌名→看到报告→点击注册
|
||
2. 核心流程烟雾测试:登录→创建品牌→触发诊断→查看诊断结果
|
||
3. 使用独立 setup(直接调用 API 创建测试数据),不依赖共享 fixture
|
||
4. 确保截图和视频录制配置正确(screenshot:on-failure, video:retain-on-failure)
|
||
|
||
**Patterns to follow:**
|
||
- `frontend/e2e/tests/login.spec.ts` 现有 E2E 测试模式
|
||
- `frontend/e2e/pages/login.page.ts` Page Object 模式
|
||
|
||
**Test scenarios:**
|
||
- 获客路径:未登录→访问 /health-score→输入品牌名→30 秒内看到报告→点击注册→注册弹窗出现
|
||
- 核心流程:登录→创建品牌→品牌出现在 Dashboard→触发诊断→诊断结果非零
|
||
- 测试失败时自动截图保存
|
||
|
||
**Verification:** `cd frontend && npx playwright test health-score-smoke core-flow-smoke` 通过。
|
||
|
||
## Scope Boundaries
|
||
|
||
**Deferred for later:**
|
||
|
||
- 网站爬取通道(诊断数据采集 V2)
|
||
- 全面 E2E 测试覆盖(原 QA 计划 U3/U4/U5 → 上线后逐步扩展)
|
||
- 性能基线测试(原 QA 计划 U7 → 上线后有真实负载后建立)
|
||
- CI 安全扫描(原 QA 计划 U8 → 上线后集成)
|
||
- Alembic 迁移验证(原 QA 计划 U8 → 上线后添加)
|
||
- 前端组件测试(原 QA 计划 U10 → 上线后扩展)
|
||
- 行业 GEO 基准数据积累
|
||
- API 市场开放和第三方集成
|
||
- 白标报告和专属客户成功经理
|
||
- 多语言和国际 AI 平台支持
|
||
- 知识库自动构建(从品牌官网自动提取 GEO 相关信息结构)
|
||
- 批量内容生成(一次生成多平台内容)
|
||
- 内容日历和排期执行系统
|
||
|
||
**Outside this product's identity:**
|
||
|
||
- 传统 SEO 工具功能(关键词排名、外链分析等)
|
||
- 广告投放和营销自动化
|
||
- 社交媒体管理
|
||
- 基础设施级别的渗透测试
|
||
|
||
**Deferred to follow-up work:**
|
||
|
||
- E2E 测试迁移到共享 fixture(U9 完成后,将独立 setup 替换为 U8 的共享 fixture)
|
||
- 性能基线设定阈值和告警(上线后根据数据设定合理阈值)
|
||
- 跨浏览器 E2E 扩展(稳定 Chromium 后再扩展)
|
||
- 知乎/头条 API OAuth 授权完整流程
|
||
- 批量内容生成
|
||
|
||
## Open Questions
|
||
|
||
- 微信公众号 OAuth 授权流程的具体实现方案需在 U5 实施时确认
|
||
- 知乎和头条 API 的申请和审核周期可能影响 U5 的交付时间
|
||
- 诊断自动数据采集的品牌官网解析可能遇到反爬机制,需准备降级方案
|
||
- 真实 SMTP 配置需要用户提供邮件服务商账号信息
|
||
- 效果归因的具体技术实现方案(基于引用检测还是基于评分变化)
|
||
- 付费版定价是否需要调整(当前 ¥199/599/1999 是否匹配价值感知)
|
||
|
||
## Risks & Dependencies
|
||
|
||
| Risk | Impact | Mitigation |
|
||
|------|--------|------------|
|
||
| 诊断数据采集不准确 | 用户不信任健康分,获客失效 | 先用 AI 平台查询数据(已有适配器),品牌官网解析作为增强 |
|
||
| 微信/知乎/头条 API 审核不通过 | 分发集成延期 | 微信降级为半自动,知乎/头条备选手动发布 |
|
||
| 支付 SDK 集成复杂度超预期 | 付费闭环延期 | 先实现支付宝(文档更友好),微信支付后续迭代 |
|
||
| GEO 效果归因窗口内无可见提升 | 用户认为产品无效 | 提供效果保障机制,延长归因窗口或提供额外优化 |
|
||
| 免费诊断 API 调用成本过高 | 运营成本失控 | 24 小时缓存+频率限制+深度限制 |
|
||
| LLM API Key 不可用影响内容生成 | 核心付费功能不可用 | 支持多 LLM Provider 降级,至少保证一个可用 |
|
||
|
||
## Sources & Research
|
||
|
||
- Origin requirements: `docs/brainstorms/2026-05-31-geo-next-phase-core-flow-repair-requirements.md`
|
||
- Secondary origin: `docs/brainstorms/2026-05-31-geo-platform-monetization-closed-loop-requirements.md`
|
||
- QA plan (downscoped): `docs/plans/2026-05-31-002-test-quality-assurance-system-plan.md`
|
||
- Existing diagnosis system: `backend/app/services/diagnosis/geo_diagnosis.py`
|
||
- Diagnosis API root cause: `backend/app/api/diagnosis.py` line 75 (`GEODiagnosisInput()`)
|
||
- Existing content pipeline: `backend/app/services/content/content_pipeline.py`
|
||
- Existing distribution rules: `backend/app/services/distribution/platform_rules.py`
|
||
- Existing monitoring: `backend/app/services/monitoring/monitor_service.py`
|
||
- Existing subscription: `backend/app/services/subscription.py`
|
||
- Existing email: `backend/app/services/email_service.py`
|
||
- Existing E2E tests: `frontend/e2e/tests/`
|