feat(admin): 管理端列表分页、控制台图表与赛事导入

- 玩家/代理/赛事/注单/审计列表分页,默认每页 10 条,无页面滚动条布局

- ECharts 控制台概览、注单管理中文化与列宽优化

- zhibo 赛事字段迁移与导入,玩家编辑可改所属代理

- 管理端 API 分页与 dashboard 统计接口

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-03 13:49:31 +08:00
parent 2c356b2048
commit 80adc0e928
45 changed files with 6564 additions and 499 deletions

View File

@@ -0,0 +1,78 @@
/** 后台手动新增赛事(投注平台最小字段) */
export interface MatchCreateForm {
leagueEn: string;
leagueZh: string;
startTime: string;
homeTeamZh: string;
homeTeamEn: string;
awayTeamZh: string;
awayTeamEn: string;
isHot: boolean;
}
export function emptyMatchForm(): MatchCreateForm {
return {
leagueEn: 'FIFA World Cup 2026',
leagueZh: '2026 世界杯',
startTime: '',
homeTeamZh: '',
homeTeamEn: '',
awayTeamZh: '',
awayTeamEn: '',
isHot: false,
};
}
export type AdminMatchDetail = {
id: string;
status: string;
isOutright: boolean;
isHot: boolean;
startTime: string;
leagueEn: string;
leagueZh: string;
homeTeamEn: string;
homeTeamZh: string;
awayTeamEn: string;
awayTeamZh: string;
matchName: string;
};
export function formFromDetail(d: AdminMatchDetail): MatchCreateForm {
return {
leagueEn: d.leagueEn,
leagueZh: d.leagueZh,
startTime: d.startTime,
homeTeamZh: d.homeTeamZh,
homeTeamEn: d.homeTeamEn,
awayTeamZh: d.awayTeamZh,
awayTeamEn: d.awayTeamEn,
isHot: d.isHot,
};
}
export function buildPlatformPayload(form: MatchCreateForm) {
if (!form.startTime.trim()) {
throw new Error('请填写开赛时间');
}
const homeOk = form.homeTeamZh.trim() || form.homeTeamEn.trim();
const awayOk = form.awayTeamZh.trim() || form.awayTeamEn.trim();
if (!homeOk || !awayOk) {
throw new Error('请填写主客队名称(中文或英文至少一项)');
}
if (!form.leagueZh.trim() && !form.leagueEn.trim()) {
throw new Error('请填写联赛名称');
}
return {
leagueEn: form.leagueEn.trim(),
leagueZh: form.leagueZh.trim(),
homeTeamEn: form.homeTeamEn.trim(),
homeTeamZh: form.homeTeamZh.trim(),
awayTeamEn: form.awayTeamEn.trim(),
awayTeamZh: form.awayTeamZh.trim(),
startTime: form.startTime.trim(),
isHot: form.isHot,
};
}