404 lines
20 KiB
Markdown
404 lines
20 KiB
Markdown
---
|
||
title: "chore: GEO Platform Launch Sprint — Dual-Track to Billable Launch"
|
||
type: chore
|
||
status: completed
|
||
date: 2026-06-02
|
||
origin: docs/brainstorms/2026-06-02-geo-launch-sprint-requirements.md
|
||
---
|
||
|
||
# GEO Platform Launch Sprint — Dual-Track to Billable Launch
|
||
|
||
## Summary
|
||
|
||
双轨并行推进 GEO 平台到可收费上线状态:轨道A解决部署验证、生产环境配置和安全加固让系统可运行;轨道B并行建设完整测试体系、平台规则中心测试补全和支付SDK集成让系统可收费且质量有保障。研究阶段发现 R2/R3/R6 在代码层面已修复,转为验证确认;支付SDK当前为骨架状态需真实API接入。
|
||
|
||
## Problem Frame
|
||
|
||
GEO 平台核心功能开发已完成(8个AI Agent、6阶段内容管线、5维品牌评分、前端可视化),但从未作为完整产品端到端运行。6个现有计划中标记完成的关键事项实际未验证:生产环境配置缺失、支付为mock模式、测试体系大部分未建立、规则中心30个测试用例全部未完成。系统处于"代码写完但不可运行、不可收费、不可信赖"的状态。
|
||
|
||
---
|
||
|
||
## Requirements
|
||
|
||
**轨道A — 上线阻塞项**
|
||
|
||
- R1. Docker Compose一键启动成功,前后端均可访问,CORS配置正确
|
||
- R2. Dockerfile HEALTHCHECK端点验证通过(代码已修复为`/health`,需确认运行时行为)
|
||
- R3. `.env.test` JWT_SECRET验证可用(代码已配置,需确认测试环境运行正常)
|
||
- R4. 前端浏览器认证流程完整可用(注册→登录→token刷新→401处理)
|
||
- R5. 生产环境安全配置完整:Redis密码认证、PostgreSQL强密码、`.env.production`文件创建、生产镜像切换为pgvector
|
||
- R6. DateTime timezone验证通过(代码已全部使用`DateTime(timezone=True)`,需确认asyncpg运行时无报错)
|
||
- R7. 诊断评分非零场景验证通过,品牌健康评分计算逻辑正确
|
||
|
||
**轨道B — 功能完善项**
|
||
|
||
- R8. 后端测试目录统一,散落的测试文件迁移到标准目录结构
|
||
- R9. 共享fixture系统扩展,测试数据工厂可复用
|
||
- R10. E2E测试覆盖诊断-策略流程和内容-监控流程
|
||
- R11. CI集成E2E测试,性能基线建立
|
||
- R12. CI安全扫描和迁移验证集成
|
||
- R13. 测试文档更新
|
||
- R14. 平台规则中心RuleValidator、SensitiveFilter、SEOOptimizer、HTMLGenerator、ContentPipeline测试用例补全至30个
|
||
- R15. 微信支付和支付宝真实SDK集成,未配置时降级mock模式
|
||
- R16. 归因系统窗口可配置(当前硬编码28天),2-4周窗口验证通过
|
||
|
||
---
|
||
|
||
## Key Technical Decisions
|
||
|
||
- **生产PostgreSQL镜像切换为pgvector**: `docker-compose.prod.yml`使用`postgres:15-alpine`缺少pgvector扩展,切换为`pgvector/pgvector:pg15`以支持向量搜索功能 (see origin)
|
||
- **支付SDK集成策略**: 代码层面完成真实API调用集成,`_is_configured()`检测未配置时自动降级为MockGateway,SDK申请在功能验证后进行 (see origin)
|
||
- **测试体系在时区迁移验证后搭建**: R6验证通过后再开始R8-R13,避免测试数据因迁移失效 (see origin)
|
||
- **双轨并行而非顺序推进**: 轨道A和轨道B同时推进,速度优先但需协调交叉依赖 (see origin)
|
||
- **已有测试文件保留而非重写**: `test_content_pipeline/`已有6个测试文件,在其基础上补全至30个用例
|
||
|
||
---
|
||
|
||
## High-Level Technical Design
|
||
|
||
```mermaid
|
||
flowchart TB
|
||
subgraph TrackA["轨道A — 上线阻塞"]
|
||
U1[U1. Docker Compose部署验证] --> U2[U2. 生产环境安全配置]
|
||
U2 --> U3[U3. 浏览器认证流验证]
|
||
U3 --> U4[U4. DateTime/评分运行时验证]
|
||
end
|
||
|
||
subgraph TrackB["轨道B — 功能完善"]
|
||
U5[U5. 测试体系基础设施] --> U6[U6. E2E测试+CI集成]
|
||
U5 --> U7[U7. 规则中心测试补全]
|
||
U6 --> U8[U8. 支付SDK集成+归因窗口]
|
||
end
|
||
|
||
U4 -.->|验证通过| U5
|
||
U2 -.->|环境就绪| U6
|
||
```
|
||
|
||
---
|
||
|
||
## Implementation Units
|
||
|
||
### U1. Docker Compose Deployment Verification
|
||
|
||
**Goal:** 验证 Docker Compose 一键启动成功,前后端可访问,CORS配置正确
|
||
|
||
**Requirements:** R1, R2, R3
|
||
|
||
**Dependencies:** none
|
||
|
||
**Files:**
|
||
- `docker-compose.yml`
|
||
- `docker-compose.prod.yml`
|
||
- `backend/Dockerfile`
|
||
- `frontend/Dockerfile`
|
||
- `.env.example`
|
||
- `backend/.env.test`
|
||
- `backend/tests/test_infrastructure/test_docker_health.py`
|
||
|
||
**Approach:** 从 `.env.example` 创建 `.env` 文件,执行 `docker compose up --build`,验证所有服务启动成功。确认后端 `/health` 端点返回200,前端3000端口可访问,CORS头正确返回。验证 `.env.test` 中 JWT_SECRET 在测试环境中生效。生产docker-compose需切换PostgreSQL镜像为pgvector。
|
||
|
||
**Patterns to follow:** 现有 `docker-compose.yml` 开发环境配置模式
|
||
|
||
**Test scenarios:**
|
||
- Docker Compose up: 所有4个服务(backend, frontend, db, redis)启动成功,无错误日志
|
||
- Backend health: `GET /health` 返回200和健康状态JSON
|
||
- Frontend access: `GET http://localhost:3000` 返回200
|
||
- CORS headers: 开发模式允许所有来源,生产模式仅允许配置的来源
|
||
- JWT_SECRET in test: pytest运行时使用`.env.test`中的JWT_SECRET,认证fixture正常工作
|
||
|
||
**Verification:** `docker compose up --build` 成功,`curl http://localhost:8000/health` 返回200,`curl http://localhost:3000` 返回HTML
|
||
|
||
---
|
||
|
||
### U2. Production Environment Security Configuration
|
||
|
||
**Goal:** 创建生产环境安全配置,包括Redis密码、PostgreSQL强密码、`.env.production`文件、pgvector镜像切换
|
||
|
||
**Requirements:** R5
|
||
|
||
**Dependencies:** U1
|
||
|
||
**Files:**
|
||
- `docker-compose.prod.yml`
|
||
- `.env.production.example`
|
||
- `.env.production` (新建)
|
||
- `backend/app/config.py`
|
||
- `backend/alembic/env.py`
|
||
|
||
**Approach:** 1) 将 `docker-compose.prod.yml` 中 PostgreSQL 镜像从 `postgres:15-alpine` 切换为 `pgvector/pgvector:pg15`;2) 从 `.env.production.example` 创建 `.env.production`,替换所有 `CHANGE_ME` 占位符为强密码/密钥;3) 确认 Redis 密码配置在生产 docker-compose 中生效;4) 验证 Alembic 迁移在生产数据库上可执行。
|
||
|
||
**Patterns to follow:** 现有 `docker-compose.prod.yml` 双网络架构,`.env.production.example` 变量结构
|
||
|
||
**Test scenarios:**
|
||
- Production compose up: `docker compose -f docker-compose.prod.yml up` 启动成功
|
||
- Redis auth: 无密码连接被拒绝,使用配置密码连接成功
|
||
- PostgreSQL auth: 默认密码被拒绝,使用强密码连接成功
|
||
- pgvector extension: `CREATE EXTENSION IF NOT EXISTS vector` 在生产数据库中执行成功
|
||
- Alembic migration: `alembic upgrade head` 在生产数据库上执行成功
|
||
- Network isolation: 外部无法直接访问PostgreSQL和Redis端口
|
||
|
||
**Verification:** 生产docker-compose启动成功,Redis/PostgreSQL密码认证生效,pgvector扩展可用,Alembic迁移成功
|
||
|
||
---
|
||
|
||
### U3. Browser Authentication Flow Verification
|
||
|
||
**Goal:** 验证前端浏览器认证流程完整可用,包括注册、登录、token刷新、401处理
|
||
|
||
**Requirements:** R4
|
||
|
||
**Dependencies:** U1
|
||
|
||
**Files:**
|
||
- `frontend/lib/api/client.ts`
|
||
- `frontend/lib/auth.ts`
|
||
- `frontend/app/(auth)/login/page.tsx`
|
||
- `frontend/app/(auth)/register/page.tsx`
|
||
- `frontend/app/api/auth/[...nextauth]/route.ts`
|
||
- `frontend/e2e/tests/login.spec.ts`
|
||
- `frontend/e2e/tests/login-redirect.spec.ts`
|
||
- `frontend/e2e/tests/login-access.spec.ts`
|
||
|
||
**Approach:** 使用现有Playwright E2E测试验证完整认证流程。确认NextAuth JWT策略工作正常,refreshAccessToken轮换机制正确,fetchWithAuth的401自动重试逻辑有效。若现有E2E测试覆盖不足则补充。
|
||
|
||
**Patterns to follow:** 现有 `e2e/tests/login*.spec.ts` 测试模式,`e2e/pages/login.page.ts` Page Object模式
|
||
|
||
**Test scenarios:**
|
||
- Registration: 新用户注册成功,跳转到onboarding页面
|
||
- Login: 已注册用户登录成功,跳转到dashboard
|
||
- Token refresh: access token过期后自动刷新,用户无感知
|
||
- 401 handling: API返回401时自动重试一次(刷新token后),仍失败则跳转登录页
|
||
- Session persistence: 刷新页面后保持登录状态
|
||
|
||
**Verification:** Playwright E2E认证测试全部通过,手动浏览器验证注册→登录→使用→刷新→登出流程
|
||
|
||
---
|
||
|
||
### U4. DateTime Timezone and Scoring Runtime Verification
|
||
|
||
**Goal:** 验证DateTime timezone配置在asyncpg运行时无报错,诊断评分非零场景正确
|
||
|
||
**Requirements:** R6, R7
|
||
|
||
**Dependencies:** U2
|
||
|
||
**Files:**
|
||
- `backend/app/models/` (所有含DateTime列的模型)
|
||
- `backend/alembic/versions/a79329c23b20_initial_complete_schema.py`
|
||
- `backend/app/services/scoring/scoring_service.py`
|
||
- `backend/app/services/attribution/attribution_engine.py`
|
||
- `backend/tests/test_models/`
|
||
- `backend/tests/test_services/test_scoring.py`
|
||
|
||
**Approach:** 1) 连接生产PostgreSQL(asyncpg驱动),执行涉及DateTime列的CRUD操作,确认无timezone相关运行时错误;2) 创建品牌评分记录,验证5维度评分计算逻辑产生非零分数;3) 验证归因窗口计算正确。
|
||
|
||
**Patterns to follow:** 现有 `tests/test_models/` 和 `tests/test_services/` 测试模式
|
||
|
||
**Test scenarios:**
|
||
- DateTime CRUD: 创建/读取/更新含DateTime列的记录,asyncpg不报timezone错误
|
||
- DateTime round-trip: 写入带时区的datetime,读取后时区信息保留
|
||
- Scoring non-zero: 对有引用数据的品牌执行评分,5个维度均产生非零分数
|
||
- Health score calculation: 品牌健康评分 = 加权总分,等级划分正确(excellent/good/pass/danger)
|
||
- Attribution window: 归因窗口从start_at到window_end_at计算正确,28天后状态变为completed
|
||
|
||
**Verification:** 所有DateTime操作无asyncpg错误,评分计算产生合理非零分数,归因窗口计算正确
|
||
|
||
---
|
||
|
||
### U5. Test Infrastructure — Directory Unification and Shared Fixtures
|
||
|
||
**Goal:** 统一后端测试目录结构,扩展共享fixture系统
|
||
|
||
**Requirements:** R8, R9
|
||
|
||
**Dependencies:** U4
|
||
|
||
**Files:**
|
||
- `backend/tests/conftest.py`
|
||
- `backend/tests/fixtures/` (扩展)
|
||
- `backend/tests/test_api/`
|
||
- `backend/tests/test_services/`
|
||
- `backend/tests/test_models/`
|
||
- `backend/tests/test_content_pipeline/`
|
||
- `backend/tests/test_agent_framework/`
|
||
- `backend/tests/test_integration/`
|
||
- `backend/tests/test_middleware/`
|
||
- `backend/tests/test_infrastructure/`
|
||
- `backend/tests/test_repositories/`
|
||
- `backend/pyproject.toml`
|
||
|
||
**Approach:** 1) 将根目录散落的测试文件(test_config.py, test_performance.py, test_security.py, test_scheduler.py等)迁移到对应的`tests/`子目录;2) 扩展`tests/fixtures/`添加品牌、用户、内容的工厂fixture;3) 更新`conftest.py`统一fixture注册;4) 确保迁移后所有测试仍通过。
|
||
|
||
**Execution note:** 迁移前先运行全部测试记录基线,迁移后验证所有测试仍通过
|
||
|
||
**Patterns to follow:** 现有 `tests/conftest.py` 的 SQLite内存数据库 + 依赖注入覆盖模式,`tests/fixtures/` 的工厂fixture模式
|
||
|
||
**Test scenarios:**
|
||
- Directory structure: 所有测试文件位于`tests/`子目录下,根目录无散落测试文件
|
||
- Fixture availability: 新工厂fixture在所有测试文件中可用
|
||
- Test pass rate: 迁移后测试通过率与迁移前一致
|
||
- Import paths: 迁移后的测试文件import路径正确
|
||
|
||
**Verification:** `pytest` 全部通过,无根目录散落测试文件,新fixture可被任意测试文件使用
|
||
|
||
---
|
||
|
||
### U6. E2E Tests and CI Integration
|
||
|
||
**Goal:** 补充诊断-策略和内容-监控E2E测试,集成到CI,建立性能基线,添加安全扫描
|
||
|
||
**Requirements:** R10, R11, R12
|
||
|
||
**Dependencies:** U5
|
||
|
||
**Files:**
|
||
- `frontend/e2e/tests/diagnosis-strategy.spec.ts` (新建)
|
||
- `frontend/e2e/tests/content-monitoring.spec.ts` (新建)
|
||
- `frontend/e2e/pages/` (新增Page Objects)
|
||
- `.github/workflows/ci.yml`
|
||
- `.github/workflows/pr-check.yml`
|
||
- `backend/tests/test_performance.py`
|
||
- `backend/tests/test_security.py`
|
||
|
||
**Approach:** 1) 新增两个Playwright E2E spec覆盖诊断→策略推荐和内容生成→监控流程;2) 在CI workflow中添加E2E测试步骤(启动服务→运行Playwright→收集结果);3) 建立性能基线(API响应时间p95);4) 添加CI安全扫描步骤(bandit for Python, npm audit for frontend)。
|
||
|
||
**Patterns to follow:** 现有 `e2e/tests/core-flow-smoke.spec.ts` E2E测试模式,`.github/workflows/ci.yml` CI配置模式
|
||
|
||
**Test scenarios:**
|
||
- Diagnosis-strategy E2E: 用户提交品牌→系统执行诊断→生成策略推荐→用户可查看
|
||
- Content-monitoring E2E: 用户生成内容→内容发布→监控任务创建→监控数据展示
|
||
- CI E2E step: PR提交时自动运行E2E测试,失败则阻止合并
|
||
- Performance baseline: API端点p95响应时间记录,回归时CI告警
|
||
- Security scan: bandit扫描后端代码,npm audit扫描前端依赖,高危漏洞阻止合并
|
||
|
||
**Verification:** CI pipeline中E2E测试步骤运行成功,性能基线文件生成,安全扫描步骤存在且可执行
|
||
|
||
---
|
||
|
||
### U7. Platform Rules Center Test Completion
|
||
|
||
**Goal:** 补全平台规则中心测试用例至30个,覆盖RuleValidator、SensitiveFilter、SEOOptimizer、HTMLGenerator、ContentPipeline
|
||
|
||
**Requirements:** R14
|
||
|
||
**Dependencies:** U5
|
||
|
||
**Files:**
|
||
- `backend/tests/test_content_pipeline/test_rule_validator.py`
|
||
- `backend/tests/test_content_pipeline/test_sensitive_filter.py`
|
||
- `backend/tests/test_content_pipeline/test_seo_optimizer.py`
|
||
- `backend/tests/test_content_pipeline/test_html_generator.py`
|
||
- `backend/tests/test_content_pipeline/test_content_pipeline.py`
|
||
- `backend/tests/test_content_pipeline/test_content_generation.py`
|
||
- `.trae/specs/platform-rules-enforcement/tasks.md`
|
||
- `.trae/specs/platform-rules-enforcement/spec.md`
|
||
|
||
**Approach:** 以 `.trae/specs/platform-rules-enforcement/tasks.md` 中的30个测试用例为蓝图,在现有6个测试文件基础上补全。每个组件的测试覆盖:平台特定规则校验、边界条件、错误处理、组件间集成。优先覆盖P0平台(知乎、微信、百家号)的规则。
|
||
|
||
**Execution note:** 参照tasks.md中的TDD RED阶段测试用例,逐个实现
|
||
|
||
**Patterns to follow:** 现有 `test_content_pipeline/` 测试模式,`platform_rules.py` 中的规则配置结构
|
||
|
||
**Test scenarios:**
|
||
- RuleValidator: 微信诱导分享检测、知乎营销检测、小红书引流检测、百家号标题党检测、抖音水印检测、AI模式检测
|
||
- SensitiveFilter: 4类基础词库过滤、自定义词库、平台容差级别、替换策略
|
||
- SEOOptimizer: 关键词密度计算、密度范围校验、位置建议、平台特定SEO规则
|
||
- HTMLGenerator: 禁用标签过滤、微信外部链接移除、多格式输出(HTML/Markdown/纯文本)
|
||
- ContentPipeline: 4阶段顺序执行、高严重级别阻断、每阶段耗时记录、错误传播
|
||
- Cross-platform: 10个平台的规则配置完整性校验
|
||
|
||
**Verification:** 30个测试用例全部通过,`pytest tests/test_content_pipeline/` 无失败
|
||
|
||
---
|
||
|
||
### U8. Payment SDK Integration and Attribution Window
|
||
|
||
**Goal:** 集成微信支付和支付宝真实SDK,支持未配置时降级mock;归因窗口可配置
|
||
|
||
**Requirements:** R15, R16
|
||
|
||
**Dependencies:** U5
|
||
|
||
**Files:**
|
||
- `backend/app/services/payment/wechat_pay.py`
|
||
- `backend/app/services/payment/alipay.py`
|
||
- `backend/app/services/payment/mock_gateway.py`
|
||
- `backend/app/services/payment/base.py`
|
||
- `backend/app/services/payment/__init__.py`
|
||
- `backend/app/api/payments.py`
|
||
- `backend/app/services/attribution/attribution_engine.py`
|
||
- `backend/app/models/attribution_record.py`
|
||
- `backend/app/config.py`
|
||
- `backend/tests/test_services/test_payment.py`
|
||
- `backend/tests/test_services/test_attribution.py`
|
||
|
||
**Approach:** 1) 微信支付:使用`wechatpayv3`官方SDK或`requests`直接调用V3 API,实现NATIVE扫码支付的create_order(实际发送HTTP请求到微信)、verify_callback(验签)、query_order(查询订单状态)、refund(退款);2) 支付宝:使用`alipay-sdk-python`或`requests`直接调用API,实现WAP支付的完整流程;3) 保留`_is_configured()`降级机制,未配置时自动使用MockGateway;4) 归因窗口:将硬编码28天改为从配置或订阅计划读取,支持14天/28天可配置。
|
||
|
||
**Patterns to follow:** 现有 `PaymentGateway` ABC接口,`_is_configured()` 降级模式,`config.py` 配置字段模式
|
||
|
||
**Test scenarios:**
|
||
- WeChat create_order: 配置完整时发送真实API请求(mock HTTP for test),返回支付二维码URL
|
||
- WeChat verify_callback: 微信回调签名验证通过/失败
|
||
- WeChat query_order: 查询已支付订单返回成功状态
|
||
- WeChat refund: 企业用户发起退款成功
|
||
- Alipay create_order: 配置完整时生成WAP支付表单
|
||
- Alipay verify_callback: RSA2签名验证通过/失败
|
||
- Fallback: 未配置时自动降级为MockGateway,所有操作返回模拟成功
|
||
- Attribution window 14 days: 配置14天窗口,归因在14天后完成
|
||
- Attribution window 28 days: 默认28天窗口行为不变
|
||
- Attribution scoring: 窗口期内维度变化正确计算delta
|
||
|
||
**Verification:** 支付网关在配置完整时调用真实API(测试环境用mock HTTP),未配置时降级mock;归因窗口可配置且计算正确
|
||
|
||
---
|
||
|
||
## Scope Boundaries
|
||
|
||
**Deferred for later:**
|
||
- 真实SMTP邮件集成(当前使用控制台输出)
|
||
- 知识库/生命周期/发布等占位页面实现
|
||
- Landing page移动端测试和表单后端集成
|
||
- 知乎/头条OAuth第三方登录验证
|
||
- 前端Playwright E2E浏览器自动化测试扩展
|
||
- 限流中间件从内存迁移到Redis
|
||
- 微信/支付宝SDK商户资质申请
|
||
|
||
**Deferred to Follow-Up Work:**
|
||
- Docker Compose生产环境的完整部署验证(需真实服务器)
|
||
- 归因系统端到端验证(依赖支付闭环完成后)
|
||
- 前端`reports/page.tsx`和`lifecycle/new/page.tsx`绕过统一API客户端的修复
|
||
|
||
---
|
||
|
||
## Risks & Dependencies
|
||
|
||
- **支付SDK商户资质未就绪**: 微信/支付宝SDK申请需要商户资质审核,可能需要1-2周。缓解:代码层面完成集成,未配置时降级mock
|
||
- **生产pgvector镜像兼容性**: `pgvector/pgvector:pg15`与现有迁移脚本的兼容性需验证。缓解:U1中优先验证
|
||
- **E2E测试环境依赖**: Playwright E2E测试需要完整运行的服务栈。缓解:CI中使用docker-compose启动服务
|
||
- **测试迁移风险**: 散落测试文件迁移可能引入import路径问题。缓解:U5中先记录基线再迁移
|
||
- **归因窗口可配置化**: 修改硬编码28天可能影响现有归因记录。缓解:仅影响新创建的归因记录,已有记录不受影响
|
||
|
||
---
|
||
|
||
## Open Questions
|
||
|
||
**Deferred to Planning:**
|
||
- CI环境选择(GitHub Actions / 自建Runner)—— 当前已有`.github/workflows/`,默认使用GitHub Actions
|
||
- 68列时区迁移是否需要数据回填—— 研究发现代码已修复,仅需运行时验证
|
||
- 微信支付V2(MD5签名) vs V3(RSA签名)选择—— V3是微信推荐的新协议,优先使用V3
|
||
|
||
---
|
||
|
||
## Sources & Research
|
||
|
||
- `docs/plans/2026-06-01-004-chore-geo-launch-readiness-sprint-plan.md` — 上线就绪冲刺计划
|
||
- `docs/plans/2026-06-01-005-chore-geo-tech-debt-cleanup-plan.md` — 技术债清理计划
|
||
- `docs/plans/2026-05-31-002-test-quality-assurance-system-plan.md` — 测试质量保障体系
|
||
- `docs/plans/2026-05-31-003-feat-geo-monetization-closed-loop-plan.md` — 变现闭环计划
|
||
- `.trae/specs/platform-rules-enforcement/spec.md` — 规则中心规格
|
||
- `.trae/specs/platform-rules-enforcement/tasks.md` — 规则中心30个测试用例
|
||
- `docker-compose.prod.yml` — 生产PostgreSQL镜像需切换为pgvector
|
||
- `backend/app/services/payment/wechat_pay.py` — 微信支付当前未实际调用API
|
||
- `backend/app/services/payment/alipay.py` — 支付宝当前未实际调用API
|
||
- `backend/app/services/attribution/attribution_engine.py` — 归因窗口硬编码28天
|