3588AdminBackend/docs/theme-preview-dark.html
2026-04-29 02:10:21 +08:00

192 lines
11 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">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>3588 管理后台深色主题预览</title>
<style>
:root {
--bg: #090909;
--panel: #121212;
--panel-2: #1a1a1a;
--panel-3: #242424;
--line: #303030;
--line-strong: #565656;
--text: #f4f4f4;
--muted: #bcbcbc;
--subtle: #8d8d8d;
--accent: #dddddd;
--accent-2: #66c98f;
--warn: #d8a657;
--bad: #e46f72;
--blue: #dddddd;
--sidebar: #070707;
--sidebar-active: #171717;
--selected: #303030;
--radius: 4px;
--shadow: 0 18px 44px rgba(0, 0, 0, .32);
}
* { box-sizing: border-box; }
body {
margin: 0;
background: var(--bg);
color: var(--text);
font: 13px/1.45 "Segoe UI", Arial, sans-serif;
}
.shell { display: grid; grid-template-columns: 240px minmax(0, 1fr); min-height: 100vh; }
aside {
background: var(--sidebar);
border-right: 1px solid #303030;
padding: 18px 14px;
position: sticky;
top: 0;
height: 100vh;
}
.brand { display: flex; align-items: center; gap: 12px; margin-bottom: 28px; }
.mark { width: 38px; height: 38px; display: grid; place-items: center; border-radius: 4px; background: #070707; border: 1px solid #3a3a3a; font-weight: 700; }
.brand b { display: block; font-size: 14px; font-weight: 600; }
.brand span { color: var(--muted); font-size: 11px; }
.section { color: var(--subtle); font-size: 11px; margin: 18px 8px 8px; letter-spacing: .06em; }
nav a { display: flex; align-items: center; gap: 10px; color: #eeeeee; text-decoration: none; padding: 9px 10px; border-radius: var(--radius); margin-bottom: 3px; font-weight: 500; }
nav a.active, nav a:hover { background: var(--sidebar-active); color: #fff; }
.nav-icon { width: 26px; height: 24px; display: grid; place-items: center; border-radius: 3px; border: 1px solid #3a3a3a; color: var(--accent); font-size: 10px; }
.workspace { min-width: 0; }
header {
height: 68px;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 28px;
background: #0e0e0e;
border-bottom: 1px solid var(--line);
position: sticky;
top: 0;
z-index: 10;
}
.crumb { color: var(--subtle); font-size: 11px; letter-spacing: .08em; }
h1 { margin: 2px 0 0; font-size: 18px; font-weight: 600; }
main { padding: 22px 28px 36px; max-width: 1460px; }
.toolbar, .grid, .row { display: grid; gap: 12px; }
.toolbar { grid-template-columns: 1fr auto; align-items: end; margin-bottom: 14px; }
.summary { color: var(--muted); margin-top: 4px; }
.btn { border: 1px solid var(--line-strong); background: var(--panel-3); color: var(--text); padding: 6px 9px; border-radius: var(--radius); text-decoration: none; font-weight: 500; font-size: 12px; line-height: 1.15; }
.btn.primary { background: #2b2b2b; border-color: #565656; color: #f4f4f4; }
.grid.kpi { grid-template-columns: repeat(4, minmax(0, 1fr)); margin-bottom: 14px; }
.panel, .stat {
background: var(--panel);
border: 1px solid var(--line);
border-radius: var(--radius);
box-shadow: var(--shadow);
}
.stat { padding: 14px; border-left: 3px solid #3a3a3a; }
.stat.hot { border-left-color: var(--accent); }
.label { color: var(--muted); font-size: 12px; }
.value { margin-top: 7px; font-size: 24px; line-height: 1; font-weight: 400; }
.delta { margin-top: 7px; color: var(--subtle); font-size: 12px; }
.row.two { grid-template-columns: 1.45fr .8fr; align-items: start; }
.panel-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 11px 14px; border-bottom: 1px solid var(--line); }
h2 { font-size: 15px; margin: 0; font-weight: 600; }
.panel-body { padding: 12px 14px; }
.tabs { display: flex; gap: 2px; border-bottom: 1px solid var(--line); padding: 0 12px; background: var(--panel-2); }
.tabs span { padding: 8px 11px; color: var(--muted); border-bottom: 2px solid transparent; line-height: 1.2; }
.tabs span.active { color: var(--text); border-color: var(--accent); background: #101010; }
table { width: 100%; border-collapse: collapse; min-width: 760px; }
.table-wrap { overflow: auto; }
th, td { padding: 8px 12px; border-bottom: 1px solid var(--line); text-align: left; vertical-align: middle; line-height: 1.25; }
th { color: #bcbcbc; background: #1a1a1a; font-size: 12px; font-weight: 600; }
tbody tr.selected { background: var(--selected); outline: 1px solid #dddddd; outline-offset: -1px; }
tbody tr:hover { background: #1a1a1a; }
.mono { font-family: Consolas, ui-monospace, monospace; }
.pill { display: inline-flex; align-items: center; border: 1px solid var(--line-strong); background: var(--panel-3); border-radius: 3px; padding: 1px 6px; min-height: 20px; font-size: 11px; font-weight: 500; line-height: 1.1; }
.ok { color: var(--accent-2); border-color: #565656; background: #1a1a1a; }
.run { color: var(--blue); border-color: #565656; background: #1a1a1a; }
.warn { color: var(--warn); border-color: #565656; background: #1a1a1a; }
.bad { color: var(--bad); border-color: #565656; background: #1a1a1a; }
.dense-list { display: grid; gap: 8px; }
.event { display: grid; grid-template-columns: 72px 1fr auto; gap: 10px; align-items: center; padding: 7px 9px; background: var(--panel-2); border: 1px solid var(--line); border-radius: var(--radius); }
td b, .event b { font-weight: 400; }
.preview-map { height: 160px; background: linear-gradient(135deg, #242424, #101010); border: 1px solid var(--line); position: relative; overflow: hidden; border-radius: var(--radius); }
.preview-map::before, .preview-map::after { content: ""; position: absolute; inset: 18px; border: 1px solid #3a3a3a; }
.preview-map::after { inset: 44px 70px 36px 34px; border-color: #666666; background: rgba(255,255,255,.06); }
@media (max-width: 960px) {
.shell, .row.two, .grid.kpi, .toolbar { grid-template-columns: 1fr; }
aside { position: relative; height: auto; }
main { padding: 18px; }
}
</style>
</head>
<body>
<div class="shell">
<aside>
<div class="brand"><div class="mark">AI</div><div><b>视觉识别运维平台</b><span>Fleet Operations Console</span></div></div>
<div class="section">主模块</div>
<nav>
<a class="active" href="#"><span class="nav-icon">OV</span>总览</a>
<a href="#"><span class="nav-icon">DV</span>设备</a>
<a href="#"><span class="nav-icon">CFG</span>识别配置</a>
<a href="#"><span class="nav-icon">JOB</span>任务</a>
<a href="#"><span class="nav-icon">LOG</span>诊断</a>
</nav>
</aside>
<div class="workspace">
<header>
<div><div class="crumb">多设备视觉识别运维平台</div><h1>总览</h1></div>
<div><a class="btn" href="theme-preview-gold.html">石墨金色</a> <a class="btn primary" href="theme-preview-light.html">切换浅色主题</a></div>
</header>
<main>
<div class="toolbar">
<div><h2>Fleet 运行态势</h2><div class="summary">只保留需要运维立即判断的信息:在线率、异常节点、执行中任务、最近告警。</div></div>
<div><a class="btn" href="#">批量操作</a> <a class="btn primary" href="#">进入设备列表</a></div>
</div>
<section class="grid kpi">
<div class="stat hot"><div class="label">设备总数</div><div class="value">12</div><div class="delta">3 个分组 / 2 个车间</div></div>
<div class="stat hot"><div class="label">在线率</div><div class="value">10 / 12</div><div class="delta">83.3%,较昨日 -1</div></div>
<div class="stat"><div class="label">离线节点</div><div class="value">2</div><div class="delta">需要检查网络或 agent</div></div>
<div class="stat"><div class="label">执行中任务</div><div class="value">3</div><div class="delta">配置下发 2重启 1</div></div>
</section>
<section class="row two">
<div class="panel">
<div class="tabs"><span class="active">异常设备</span><span>全部设备</span><span>任务结果</span></div>
<div class="table-wrap">
<table>
<thead><tr><th>节点</th><th>状态</th><th>识别配置</th><th>管理地址</th><th>最后心跳</th></tr></thead>
<tbody>
<tr class="selected"><td><b>OPI-3588-A03</b><div class="mono label">edge-a03</div></td><td><span class="pill bad">离线</span></td><td>车间全功能识别</td><td class="mono">10.0.0.81:18081</td><td>18 分钟前</td></tr>
<tr><td><b>OPI-3588-B02</b><div class="mono label">edge-b02</div></td><td><span class="pill warn">告警</span></td><td>劳保鞋检测</td><td class="mono">10.0.0.92:18081</td><td>37 秒前</td></tr>
<tr><td><b>OPI-3588-C01</b><div class="mono label">edge-c01</div></td><td><span class="pill ok">在线</span></td><td>人脸识别视频流</td><td class="mono">10.0.0.77:18081</td><td>9 秒前</td></tr>
<tr><td><b>OPI-3588-C04</b><div class="mono label">edge-c04</div></td><td><span class="pill run">任务中</span></td><td>服务测试流</td><td class="mono">10.0.0.79:18081</td><td>12 秒前</td></tr>
</tbody>
</table>
</div>
</div>
<div class="panel">
<div class="panel-head"><h2>识别配置资产</h2><span class="pill run">模板 5</span></div>
<div class="panel-body">
<div class="preview-map"></div>
<div class="dense-list" style="margin-top:12px">
<div class="event"><span class="mono">13/12</span><b>车间全功能识别</b><span class="pill ok">标准</span></div>
<div class="event"><span class="mono">7/6</span><b>人脸识别视频流</b><span class="pill">用户</span></div>
<div class="event"><span class="mono">10/9</span><b>劳保鞋检测</b><span class="pill ok">标准</span></div>
</div>
</div>
</div>
</section>
<section class="panel" style="margin-top:12px">
<div class="panel-head"><h2>最近任务</h2><span class="label">选中行用高亮背景和描边表示,不再依赖低对比浅灰</span></div>
<div class="table-wrap">
<table>
<thead><tr><th>任务标识</th><th>操作</th><th>状态</th><th>节点数</th><th>耗时</th></tr></thead>
<tbody>
<tr><td class="mono">task-0428-0018</td><td>下发识别配置</td><td><span class="pill run">执行中</span></td><td>4</td><td>01:42</td></tr>
<tr class="selected"><td class="mono">task-0428-0017</td><td>重启视频分析服务</td><td><span class="pill bad">失败</span></td><td>1</td><td>00:19</td></tr>
<tr><td class="mono">task-0428-0016</td><td>导出诊断日志</td><td><span class="pill ok">成功</span></td><td>2</td><td>00:43</td></tr>
</tbody>
</table>
</div>
</section>
</main>
</div>
</div>
</body>
</html>