Files
bot_dev1 7a2e45e7c4 feat: 全站 Ant Design Pro 风格重构 + 登录守卫与角色门户(issue #131/#134)
- 新增 web/shared:pro.css(AntD 5 设计系统,旧 CSS 变量统一映射 AntD 色板)、
  session.js(后端优先+本地账号降级双轨会话,IAOP_AUTH 兼容层)、
  pro-header.js(全站统一 Pro 导航条:logo/页题/用户角色 Tag/退出)
- 门户 web/index.html:未登录跳登录页(next 回跳),登录后按角色过滤
  可见模块(readonly→驾驶舱/助手/移动端;engineer→+配置台;admin→全部)
- 登录页 auth/login.html 重写为 Ant Design Pro 风格,本地降级模式自动
  播种演示账号(admin/engineer/viewer),保留 OIDC SSO 双轨入口
- user_store.js 新增 verify() + seedDefaults() 默认账号播种
- 六模块页统一接入 pro.css + 统一导航条 + 登录守卫(PRD 8.2)
- 驾驶舱主题 dark→light(Ant Design 5 色板):renderer.py THEME_TOKENS、
  ti-cl4/resin 模板 theme、告警三级配色对齐 AntD(P0 #ff4d4f/P1 #faad14/
  P2 #1677ff),渲染计划已重编(build_plans.py)
- 验证:core/cockpit 86 单测通过;JS 语法检查通过;静态冒烟全 200
2026-08-05 14:17:37 +08:00
..

配置化驾驶舱内核模块(iAOP-Core / cockpit)

对齐 PRD 5.5「⑤ 配置化驾驶舱」:把驾驶舱抽象为模板化配置资产,按"布局/配置"渲染, 切换行业模板零改前端代码(PRD 5.5 验收口径)。

模块状态

能力 Issue 状态
布局 JSON Schema 定义 + 校验/解析 #50 feature/issue-50(推进中)
图表组件配置化渲染引擎(RenderPlan) #51 feature/issue-51(推进中)
报警看板配置化(阈值/规则外置) #52 本分支 feature/issue-52

#52「报警看板配置化」把告警面板(alarm_panel)的展示语义外置为模板配置资产, 让"换行业只换配置、前端代码零改动"也覆盖到告警面板。配置点:

  • 严重度→颜色映射(severityColors):P0/P1/P2 三级各自的 fg/bg/可选 icon/border, 覆盖主题默认告警色;驾驶舱红色告警(PRD 5.3 ③ 场景A)即由 P0 的 fg 决定。
  • 告警规则 / 阈值源绑定(rulesSource / thresholdsSource):告警面板订阅哪份 规则资产(kind: asset + ref)或内联规则(kind: inline + data)——把"看哪条规则" 也变成配置项,避免把规则 id 写死在前端。
  • SOP 联动(showSop):PRD 场景A「LLM 生成原因+处置建议 → 值班长确认」是否在面板展开。
  • 确认 / 静默行为(requireAck / ackTimeoutS / muteLower):关键告警是否强制人工确认、 超时升级、是否静默低于某 severity 的提示。
  • 分组 / 排序 / 最大条数(groupBy / sortBy / maxItems):大屏展示策略外置。

用法

from cockpit import (
    validate_alarm_config, load_alarm_config, render_alarm_panel_props,
)

# 1) 配置资产(通常来自模板 YAML;这里用 dict 示意)
config = {
    "$schema": "iAOP-cockpit-alarm-panel-v1",
    "severityColors": [
        {"severity": "P0", "fg": "#ff3b30", "bg": "rgba(255,59,48,0.12)", "icon": "alert-octagon"},
        {"severity": "P1", "fg": "#f5a623", "bg": "rgba(245,166,35,0.12)"},
        {"severity": "P2", "fg": "#3aa0ff", "bg": "rgba(58,160,255,0.10)"},
    ],
    "rulesSource": {"kind": "asset", "ref": "ti-cl4/impurity-forecast/config/alert_rules.template.yaml"},
    "showSop": True, "requireAck": True, "ackTimeoutS": 300, "muteLower": "P2",
    "groupBy": "severity", "sortBy": "severity", "maxItems": 50,
}

# 2) 校验(聚合全部字段级错误,便于配置台「错误列表」展示)
result = validate_alarm_config(config)
assert result.ok, result.errors

# 3) 加载为内存模型
cfg = load_alarm_config(config)

# 4) 编译为 alarm_panel 组件的 props(#51 渲染层在 _build_props 里合并即可)
props = render_alarm_panel_props(cfg)
#   -> {'subscribe': 'alarm_stream', 'severityStyles': {...}, 'rulesSource': {...},
#       'showSop': True, 'requireAck': True, 'ackTimeoutS': 300, ...}

切换行业模板(如树脂)= 换一份配置资产(不同配色 / 规则源),render_alarm_panel_props 随配置变化产出不同 props,前端代码零改动。

设计要点

  • 零运行时依赖:只用标准库,配置资产是可 json.dumps 的纯 dict,便于配置台发布与审计。
  • 声明式 + 强校验:validate_alarm_config 收集全部字段级错误(沿用 #50 LayoutValidationResult 风格);load_alarm_config 校验失败抛 AlarmConfigError 并携带错误清单。
  • 与 #50/#51 解耦:本模块不 import layout / renderer(它们在各自 feature 分支上推进), 避免对未合并分支形成硬依赖;render_alarm_panel_props 仅产出 alarm_panel 组件的 props dict, 由 #51 渲染层在 _build_props 里合并即可。#50/#51 合入 main 后,本模块的 __init__ 会合并它们的导出(CockpitLayout / validate_layout / RenderPlan 等)。

测试 / 验收

# 在 core/cockpit 目录下
python -m unittest discover -s tests -p "test_alarm_config.py" -v   # 28 用例
python scripts/verify_alarm_config.py                                # 验收脚本

参考资产:templates/ti-cl4/dashboard/alarm_panel.ti.yaml(氯化车间/海绵钛告警面板配置)。