Files
storage-labos/前端UI八页面完成/ConsoleNav.dc.html
T
yuanshuai c91a64fddb
CI / Python 3.12 (push) Waiting to run
CI / Python 3.9 (push) Waiting to run
chore(repo): initialize team collaboration repository
2026-07-27 20:40:12 +08:00

144 lines
10 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<script src="./support.js"></script>
</head>
<body>
<x-dc>
<helmet>
<link rel="stylesheet" href="_ds/industry-22c874fd-9888-4e99-8234-d60d39b3d719/styles.css">
<script src="_ds/industry-22c874fd-9888-4e99-8234-d60d39b3d719/_ds_bundle.js"></script>
<style>
body{margin:0;background:#f2f2f3;min-width:1280px}
*{scrollbar-width:thin;scrollbar-color:var(--color-accent-300) transparent}
a{color:#5980a6}a:hover{color:#416180}
@keyframes omIn{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}
@keyframes omScan{to{background-position:28px 0}}
@keyframes omDraw{to{stroke-dashoffset:0}}
@keyframes omGrow{from{width:0}}
@keyframes omPulse{0%,100%{opacity:1}50%{opacity:.3}}
</style>
</helmet>
<div style="font-family:var(--font-body);background:var(--color-bg);border-bottom:1px solid var(--color-divider)">
<sc-if value="{{ stopped }}" hint-placeholder-val="{{ false }}">
<div style="animation:omIn .3s ease both;display:flex;align-items:center;gap:12px;background:#b03d2e;color:#f7f4f2;padding:8px 20px;font-size:13px">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polygon points="7.86 2 16.14 2 22 7.86 22 16.14 16.14 22 7.86 22 2 16.14 2 7.86 7.86 2"></polygon><line x1="12" y1="8" x2="12" y2="12"></line><line x1="12" y1="16" x2="12.01" y2="16"></line></svg>
<strong style="font-family:var(--font-heading);letter-spacing:.06em">实验室处于安全停止状态</strong>
<span style="opacity:.85">全部任务已冻结,现场证据已保留,自动重启被禁止 · 触发人 quan.zhang · {{ stopTime }}</span>
<button onClick="{{ releaseStop }}" style="margin-left:auto;background:transparent;border:1px solid rgba(247,244,242,.55);color:#f7f4f2;padding:4px 12px;font-family:var(--font-heading);font-size:12px;letter-spacing:.05em;cursor:pointer" style-hover="background:rgba(247,244,242,.14)">解除安全停止(需审批)</button>
</div>
</sc-if>
<div style="display:flex;align-items:center;gap:18px;padding:0 20px;height:56px">
<a href="Dashboard.dc.html" style-hover="color:var(--color-accent-700)" style="transition:color .15s ease;flex:none;white-space:nowrap;text-decoration:none;color:var(--color-text);display:flex;flex-direction:column;gap:0;line-height:1">
<span style="font-family:var(--font-heading);font-weight:600;font-size:19px;letter-spacing:.08em">STORAGE LABOS</span>
<span style="font-size:9px;letter-spacing:.22em;color:var(--color-accent-700);margin-top:3px">REGRESSION WORKER · 多工位控制台</span>
</a>
<span style="flex:none;width:1px;height:26px;background:var(--color-divider)"></span>
<nav style="display:flex;align-items:stretch;gap:2px;height:100%">
<sc-for list="{{ items }}" as="it" hint-placeholder-count="8">
<a href="{{ it.href }}" aria-current="{{ it.cur }}" style="{{ it.style }}" style-hover="background:var(--color-accent-100);color:var(--color-accent-700)">
<span style="font-size:13.5px;line-height:1.1">{{ it.label }}</span>
<span style="font-size:8px;letter-spacing:.14em;opacity:.55;margin-top:2px">{{ it.en }}</span>
</a>
</sc-for>
</nav>
<span style="margin-left:auto"></span>
<span class="tag tag-neutral" style="flex:none;white-space:nowrap;gap:6px"><span style="width:6px;height:6px;background:var(--color-accent);display:inline-block"></span>内网部署 · 深圳一号实验室</span>
<span style="flex:none;white-space:nowrap;font-family:ui-monospace,Menlo,Consolas,monospace;font-size:12px;color:var(--color-neutral-700);min-width:62px">{{ clock }}</span>
<button onClick="{{ openStop }}" style="flex:none;white-space:nowrap;display:inline-flex;align-items:center;gap:7px;background:#b03d2e;border:1px solid #8a2e22;color:#f7f4f2;padding:8px 14px;font-family:var(--font-heading);font-weight:600;font-size:13px;letter-spacing:.08em;cursor:pointer" style-hover="background:#9a3527">
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><polygon points="7.86 2 16.14 2 22 7.86 22 16.14 16.14 22 7.86 22 2 16.14 2 7.86 7.86 2"></polygon></svg>
紧急停止
</button>
</div>
<div style="display:flex;align-items:center;gap:16px;padding:5px 20px;border-top:1px solid var(--color-divider);background:var(--color-surface);font-family:ui-monospace,Menlo,Consolas,monospace;font-size:10.5px;color:var(--color-neutral-700);letter-spacing:.02em">
<span style="display:inline-flex;align-items:center;gap:5px;color:var(--color-accent-700)"><span style="width:6px;height:6px;border-radius:50%;background:var(--color-accent);animation:omPulse 2s infinite"></span>事件总线 LIVE</span>
<span>工位 5/6 在线</span>
<a href="LiveRun.dc.html" style="color:var(--color-accent-800);text-decoration:none" style-hover="color:var(--color-accent)">运行 2</a>
<span>恢复中 1</span>
<a href="Tasks.dc.html" style="color:inherit;text-decoration:none" style-hover="color:var(--color-accent-700)">队列 3</a>
<span style="width:1px;height:12px;background:var(--color-divider)"></span>
<span>UCR(7D) 96.8%</span>
<span>介入密度 1.8 次/百小时</span>
<span>自动恢复成功率 87.5%</span>
<span style="margin-left:auto">最近人工介入 14:32 · WS-03</span>
</div>
<sc-if value="{{ stopOpen }}" hint-placeholder-val="{{ false }}">
<div class="dialog-backdrop" style="z-index:60;animation:omIn .22s ease both">
<div class="dialog blueprint elev-lg" style="width:min(520px,100%);background:var(--color-bg)">
<i class="corner tl"></i><i class="corner tr"></i><i class="corner bl"></i><i class="corner br"></i>
<div style="display:flex;align-items:center;gap:10px;color:#b03d2e">
<svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polygon points="7.86 2 16.14 2 22 7.86 22 16.14 16.14 22 7.86 22 2 16.14 2 7.86 7.86 2"></polygon><line x1="12" y1="8" x2="12" y2="12"></line><line x1="12" y1="16" x2="12.01" y2="16"></line></svg>
<span class="dialog-title" style="letter-spacing:.04em">紧急停止 · EMERGENCY STOP</span>
</div>
<div class="dialog-body" style="opacity:1">
<p style="margin-bottom:8px">将对<strong>全部 6 个工位</strong>执行安全停止,该动作写入不可变审计日志:</p>
<ul style="margin:0;padding-left:18px;font-size:13.5px;line-height:1.7;color:var(--color-neutral-800)">
<li>停止 2 个运行中任务(run-20260727-0001 / 0002),在当前检查点冻结</li>
<li>中断 WS-03 正在执行的 L3 带外 Reset 恢复流程</li>
<li>保留全部现场证据,禁止任何自动重启与供电动作</li>
</ul>
<div style="margin-top:12px;padding:9px 12px;border:1px dashed #b03d2e;color:#8a2e22;font-size:12.5px;background:#f7e9e6">恢复运行需要实验室负责人审批。误触发将计入基础设施误报率。</div>
</div>
<div class="dialog-actions">
<button class="btn btn-secondary" onClick="{{ closeStop }}">取消</button>
<button onClick="{{ confirmStop }}" style="display:inline-flex;align-items:center;gap:7px;background:#b03d2e;border:1px solid #8a2e22;color:#f7f4f2;padding:8px 16px;font-family:var(--font-heading);font-weight:600;font-size:14px;letter-spacing:.06em;cursor:pointer" style-hover="background:#9a3527">确认全部停止</button>
</div>
</div>
</div>
</sc-if>
</div>
</x-dc>
<script type="text/x-dc" data-dc-script data-props="{&quot;$preview&quot;:{&quot;width&quot;:1440,&quot;height&quot;:120},&quot;active&quot;:{&quot;editor&quot;:&quot;enum&quot;,&quot;options&quot;:[&quot;dashboard&quot;,&quot;tasks&quot;,&quot;live&quot;,&quot;evidence&quot;,&quot;compare&quot;,&quot;failures&quot;,&quot;assets&quot;,&quot;workflows&quot;],&quot;default&quot;:&quot;dashboard&quot;,&quot;tsType&quot;:&quot;string&quot;,&quot;section&quot;:&quot;导航&quot;}}">
class Component extends DCLogic {
state = { stopOpen: false, stopped: false, stopTime: '', clock: '' };
componentDidMount() {
this._t = setInterval(() => {
this.setState({ clock: new Date().toLocaleTimeString('zh-CN', { hour12: false }) });
}, 1000);
}
componentWillUnmount() { clearInterval(this._t); }
renderVals() {
const active = this.props.active ?? 'dashboard';
const base = {
display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center',
flex: 'none', whiteSpace: 'nowrap',
padding: '0 11px', textDecoration: 'none', color: 'var(--color-neutral-800)',
fontFamily: 'var(--font-heading)', fontWeight: 600, letterSpacing: '.03em',
borderBottom: '2px solid transparent', borderTop: '2px solid transparent',
transition: 'color .15s ease, background .15s ease, border-color .15s ease'
};
const items = [
{ key: 'dashboard', href: 'Dashboard.dc.html', label: '总览', en: 'OVERVIEW' },
{ key: 'tasks', href: 'Tasks.dc.html', label: '任务中心', en: 'TASKS' },
{ key: 'live', href: 'LiveRun.dc.html', label: '实时运行', en: 'LIVE RUN' },
{ key: 'evidence', href: 'Evidence.dc.html', label: '证据浏览器', en: 'EVIDENCE' },
{ key: 'compare', href: 'Compare.dc.html', label: '版本比较', en: 'A/B COMPARE' },
{ key: 'failures', href: 'Failures.dc.html', label: '失败中心', en: 'FAILURES' },
{ key: 'assets', href: 'Assets.dc.html', label: '资产中心', en: 'ASSETS' },
{ key: 'workflows', href: 'Workflows.dc.html', label: '工作流模板', en: 'WORKFLOWS' }
].map(it => ({
...it,
cur: it.key === active ? 'page' : null,
style: it.key === active
? { ...base, color: 'var(--color-accent-700)', borderBottom: '2px solid var(--color-accent)', background: 'var(--color-accent-100)' }
: base
}));
return {
items,
clock: this.state.clock,
stopOpen: this.state.stopOpen,
stopped: this.state.stopped,
stopTime: this.state.stopTime,
openStop: () => this.setState({ stopOpen: true }),
closeStop: () => this.setState({ stopOpen: false }),
confirmStop: () => this.setState({ stopOpen: false, stopped: true, stopTime: new Date().toLocaleTimeString('zh-CN', { hour12: false }) }),
releaseStop: () => this.setState({ stopped: false })
};
}
}
</script>
</body>
</html>