electripper-v2-ui/src/views/bst/areaSub/components/PlaybackPanel.vue

205 lines
5.3 KiB
Vue
Raw Normal View History

2025-04-10 19:56:40 +08:00
<template>
<el-card class="playback-panel" header="轨迹控制台">
2025-04-11 15:35:32 +08:00
<el-row class="device-info" v-if="currentLog">
2025-04-10 19:56:40 +08:00
<el-col :span="24" class="info-item">
<span class="label">时间</span>
2025-04-11 15:35:32 +08:00
<span class="value">{{ currentLog.at | dv}}</span>
2025-04-10 19:56:40 +08:00
</el-col>
<el-col :span="24" class="info-item">
<span class="label">位置</span>
2025-04-11 15:35:32 +08:00
<span class="value">{{currentLog.longitude | dv}},{{currentLog.latitude | dv}}</span>
2025-04-10 19:56:40 +08:00
</el-col>
2025-05-13 11:14:07 +08:00
<el-col :span="12" class="info-item">
<span class="label">定位类型</span>
<span class="value"><dict-tag :options="dict.type.device_location_type" :value="currentLog.type" size="mini"/></span>
</el-col>
<el-col :span="12" class="info-item">
<span class="label">状态</span>
<span class="value"><dict-tag :options="dict.type.device_status" :value="currentLog.status" size="mini"/></span>
</el-col>
2025-04-10 19:56:40 +08:00
<el-col :span="12" class="info-item">
<span class="label">速度</span>
2025-05-13 11:14:07 +08:00
<span class="value">{{ currentLog.speed | dv}} KM/H</span>
2025-04-10 19:56:40 +08:00
</el-col>
<el-col :span="12" class="info-item">
<span class="label">电压</span>
2025-04-11 15:35:32 +08:00
<span class="value">{{ currentLog.voltage | dv}} V</span>
2025-04-10 19:56:40 +08:00
</el-col>
<el-col :span="12" class="info-item">
2025-05-13 11:14:07 +08:00
<span class="label">4G</span>
2025-04-11 15:35:32 +08:00
<span class="value">{{ currentLog.signal | dv}}</span>
2025-04-10 19:56:40 +08:00
</el-col>
<el-col :span="12" class="info-item">
<span class="label">卫星</span>
2025-04-11 15:35:32 +08:00
<span class="value">{{ currentLog.satellites | dv}}</span>
2025-04-10 19:56:40 +08:00
</el-col>
<el-col :span="12" class="info-item">
<span class="label">锁状态</span>
<span class="value"><dict-tag :options="dict.type.device_lock_status" :value="currentLog.lockStatus" size="mini"/></span>
</el-col>
<el-col :span="12" class="info-item">
<span class="label">电门</span>
<span class="value"><dict-tag :options="dict.type.device_quality" :value="currentLog.quality" size="mini"/></span>
</el-col>
</el-row>
<div class="playback-controls">
<el-slider
2025-04-11 15:35:32 +08:00
:value="sliderValue"
2025-04-10 19:56:40 +08:00
:max="maxIndex"
2025-05-19 13:38:30 +08:00
:format-tooltip="formatTooltip"
2025-04-10 19:56:40 +08:00
@input="handleSliderChange">
</el-slider>
2025-04-12 18:00:14 +08:00
2025-04-10 19:56:40 +08:00
<div class="control-buttons">
<el-button-group>
<el-button size="mini" :icon="isPlaying ? 'el-icon-video-pause' : 'el-icon-video-play'" @click="togglePlay">
{{ isPlaying ? '暂停' : '播放' }}
</el-button>
2025-04-12 18:00:14 +08:00
<el-button
v-for="speed in [1, 2, 4, 8]"
2025-04-10 19:56:40 +08:00
:key="speed"
size="mini"
:type="playbackSpeed === speed ? 'primary' : ''"
@click="setPlaybackSpeed(speed)">
{{ speed }}x
</el-button>
</el-button-group>
2025-05-19 13:38:30 +08:00
<el-button-group>
<el-button size="mini" icon="el-icon-arrow-left" @click="handlePrev">
</el-button>
<el-button size="mini" icon="el-icon-arrow-right" @click="handleNext">
</el-button>
</el-button-group>
2025-04-10 19:56:40 +08:00
</div>
</div>
</el-card>
</template>
<script>
export default {
name: 'PlaybackPanel',
2025-05-13 11:14:07 +08:00
dicts: ['device_status', 'device_lock_status', 'device_quality', 'device_location_type'],
2025-04-10 19:56:40 +08:00
props: {
currentLog: {
type: Object,
default: () => ({})
},
maxIndex: {
type: Number,
default: 0
},
isPlaying: {
type: Boolean,
default: false
},
playbackSpeed: {
type: Number,
default: 1
2025-04-11 15:35:32 +08:00
},
currentIndex: {
type: Number,
required: true
2025-05-19 13:38:30 +08:00
},
locationLogList: {
type: Array,
default: () => []
2025-04-10 19:56:40 +08:00
}
},
2025-04-11 15:35:32 +08:00
computed: {
sliderValue() {
return this.currentIndex;
2025-04-10 19:56:40 +08:00
}
},
methods: {
2025-05-19 13:38:30 +08:00
formatTooltip(value) {
return this.locationLogList?.[value]?.at;
},
2025-04-10 19:56:40 +08:00
handleSliderChange(index) {
this.$emit('slider-change', index);
},
togglePlay() {
this.$emit('toggle-play');
},
setPlaybackSpeed(speed) {
this.$emit('speed-change', speed);
2025-05-19 13:38:30 +08:00
},
handlePrev() {
if (this.currentIndex > 0) {
this.$emit('slider-change', this.currentIndex - 1);
}
},
handleNext() {
if (this.currentIndex < this.maxIndex) {
this.$emit('slider-change', this.currentIndex + 1);
}
},
2025-04-10 19:56:40 +08:00
}
}
</script>
<style lang="scss" scoped>
.playback-panel {
position: absolute;
top: 60px;
right: 15px;
transform: none;
z-index: 100;
width: 400px;
2025-04-12 18:00:14 +08:00
background-color: rgba(255,255,255,0.5);
2025-04-10 19:56:40 +08:00
border-radius: 4px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
.device-info {
padding: 8px;
2025-04-12 18:00:14 +08:00
margin-bottom: 4px;
background-color: #f5f7fa7b;
2025-04-10 19:56:40 +08:00
border-radius: 4px;
.info-item {
font-size: 12px;
line-height: 1.4;
.label {
color: #606266;
}
.value {
color: #303133;
font-weight: 500;
}
}
}
.playback-controls {
2025-05-19 13:38:30 +08:00
.time-display {
text-align: center;
margin-bottom: 16px;
font-size: 12px;
color: #606266;
}
2025-04-10 19:56:40 +08:00
.el-slider {
2025-04-12 18:00:14 +08:00
margin-bottom: 4px;
2025-04-10 19:56:40 +08:00
}
.control-buttons {
display: flex;
justify-content: center;
gap: 10px;
.el-button {
padding: 7px 12px;
}
2025-05-19 13:38:30 +08:00
.el-button-group {
.el-button {
margin-left: -1px;
}
}
2025-04-10 19:56:40 +08:00
}
}
}
2025-04-12 18:00:14 +08:00
</style>