Files
hunjing/design/admin.html
T
2026-09-21 11:19:07 +08:00

400 lines
36 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="zh-CN" data-theme="dark">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>司命台 · 管理面 — 魂镜 Hunjing</title>
<link rel="stylesheet" href="assets/app.css?v=10">
</head>
<body>
<svg style="display:none" aria-hidden="true">
<symbol id="i-moon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"/></symbol>
<symbol id="i-home" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/><path d="M9 22V12h6v10"/></symbol>
<symbol id="i-shield" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/></symbol>
<symbol id="i-kanban" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 3h4v18H5z"/><path d="M10 3h4v12h-4z"/><path d="M15 3h4v8h-4z"/></symbol>
<symbol id="i-users" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"/><circle cx="9" cy="7" r="4"/><path d="M23 21v-2a4 4 0 0 0-3-3.87"/><path d="M16 3.13a4 4 0 0 1 0 7.75"/></symbol>
<symbol id="i-package" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/><polyline points="3.27 6.96 12 12.01 20.73 6.96"/><line x1="12" y1="22.08" x2="12" y2="12"/></symbol>
<symbol id="i-monitor" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="3" width="20" height="14" rx="2"/><line x1="8" y1="21" x2="16" y2="21"/><line x1="12" y1="17" x2="12" y2="21"/></symbol>
<symbol id="i-sliders" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="4" y1="21" x2="4" y2="14"/><line x1="4" y1="10" x2="4" y2="3"/><line x1="12" y1="21" x2="12" y2="12"/><line x1="12" y1="8" x2="12" y2="3"/><line x1="20" y1="21" x2="20" y2="16"/><line x1="20" y1="12" x2="20" y2="3"/><line x1="1" y1="14" x2="7" y2="14"/><line x1="9" y1="8" x2="15" y2="8"/><line x1="17" y1="16" x2="23" y2="16"/></symbol>
<symbol id="i-clock" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><polyline points="12 6 12 12 16 14"/></symbol>
<symbol id="i-file" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/></symbol>
<symbol id="i-download" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="7 10 12 15 17 10"/><line x1="12" y1="15" x2="12" y2="3"/></symbol>
<symbol id="i-lock" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="11" width="18" height="11" rx="2"/><path d="M7 11V7a5 5 0 0 1 10 0v4"/></symbol>
<symbol id="i-search" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></symbol>
<symbol id="i-refresh" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="23 4 23 10 17 10"/><path d="M20.49 15a9 9 0 1 1-2.12-9.36L23 10"/></symbol>
<symbol id="i-check" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></symbol>
<symbol id="i-x" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></symbol>
<symbol id="i-activity" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="22 12 18 12 15 21 9 3 6 12 2 12"/></symbol>
<symbol id="i-database" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><ellipse cx="12" cy="5" rx="9" ry="3"/><path d="M21 12c0 1.66-4 3-9 3s-9-1.34-9-3"/><path d="M3 5v14c0 1.66 4 3 9 3s9-1.34 9-3V5"/></symbol>
<symbol id="i-server" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="2" width="20" height="8" rx="2"/><rect x="2" y="14" width="20" height="8" rx="2"/><line x1="6" y1="6" x2="6.01" y2="6"/><line x1="6" y1="18" x2="6.01" y2="18"/></symbol>
<symbol id="i-cpu" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="4" y="4" width="16" height="16" rx="2"/><rect x="9" y="9" width="6" height="6"/><line x1="9" y1="1" x2="9" y2="4"/><line x1="15" y1="1" x2="15" y2="4"/><line x1="9" y1="20" x2="9" y2="23"/><line x1="15" y1="20" x2="15" y2="23"/><line x1="20" y1="9" x2="23" y2="9"/><line x1="20" y1="14" x2="23" y2="14"/><line x1="1" y1="9" x2="4" y2="9"/><line x1="1" y1="14" x2="4" y2="14"/></symbol>
<symbol id="i-alert" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"/><line x1="12" y1="9" x2="12" y2="13"/><line x1="12" y1="17" x2="12.01" y2="17"/></symbol>
<symbol id="i-chevrons" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="11 17 6 12 11 7"/><polyline points="18 17 13 12 18 7"/></symbol>
</svg>
<div class="app">
<aside class="sidebar">
<div class="brand">
<div class="brand__mark" aria-hidden="true"></div>
<div class="brand__text">
<div class="brand__name">魂镜</div>
<div class="brand__sub">司命台 · 管理面</div>
</div>
</div>
<nav class="side-nav" aria-label="管理面导航">
<div class="nav-group">
<div class="nav-group__title">运营</div>
<a class="nav-item is-active" href="#queue" aria-current="page"><svg><use href="#i-kanban"/></svg><span style="font-size:14.5px">治理队列</span></a>
<a class="nav-item" href="#tickets"><svg><use href="#i-file"/></svg><span style="font-size:14.5px">支持工单</span><span class="nav-plain">3</span></a>
<a class="nav-item" href="#users"><svg><use href="#i-users"/></svg><span style="font-size:14.5px">用户</span></a>
<a class="nav-item" href="#perms"><svg><use href="#i-shield"/></svg><span style="font-size:14.5px">权限管理</span></a>
</div>
<div class="nav-group">
<div class="nav-group__title">部署</div>
<a class="nav-item" href="#health"><svg><use href="#i-server"/></svg><span style="font-size:14.5px">服务健康</span></a>
<a class="nav-item" href="#backup"><svg><use href="#i-database"/></svg><span style="font-size:14.5px">迁移与备份</span></a>
<a class="nav-item" href="#queue" title="插件案件在治理队列「插件」分类"><svg><use href="#i-package"/></svg><span style="font-size:14.5px">插件治理</span></a>
</div>
<div class="nav-group">
<div class="nav-group__title">观测</div>
<a class="nav-item" href="#slo"><svg><use href="#i-activity"/></svg><span style="font-size:14.5px">SLO 与指标</span></a>
<a class="nav-item" href="#audit"><svg><use href="#i-shield"/></svg><span style="font-size:14.5px">审计日志</span></a>
</div>
<div class="nav-group">
<div class="nav-group__title">边界</div>
<a class="nav-item" href="governance.html"><svg><use href="#i-lock"/></svg><span style="font-size:14.5px">治理边界说明</span></a>
</div>
</nav>
<div class="side-foot">
<button class="icon-btn side-fold-btn" data-sidebar-fold aria-label="收起侧栏" title="收起 / 展开侧栏(记忆偏好)"><svg><use href="#i-chevrons"/></svg></button>
<span class="avatar avatar--sm avatar--user">司</span>
<span style="font-size:12.5px">运维 · 管理员</span>
<button class="icon-btn" data-theme-toggle style="margin-left:auto" aria-label="切换到月白主题"><svg><use href="#i-moon"/></svg></button>
</div>
<div style="border-top:1px solid var(--line-soft);padding:10px 16px">
<a href="home.html" style="font-size:12px;display:flex;align-items:center;gap:6px"><svg style="width:13px;height:13px"><use href="#i-home"/></svg>返回用户界面</a>
</div>
</aside>
<main class="main">
<header class="topbar">
<div class="crumbs"><span class="cn">司命台</span><span class="crumbs__sep">/</span><span class="here">管理面 · 运营与部署</span></div>
<div class="topbar__spacer"></div>
<span class="badge badge--warn"><span class="badge__dot"></span>双人授权会话 · 剩 41 分钟 <span class="mono">admin_session</span></span>
<span class="prototype-tag">静态原型 · 待审查</span>
<button class="icon-btn" data-theme-toggle aria-label="切换到月白主题"><svg><use href="#i-moon"/></svg></button>
</header>
<div class="content">
<div class="realm-banner" role="note">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/></svg>
管理面边界:管理员不可读取私箧与用户明文内容;产品宪章的永久禁域不可被管理员配置关闭;敏感操作需双人授权(本次会话已授权)且全部写入审计。
</div>
<div class="hero" style="margin-bottom:22px">
<div>
<h1>治理总览</h1>
<p style="color:var(--text-2);font-size:13px;margin-top:4px">2026-09-16 09:40 · 自托管标准部署 · 区域驻留 cn-east-1(不跨区漂移)</p>
</div>
<div class="hero__stats">
<div class="hero__stat"><b style="color:var(--warn)">1</b><span>活跃告警</span></div>
<div class="hero__stat"><b>5</b><span>待处理司议</span></div>
<div class="hero__stat"><b>3</b><span>支持工单(未结)</span></div>
<div class="hero__stat"><b style="color:var(--ok)">99.87%</b><span>SLO 30 天(目标 99.9%)</span></div>
</div>
</div>
<section class="section card" id="astrolabe">
<div class="card__head">
<span class="cn">灵台星盘<span class="cn__plain">引擎六枢 · 活的仪表</span></span>
<span class="mirror-state mirror-state--steady" style="margin-left:auto"><i></i>稳镜 · steady <span class="cn__plain">铜镜四态:虚镜 / 息镜 / 稳镜 / 裂镜</span></span>
</div>
<div class="astrolabe-wrap">
<div class="astrolabe">
<svg viewBox="0 0 320 320" role="img" aria-label="灵台六枢星盘:太一居中,小周天、洛书、河图、陶钧、烛照环绕;烛照告警闪烁">
<g class="ast-spin"><circle cx="160" cy="160" r="148" fill="none" stroke="var(--gilt-faint)" stroke-width="0.7" stroke-dasharray="2 9"/></g>
<circle cx="160" cy="160" r="122" fill="none" stroke="var(--line-soft)" stroke-width="0.8"/>
<g stroke="var(--gilt-faint)" stroke-width="0.8">
<line x1="160" y1="160" x2="272" y2="160"/>
<line x1="160" y1="160" x2="160" y2="48"/>
<line x1="160" y1="160" x2="51" y2="102"/>
<line x1="160" y1="160" x2="51" y2="218"/>
<line x1="160" y1="160" x2="160" y2="272" transform="rotate(0)"/>
</g>
<!-- 太一(中枢) -->
<circle class="ast-breathe" cx="160" cy="160" r="40" fill="none" stroke="var(--gilt-dim)" stroke-width="0.8" stroke-dasharray="3 6"/>
<circle cx="160" cy="160" r="30" fill="var(--bg-raised)" stroke="var(--gilt-dim)"/>
<text class="ast-core-text" x="160" y="158" text-anchor="middle" font-size="14" font-weight="600">太一</text>
<text class="ast-node__plain" x="160" y="171" text-anchor="middle">总枢 · v1.4.2</text>
<!-- 小周天(东) -->
<g class="ast-node" title="小周天 · 流式引擎 hj_stream:增量、节流与事件序">
<circle cx="272" cy="160" r="22" fill="var(--bg-raised)" stroke="var(--accent)" stroke-opacity=".55"/>
<text class="ast-node__name" x="272" y="158" text-anchor="middle">小周天</text>
<circle cx="272" cy="184" r="3" fill="var(--ok)"/>
</g>
<!-- 洛书(北) -->
<g class="ast-node" title="洛书 · 计划引擎 hj_plan:预算与上下文装配">
<circle cx="160" cy="48" r="22" fill="var(--bg-raised)" stroke="var(--accent)" stroke-opacity=".55"/>
<text class="ast-node__name" x="160" y="46" text-anchor="middle">洛书</text>
<circle cx="160" cy="72" r="3" fill="var(--ok)"/>
</g>
<!-- 河图(西) -->
<g class="ast-node" title="河图 · 检索引擎 hj_recall:离线索引与重排">
<circle cx="51" cy="102" r="22" fill="var(--bg-raised)" stroke="var(--accent)" stroke-opacity=".55"/>
<text class="ast-node__name" x="51" y="100" text-anchor="middle">河图</text>
<circle cx="51" cy="126" r="3" fill="var(--ok)"/>
</g>
<!-- 陶钧(西南) -->
<g class="ast-node" title="陶钧 · 内容引擎 hj_transform:Markdown 规范化">
<circle cx="51" cy="218" r="22" fill="var(--bg-raised)" stroke="var(--accent)" stroke-opacity=".55"/>
<text class="ast-node__name" x="51" y="216" text-anchor="middle">陶钧</text>
<circle cx="51" cy="242" r="3" fill="var(--ok)"/>
</g>
<!-- 烛照(南 · 告警闪烁) -->
<g class="ast-node" title="烛照 · 策略引擎 hj_policy:校验、验签与决断——当前校验超时 2 次">
<circle cx="160" cy="272" r="22" fill="var(--bg-raised)" stroke="var(--cinnabar)"/>
<text class="ast-node__name" x="160" y="270" text-anchor="middle">烛照</text>
<circle class="ast-alert" cx="160" cy="296" r="3.4" fill="var(--cinnabar)"/>
</g>
</svg>
</div>
<div style="flex:1;min-width:230px">
<div class="clash-row">
<div class="clash-row__pair"><b>相克告警</b> · 错误率 vs 自动重试率 <span style="color:var(--text-3)">——重试正在掩盖错误,建议查 Sandbox 慢执行根因</span></div>
<div class="clash-strength" title="耦合强度 0.82"><i style="width:82%"></i></div>
</div>
<div class="clash-row">
<div class="clash-row__pair"><b>相生正常</b> · 候选生成率 → 人工审阅吞吐 <span style="color:var(--text-3)">——生成与审阅同速,息壤无积压</span></div>
<div class="clash-strength"><i style="width:46%;background:var(--accent)"></i></div>
</div>
<p style="font-size:11.5px;color:var(--text-3);margin-top:8px;line-height:1.7">星盘为活的仪表:呼吸刻度 7s、慢旋轨道 120s、告警枢点 1.8s 闪烁;点击枢点下钻。烛照(gRPC 形态)受阻时宿主 fail closed,不降级——引擎缺失即拒绝执行。指标对健康不是灯板而是关系动力学(相生 / 相克)。</p>
</div>
</div>
</section>
<div class="two-col">
<div>
<section class="section" id="queue">
<div class="section__head">
<span class="cn">司议<span class="cn__plain">治理案件 · 运营视角</span></span>
<a class="more" href="#">全部 →</a>
</div>
<div class="tabs" role="tablist" aria-label="治理队列分类">
<button class="tab is-on" role="tab" aria-selected="true">内容 <span class="cnt">2</span></button>
<button class="tab" role="tab" aria-selected="false">插件 <span class="cnt">1</span></button>
<button class="tab" role="tab" aria-selected="false">市场 <span class="cnt">1</span></button>
<button class="tab" role="tab" aria-selected="false">申诉 <span class="cnt">1</span></button>
</div>
<div class="card case-card" style="margin-bottom:14px;padding-left:20px">
<div class="card__head">
<span class="badge badge--warn"><span class="badge__dot"></span>待审 <span class="mono">pending_review</span></span>
<span class="badge badge--err" style="font-size:11px"><span class="badge__dot"></span>处理时限剩 6 小时</span>
<span style="font-size:11.5px;color:var(--text-3);margin-left:auto">09-16 03:12 · 鸣冤 ×3 · 举报人已匿名保护</span>
</div>
<p style="font-size:13.5px">雅集帖子「未署名的守砚人立像二创」:疑似违反 CC BY-NC 署名要求。系统预检:来源谱系比对确认与原作者资产相似度 91%。</p>
<div style="display:flex;gap:8px;margin-top:12px;flex-wrap:wrap">
<button class="btn btn--outline btn--sm">查看原文(记录访问)</button>
<button class="btn btn--outline btn--sm">限观 · 限制展示</button>
<button class="btn btn--danger btn--sm">移除</button>
<button class="btn btn--ghost btn--sm">驳回举报</button>
</div>
</div>
<div class="card case-card" style="padding-left:20px">
<div class="card__head">
<span class="badge badge--warn"><span class="badge__dot"></span>待审 <span class="mono">pending_review</span></span>
<span style="font-size:11.5px;color:var(--text-3);margin-left:auto">09-15 18:47 · 自动扫描 + 人工复核</span>
</div>
<p style="font-size:13.5px">市场商品「曲谱排版插件 v1.4」:Manifest 声明与实际网络请求域不一致(2 个未声明域)。已触发自动下架保护,等待复核结论。</p>
<div style="display:flex;gap:8px;margin-top:12px;flex-wrap:wrap">
<button class="btn btn--outline btn--sm">查看扫描报告</button>
<button class="btn btn--danger btn--sm">确认下架</button>
<button class="btn btn--outline btn--sm">恢复上架(需备注)</button>
<button class="btn btn--ghost btn--sm">通知创作者</button>
</div>
</div>
</section>
<section id="users" class="section">
<div class="section__head">
<span class="cn">用户<span class="cn__plain">账户状态治理</span></span>
<div class="searchbar" style="width:220px"><svg><use href="#i-search"/></svg><input type="search" placeholder="搜索用户 / ID" aria-label="搜索用户"></div>
</div>
<div class="card" style="padding:6px 18px">
<div class="list-row">
<span class="avatar avatar--sm avatar--user">岁</span>
<div class="list-row__body">
<div class="list-row__title">用户 u_7a2c… <span class="badge badge--warn" style="font-size:11px"><span class="badge__dot"></span>保全态 · 只读</span></div>
<div class="list-row__sub">欠费进入保全:角色与记忆只读保留,不删除数据(ADR-021);补缴后自动恢复</div>
</div>
<button class="btn btn--ghost btn--sm">查看保全详情</button>
</div>
<div class="list-row">
<span class="avatar avatar--sm avatar--user">尘</span>
<div class="list-row__body">
<div class="list-row__title">用户 u_31f0… <span class="badge badge--err" style="font-size:11px"><span class="badge__dot"></span>封禁 · 申诉中</span></div>
<div class="list-row__sub">封禁同样进入只读保全;申诉司议 #2041 处理中</div>
</div>
<button class="btn btn--ghost btn--sm">处理申诉</button>
</div>
</div>
<p style="font-size:12px;color:var(--text-3);margin-top:8px">不按记忆、感情或亲密等级计费;保全与删除是独立操作,删除需冷静期与二次双人授权。</p>
</section>
<section id="perms" class="section">
<div class="section__head">
<span class="cn">权限管理<span class="cn__plain">管理员账号与角色授权</span></span>
<button class="btn btn--outline btn--sm" style="margin-left:auto">新增管理员</button>
</div>
<div class="card" style="margin-bottom:14px">
<div class="card__head"><span class="cn" style="font-size:14px">管理员账号</span><span style="margin-left:auto;font-size:11.5px;color:var(--text-3)">4 个账号 · 全部启用双因素</span></div>
<div class="table-wrap"><table class="data">
<thead><tr><th>账号</th><th>角色</th><th>双因素</th><th>状态</th><th>操作</th></tr></thead>
<tbody>
<tr><td>运维 · 甲(你)</td><td>超级管理员</td><td class="mono">TOTP + 硬件钥匙</td><td><span class="badge badge--ok" style="font-size:11px"><span class="badge__dot"></span>在线</span></td><td><button class="btn btn--ghost btn--sm">编辑</button></td></tr>
<tr><td>运维 · 乙</td><td>运营管理员</td><td class="mono">TOTP</td><td><span class="badge badge--ok" style="font-size:11px"><span class="badge__dot"></span>双人会话中</span></td><td><button class="btn btn--ghost btn--sm">编辑</button></td></tr>
<tr><td>审核 · 丙</td><td>内容审核员</td><td class="mono">TOTP</td><td><span class="badge badge--muted" style="font-size:11px"><span class="badge__dot"></span>离线</span></td><td><button class="btn btn--ghost btn--sm">编辑</button></td></tr>
<tr><td class="mono">svc-audit-ro</td><td>只读服务账号</td><td class="mono">API key · scope audit:read</td><td><span class="badge badge--muted" style="font-size:11px"><span class="badge__dot"></span>90 天轮换</span></td><td><button class="btn btn--ghost btn--sm">轮换</button></td></tr>
</tbody>
</table></div>
</div>
<div class="card" style="margin-bottom:14px">
<div class="card__head"><span class="cn" style="font-size:14px">角色权限矩阵<span class="cn__plain">RBAC</span></span><span style="margin-left:auto;font-size:11.5px;color:var(--text-3)">编辑 / 发布 / 上架 / 财务分离,与同契台同规则</span></div>
<div class="table-wrap"><table class="data">
<thead><tr><th>角色</th><th>治理裁决</th><th>支持包</th><th>用户保全</th><th>部署设置</th><th>审计读取</th><th>权限管理</th></tr></thead>
<tbody>
<tr><td>超级管理员</td><td class="mark-ok">✓</td><td class="mark-ok">✓</td><td class="mark-ok">✓</td><td class="mark-ok">✓</td><td class="mark-ok">✓</td><td class="mark-ok">✓</td></tr>
<tr><td>运营管理员</td><td class="mark-ok">✓</td><td class="mark-ok">✓</td><td class="mark-ok">✓</td><td class="mark-no">—</td><td class="mark-ok">✓</td><td class="mark-no">—</td></tr>
<tr><td>内容审核员</td><td class="mark-ok">✓(内容)</td><td class="mark-no">—</td><td class="mark-no">—</td><td class="mark-no">—</td><td class="mark-ok">✓(只读)</td><td class="mark-no">—</td></tr>
<tr><td>只读服务账号</td><td class="mark-no">—</td><td class="mark-no">—</td><td class="mark-no">—</td><td class="mark-no">—</td><td class="mark-ok">✓</td><td class="mark-no">—</td></tr>
</tbody>
</table></div>
</div>
<div class="card">
<div class="card__head"><span class="cn" style="font-size:14px">双人授权策略</span><span style="margin-left:auto;font-size:11.5px;color:var(--text-3)">策略本身修改也需要双人授权</span></div>
<div class="set-row">
<div class="set-row__body"><div class="set-row__t">敏感操作双人授权</div><div class="set-row__d">治理裁决移除 / 用户保全变更 / 支持包生成 / 权限变更,均需两名管理员在线授权</div></div>
<span class="switch"><input type="checkbox" checked disabled aria-label="双人授权已启用(策略锁定)"><i></i></span>
</div>
<div class="set-row">
<div class="set-row__body"><div class="set-row__t">管理会话时长上限</div><div class="set-row__d">60 分钟 · 到期自动退出并留审计</div></div>
<span class="mono" style="font-size:12.5px;color:var(--text-2)">60 min</span>
</div>
<div class="set-row">
<div class="set-row__body"><div class="set-row__t">Break-glass 紧急通道</div><div class="set-row__d">默认关闭;紧急启用后所有操作事后复核,48 小时内强制复盘</div></div>
<span class="badge badge--muted" style="font-size:11px"><span class="badge__dot"></span>关闭 <span class="mono">off</span></span>
</div>
</div>
<p style="font-size:12px;color:var(--text-3);margin-top:8px">角色与权限变更即时生效并写入审计;被移除管理员的进行中双人会话立即失效。权限矩阵不包含「读取私箧 / 读取消息明文」——该权限不存在。</p>
</section>
<section id="tickets" class="section">
<div class="section__head">
<span class="cn">支持工单<span class="cn__plain">3 未结</span></span>
<a class="more" href="#">全部 →</a>
</div>
<div class="card" style="padding:6px 18px">
<div class="list-row">
<span class="badge badge--info" style="flex:none;font-size:11px"><span class="badge__dot"></span>处理中</span>
<div class="list-row__body">
<div class="list-row__title">#88231 · 对话流中断后未收到最终答复</div>
<div class="list-row__sub">用户云舟 · 09-15 21:04 提交 · 已关联 Run 快照(诊断双授权待用户批准)</div>
</div>
<button class="btn btn--outline btn--sm">回复</button>
</div>
<div class="list-row">
<span class="badge badge--muted" style="flex:none;font-size:11px"><span class="badge__dot"></span>待分派</span>
<div class="list-row__body">
<div class="list-row__title">#88229 · 退款争议:雾中茶寮 v3 下载后要求退款</div>
<div class="list-row__sub">按市契 14 天未下载规则预检:已下载,转争议流程</div>
</div>
<button class="btn btn--outline btn--sm">分派</button>
</div>
</div>
<div class="card" style="margin-top:12px">
<div class="card__head">
<span class="cn">支持包<span class="cn__plain">脱敏诊断导出</span></span>
<button class="btn btn--cinnabar btn--sm" style="margin-left:auto">生成 #88231 支持包</button>
</div>
<p style="font-size:12.5px;color:var(--text-2)">支持包为脱敏导出:包含 Run 结构化轨迹、错误与计数;<span style="color:var(--text-1)">不包含</span>消息明文、私箧、隐藏推理、密钥与签名 URL。生成需双人授权并计入审计,用户侧可见支持包被生成的记录。</p>
</div>
</section>
</div>
<div>
<section id="health" class="section card">
<div class="card__head"><span class="cn">部署健康<span class="cn__plain">自托管 · 标准服务器</span></span><button class="icon-btn" aria-label="刷新"><svg><use href="#i-refresh"/></svg></button></div>
<div class="set-row">
<svg style="width:16px;height:16px;color:var(--text-3)"><use href="#i-database"/></svg>
<div class="set-row__body"><div class="set-row__t">PostgreSQL 主库</div><div class="set-row__d">权威事实源 · 复制延迟 0.4s</div></div>
<span class="badge badge--ok" style="font-size:11px"><span class="badge__dot"></span>正常</span>
</div>
<div class="set-row">
<svg style="width:16px;height:16px;color:var(--text-3)"><use href="#i-server"/></svg>
<div class="set-row__body"><div class="set-row__t">Worker ×2</div><div class="set-row__sub set-row__d">Outbox 消费 · 队列深度 14</div></div>
<span class="badge badge--ok" style="font-size:11px"><span class="badge__dot"></span>正常</span>
</div>
<div class="set-row">
<svg style="width:16px;height:16px;color:var(--text-3)"><use href="#i-package"/></svg>
<div class="set-row__body"><div class="set-row__t">Sandbox Worker</div><div class="set-row__d">隔离容器池 · 无符合策略后端时拒绝执行(fail closed)</div></div>
<span class="badge badge--ok" style="font-size:11px"><span class="badge__dot"></span>正常</span>
</div>
<div class="set-row">
<svg style="width:16px;height:16px;color:var(--text-3)"><use href="#i-cpu"/></svg>
<div class="set-row__body"><div class="set-row__t cn">灵台<span class="cn__plain">引擎核心运行中 · 进程内 C ABI</span></div><div class="set-row__d mono">hj_core v1.4.2 · ABI 快照一致 · fuzz 无新增</div></div>
<span class="badge badge--ok" style="font-size:11px"><span class="badge__dot"></span>运转</span>
</div>
<div class="set-row" style="border-color:color-mix(in srgb,var(--warn) 35%,transparent)">
<svg style="width:16px;height:16px;color:var(--warn)"><use href="#i-server"/></svg>
<div class="set-row__body"><div class="set-row__t cn">灵台 · 服务形态<span class="cn__plain">gRPC · 内网 mTLS</span></div><div class="set-row__d">健康检查超时 2 次 · 语义与进程内形态一致(golden 通过);不可达时宿主 fail closed,不降级</div></div>
<span class="badge badge--warn" style="font-size:11px"><span class="badge__dot"></span>受阻 <span class="mono">degraded</span></span>
</div>
</section>
<section id="backup" class="section card">
<div class="card__head"><span class="cn">迁移与备份</span><button class="icon-btn" aria-label="立即备份"><svg><use href="#i-refresh"/></svg></button></div>
<div class="set-row" style="padding:8px 0"><div class="set-row__body"><div class="set-row__t">最近全量备份</div><div class="set-row__d">今日 03:00 · 增量每 5 分钟 · 连续 7 日校验通过</div></div><span class="mono" style="font-size:12.5px;color:var(--ok)">42s RPO</span></div>
<div class="set-row" style="padding:8px 0"><div class="set-row__body"><div class="set-row__t">迁移状态</div><div class="set-row__d">Alembic head · 34 个版本 · 无漂移</div></div><span class="badge badge--ok" style="font-size:11px"><span class="badge__dot"></span>一致</span></div>
<div class="set-row" style="padding:8px 0"><div class="set-row__body"><div class="set-row__t">恢复演练</div><div class="set-row__d">09-01 通过 · 删除重放与插件撤架演练各 1 次</div></div><button class="btn btn--outline btn--sm">发起演练</button></div>
</section>
<section class="section card" style="border-color:color-mix(in srgb,var(--warn) 40%,transparent)">
<div class="card__head"><span class="cn" style="color:var(--warn)">活跃告警<span class="cn__plain">1</span></span></div>
<div style="display:flex;gap:10px;align-items:flex-start">
<svg style="width:16px;height:16px;color:var(--warn);flex:none;margin-top:3px"><use href="#i-alert"/></svg>
<div>
<div style="font-size:13.5px">对象存储写入延迟 P99 超阈值(2.8s &gt; 2s,持续 12 分钟)</div>
<div style="font-size:12px;color:var(--text-3);margin-top:4px">影响:媒体上传整备变慢 · 自动扩容已触发 · 事故响应等级 S3</div>
<div style="display:flex;gap:8px;margin-top:10px">
<button class="btn btn--outline btn--sm">查看指标</button>
<button class="btn btn--ghost btn--sm">认领处理</button>
</div>
</div>
</div>
</section>
<section id="slo" class="section card">
<div class="card__head"><span class="cn">SLO 与恢复目标</span><a class="more" href="#">指标 →</a></div>
<div class="drive-row"><span class="drive-row__label">可用性</span><div class="progress"><div class="progress__bar" style="width:99.87%"></div></div><span class="drive-row__val">99.87%</span></div>
<div class="set-row" style="padding:8px 0"><div class="set-row__body"><div class="set-row__t">RPO(数据丢失上限)</div></div><span class="mono" style="font-size:12.5px">≤ 5 分钟 · 实测 42s</span></div>
<div class="set-row" style="padding:8px 0"><div class="set-row__body"><div class="set-row__t">RTO(恢复时限)</div></div><span class="mono" style="font-size:12.5px">≤ 1 小时 · 演练 09-01 通过</span></div>
<div class="set-row" style="padding:8px 0"><div class="set-row__body"><div class="set-row__t">区域驻留</div></div><span style="font-size:12px;color:var(--ok)">cn-east-1 · 未跨区漂移</span></div>
</section>
<section id="audit" class="section card">
<div class="card__head"><span class="cn">审计快照<span class="cn__plain">管理面操作全部留痕</span></span><a class="more" href="#">完整审计 →</a></div>
<div class="timeline">
<div class="timeline-volume">卷 · 0916</div>
<div class="timeline__item"><div class="timeline__date">09-16 09:31</div><div class="timeline__title">双人授权会话开启</div><div class="timeline__sub">运维甲 + 运维乙 · 60 分钟</div></div>
<div class="timeline__item"><div class="timeline__date">09-16 09:12</div><div class="timeline__title">限观决定:帖子 #77213</div><div class="timeline__sub">双人授权 · 操作者已留痕</div></div>
<div class="timeline__item timeline__item--muted"><div class="timeline__date">09-16 02:40</div><div class="timeline__title">私箧读取尝试(自动拦截)</div><div class="timeline__sub">策略拒绝 · 管理员不可读私箧 · 已通知账户持有人</div></div>
</div>
</section>
</div>
</div>
</div>
</main>
</div>
<script src="assets/app.js?v=3"></script>
</body>
</html>