| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <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, |
| | | [getApprovalTypeClass(item.noticeTitle)]: true |
| | | }"> |
| | | <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 v-if="activeTab === 0" |
| | | 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 { onShow } from "@dcloudio/uni-app"; |
| | | import { listNotice, confirmMessage, getNoticeCount } 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 getApprovalTypeClass = (title) => { |
| | | if (!title) return 'type-default'; |
| | | const titleStr = title.toString().trim(); |
| | | |
| | | if (titleStr.includes('éè´å®¡æ¹') || titleStr.includes('éè´')) { |
| | | return 'type-purchase'; |
| | | } else if (titleStr.includes('æ¥ä»·å®¡æ¹') || titleStr.includes('æ¥ä»·')) { |
| | | return 'type-quotation'; |
| | | } else if (titleStr.includes('å货审æ¹') || titleStr.includes('åè´§')) { |
| | | return 'type-shipment'; |
| | | } else if (titleStr.includes('å
¬åº') || titleStr.includes('å
¬åºç®¡ç')) { |
| | | return 'type-business-trip'; |
| | | } else if (titleStr.includes('请å') || titleStr.includes('请å管ç')) { |
| | | return 'type-leave'; |
| | | } else if (titleStr.includes('åºå·®') || titleStr.includes('åºå·®ç®¡ç')) { |
| | | return 'type-travel'; |
| | | } else if (titleStr.includes('æ¥é') || titleStr.includes('æ¥é管ç')) { |
| | | return 'type-reimbursement'; |
| | | } else if (titleStr.includes('å±é©ä½ä¸')) { |
| | | return 'type-dangerous'; |
| | | } |
| | | |
| | | return 'type-default'; |
| | | }; |
| | | |
| | | // æ ¹æ® noticeTitle å¤æè·³è½¬é¡µé¢ |
| | | const getJumpPathByTitle = (title, appJumpPath) => { |
| | | if (!title) return null; |
| | | |
| | | const titleStr = title.toString().trim(); |
| | | |
| | | // å°è¯ä» appJumpPath 䏿å approveId |
| | | let approveId = null; |
| | | if (appJumpPath) { |
| | | const queryIndex = appJumpPath.indexOf('?'); |
| | | if (queryIndex !== -1) { |
| | | const queryString = appJumpPath.substring(queryIndex + 1); |
| | | const params = queryString.split('&'); |
| | | params.forEach(param => { |
| | | const [key, value] = param.split('='); |
| | | if (key === 'approveId' && value) { |
| | | approveId = decodeURIComponent(value); |
| | | } |
| | | }); |
| | | } |
| | | // å¦ææ²¡æå¨æ¥è¯¢åæ°ä¸æ¾å°ï¼å°è¯ä»è·¯å¾ä¸æåï¼å¦ /pages/xxx/xxx/123ï¼ |
| | | if (!approveId) { |
| | | const pathParts = appJumpPath.split('/'); |
| | | const lastPart = pathParts[pathParts.length - 1]; |
| | | if (lastPart && !lastPart.includes('?') && !lastPart.includes('.')) { |
| | | approveId = lastPart; |
| | | } |
| | | } |
| | | } |
| | | |
| | | // æ ¹æ®æ é¢å¤æå®¡æ¹ç±»ååè·³è½¬è·¯å¾ |
| | | if (titleStr.includes('éè´å®¡æ¹') || titleStr.includes('éè´')) { |
| | | if (approveId) { |
| | | uni.setStorageSync('approveId', approveId); |
| | | uni.setStorageSync('approveType', '5'); |
| | | return `/pages/cooperativeOffice/collaborativeApproval/approve?approveType=5`; |
| | | } |
| | | return `/pages/cooperativeOffice/collaborativeApproval/index5`; |
| | | } else if (titleStr.includes('æ¥ä»·å®¡æ¹') || titleStr.includes('æ¥ä»·')) { |
| | | if (approveId) { |
| | | uni.setStorageSync('approveId', approveId); |
| | | uni.setStorageSync('approveType', '6'); |
| | | return `/pages/cooperativeOffice/collaborativeApproval/approve?approveType=6`; |
| | | } |
| | | return `/pages/cooperativeOffice/collaborativeApproval/index6`; |
| | | } else if (titleStr.includes('å货审æ¹') || titleStr.includes('åè´§')) { |
| | | if (approveId) { |
| | | uni.setStorageSync('approveId', approveId); |
| | | uni.setStorageSync('approveType', '7'); |
| | | return `/pages/cooperativeOffice/collaborativeApproval/approve?approveType=7`; |
| | | } |
| | | return `/pages/cooperativeOffice/collaborativeApproval/index7`; |
| | | } else if (titleStr.includes('å
¬åº') || titleStr.includes('å
¬åºç®¡ç')) { |
| | | if (approveId) { |
| | | uni.setStorageSync('approveId', approveId); |
| | | uni.setStorageSync('approveType', '1'); |
| | | return `/pages/cooperativeOffice/collaborativeApproval/approve?approveType=1`; |
| | | } |
| | | return `/pages/cooperativeOffice/collaborativeApproval/index1`; |
| | | } else if (titleStr.includes('请å') || titleStr.includes('请å管ç')) { |
| | | if (approveId) { |
| | | uni.setStorageSync('approveId', approveId); |
| | | uni.setStorageSync('approveType', '2'); |
| | | return `/pages/cooperativeOffice/collaborativeApproval/approve?approveType=2`; |
| | | } |
| | | return `/pages/cooperativeOffice/collaborativeApproval/index2`; |
| | | } else if (titleStr.includes('åºå·®') || titleStr.includes('åºå·®ç®¡ç')) { |
| | | if (approveId) { |
| | | uni.setStorageSync('approveId', approveId); |
| | | uni.setStorageSync('approveType', '3'); |
| | | return `/pages/cooperativeOffice/collaborativeApproval/approve?approveType=3`; |
| | | } |
| | | return `/pages/cooperativeOffice/collaborativeApproval/index3`; |
| | | } else if (titleStr.includes('æ¥é') || titleStr.includes('æ¥é管ç')) { |
| | | if (approveId) { |
| | | uni.setStorageSync('approveId', approveId); |
| | | uni.setStorageSync('approveType', '4'); |
| | | return `/pages/cooperativeOffice/collaborativeApproval/approve?approveType=4`; |
| | | } |
| | | return `/pages/cooperativeOffice/collaborativeApproval/index4`; |
| | | } else if (titleStr.includes('å±é©ä½ä¸')) { |
| | | if (approveId) { |
| | | uni.setStorageSync('approveId', approveId); |
| | | uni.setStorageSync('approveType', '8'); |
| | | return `/pages/cooperativeOffice/collaborativeApproval/approve?approveType=8`; |
| | | } |
| | | return `/pages/cooperativeOffice/collaborativeApproval/index8`; |
| | | } |
| | | |
| | | // 妿é½ä¸å¹é
ï¼å°è¯ä½¿ç¨åå§ç appJumpPath |
| | | if (appJumpPath) { |
| | | let jumpPath = appJumpPath; |
| | | if (jumpPath.indexOf("/") !== 0) { |
| | | jumpPath = "/" + jumpPath; |
| | | } |
| | | return jumpPath; |
| | | } |
| | | |
| | | return null; |
| | | }; |
| | | |
| | | // æ´æ° tab æ è§æ |
| | | const updateTabBarBadge = () => { |
| | | if (userId.value) { |
| | | getNoticeCount(userId.value) |
| | | .then(res => { |
| | | const count = res.data || 0; |
| | | // æ´æ°tabbarçè§æ |
| | | if (count > 0) { |
| | | uni.setTabBarBadge({ |
| | | index: 1, // æ¶æ¯æ ç¾é¡µçç´¢å¼ |
| | | text: count.toString(), |
| | | }); |
| | | } else { |
| | | uni.removeTabBarBadge({ |
| | | index: 1, |
| | | }); |
| | | } |
| | | }) |
| | | .catch(error => { |
| | | console.error("è·åæªè¯»æ¶æ¯æ°é失败:", error); |
| | | }); |
| | | } |
| | | }; |
| | | |
| | | // 跳转å°è¯¦æ
页 |
| | | const goToDetail = item => { |
| | | confirmMessage(item.noticeId, 1).then(res => { |
| | | if (res.code === 200) { |
| | | // uni.showToast({ title: "确认æå", icon: "success" }); |
| | | loadMessages(false); |
| | | |
| | | // æ´æ° tab æ è§æ |
| | | updateTabBarBadge(); |
| | | |
| | | // æ ¹æ® noticeTitle å¤æè·³è½¬é¡µé¢ |
| | | const jumpPath = getJumpPathByTitle(item.noticeTitle, item.appJumpPath); |
| | | |
| | | if (jumpPath) { |
| | | console.log('跳转路å¾:', jumpPath); |
| | | console.log('æ¶æ¯æ é¢:', item.noticeTitle); |
| | | console.log('æ¶æ¯æ°æ®:', item); |
| | | |
| | | uni.navigateTo({ |
| | | url: jumpPath, |
| | | fail: (err) => { |
| | | console.error('跳转失败:', err); |
| | | uni.showToast({ |
| | | title: "跳转失败ï¼è¯·æ£æ¥è·¯å¾", |
| | | icon: "none", |
| | | }); |
| | | } |
| | | }); |
| | | } else { |
| | | console.warn('æ æ³æ ¹æ®æ é¢å¤æè·³è½¬é¡µé¢:', item.noticeTitle); |
| | | uni.showToast({ |
| | | title: "æ æ³è·³è½¬ï¼è¯·æå¨è¿å
¥", |
| | | icon: "none", |
| | | }); |
| | | } |
| | | } else { |
| | | uni.showToast({ title: "确认失败", icon: "none" }); |
| | | } |
| | | }); |
| | | }; |
| | | 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(); |
| | | // æ´æ° tab æ è§æ |
| | | updateTabBarBadge(); |
| | | }); |
| | | }); |
| | | |
| | | // 页颿¾ç¤ºæ¶ä¹æ´æ°è§æ ï¼ä»å
¶ä»é¡µé¢è¿åæ¶ï¼ |
| | | onShow(() => { |
| | | if (userId.value) { |
| | | updateTabBarBadge(); |
| | | } |
| | | }); |
| | | </script> |
| | | |
| | | <style scoped lang="scss"> |
| | | // å
¨å±åé |
| | | $primary-color: #2979ff; |
| | | $primary-light: #4a90e2; |
| | | $success-color: #4cd964; |
| | | $warning-color: #ff9500; |
| | | $danger-color: #ff3b30; |
| | | $text-primary: #1f2937; |
| | | $text-secondary: #6b7280; |
| | | $text-tertiary: #9ca3af; |
| | | $bg-color: #f9fafb; |
| | | $card-bg: #ffffff; |
| | | $border-color: #e5e7eb; |
| | | $shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.1); |
| | | $shadow-md: 0 4px 6px rgba(0, 0, 0, 0.1); |
| | | $shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1); |
| | | |
| | | .message-page { |
| | | min-height: 100vh; |
| | | background: linear-gradient(180deg, #f9fafb 0%, #ffffff 100%); |
| | | padding-bottom: 30rpx; |
| | | } |
| | | |
| | | /* æ ç¾é¡µå®¹å¨ */ |
| | | .tabs-container { |
| | | background-color: #ffffff; |
| | | margin-bottom: 12rpx; |
| | | box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05); |
| | | position: sticky; |
| | | top: 0; |
| | | z-index: 10; |
| | | } |
| | | |
| | | /* æ¶æ¯å表 */ |
| | | .message-list { |
| | | padding: 0 24rpx 24rpx; |
| | | min-height: 600rpx; |
| | | height: calc(100vh - 200rpx); |
| | | box-sizing: border-box; |
| | | } |
| | | |
| | | /* å è½½ç¶æ */ |
| | | .loading-state { |
| | | background-color: $card-bg; |
| | | border-radius: 20rpx; |
| | | box-shadow: $shadow-sm; |
| | | text-align: center; |
| | | padding: 120rpx 0; |
| | | margin: 0 0 24rpx 0; |
| | | border: 1px solid rgba(0, 0, 0, 0.05); |
| | | width: 100%; |
| | | box-sizing: border-box; |
| | | } |
| | | |
| | | .loading-text { |
| | | font-size: 14px; |
| | | color: $text-tertiary; |
| | | margin-top: 24rpx; |
| | | font-weight: 500; |
| | | } |
| | | |
| | | /* æ¶æ¯é¡¹ */ |
| | | .message-item { |
| | | display: flex; |
| | | align-items: flex-start; |
| | | background: linear-gradient(135deg, #ffffff 0%, #fafbfc 100%); |
| | | border-radius: 20rpx; |
| | | box-shadow: $shadow-sm; |
| | | padding: 32rpx; |
| | | margin: 0 0 24rpx 0; |
| | | border: 1px solid rgba(0, 0, 0, 0.05); |
| | | transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); |
| | | position: relative; |
| | | overflow: hidden; |
| | | width: 100%; |
| | | box-sizing: border-box; |
| | | |
| | | &::before { |
| | | content: ''; |
| | | position: absolute; |
| | | top: 0; |
| | | left: 0; |
| | | width: 6rpx; |
| | | height: 100%; |
| | | background: linear-gradient(180deg, $primary-color 0%, $primary-light 100%); |
| | | opacity: 0; |
| | | transition: opacity 0.3s ease; |
| | | } |
| | | } |
| | | |
| | | .message-item:active { |
| | | transform: scale(0.98); |
| | | box-shadow: $shadow-md; |
| | | } |
| | | |
| | | .message-item.unread { |
| | | &::before { |
| | | opacity: 1; |
| | | } |
| | | |
| | | .message-title { |
| | | font-weight: 700; |
| | | } |
| | | |
| | | .message-title::before { |
| | | content: ''; |
| | | display: inline-block; |
| | | width: 12rpx; |
| | | height: 12rpx; |
| | | border-radius: 50%; |
| | | margin-right: 12rpx; |
| | | vertical-align: middle; |
| | | animation: pulse 2s infinite; |
| | | } |
| | | } |
| | | |
| | | // éè´å®¡æ¹ - èè² |
| | | .message-item.type-purchase.unread { |
| | | background: linear-gradient(135deg, #ffffff 0%, #e3f2fd 100%); |
| | | border: 1px solid rgba(33, 150, 243, 0.2); |
| | | box-shadow: 0 2px 8px rgba(33, 150, 243, 0.15); |
| | | |
| | | &::before { |
| | | background: linear-gradient(180deg, #2196f3 0%, #1976d2 100%); |
| | | } |
| | | |
| | | .message-title { |
| | | color: #1976d2; |
| | | } |
| | | |
| | | .message-title::before { |
| | | background: #1976d2; |
| | | } |
| | | |
| | | .message-view { |
| | | background: linear-gradient(135deg, #2196f3 0%, #1976d2 100%); |
| | | box-shadow: 0 4rpx 12rpx rgba(33, 150, 243, 0.3); |
| | | } |
| | | } |
| | | |
| | | // æ¥ä»·å®¡æ¹ - ç»¿è² |
| | | .message-item.type-quotation.unread { |
| | | background: linear-gradient(135deg, #ffffff 0%, #e8f5e9 100%); |
| | | border: 1px solid rgba(76, 175, 80, 0.2); |
| | | box-shadow: 0 2px 8px rgba(76, 175, 80, 0.15); |
| | | |
| | | &::before { |
| | | background: linear-gradient(180deg, #4caf50 0%, #388e3c 100%); |
| | | } |
| | | |
| | | .message-title { |
| | | color: #388e3c; |
| | | } |
| | | |
| | | .message-title::before { |
| | | background: #388e3c; |
| | | } |
| | | |
| | | .message-view { |
| | | background: linear-gradient(135deg, #4caf50 0%, #388e3c 100%); |
| | | box-shadow: 0 4rpx 12rpx rgba(76, 175, 80, 0.3); |
| | | } |
| | | } |
| | | |
| | | // åè´§å®¡æ¹ - æ©è² |
| | | .message-item.type-shipment.unread { |
| | | background: linear-gradient(135deg, #ffffff 0%, #fff3e0 100%); |
| | | border: 1px solid rgba(255, 152, 0, 0.2); |
| | | box-shadow: 0 2px 8px rgba(255, 152, 0, 0.15); |
| | | |
| | | &::before { |
| | | background: linear-gradient(180deg, #ff9800 0%, #f57c00 100%); |
| | | } |
| | | |
| | | .message-title { |
| | | color: #f57c00; |
| | | } |
| | | |
| | | .message-title::before { |
| | | background: #f57c00; |
| | | } |
| | | |
| | | .message-view { |
| | | background: linear-gradient(135deg, #ff9800 0%, #f57c00 100%); |
| | | box-shadow: 0 4rpx 12rpx rgba(255, 152, 0, 0.3); |
| | | } |
| | | } |
| | | |
| | | // å
¬åºç®¡ç - ç´«è² |
| | | .message-item.type-business-trip.unread { |
| | | background: linear-gradient(135deg, #ffffff 0%, #f3e5f5 100%); |
| | | border: 1px solid rgba(156, 39, 176, 0.2); |
| | | box-shadow: 0 2px 8px rgba(156, 39, 176, 0.15); |
| | | |
| | | &::before { |
| | | background: linear-gradient(180deg, #9c27b0 0%, #7b1fa2 100%); |
| | | } |
| | | |
| | | .message-title { |
| | | color: #7b1fa2; |
| | | } |
| | | |
| | | .message-title::before { |
| | | background: #7b1fa2; |
| | | } |
| | | |
| | | .message-view { |
| | | background: linear-gradient(135deg, #9c27b0 0%, #7b1fa2 100%); |
| | | box-shadow: 0 4rpx 12rpx rgba(156, 39, 176, 0.3); |
| | | } |
| | | } |
| | | |
| | | // 请å管ç - éè² |
| | | .message-item.type-leave.unread { |
| | | background: linear-gradient(135deg, #ffffff 0%, #e0f2f1 100%); |
| | | border: 1px solid rgba(0, 150, 136, 0.2); |
| | | box-shadow: 0 2px 8px rgba(0, 150, 136, 0.15); |
| | | |
| | | &::before { |
| | | background: linear-gradient(180deg, #009688 0%, #00796b 100%); |
| | | } |
| | | |
| | | .message-title { |
| | | color: #00796b; |
| | | } |
| | | |
| | | .message-title::before { |
| | | background: #00796b; |
| | | } |
| | | |
| | | .message-view { |
| | | background: linear-gradient(135deg, #009688 0%, #00796b 100%); |
| | | box-shadow: 0 4rpx 12rpx rgba(0, 150, 136, 0.3); |
| | | } |
| | | } |
| | | |
| | | // åºå·®ç®¡ç - çº¢è² |
| | | .message-item.type-travel.unread { |
| | | background: linear-gradient(135deg, #ffffff 0%, #ffebee 100%); |
| | | border: 1px solid rgba(244, 67, 54, 0.2); |
| | | box-shadow: 0 2px 8px rgba(244, 67, 54, 0.15); |
| | | |
| | | &::before { |
| | | background: linear-gradient(180deg, #f44336 0%, #d32f2f 100%); |
| | | } |
| | | |
| | | .message-title { |
| | | color: #d32f2f; |
| | | } |
| | | |
| | | .message-title::before { |
| | | background: #d32f2f; |
| | | } |
| | | |
| | | .message-view { |
| | | background: linear-gradient(135deg, #f44336 0%, #d32f2f 100%); |
| | | box-shadow: 0 4rpx 12rpx rgba(244, 67, 54, 0.3); |
| | | } |
| | | } |
| | | |
| | | // æ¥é管ç - ç²è² |
| | | .message-item.type-reimbursement.unread { |
| | | background: linear-gradient(135deg, #ffffff 0%, #fce4ec 100%); |
| | | border: 1px solid rgba(233, 30, 99, 0.2); |
| | | box-shadow: 0 2px 8px rgba(233, 30, 99, 0.15); |
| | | |
| | | &::before { |
| | | background: linear-gradient(180deg, #e91e63 0%, #c2185b 100%); |
| | | } |
| | | |
| | | .message-title { |
| | | color: #c2185b; |
| | | } |
| | | |
| | | .message-title::before { |
| | | background: #c2185b; |
| | | } |
| | | |
| | | .message-view { |
| | | background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); |
| | | box-shadow: 0 4rpx 12rpx rgba(233, 30, 99, 0.3); |
| | | } |
| | | } |
| | | |
| | | // å±é©ä½ä¸ - æ·±çº¢è² |
| | | .message-item.type-dangerous.unread { |
| | | background: linear-gradient(135deg, #ffffff 0%, #ffebee 100%); |
| | | border: 1px solid rgba(211, 47, 47, 0.3); |
| | | box-shadow: 0 2px 8px rgba(211, 47, 47, 0.2); |
| | | |
| | | &::before { |
| | | background: linear-gradient(180deg, #d32f2f 0%, #b71c1c 100%); |
| | | } |
| | | |
| | | .message-title { |
| | | color: #b71c1c; |
| | | } |
| | | |
| | | .message-title::before { |
| | | background: #b71c1c; |
| | | } |
| | | |
| | | .message-view { |
| | | background: linear-gradient(135deg, #d32f2f 0%, #b71c1c 100%); |
| | | box-shadow: 0 4rpx 12rpx rgba(211, 47, 47, 0.4); |
| | | } |
| | | } |
| | | |
| | | // é»è®¤ç±»å - èè²ï¼åè²ï¼ |
| | | .message-item.type-default.unread { |
| | | background: linear-gradient(135deg, #ffffff 0%, #f0f7ff 100%); |
| | | border: 1px solid rgba(41, 121, 255, 0.15); |
| | | box-shadow: 0 2px 8px rgba(41, 121, 255, 0.1); |
| | | |
| | | &::before { |
| | | background: linear-gradient(180deg, $primary-color 0%, $primary-light 100%); |
| | | } |
| | | |
| | | .message-title { |
| | | color: $primary-color; |
| | | } |
| | | |
| | | .message-title::before { |
| | | background: $primary-color; |
| | | } |
| | | } |
| | | |
| | | @keyframes pulse { |
| | | 0%, 100% { |
| | | opacity: 1; |
| | | transform: scale(1); |
| | | } |
| | | 50% { |
| | | opacity: 0.6; |
| | | transform: scale(1.2); |
| | | } |
| | | } |
| | | |
| | | /* æ¶æ¯å
容 */ |
| | | .message-content { |
| | | flex: 1; |
| | | position: relative; |
| | | z-index: 1; |
| | | } |
| | | |
| | | /* æ¶æ¯å¤´é¨ */ |
| | | .message-header { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: flex-start; |
| | | margin-bottom: 16rpx; |
| | | gap: 16rpx; |
| | | } |
| | | |
| | | .message-title { |
| | | font-size: 32rpx; |
| | | font-weight: 600; |
| | | color: $text-primary; |
| | | flex: 1; |
| | | line-height: 1.5; |
| | | overflow: hidden; |
| | | text-overflow: ellipsis; |
| | | display: -webkit-box; |
| | | -webkit-line-clamp: 2; |
| | | -webkit-box-orient: vertical; |
| | | } |
| | | |
| | | .message-time { |
| | | font-size: 24rpx; |
| | | color: $text-tertiary; |
| | | white-space: nowrap; |
| | | flex-shrink: 0; |
| | | padding: 4rpx 12rpx; |
| | | background: rgba(0, 0, 0, 0.03); |
| | | border-radius: 12rpx; |
| | | } |
| | | |
| | | /* æ¶æ¯æè¿° */ |
| | | .message-desc { |
| | | font-size: 28rpx; |
| | | color: $text-secondary; |
| | | line-height: 1.6; |
| | | margin-bottom: 20rpx; |
| | | display: -webkit-box; |
| | | -webkit-line-clamp: 2; |
| | | line-clamp: 2; |
| | | -webkit-box-orient: vertical; |
| | | overflow: hidden; |
| | | text-overflow: ellipsis; |
| | | max-height: 2.4em; |
| | | } |
| | | |
| | | /* æ¶æ¯åºé¨ */ |
| | | .message-footer { |
| | | display: flex; |
| | | justify-content: flex-end; |
| | | align-items: center; |
| | | margin-top: 16rpx; |
| | | padding-top: 16rpx; |
| | | border-top: 1px solid rgba(0, 0, 0, 0.05); |
| | | } |
| | | |
| | | .message-view { |
| | | padding: 12rpx 32rpx; |
| | | background: linear-gradient(135deg, $primary-color 0%, $primary-light 100%); |
| | | color: #ffffff; |
| | | border-radius: 24rpx; |
| | | font-size: 26rpx; |
| | | font-weight: 500; |
| | | box-shadow: 0 4rpx 12rpx rgba(41, 121, 255, 0.3); |
| | | transition: all 0.3s ease; |
| | | position: relative; |
| | | overflow: hidden; |
| | | |
| | | &::before { |
| | | content: ''; |
| | | position: absolute; |
| | | top: 50%; |
| | | left: 50%; |
| | | width: 0; |
| | | height: 0; |
| | | border-radius: 50%; |
| | | background: rgba(255, 255, 255, 0.3); |
| | | transform: translate(-50%, -50%); |
| | | transition: width 0.6s, height 0.6s; |
| | | } |
| | | |
| | | &:active { |
| | | transform: scale(0.95); |
| | | box-shadow: 0 2rpx 8rpx rgba(41, 121, 255, 0.4); |
| | | |
| | | &::before { |
| | | width: 300rpx; |
| | | height: 300rpx; |
| | | } |
| | | } |
| | | } |
| | | |
| | | /* ç©ºç¶æ */ |
| | | .empty-state { |
| | | background: linear-gradient(135deg, #ffffff 0%, #fafbfc 100%); |
| | | border-radius: 20rpx; |
| | | box-shadow: $shadow-sm; |
| | | text-align: center; |
| | | padding: 160rpx 40rpx; |
| | | margin: 60rpx 0 0 0; |
| | | border: 1px solid rgba(0, 0, 0, 0.05); |
| | | width: 100%; |
| | | box-sizing: border-box; |
| | | } |
| | | |
| | | .empty-text { |
| | | font-size: 28rpx; |
| | | color: $text-tertiary; |
| | | margin-top: 24rpx; |
| | | font-weight: 500; |
| | | } |
| | | |
| | | /* å è½½æ´å¤ç¶æ */ |
| | | .loading-more-state { |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | padding: 40rpx 0; |
| | | margin-top: 20rpx; |
| | | } |
| | | |
| | | .loading-more-text { |
| | | font-size: 26rpx; |
| | | color: $text-tertiary; |
| | | margin-left: 12rpx; |
| | | } |
| | | |
| | | /* å¨ç»ææ */ |
| | | @keyframes fadeInUp { |
| | | from { |
| | | opacity: 0; |
| | | transform: translateY(30rpx); |
| | | } |
| | | to { |
| | | opacity: 1; |
| | | transform: translateY(0); |
| | | } |
| | | } |
| | | |
| | | .message-item { |
| | | animation: fadeInUp 0.4s cubic-bezier(0.4, 0, 0.2, 1) backwards; |
| | | } |
| | | |
| | | .message-item:nth-child(1) { |
| | | animation-delay: 0.05s; |
| | | } |
| | | |
| | | .message-item:nth-child(2) { |
| | | animation-delay: 0.1s; |
| | | } |
| | | |
| | | .message-item:nth-child(3) { |
| | | animation-delay: 0.15s; |
| | | } |
| | | |
| | | .message-item:nth-child(4) { |
| | | animation-delay: 0.2s; |
| | | } |
| | | |
| | | .message-item:nth-child(5) { |
| | | animation-delay: 0.25s; |
| | | } |
| | | |
| | | /* ååºå¼ä¼å */ |
| | | @media (prefers-color-scheme: dark) { |
| | | .message-page { |
| | | background: linear-gradient(180deg, #1f2937 0%, #111827 100%); |
| | | } |
| | | |
| | | .tabs-container { |
| | | background-color: #1f2937; |
| | | border-bottom: 1px solid rgba(255, 255, 255, 0.1); |
| | | } |
| | | |
| | | .message-item { |
| | | background: linear-gradient(135deg, #1f2937 0%, #111827 100%); |
| | | border-color: rgba(255, 255, 255, 0.1); |
| | | } |
| | | |
| | | .message-item.unread { |
| | | background: linear-gradient(135deg, #1f2937 0%, #1e3a5f 100%); |
| | | border-color: rgba(41, 121, 255, 0.3); |
| | | } |
| | | |
| | | .message-title { |
| | | color: #f3f4f6; |
| | | } |
| | | |
| | | .message-desc { |
| | | color: #d1d5db; |
| | | } |
| | | |
| | | .message-time { |
| | | background: rgba(255, 255, 255, 0.1); |
| | | color: #9ca3af; |
| | | } |
| | | |
| | | .empty-state { |
| | | background: linear-gradient(135deg, #1f2937 0%, #111827 100%); |
| | | border-color: rgba(255, 255, 255, 0.1); |
| | | } |
| | | } |
| | | </style> |