---
type: pointer
title: 新建监控主题页面需求
summary: 从 /monitors/new 当前展示和操作推导字段、数量、存储与取舍
updated: 2026-10-08
---

# 新建监控主题

路由：`/monitors/new`。角色：当前用户。范围：**当前主流程**。依据：当前页面和调用组件（代码基线 `67df5ab1`，本轮仅修复根元素 hydration 并移除无调用旧 header 插槽）。以下数量是现有读取策略，不是实际业务记录数，也不是容量或服务承诺。

源码入口：[page.tsx](../../../../frontend/src/app/monitors/new/page.tsx) · [topic-form.tsx](../../../../frontend/src/app/monitors/new/components/topic-form.tsx) · [editorial-topic-sources.tsx](../../../../frontend/src/components/monitors/editorial-topic-sources.tsx) · [keyword-group-field.tsx](../../../../frontend/src/components/monitors/keyword-group-field.tsx) · [monitor-presenters.ts](../../../../frontend/src/components/monitors/monitor-presenters.ts)。

## 用户任务与当前操作

作为当前用户，我需要将监控意图变为可核对的关键词配置。当前操作围绕下表的数据完成；不从旧表和旧接口的存在反推新增产品需求。页面存在不等于来源、模型、送达或长期运行已通过真实验收。

## 页面需要的数据

| 区域／操作 | 实际展示或输入字段 | 展示数量／读取方式 | 是否持久化及最小存储 |
|---|---|---|---|
| 新主题表单 | name、match_any/all/exclude、source_keys/editorial_profile_ids、collection_interval_seconds、report_time（timezone由服务返回）、weekly_report_enabled、notification_target_names | 一次创建；来源选择来自可用能力 | monitor_topics+版本；保存不是采集 |
| 规则预览 | 命中词、未命中原因、查询展开、预算单位、已存样本 | 按按钮预览，输入改变后旧预览失效 | 只计算/读取既有样本，不保存预览表 |

从探索入口携带的q只预填“想关注的关键词”，保持可编辑，不自动创建主题或触发采集。只接受不超过200字符的单个搜索参数；空值、重复参数或超长值不作为默认草稿。

## 接口与业务落点

下列为本页业务读取/提交入口。全局会话、头像、站点元信息和共享组件中未在本页触发的导出函数不算新增页面能力。请求类型、响应与错误以生成客户端和后端为准。

| 页面调用 | 方法和路径 | 请求 → 响应合同 | 实现依据 |
|---|---|---|---|
| `createMonitorTopic` | `POST /api/topics` | `MonitorTopicCreateInput` → `MonitorTopicView` | [客户端](../../../../frontend/src/api/jiankongzhuti.ts) · [后端](../../../../backend/app/api/routers/monitor_topics.py) |
| `getReportEmailSubscription` | `GET /api/notifications/email-subscription` | `无业务入参` → `ReportEmailSubscriptionView` | [客户端](../../../../frontend/src/api/gerenbaogaotongzhi.ts) · [后端](../../../../backend/app/api/routers/notifications.py) |
| `listMonitorEditorialSources` | `GET /api/topics/editorial-sources` | `无业务入参` → `EditorialTopicSourceView[]` | [客户端](../../../../frontend/src/api/jiankongzhuti.ts) · [后端](../../../../backend/app/api/routers/monitor_topics.py) |
| `listSourceCapabilities` | `GET /api/source-capabilities` | `无业务入参` → `PageViewSourcePlatformView_` | [客户端](../../../../frontend/src/api/laiyuannengli.ts) · [后端](../../../../backend/app/api/routers/source_capabilities.py) |
| `previewMonitorTopic` | `POST /api/topics/preview` | `MonitorTopicPreviewInput` → `MonitorTopicPreviewView` | [客户端](../../../../frontend/src/api/jiankongzhuti.ts) · [后端](../../../../backend/app/api/routers/monitor_topics.py) |
| `previewMonitorTopicSamples` | `POST /api/topics/sample-preview` | `ContentSamplePreviewInput` → `ContentSamplePreviewView` | [客户端](../../../../frontend/src/api/jiankongzhuti.ts) · [后端](../../../../backend/app/api/routers/monitor_topics.py) |

数据落点：[monitor_topics](../reference/13-现有数据库字典.md#monitor_topics)、[monitor_topic_versions](../reference/13-现有数据库字典.md#monitor_topic_versions)、[monitor_schedules](../reference/13-现有数据库字典.md#monitor_schedules)、[source_connections](../reference/13-现有数据库字典.md#source_connections)、[editorial_source_profiles](../reference/13-现有数据库字典.md#editorial_source_profiles)。这是当前依赖定位，不代表这些表均为重新设计时必须新建；详细字段/键/关系及保留原因见[页面数据库设计](../reference/09-全站页面数据库设计.md)。

## 收敛与替换

不增加关键词词库服务或复制来源配置；不把预览实现为真实采集。

实现时先复用上述合同。确有缺口须描述具体控件、输入、输出、当前失败和最小修复，不能直接把历史扩展方案列为前置。公开分发、付费供应商、海外新来源与 Flutter 继续受[冻结范围](../../decisions/11-冻结范围.md)和其他生效决策约束。

## 验收与非功能要求

- 主路径：无可用来源给设置入口；空/重复关键词校验；保存后回到新主题。创建接口没有 operation_id，响应未知时先重读主题列表确认，不能自动重发创建请求。
- 数据边界：上表数量、字段和统计范围要能从响应核对；未知、未分析、无权限和真实零值不同。筛选、页签与选择不创建持久业务副本。
- 状态：有远程读取的区域分别验证正常、零数据、加载、失败和撤权；静态说明的业务空态/无权限写不适用，不伪造验收。
- 写入：保存失败保留表单输入；本页创建不具有版本更新或幂等重试合同，重读后仍不能确认时明确提示结果未知，不新增全局操作账本。
- 交互：1440px与390px下主动作可见；Tab/Enter/Escape和适用的方向键可操作，弹层关闭返回触发点。凭据只按现有认证流程传递，不进入日志/URL/本机持久存储。

测量和跨页场景统一见[非功能要求](../reference/10-全站非功能需求.md)、[验收场景](../reference/11-全站验收场景.md)。这里只定义判据，执行进度仍只在 BACKLOG。
