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,66 @@
<script setup lang="ts">
defineProps<{
selections: {
id: string;
selectionName: string;
odds: string;
}[];
isSelected: (id: string) => boolean;
}>();
const emit = defineEmits<{ pick: [id: string] }>();
</script>
<template>
<div class="panel">
<button
v-for="sel in selections"
:key="sel.id"
type="button"
class="odds-btn"
:class="{ selected: isSelected(sel.id) }"
@click="emit('pick', sel.id)"
>
<span class="label">{{ sel.selectionName }}</span>
<span class="odds">{{ sel.odds }}</span>
</button>
</div>
</template>
<style scoped>
.panel {
display: flex;
flex-wrap: wrap;
gap: 8px;
padding: 0 10px 12px;
}
.odds-btn {
min-width: calc(33.33% - 6px);
flex: 1 1 calc(33.33% - 6px);
max-width: calc(50% - 4px);
padding: 10px 8px;
border-radius: 6px;
background: #0d0d0d;
border: 1px solid #333;
text-align: center;
}
.odds-btn.selected {
border-color: var(--primary);
background: rgba(212, 175, 55, 0.12);
}
.label {
display: block;
font-size: 11px;
color: var(--text-muted);
margin-bottom: 4px;
}
.odds {
font-size: 15px;
font-weight: 800;
color: var(--primary-light);
}
</style>