yunsan-pc/src/views/driving/components/Driving8.vue

253 lines
7.5 KiB
Vue

<template>
<section class="driving-8">
<header class="toolbar"><span>对比日期:</span><select v-model="state.date">
<option>{{ state.date }}</option>
</select><select v-model="state.period">
<option>{{ state.period }}</option>
</select></header>
<div class="summary">
<div class="row"><b>最大满载区间</b><span>{{ state.maxSection }} <i>{{ state.loadRate }}%</i></span></div>
<div class="row"><b>运行图图号</b><span>实际 <i>{{ state.actualTrips }}</i><em>|</em> 计划 <strong>{{
state.planTrips }}</strong></span></div>
<div class="row"><b>备车情况</b><span>{{ state.spare }}</span></div>
<div class="row"><b>行车间隔</b><span>高峰: <span style="margin-right: 20px;">{{ state.peakInterval }}min
</span>平峰: <span>{{
state.offPeakInterval }}min</span></span></div>
</div>
<div class="route">
<div class="route-line">
<label>西岑</label>
<span class="station mid">淀山湖大道</span>
<span class="station end">虹桥火车站</span>
<small class="time t1">6分钟</small>
<small class="time t2">3分钟</small>
</div>
<div class="flow f1">{{ state.flowLeft }}/小时</div>
<div class="flow f2">{{ state.flowRight }}/小时</div>
</div>
</section>
</template>
<script setup>
import { reactive } from 'vue'
const state = reactive({ date: '20251113', period: '早高峰时段', maxSection: '虹桥火车站-国家会展中心', loadRate: 110, actualTrips: 23, planTrips: 24, spare: '东方绿洲/淀山湖', peakInterval: 2.5, offPeakInterval: 4, flowLeft: 225600, flowRight: 225600 })
</script>
<style lang="scss" scoped>
$panel-bg: rgba(4, 124, 235, 0.1);
$panel-radius: 6px;
$route-color: #00e9ed;
$tag-bg: rgba(34, 71, 122, 0.92);
$tag-border: #8d7c4e;
@mixin flex($align: center, $justify: flex-start, $direction: row) {
display: flex;
flex-direction: $direction;
align-items: $align;
justify-content: $justify;
}
@mixin glass-panel {
background: $panel-bg;
backdrop-filter: blur(10px);
border-radius: $panel-radius;
}
@mixin route-tag($top) {
position: absolute;
top: $top;
z-index: 2;
padding: 4px 16px;
color: inherit;
white-space: nowrap;
background: linear-gradient(130deg, #f5ff3442 2%, #ffb23e31 36%, #ff932e27 116%);
border: 1px solid;
border-image: linear-gradient(90deg, #ffd343b3 -3%, #ffc85b 51%, #ffcd43b3 102%) 1;
border-radius: 3px;
}
@mixin time-tag($top) {
position: absolute;
top: $top;
z-index: 2;
padding: 4px 16px;
color: inherit;
white-space: nowrap;
background: linear-gradient(122deg, #28426a 4%, #0d4061 108%);
border: 1px solid;
border-image: linear-gradient(90deg, #43aaffb3 -3%, #5bb5ff 51%, #43aaffb3 102%) 1;
border-radius: 3px;
}
.driving-8 {
@include flex(stretch, flex-start, column);
position: absolute;
top: 860.63px;
left: 3856.58px;
width: 920.56px;
height: 726.37px;
padding: 8px 32px 0;
color: #FFFFFF;
font: 22px;
background: url('/imgs/driving/8-bg.png') no-repeat center / cover;
.toolbar {
@include flex(center, flex-end);
height: 33px;
margin-top: 70px;
gap: 12px;
color: #dcecff;
font-size: 16px;
select {
height: 26px;
padding: 0 24px 0 10px;
appearance: none;
color: #e4f2ff;
font-size: 17px;
background-color: #2166a8;
background-image: linear-gradient(45deg, transparent 50%, #b8d9f7 50%),
linear-gradient(135deg, #b8d9f7 50%, transparent 50%);
background-repeat: no-repeat;
background-position: calc(100% - 13px) 10px, calc(100% - 8px) 10px;
background-size: 5px 5px;
border: 1px solid #4b9ee5;
border-radius: 2px;
}
}
.summary {
@include glass-panel;
@include flex(stretch, space-evenly, column);
height: 280px;
padding: 0 18px;
.row {
@include flex(center, space-between);
height: 53px;
padding: 0 18px;
margin-bottom: 1px;
background: linear-gradient(90deg, #0085ff00 0%, #00a3ff48 40%, #00a2ff48 70%, #0075ff0a 100%);
b {
font-size: 22px;
font-weight: 500;
letter-spacing: 0;
}
span {
// font-weight: 600;
font-size: 22px;
}
i,
strong {
padding: 3px 10px;
margin-left: 10px;
color: white;
font-style: normal;
background: #D72929;
border-radius: 4px;
font-weight: 500;
}
strong {
background: #008CFF;
font-weight: 500;
}
em {
margin: 0 10px;
color: #d6e6fa;
font-style: normal;
}
}
}
.route {
@include glass-panel;
position: relative;
height: 290px;
margin-top: 24px;
.route-line {
position: absolute;
top: 30px;
left: 44px;
width: 760px;
height: 187px;
border: 3px solid $route-color;
border-radius: 100px;
&::after {
position: absolute;
top: 45px;
left: 238px;
width: 512px;
height: 85px;
content: '';
border: 3px solid $route-color;
border-radius: inherit;
}
label {
@include route-tag(73px);
left: 40px;
}
.station {
@include route-tag(73px);
&.mid,
&.end {
width: 125px;
text-align: center;
}
&.mid {
left: 270px;
}
&.end {
right: 30px;
}
}
.time {
@include time-tag(169px);
padding: 3px 20px;
&.t1 {
left: 190px;
}
&.t2 {
left: 487px;
}
}
}
.flow {
@include time-tag(242px);
font-size: 18px;
&.f1 {
left: 198px;
}
&.f2 {
left: 492px;
}
}
}
}
</style>