中控行情区与 K 线本地库(15 天滚动、按需拉取)

新增行情区单图与周期切换,K 线优先读 hub_kline.db,不足时经各实例 /api/hub/ohlcv 补齐;无后台定时更新。含回滚标签说明与单元测试。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-06-02 10:58:59 +08:00
parent ef99fb6c2e
commit ba681c7a58
16 changed files with 1298 additions and 3 deletions
+62 -2
View File
@@ -8,7 +8,7 @@
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600&family=Orbitron:wght@500;600;700&display=swap" rel="stylesheet" media="print" onload="this.media='all'" />
<noscript><link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600&family=Orbitron:wght@500;600;700&display=swap" rel="stylesheet" /></noscript>
<link rel="stylesheet" href="/assets/app.css?v=20260530-hub-iframe" />
<link rel="stylesheet" href="/assets/app.css?v=20260528-hub-market" />
</head>
<body>
<div class="app-bg" aria-hidden="true"></div>
@@ -25,6 +25,7 @@
<span id="sys-status" class="sys-pill" title="系统状态">SYNC</span>
<nav class="top-nav">
<a href="/monitor" id="nav-monitor">监控区</a>
<a href="/market" id="nav-market">行情区</a>
<a href="/settings" id="nav-settings">系统设置</a>
</nav>
<button type="button" id="btn-logout" class="ghost" title="退出登录">退出</button>
@@ -56,6 +57,63 @@
<div id="monitor-grid" class="grid-monitor"></div>
</div>
<div id="page-market" class="page hidden">
<div class="page-head">
<h1><span class="head-tag">MKT</span> 行情区</h1>
<p class="page-desc">按需拉取 K 线,本地库保留 15 天(无后台自动更新)</p>
</div>
<details class="hint-box">
<summary>数据说明</summary>
<div class="hint-body">
优先读中控 <code>data/hub_kline.db</code>,不足时向所选交易所实例请求并写入库。<br />
日内周期最多 1000 根,日线/周线最多 500 根。仅在本页操作或点「刷新」时拉取交易所。
</div>
</details>
<div class="market-toolbar toolbar">
<label class="market-field">
<span>交易所</span>
<select id="market-exchange"></select>
</label>
<label class="market-field">
<span>币种</span>
<input id="market-symbol" type="text" placeholder="TON/USDT" autocomplete="off" />
</label>
<label class="market-field">
<span>周期</span>
<select id="market-timeframe">
<option value="1m">1m</option>
<option value="5m" selected>5m</option>
<option value="15m">15m</option>
<option value="1h">1h</option>
<option value="4h">4h</option>
<option value="1d">1d</option>
<option value="1w">1w</option>
</select>
</label>
<button type="button" id="market-load" class="primary">加载</button>
<button type="button" id="market-refresh" class="ghost">强制刷新</button>
<span class="toolbar-spacer"></span>
<span id="market-updated" class="toolbar-meta"></span>
</div>
<p id="market-status" class="market-status"></p>
<div class="market-chart-wrap">
<div class="market-ohlcv-overlay" aria-label="K线详情">
<div class="market-ohlcv-title">
<span id="mkt-symbol-label"></span>
<span id="mkt-tf-label">5m</span>
</div>
<div class="market-ohlcv-grid">
<div><span class="k"></span><span id="mkt-o"></span></div>
<div><span class="k"></span><span id="mkt-h"></span></div>
<div><span class="k"></span><span id="mkt-l"></span></div>
<div><span class="k"></span><span id="mkt-c"></span></div>
<div class="market-vol"><span class="k"></span><span id="mkt-v"></span></div>
</div>
</div>
<div id="market-chart" class="market-chart-host"></div>
</div>
</div>
<div id="instance-frame-shell" class="instance-frame-shell hidden" aria-hidden="true">
<div class="instance-frame-toolbar">
<button type="button" id="instance-frame-back" class="ghost">← 返回监控</button>
@@ -120,6 +178,8 @@
</div>
<div id="toast"></div>
<script src="/assets/app.js?v=20260530-hub-embed-sso"></script>
<script src="https://unpkg.com/lightweight-charts@4.2.0/dist/lightweight-charts.standalone.production.js"></script>
<script src="/assets/chart.js?v=20260528-hub-market"></script>
<script src="/assets/app.js?v=20260528-hub-market"></script>
</body>
</html>