| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <view class="message-page"> |
| | | <!-- 页é¢å¤´é¨ --> |
| | | <!-- <PageHeader title="æ¶æ¯ä¸å¿" |
| | | :showBack="false" /> --> |
| | | <!-- çéæ ç¾ --> |
| | | <view class="tabs-container"> |
| | | <up-tabs v-model="activeTab" |
| | | @change="handleTabChange" |
| | | :list="tabList" |
| | | :current="activeTab" |
| | | itemStyle="width: 50%;height: 80rpx;"></up-tabs> |
| | | </view> |
| | | <!-- æ¶æ¯å表 --> |
| | | <scroll-view class="message-list" |
| | | scroll-y="true" |
| | | refresher-enabled="true" |
| | | :refresher-triggered="triggered" |
| | | :refresher-threshold="100" |
| | | refresher-background="#f5f7fa" |
| | | @refresherrefresh="onRefresh" |
| | | @scrolltolower="loadMore"> |
| | | <!-- å è½½ç¶æ --> |
| | | <view v-if="loading" |
| | | class="loading-state"> |
| | | <text class="loading-text">å è½½ä¸...</text> |
| | | </view> |
| | | <!-- æ¶æ¯å表 --> |
| | | <view v-else |
| | | v-for="(item) in messageList" |
| | | :key="item.id" |
| | | class="message-item" |
| | | :class="{ 'unread': !item.read }"> |
| | | <view class="message-content"> |
| | | <view class="message-header"> |
| | | <text class="message-title">{{ item.noticeTitle }}</text> |
| | | <text class="message-time">{{ formatTime(item.createTime) }}</text> |
| | | </view> |
| | | <text class="message-desc">{{ item.noticeContent }}</text> |
| | | <view class="message-footer"> |
| | | <text class="message-view" |
| | | @click="goToDetail(item)"> |
| | | 廿¥ç > |
| | | </text> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | <!-- ç©ºç¶æ --> |
| | | <view v-if="!loading && messageList.length === 0" |
| | | class="empty-state"> |
| | | <text class="empty-text">ææ æ¶æ¯</text> |
| | | </view> |
| | | <!-- å è½½æ´å¤ç¶æ --> |
| | | <view v-if="loadingMore" |
| | | class="loading-more-state"> |
| | | <text class="loading-more-text">å è½½æ´å¤...</text> |
| | | </view> |
| | | </scroll-view> |
| | | </view> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, reactive, onMounted } from "vue"; |
| | | import { listNotice } from "@/api/login.js"; |
| | | import useUserStore from "@/store/modules/user"; |
| | | |
| | | // æ ç¾é¡µæ°æ® |
| | | const tabList = [ |
| | | { name: "æªè¯»", id: 0 }, |
| | | { name: "已读", id: 1 }, |
| | | ]; |
| | | |
| | | // å½åæ¿æ´»çæ ç¾ |
| | | const activeTab = ref(0); |
| | | |
| | | // æ¶æ¯åè¡¨æ°æ® |
| | | const messageList = ref([]); |
| | | const loading = ref(false); |
| | | const loadingMore = ref(false); |
| | | const total = ref(0); |
| | | const triggered = ref(false); |
| | | |
| | | // å页忰 |
| | | const page = reactive({ |
| | | current: 1, |
| | | size: 10, |
| | | }); |
| | | |
| | | // æ ¼å¼åæ¶é´ |
| | | const formatTime = time => { |
| | | if (!time) return ""; |
| | | const date = new Date(time); |
| | | const Y = date.getFullYear(); |
| | | const M = String(date.getMonth() + 1).padStart(2, "0"); |
| | | const D = String(date.getDate()).padStart(2, "0"); |
| | | const h = String(date.getHours()).padStart(2, "0"); |
| | | const m = String(date.getMinutes()).padStart(2, "0"); |
| | | return `${Y}-${M}-${D} ${h}:${m}`; |
| | | }; |
| | | |
| | | // 跳转å°è¯¦æ
页 |
| | | const goToDetail = item => { |
| | | if (item.jumpPath.indexOf("/") === 0) { |
| | | uni.navigateTo({ |
| | | url: item.jumpPath, |
| | | }); |
| | | } else { |
| | | uni.navigateTo({ |
| | | url: "/" + item.jumpPath, |
| | | }); |
| | | } |
| | | }; |
| | | const userStore = useUserStore(); |
| | | const userId = ref(""); |
| | | const getUserId = () => { |
| | | return userStore.getInfo().then(res => { |
| | | console.log(res.user.userId, "res@@@@@@@@@@@2"); |
| | | userId.value = res.user.userId; |
| | | }); |
| | | }; |
| | | |
| | | // å¤çæ ç¾é¡µåæ¢ |
| | | const handleTabChange = val => { |
| | | console.log(val); |
| | | activeTab.value = val.id; |
| | | page.current = 1; |
| | | loadMessages(false); |
| | | }; |
| | | |
| | | // å è½½æ¶æ¯å表 |
| | | const loadMessages = (append = false) => { |
| | | if (append) { |
| | | loadingMore.value = true; |
| | | } else { |
| | | loading.value = true; |
| | | } |
| | | |
| | | // æå»ºæ¥è¯¢åæ° |
| | | const params = { |
| | | consigneeId: userId.value, |
| | | current: page.current, |
| | | size: page.size, |
| | | status: activeTab.value, |
| | | }; |
| | | console.log(params, "==========="); |
| | | return listNotice(params) |
| | | .then(res => { |
| | | const records = res?.data?.records || []; |
| | | total.value = res?.data?.total || 0; |
| | | |
| | | if (append) { |
| | | messageList.value = [...messageList.value, ...records]; |
| | | } else { |
| | | messageList.value = records; |
| | | } |
| | | }) |
| | | .catch(error => { |
| | | console.error("è·åæ¶æ¯å¤±è´¥:", error); |
| | | uni.showToast({ title: "è·åæ¶æ¯å¤±è´¥ï¼è¯·éè¯", icon: "none" }); |
| | | }) |
| | | .finally(() => { |
| | | loading.value = false; |
| | | loadingMore.value = false; |
| | | }); |
| | | }; |
| | | |
| | | // å è½½æ´å¤ |
| | | const loadMore = () => { |
| | | console.log("==========="); |
| | | if (loading.value || loadingMore.value) return; |
| | | if (messageList.value.length >= total.value) return; |
| | | |
| | | page.current++; |
| | | loadMessages(true); |
| | | }; |
| | | |
| | | // 䏿巿° |
| | | const onRefresh = () => { |
| | | triggered.value = true; |
| | | // é置页ç |
| | | page.current = 1; |
| | | // éæ°å è½½æ¶æ¯ |
| | | loadMessages(false).finally(() => { |
| | | // å
³éå·æ°ç¶æ |
| | | setTimeout(() => { |
| | | triggered.value = false; |
| | | }, 500); |
| | | }); |
| | | }; |
| | | |
| | | // 页é¢å è½½æ¶è·åæ¶æ¯å表 |
| | | onMounted(() => { |
| | | getUserId().then(() => { |
| | | loadMessages(); |
| | | }); |
| | | }); |
| | | </script> |
| | | |
| | | <style scoped lang="scss"> |
| | | // å
¨å±åé |
| | | $primary-color: #2c7be5; |
| | | $primary-light: #4a90e2; |
| | | $success-color: #4cd964; |
| | | $warning-color: #ff9500; |
| | | $danger-color: #ff3b30; |
| | | $text-primary: #333333; |
| | | $text-secondary: #666666; |
| | | $text-tertiary: #999999; |
| | | $bg-color: #f5f7fa; |
| | | $card-bg: #ffffff; |
| | | $border-color: #e8e8e8; |
| | | $shadow-sm: 0 2rpx 8rpx rgba(0, 0, 0, 0.08); |
| | | |
| | | .message-page { |
| | | min-height: 100vh; |
| | | background-color: $bg-color; |
| | | padding-bottom: 30rpx; |
| | | } |
| | | |
| | | /* æ ç¾é¡µå®¹å¨ */ |
| | | .tabs-container { |
| | | background-color: #ffffff; |
| | | margin-bottom: 20rpx; |
| | | box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.08); |
| | | } |
| | | |
| | | /* æ¶æ¯å表 */ |
| | | .message-list { |
| | | margin: 0 20rpx 20rpx; |
| | | min-height: 600rpx; |
| | | height: calc(100vh - 200rpx); |
| | | } |
| | | |
| | | /* å è½½ç¶æ */ |
| | | .loading-state { |
| | | background-color: $card-bg; |
| | | border-radius: 16rpx; |
| | | box-shadow: $shadow-sm; |
| | | text-align: center; |
| | | padding: 120rpx 0; |
| | | margin-bottom: 20rpx; |
| | | } |
| | | |
| | | .loading-text { |
| | | font-size: 14px; |
| | | color: $text-tertiary; |
| | | margin-top: 24rpx; |
| | | font-weight: 500; |
| | | } |
| | | |
| | | /* æ¶æ¯é¡¹ */ |
| | | .message-item { |
| | | display: flex; |
| | | align-items: flex-start; |
| | | background-color: $card-bg; |
| | | border-radius: 16rpx; |
| | | box-shadow: $shadow-sm; |
| | | padding: 24rpx; |
| | | margin-bottom: 20rpx; |
| | | margin-right: 40rpx; |
| | | transition: all 0.3s ease; |
| | | } |
| | | |
| | | .message-item:hover { |
| | | box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.12); |
| | | transform: translateY(-2rpx); |
| | | } |
| | | |
| | | .message-item.unread { |
| | | border-left: 4rpx solid $primary-color; |
| | | } |
| | | |
| | | /* æ¶æ¯å¾æ */ |
| | | .message-icon { |
| | | margin-right: 20rpx; |
| | | margin-top: 4rpx; |
| | | } |
| | | |
| | | /* æ¶æ¯å
容 */ |
| | | .message-content { |
| | | flex: 1; |
| | | } |
| | | |
| | | /* æ¶æ¯å¤´é¨ */ |
| | | .message-header { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | margin-bottom: 12rpx; |
| | | } |
| | | |
| | | .message-title { |
| | | font-size: 16px; |
| | | font-weight: 600; |
| | | color: $text-primary; |
| | | flex: 1; |
| | | margin-right: 20rpx; |
| | | overflow: hidden; |
| | | text-overflow: ellipsis; |
| | | white-space: nowrap; |
| | | } |
| | | |
| | | .message-time { |
| | | font-size: 12px; |
| | | color: $text-tertiary; |
| | | } |
| | | |
| | | /* æ¶æ¯æè¿° */ |
| | | .message-desc { |
| | | font-size: 14px; |
| | | color: $text-secondary; |
| | | line-height: 1.4; |
| | | margin-bottom: 16rpx; |
| | | display: -webkit-box; |
| | | -webkit-line-clamp: 2; |
| | | -webkit-box-orient: vertical; |
| | | overflow: hidden; |
| | | text-overflow: ellipsis; |
| | | } |
| | | |
| | | /* æ¶æ¯åºé¨ */ |
| | | .message-footer { |
| | | display: flex; |
| | | justify-content: flex-end; |
| | | align-items: center; |
| | | } |
| | | |
| | | .message-creator { |
| | | font-size: 12px; |
| | | color: $text-tertiary; |
| | | } |
| | | |
| | | /* ç©ºç¶æ */ |
| | | .empty-state { |
| | | background-color: $card-bg; |
| | | border-radius: 16rpx; |
| | | box-shadow: $shadow-sm; |
| | | text-align: center; |
| | | padding: 160rpx 0; |
| | | margin: 40rpx 0; |
| | | } |
| | | |
| | | .empty-text { |
| | | font-size: 14px; |
| | | color: $text-tertiary; |
| | | margin-top: 24rpx; |
| | | font-weight: 500; |
| | | } |
| | | |
| | | /* å è½½æ´å¤ç¶æ */ |
| | | .loading-more-state { |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | padding: 30rpx 0; |
| | | margin-top: 10rpx; |
| | | } |
| | | |
| | | .loading-more-text { |
| | | font-size: 14px; |
| | | color: $text-tertiary; |
| | | margin-left: 10rpx; |
| | | } |
| | | |
| | | /* å è½½æ´å¤ */ |
| | | .load-more { |
| | | text-align: center; |
| | | padding: 30rpx 0; |
| | | font-size: 14px; |
| | | color: $primary-color; |
| | | font-weight: 500; |
| | | margin-top: 20rpx; |
| | | } |
| | | |
| | | .load-more-text { |
| | | display: inline-block; |
| | | padding: 10rpx 30rpx; |
| | | background-color: rgba($primary-color, 0.1); |
| | | border-radius: 20rpx; |
| | | transition: all 0.3s ease; |
| | | } |
| | | |
| | | .load-more-text:hover { |
| | | background-color: rgba($primary-color, 0.2); |
| | | transform: translateY(-2rpx); |
| | | } |
| | | |
| | | /* å¨ç»ææ */ |
| | | @keyframes fadeInUp { |
| | | from { |
| | | opacity: 0; |
| | | transform: translateY(20rpx); |
| | | } |
| | | to { |
| | | opacity: 1; |
| | | transform: translateY(0); |
| | | } |
| | | } |
| | | |
| | | .message-item { |
| | | animation: fadeInUp 0.3s ease-out; |
| | | } |
| | | |
| | | .message-item:nth-child(2) { |
| | | animation-delay: 0.1s; |
| | | } |
| | | |
| | | .message-item:nth-child(3) { |
| | | animation-delay: 0.2s; |
| | | } |
| | | |
| | | .message-item:nth-child(4) { |
| | | animation-delay: 0.3s; |
| | | } |
| | | |
| | | .message-item:nth-child(5) { |
| | | animation-delay: 0.4s; |
| | | } |
| | | .message-view { |
| | | float: right; |
| | | color: $primary-color; |
| | | } |
| | | </style> |