Files
xiaobai-review/xiaobai-datahub/admin/index.html
T
leeferandmultica-agent 6f99ee9d9e revert 3bafd30aad
revert feat(HEL-529): 按定稿100%重做三页数据中枢 + 数据修正1-5

视觉:admin/app.js 按已确认打样 hub-kimi.html 逐行重写三页 DOM 与动效
(sparkline/缓存年龄秒增/延迟变化闪烁/EVENT TAPE 预装滚动/分组接口表/
更新频率列/时钟冒号 blink/雷达 blip),CSS 补真实调用脉冲 node-ping。
数据修正:
1) pipeline._stage 批内按暂存表业务键确定性去重(保留最后一条),
   修复人气榜/龙虎榜自 09-07 起每日 UNIQUE constraint 落库失败;
2) overview.anomalies 收敛为「最新批次未成功且当日未发布」的当前异常,
   历史已恢复批次留在审计明细;
3) source_catalog 接口补真实批次分组 + 观测 join(接口名或数据集名
   双向匹配,标注 observed/observed_basis),消除「全部未配置/0/30」误报;
4) lineage 逐数据集按其服务接口过滤健康行(接口级状态),
   provisional 已配置无观测显示「已配置 · 待观测」,仅 iFinD 为未配置;
5) lineage 补 update_freq 真实频率字段。
测试:新增 tests/test_hel529_rework.py(8 项),全套 191 项通过
(1 项环境依赖失败在基线 d9358ab 上同样复现,与本改动无关)。

Co-authored-by: multica-agent <github@multica.ai>
2026-09-15 09:34:59 +08:00

113 lines
5.2 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.0" />
<title>小白复盘 · 数据中枢</title>
<link rel="stylesheet" href="/admin/styles.css" />
</head>
<body>
<div id="app">
<div id="login-view" class="auth-wrap bg-ambient" hidden>
<section class="panel auth-panel">
<h1>数据中枢</h1>
<p class="muted">内网管理后台 · 运行总览 / 数据源配置 / 数据血缘。</p>
<form id="login-form">
<label>账号 <input name="username" value="hub_admin" autocomplete="username" /></label>
<label>密码 <input name="password" type="password" autocomplete="current-password" /></label>
<button type="submit">登录</button>
<p id="login-error" class="error" hidden></p>
</form>
</section>
</div>
<div id="change-view" class="auth-wrap bg-ambient" hidden>
<section class="panel auth-panel">
<h1>修改初始密码</h1>
<p class="muted">首次登录需先设置新密码才能进入。</p>
<form id="change-form">
<label>当前密码 <input name="current" type="password" autocomplete="current-password" /></label>
<label>新密码(至少 8 位) <input name="new_password" type="password" autocomplete="new-password" /></label>
<button type="submit">保存并继续</button>
<p id="change-error" class="error" hidden></p>
</form>
</section>
</div>
<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>
</html>