From d432de6fdfe25a15bab07d9ffedf7b3b34359189 Mon Sep 17 00:00:00 2001 From: Mars <3361409208a@gmail.com> Date: Wed, 3 Jun 2026 10:54:49 +0800 Subject: [PATCH] =?UTF-8?q?feat(player):=20=E4=BC=98=E5=8C=96=E8=B5=9B?= =?UTF-8?q?=E4=BA=8B=E8=AF=A6=E6=83=85=E4=B8=8E=E4=B8=B2=E5=85=B3=E4=B8=8B?= =?UTF-8?q?=E6=B3=A8=E4=BA=A4=E4=BA=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 合并玩法列表、单选投注单与玩法内确认下单 - 波胆底部确认与核对弹窗;串关底栏固定 - 帮助弹窗与投注单逻辑拆分(详情单关/串关页串关) Co-authored-by: Cursor --- apps/player/src/components/BetSlipDrawer.vue | 184 +++++++-- .../match-detail/CorrectScoreConfirmModal.vue | 253 ++++++++++++ .../match-detail/CorrectScorePanel.vue | 101 ++--- .../match-detail/FeaturedMarketRow.vue | 160 -------- .../match-detail/MarketSelectionsPanel.vue | 65 +-- .../match-detail/MarketTypeTile.vue | 95 ++--- .../components/match-detail/MatchBetGuide.vue | 156 ++++++++ .../src/components/parlay/ParlayPanel.vue | 72 +++- apps/player/src/main.ts | 120 ++++++ apps/player/src/stores/betSlip.ts | 35 +- apps/player/src/utils/marketCatalog.ts | 12 + apps/player/src/views/MatchDetailView.vue | 376 ++++++++++-------- 12 files changed, 1089 insertions(+), 540 deletions(-) create mode 100644 apps/player/src/components/match-detail/CorrectScoreConfirmModal.vue delete mode 100644 apps/player/src/components/match-detail/FeaturedMarketRow.vue create mode 100644 apps/player/src/components/match-detail/MatchBetGuide.vue diff --git a/apps/player/src/components/BetSlipDrawer.vue b/apps/player/src/components/BetSlipDrawer.vue index 28c8326..1395a0e 100644 --- a/apps/player/src/components/BetSlipDrawer.vue +++ b/apps/player/src/components/BetSlipDrawer.vue @@ -29,7 +29,6 @@ async function placeBet() { success.value = ''; try { - const requestId = genId(); if (slip.mode === 'parlay' && slip.items.length >= 2) { if (slip.hasSameMatch) { error.value = t('bet.parlay_same_match'); @@ -41,7 +40,7 @@ async function placeBet() { oddsVersion: i.oddsVersion, })), stake: slip.stake, - requestId, + requestId: genId(), }); } else if (slip.items.length === 1) { const item = slip.items[0]; @@ -49,17 +48,21 @@ async function placeBet() { selectionId: item.selectionId, oddsVersion: item.oddsVersion, stake: slip.stake, - requestId, + requestId: genId(), }); } else { - error.value = t('bet.parlay_need_more'); return; } - success.value = '下注成功!'; + success.value = t('bet.place_success'); slip.clear(); - setTimeout(() => { show.value = false; success.value = ''; }, 1500); + setTimeout(() => { + show.value = false; + success.value = ''; + }, 1500); } catch (e: unknown) { - error.value = (e as { response?: { data?: { error?: string } } })?.response?.data?.error || '下注失败'; + error.value = + (e as { response?: { data?: { error?: string } } })?.response?.data?.error || + t('bet.place_failed'); } finally { loading.value = false; } @@ -71,31 +74,46 @@ async function placeBet() {

{{ t('bet.bet_slip') }} ({{ slip.count }})

- +
-
点击赔率添加投注
+
{{ t('bet.slip_empty_hint') }}
{{ item.matchName }}
-
{{ item.selectionName }} @ {{ item.odds }}
- +
+ {{ item.selectionName }} @ {{ item.odds }} +
+
-
同场比赛不能串关,可作为单关分别投注
+

+ {{ t('bet.parlay') }} · {{ t('bet.slip_parlay_odds', { odds: slip.totalOdds.toFixed(2) }) }} +

-
{{ t('bet.parlay') }} · 赔率 {{ slip.totalOdds.toFixed(2) }}
-
预计返还: {{ slip.potentialReturn.toFixed(2) }}
+
+ {{ t('bet.slip_est_return') }}: + {{ slip.potentialReturn.toFixed(2) }} +

{{ error }}

{{ success }}

-
@@ -103,48 +121,130 @@ async function placeBet() { diff --git a/apps/player/src/components/match-detail/CorrectScoreConfirmModal.vue b/apps/player/src/components/match-detail/CorrectScoreConfirmModal.vue new file mode 100644 index 0000000..acc4f5d --- /dev/null +++ b/apps/player/src/components/match-detail/CorrectScoreConfirmModal.vue @@ -0,0 +1,253 @@ + + + + + diff --git a/apps/player/src/components/match-detail/CorrectScorePanel.vue b/apps/player/src/components/match-detail/CorrectScorePanel.vue index 9b2cf62..d71b2c8 100644 --- a/apps/player/src/components/match-detail/CorrectScorePanel.vue +++ b/apps/player/src/components/match-detail/CorrectScorePanel.vue @@ -5,8 +5,6 @@ import { groupCorrectScoreSelections, type CsSelection } from '../../utils/corre const props = defineProps<{ marketType: string; - homeTeamName: string; - awayTeamName: string; selections: Array<{ id: string; selectionCode: string; @@ -38,11 +36,6 @@ function formatOdds(odds: string) {