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

@@ -0,0 +1,41 @@
import type { BannerItem } from '../components/BannerCarousel.vue';
/** 默认轮播首图apps/player/src/assets/images/banner.png */
import defaultBannerImg from '../assets/images/banner.png';
const FALLBACK_BANNER_URL = '/uploads/banners/welcome.svg';
export const DEFAULT_BANNER: BannerItem = {
id: 'default',
linkType: 'ROUTE',
linkTarget: '/bet',
translation: {
title: '',
imageUrl: defaultBannerImg,
},
};
function pickImageUrl(url?: string | null): string {
if (!url) return defaultBannerImg;
return url;
}
export function resolveBanners(banners: BannerItem[] | undefined | null): BannerItem[] {
const fromApi = (banners ?? []).map((banner) => ({
...banner,
translation: {
...banner.translation,
imageUrl: pickImageUrl(banner.translation?.imageUrl),
},
}));
const defaultSlide: BannerItem = {
...DEFAULT_BANNER,
translation: {
...DEFAULT_BANNER.translation,
imageUrl: defaultBannerImg || FALLBACK_BANNER_URL,
},
};
return [defaultSlide, ...fromApi];
}