From 4a76c4a1bc768df02200c0a08f366b64da72c1ca Mon Sep 17 00:00:00 2001 From: mars <3361409208@qq.com> Date: Fri, 10 Jul 2026 17:25:41 +0800 Subject: [PATCH] =?UTF-8?q?feat(theme-4):=20PC=20=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E8=AF=A6=E6=83=85=E5=BC=B9=E7=AA=97=E3=80=81=E5=AE=9E=E5=BF=83?= =?UTF-8?q?=E9=9D=A2=E6=9D=BF=E4=B8=8E=E6=94=B6=E4=BB=B6=E7=AE=B1=E6=A0=B7?= =?UTF-8?q?=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 投注/资金/充值/返水列表点击改为海军蓝弹窗,深链 query 自动打开;修复冻结字段 i18n 与悬浮客服按钮过白问题。 --- .../player/src/components/FloatingMailbox.vue | 25 +- .../src/components/MessageListPanel.vue | 9 +- .../desktop/DesktopBetDetailModal.vue | 298 +++++++++++++ .../desktop/DesktopCashbackDetailModal.vue | 147 +++++++ .../desktop/DesktopDetailModalShell.vue | 141 +++++++ .../desktop/DesktopRechargeDetailModal.vue | 392 ++++++++++++++++++ .../desktop/DesktopTxDetailModal.vue | 292 +++++++++++++ apps/player/src/styles/desktop/records.css | 18 +- apps/player/src/styles/desktop/tokens.css | 11 + apps/player/src/utils/depositOrderLookup.ts | 63 +++ apps/player/src/views/BetDetailView.vue | 14 + apps/player/src/views/MobileInboxHubView.vue | 6 +- apps/player/src/views/RechargeDetailView.vue | 15 + .../src/views/WalletTransactionDetailView.vue | 17 + .../desktop/DesktopCashbackRecordsView.vue | 47 ++- .../src/views/desktop/DesktopMyBetsView.vue | 37 +- .../desktop/DesktopRechargeHistoryView.vue | 59 ++- .../views/desktop/DesktopWalletDetailView.vue | 55 ++- .../DesktopWalletTransactionDetailView.vue | 4 +- .../src/views/desktop/DesktopWalletView.vue | 16 +- 20 files changed, 1604 insertions(+), 62 deletions(-) create mode 100644 apps/player/src/components/desktop/DesktopBetDetailModal.vue create mode 100644 apps/player/src/components/desktop/DesktopCashbackDetailModal.vue create mode 100644 apps/player/src/components/desktop/DesktopDetailModalShell.vue create mode 100644 apps/player/src/components/desktop/DesktopRechargeDetailModal.vue create mode 100644 apps/player/src/components/desktop/DesktopTxDetailModal.vue create mode 100644 apps/player/src/utils/depositOrderLookup.ts diff --git a/apps/player/src/components/FloatingMailbox.vue b/apps/player/src/components/FloatingMailbox.vue index f5d0b6c..3fcb4aa 100644 --- a/apps/player/src/components/FloatingMailbox.vue +++ b/apps/player/src/components/FloatingMailbox.vue @@ -320,21 +320,22 @@ onMounted(() => { width: 56px; height: 56px; border-radius: 50%; - background: var(--primary); - color: #fff; - border: none; - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); + background: #0A3558; + color: rgba(255, 255, 255, 0.92); + border: 1px solid rgba(255, 255, 255, 0.2); + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.4); display: flex; align-items: center; justify-content: center; cursor: pointer; - transition: transform 0.2s, background 0.2s; + transition: transform 0.2s, background 0.2s, border-color 0.2s; position: relative; } .fab-btn:hover { transform: scale(1.05); - background: var(--primary-light); + background: #0F4068; + border-color: rgba(255, 255, 255, 0.28); } .fab-active { @@ -356,7 +357,7 @@ onMounted(() => { font-weight: 700; padding: 2px 6px; border-radius: 10px; - border: 2px solid var(--bg-card); + border: 2px solid #0A3558; line-height: 1; } @@ -383,8 +384,9 @@ onMounted(() => { justify-content: space-between; padding: 0 12px; border-bottom: 1px solid var(--border); - background: rgba(255, 255, 255, 0.02); + background: #001A33; height: 48px; + flex-shrink: 0; } .popup-title { @@ -440,10 +442,13 @@ onMounted(() => { } .popup-body { - height: calc(100% - 48px); + flex: 1; + min-height: 0; position: relative; - background: var(--bg-body); + background: #0A2540; overflow-y: auto; + overflow-x: hidden; + -webkit-overflow-scrolling: touch; } .panel-content { diff --git a/apps/player/src/components/MessageListPanel.vue b/apps/player/src/components/MessageListPanel.vue index c84cf4d..5bb97ba 100644 --- a/apps/player/src/components/MessageListPanel.vue +++ b/apps/player/src/components/MessageListPanel.vue @@ -1,6 +1,5 @@ + + + + diff --git a/apps/player/src/components/desktop/DesktopCashbackDetailModal.vue b/apps/player/src/components/desktop/DesktopCashbackDetailModal.vue new file mode 100644 index 0000000..d93711c --- /dev/null +++ b/apps/player/src/components/desktop/DesktopCashbackDetailModal.vue @@ -0,0 +1,147 @@ + + + + + diff --git a/apps/player/src/components/desktop/DesktopDetailModalShell.vue b/apps/player/src/components/desktop/DesktopDetailModalShell.vue new file mode 100644 index 0000000..f9b87dd --- /dev/null +++ b/apps/player/src/components/desktop/DesktopDetailModalShell.vue @@ -0,0 +1,141 @@ + + + + + diff --git a/apps/player/src/components/desktop/DesktopRechargeDetailModal.vue b/apps/player/src/components/desktop/DesktopRechargeDetailModal.vue new file mode 100644 index 0000000..ea82d91 --- /dev/null +++ b/apps/player/src/components/desktop/DesktopRechargeDetailModal.vue @@ -0,0 +1,392 @@ + + + + + diff --git a/apps/player/src/components/desktop/DesktopTxDetailModal.vue b/apps/player/src/components/desktop/DesktopTxDetailModal.vue new file mode 100644 index 0000000..4027fad --- /dev/null +++ b/apps/player/src/components/desktop/DesktopTxDetailModal.vue @@ -0,0 +1,292 @@ + + + + + diff --git a/apps/player/src/styles/desktop/records.css b/apps/player/src/styles/desktop/records.css index 82e84a0..1005d23 100644 --- a/apps/player/src/styles/desktop/records.css +++ b/apps/player/src/styles/desktop/records.css @@ -19,8 +19,11 @@ gap: 20px 32px; flex-wrap: wrap; flex-shrink: 0; - padding-bottom: 14px; - border-bottom: 1px solid var(--border); + padding: 14px 18px; + background: var(--desktop-surface-elevated); + border: 1px solid var(--border); + border-radius: var(--radius-sm); + box-shadow: var(--shadow); } .desktop-records-header-main { @@ -155,9 +158,10 @@ flex-direction: column; flex: 1; min-height: 0; - background: rgba(10, 37, 64, 0.94); + background: var(--desktop-surface-solid); border: 1px solid var(--border); - border-radius: 10px; + border-radius: var(--radius); + box-shadow: var(--shadow); overflow: hidden; } @@ -182,7 +186,7 @@ font-size: 11px; font-weight: 800; color: var(--text-muted); - background: #0A2540; + background: var(--desktop-surface-header); text-transform: uppercase; letter-spacing: 0.06em; border-bottom: 1px solid var(--border); @@ -240,8 +244,8 @@ .desktop-records-pagination { flex-shrink: 0; padding: 12px 16px; - border-top: 1px solid rgba(255, 255, 255, 0.06); - background: rgba(0, 26, 51, 0.5); + border-top: 1px solid var(--border); + background: var(--desktop-surface-header); } .desktop-records-loading, diff --git a/apps/player/src/styles/desktop/tokens.css b/apps/player/src/styles/desktop/tokens.css index ac4fff0..b2d1ffe 100644 --- a/apps/player/src/styles/desktop/tokens.css +++ b/apps/player/src/styles/desktop/tokens.css @@ -1,3 +1,11 @@ +/* Teleport 弹窗挂在 body 下,须用 :root 暴露实心色 */ +:root { + --desktop-surface-solid: #0A2540; + --desktop-surface-elevated: #0A3558; + --desktop-surface-header: #001A33; + --desktop-border: rgba(255, 255, 255, 0.1); +} + .desktop-shell { /* Color Palette overrides */ --primary: rgba(255, 255, 255, 0.92); @@ -36,6 +44,9 @@ --desktop-border: rgba(255, 255, 255, 0.1); --desktop-sidebar-bg: rgba(10, 37, 64, 0.95); --desktop-sidebar-panel-bg: linear-gradient(rgba(0, 26, 51, 0.88), rgba(0, 26, 51, 0.88)); + --desktop-surface-solid: #0A2540; + --desktop-surface-elevated: #0A3558; + --desktop-surface-header: #001A33; /* Reset typography inside desktop */ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; diff --git a/apps/player/src/utils/depositOrderLookup.ts b/apps/player/src/utils/depositOrderLookup.ts new file mode 100644 index 0000000..0b1d1d6 --- /dev/null +++ b/apps/player/src/utils/depositOrderLookup.ts @@ -0,0 +1,63 @@ +import api from '../api'; + +export type DepositAuditLog = { + id: string; + action: string; + actorType: string; + statusBefore: string | null; + statusAfter: string; + amount: string | null; + approvedAmount: string | null; + remark: string | null; + createdAt: string; +}; + +export type PlayerDepositOrder = { + id: string; + orderNo: string; + paymentMethodId?: string; + methodType: string; + amount: string; + status: string; + approvedAmount: string | null; + rejectReason: string | null; + remark: string | null; + createdAt: string; + reviewedAt: string | null; + paymentMethodName: string | null; + bankName?: string | null; + auditLogs?: DepositAuditLog[]; +}; + +export async function fetchDepositOrderAuditLogs(orderId: string): Promise { + try { + const { data } = await api.get(`/player/deposit-orders/${orderId}/audit-logs`); + const items = data.data?.items ?? data.data ?? []; + return Array.isArray(items) ? (items as DepositAuditLog[]) : []; + } catch { + return []; + } +} + +export async function enrichDepositOrder(order: PlayerDepositOrder): Promise { + if (order.auditLogs?.length) return order; + const auditLogs = await fetchDepositOrderAuditLogs(order.id); + return auditLogs.length ? { ...order, auditLogs } : order; +} + +export async function findDepositOrderById(orderId: string): Promise { + let page = 1; + const pageSize = 20; + + while (true) { + const { data } = await api.get('/player/deposit-orders', { params: { page, pageSize } }); + const result = data.data ?? { items: [], total: 0, pageSize }; + const items = (result.items ?? []) as PlayerDepositOrder[]; + const found = items.find((order) => order.id === orderId); + if (found) return enrichDepositOrder(found); + + const total = result.total ?? 0; + if (!items.length || page * pageSize >= total) return null; + page += 1; + } +} diff --git a/apps/player/src/views/BetDetailView.vue b/apps/player/src/views/BetDetailView.vue index 436662d..6cab81c 100644 --- a/apps/player/src/views/BetDetailView.vue +++ b/apps/player/src/views/BetDetailView.vue @@ -1,9 +1,23 @@ +