控制台导航最多两层(侧栏一项 = 一页,页内最多一层页签 / 分段);从列表打开的
记录改成列表页上的右侧抽屉,打开的记录写在 ?open=,刷新、分享、前进后退都能还原,
后退就是关抽屉。标准写在 docs/design/console-ia.md §9,ui-controls.md 引用。
- DetailSheet 加 xl 宽度、标题下操作行;抽屉里再开的 DetailSheet 在同一抽屉里换成子视图(返回 / Esc)
- record-sheet.tsx:useRecordSheet / RecordLink / useOpenRecord / recordPath / taskPath
- 整理记录、订阅、站点(含页签)、下载、日志任务改成抽屉;旧业务任务 / 下载任务 id 在任务抽屉里换算
- 回收站并进文件管理右侧视图(?view=trash);设置左栏只列分区
- 规则组、策略版本、媒体库未识别 / 外部身份、设置实例编辑走 ?open=
- 旧地址 /console/{organize,subscriptions,sites,downloads}/:id、/tasks/:id、/files/trash 跳到列表页抽屉
- 站内链接、铃铛、命令面板、任务时间线改拼新地址;冒烟按 ?open= 检查抽屉
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
43 KiB
控制台信息架构重构(参考 MoviePilot v3)
状态:方案待审阅 · 2026-09-28 · 只涉及
apps/web与packages/contracts/src/settings.ts,不改后端接口。 约束来源:REQ v0.7 §13.1 / §13.4.3(工作区清单、双入口、待处理中心、整理记录公开接口、站点工作台双视图、偏好标签)。
1. MoviePilot v3 的信息架构
来源:MoviePilot-Frontend/src/router/i18n-menu.ts(getNavMenus / getSettingTabs)、src/pages/setting.vue、src/views/setting/AccountSetting*.vue。
1.1 一级导航(侧栏分组 = header)
| 分组 | 页面 | 页内 Tab / 内容 | 主要操作 |
|---|---|---|---|
| 开始 | 仪表盘 /dashboard |
可拖拽组件:存储、下载速度、今日/近期入库、订阅、站点数据 | 看状态 |
| 开始 | 搜索结果 /resource |
全站搜索结果卡片 / 列表 | 下载、按站点/质量过滤 |
| 发现 | 推荐 /recommend |
全部 / 电影 / 电视剧 / 动漫 / 音乐 / 榜单 | 订阅、搜索 |
| 发现 | 探索 /discover |
TMDB / 豆瓣 / Bangumi / AniList / MusicBrainz | 订阅、搜索 |
| 订阅 | 电影 / 电视剧 / 音乐 /subscribe/* |
我的订阅 / 热门订阅(剧集另有"分享") | 增删改订阅、洗版 |
| 订阅 | 工作流 /workflow |
列表 / 分享 | 编排自动任务 |
| 订阅 | 日历 /calendar |
已订阅剧集播出日历 | 查看 |
| 整理 | 下载管理 /downloading |
按下载器分 Tab 的在途任务 | 暂停/删除 |
| 整理 | 媒体整理 /history |
整理历史列表 | 重新整理、删除记录 |
| 整理 | 文件管理 /filemanager |
多存储文件浏览 | 手动整理、改名、刮削 |
| 系统 | 插件 /plugins |
已安装 / 插件市场 | 装卸、配置 |
| 系统 | 站点管理 /site |
站点卡片(Cookie/UA/优先级/限流/数据) | 增删改站点、测试连通 |
| 系统 | 用户管理 /user |
用户与权限 | 增删用户 |
| 系统 | 设定 /setting |
见 1.2 | — |
1.2 设定页 Tab(?tab=)与字段分组
| Tab | 分组(VCardTitle) | 字段要点 |
|---|---|---|
| 系统 system | 基础设置 | 访问域名、壁纸、API Token、GitHub Token;AI Agent(开关/全局/上游 provider/协议/BaseURL/模型/上下文/温度/思考/语音输入输出/推荐) |
| 下载器 | Qbittorrent / Transmission 实例卡片(多实例,默认下载器) | |
| 媒体服务器 | Emby / Jellyfin / Plex / 飞牛 / 绿联 实例卡片 | |
| 高级设置(子 Tab) | system(辅助认证、统计分享、大内存、WAL、自动更新) · media(TMDB 域名/Key/语言/图片域名、元数据缓存、刮削跟随、Fanart、AcoustID 等) · network(代理、GitHub/pip 代理、DoH) · data(DB 备份 cron/路径/保留、数据清理各类天数) · log(调试、级别、大小、份数) · dev(插件本地仓、整理线程/重试、fs 代理超时) | |
| 存储&目录 directory | 存储 / 目录 / 整理与刮削 | 存储后端;下载目录与媒体库目录成对配置(类型、分类、整理方式);电影/剧集/音乐命名模板;刮削来源 |
| 站点 site | 站点同步 / 站点选项 / 站点重置 | CookieCloud 地址/密钥/同步间隔/黑名单;站点数据刷新间隔、浏览器仿真、FlareSolverr、OCR;重置 |
| 规则 rule | 自定义规则 / 优先级规则组 / 下载规则 | 规则表达式;规则组导入导出;站点优先级、做种数、上传量等排序 |
| 搜索&下载 search | 基础 / 下载站点 | 媒体数据源、多名称搜索、默认过滤规则组、下载标签/字幕/下载用户;参与搜索的站点 |
| 订阅 subscribe | 基础 / 订阅站点 | 订阅模式(RSS/定时搜索)、间隔、检查本地媒体、过滤规则组、洗版规则组;参与订阅的站点 |
| 通知 notification | 渠道 / 范围 / 发送时间 / 模板 | 企业微信、Telegram、Slack…;消息类型 × 接收人;免打扰时段;模板 |
1.3 设计逻辑
- 导航按用户流程排:开始 → 发现 → 订阅 → 整理(含下载) → 系统。用户从上往下读侧栏就是"找到 → 追 → 拿到 → 入库 → 配置"。
- "对象管理"与"参数设定"分开:站点、用户、插件这类有列表、有增删的实体在侧栏有独立页;设定页只放全局参数。
- 设定按"接入对象 / 环节"分 Tab:系统(外部服务实例)、目录、站点、规则、搜索、订阅、通知。每个 Tab 带一句描述,列出里面有什么(
settingTabs.*.description)。 - 规则集中,被引用:过滤/洗版规则组只在"规则"定义,搜索和订阅 Tab 只选用哪个规则组。
- 不足之处:"系统"Tab 过载(3000 行,下载器、媒体服务器、AI、TMDB 全在里面,再套 6 个子 Tab),"搜索&下载"名不副实,下载器反而不在里面。这一点我们不照抄。
2. 我们的现状
2.1 导航(components/console/nav.ts,15 项 / 4 组)
| 组 | 页面 → 路由 | 页内 Tab |
|---|---|---|
| 概览 | 首页 /console、待处理中心 /inbox |
待处理:状态筛选 |
| 媒体 | 媒体库 /library(/:id)、身份与元数据 /identity、整理记录 /organize(/:id)、文件 /files(+/files/trash) |
身份:待识别池 / 外部身份 / 别名 |
| 获取 | 订阅与收录规则 /subscriptions、偏好标签 /preferences、PT 站点工作台 /sites(/:siteId)、来源/Feed/快照 /sources、下载与任务 /tasks(/:id) |
订阅:订阅 / 收录策略;站点详情:整理视图 / 原站视图;来源:Feed / 站点快照;任务:下载任务 / 下载计划 / 业务任务 |
| 助手与系统 | Agent 会话 /agent(/:runId)、系统设置 /settings、工作流引擎 /engine(/:runId)、审计日志 /audit |
设置 9 Tab,见下 |
另有:账户菜单里的"修改密码"、"本机 API Key"对话框(存 localStorage);全局 Agent 抽屉。
2.2 设置页 9 个 Tab(routes/console/settings.tsx + settings/*.tsx)
| Tab | 内容 | 存储 |
|---|---|---|
| 自动化 | 总开关、只读对账模式 | automation |
| 下载器 | qB 实例:名称、WebUI、用户名、凭证、管理标签、缓存卷标识、启用、健康 | instances API |
| 媒体服务器 | Emby/Jellyfin:名称、类型、地址、用户 ID、API Key、启用 | instances API |
| 库根 | 名称、内容类型、本地路径、管理方式、启用、备注、检查哨兵 | instances API |
| 路径映射 | 远端前缀、本地前缀、关联库根、校验 | instances API |
| 站点凭证 | 站点、标签、凭证类型(Cookie/Passkey/API Key/账号密码)、登录名、凭证 | secrets API |
| API Key | 名称、权限 scope(read / organize.read / organize.execute / admin)、最近使用、撤销 | api-keys API |
| Pi 上游 | 卡片①上游与模型(provider/model/baseUrl/apiKey/思考/上下文/压缩/子代理) ②Agent 预算(每日次数/费用) ③Agent 运行(单次上限、自动调查及模式/次数、目标轮询、fake 脚本、会话目录) | pi + budget.agent* + agent |
| 缓存与入库 | 卡片①缓存阈值(硬阈值/恢复/清理目标/间隔) ②入库方式与保留(默认 Copy/Move、跨卷 Move、做种保留天数、日志保留天数) ③下载预算(每日新作品/下载量/并发) | cache + organize + retention + budget.* |
contracts/settings.ts 的 8 个存储 key:automation / cache / organize / retention / pi / budget / agent / metadata。
2.3 混乱点
| # | 问题 | 表现 |
|---|---|---|
| C1 | 站点散三处,且没有登记入口 | 站点工作台(浏览)、来源页"站点快照"(健康)、设置"站点凭证"(账号)各讲一部分;空状态提示"去来源页或系统设置登记站点",但两处都没有新增站点的表单 |
| C2 | "任务"一词三义 | "下载与任务"里的业务任务、引擎面板的 workflow run、整理记录都在讲"一次处理";引擎面板描述里还得写"业务进度请看下载与任务"来引导 |
| C3 | 下载与缓存分家 | 缓存水位在首页区块,阈值在设置"缓存与入库",下载任务在"下载与任务",三处互不跳转 |
| C4 | 设置按"存储 key"切而不是按"对象"切 | 预算拆两半(下载预算在"缓存与入库",Agent 预算在"Pi 上游");"缓存与入库"一个 Tab 装了缓存、整理方式、保留、预算 4 件事;库根和路径映射是同一件事的两面却分两个 Tab |
| C5 | 元数据设置无 UI | metadata.tmdbApiKey / tmdbBaseUrl 在 contracts 有,设置页没有入口,只能靠环境变量 |
| C6 | 偏好与规则分家 | "订阅与收录规则"页里的"收录策略"Tab 与独立的"偏好标签"页都在回答"要什么版本",用户要跨两页比对 |
| C7 | 待处理 / 身份 / 媒体库边界不清 | 身份页"待识别池"与待处理中心的"身份冲突"事项重叠;媒体详情也能手动指定 TMDB。三处都能改身份,没有主次 |
| C8 | 分组名不表意 | "获取"组塞了 5 项(订阅、偏好、站点、来源、下载),"媒体"组又混了整理和文件;"Pi 上游"是实现名,用户不认识 |
| C9 | API Key 两处 | 设置里的 API Key(签发给外部程序)与账户菜单"本机 API Key"(浏览器自用 token)同名不同物 |
3. 新信息架构
3.1 原则
- 侧栏按业务流程排:概览 → 资源 → 订阅 → 下载 → 整理 → Agent → 系统(对齐 MP 的"发现→订阅→下载→整理→设定",待处理提到最前,因为它是"需要人"的唯一入口)。
- 一个对象一个家:站点、下载器、库根这类实体只在一处增删改,其它页面只读展示 + 深链过去。
- 判定只在待处理:需要人拍板的操作(选候选、确认身份冲突、处理登录挑战)只在待处理中心执行;身份页、媒体详情只做"维护"(改映射、锁定、别名),并显示"此事项在待处理中 →"。
- 设置只放全局参数和凭证;有运行状态的列表(Feed、下载任务)不进设置。
3.2 一级导航(7 组 18 项)
| 组 | 页面(新名) | 新路由 | 来源 / 变化 |
|---|---|---|---|
| 概览 | 首页 | /console |
不变 |
| 待处理 | /console/inbox |
更名(去"中心"),侧栏带未决数角标 | |
| 资源 | 站点工作台 | /console/sites、/sites/:siteId |
站点卡片合并快照新鲜度与账号状态;详情页 Tab:整理视图 / 原站视图 / 快照与 Feed / 账号(C1) |
| 来源健康 | /console/sources |
原"来源/Feed/快照"更名;只保留跨站点的 Feed 列表与健康总表,单站点数据深链到站点详情 | |
| 订阅 | 订阅 | /console/subscriptions |
原页只留"订阅"列表与详情 |
| 收录规则 | /console/rules |
原订阅页"收录策略"Tab 提升为独立页(C6) | |
| 偏好标签 | /console/preferences |
不变;与收录规则互链,规则详情显示"叠加生效的偏好" | |
| 下载 | 下载队列 | /console/downloads |
原任务页"下载任务"Tab;页头加缓存水位条(实际/在途预留/阈值/恢复),点击到设置对应分节(C3) |
| 下载计划 | /console/downloads/plans |
原任务页"下载计划"Tab | |
| 业务任务 | /console/tasks、/tasks/:id |
原"业务任务"Tab;详情时间线里链接对应下载、整理记录、引擎 run(C2) | |
| 整理 | 媒体库 | /console/library(/:id) |
不变 |
| 整理记录 | /console/organize(/:id) |
不变(公开接口 organize.read 的界面) |
|
| 文件管理 | /console/files(+/trash) |
更名 | |
| 身份与元数据 | /console/identity |
"待识别池"更名"未识别",有待决事项的行显示"已进待处理 →"(C7) | |
| Agent | Agent 会话 | /console/agent(/:runId) |
独立一组,体现双入口;抽屉照旧全局可用 |
| 系统 | 设置 | /console/settings/:section |
见 3.4 |
| 引擎面板 | /console/engine(/:runId) |
更名,仅管理员;描述改为"排查用,业务进度看业务任务" | |
| 审计日志 | /console/audit |
不变 |
7 组 18 个入口,每组 1–4 项,比现在"获取"组 5 项更均衡。移动端抽屉同一份 NAV_GROUPS。
3.3 旧路由重定向表
| 旧 | 新 | 方式 |
|---|---|---|
/console/tasks?tab=downloads |
/console/downloads |
loader redirect,保留其余 query |
/console/tasks?tab=plans |
/console/downloads/plans |
同上 |
/console/tasks(无 tab / tab=tasks) |
/console/tasks |
默认改为业务任务 |
/console/subscriptions?tab=policies |
/console/rules |
redirect |
/console/sources?tab=snapshots&siteId=x |
/console/sites/x?tab=snapshots |
redirect;无 siteId 留在来源健康 |
/console/settings?tab=automation |
/console/settings/automation |
表 3.4 的 legacyTab 映射 |
/console/settings?tab=downloaders |
/console/settings/downloaders |
同上 |
?tab=media-servers |
/settings/media-servers |
同上 |
?tab=library-roots / path-mappings |
/settings/library#roots / #mappings |
同上 |
?tab=site-credentials |
/settings/sites |
同上 |
?tab=api-keys |
/settings/api-keys |
同上 |
?tab=pi |
/settings/agent |
同上 |
?tab=storage |
/settings/automation#cache |
同上(缓存/预算/保留归自动化) |
/console/settings(无参) |
/console/settings/automation |
默认分区 |
重定向统一写在各自路由模块的 clientLoader 里(或新增 routes/console/redirects.ts 集中表),nav.test.ts 增加"旧链接都能落到新路由"的用例。
3.4 设置页分区(2026-10-06 重排,替换 IA-2 方案)
沿用 MP 的两条逻辑:按「接入对象 / 业务环节」分区,对象管理与参数设定分开;不照抄它「系统」Tab 过载的做法(下载器、媒体服务器、AI、TMDB 全塞一页再套子 Tab)。左栏三组,组内按用户找东西的顺序排;每个分区一句说明;接入对象类分区第一节是对象列表(实例 / 目录 / 模型服务),之后才是全局参数。分区、节、字段归属登记在 packages/contracts/src/settings.ts 的 SETTINGS_SECTIONS,测试断言每个在用的存储字段恰好归属一个分区、且出现在该分区页面上。
| 组 | 分区 id |
一句说明 | 节(锚点) | 存储 / 对象 |
|---|---|---|---|---|
| 接入 | 下载器 downloaders |
qBittorrent 实例与路径映射;下载盘水位和保种天数的缺省值,实例里可以单独改 | instances 实例 · cache 下载盘 · seeding 保种 | 实例(含路径映射、单实例暂停线 / 恢复线 / 清理目标 / 保种天数 / H&R 未知也可清理);cache 水位四项;retention.seedRetentionDays |
| 接入 | 媒体服务器 media-servers |
Emby / Jellyfin 实例与路径映射,只用来查作品有没有 | instances | 实例 |
| 接入 | 站点与网络 sites |
站点缺省值、User-Agent 与代理、浏览器服务;站点、凭证和 Cloudflare 在站点页 | defaults 站点缺省值 · network UA 与代理 · browser 浏览器服务 | sites.*;浏览器服务 |
| 接入 | 元数据 metadata |
TMDB 接入、语言回退与特别篇 | tmdb · language 语言与季集 | metadata.* |
| 流程 | 获取 acquire |
每日下载预算、搜索站点、资源识别;订阅和规则在各自页面 | budget 每日预算 · search 搜索站点 · identity 资源识别 | budget.*、search.*、identity.* |
| 流程 | 媒体库与目录 library |
媒体库目录、整理来源、分类规则、命名模板 | roots · sources · classification · naming · naming-roots | 媒体库目录;organize.classificationYaml / sources;naming.* |
| 流程 | 整理与刮削 organize |
整理方式、最小视频体积、整理后自动刮削和已有文件的覆盖方式 | mode 整理方式 · scrape 刮削 | organize.defaultMode / allowCrossVolumeMove / minSizeBytes / scrape*(覆盖方式:更新 / 只补缺失 / 全部覆盖) |
| 流程 | 智能体 agent |
模型服务、用量与防跑飞限制、自动处理、网页搜索、MCP | upstream · budget 用量与限制 · investigate 自动处理 · runtime 上下文与子会话 · websearch · mcp · capabilities · advanced | 模型服务;pi.*;agent.*(不设预算,只有单次工具调用次数与时长两个上限 + 花费统计;识别失败自动派智能体在「自动处理」) |
| 系统 | 系统 system |
自动化总开关、只读对账、后台任务并发、存储预算、数据保留 | switches 自动化 · readonly · worker-lanes · storage · storage-retention | automation.*、storage.budgets / retentionDays |
| 系统 | 缓存 cache |
各类缓存的条数、占用和有效期,可以按区清空 | regions 缓存区 · tmdb-cache · images · ttl 缓存有效期 | kv_cache 各区 + 图片缓存(GET /cache/regions、POST /cache/regions/{region}/clear、/cache/tmdb*、/cache/images*);cache.tmdbMaxSize / globalImageCache*;storage.cacheTtl |
| 系统 | 账户与安全 account |
密码、二次验证、通行密钥、会话与本机 Token、API Key | password · totp · passkeys · session · api-keys | auth;API Key |
| 系统 | 界面 interface |
只影响当前浏览器 | display · shortcuts | 浏览器本地偏好 |
说明:
- 对象 vs 参数:实例上可覆盖的项(下载盘水位、保种天数)的缺省值放在同一分区的对象列表下面,两处用同一组名字(暂停线、恢复线、清理目标、保种天数)。
- 预算按消耗谁归属:下载预算归「获取」;智能体不设预算,只有防跑飞限制,归「智能体」。
- 不进设置页:站点凭证与 Cloudflare 处理(站点页)、订阅与规则(各自页面)、主密钥(部署环境变量)、通知(暂无渠道设置,不建空分区)。
- 废弃字段(
DEPRECATED_SETTINGS_FIELDS)不显示:pi旧上游字段、cache.tmdbTtlHours / emptyResultTtlSec、identity.poolArchiveDays、retention.logRetentionDays、智能体四个预算字段。 - 搜索:左栏顶部(窄屏在下拉上方)的搜索框按分区名、节名、节别名(
anchors[].keywords,如「H&R」「Cloudflare」「Passkey」)和表单字段名定位;选中字段时滚到该字段并聚焦。 - 旧锚点:
SETTINGS_HASH_ALIASES把重排前的 hash 换到新位置(地址栏 replace,不留历史),见 §6。
3.6 页面内布局规范
| 类型 | 规范 | 现有组件 |
|---|---|---|
| 列表页 | PageHeader(标题 + 一句描述 + 主操作)→ FilterBar(搜索、状态、对象筛选,状态写入 URL query)→ DataTable(行点击开 DetailSheet,不跳页,见 §9)→ 分页 |
page-header filter-bar data-table detail-sheet 均已有 |
| 详情页 | 统一头部:标题 + StatusBadge + 主操作 1 个 + 次操作收进"更多";下方 DetailSection 分节,节顺序:概况 → 进度/状态 → 关联对象 → 历史/证据 |
status-badge kv-list timeline |
| 跨页关联 | 任何对象名都可点,点开同一个 DetailSheet 或深链到其"家"页面 |
— |
| 设置 | 左侧分区导航 + 分区内锚点 + 分节表单,每节独立保存;左栏只有分区一层(§9.1) | 复用 SettingsCard / resource-section |
设置用"左侧分区 + 锚点"而不是 MP 的顶部 Tab,理由:
- 9 个分区在顶部 Tab 会横向溢出(MP 靠
show-arrows,现有 9 Tab 在窄屏已挤);左栏能放每区一句描述,等同 MP 的settingTabs.*.description。 - 分区内有多个节(如 Agent 4 节),锚点可直接深链到节(
/settings/agent#budget),待处理和首页的"去设置"链接能落到具体字段。MP 用子 Tab 嵌套(系统 → 高级 → 6 子 Tab)正是我们要避免的。 - 用二级路由而非
?tab=,浏览器后退、面包屑、审计里的"设置变更"链接都更自然。 - 手机宽度下左栏折叠为顶部下拉选择器。
4. 实施拆分(3 路,可并行)
| 路 | 范围 | 文件 | 预估 |
|---|---|---|---|
| A 导航 / 路由 / 重定向 | 新 NAV_GROUPS、新路由表、旧链接重定向、findNavItem 与面包屑、全站 consolePath 调用点替换 |
components/console/nav.ts、nav.test.ts、app/routes.ts、routes/console/layout.tsx、新 routes/console/redirects.ts、home.tsx 等内部链接 |
0.5–1 天 |
| B 设置页 + contracts | settings.tsx 改为 settings/:section 布局;按 3.4 重组现有表单卡片;新增站点登记表单、元数据分区、账户分区;SETTINGS_SECTIONS 与字段归属测试 |
routes/console/settings*.tsx、routes/console/settings/*.tsx、packages/contracts/src/settings.ts(+ test)、api/settings.ts、api/sites.ts |
1.5–2 天 |
| C 页面合并 / 拆分 | 任务页拆成 downloads(含 plans)与 tasks;订阅页拆出 rules;站点详情加"快照与 Feed / 账号"Tab,来源页收窄为健康总表;身份页"未识别"标记待处理;下载队列页头缓存水位条 |
routes/console/tasks*.tsx → 新 downloads*.tsx、subscriptions.tsx → 新 rules.tsx、sites.$siteId.tsx、sources.tsx、identity.tsx、components/workbench/* |
2 天 |
依赖:A 先合路由表骨架(新路由指向旧组件也可),B、C 在其上并行。验收:旧书签全部 302 到新页;nav.test.ts 数量断言更新为 18;e2e 截图覆盖 7 组首屏与设置 9 分区;e2e 里 ?tab= 深链用例改为新路径。
5. 重构前 vs 后
| 维度 | 重构前 | 重构后 |
|---|---|---|
| 侧栏分组 | 概览 / 媒体 / 获取 / 助手与系统(4 组,获取 5 项) | 概览 / 资源 / 订阅 / 下载 / 整理 / Agent / 系统(7 组,每组 1–4 项,按流程排) |
| 站点 | 工作台、来源快照、设置凭证三处;无登记入口 | 工作台是站点的家(浏览 + 快照 + 账号 Tab);设置"站点与账号"负责登记与凭证;来源页只看跨站健康 |
| 订阅与偏好 | 订阅页内藏"收录策略"Tab;偏好独立一页 | 订阅 / 收录规则 / 偏好标签 三页同组互链 |
| 下载 | "下载与任务"3 Tab 混装;缓存在首页和设置 | 下载队列(带缓存水位)/ 下载计划 / 业务任务 |
| 任务概念 | 业务任务、引擎 run、整理记录互相解释 | 业务任务 = 用户视角;整理记录 = 入库明细(公开接口);引擎面板 = 系统组排查工具 |
| 身份 | 身份页、待处理、媒体详情都能判定 | 判定只在待处理;身份页和详情做维护并标"已进待处理" |
| 设置结构 | 9 个顶部 Tab,按存储 key 切 | 9 个左侧分区,按接入对象切,分区内锚点 |
| 预算 | 下载预算在"缓存与入库",Agent 预算在"Pi 上游" | 下载预算归自动化,Agent 预算归 Agent |
| 库根 / 路径映射 | 两个 Tab | "媒体库与目录"一区,映射挂在库根下,整理默认同区 |
| 元数据 | 无 UI(只能环境变量) | "元数据"分区:TMDB Key / Base URL / 生效来源 |
| API Key | 设置 Tab 与账户菜单同名两物 | 设置里只放签发给外部程序的 Key;浏览器 token 归账户与安全 |
| 命名 | Pi 上游、下载与任务、来源/Feed/快照、工作流引擎 | Agent 上游、下载队列/业务任务、来源健康、引擎面板 |
| 存储 | 8 个 settings key | 不变;新增 SETTINGS_SECTIONS 展示映射 |
6. 已实施对照表(IA-1:导航 / 路由 / 页面合并)
2026-09-28。设置页分区(§3.4、§3.5)由 IA-2 实施,不在本表。
6.1 侧栏(components/console/nav.ts)
| 组 | 项 → 路由 | 与方案的差异 |
|---|---|---|
| 概览 | 首页 /console、待处理 /console/inbox(角标 = 未决数) |
— |
| 资源 | 站点工作台 /console/sites、来源健康 /console/sources |
— |
| 订阅 | 订阅 /console/subscriptions、收录策略 /console/rules、偏好标签 /console/preferences |
页名按术语表用"收录策略"(术语表不用"收录规则"),路由仍是 /rules |
| 下载 | 下载队列 /console/downloads、下载计划 /console/downloads/plans、业务任务 /console/tasks |
— |
| 整理 | 媒体库、整理记录、文件管理 /console/files、身份与元数据 |
身份页页签沿用术语表的"待识别",没有改成"未识别" |
| Agent | Agent 会话 /console/agent |
侧栏顶部的 Agent 唤出按钮与右下角悬浮按钮保留 |
| 系统 | 设置、定时任务(W7-C)、引擎面板、审计日志 | 多出"定时任务"一项,共 19 项 |
- 当前项按
findNavItem(最长前缀)只高亮一项:/downloads/plans不再同时点亮"下载队列"。 - 折叠侧栏按组加细线分隔;手机抽屉复用同一份
NAV_GROUPS。 settingsPath(section, anchor):页面跳设置一律用新分区名,IA-2 上线/settings/:section时只改这个函数。
6.2 路由与重定向(routes/console/redirects.ts)
| 旧 | 新 | 实现 |
|---|---|---|
/console/tasks?tab=downloads |
/console/downloads(保留其余 query) |
tasks.tsx clientLoader |
/console/tasks?tab=plans |
/console/downloads/plans |
同上 |
/console/tasks?tab=tasks |
/console/tasks |
同上 |
/console/tasks/:id(下载任务 ID) |
/console/downloads/:id |
tasks.$id.tsx:业务任务 404 时查下载任务,查到就跳转 |
/console/subscriptions?tab=policies |
/console/rules |
subscriptions.tsx clientLoader |
/console/sources?tab=snapshots&siteId=x |
/console/sites/x?tab=snapshots |
sources.tsx clientLoader;无 siteId 留在来源健康 |
/console/settings?tab=* |
/console/settings#<分区>[/<节>] |
IA-2:settings.tsx clientLoader;W8-A 起 settingsPath() 直接生成 hash |
nav.test.ts 断言每个导航项、每个重定向目标都在 routes.ts 里;冒烟(scripts/smoke.mjs 的 REDIRECT_ROUTES)逐条打开旧地址,确认落到新地址且 200。
6.3 页面合并 / 拆分
| 方案 | 落地 |
|---|---|
| 站点三处合一(C1) | 站点工作台页头"登记站点"(可选内置站点定义);站点详情 4 个页签:整理视图 / 原站视图 / 快照与 Feed / 账号(账号列表 + 凭证表单);来源健康只留站点健康总表与全部 Feed,站点名深链到详情"快照与 Feed" |
| 下载 / 计划 / 业务任务分开(C2) | 原"下载与任务"三页签拆成三页;业务任务行点开抽屉,详情页 /tasks/:id 列概况、关联对象(对象、上级任务、引擎运行)、文件操作;下载详情时间线里的任务事件改链到业务任务详情 |
| 缓存集中到下载队列(C3) | 下载队列页头"缓存水位":各卷水位条、在途/预留/可清理、"调整阈值"(跳设置)与"立即清理"(排队后跳到对应业务任务);首页"缓存水位""当前工作"两块链到下载队列 |
| 收录策略与偏好互链(C6) | 两页页头互放链接;订阅页不再有页签 |
| 身份判定只在待处理(C7) | 身份页"待识别"只读:详情抽屉只剩"重新识别",多候选 / 待确认的行标"已进待处理 →";页头"待确认身份"跳 /inbox?kind=identity_ambiguous;外部身份的锁定和别名维护保留 |
| 列表页规范 | 下载队列、下载计划、业务任务、来源健康的筛选写进 URL query(use-query-state.ts),行点击开 DetailSheet |
6.4 遗留
"没有匹配 / 查询失败"的待识别资源不生成待处理事项:W8-A 已为这两类开identity_unresolved事项(手动指定 TMDB ID / 选本地作品 / 忽略),见08-v0.2-closeout(已删除,见 gitceb66f8)。:W8-A 已改为agent-conversation.tsx仍链到/console/tasks/:下载任务ID/console/downloads/:id。components/agent/quick-goals.ts里的"待识别池"文案(W7-B 范围)。- 原站视图仍是占位。
6. 设置分区已实施对照(2026-10-06 重排;替换 IA-2)
路由仍是 /console/settings,分区用 URL hash 定位:#<分区> 或 #<分区>/<节>;旧 ?tab= 由设置页 clientLoader 跳到对应 hash,旧 hash 由 resolveSettingsHash 换到新位置。分区与说明见 §3.4;组件在 apps/web/app/components/settings/(每个分区一个文件:downloaders instances(媒体服务器)sites metadata acquire library organize agent system cache account interface),搜索索引在 search-index.ts。
页面:宽屏左栏 = 搜索框 + 三组分区(当前分区展开节列表),右侧分区标题 + 一句说明 + 各节;窄屏 = 搜索框 + 分组下拉 + 一句说明 + 节的横排胶囊。每节有标题与说明;全局设置类的节有「未保存」标记、节尾保存条(还原 / 保存),保存后提示「已保存「节名」」;实例、站点、模型服务类在抽屉里保存;危险操作(清空缓存、删除)二次确认。
旧锚点映射(SETTINGS_HASH_ALIASES;同名的 #downloaders、#agent/*、#sites/*、#library/{roots,sources,classification,naming}、#metadata/tmdb 不变):
| 旧 | 新 |
|---|---|
#automation、#automation/switches |
#system、#system/switches |
#automation/cache(?tab=storage) |
#downloaders/cache |
#automation/budget |
#acquire/budget |
#automation/retention |
#downloaders/seeding(日志保留天数已废弃) |
#automation/advanced、#automation/readonly |
#system/readonly |
#automation/{worker-lanes,storage,storage-retention} |
#system/ 同名节 |
#automation/storage-ttl |
#cache/ttl |
#automation/<其它> |
#system |
#library/organize、#library/scrape |
#organize/mode、#organize/scrape |
#metadata/identity |
#acquire/identity |
#metadata/tmdb-cache、#metadata/images |
#cache/tmdb-cache、#cache/images |
#api-keys、#api-keys/keys(?tab=api-keys) |
#account/api-keys |
#account/shortcuts |
#interface/shortcuts |
#sites/accounts |
#sites |
遗留:components/console/nav.ts 的 SettingsSection 类型仍是旧分区名(automation、api-keys 靠别名跳转可用),新分区 acquire / organize / system / cache / interface 要等 nav.ts 的 owner 补进类型后才能用 settingsPath() 直接深链。
7. IA-3 已实施对照(FE-1,2026-09-28)
依据 00-first-version-plan(已删除,见 git ceb66f8) §8"IA-3 最终定稿"。定稿文字写"共 12 项",逐项清单是 14 项,按清单实施。
7.1 侧栏(components/console/nav.ts,5 组 14 项)
| 组 | 项 → 路由 | 说明 |
|---|---|---|
| 概览 | 首页 /console、任务 /console/tasks、Agent 会话 /console/agent |
待处理不进侧栏 |
| 资源 | 站点 /console/sites、RSS 订阅 /console/sources |
页面标题由站点区(FE-2)更新;"RSS 订阅"与术语表"Feed"并存,术语表待定 |
| 订阅 | 订阅 /console/subscriptions、规则 /console/rules |
偏好标签页保留路由,由规则页(FE-3)收编 |
| 整理 | 下载面板 /console/downloads、整理记录、文件管理、媒体概览 /console/library |
下载计划成为下载面板第二个页签(/downloads/plans 路由不变) |
| 系统 | 设置、审计 /console/audit、运行状态 /console/status |
引擎面板、定时任务、身份与元数据不再有入口 |
- 顶栏收件箱(
components/console/inbox-bell.tsx):铃铛 + 未决角标;下拉按问题类型分组列最近 8 条,点开进/console/inbox?kind=,"查看全部"进待处理页(路由保留)。 - 顶栏标题
pageTitle():导航项名,或不在侧栏的页面名(待处理、偏好标签)。
7.2 重定向(routes/console/redirects.ts)
| 旧 | 新 |
|---|---|
/console/engine[?…] |
/console/tasks[?…] |
/console/engine/:runId |
/console/tasks?run=:runId(任务抽屉) |
/console/schedules |
/console/tasks?tab=plan/console/tasks?tab=plan[&job=] → /console/schedules[?job=] |
/console/tasks?tab=business / tab=tasks |
/console/tasks |
/console/identity(tab=pool) |
/console/library?filter=unidentified |
/console/identity?tab=external / aliases |
/console/library?view=identities / view=aliases |
/console/tasks/:id |
先按任务(引擎运行)查;不是则按旧业务任务查,有引擎运行就跳过去;再不是就按下载任务跳 /downloads/:id |
7.3 任务页(/console/tasks)
- 页签:全部 / 进行中(进行中 + 排队)/ 失败 / 计划;页签带计数(
/engine/stats)。 - 任务流 =
GET /engine/runs+business:行显示业务标题(title,否则类型 + 短 id,否则工作流做什么)、来源(定时 / 事件 / 手动 / Agent;API Key 算手动)、状态、开始与耗时、关联链接。 - 筛选写进 URL:
source、kind(businessKind)、ref(businessRefId)、status、since(1h/24h/7d/30d →from)、workflow(旧引擎链接)。来源筛选走服务端triggeredBy(手动 =user,api_key)。 - 详情抽屉
?run=:业务摘要 → 时间线(创建、开始、等待、失败步骤、结束)→ 相关审计(/audit?targetType=engine_run&targetId=,定时任务另链scheduled_job)→ 折叠的引擎步骤(原引擎面板详情:步骤尝试、信号、输入输出)。操作:未结束可取消,已结束可重跑(重跑后抽屉切到新任务)。/console/tasks/:id是同内容的独立页。 - 计划页签 = 原定时任务看板(
components/schedules/schedule-board.tsx)。卡片"运行记录"跳任务流kind=schedule&ref=<key>;该筛选下页头给出定时任务自己的运行记录(含跳过)与回到卡片的链接;?job=高亮并滚到卡片。
7.4 首页
正在进行(任务流进行中前 5 + 排队/下载计数)、需要我处理(计数 + 前 3 条)、媒体概览(作品/季/资产计数、版本目标满足率、今日产出)、计划带(下一次运行的 5 项、启用/失败计数、快速开关)、最近完成/失败、缓存与保留、来源健康(站点 + 账号状态,来自 /sites?include=accounts,有问题的排前)、运行状态摘要(/system/health)。
7.4a 任务与计划分开(FE-6,2026-09-29)
- 侧栏概览组:首页 / 任务 / 计划 / Agent 会话(共 15 项)。任务页只剩 全部 / 进行中 / 失败 三个页签。
- 计划页
/console/schedules(components/schedules/schedule-board.tsx的PlanBoard):顶部两组计数(自动任务:已启用 / 上次失败 / 运行中;Agent 巡检:已启用 / 上次失败 / 近 7 天费用),点一下滚到对应节。- 「自动任务」
#auto:kind=task,按 采集 / 下载 / 整理 / 维护 分组的紧凑列表(auto-task-list.tsx):名称、开关、间隔(下拉常用值 + 自定义;cron 直接改表达式)、上次结果与耗时、下次运行倒计时、失败原因(折叠)、操作(立即执行 / 跳过本次 / 运行记录 → 任务页kind=schedule&ref=/ 恢复默认)。 - 「Agent 巡检」
#checks:kind=agent_check,卡片(agent-check-card.tsx):目标模板、能力白名单(前 6 项 + N)、预算、上游(最近会话的 provider · model,没有会话时显示默认 Agent 上游)、触发条件、间隔、下次、每次费用(上次 + 近 N 次平均)、最近结果、最近 3 个会话(链到/console/agent/:id);运行记录抽屉逐条链会话;新建 / 编辑巡检对话框。费用与模型来自GET /agent/runs?trigger=schedule,按createdBy = schedule:<id>分组。 ?job=高亮并滚到该行 / 卡片。
- 「自动任务」
- 首页计划带改为两个计数块:自动任务(启用 / 失败)→
#auto,Agent 巡检(启用 / 近 7 天费用)→#checks。
7.5 运行状态页(/console/status)
顶部横幅按 level 列出问题;进程表(类型、主机/pid、版本、启动、最后心跳、延迟/峰值、并发、运行中、SSE、内存);趋势(1/6/24/168 小时,事件循环延迟峰值与 SSE 连接数,recharts 无彩,多进程靠线型和图例区分);数据库、任务引擎、定时任务(失败项链到计划卡)、磁盘(阈值刻线)、挂载根。
7.6 后端缺口
W10 已补(2026-09-28):
/dashboard的automation.library{entities, movies, series, seasons, episodes, assets}与automation.slotSatisfiedRate,首页媒体概览三个计数与满足率直接取用。/engine/runs?triggeredBy=(单值或逗号多值,服务端逐页推断后筛选,一页可能少于 limit,以nextCursor为准,单次请求最多扫 2000 行);来源筛选改走服务端。/engine/runs?status=running,pending多值;"进行中"页签改为一次查询 + 游标分页,不再两次各取 100 条合并。
仍未补:定时任务的运行记录(scheduled_job_run)没有对应引擎 run id,卡片与任务之间只能按 business.kind=schedule + key 关联;feeds.poll 这类只发事件的定时任务,触发的任务记在 Feed 名下。
8. 问题回到发生处(2026-10-06,取消待处理中心)
用户决定:待处理中心「鸡肋」。优先自动解决;真正要人处理的主要是「下载完识别不到」,在整理记录里就地处理。
decision 表保留为内部机制(去重、触发智能体调查、自动关闭),不再作为逐条处理的页面。前面各节里关于「待处理」页、
「判定只在待处理」、顶栏收件箱按问题类型列事项的约定以本节为准。
| 问题 | 去向 |
|---|---|
| 下载完识别不到、路径冲突、文件被排除、整理卡住 / 失败 | 整理记录「需要处理」筛选,行内写原因与推荐动作(指定作品 / 重新整理 / 让智能体识别 / 忽略),一键执行;识别不到时缺省自动派一次智能体识别 |
| 集数待确认 | 先自动解决(确定性换算、剧集组、智能体写规则);解决不了的原因在订阅详情与作品页集数映射里按组显示,不开给用户逐条处理的条目 |
| 下载失败 / 卡住 | 下载面板行内状态 + 智能体授权内自动恢复 |
| 站点不可达、下载器离线、下载目录读不到容量、磁盘空间不足、媒体库目录离线 | 运行状态「需要关注」+ 铃铛,恢复后自动消失 |
| 需要你批准的智能体操作(会话审批、方案选择、计划审批、原站页面等你接手) | 铃铛 |
| 搜索 / RSS 扫进来的未识别资源 | 静默留在媒体库「未识别」,不提示;要处理的在那里选候选或手动指定 |
- 侧栏没有「待处理」;
/console/inbox?kind=按问题类型跳到上表对应页面(redirects.ts inboxRedirect,没带类型去整理记录「需要处理」)。 - 铃铛(
inbox-bell.tsx)只放两组:等你批准、系统健康;数据来自GET /attention。 - 首页「要我处理」与运行状态「需要关注」(
#attention)放汇总计数(「3 条整理需要处理」「1 个站点不可达」),点进去到对应页面;只列非零项。 - 运行状态另有「智能体用量」(今天 / 最近 7 天按会话类型的次数与花费);智能体不设次数和花费上限。
8. 界面第二轮:系统组只留日志、运行状态、设置(2026-10-06)
- 侧栏 4 组 13 项:概览(首页、智能体会话)/ 获取 / 整理 / 系统(日志、运行状态、设置)。任务、审计、引擎面板、计划不再有入口。
- 日志页
/console/logs:任务、定时与自动、登录、审计合成一份列表,可实时追加、勾选后问智能体;第二个页签「定时任务」是原计划页。旧地址:/console/tasks(含?tab=?status=?kind=&ref=?run=)、/console/engine(/:id)、/console/audit(?targetType=&targetId=→ 对象筛选)、/console/schedules(?job=)都跳到日志页对应筛选;/console/tasks/:id起初保留为独立页,2026-10-08 起改成日志页的任务抽屉(§9)。 - 运行状态页加「资源」节(CPU / 内存 / 网络 / 磁盘读写与趋势),首页「存储情况」卡换成运行状态简版卡。细节见
docs/runbook/logs.md。
9. 导航层级与记录抽屉(2026-10-08,现行标准)
控制台怎么分层、从列表打开一条记录怎么展示,以这一节为准;控件标准只引用这里,不另写一份。
9.1 最多两层
- 侧栏一项 = 一个页面。页面里最多再有一层切换(页签或分段控件),不再往下嵌第三层。
- 筛选、视图(卡片 / 列表 / 日历)、图表的时间范围是同一页的显示方式,不算一层导航。
- 设置页左栏只有一层:分区。节不出现在左栏和窄屏的下拉下面,是页面里的小标题;搜索与
#分区/节深链仍能滚到节和字段。
9.2 从列表打开记录 = 右侧抽屉
- 列表 / 卡片里点一条(看详情、编辑、排查)打开右侧抽屉
DetailSheet(components/console/detail-sheet.tsx),列表留在原处,滚动位置和筛选都不动。抽屉材质是pg-float,手机上全宽。 - 宽度:
md(约 32rem,简单记录)、lg(约 44rem,有时间线或文件明细)、xl(约 64rem,内容重的:订阅对比、站点)。 - 打开的记录写在地址栏
?open=<id>,其余参数照留;刷新、分享链接、前进后退都能还原。抽屉里的页签等只属于抽屉的参数(站点的?tab=)随抽屉走,关掉时一起去掉。 - 在本页打开是 push,所以浏览器后退就是关抽屉;关闭按钮 / Esc 在本页打开时等于后退一步,从别处链接直接进来时 replace 去掉参数、留在列表。抽屉开着时换一条记录是 replace。
- 不叠第二层抽屉。抽屉里再打开的详情(站点里的资源、RSS,订阅里的格子)在同一个抽屉里换成子视图,顶部「返回」(Esc 也是先返回);需要更多空间就链到对象自己的页面。
- 动作表单(新建、从「⋯」菜单打开的编辑表单、确认)是对话框性质,可以不进地址栏。
- 实现:列表页用
useRecordSheet(),链接用<RecordLink page id>,代码里跳转用useOpenRecord(),别处拼地址用recordPath(page, id)(都在components/console/record-sheet.tsx)。日志页的记录参数是?log=<日志 id>,任务也可以只带?run=<引擎运行 id>(taskPath(id)),规则同上。
9.3 独立页面只给要待一阵子的工作对象
- 作品:
/console/library/:id、/console/media/tmdb/:type/:id。 - 智能体会话:
/console/agent/:runId。 - 其余对象(整理记录、订阅、站点、下载、任务、规则组、外部身份、未识别资源、设置里的实例)都是所属列表页上的抽屉。
9.4 旧地址
routes/console/redirects.ts 把旧的详情页地址换到列表页抽屉,其余参数跟在后面:
| 旧 | 新 |
|---|---|
/console/organize/:id |
/console/organize?open=:id |
/console/subscriptions/:id |
/console/subscriptions?open=:id |
/console/sites/:id(?tab=…) |
/console/sites?open=:id(&tab=…) |
/console/downloads/:id |
/console/downloads?open=:id(/downloads/plans(/:id) 仍按 §7 跳 ?plan=) |
/console/tasks/:id |
/console/logs?type=task&run=:id;id 是旧业务任务时抽屉里换成它的引擎运行或显示旧任务概况,是下载任务时换到 /console/downloads?open=:id |
/console/files/trash |
/console/files?view=trash(回收站是文件管理右侧的一个视图,左栏「回收站」切过去) |
/console/sources?siteId=x |
/console/sites?open=x&tab=rss |
站内链接、铃铛、命令面板、任务时间线、整理队列都直接拼新地址;智能体会话里的链接与服务端 agent/challenge.ts 生成的地址还是旧格式,靠上表跳转。
9.5 现状对照
| 页面 | 处理 |
|---|---|
| 整理记录 | 行点开 lg 抽屉:状态、操作、路径、文件明细、整理后刮削;队列面板里的「整理记录」换成记录抽屉 |
| 订阅 | 卡片 / 列表 / 日历点开 xl 抽屉,覆盖对比的格子在同一抽屉里换成子视图 |
| 站点 | 卡片 / 列表点开 xl 抽屉,里面一层页签(概览、资源、原站视图、抓取、RSS、账号);资源、RSS 详情是子视图 |
| 下载面板 | 行点开 lg 抽屉,?open= 是下载任务或计划 id;不在当前分段里的也能打开 |
| 日志 | 行点开抽屉(?log= / ?run=),不再有「打开任务页」 |
| 文件管理 | 文件详情原本就是 ?sel=;回收站并进右侧视图 |
| 规则 | 规则组编辑、「自动收新作品」的策略版本查看走 ?open= |
| 媒体库 | 「未识别」「外部身份」的行抽屉走 ?open=;作品仍是独立页 |
| 设置 | 左栏只列分区;各分区里实例列表(下载器、媒体服务器、媒体库目录等)的编辑抽屉走 ?open= |