formula project

This commit is contained in:
colden
2025-12-20 12:20:43 +08:00
commit 28e1507889
156 changed files with 7444 additions and 0 deletions

237
frontend/src/views/RacePage.vue Executable file
View File

@@ -0,0 +1,237 @@
<template>
<div class="racepage">
<div class="title" :style="{ backgroundImage: `url(${prixImage})` }">
<h1 style="text-align: center;">{{ race?.name }}</h1>
</div>
<div class="card-capacity">
<div v-for="(item, index) in involvedRace" :key="index" class="singlerace-card">
<div>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-milestone"></use>
</svg>|
{{ item }}
</div>
<div class="result" @click="goResult(getType(item))">results</div>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { ref, computed } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import { prix } from '@/assets/source'
const route = useRoute()
const router = useRouter()
const Races = ref([
{ id: 1, round: 1, name: '澳大利亚大奖赛', circuit: 'Albert Park', city: '墨尔本', date: '2025-03-09', season: 2025, has_sprint: false },
{ id: 4, round: 4, name: '巴林大奖赛', circuit: 'Jeddah Corniche', city: '吉达', date: '2025-03-23', season: 2025, has_sprint: false },
{ id: 3, round: 3, name: '日本大奖赛', circuit: '铃鹿赛道', city: '铃鹿', date: '2025-04-06', season: 2025, has_sprint: false },
{ id: 2, round: 2, name: '中国大奖赛', circuit: '上汽国际', city: '上海', date: '2025-04-20', season: 2025, has_sprint: true }
])
const raceId = Number(route.params.id)
const race = computed(() => Races.value.find(race => race.id === raceId))
const involvedRace = computed(() => race.value?.has_sprint ? ['Sprint Qualifying', 'Sprint Race', 'Qualifying', 'Race'] : ['Qualifying', 'Race'])
const prixImage = computed(() => prix.find(p => p.id === race.value?.id)?.image)
const getType = (type: string) => {
if (type === 'Sprint Qualifying') {
return 'sprint-qualifying'
} else if (type === 'Sprint Race') {
return 'sprint-race'
} else if (type === 'Qualifying') {
return 'qualifying'
} else if (type === 'Race') {
return 'race'
} else {
return type.toLowerCase()
}
}
const goResult = (type: string) => {
router.push(`${route.path}/${type}`)
}
</script>
<style lang="scss" scoped>
.racepage {
background-color: #f7f4f1;
height: 100%;
}
.title {
height: 400px;
width: 100%;
background-size: cover;
background-position: center;
color: white;
display: flex;
align-items: end;
justify-content: center;
}
.title h1 {
background-color: rgba(0, 0, 0, 0.2);
padding: 5px;
box-shadow: 3px 3px black;
}
.card-capacity {
width: 90%;
margin: 0 auto;
margin-top: 20px;
font-size: 25px;
color: white;
font-weight: bolder;
padding-bottom: 20px;
}
.singlerace-card {
width: 75%;
margin: 0 auto;
margin-top: 20px;
padding: 10px;
min-height: 200px;
display: grid;
grid-template-columns: 1fr 1fr;
/* 金色渐变 - 豪华黄金色系 */
background: linear-gradient(145deg,
#B8860B 0%,
/* 深金色 - 暗部 */
#DAA520 25%,
/* 黄金色 */
#FFD700 50%,
/* 亮金色 - 高光 */
#DAA520 75%,
/* 黄金色 */
#B8860B 100%
/* 深金色 - 暗部 */
);
/* 金属氧化纹理和光泽 */
background-image:
/* 金色高光区域 */
radial-gradient(ellipse at 70% 20%, rgba(255, 215, 0, 0.7) 10%, transparent 30%),
/* 暗部阴影区域 */
radial-gradient(ellipse at 30% 80%, rgba(184, 134, 11, 0.6) 10%, transparent 30%),
/* 金属条纹纹理 */
linear-gradient(90deg,
transparent 0%,
rgba(184, 134, 11, 0.8) 25%,
rgba(255, 215, 0, 0.6) 50%,
rgba(184, 134, 11, 0.8) 75%,
transparent 100%);
border-radius: 10px;
position: relative;
overflow: hidden;
}
/* 添加金属拉丝纹理 */
.singlerace-card::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-image:
/* 横向拉丝纹理 */
repeating-linear-gradient(0deg,
rgba(255, 255, 255, 0.1) 0px,
rgba(255, 255, 255, 0.1) 1px,
transparent 1px,
transparent 3px),
/* 纵向拉丝纹理 */
repeating-linear-gradient(90deg,
rgba(0, 0, 0, 0.1) 0px,
rgba(0, 0, 0, 0.1) 1px,
transparent 1px,
transparent 4px);
pointer-events: none;
mix-blend-mode: overlay;
opacity: 0.5;
}
/* 添加动态光泽效果 */
.singlerace-card::after {
content: '';
position: absolute;
top: -100%;
left: -100%;
width: 300%;
height: 300%;
background: linear-gradient(45deg,
transparent 40%,
rgba(255, 255, 255, 0.1) 45%,
rgba(255, 255, 255, 0.3) 50%,
rgba(255, 255, 255, 0.1) 55%,
transparent 60%);
transform: rotate(30deg);
animation: gold-shine 6s infinite linear;
pointer-events: none;
}
@keyframes gold-shine {
0% {
transform: rotate(30deg) translateX(-100%) translateY(-100%);
}
100% {
transform: rotate(30deg) translateX(100%) translateY(100%);
}
}
/* 添加宝石点缀效果(可选) */
.singlerace-card .gem-effect {
position: absolute;
top: 10px;
right: 10px;
width: 15px;
height: 15px;
background: radial-gradient(circle at 30% 30%,
#FFD700,
#FFA500,
#FF8C00);
border-radius: 50%;
box-shadow:
0 0 10px #FFD700,
0 0 20px #FFA500;
animation: gem-sparkle 2s infinite alternate;
}
@keyframes gem-sparkle {
0% {
opacity: 0.6;
transform: scale(1);
}
100% {
opacity: 1;
transform: scale(1.1);
box-shadow:
0 0 15px #FFD700,
0 0 25px #FFA500,
0 0 35px #FF8C00;
}
}
.singlerace-card>div {
text-align: center;
vertical-align: center;
margin: auto;
}
.icon {
width: 1em;
height: 1em;
vertical-align: -0.15em;
fill: currentColor;
overflow: hidden;
}
.result:hover {
cursor: pointer;
text-decoration: underline;
}
</style>