From 74bd24157984757959237c1dd6d3ae09470337d2 Mon Sep 17 00:00:00 2001 From: dekun Date: Tue, 26 May 2026 10:45:27 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BC=81=E4=B8=9A=E5=BE=AE?= =?UTF-8?q?=E4=BF=A1=E6=8E=A8=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/app.js | 158 +++++++++++++++---------------------------------- web/index.html | 19 +++--- web/style.css | 29 +++++---- 3 files changed, 74 insertions(+), 132 deletions(-) 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 = ` - - - - - - - - - -
合约今日排名今日涨跌今日成交额昨日排名昨日涨跌昨日成交额前日排名前日涨跌前日成交额三日总成交额
`; - - const body = document.getElementById("stats-body"); - body.innerHTML = items - .map((row) => { - const d = (p) => row[p] || {}; - const cell = (p, f) => { - const x = d(p); - const pct = x.price_change_pct ?? 0; - return `${f === "pct" ? x.price_change_pct_fmt || "—" : f === "rank" ? x.rank ?? "—" : x.quote_volume_fmt || "—"}`; - }; - return ` - ${row.symbol} - ${cell("today", "rank")}${cell("today", "pct")}${cell("today", "vol")} - ${cell("yesterday", "rank")}${cell("yesterday", "pct")}${cell("yesterday", "vol")} - ${cell("daybefore", "rank")}${cell("daybefore", "pct")}${cell("daybefore", "vol")} - ${formatVol(row.total_quote_volume)} - `; - }) - .join(""); } function escapeHtml(s) { @@ -324,59 +291,43 @@ function escapeHtml(s) { .replace(/\n/g, "
"); } -function formatVol(v) { - if (v >= 1e8) return (v / 1e8).toFixed(2) + "亿"; - if (v >= 1e4) return (v / 1e4).toFixed(2) + "万"; - return String(Math.round(v)); -} - -function renderWecomDayRow(label, row) { - if (!row?.rank) { - return `
${label}
`; - } - const pct = row.price_change_pct ?? 0; - return `
- ${label} - #${row.rank} - ${row.quote_volume_fmt || row.quote_volume} - ${row.price_change_pct_fmt || pct.toFixed(2) + "%"} - ${row.funding_rate_fmt || "—"} -
`; -} - function renderWecomPreview(payload) { - const panel = document.getElementById("wecom-preview-panel"); const cards = document.getElementById("wecom-preview-cards"); const meta = document.getElementById("wecom-preview-meta"); - if (!panel || !cards) return; - panel.classList.remove("hidden"); + if (!cards) return; + wecomPreviewData = payload; + updateStatsHeader(payload); if (!payload?.ok) { - if (meta) meta.textContent = "未就绪"; + if (meta) meta.textContent = ""; cards.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 `
${it.rank} ${it.symbol}
- ${renderWecomDayRow("昨日", it.yesterday)} - ${renderWecomDayRow("今日", it.today)} - ${renderWecomDayRow("前日", it.daybefore)} -
` - ) +

${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 @@ - +
@@ -67,23 +67,22 @@
-

数据统计

+

企微推送预览

- + -
-

-
diff --git a/web/style.css b/web/style.css index 0139a3b..6a3dd57 100644 --- a/web/style.css +++ b/web/style.css @@ -367,26 +367,29 @@ button:hover { } .wecom-preview-panel { - margin: 1rem 0 0; + margin-top: 0.5rem; padding: 1rem; background: #121a26; border: 1px solid var(--border); border-radius: 10px; } -.wecom-preview-panel.hidden { - display: none; -} - -.wecom-preview-panel h3 { - margin: 0 0 0.5rem; - font-size: 1rem; -} - -.wecom-preview-meta { - font-size: 0.8rem; +.wecom-preview-meta-line { + margin: 0 0 0.75rem; + font-size: 0.85rem; color: var(--muted); - font-weight: normal; +} + +.wecom-compact-line { + margin: 0; + font-size: 0.84rem; + line-height: 1.6; + color: var(--text); +} + +.wecom-compact-line strong { + margin: 0 0.15rem; + color: var(--accent); } .wecom-preview-cards {