+
+
-
@@ -414,4 +416,99 @@ label {
font-weight: 600;
line-height: 1.3;
}
+
+/* ===== Desktop mode: fields only (card shell in DesktopAuthLayout) ===== */
+.login-page--desktop {
+ min-height: auto;
+ height: auto;
+ width: 100%;
+ align-items: stretch;
+ justify-content: flex-start;
+ padding: 0;
+ background-color: transparent;
+ overflow: visible;
+}
+.login-page--desktop .login-form {
+ max-width: none;
+ width: 100%;
+ gap: 10px;
+ padding: 0;
+ border: none !important;
+ background: transparent !important;
+ box-shadow: none !important;
+}
+.login-page--desktop .field {
+ gap: 8px;
+}
+.login-page--desktop .field-optional {
+ opacity: 0.85;
+}
+.login-page--desktop label {
+ font-size: 13px;
+ letter-spacing: 0.03em;
+}
+.login-page--desktop .optional-tag {
+ font-size: 12px;
+}
+.login-page--desktop .field-input {
+ height: 46px;
+ font-size: 14px;
+ border-radius: 4px;
+ padding: 0 14px;
+}
+.login-page--desktop .field-input:focus {
+ border-color: var(--primary);
+ box-shadow: 0 0 0 2px rgba(244, 162, 97, 0.18);
+}
+.login-page--desktop .field-input:hover:not(:focus) {
+ border-color: rgba(255, 255, 255, 0.18);
+}
+.login-page--desktop .btn-secondary {
+ height: 46px;
+ font-size: 13px;
+ border-radius: 4px;
+ padding: 0 14px;
+}
+.login-page--desktop .btn-secondary:hover:not(:disabled) {
+ border-color: rgba(255, 255, 255, 0.2);
+ background: rgba(30, 30, 30, 0.8);
+}
+.login-page--desktop .btn-login {
+ margin-top: 10px;
+ padding: 14px 18px;
+ border-radius: 4px;
+ font-size: 15px;
+ height: 50px;
+}
+.login-page--desktop .btn-login:hover:not(:disabled) {
+ background: rgba(244, 162, 97, 0.1);
+ border-color: var(--primary);
+}
+.login-page--desktop .btn-login:active:not(:disabled) {
+ transform: scale(0.98);
+}
+.login-page--desktop .btn-login:disabled {
+ opacity: 0.55;
+}
+.login-page--desktop .btn-skip {
+ margin-top: 6px;
+ padding: 12px 16px;
+ border-radius: 4px;
+ border: 1px solid var(--border);
+ background: rgba(15, 32, 39, 0.6);
+ font-size: 14px;
+ transition: border-color 0.2s ease, color 0.2s ease, background-color 0.2s ease;
+}
+.login-page--desktop .btn-skip:hover {
+ border-color: rgba(255, 255, 255, 0.2);
+ color: rgba(255, 255, 255, 0.8);
+ background: rgba(30, 30, 30, 0.8);
+}
+.login-page--desktop .error {
+ font-size: 12px;
+ padding: 6px 10px;
+ border-radius: 4px;
+ background: rgba(255, 69, 58, 0.08);
+ border-left: 2px solid var(--danger, #FF453A);
+}
diff --git a/apps/player/src/views/RegisterWrapperView.vue b/apps/player/src/views/RegisterWrapperView.vue
new file mode 100644
index 0000000..eacf3de
--- /dev/null
+++ b/apps/player/src/views/RegisterWrapperView.vue
@@ -0,0 +1,10 @@
+
+
+
+
+
diff --git a/apps/player/src/views/WalletDetailView.vue b/apps/player/src/views/WalletDetailView.vue
index 1895d9f..81ef4a5 100644
--- a/apps/player/src/views/WalletDetailView.vue
+++ b/apps/player/src/views/WalletDetailView.vue
@@ -1,387 +1,10 @@
-
-
-
- ‹ {{ t('history.back') }}
-
-
-
-
-
-
-
-
- {{ t('bet.loading') }}
-
-
-
-
-
-
-
- {{ t(f.label) }}
-
-
-
-
-
-
-
- {{ txLabel(tx) }}
- {{ txSubtitle(tx) }}
-
-
- {{ formatMoney(tx.amount, locale) }}
-
-
-
- {{ new Date(tx.createdAt).toLocaleString() }}
- ›
-
-
-
-
-
-
-
-
-
-
-
- {{ t('common.no_more') }}
-
-
-
- {{ t('wallet.no_records') }}
-
-
-
+
+
-
-
diff --git a/apps/player/src/views/WalletTransactionDetailView.vue b/apps/player/src/views/WalletTransactionDetailView.vue
index 8f32080..d2616df 100644
--- a/apps/player/src/views/WalletTransactionDetailView.vue
+++ b/apps/player/src/views/WalletTransactionDetailView.vue
@@ -1,391 +1,10 @@
-
-
-
-
-
-
-
- ‹ {{ t('history.back') }}
-
-
-
-
-
-
{{ t('wallet.detail_not_found') }}
-
-
-
- {{ displayTypeLabel }}
- {{ summaryText }}
- {{ formatMoney(tx.amount, locale) }}
- {{ formattedTime }}
-
-
-
- {{ t('wallet.detail_summary') }}
-
-
- {{ t('wallet.detail_amount') }}
- {{ formatMoney(tx.amount, locale) }}
-
-
- {{ t('wallet.detail_balance_before') }}
- {{ formatMoney(tx.balanceBefore, locale) }}
-
-
- {{ t('wallet.detail_balance_after') }}
- {{ formatMoney(tx.balanceAfter, locale) }}
-
-
-
- {{ t('wallet.detail_frozen_before') }}
- {{ formatMoney(tx.frozenBefore, locale) }}
-
-
- {{ t('wallet.detail_frozen_after') }}
- {{ formatMoney(tx.frozenAfter, locale) }}
-
-
-
-
-
-
- {{ t('wallet.detail_reference') }}
-
-
- {{ t('wallet.detail_reference_type') }}
- {{ referenceLabel }}
-
-
- {{ t('wallet.detail_reference_id') }}
- {{ tx.referenceId }}
-
-
- {{ t('wallet.detail_remark') }}
-
-
-
-
- {{ t('wallet.detail_bet_link') }} · {{ tx.betNo }}
-
-
- {{ t('wallet.detail_cashback_link') }} · {{ cashbackBatchNo }}
-
-
-
-
- {{ t('wallet.detail_tx_id') }}
- {{ tx.transactionId }}
-
-
-
+
+
-
-
diff --git a/apps/player/src/views/WalletView.vue b/apps/player/src/views/WalletView.vue
index 0a12d8d..39a6ffc 100644
--- a/apps/player/src/views/WalletView.vue
+++ b/apps/player/src/views/WalletView.vue
@@ -1,263 +1,10 @@
-
-
-
-
-
-
-
-
- {{ t('bet.loading') }}
-
-
-
-
-
- {{ t('wallet.view_cashbacks_detail') }} ›
-
- {{ t('wallet.view_all') }} ›
-
-
-
-
-
-
- {{ txLabel(tx) }}
- {{ txSubtitle(tx) }}
-
-
- {{ formatMoney(tx.amount, locale) }}
-
-
-
- {{ new Date(tx.createdAt).toLocaleString() }}
- ›
-
-
-
-
-
- {{ t('wallet.no_records') }}
-
-
-
+
+
-
-
diff --git a/apps/player/src/views/desktop/DesktopAnnouncementDetailView.vue b/apps/player/src/views/desktop/DesktopAnnouncementDetailView.vue
new file mode 100644
index 0000000..7e14209
--- /dev/null
+++ b/apps/player/src/views/desktop/DesktopAnnouncementDetailView.vue
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
diff --git a/apps/player/src/views/desktop/DesktopAnnouncementListView.vue b/apps/player/src/views/desktop/DesktopAnnouncementListView.vue
new file mode 100644
index 0000000..3ac8e0d
--- /dev/null
+++ b/apps/player/src/views/desktop/DesktopAnnouncementListView.vue
@@ -0,0 +1,327 @@
+
+
+
+
+
+
+
+
+
+
+
+
{{ t('announcements.empty') }}
+
+
+
+
+
+
![]()
+
+
+
+ {{ typeLabel(item) }}
+ {{ formatDate(item.createdAt) }}
+
+
{{ itemTitle(item) }}
+
{{ itemPreview(item) }}
+
{{ t('announcements.read_more') }} ›
+
+
+
+
+
+
+
diff --git a/apps/player/src/views/desktop/DesktopAnnouncementsHubShell.vue b/apps/player/src/views/desktop/DesktopAnnouncementsHubShell.vue
new file mode 100644
index 0000000..52ff171
--- /dev/null
+++ b/apps/player/src/views/desktop/DesktopAnnouncementsHubShell.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+ {{ t('announcements.select_hint') }}
+
+
+
+
+
+
diff --git a/apps/player/src/views/desktop/DesktopBetDetailView.vue b/apps/player/src/views/desktop/DesktopBetDetailView.vue
new file mode 100644
index 0000000..c0fe8fa
--- /dev/null
+++ b/apps/player/src/views/desktop/DesktopBetDetailView.vue
@@ -0,0 +1,215 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ t('common.load_failed') }}
+
{{ t('common.retry') }}
+
+
+
+
+
+
+
+
+
{{ t('bet.selections') || '投注选项' }}
+
+
{{ leg.matchTitle || t('bet.match') }}
+
+ {{ leg.marketLabel || '' }}
+ {{ translateSel(leg.selectionName || '') }}
+ @{{ leg.odds }}
+ ({{ t('history.ft') }}: {{ leg.score.ft }})
+
+
+
+
+
+ {{ t('common.not_found') || '未找到记录' }}
+
+
+
+
+
diff --git a/apps/player/src/views/desktop/DesktopCashbackRecordsView.vue b/apps/player/src/views/desktop/DesktopCashbackRecordsView.vue
new file mode 100644
index 0000000..88dd9a5
--- /dev/null
+++ b/apps/player/src/views/desktop/DesktopCashbackRecordsView.vue
@@ -0,0 +1,183 @@
+
+
+
+
+
+
+
+
+
+
+
+ | {{ t('cashback.period') }} |
+ {{ t('cashback.effective_stake') }} |
+ {{ t('cashback.rate') }} |
+ {{ t('cashback.amount') }} |
+ {{ t('cashback.batch_no') }} |
+ {{ t('wallet.time') }} |
+
+
+
+
+ |
+
+
+
+ |
+
+
+
+ | {{ formatPeriod(row.periodStart, row.periodEnd) }} |
+ {{ formatMoneyCompact(row.effectiveStake, locale) }} |
+ {{ formatRate(row.rate) }} |
+ {{ formatMoney(row.amount, locale) }} |
+ {{ row.batchNo }} |
+ {{ formatTime(row.confirmedAt ?? row.createdAt) }} |
+
+
+
+ |
+ {{ t('cashback.empty') }}
+ {{ t('cashback.empty_hint') }}
+ |
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/player/src/views/desktop/DesktopFootballView.vue b/apps/player/src/views/desktop/DesktopFootballView.vue
new file mode 100644
index 0000000..dbd74ef
--- /dev/null
+++ b/apps/player/src/views/desktop/DesktopFootballView.vue
@@ -0,0 +1,465 @@
+
+
+
+
+
+
+
diff --git a/apps/player/src/views/desktop/DesktopForgotPasswordView.vue b/apps/player/src/views/desktop/DesktopForgotPasswordView.vue
new file mode 100644
index 0000000..92e2cb4
--- /dev/null
+++ b/apps/player/src/views/desktop/DesktopForgotPasswordView.vue
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
diff --git a/apps/player/src/views/desktop/DesktopHomeView.vue b/apps/player/src/views/desktop/DesktopHomeView.vue
new file mode 100644
index 0000000..eb13012
--- /dev/null
+++ b/apps/player/src/views/desktop/DesktopHomeView.vue
@@ -0,0 +1,1593 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ t('home.section_featured') }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ featuredMatch.leagueName }}
+ LIVE
+
+
{{ formatKickoff(featuredMatch.startTime) }}
+
+
+
+
+
+ {{ featuredMatch.homeTeamName }}
+
+
VS
+
+
+ {{ featuredMatch.awayTeamName }}
+
+
+
+
+
+
{{ getMarketTabLabel(m.marketType) }}
+
handleOddsClick(featuredMatch!, m, selId, event)"
+ />
+
+
+ {{ t('bet.no_market_odds') || '暂无盘口赔率' }}
+
+
+
+
+
+
+
+
+
+
+
+
{{ match.leagueName }}
+
+ LIVE
+ {{ formatKickoff(match.startTime) }}
+
+
+
+
+
+ {{ match.homeTeamName }}
+
+
VS
+
+
+ {{ match.awayTeamName }}
+
+
+
+
+
+
+
+
+ {{ match.homeTeamName }}
+
+
VS
+
+
+ {{ match.awayTeamName }}
+
+
+
+
+
+
+ {{ getMarketTabLabel(m.marketType) }}
+
+
+
+
+ handleOddsClick(match, getActiveMarket(match)!, selId, event)"
+ />
+
+
+ {{ t('bet.no_market_odds') || '暂无盘口赔率' }}
+
+
+
+
+
+
+
+
+
{{ t('home.no_matches') }}
+
+
+
+
+
+
+
+ {{ t('home.section_upcoming') }}
+
+
+
+
+
+
+
+
+
{{ match.leagueName }}
+
+ {{ formatKickoff(match.startTime) }}
+
+
+
+
+
+ {{ match.homeTeamName }}
+
+
VS
+
+
+ {{ match.awayTeamName }}
+
+
+
+
+
+
+
+
+ {{ match.homeTeamName }}
+
+
VS
+
+
+ {{ match.awayTeamName }}
+
+
+
+
+
+
+ {{ getMarketTabLabel(m.marketType) }}
+
+
+
+
+ handleOddsClick(match, getActiveMarket(match)!, selId, event)"
+ />
+
+
+ {{ t('bet.no_market_odds') || '暂无盘口赔率' }}
+
+
+
+
+
+
+
{{ t('home.upcoming_empty') }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/player/src/views/desktop/DesktopInboxHubView.vue b/apps/player/src/views/desktop/DesktopInboxHubView.vue
new file mode 100644
index 0000000..0f50f50
--- /dev/null
+++ b/apps/player/src/views/desktop/DesktopInboxHubView.vue
@@ -0,0 +1,264 @@
+
+
+
+
+
+
+
+
+
+
+
+ $router.push('/messages/' + id)" />
+
+
+
+
+
+
+
+
diff --git a/apps/player/src/views/desktop/DesktopLoginView.vue b/apps/player/src/views/desktop/DesktopLoginView.vue
new file mode 100644
index 0000000..0b1a882
--- /dev/null
+++ b/apps/player/src/views/desktop/DesktopLoginView.vue
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
diff --git a/apps/player/src/views/desktop/DesktopMatchDetailView.vue b/apps/player/src/views/desktop/DesktopMatchDetailView.vue
new file mode 100644
index 0000000..3d3f0de
--- /dev/null
+++ b/apps/player/src/views/desktop/DesktopMatchDetailView.vue
@@ -0,0 +1,839 @@
+
+
+
+
+
+
+ ← {{ t('bet.back') || '返回' }}
+ /
+ {{ match?.leagueName }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ match.homeTeamName }}
+
+
+
+
+ {{ match.score?.ftHome }}
+ -
+ {{ match.score?.ftAway }}
+
+
VS
+
{{ kickoff }}
+
+
+
+
+ {{ match.awayTeamName }}
+
+
+
+
+
+
{{ t('bet.result_stats_title') || '赛果数据' }}
+
+
+ {{ item.label }}
+ {{ item.value }}
+
+
+
+
+
+
{{ t('bet.filter_market') }}
+
+
+ {{ t('bet.time_all') }}
+
+
+ {{ option.label }}
+
+
+
+
+
+
+
+
+ {{ marketLabel(market) }}
+ {{ t('bet.market_status_closed') }}
+
+
+ toggleSelection(market.selections.find(s => s.id === id)!, market, event)"
+ />
+
+
+
+
+
+
+
{{ t('bet.correct_score') }}
+
+
+
+ {{ marketLabel(market) }}
+ {{ t('bet.market_status_closed') }}
+
+
toggleSelection(market.selections.find(s => s.id === id)!, market, event)"
+ />
+
+
+
+
+
+
{{ hasMarketFilter ? t('bet.no_markets_filtered') : (t('bet.no_markets') || '暂无可用盘口') }}
+
+
+
+
+
+
+
diff --git a/apps/player/src/views/desktop/DesktopMessagesHubShell.vue b/apps/player/src/views/desktop/DesktopMessagesHubShell.vue
new file mode 100644
index 0000000..ac0e7e3
--- /dev/null
+++ b/apps/player/src/views/desktop/DesktopMessagesHubShell.vue
@@ -0,0 +1,182 @@
+
+
+
+
+
+
+
+
+
+
+ {{ t('messages.select_hint') }}
+
+
+
+
+
+
diff --git a/apps/player/src/views/desktop/DesktopMyBetsView.vue b/apps/player/src/views/desktop/DesktopMyBetsView.vue
new file mode 100644
index 0000000..67a7c8a
--- /dev/null
+++ b/apps/player/src/views/desktop/DesktopMyBetsView.vue
@@ -0,0 +1,198 @@
+
+
+
+
+
+
+
+
+
+
+
+ | {{ t('bet.bet_no') }} |
+ {{ t('bet.match') }} |
+ {{ t('bet.selection') }} |
+ {{ t('bet.odds') }} |
+ {{ t('bet.stake') }} |
+ {{ t('bet.potential_payout') }} |
+ {{ t('common.status') }} |
+ {{ t('bet.placed_at') }} |
+
+
+
+
+ |
+
+
+
+ |
+
+
+
+ | {{ bet.betNo }} |
+ {{ bet.matchTitle || '-' }} |
+ {{ bet.pickLabel || '-' }} |
+ {{ bet.totalOdds ?? '-' }} |
+ {{ bet.stake }} |
+ {{ bet.potentialReturn ?? '-' }} |
+
+
+ {{ statusLabel(bet.status) }}
+
+ |
+ {{ bet.placedAt ? new Date(bet.placedAt).toLocaleString() : '-' }} |
+
+
+
+ |
+ {{ t('history.empty') }}
+ |
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/player/src/views/desktop/DesktopOutrightDetailView.vue b/apps/player/src/views/desktop/DesktopOutrightDetailView.vue
new file mode 100644
index 0000000..5428b36
--- /dev/null
+++ b/apps/player/src/views/desktop/DesktopOutrightDetailView.vue
@@ -0,0 +1,334 @@
+
+
+
+
+
+ ← {{ t('bet.back') }}
+ /
+ {{ t('bet.tab_outright') }}
+
+
+
+
+
+
+
+
+
+
+
+
{{ headTitle }}
+ {{ t('bet.outright_settled') }}
+
+
+ {{ event.leagueName }}
+
+
{{ t('bet.outright_teams_count', { n: teamCount }) }}
+
{{ t('bet.outright_settled_hint') }}
+
+
+
+
+
+
+
+
+
+
+
{{ loadError || t('bet.no_outright') }}
+
{{ t('bet.back') }}
+
+
+
+
+
+
+
+
diff --git a/apps/player/src/views/desktop/DesktopProfileEditView.vue b/apps/player/src/views/desktop/DesktopProfileEditView.vue
new file mode 100644
index 0000000..5a6694b
--- /dev/null
+++ b/apps/player/src/views/desktop/DesktopProfileEditView.vue
@@ -0,0 +1,395 @@
+
+
+
+
+
+
+
+
+
+
+
{{ t('profile.avatar') || '头像' }}
+
+
![avatar]()
+
+
+ {{ t('profile.change_avatar') || '更换头像' }}
+
+
+
+
+
+
+
{{ t('profile.basic_info') || '基础信息' }}
+
+
{{ message }}
+
{{ error }}
+
+
+
+
+
+
{{ t('profile.username_locked') || '用户名不可修改' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ t('common.save') || '保存' }}
+
+
+
+
+
+
+ {{ t('profile.change_password') || '修改密码' }}
+
+ {{ passwordChangeOpen ? (t('common.collapse') || '收起') : (t('common.expand') || '展开') }}
+
+
+
+
+
+
+
+ { avatarModalOpen = false; if (key !== undefined) setAvatarKey(key); }"
+ />
+
+
+
+
+
diff --git a/apps/player/src/views/desktop/DesktopProfileView.vue b/apps/player/src/views/desktop/DesktopProfileView.vue
new file mode 100644
index 0000000..f56cc41
--- /dev/null
+++ b/apps/player/src/views/desktop/DesktopProfileView.vue
@@ -0,0 +1,439 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ t('common.load_failed') }}
+
{{ t('common.retry') }}
+
+
+
+
+
+
![]()
+
+
+
+
+
+

+
+ THEBET365
+ MEMBER
+
+
+
+ +
+ {{ t('recharge.title') }}
+
+
+
+
+
{{ t('wallet.available') || '可用余额' }}
+
{{ balanceDisplay }}
+
+
+
+
+
+
+
+
+
+
+ {{ t('profile.username') || '用户名' }}
+ {{ profileRaw?.username }}
+
+
+ {{ t('profile.phone') || '手机号' }}
+ {{ profileRaw?.preferences?.phone || '-' }}
+
+
+ {{ t('profile.edit') }}
+
+
+
+
+
+
+
+
+
+ {{ item.label }}
+
+
+
+
+
+
+ {{ t('auth.logout') }}
+
+
+
+
+
+
+
+
diff --git a/apps/player/src/views/desktop/DesktopRechargeDetailView.vue b/apps/player/src/views/desktop/DesktopRechargeDetailView.vue
new file mode 100644
index 0000000..4a7e37f
--- /dev/null
+++ b/apps/player/src/views/desktop/DesktopRechargeDetailView.vue
@@ -0,0 +1,429 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ t('common.load_failed') }}
+
{{ t('common.retry') }}
+
+
+
+
+
+
+
{{ t('recharge.audit_title') }}
+
+
+
+
+
+
+
+
+ {{ auditActionLabel(entry.log.action) }}
+
+
+
{{ entry.actor }}
+
+ {{ t('recharge.audit_credited') }} {{ formatMoney(entry.log.approvedAmount, locale) }}
+
+
+ {{ t('recharge.reject_reason') }}
+ {{ entry.remark.text }}
+
+
+ {{ auditNoteDisplayText(entry.remark) }}
+
+
+
+
+
+
+
+ {{ t('common.not_found') || '未找到记录' }}
+
+
+
+
+
diff --git a/apps/player/src/views/desktop/DesktopRechargeHistoryView.vue b/apps/player/src/views/desktop/DesktopRechargeHistoryView.vue
new file mode 100644
index 0000000..a9a33d8
--- /dev/null
+++ b/apps/player/src/views/desktop/DesktopRechargeHistoryView.vue
@@ -0,0 +1,143 @@
+
+
+
+
+
+
+
+
+
+
+
+ | {{ t('recharge.order_no') }} |
+ {{ t('recharge.method') }} |
+ {{ t('wallet.amount') }} |
+ {{ t('common.status') }} |
+ {{ t('wallet.time') }} |
+
+
+
+
+ |
+
+
+
+ |
+
+
+
+ | {{ order.orderNo || order.id }} |
+ {{ methodLabel(order) }} |
+ {{ formatMoney(order.amount, locale) }} |
+
+
+ {{ statusLabel(order.status) }}
+
+ |
+ {{ new Date(order.createdAt).toLocaleString() }} |
+
+
+
+ |
+ {{ t('recharge.no_orders') }}
+ |
+
+
+
+
+
+
+
+
diff --git a/apps/player/src/views/desktop/DesktopRechargeView.vue b/apps/player/src/views/desktop/DesktopRechargeView.vue
new file mode 100644
index 0000000..ec0a8f4
--- /dev/null
+++ b/apps/player/src/views/desktop/DesktopRechargeView.vue
@@ -0,0 +1,912 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ t('recharge.success_title') || '充值申请已提交' }}
+
+
+ {{ t('recharge.order_no') || '订单号' }}
+ {{ orderNo }}
+
+
+ {{ t('recharge.amount') || '充值金额' }}
+ ¥ {{ parseFloat(amount).toFixed(2) }}
+
+
+
{{ t('recharge.success_hint') || '您的充值申请已提交,客服将尽快为您处理。' }}
+
+ {{ t('recharge.history_title') }}
+
+
+
+
+
+
+
+ {{ t('recharge.bank_transfer') || '银行转账' }}
+
+
+ USDT
+
+
+
+
+
+
+
{{ t('recharge.choose_method') || '选择收款账户' }}
+
+ {{ t('recharge.no_methods') || '暂无可用收款账户' }}
+
+
+
+ {{ m.accountNumber || m.usdtAddress || '' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/player/src/views/desktop/DesktopRegisterView.vue b/apps/player/src/views/desktop/DesktopRegisterView.vue
new file mode 100644
index 0000000..883d6e2
--- /dev/null
+++ b/apps/player/src/views/desktop/DesktopRegisterView.vue
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
diff --git a/apps/player/src/views/desktop/DesktopWalletDetailView.vue b/apps/player/src/views/desktop/DesktopWalletDetailView.vue
new file mode 100644
index 0000000..e3ca6cb
--- /dev/null
+++ b/apps/player/src/views/desktop/DesktopWalletDetailView.vue
@@ -0,0 +1,192 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ | {{ t('wallet.type') || '类型' }} |
+ {{ t('wallet.note') || '备注' }} |
+ {{ t('wallet.amount') || '金额' }} |
+ {{ t('wallet.time') || '时间' }} |
+ |
+
+
+
+
+ | {{ txLabel(tx) }} |
+ {{ txSummaryLabel(tx, t) || '-' }} |
+ {{ formatMoney(tx.amount, locale) }} |
+ {{ new Date(tx.createdAt).toLocaleString() }} |
+ › |
+
+
+
+
+
+
+
+ {{ t('common.load_more') || '加载更多' }}
+
+
+
{{ t('common.no_more') }}
+
+
+ {{ t('wallet.no_records') }}
+
+
+
+
+
+
+
diff --git a/apps/player/src/views/desktop/DesktopWalletTransactionDetailView.vue b/apps/player/src/views/desktop/DesktopWalletTransactionDetailView.vue
new file mode 100644
index 0000000..1dcaab4
--- /dev/null
+++ b/apps/player/src/views/desktop/DesktopWalletTransactionDetailView.vue
@@ -0,0 +1,201 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ t('common.load_failed') }}
+
{{ t('common.retry') }}
+
+
+
+
+ {{ formatMoney(detail.amount, locale) }}
+
+
{{ txLabel(detail) }}
+
+
+
+ {{ t('wallet.type') || '类型' }}
+ {{ txLabel(detail) }}
+
+
+ {{ t('wallet.note') || '备注' }}
+ {{ txSummaryLabel(detail, t) || '-' }}
+
+
+ {{ t('wallet.balance_before') || '变动前余额' }}
+ {{ formatMoney(detail.balanceBefore, locale) }}
+
+
+ {{ t('wallet.balance_after') || '变动后余额' }}
+ {{ formatMoney(detail.balanceAfter, locale) }}
+
+
+ {{ t('wallet.frozen_before') || '冻结前' }}
+ {{ formatMoney(detail.frozenBefore, locale) }}
+
+
+ {{ t('wallet.frozen_after') || '冻结后' }}
+ {{ formatMoney(detail.frozenAfter, locale) }}
+
+
+ {{ t('wallet.time') || '时间' }}
+ {{ new Date(detail.createdAt).toLocaleString() }}
+
+
+ {{ t('wallet.transaction_id') || '流水号' }}
+ {{ detail.transactionId }}
+
+
+
+
+
{{ t('common.not_found') || '未找到记录' }}
+
+
+
+
+
+
diff --git a/apps/player/src/views/desktop/DesktopWalletView.vue b/apps/player/src/views/desktop/DesktopWalletView.vue
new file mode 100644
index 0000000..cd1ee4a
--- /dev/null
+++ b/apps/player/src/views/desktop/DesktopWalletView.vue
@@ -0,0 +1,154 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ | {{ t('wallet.type') || '类型' }} |
+ {{ t('wallet.note') || '备注' }} |
+ {{ t('wallet.amount') || '金额' }} |
+ {{ t('wallet.time') || '时间' }} |
+
+
+
+
+ | {{ txLabel(tx) }} |
+ {{ txSubtitle(tx) || '-' }} |
+ {{ formatMoney(tx.amount, locale) }} |
+ {{ new Date(tx.createdAt).toLocaleString() }} |
+
+
+
+
+
+
+
+
+
+ {{ t('wallet.no_records') }}
+
+
+
+
+
+
diff --git a/docs/四套主题Docker部署任务.md b/docs/四套主题Docker部署任务.md
index 29bc27b..7191850 100644
--- a/docs/四套主题Docker部署任务.md
+++ b/docs/四套主题Docker部署任务.md
@@ -1,7 +1,7 @@
# 四套主题 Docker 生产部署任务
> **目标**:在同一台服务器、**同一套 Docker Compose 栈**内,同时运行 4 套玩家端主题(4 个 player 容器 + 1 套共用 api/admin/db)。
-> **适用分支**:`main`(暗金)、`theme-2`(Pinnacle 蓝白)、`theme-3`(统一移动端视觉)、`theme-4`(海军蓝暗色极简)。
+> **适用分支**:`main`(暗金)、`theme-2`(Pinnacle 蓝白)、`theme-3`(Dusk Coral 移动 + PC双端)、`theme-4`(海军蓝暗色极简)。
> **关联文档**:[Docker部署指南.md](./Docker部署指南.md)、[docker/镜像构建与导出.md](./docker/镜像构建与导出.md)、[AGENTS.md](../AGENTS.md)「主题分支」章节。
---
@@ -475,7 +475,7 @@ location / {
"themes": [
{ "id": "main", "label": "暗金主站", "baseUrl": "https://www.example.com", "enabled": true, "isDefault": true },
{ "id": "theme-2", "label": "Pinnacle 蓝白", "baseUrl": "https://theme2.example.com", "enabled": true, "isDefault": false },
- { "id": "theme-3", "label": "统一移动端", "baseUrl": "https://theme3.example.com", "enabled": true, "isDefault": false },
+ { "id": "theme-3", "label": "Dusk Coral 移动 + PC双端", "baseUrl": "https://theme3.example.com", "enabled": true, "isDefault": false },
{ "id": "theme-4", "label": "海军蓝极简", "baseUrl": "https://theme4.example.com", "enabled": true, "isDefault": false }
]
}