主站 - 新增 m0006 invite_codes 迁移;注册强制邀请码(首个管理员除外),消码与建号 同一事务,并发提交只有一个能成功 - 新增 /api/hub-admin/* 服务端点(共享 HUB_ADMIN_TOKEN,先于鉴权校验),供数据 中枢桥接读写会话/密码/模型池/会员/邀请码,并提供供应商模型列表拉取 - 前端:注册表单加邀请码(桌面 login、index.html、移动端);「系统管理」改为 「数据中枢」入口指向 8766,原模型池与会员管理分区移除,仅留「行情管理」; 随之清理陈旧 CSS 数据中枢 - 取消独立账号:删除 hub_admin/hub_sessions 与登录、改密、锁定逻辑,改为校验 主站 xiaobai_session,仅管理员可进,CSRF 由会话派生,危险操作二次确认走主站 - 控制台新增数据源凭证可编辑区(原有内容一项不删)、供应商制模型池(自动拉取 /models,失败退回卡内手动录入)、会员管理与邀请码页 - 日夜双主题:颜色收敛为同名 token 换值,SVG 改用 inline style 以吃到变量 自测 - 主站 verify_baseline 通过(498 项);数据中枢 235 项通过 - tools/verify_datahub_console.py 端到端跑通两服务真实对话; tools/verify_datahub_console_ui.py 浏览器跑通门禁/凭证/模型池/会员/主题/1030 窄屏 Co-authored-by: multica-agent <github@multica.ai>
105 lines
5.2 KiB
HTML
105 lines
5.2 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="zh-CN" data-theme="night">
|
||
<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="gate-view" class="auth-wrap bg-ambient" hidden>
|
||
<section class="panel gate-panel">
|
||
<h1 id="gate-title">数据中枢</h1>
|
||
<p id="gate-desc">正在校验小白复盘主站登录状态…</p>
|
||
<div class="gate-actions">
|
||
<a id="gate-login" class="pbtn" href="#" hidden>去主站登录</a>
|
||
<a id="gate-site" class="tbtn" href="#" hidden>返回小白复盘</a>
|
||
<button id="gate-retry" class="tbtn" type="button">重新校验</button>
|
||
</div>
|
||
</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 class="blip pulse-dot" id="radarBlipOk" style="left:64%;top:30%;background:var(--mint)"></div>
|
||
<div class="blip pulse-dot" id="radarBlipBad" style="left:30%;top:62%;background:var(--rd);animation-delay:.6s;display:none"></div>
|
||
</div>
|
||
<div class="brand"><span class="b1">小白复盘 <span style="color:var(--cy)">·</span> 数据中枢</span><span class="b2">DATA-HUB</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="models"><span class="tri">▸</span>模型池<span class="en">MODELS</span></button>
|
||
<button class="navbtn" data-nav="members"><span class="tri">▸</span>会员管理<span class="en">MEMBERS</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="blink cc">:</span><span id="ckM"></span><span class="blink cc">:</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="themeBtn" 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"><span class="led rev pulse"></span>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:var(--amb)"></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>
|