控制台交互约定
这一页是控制台的交互约定:新增或修改界面时应遵守的规则。违反它们不会报错,只会让界面在边缘情况下变得难以使用。
操作入口
- 每个操作区域突出一个主要操作;模型页保留探测,将统一名称和历史合并到「模型工具」。
- 行内只展示高频操作。令牌保留查看入口,编辑、旋转和删除放入「更多操作」。
- 更多菜单与右键菜单调用同一份动作定义。按查看、配置、维护、批量和危险操作分组;删除、旋转放在末尾。
- 右键菜单标明操作对象。禁用项不可执行,可用
disabledReason说明原因;与单个动作同名的分组标题不重复展示。 - 右键批量选择包含当前行。菜单按实体 ID 查找最新数据,避免刷新后操作旧对象。
- 链接、输入框、选中文本保留浏览器原生菜单;Shift + 右键也保留原生菜单。可聚焦的列表行支持 Shift + F10。
菜单、抽屉与表单
- 复用
ActionMenu、SearchableSelect、Dialog、Drawer,不要另起一套定位、Escape 或滚动锁逻辑。 - 菜单与选择器挂载到 body,限制宽高并在内部滚动。靠屏幕边缘打开时根据布局尺寸定位,不能使用入场动画缩小后的尺寸。
- Dialog 与 Drawer 使用同一层级,并按 portal 的 DOM 顺序确定顶层;菜单在其上方。React effect 的执行顺序不能作为视觉层级。
- Escape 只处理最上层;打开的字段提示先关闭提示。输入法正在组合文字时,Escape 交还输入法。
- 菜单支持方向键、Home/End、文本定位和 Tab 离开。关闭后恢复合理焦点,点击外部控件时不能抢走该控件的焦点。
- 模态层限制 Tab 范围,关闭后恢复来源控件;多个模态层必须共享滚动锁,乱序关闭也不能提前解锁页面。
- 保存/删除期间传
busy={pending},锁定字段和操作,阻止关闭、取消和重复提交;失败后保留输入和错误反馈。 Button、IconButton默认type="button"。真正提交表单的按钮显式使用type="submit"。
展示真实路由状态
- 模型列表的固定成员按
single_member_id展示;自动路由的优先成员只是配置摘要,实际承接渠道看请求日志。 /admin/routes/explain接受route_group,复用真实候选评估,不发送上游请求,不写代理日志或账单。- 诊断返回
requested_group、route_group、group_fallback。只有候选来自同一分组时才返回有效分组名;旧规则回退到多个分组时不能把第一个成员的分组当作整个候选池。 - 保留既有选择规则:未指定分组保留全量候选;显式分组优先,未匹配时回退 default,default 也为空时保留历史的全量回退。
- 单渠道模式的有效重试次数读取后端诊断值,保留 0。固定成员不在当前分组候选池时,界面解释该分组的自动选择行为。
搜索与布局
- 日志搜索、模型和上游请求 ID 同时提交;Enter 与「应用」一致。清除筛选同时重置慢请求开关;从链接进入时同步输入框。
- FTS 与站点/渠道筛选叠加。带连字符的模型名和请求 ID 可直接搜索;SQL 参数与 FTS 字符串分别转义,LIKE 降级保留反斜杠、百分号、下划线的字面含义。
- 延迟分布默认折叠,明确统计全站最近 1000 条;它不随列表筛选变化。
- 手机使用紧凑统计栏或两列统计卡片,统一标题左对齐。宽表在内部横向滚动,时间和模型标识避免挤成逐字换行;长名称提供完整标题。
- 查询错误、加载、空数据、禁用、冷却和提交中是不同状态,不混用成功状态或静默清空表单。