From 2c86a8bd60deed0dd0e044bad6fb83f75d19a332 Mon Sep 17 00:00:00 2001
From: wlzboy <66905212@qq.com>
Date: 星期日, 26 十月 2025 15:05:50 +0800
Subject: [PATCH] Merge branch 'feature-task'

---
 app/pages/message/index.vue |  271 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 271 insertions(+), 0 deletions(-)

diff --git a/app/pages/message/index.vue b/app/pages/message/index.vue
new file mode 100644
index 0000000..58bca52
--- /dev/null
+++ b/app/pages/message/index.vue
@@ -0,0 +1,271 @@
+<template>
+  <view class="message-container">
+    <view class="message-header">
+      <view class="header-title">娑堟伅涓績</view>
+    </view>
+    
+    <scroll-view class="message-list-scroll" scroll-y="true">
+      <view class="message-list">
+        <!-- 鏈娑堟伅鍦ㄥ墠 -->
+        <view 
+          class="message-item" 
+          v-for="message in sortedMessages" 
+          :key="message.messageId"
+          @click="viewMessageDetail(message)"
+        >
+          <view class="message-main">
+            <view class="message-title">
+              <text class="title-text">{{ getMessageTypeText(message.messageType) }}</text>
+              <view class="unread-dot" v-if="message.isRead === '0'"></view>
+            </view>
+            <view class="message-content">{{ message.messageContent }}</view>
+            <view class="message-time">{{ message.createTime }}</view>
+          </view>
+        </view>
+        
+        <view class="no-data" v-if="sortedMessages.length === 0">
+          <uni-icons type="info" size="40" color="#ccc"></uni-icons>
+          <text>鏆傛棤娑堟伅</text>
+        </view>
+      </view>
+    </scroll-view>
+  </view>
+</template>
+
+<script>
+  import { getMyMessages, markAsRead } from '@/api/message'
+  
+  export default {
+    data() {
+      return {
+        // 娑堟伅鍒楄〃
+        messages: [],
+        loading: false
+      }
+    },
+    computed: {
+      // 鎸夋湭璇�/宸茶鎺掑簭锛屾湭璇荤殑鍦ㄥ墠闈�
+      sortedMessages() {
+        return [...this.messages].sort((a, b) => {
+          if (a.isRead === b.isRead) {
+            // 鐩稿悓鐘舵�佹寜鏃堕棿鍊掑簭
+            return new Date(b.createTime) - new Date(a.createTime);
+          }
+          // 鏈鐨勬帓鍦ㄥ墠闈�
+          return a.isRead === '0' ? -1 : 1;
+        });
+      }
+    },
+    onLoad() {
+      this.loadMessages()
+    },
+    onShow() {
+      // 姣忔鏄剧ず椤甸潰鏃跺埛鏂版秷鎭�
+      this.loadMessages()
+      // 鏇存柊TabBar寰芥爣
+      this.updateTabBarBadge()
+    },
+    onPullDownRefresh() {
+      this.loadMessages().then(() => {
+        uni.stopPullDownRefresh()
+      })
+    },
+    methods: {
+      // 鍔犺浇娑堟伅鍒楄〃
+      async loadMessages() {
+        try {
+          this.loading = true
+          const response = await getMyMessages()
+          if (response.code === 200) {
+            this.messages = response.data || []
+          } else {
+            this.$modal.showToast(response.msg || '鍔犺浇娑堟伅澶辫触')
+          }
+        } catch (error) {
+          console.error('鍔犺浇娑堟伅澶辫触锛�', error)
+          this.$modal.showToast('鍔犺浇娑堟伅澶辫触')
+        } finally {
+          this.loading = false
+        }
+      },
+      
+      // 鑾峰彇娑堟伅绫诲瀷鏂囨湰
+      getMessageTypeText(type) {
+        const typeMap = {
+          'CREATE': '鍒涘缓鎴愬姛',
+          'PUSH': '浠诲姟鎺ㄩ��',
+          'STATUS': '鐘舵�佸彉鏇�',
+          'ASSIGN': '浠诲姟鍒嗛厤'
+        }
+        return typeMap[type] || '绯荤粺娑堟伅';
+      },
+      
+      // 鏌ョ湅娑堟伅璇︽儏锛堣烦杞埌浠诲姟璇︽儏锛�
+      async viewMessageDetail(message) {
+        try {
+          // 鏍¢獙娑堟伅瀵硅薄
+          if (!message || !message.messageId) {
+            console.error('娑堟伅鏁版嵁寮傚父锛�', message)
+            this.$modal.showToast('娑堟伅鏁版嵁寮傚父')
+            return
+          }
+          
+          // 鏍囪涓哄凡璇�
+          if (message.isRead === '0') {
+            await markAsRead(message.messageId)
+            message.isRead = '1'
+            // 鏇存柊寰芥爣
+            this.updateTabBarBadge()
+          }
+          
+          // 璺宠浆鍒颁换鍔¤鎯呴〉闈�
+          if (message.taskId) {
+            this.$tab.navigateTo(`/pages/task/detail?id=${message.taskId}`)
+          } else {
+            this.$modal.showToast('鏃犳硶鎵惧埌鍏宠仈浠诲姟')
+          }
+        } catch (error) {
+          console.error('鏍囪娑堟伅宸茶澶辫触锛�', error)
+          // 鍗充娇鏍囪澶辫触锛屼篃鍏佽璺宠浆
+          if (message && message.taskId) {
+            this.$tab.navigateTo(`/pages/task/detail?id=${message.taskId}`)
+          }
+        }
+      },
+      
+      // 鏇存柊TabBar寰芥爣
+      updateTabBarBadge() {
+        const unreadCount = this.messages.filter(msg => msg.isRead === '0').length
+        console.log('鏈娑堟伅鏁伴噺:', unreadCount)
+        
+        if (unreadCount > 0) {
+          uni.setTabBarBadge({
+            index: 3, // 娑堟伅椤甸潰鍦╰abBar涓殑绱㈠紩
+            text: unreadCount > 99 ? '99+' : unreadCount.toString()
+          })
+        } else {
+          uni.removeTabBarBadge({
+            index: 3
+          })
+        }
+      }
+    }
+  }
+</script>
+
+<style lang="scss">
+  .message-container {
+    padding: 20rpx;
+    background-color: #f5f5f5;
+    height: 100vh;
+    display: flex;
+    flex-direction: column;
+    // 闅愯棌婊氬姩鏉′絾淇濇寔婊氬姩鍔熻兘
+    ::-webkit-scrollbar {
+      display: none;
+      width: 0 !important;
+      height: 0 !important;
+      background: transparent;
+    }
+    
+    // Firefox婊氬姩鏉¢殣钘�
+    * {
+      scrollbar-width: none; /* Firefox */
+    }
+    
+    // IE/Edge婊氬姩鏉¢殣钘�
+    * {
+      -ms-overflow-style: none; /* IE 10+ */
+    }
+  }
+  
+  .message-header {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    padding: 20rpx 0;
+    flex-shrink: 0; // 闃叉鏀剁缉
+    
+    .header-title {
+      font-size: 36rpx;
+      font-weight: bold;
+    }
+  }
+  
+  .message-list-scroll {
+    flex: 1;
+    // 闅愯棌婊氬姩鏉′絾淇濇寔婊氬姩鍔熻兘
+    ::-webkit-scrollbar {
+      display: none;
+      width: 0 !important;
+      height: 0 !important;
+      background: transparent;
+    }
+    
+    // Firefox婊氬姩鏉¢殣钘�
+    * {
+      scrollbar-width: none; /* Firefox */
+    }
+    
+    // IE/Edge婊氬姩鏉¢殣钘�
+    * {
+      -ms-overflow-style: none; /* IE 10+ */
+    }
+  }
+  
+  .message-list {
+    .message-item {
+      background-color: white;
+      border-radius: 15rpx;
+      margin-bottom: 20rpx;
+      padding: 30rpx;
+      box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05);
+      
+      .message-main {
+        .message-title {
+          display: flex;
+          justify-content: space-between;
+          align-items: center;
+          margin-bottom: 20rpx;
+          
+          .title-text {
+            font-size: 32rpx;
+            font-weight: bold;
+            color: #333;
+          }
+          
+          .unread-dot {
+            width: 16rpx;
+            height: 16rpx;
+            border-radius: 50%;
+            background-color: #ff4d4f;
+          }
+        }
+        
+        .message-content {
+          font-size: 28rpx;
+          color: #666;
+          margin-bottom: 20rpx;
+          line-height: 1.5;
+        }
+        
+        .message-time {
+          font-size: 24rpx;
+          color: #999;
+          text-align: right;
+        }
+      }
+    }
+    
+    .no-data {
+      text-align: center;
+      padding: 100rpx 0;
+      color: #999;
+      
+      text {
+        display: block;
+        margin-top: 20rpx;
+      }
+    }
+  }
+</style>
\ No newline at end of file

--
Gitblit v1.9.1