feat(player): 完善 H5 投注端与 API 演示数据

- 球赛/串关/优胜冠军、赛事详情、历史投注与个人资料编辑
- 固定顶栏、公告与底栏,仅内容区滚动
- 底部导航与站点 favicon 使用 logo,登录页精简
- API 种子、冠军盘与历史注单增强

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-02 17:18:11 +08:00
parent 7af2e418c3
commit b5dca1bfb1
75 changed files with 7077 additions and 384 deletions

View File

@@ -2,7 +2,7 @@ import { createApp } from 'vue';
import { createPinia } from 'pinia';
import { createI18n } from 'vue-i18n';
import App from './App.vue';
import router from './router';
import router from './router/index.ts';
import './styles.css';
const i18n = createI18n({
@@ -11,22 +11,331 @@ const i18n = createI18n({
fallbackLocale: 'en-US',
messages: {
'zh-CN': {
nav: { home: '页', football: '足球', my_bets: '我的投注', profile: '我的' },
auth: { login: '登录', username: '账号', password: '密码' },
wallet: { balance: '余额' },
bet: { bet_slip: '投注单', stake: '投注金额', place_bet: '确认下注', parlay: '串关' },
nav: { home: '页', bet: '投注', bet_history: '历史投注', wallet: '账单', profile: '我的' },
history: {
league_default: '足球',
stake: '投注 Stake',
return: '回报 Return',
est_return: '预计回报 Est. Return',
parlay_title: '串关 · {n} 场',
parlay_league: '串关 Parlay',
empty: '暂无投注记录',
status_won: 'WON 赢',
status_pending: 'PENDING 待定',
status_lost: 'LOST 输',
status_push: 'PUSH 走盘',
},
auth: {
login: '登录',
logout: '退出登录',
username: '账号',
password: '密码',
captcha_placeholder: 'Captcha',
captcha_refresh: '点击换一张',
captcha_wrong: '验证码错误',
},
wallet: {
balance: '余额',
cash_balance: '现金余额',
unsettled: '未结算',
available: '可用',
no_records: '暂无账单记录',
},
bet: {
bet_slip: '投注单',
stake: '投注金额',
place_bet: '确认下注',
place_bet_short: '下注',
parlay: '串关',
tab_matches: '球赛',
tab_outright: '优胜冠军',
tab_parlay: '串关投注',
tab_today: '今日',
tab_early: '早盘',
loading: '加载中…',
no_matches: '暂无赛事',
outright_coming: '优胜冠军玩法即将上线',
outright_enter_stake: '请输入投注金额',
outright_balance: '结余',
outright_stake_amount: '投注额度',
outright_success: '下注成功',
outright_done: '完毕',
outright_bet_failed: '下注失败',
no_outright: '暂无冠军盘口',
cancel: '取消',
parlay_title: '串关投注',
parlay_desc: '选择3-10场比赛来创建串关投注。组合赔率相乘可赢得更多',
parlay_filter_all: '全部',
parlay_empty: '暂无可用串关赛事',
parlay_same_match: '同一场比赛不能串关',
parlay_need_more: '请至少选择 2 项进行串关',
back: '返回',
refresh: '刷新',
download: '下载',
reward_active: '奖励生效中!',
market_closed: '暂未开盘',
expand_market: '展开玩法',
collapse_market: '收起玩法',
market_cs: '波胆',
market_ht_cs: '上半场波胆',
market_sh_cs: '下半场波胆',
market_ft_handicap: '全场 让球',
market_ft_ou: '全场 大小',
market_ft_1x2: '全场 独赢盘',
market_ft_oe: '全场 单/双',
market_ht_handicap: '半场 让球',
market_ht_ou: '半场 大小',
market_ht_1x2: '半场 独赢盘',
col_home: '主场',
col_draw: '平',
col_away: '客场',
cs_stake_required: '请至少在一个比分输入投注金额',
cs_place_success: '下注成功',
cs_place_failed: '下注失败',
},
profile: {
edit: '修改资料',
language: '语言',
phone: '手机号',
email: '邮箱',
phone_placeholder: '请输入手机号',
email_placeholder: '请输入邮箱',
save: '保存',
password_optional_hint: '不修改密码可留空',
old_password_placeholder: '留空则不修改',
new_password_placeholder: '留空则不修改',
confirm_password_placeholder: '留空则不修改',
old_password: '当前密码',
new_password: '新密码',
confirm_password: '确认新密码',
back: '返回',
saved: '联系方式已保存',
save_failed: '保存失败',
password_changed: '密码已更新',
password_failed: '密码修改失败',
password_mismatch: '两次新密码不一致',
password_incomplete: '修改密码需填写当前密码、新密码及确认密码',
},
},
'en-US': {
nav: { home: 'Home', football: 'Football', my_bets: 'My Bets', profile: 'Profile' },
auth: { login: 'Login', username: 'Username', password: 'Password' },
wallet: { balance: 'Balance' },
bet: { bet_slip: 'Bet Slip', stake: 'Stake', place_bet: 'Place Bet', parlay: 'Parlay' },
nav: { home: 'Home', bet: 'Bet', bet_history: 'History', wallet: 'Wallet', profile: 'Profile' },
history: {
league_default: 'Football',
stake: 'Stake 投注',
return: 'Return 回报',
est_return: 'Est. Return 预计回报',
parlay_title: 'Parlay · {n} legs',
parlay_league: 'Parlay 串关',
empty: 'No bets yet',
status_won: 'WON 赢',
status_pending: 'PENDING 待定',
status_lost: 'LOST 输',
status_push: 'PUSH 走盘',
},
auth: {
login: 'Login',
logout: 'Log out',
username: 'Username',
password: 'Password',
captcha_placeholder: 'Captcha',
captcha_refresh: 'Click to refresh',
captcha_wrong: 'Invalid captcha',
},
wallet: {
balance: 'Balance',
cash_balance: 'Cash Balance',
unsettled: 'Unsettled',
available: 'Available',
no_records: 'No records',
},
bet: {
bet_slip: 'Bet Slip',
stake: 'Stake',
place_bet: 'Place Bet',
place_bet_short: 'Bet',
parlay: 'Parlay',
tab_matches: 'Matches',
tab_outright: 'Outright',
tab_parlay: 'Parlay',
tab_today: 'Today',
tab_early: 'Early',
loading: 'Loading…',
no_matches: 'No matches',
outright_coming: 'Outright markets coming soon',
outright_enter_stake: 'Enter stake',
outright_balance: 'Balance',
outright_stake_amount: 'Stake',
outright_success: 'Bet placed',
outright_done: 'Done',
outright_bet_failed: 'Bet failed',
no_outright: 'No outright markets',
cancel: 'Cancel',
parlay_title: 'Parlay',
parlay_desc: 'Pick 3-10 matches. Combined odds multiply your potential win!',
parlay_filter_all: 'All',
parlay_empty: 'No matches available for parlay betting',
parlay_same_match: 'Cannot parlay selections from the same match',
parlay_need_more: 'Select at least 2 legs for parlay',
back: 'Back',
refresh: 'Refresh',
download: 'Download',
reward_active: 'Reward active!',
market_closed: 'Not open',
expand_market: 'Expand',
collapse_market: 'Collapse',
market_cs: 'Correct Score',
market_ht_cs: '1H Correct Score',
market_sh_cs: '2H Correct Score',
market_ft_handicap: 'FT Handicap',
market_ft_ou: 'FT O/U',
market_ft_1x2: 'FT 1X2',
market_ft_oe: 'FT Odd/Even',
market_ht_handicap: 'HT Handicap',
market_ht_ou: 'HT O/U',
market_ht_1x2: 'HT 1X2',
col_home: 'Home',
col_draw: 'Draw',
col_away: 'Away',
cs_stake_required: 'Enter stake on at least one score',
cs_place_success: 'Bet placed',
cs_place_failed: 'Bet failed',
},
profile: {
edit: 'Edit Profile',
language: 'Language',
phone: 'Phone',
email: 'Email',
phone_placeholder: 'Phone number',
email_placeholder: 'Email address',
save: 'Save',
password_optional_hint: 'Leave password fields blank to keep current password',
old_password_placeholder: 'Leave blank to skip',
new_password_placeholder: 'Leave blank to skip',
confirm_password_placeholder: 'Leave blank to skip',
old_password: 'Current password',
new_password: 'New password',
confirm_password: 'Confirm password',
back: 'Back',
saved: 'Contact saved',
save_failed: 'Save failed',
password_changed: 'Password updated',
password_failed: 'Password change failed',
password_mismatch: 'Passwords do not match',
password_incomplete: 'Fill current, new and confirm password to change password',
},
},
'ms-MY': {
nav: { home: 'Laman Utama', football: 'Bola Sepak', my_bets: 'Pertaruhan Saya', profile: 'Profil' },
auth: { login: 'Log Masuk', username: 'Nama Pengguna', password: 'Kata Laluan' },
wallet: { balance: 'Baki' },
bet: { bet_slip: 'Slip Pertaruhan', stake: 'Jumlah', place_bet: 'Letak Pertaruhan', parlay: 'Berganda' },
nav: {
home: 'Laman Utama',
bet: 'Pertaruhan',
bet_history: 'Sejarah',
wallet: 'Bil',
profile: 'Profil',
},
history: {
league_default: 'Bola Sepak',
stake: 'Stake 投注',
return: 'Return 回报',
est_return: 'Est. Return 预计回报',
parlay_title: 'Parlay · {n} perlawanan',
parlay_league: 'Parlay 串关',
empty: 'Tiada rekod pertaruhan',
status_won: 'WON 赢',
status_pending: 'PENDING 待定',
status_lost: 'LOST 输',
status_push: 'PUSH 走盘',
},
auth: {
login: 'Log Masuk',
logout: 'Log Keluar',
username: 'Nama Pengguna',
password: 'Kata Laluan',
captcha_placeholder: 'Captcha',
captcha_refresh: 'Klik untuk muat semula',
captcha_wrong: 'Kod pengesahan salah',
},
wallet: {
balance: 'Baki',
cash_balance: 'Baki Tunai',
unsettled: 'Belum Selesai',
available: 'Tersedia',
no_records: 'Tiada rekod',
},
bet: {
bet_slip: 'Slip Pertaruhan',
stake: 'Jumlah',
place_bet: 'Letak Pertaruhan',
place_bet_short: 'Pertaruhan',
parlay: 'Berganda',
tab_matches: 'Perlawanan',
tab_outright: 'Juara',
tab_parlay: 'Berganda',
tab_today: 'Hari Ini',
tab_early: 'Awal',
loading: 'Memuatkan…',
no_matches: 'Tiada perlawanan',
outright_coming: 'Pasaran juara akan datang',
outright_enter_stake: 'Masukkan jumlah',
outright_balance: 'Baki',
outright_stake_amount: 'Jumlah pertaruhan',
outright_success: 'Pertaruhan berjaya',
outright_done: 'Selesai',
outright_bet_failed: 'Pertaruhan gagal',
no_outright: 'Tiada pasaran juara',
cancel: 'Batal',
parlay_title: 'Pertaruhan Berganda',
parlay_desc: 'Pilih 3-10 perlawanan. Gabungan odds didarab!',
parlay_filter_all: 'Semua',
parlay_empty: 'No matches available for parlay betting',
parlay_same_match: 'Perlawanan sama tidak boleh berganda',
parlay_need_more: 'Pilih sekurang-kurangnya 2 pilihan',
back: 'Kembali',
refresh: 'Muat semula',
download: 'Muat turun',
reward_active: 'Ganjaran aktif!',
market_closed: 'Belum dibuka',
expand_market: 'Kembang',
collapse_market: 'Tutup',
market_cs: 'Skor Tepat',
market_ht_cs: 'Skor Tepat PB1',
market_sh_cs: 'Skor Tepat PB2',
market_ft_handicap: 'Handicap Penuh',
market_ft_ou: 'Atas/Bawah Penuh',
market_ft_1x2: '1X2 Penuh',
market_ft_oe: 'Ganjil/Genap Penuh',
market_ht_handicap: 'Handicap Separuh',
market_ht_ou: 'Atas/Bawah Separuh',
market_ht_1x2: '1X2 Separuh',
col_home: 'Home',
col_draw: 'Seri',
col_away: 'Away',
cs_stake_required: 'Masukkan jumlah pada sekurang-kurangnya satu skor',
cs_place_success: 'Pertaruhan berjaya',
cs_place_failed: 'Pertaruhan gagal',
},
profile: {
edit: 'Edit Profil',
language: 'Bahasa',
phone: 'Telefon',
email: 'E-mel',
phone_placeholder: 'Nombor telefon',
email_placeholder: 'Alamat e-mel',
save: 'Simpan',
password_optional_hint: 'Biarkan kosong jika tidak mahu tukar kata laluan',
old_password_placeholder: 'Biarkan kosong untuk langkau',
new_password_placeholder: 'Biarkan kosong untuk langkau',
confirm_password_placeholder: 'Biarkan kosong untuk langkau',
old_password: 'Kata laluan semasa',
new_password: 'Kata laluan baharu',
confirm_password: 'Sahkan kata laluan',
back: 'Kembali',
saved: 'Hubungan disimpan',
save_failed: 'Gagal simpan',
password_changed: 'Kata laluan dikemas kini',
password_failed: 'Gagal tukar kata laluan',
password_mismatch: 'Kata laluan tidak sepadan',
password_incomplete: 'Isi kata laluan semasa, baharu dan pengesahan untuk menukar',
},
},
},
});