Files
QCN_rider/.svn/pristine/3f/3f1979f7fe43ac27a1e092aadf5be141358fdcad.svn-base
2026-02-12 12:19:20 +08:00

357 lines
7.6 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<!-- 导航栏 -->
<view class=""
style=" z-index: 100; padding:50rpx 20rpx 18rpx;box-sizing: border-box; position: fixed;top: 0; left: 0; width: 100vw; background-color: #fff; display: flex; align-items: center; justify-content: space-between; ">
<view class="" @click="Service.GoPageBack()">
<up-icon name="arrow-left" size="32rpx"></up-icon>
</view>
<view class="">
消息通知
</view>
<view class="" style="font-size: 22rpx; color: #999999; " >
全部已读
</view>
</view>
<view class="" style="width: 100%; height: 108rpx; ">
</view>
<view v-if="loading" class="">
<!-- 消息列表骨架 -->
<view class="skeleton-list">
<!-- 模拟4条消息 -->
<view v-for="index in 4" :key="index" class="skeleton-message-item">
<view class="skeleton-message-icon">
<view class="skeleton-icon-container"></view>
<view class="skeleton-unread-dot"></view>
</view>
<view class="skeleton-message-content">
<view class="skeleton-message-header">
<view class="skeleton-message-title"></view>
<view class="skeleton-message-time"></view>
</view>
<view class="skeleton-message-desc">
<view class="skeleton-desc-line"></view>
<view class="skeleton-desc-line short"></view>
</view>
</view>
</view>
<!-- 加载更多骨架 -->
<view class="skeleton-load-more"></view>
</view>
</view>
<view v-else class="message-center-container">
<!-- 标签页 -->
<up-tabs :list="tabList" :current="currentTab" @change="handleTabChange" lineWidth='60' :scrollable="false"
lineColor="var(--nav-mian)"
:activeStyle="{ color: 'var(--nav-mian)', fontWeight: 'bold', transform: 'scale(1.05)'}"
:inactiveStyle="{color: '#606266', transform: 'scale(1)'}"></up-tabs>
<!-- 消息列表 -->
<scroll-view scroll-y class="message-list" :show-scrollbar="false">
<!-- 根据不同标签显示不同的消息 -->
<view v-for="(message, index) in 4" :key="index" class="message-item">
<view class="message-icon">
<view class="icon-container">
<image v-if="currentTab === 1" style="width: 100%; height: 100%;"
:src=" Service.GetIconImg('/static/index/home/shop.png')" mode=""></image>
<image v-if="currentTab === 2" style="width: 100%; height: 100%;"
:src=" Service.GetIconImg('/static/index/home/custom.png')" mode=""></image>
<image v-if="currentTab === 3" style="width: 100%; height: 100%;"
:src=" Service.GetIconImg('/static/index/home/system.png')" mode=""></image>
</view>
<view class="unread-dot"></view>
</view>
<view class="message-content">
<view class="message-header">
<text class="message-title">系统维护通知</text>
<text class="message-time">10分钟前</text>
</view>
<text class="message-desc">为了给您提供更好的服务体验系统将于今晚24:00-次日凌晨2:00进行例行维护</text>
</view>
</view>
<up-loadmore :status="status" />
</scroll-view>
</view>
</template>
<script setup lang="ts">
import { ref, computed, onMounted } from 'vue';
import { Service } from "@/Service/Service"
import { onLoad } from '@dcloudio/uni-app';
// 标签页数据
const tabList = ref([
{ name: '全部' },
{ name: '订单通知' },
{ name: '客户消息' },
{ name: '系统通知' }
]);
// 当前选中标签
const currentTab = ref(0);
// 加载状态
let loading = ref(true);
let status = ref('nomore')
onLoad(() => {
setTimeout(() => { loading.value = false; }, 1500);
})
// 处理标签切换
const handleTabChange = (e) => {
currentTab.value = e.index;
};
</script>
<style scoped lang="scss">
/* 消息列表骨架 */
.skeleton-list {
padding: 30rpx;
height: calc(100vh - 220rpx);
overflow: hidden;
}
.skeleton-message-item {
display: flex;
align-items: flex-start;
background-color: #ffffff;
border-radius: 16rpx;
padding: 30rpx;
margin-bottom: 24rpx;
animation: skeleton-loading 1.5s infinite ease-in-out;
}
.skeleton-message-icon {
position: relative;
margin-right: 24rpx;
}
.skeleton-icon-container {
width: 80rpx;
height: 80rpx;
background-color: #e0e0e0;
border-radius: 16rpx;
animation: skeleton-loading 1.5s infinite ease-in-out;
}
.skeleton-unread-dot {
position: absolute;
top: -8rpx;
right: -8rpx;
width: 24rpx;
height: 24rpx;
background-color: #e0e0e0;
border-radius: 50%;
animation: skeleton-loading 1.5s infinite ease-in-out;
}
.skeleton-message-content {
flex: 1;
}
.skeleton-message-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 12rpx;
}
.skeleton-message-title {
width: 200rpx;
height: 44rpx;
background-color: #e0e0e0;
border-radius: 8rpx;
animation: skeleton-loading 1.5s infinite ease-in-out;
}
.skeleton-message-time {
width: 100rpx;
height: 32rpx;
background-color: #e0e0e0;
border-radius: 6rpx;
animation: skeleton-loading 1.5s infinite ease-in-out;
}
.skeleton-message-desc {
display: flex;
flex-direction: column;
gap: 10rpx;
}
.skeleton-desc-line {
height: 40rpx;
background-color: #e0e0e0;
border-radius: 8rpx;
animation: skeleton-loading 1.5s infinite ease-in-out;
}
.skeleton-desc-line.short {
width: 80%;
}
.skeleton-load-more {
height: 60rpx;
background-color: #e0e0e0;
border-radius: 30rpx;
margin-top: 20rpx;
animation: skeleton-loading 1.5s infinite ease-in-out;
}
/* 骨架屏加载动画 */
@keyframes skeleton-loading {
0% {
opacity: 1;
}
50% {
opacity: 0.5;
}
100% {
opacity: 1;
}
}
/* 设置延迟,让骨架屏各部分加载动画错开 */
.skeleton-tab:nth-child(1) {
animation-delay: 0s;
}
.skeleton-tab:nth-child(2) {
animation-delay: 0.1s;
}
.skeleton-tab:nth-child(3) {
animation-delay: 0.2s;
}
.skeleton-tab:nth-child(4) {
animation-delay: 0.3s;
}
.skeleton-message-item:nth-child(1) {
animation-delay: 0s;
}
.skeleton-message-item:nth-child(2) {
animation-delay: 0.15s;
}
.skeleton-message-item:nth-child(3) {
animation-delay: 0.3s;
}
.skeleton-message-item:nth-child(4) {
animation-delay: 0.45s;
}
// end
.message-center-container {
background-color: #f5f5f5;
}
.read-all-btn {
position: absolute;
top: 88rpx;
right: 30rpx;
font-size: 26rpx;
color: #666666;
z-index: 10;
}
.message-list {
padding: 30rpx;
height: calc(100vh - 220rpx);
}
.message-item {
display: flex;
align-items: flex-start;
background-color: #ffffff;
border-radius: 16rpx;
padding: 30rpx;
margin-bottom: 24rpx;
transition: transform 0.2s;
&:active {
transform: scale(0.98);
}
}
.message-icon {
position: relative;
margin-right: 24rpx;
}
.icon-container {
width: 80rpx;
height: 80rpx;
background-color: #ffffff;
border-radius: 16rpx;
display: flex;
align-items: center;
justify-content: center;
font-size: 40rpx;
}
.unread-dot {
position: absolute;
top: -8rpx;
right: -8rpx;
width: 24rpx;
height: 24rpx;
background-color: #FF4444;
border-radius: 50%;
border: 2rpx solid #ffffff;
}
.message-content {
flex: 1;
}
.message-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 12rpx;
}
.message-title {
font-size: 32rpx;
font-weight: 600;
color: #333333;
line-height: 44rpx;
}
.message-time {
font-size: 24rpx;
color: #999999;
}
.message-desc {
font-size: 28rpx;
color: #666666;
line-height: 40rpx;
word-break: break-all;
}
.empty-state {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 100rpx 0;
}
.empty-icon {
font-size: 120rpx;
margin-bottom: 30rpx;
}
.empty-text {
font-size: 28rpx;
color: #999999;
}
</style>