---
date: 2026-06-01
topic: geo-frontend-visualization
---

## Summary

为 GEO 平台已有的完整后端 API 补建前端可视化页面，分三批交付：P0 修复监测页面 + 新建竞品分析页面，P1 引用统计可视化 + 健康评分页面 + 检测任务管理 UI，P2 报告导出入口 + 公开评分落地页 + Agent 配置 UI + 趋势/Schema 页面。可视化优先——先让用户看到数据价值，再补操作闭环。

## Problem Frame

GEO 平台后端 API 已基本完整（8 个 Agent、5 大服务模块、30+ 端点），但前端存在多处功能断裂：监测页面展示的是告警而非监测记录（5 个监测 API 端点完全未被使用），竞品分析后端完整（5 种分析类型 + LLM 推荐 + 差距评分）却无前端页面，引用统计、健康评分、检测任务等 API 也缺乏前端对接。用户在 onboarding 流程中看到健康评分，进入 Dashboard 后却找不到对应页面，核心价值无法被感知。

## Key Decisions

**可视化优先于操作** — 先让用户看到品牌监测数据、竞品对比图表、引用统计趋势，证明数据价值；触发检测、创建任务等操作能力后续补全。这降低了首批交付的复杂度，同时验证用户是否真的需要这些数据。

**监测页面修复而非新建** — 当前 monitoring 页面展示告警，但告警功能本身有独立价值。将监测记录作为 monitoring 页面的主 Tab，告警作为子 Tab，避免功能割裂。

**复用现有图表库** — 前端已有 recharts 依赖（Dashboard 页面使用），竞品雷达图、引用趋势图等复用 recharts 而非引入新库。

## Requirements

### P0: 核心可视化闭环

R1. 监测页面展示品牌监测记录列表，调用 `/api/v1/monitoring/brand/{brand_id}` 获取数据，每条记录显示监测平台、上次检测时间、变化类型（positive/negative/neutral）、变化摘要

R2. 监测记录详情展示变化报告，调用 `/{record_id}/report` 获取，包含变化指标对比（引用量、情感、排名）和 AI 建议

R3. 监测页面支持手动触发检测，调用 `/{record_id}/check`，触发后显示检测进度状态

R4. 监测状态管理（active/paused/completed），调用 `/{record_id}/status` 更新

R5. 告警功能保留为 monitoring 页面的子 Tab，不删除现有告警逻辑

R6. 竞品分析独立页面，展示品牌竞品列表，调用 `/{brand_id}/competitors/` 获取，支持添加（上限 5 个）和删除

R7. 竞品对比可视化，调用 `/competitor/analyze` 执行分析，以雷达图展示品牌与竞品在 5 个维度的差距

R8. 竞品差距评分汇总，调用 `/competitor/brand/{brand_id}/gap-summary` 获取，以评分卡片形式展示

R9. 竞品推荐功能，调用 `/{brand_id}/competitors/recommendations/` 获取 LLM 推荐的竞品列表

### P1: 数据深度可视化

R10. 引用统计可视化，调用 `/api/v1/citations/stats` 获取数据，展示引用率、平均位置、平台分布饼图、30 天趋势折线图

R11. 健康评分独立页面，调用 `/{brand_id}/score/` 获取 V2 五维度评分，以仪表盘 + 维度卡片形式展示

R12. 品牌与竞品对比，调用 `/{brand_id}/compare/` 获取雷达图数据，在健康评分页面中展示

R13. 评分历史趋势，调用 `/{brand_id}/score/history/` 获取，以折线图展示评分变化

R14. 检测任务管理 UI，调用 `/api/v1/detection/tasks` CRUD，展示任务列表、创建/编辑/删除任务、手动触发检测

R15. Dashboard 主页 Agent 活动区域替换占位内容，展示最近 Agent 执行记录摘要

### P2: 体验补全

R16. 引用页面添加 CSV/PDF 导出按钮，调用后端已有导出端点

R17. 报告页面导出按钮，调用 `/api/v1/reports/export/csv` 和 `/pdf`

R18. 公开健康评分落地页，调用 `/api/v1/public/health-score`，作为营销获客入口，无需登录即可查看品牌 3 维度评分

R19. Agent 配置管理 UI，调用 `/{agent_name}/config` GET/PUT，展示和修改 Agent 参数

R20. 趋势洞察页面，调用 `/api/v1/trends` 获取趋势分析和洞察列表

R21. Schema 建议页面，调用 `/api/v1/schema` 获取和管理 Schema 建议

## Key Flows

### F1. 监测记录查看与检测

**Trigger:** 用户进入监测页面
1. 页面加载品牌监测记录列表（R1）
2. 用户点击某条记录 → 展开变化报告详情（R2）
3. 用户点击"立即检测" → 触发检测（R3）→ 按钮变为 loading → 检测完成后刷新记录
4. 用户切换监测状态 active/paused（R4）

**Covers R1, R2, R3, R4.**

### F2. 竞品分析

**Trigger:** 用户进入竞品分析页面
1. 页面加载品牌竞品列表（R6）
2. 用户点击"添加竞品" → 搜索或从推荐列表选择（R9）→ 添加成功
3. 用户点击"开始分析" → 选择分析类型 → 执行分析（R7）→ 展示雷达图 + 差距评分（R8）
4. 用户点击"重新分析" → 刷新分析结果

**Covers R6, R7, R8, R9.**

### F3. 健康评分查看

**Trigger:** 用户进入健康评分页面
1. 页面加载 V2 五维度评分仪表盘（R11）
2. 用户点击"竞品对比" → 展示雷达图（R12）
3. 用户点击"历史趋势" → 展示评分折线图（R13）

**Covers R11, R12, R13.**

## Scope Boundaries

**Deferred for later:**
- 监测任务创建 UI（当前仅展示已有记录和手动触发，创建新监测任务的操作能力后续补全）
- Agent 手动创建任务 UI（当前仅展示执行记录和配置，手动创建任务的操作能力后续补全）
- 内容编辑器深度优化和版本对比
- 国际化（i18n）改造

**Outside this product's identity:**
- 后端 API 新增或修改（后端已完整，本次仅做前端对接）
- 实时数据推送（WebSocket）——当前使用轮询刷新即可
- 移动端适配——当前仅考虑桌面端

## Dependencies / Assumptions

- 后端 API 端点已完整且可用（基于代码扫描确认，未做运行时验证）
- 前端 recharts 库已安装，可复用于所有图表
- 前端 `fetchWithAuth` 统一 API 客户端已就绪，所有新页面使用该客户端
- Docker 服务已部署且数据库已迁移（Plan 005 已完成）
- 各 API 返回的数据结构与前端类型定义一致

## Outstanding Questions

**Resolve Before Planning:**
- 监测记录的"创建监测任务"入口放在哪里？Onboarding Step3 已创建品牌并选择平台，是否在品牌创建后自动创建监测任务？

**Deferred to Planning:**
- 竞品雷达图的具体维度映射（后端返回的 5 种分析类型如何映射到雷达图轴）
- 公开健康评分落地页的 URL 路由和 SEO 策略
- Dashboard Agent 活动区域的数据刷新策略

## Sources / Research

- `backend/app/api/v1/monitoring.py` — 5 个监测端点
- `backend/app/api/v1/competitors.py` + `backend/app/api/v1/competitor.py` — 竞品管理 + 分析端点
- `backend/app/api/v1/citations.py` — 引用记录 + 统计端点
- `backend/app/api/v1/scoring.py` — V2 五维度评分 + 竞品对比 + 历史趋势
- `backend/app/api/v1/detection.py` — 检测任务 CRUD + 触发
- `backend/app/api/v1/agents.py` — Agent 配置 + 任务管理
- `backend/app/api/v1/trends.py` — 趋势洞察
- `backend/app/api/v1/schema_suggestions.py` — Schema 建议
- `frontend/app/(dashboard)/dashboard/monitoring/page.tsx` — 当前告警页面（需改造）
- `frontend/app/(dashboard)/dashboard/citations/page.tsx` — 引用列表页面（需增加统计）
- `frontend/lib/api/client.ts` — 统一 API 客户端
