Files
uniapp-im-shop/pages/liveend/index.nvue
2026-01-12 17:52:15 +08:00

193 lines
4.4 KiB
Plaintext

<template>
<view class="container" :style="{ height: safeArea.height + 'px'}">
<image @tap="handleToLive" class="back-btn" src="/static/images/close.png" mode="aspectFit" />
<view class="header">
<text class="title">直播已结束</text>
</view>
<view class="stats-card">
<view class="stats-row">
<view class="stats-item">
<text class="stats-value">{{ formattedDuration }}</text>
<text class="stats-label">直播时长</text>
</view>
<view class="stats-item">
<text class="stats-value">{{ summaryData?.totalViewers }}</text>
<text class="stats-label">累计观看</text>
</view>
<view class="stats-item">
<text class="stats-value">{{ summaryData?.totalMessageSent }}</text>
<text class="stats-label">消息数量</text>
</view>
</view>
<view class="stats-row">
<view class="stats-item">
<text class="stats-value">{{ summaryData?.totalGiftCoins }}</text>
<text class="stats-label">礼物收入</text>
</view>
<view class="stats-item">
<text class="stats-value">{{ summaryData?.totalGiftUniqueSenders }}</text>
<text class="stats-label">送礼人数</text>
</view>
<view class="stats-item">
<text class="stats-value">{{ summaryData?.totalLikesReceived }}</text>
<text class="stats-label">点赞数量</text>
</view>
</view>
</view>
</view>
</template>
<script setup>
import {
ref,
onMounted,
computed
} from 'vue';
import {
onLoad
} from '@dcloudio/uni-app';
const safeArea = ref({
left: 0,
right: 0,
top: 0,
bottom: 0,
width: 375,
height: 750,
});
const summaryData = ref()
onLoad((options) => {
summaryData.value = uni.$summaryData
})
// 计算属性: 格式化后的直播时长
const formattedDuration = computed(() => {
return formatDuration(summaryData.value?.totalDuration);
});
onMounted(() => {
uni.getSystemInfo({
success: (res) => {
safeArea.value = res.safeArea;
}
});
});
const handleToLive = () => {
uni.redirectTo({
url: '/pages/discover/livelist/index',
success() {
console.log('跳转成功');
},
fail(err) {
console.error('跳转失败:', err);
}
});
}
// 格式化直播时长(输入单位为毫秒)
const formatDuration = (milliseconds) => {
// 处理无效输入
if (!milliseconds || milliseconds <= 0 || isNaN(milliseconds)) {
return '00:00:00';
}
// 将毫秒转换为秒(向下取整)
const totalSeconds = Math.floor(milliseconds / 1000);
const hours = Math.floor(totalSeconds / 3600);
const minutes = Math.floor((totalSeconds % 3600) / 60);
const remainingSeconds = totalSeconds % 60;
// 始终显示 HH:MM:SS 格式
return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${remainingSeconds.toString().padStart(2, '0')}`;
};
</script>
<style scoped>
.container {
flex: 1;
background-color: rgba(19, 20, 23, 1);
align-items: center;
justify-content: flex-start;
/* 顶部对齐 */
position: relative;
flex-direction: column;
}
.header {
margin-top: 300rpx;
}
.back-btn {
width: 48rpx;
height: 48rpx;
position: absolute;
top: 100rpx;
right: 80rpx;
z-index: 99;
}
.title {
color: #fff;
font-size: 36rpx;
font-weight: bold;
}
.time {
color: #bdbdbd;
font-size: 26rpx;
margin-bottom: 40rpx;
margin-left: 32rpx;
width: 100%;
}
.stats-card {
/* position: absolute; */
/* top: 450rpx; */
left: 0;
right: 0;
background-color: rgba(43, 44, 48, 1);
border-radius: 24rpx;
padding: 40rpx 0;
width: 700rpx;
align-items: center;
justify-content: center;
box-shadow: 0 4rpx 24rpx rgba(0, 0, 0, 0.2);
margin-top: 80rpx;
/* 与header间距 */
}
.stats-row {
width: 700rpx;
flex-direction: row;
justify-content: space-around;
margin: 24rpx;
}
.stats-row:last-child {
margin-bottom: 0;
}
.stats-item {
flex: 1;
align-items: center;
}
.stats-value {
color: #fff;
font-size: 36rpx;
font-weight: bold;
text-align: center;
}
.stats-label {
color: #bdbdbd;
font-size: 22rpx;
margin-top: 8rpx;
text-align: center;
}
</style>