<template>
|
|
<view class="countdown">
|
|
<van-circle v-model:current-rate="currentRate" :rate="rate" :speed="100" :color="gradientColor" size="600rpx">
|
|
<template #default>
|
|
<view class="countdown-main">
|
|
<van-count-down :time="countTime" @change="calculateCountdownPercentage(countTime,startTime)">
|
|
<template #default="timeData">
|
|
<view class="countdown-title">剩余服务时间</view>
|
|
<view class="a1">
|
|
<span class="block">{{ addZero(timeData.hours) }}</span>
|
|
<span class="colon">:</span>
|
|
<span class="block">{{ addZero(timeData.minutes) }}</span>
|
|
<span class="colon">:</span>
|
|
<span class="block">{{ addZero(timeData.seconds) }}</span>
|
|
</view>
|
|
</template>
|
|
</van-count-down>
|
|
</view>
|
|
</template>
|
|
</van-circle>
|
|
|
|
</view>
|
|
</template>
|
|
|
|
<script>
|
|
export default {
|
|
data() {
|
|
return {
|
|
currentRate: 0,
|
|
rate : 0,
|
|
gradientColor: {
|
|
'0%': '#4899a6',
|
|
'100%': '#6fc6ad',
|
|
},
|
|
startTime : 0,
|
|
endTime: 0,
|
|
countTime : 0,
|
|
audio: new Audio(),
|
|
worker: null
|
|
}
|
|
},
|
|
onShow() {
|
|
//初始化开始、结束时间
|
|
this.startTime = new Date(this.$route.query.startTime).valueOf();
|
|
this.endTime = this.startTime + (this.$route.query.time ? this.$route.query.time * 1000 * 60 : 0)
|
|
this.countTime = this.endTime - Date.now() //倒计时时间戳(用于倒计时组件)
|
|
|
|
let self = this;
|
|
this.audio.src = '/static/music/server-time.mp3'
|
|
this.worker = new Worker('/static/work.js')
|
|
|
|
this.worker.postMessage({
|
|
startTime : this.startTime,
|
|
endTime : this.endTime
|
|
});
|
|
this.worker.onmessage = function(event) {
|
|
self.play()
|
|
}
|
|
},
|
|
onUnload(){
|
|
this.worker.terminate()
|
|
this.audio.pause()
|
|
this.audio = null
|
|
},
|
|
methods: {
|
|
|
|
//播放音频
|
|
play() {
|
|
this.audio.play()
|
|
this.worker.terminate()
|
|
},
|
|
|
|
// 计算时间百分比
|
|
calculateCountdownPercentage() {
|
|
let totalTime = this.endTime - this.startTime;
|
|
let elapsedTime = Date.now() - this.startTime;
|
|
// 计算进度百分比
|
|
let percentage = (elapsedTime / totalTime) * 100;
|
|
// 如果百分比超过100%,则将其设置为100%
|
|
this.rate = Math.min(percentage, 100);
|
|
},
|
|
|
|
//添加0
|
|
addZero(time){
|
|
if(time < 10){
|
|
return '0' + time
|
|
}
|
|
return time
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
.countdown {
|
|
min-height: 100vh;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
background: #f7f7f7;
|
|
width: 750rpx;
|
|
margin: 0rpx auto;
|
|
|
|
.countdown-main {
|
|
display: flex;
|
|
width: 600rpx;
|
|
height: 600rpx;
|
|
justify-content: center;
|
|
align-items: center;
|
|
|
|
.countdown-title {
|
|
text-align: center;
|
|
margin-bottom: 30rpx;
|
|
font-size: 35rpx;
|
|
color: #8f8f8f;
|
|
}
|
|
|
|
.a1 {
|
|
display: flex;
|
|
align-items: center;
|
|
height: 80rpx;
|
|
|
|
.colon {
|
|
margin: 0 8rpx;
|
|
color: black;
|
|
}
|
|
|
|
.block {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
width: 80rpx;
|
|
height: 80rpx;
|
|
color: #fff;
|
|
font-size: 28rpx;
|
|
font-weight: bold;
|
|
background-color: #4899a6;
|
|
border-radius: 10rpx;
|
|
margin: 0rpx 15rpx;
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
</style>
|