feat(HEL-529): 按第十二版实现三页数据中枢管理后台

以 hub-kimi.html + SPEC-V11.md(v12) 为唯一视觉基线,将 /admin/ 重写为
运行总览 / 数据源配置 / 数据血缘 三页单一入口;接入 HEL-543 只读旁路
与既有 admin API,保留调度/发布/审计与危险操作入口,零新依赖。

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: multica-agent <github@multica.ai>
This commit is contained in:
总工
2026-09-14 21:11:45 +08:00
co-authored by Cursor multica-agent
parent 2e9442ac5a
commit 31da37b49e
3 changed files with 1661 additions and 328 deletions
+1037 -239
View File
File diff suppressed because it is too large Load Diff
+89 -30
View File
@@ -1,16 +1,18 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="zh-CN"> <html lang="zh-CN">
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>xiaobai-datahub 管理后台</title> <title>小白复盘 · 数据中枢</title>
<link rel="stylesheet" href="/admin/styles.css" /> <link rel="stylesheet" href="/admin/styles.css" />
</head> </head>
<body> <body>
<div id="app"> <div id="app">
<section id="login-view" class="panel auth-panel">
<div id="login-view" class="auth-wrap bg-ambient" hidden>
<section class="panel auth-panel">
<h1>数据中枢</h1> <h1>数据中枢</h1>
<p class="muted">内网管理后台,用于查看源状态、调度和盘后发布批次</p> <p class="muted">内网管理后台 · 运行总览 / 数据源配置 / 数据血缘</p>
<form id="login-form"> <form id="login-form">
<label>账号 <input name="username" value="hub_admin" autocomplete="username" /></label> <label>账号 <input name="username" value="hub_admin" autocomplete="username" /></label>
<label>密码 <input name="password" type="password" autocomplete="current-password" /></label> <label>密码 <input name="password" type="password" autocomplete="current-password" /></label>
@@ -18,36 +20,93 @@
<p id="login-error" class="error" hidden></p> <p id="login-error" class="error" hidden></p>
</form> </form>
</section> </section>
</div>
<section id="change-view" class="panel auth-panel" hidden> <div id="change-view" class="auth-wrap bg-ambient" hidden>
<section class="panel auth-panel">
<h1>修改初始密码</h1> <h1>修改初始密码</h1>
<p class="muted">首次登录需先设置新密码才能进入。</p>
<form id="change-form"> <form id="change-form">
<label>当前密码 <input name="current" type="password" /></label> <label>当前密码 <input name="current" type="password" autocomplete="current-password" /></label>
<label>新密码(至少 8 位) <input name="new_password" type="password" /></label> <label>新密码(至少 8 位) <input name="new_password" type="password" autocomplete="new-password" /></label>
<button type="submit">保存并继续</button> <button type="submit">保存并继续</button>
<p id="change-error" class="error" hidden></p> <p id="change-error" class="error" hidden></p>
</form> </form>
</section> </section>
<section id="shell" hidden>
<header class="top">
<strong>xiaobai-datahub</strong>
<span id="phase" class="pill"></span>
<span id="who" class="muted"></span>
<button type="button" id="theme-btn" class="ghost">夜间</button>
<button type="button" id="logout-btn" class="ghost">退出</button>
</header>
<nav>
<button data-page="overview" class="active">总览</button>
<button data-page="sources">数据源</button>
<button data-page="jobs">调度任务</button>
<button data-page="release">盘后发布</button>
<button data-page="datasets">数据集</button>
<button data-page="audit">审计</button>
</nav>
<main id="page"></main>
</section>
</div> </div>
<script src="/admin/app.js"></script>
<div class="app bg-ambient" id="appRoot" hidden>
<div class="bg-layer bg-gridlines z0"></div>
<div class="bg-layer scanlines z50"></div>
<header class="hdr">
<div class="hdr-in">
<div class="radar" style="width:26px;height:26px" id="radarLogo">
<div class="sweep radar-sweep"></div>
<div class="ring1" style="inset:5.72px"></div>
<div class="ring2" style="inset:9.88px"></div>
<div class="center"></div>
</div>
<div class="brand"><span class="b1">小白复盘 <span style="color:#22d3ee">·</span> 数据中枢</span><span class="b2">DATA-HUB · HEL-529</span></div>
<span class="vsep"></span>
<nav class="nav" id="navEl">
<button class="navbtn" data-nav="overview"><span class="tri"></span>运行总览<span class="en">OVERVIEW</span></button>
<button class="navbtn" data-nav="sources"><span class="tri"></span>数据源配置<span class="en">SOURCES</span></button>
<button class="navbtn" data-nav="lineage"><span class="tri"></span>数据血缘<span class="en">LINEAGE</span></button>
</nav>
<span class="flex1"></span>
<span class="mdtag" id="phaseTag"></span>
<span class="livespan" id="liveSpan"><span class="livedot pulse-dot"></span>LIVE</span>
<span class="clock num" id="clock"><span id="ckD"></span><span class="csep">|</span><span class="ct"><span id="ckH"></span><span class="csep">:</span><span id="ckM"></span><span class="csep">:</span><span id="ckS"></span></span></span>
<span class="vsep"></span>
<button class="tbtn" id="opsBtn" style="font-size:10px">调度 / 发布 / 审计</button>
<button class="tbtn" id="calmBtn" style="font-size:10px">减少动态</button>
<span id="who" class="muted" style="font-size:10px"></span>
<button class="tbtn" id="logout-btn" style="font-size:10px">退出</button>
</div>
</header>
<main class="main" id="mainEl"></main>
<footer class="tape">
<span class="tape-label" id="tapeLed">EVENT TAPE</span>
<div class="tape-view"><div class="marquee-track" id="marqueeTrack"><span style="display:inline-flex;align-items:center" id="tapeA"></span><span style="display:inline-flex;align-items:center" id="tapeB"></span></div></div>
</footer>
</div>
<div class="drawer-mask" id="drawerMask">
<aside class="drawer">
<div class="drawer-hd">
<span class="ttl">调度 / 发布 / 审计</span>
<span class="sub" id="drawerSub"></span>
<button class="drawer-close" id="drawerClose">×</button>
</div>
<div class="drawer-tabs" id="drawerTabs">
<button class="drawer-tab" data-dtab="jobs">调度任务</button>
<button class="drawer-tab" data-dtab="release">盘后发布</button>
<button class="drawer-tab" data-dtab="audit">审计</button>
</div>
<div class="drawer-body" id="drawerBody"></div>
</aside>
</div>
<div class="modal-mask" id="modalMask">
<div class="modal-box">
<h3 id="modalTitle">危险操作确认</h3>
<p id="modalDesc"></p>
<label>管理密码 <input id="modalPassword" type="password" autocomplete="current-password" /></label>
<label id="modalConfirmWrap">请输入确认词 <span id="modalConfirmWord" class="num" style="color:#fbbf24"></span> <input id="modalConfirm" type="text" autocomplete="off" /></label>
<p class="modal-err" id="modalErr"></p>
<div class="modal-actions">
<button class="tbtn" id="modalCancel">取消</button>
<button class="tbtn danger" id="modalOk">确认执行</button>
</div>
</div>
</div>
<div class="toast" id="toastEl"></div>
</div>
<script src="/admin/app.js"></script>
</body> </body>
</html> </html>
File diff suppressed because one or more lines are too long