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,116 @@
<script setup lang="ts">
import MatchBetCard from './MatchBetCard.vue';
import saishiImg from '../assets/images/saishi.png';
defineProps<{
leagueId: string;
leagueName: string;
expanded: boolean;
matches: {
id: string;
homeTeamName: string;
awayTeamName: string;
homeTeamCode?: string;
awayTeamCode?: string;
startTime: string;
}[];
}>();
const emit = defineEmits<{ toggle: []; bet: [id: string] }>();
</script>
<template>
<section class="league-block">
<button type="button" class="league-row" :aria-expanded="expanded" @click="emit('toggle')">
<span class="toggle-icon" :class="{ open: expanded }" aria-hidden="true">
<span class="toggle-mark">{{ expanded ? '' : '+' }}</span>
</span>
<span class="league-title">*{{ leagueName }}</span>
<img :src="saishiImg" alt="" class="league-saishi" />
</button>
<div v-show="expanded" class="match-panel">
<div class="match-grid">
<MatchBetCard
v-for="match in matches"
:key="match.id"
:match="match"
@bet="emit('bet', $event)"
/>
</div>
</div>
</section>
</template>
<style scoped>
.league-block {
margin-bottom: 10px;
}
.league-row {
width: 100%;
display: flex;
align-items: center;
gap: 10px;
padding: 12px 12px;
background: #141414;
border: 1px solid #2e2e2e;
border-radius: 6px;
text-align: left;
cursor: pointer;
}
.league-row:active {
opacity: 0.92;
}
.toggle-icon {
flex-shrink: 0;
width: 26px;
height: 26px;
border-radius: 50%;
background: #141414;
border: 1px solid var(--border-gold-soft);
display: flex;
align-items: center;
justify-content: center;
}
.toggle-mark {
color: var(--primary-light);
font-size: 17px;
font-weight: 900;
line-height: 1;
margin-top: -1px;
}
.league-title {
flex: 1;
font-size: 13px;
font-weight: 800;
color: var(--primary-light);
line-height: 1.35;
min-width: 0;
}
.league-saishi {
flex-shrink: 0;
height: 44px;
width: auto;
max-width: 40px;
object-fit: contain;
margin-left: 4px;
padding-left: 10px;
border-left: 1px solid #2a2a2a;
}
.match-panel {
padding: 10px 0 4px;
}
.match-grid {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 6px;
}
</style>