From 9ec66ff1633a2fc958cb66bf146f68c5fea12be3 Mon Sep 17 00:00:00 2001 From: ivan Date: Wed, 1 Apr 2026 22:43:05 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=EF=BC=9A=E5=8A=A0=E5=AF=86?= =?UTF-8?q?=E8=B4=A7=E5=B8=81=E5=9B=BE=E8=A1=A8=E6=98=BE=E7=A4=BA=E8=A7=84?= =?UTF-8?q?=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/cryptoChart.ts | 27 +++++++- src/views/TradeDetail.vue | 138 ++++++++++++++++++++++---------------- 2 files changed, 107 insertions(+), 58 deletions(-) diff --git a/src/api/cryptoChart.ts b/src/api/cryptoChart.ts index 6bb7b9d..27ff966 100644 --- a/src/api/cryptoChart.ts +++ b/src/api/cryptoChart.ts @@ -7,6 +7,17 @@ /** 图表数据点:[时间戳(ms), 价格(USD)] */ export type CryptoChartPoint = [number, number] +/** 折线图 / 行情区小数位数上限 */ +const CRYPTO_CHART_PRICE_MAX_DECIMALS = 10 + +/** + * 加密货币价格展示:最多 {@link CRYPTO_CHART_PRICE_MAX_DECIMALS} 位小数,并去掉小数末尾多余的 0(如 1.20000000 → 1.2) + */ +export function formatCryptoChartPrice(price: number): string { + if (!Number.isFinite(price)) return '—' + return price.toFixed(CRYPTO_CHART_PRICE_MAX_DECIMALS).replace(/\.?0+$/, '') +} + /** Binance 交易对映射(symbol -> BTCUSDT 等) */ export const BINANCE_SYMBOLS: Record = { btc: 'BTCUSDT', @@ -125,9 +136,20 @@ const RANGE_TO_LIMIT: Record = { ALL: 1000, } +/** + * 从 Polymarket 风格 ticker 解析币种:取首个 "-" 段,且须在 {@link COINGECKO_COIN_IDS} 中有映射。 + * 例:`bnb-updown-15m-1775056500` → `bnb` + */ +export function parseCryptoSymbolFromTicker(ticker: string | undefined | null): string | null { + if (ticker == null || typeof ticker !== 'string') return null + const first = ticker.split('-')[0]?.trim().toLowerCase() ?? '' + if (!first || !COINGECKO_COIN_IDS[first]) return null + return first +} + /** * 从事件信息推断加密货币符号 - * 优先:ticker -> tags.slug -> series.slug -> 市场 question 中的币种名 + * 优先:ticker 首段(见 {@link parseCryptoSymbolFromTicker})-> 整段 ticker -> tags.slug -> series -> question */ export function inferCryptoSymbol(event: { ticker?: string @@ -135,6 +157,9 @@ export function inferCryptoSymbol(event: { series?: { slug?: string; ticker?: string }[] markets?: { question?: string }[] }): string | null { + const fromTickerSeg = parseCryptoSymbolFromTicker(event.ticker) + if (fromTickerSeg) return fromTickerSeg + const t = (event.ticker ?? '').toLowerCase().trim() if (t && COINGECKO_COIN_IDS[t]) return t diff --git a/src/views/TradeDetail.vue b/src/views/TradeDetail.vue index 3988bf4..702d736 100644 --- a/src/views/TradeDetail.vue +++ b/src/views/TradeDetail.vue @@ -27,8 +27,9 @@

{{ detailError }}

+ {{ resolutionDate }} - mdi-currency-btc + {{ cryptoSymbol.toUpperCase() }} - Past ▾ - {{ resolutionDate }}