feat(admin,player,api): 优胜冠军通用管理与界面精简
管理端新增冠军盘列表/编辑、展开懒加载与 ECharts 修复;各列表页去掉重复标题。玩家端支持多赛事冠军盘、分批加载与语言切换刷新。API 扩展 outright CRUD 与列表性能优化。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -33,7 +33,7 @@ const zh: Record<string, string> = {
|
||||
'nav.users': '玩家管理',
|
||||
'nav.agents': '代理管理',
|
||||
'nav.matches': '赛事管理',
|
||||
'nav.outright': '世界杯夺冠',
|
||||
'nav.outrights': '优胜冠军',
|
||||
'nav.bets': '注单管理',
|
||||
'nav.cashback': '返水管理',
|
||||
'nav.audit': '操作日志',
|
||||
@@ -51,6 +51,8 @@ const zh: Record<string, string> = {
|
||||
'common.search': '查询',
|
||||
'common.reset': '重置',
|
||||
'common.edit': '编辑',
|
||||
'common.yes': '是',
|
||||
'common.no': '否',
|
||||
'common.delete': '删除',
|
||||
'common.cancel': '取消',
|
||||
'common.confirm': '确定',
|
||||
@@ -182,7 +184,7 @@ const en: Record<string, string> = {
|
||||
'nav.users': 'Players',
|
||||
'nav.agents': 'Agents',
|
||||
'nav.matches': 'Matches',
|
||||
'nav.outright': 'WC Winner',
|
||||
'nav.outrights': 'Outrights',
|
||||
'nav.bets': 'Bets',
|
||||
'nav.cashback': 'Cashback',
|
||||
'nav.audit': 'Audit Log',
|
||||
@@ -200,6 +202,8 @@ const en: Record<string, string> = {
|
||||
'common.search': 'Search',
|
||||
'common.reset': 'Reset',
|
||||
'common.edit': 'Edit',
|
||||
'common.yes': 'Yes',
|
||||
'common.no': 'No',
|
||||
'common.delete': 'Delete',
|
||||
'common.cancel': 'Cancel',
|
||||
'common.confirm': 'OK',
|
||||
@@ -331,7 +335,7 @@ const ms: Record<string, string> = {
|
||||
'nav.users': 'Pemain',
|
||||
'nav.agents': 'Ejen',
|
||||
'nav.matches': 'Perlawanan',
|
||||
'nav.outright': 'Juara Piala Dunia',
|
||||
'nav.outrights': 'Juara',
|
||||
'nav.bets': 'Pertaruhan',
|
||||
'nav.cashback': 'Rebat',
|
||||
'nav.audit': 'Log audit',
|
||||
@@ -349,6 +353,8 @@ const ms: Record<string, string> = {
|
||||
'common.search': 'Cari',
|
||||
'common.reset': 'Set semula',
|
||||
'common.edit': 'Edit',
|
||||
'common.yes': 'Ya',
|
||||
'common.no': 'Tidak',
|
||||
'common.delete': 'Padam',
|
||||
'common.cancel': 'Batal',
|
||||
'common.confirm': 'OK',
|
||||
|
||||
@@ -249,8 +249,8 @@ export const adminPagesMs: Record<string, string> = {
|
||||
'msg.outright_odds_saved': 'Odds juara disimpan',
|
||||
'msg.load_failed': 'Gagal memuatkan',
|
||||
|
||||
'page.outright.title': 'Juara Piala Dunia 48',
|
||||
'page.outright.desc': '48 pasukan tetap; laraskan odds juara',
|
||||
'page.outrights.title': 'Juara',
|
||||
'page.outrights.desc': 'Cipta dan edit pasaran juara; Piala Dunia 2026 boleh import asas',
|
||||
'outright.col.rank': 'Kedudukan',
|
||||
'outright.col.team_zh': 'Pasukan (ZH)',
|
||||
'outright.col.team_en': 'Pasukan (EN)',
|
||||
|
||||
@@ -249,18 +249,51 @@ export const adminPagesZh: Record<string, string> = {
|
||||
'msg.outright_odds_saved': '夺冠赔率已保存',
|
||||
'msg.load_failed': '加载失败',
|
||||
|
||||
'page.outright.title': '世界杯 48 强夺冠',
|
||||
'page.outright.desc': '固定 48 支球队,可调整夺冠赔率(玩家端「优胜冠军」)',
|
||||
'page.outrights.title': '优胜冠军',
|
||||
'page.outrights.desc': '可新建任意联赛冠军盘、编辑队伍与赔率;世界杯 48 强提供一键导入基准数据',
|
||||
'outright.col.rank': '排名',
|
||||
'outright.col.team_zh': '队伍(中文)',
|
||||
'outright.col.team_en': '队伍(英文)',
|
||||
'outright.col.code': '代码',
|
||||
'outright.col.odds': '夺冠赔率',
|
||||
'outright.btn.save_odds': '保存全部赔率',
|
||||
'outright.btn.apply_canonical': '应用表格基准数据',
|
||||
'outright.btn.save_meta': '保存赛事信息',
|
||||
'outright.btn.publish': '发布',
|
||||
'outright.btn.unpublish': '撤回发布',
|
||||
'outright.back_list': '返回列表',
|
||||
'outright.section.edit': '编辑冠军赛事',
|
||||
'outright.col.teams': '队伍数',
|
||||
'outright.col.player_visible': '玩家端',
|
||||
'outright.col.league_en': '联赛(英文)',
|
||||
'outright.expand_no_teams': '暂无队伍,请进入编辑页添加',
|
||||
'outright.btn.add_team': '添加队伍',
|
||||
'outright.btn.create_event': '新建冠军赛事',
|
||||
'outright.btn.import_wc2026': '导入世界杯 48 强',
|
||||
'outright.btn.apply_canonical': '应用世界杯基准表',
|
||||
'outright.field.league': '所属联赛',
|
||||
'outright.section.settings': '赛事设置',
|
||||
'outright.section.teams': '队伍与赔率',
|
||||
'outright.field.title': '赛事标题',
|
||||
'outright.field.title_placeholder': '玩家端展示的冠军赛事名称',
|
||||
'outright.field.title_zh': '标题(中文)',
|
||||
'outright.field.title_en': '标题(英文)',
|
||||
'outright.field.status': '发布状态',
|
||||
'outright.status.draft': '草稿',
|
||||
'outright.status.published': '已发布',
|
||||
'msg.outright_canonical_applied': '已按基准表写入 48 强夺冠赔率',
|
||||
'outright.team_count': '已配置 {n} / {total} 队',
|
||||
'outright.team_count_open': '共 {n} 支队伍',
|
||||
'outright.empty_events': '暂无冠军赛事',
|
||||
'outright.empty_hint': '点击「新建冠军赛事」或「导入世界杯 48 强」开始配置',
|
||||
'outright.err_odds_min': '赔率须大于 1.00',
|
||||
'outright.err_team_code': '请填写队伍代码',
|
||||
'outright.err_league': '请选择联赛',
|
||||
'outright.confirm_remove': '确定移除「{name}」?(关闭该投注项)',
|
||||
'outright.not_on_player': '玩家端不可见',
|
||||
'outright.player_hidden_title': '此赛事尚未在玩家端展示',
|
||||
'outright.hidden_reason.NOT_PUBLISHED': '请将发布状态设为「已发布」并保存赛事信息。',
|
||||
'outright.hidden_reason.NO_SELECTIONS': '请至少添加 1 支开放状态的队伍。',
|
||||
'outright.hidden_reason.MARKET_CLOSED': '冠军盘口未开放,请联系技术检查盘口状态。',
|
||||
'msg.load_matches_failed': '加载赛事失败',
|
||||
'msg.cashback_issued': '返水已发放',
|
||||
'msg.freeze_confirm_title': '{action}账号',
|
||||
@@ -520,18 +553,51 @@ export const adminPagesEn: Record<string, string> = {
|
||||
'msg.outright_odds_saved': 'Outright odds saved',
|
||||
'msg.load_failed': 'Load failed',
|
||||
|
||||
'page.outright.title': 'World Cup 48 — Winner',
|
||||
'page.outright.desc': 'Fixed 48 teams; adjust winner odds (player Outright tab)',
|
||||
'page.outrights.title': 'Outrights',
|
||||
'page.outrights.desc': 'Create and edit any winner market; WC 2026 has one-click baseline import',
|
||||
'outright.col.rank': 'Rank',
|
||||
'outright.col.team_zh': 'Team (ZH)',
|
||||
'outright.col.team_en': 'Team (EN)',
|
||||
'outright.col.code': 'Code',
|
||||
'outright.col.odds': 'Winner odds',
|
||||
'outright.btn.save_odds': 'Save all odds',
|
||||
'outright.btn.apply_canonical': 'Apply baseline table',
|
||||
'outright.btn.save_meta': 'Save event info',
|
||||
'outright.btn.publish': 'Publish',
|
||||
'outright.btn.unpublish': 'Unpublish',
|
||||
'outright.back_list': 'Back to list',
|
||||
'outright.section.edit': 'Edit outright',
|
||||
'outright.col.teams': 'Teams',
|
||||
'outright.col.player_visible': 'Player',
|
||||
'outright.col.league_en': 'League (EN)',
|
||||
'outright.expand_no_teams': 'No teams — open Edit to add',
|
||||
'outright.btn.add_team': 'Add team',
|
||||
'outright.btn.create_event': 'New outright event',
|
||||
'outright.btn.import_wc2026': 'Import WC 2026 (48)',
|
||||
'outright.btn.apply_canonical': 'Apply WC baseline',
|
||||
'outright.field.league': 'League',
|
||||
'outright.section.settings': 'Event settings',
|
||||
'outright.section.teams': 'Teams & odds',
|
||||
'outright.field.title': 'Event title',
|
||||
'outright.field.title_placeholder': 'Title shown on player outright tab',
|
||||
'outright.field.title_zh': 'Title (ZH)',
|
||||
'outright.field.title_en': 'Title (EN)',
|
||||
'outright.field.status': 'Status',
|
||||
'outright.status.draft': 'Draft',
|
||||
'outright.status.published': 'Published',
|
||||
'msg.outright_canonical_applied': '48-team winner odds applied from baseline',
|
||||
'outright.team_count': '{n} / {total} teams',
|
||||
'outright.team_count_open': '{n} teams',
|
||||
'outright.empty_events': 'No outright events',
|
||||
'outright.empty_hint': 'Create an event or import WC 2026 baseline',
|
||||
'outright.err_odds_min': 'Odds must be greater than 1.00',
|
||||
'outright.err_team_code': 'Team code required',
|
||||
'outright.err_league': 'Select a league',
|
||||
'outright.confirm_remove': 'Remove "{name}"? (closes selection)',
|
||||
'outright.not_on_player': 'Hidden on player',
|
||||
'outright.player_hidden_title': 'Not visible on player app yet',
|
||||
'outright.hidden_reason.NOT_PUBLISHED': 'Set status to Published and save event info.',
|
||||
'outright.hidden_reason.NO_SELECTIONS': 'Add at least one open team selection.',
|
||||
'outright.hidden_reason.MARKET_CLOSED': 'Winner market is not open.',
|
||||
'msg.load_matches_failed': 'Failed to load matches',
|
||||
'msg.cashback_issued': 'Cashback issued',
|
||||
'msg.freeze_confirm_title': '{action} account',
|
||||
|
||||
Reference in New Issue
Block a user