diff --git a/web/app.js b/web/app.js index 9314837..44c0209 100644 --- a/web/app.js +++ b/web/app.js @@ -13,7 +13,7 @@ const tableState = { const PERIOD_LS_PREFIX = "ba_period_"; const PERIOD_TTL_MS = 4 * 60 * 60 * 1000; -let statsData = null; +let wecomPreviewData = null; let currentView = "today"; const SORT_KEYS = { rank: (r) => Number(r.rank) || 0, @@ -262,58 +262,25 @@ function downloadCsv(name, header, rows, periodStart) { a.click(); } -function renderStatsTable() { - const wrap = document.getElementById("stats-table-wrap"); - if (!wrap || !statsData) return; - - const items = statsData.items || []; - document.getElementById("stats-criteria").textContent = statsData.criteria || ""; - document.getElementById("stats-desc").textContent = statsData.message || ""; - const sum = statsData.summary; - document.getElementById("stats-summary").textContent = statsData.ok - ? `符合条件 ${statsData.count} 个 · 三日交集 ${sum?.intersection ?? 0} 个` - : "数据未就绪"; - - if (!statsData.ok) { - wrap.innerHTML = `
${statsData.message || "请等待三个周期数据就绪"}
`; - return; +function updateStatsHeader(payload) { + const criteria = document.getElementById("stats-criteria"); + const summary = document.getElementById("stats-summary"); + const desc = document.getElementById("stats-desc"); + if (!payload) return; + if (criteria) { + criteria.textContent = payload.ok + ? payload.period_label || "—" + : "数据未就绪"; } - - if (!items.length) { - wrap.innerHTML = '暂无符合条件的合约
'; - return; + if (summary) { + summary.textContent = payload.ok + ? `共 ${payload.count} 个币种` + + (payload.parts > 1 ? ` · 企微将分 ${payload.parts} 条发送` : "") + : ""; + } + if (desc && payload.message && !payload.ok) { + desc.textContent = payload.message; } - - wrap.innerHTML = ` -| 合约 | -今日排名 | 今日涨跌 | 今日成交额 | -昨日排名 | 昨日涨跌 | 昨日成交额 | -前日排名 | 前日涨跌 | 前日成交额 | -三日总成交额 | -
|---|
${escapeHtml(payload?.message || "无法生成预览")}
`; return; } if (meta) { - const partsHint = - payload.parts > 1 ? ` · 企微分 ${payload.parts} 条发送` : ""; - meta.textContent = `${payload.period_label || "—"} · ${payload.count} 个币种${partsHint}`; + meta.textContent = + `昨日周期 ${payload.period_label || "—"} · 昨/今/前 = 排名+涨跌幅` + + (payload.parts > 1 ? ` · 超长将分 ${payload.parts} 条企微消息` : ""); } if (!payload.items?.length) { cards.innerHTML = '暂无三日交集币种
'; return; } cards.innerHTML = payload.items - .map( - (it) => ` + .map((it) => { + const line = (label, row) => { + if (!row?.rank) return `${label}—`; + const pct = row.price_change_pct ?? 0; + const pctStr = row.price_change_pct_fmt || `${pct.toFixed(2)}%`; + return `${label}#${row.rank}${pctStr}`; + }; + return `${line("昨 ", it.yesterday)} ${line("今 ", it.today)} ${line("前 ", it.daybefore)}
+ `; + }) .join(""); } @@ -417,35 +368,25 @@ async function testWecomPush() { } async function loadStats() { - document.getElementById("stats-table-wrap").innerHTML = - '统计中…
'; - try { - const res = await fetch("/api/stats/three-day"); - statsData = await res.json(); - renderStatsTable(); - await loadWecomPreview(); - } catch (e) { - document.getElementById("stats-table-wrap").innerHTML = `${e.message}
`; - } + await loadWecomPreview(); } function exportStatsCsv() { - if (!statsData?.items?.length) return alert("暂无数据"); + const items = wecomPreviewData?.items; + if (!items?.length) return alert("暂无数据"); const header = [ "合约", - "今日排名", "今日涨跌%", "今日成交额", - "昨日排名", "昨日涨跌%", "昨日成交额", - "前日排名", "前日涨跌%", "前日成交额", - "三日总成交额", + "今日排名", "今日涨跌%", + "昨日排名", "昨日涨跌%", + "前日排名", "前日涨跌%", ]; - const rows = statsData.items.map((r) => [ + const rows = items.map((r) => [ r.symbol, - r.today?.rank, r.today?.price_change_pct, r.today?.quote_volume, - r.yesterday?.rank, r.yesterday?.price_change_pct, r.yesterday?.quote_volume, - r.daybefore?.rank, r.daybefore?.price_change_pct, r.daybefore?.quote_volume, - r.total_quote_volume, + r.today?.rank, r.today?.price_change_pct, + r.yesterday?.rank, r.yesterday?.price_change_pct, + r.daybefore?.rank, r.daybefore?.price_change_pct, ]); - downloadCsv("binance-three-day-stats", header, rows, "stats"); + downloadCsv("binance-wecom-push", header, rows, wecomPreviewData?.period_label); } function switchView(view) { @@ -458,7 +399,7 @@ function switchView(view) { }); if (view === "stats") { - if (!statsData) loadStats(); + if (!wecomPreviewData) loadStats(); return; } @@ -492,11 +433,10 @@ document.getElementById("btn-refresh").addEventListener("click", async () => { }); document.getElementById("btn-reload-stats")?.addEventListener("click", () => { - statsData = null; + wecomPreviewData = null; loadStats(); }); document.getElementById("btn-export-stats")?.addEventListener("click", exportStatsCsv); -document.getElementById("btn-push-preview")?.addEventListener("click", loadWecomPreview); document.getElementById("btn-push-test")?.addEventListener("click", testWecomPush); loadPeriod("today"); diff --git a/web/index.html b/web/index.html index 0849226..fea1d7a 100644 --- a/web/index.html +++ b/web/index.html @@ -16,7 +16,7 @@ - +