From 4648a3bee638e9a99d2d80b66f8833b261a2db91 Mon Sep 17 00:00:00 2001
From: wlzboy <66905212@qq.com>
Date: 星期四, 25 九月 2025 22:39:24 +0800
Subject: [PATCH] feat:设计 app ui

---
 app/pages/index.vue |  605 ++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 580 insertions(+), 25 deletions(-)

diff --git a/app/pages/index.vue b/app/pages/index.vue
index 4646807..5539ffa 100644
--- a/app/pages/index.vue
+++ b/app/pages/index.vue
@@ -1,43 +1,598 @@
 <template>
-  <view class="content">
-    <image class="logo" src="@/static/logo.png"></image>
-    <view class="text-area">
-      <text class="title">Hello RuoYi</text>
+  <view class="home-container">
+    <!-- 椤堕儴鐢ㄦ埛淇℃伅鍖哄煙 -->
+    <view class="user-info-section">
+      <view class="user-info-content">
+        <view class="user-details">
+          <view class="user-name">{{ userName || '鏈櫥褰�' }}</view>
+          <view class="vehicle-info">
+            <text v-if="boundVehicle">鍏宠仈杞︾墝鍙凤細{{ boundVehicle }}</text>
+            <text v-else>鏈粦瀹氳溅鐗屽彿</text>
+          </view>
+        </view>
+        <button 
+          class="bind-vehicle-btn" 
+          @click="goToBindVehicle"
+        >
+          {{ boundVehicle ? '鏇存崲杞﹁締' : '缁戝畾杞﹁締' }}
+        </button>
+      </view>
     </view>
+
+    <!-- 娑堟伅鍏ュ彛 -->
+    <view class="message-entry" @click="goToMessages">
+      <view class="message-icon">
+        <uni-icons type="chat" size="24" color="#007AFF"></uni-icons>
+      </view>
+      <view class="message-text">娑堟伅涓績</view>
+      <view class="unread-dot" v-if="unreadMessageCount > 0">{{ unreadMessageCount }}</view>
+      <view class="arrow">
+        <uni-icons type="arrowright" size="16" color="#999"></uni-icons>
+      </view>
+    </view>
+
+    <!-- 姝e湪杩愯鐨勪换鍔℃爣棰� -->
+    <view class="running-tasks-header">
+      <text class="header-title">姝e湪杩愯鐨勪换鍔�</text>
+    </view>
+
+    <!-- 姝e湪杩愯鐨勪换鍔″垪琛� -->
+    <scroll-view class="running-tasks-section" scroll-y="true">
+      <view class="task-list">
+        <view class="task-item" v-for="task in runningTasks" :key="task.id">
+          <view class="task-main" @click="viewTaskDetail(task)">
+            <view class="task-title">{{ getTaskTypeText(task.type) }} - {{ task.vehicle }}</view>
+            <view class="task-info">
+              <view class="info-row">
+                <view class="info-item">
+                  <view class="label">浠诲姟缂栧彿:</view>
+                  <view class="value">{{ task.taskNo }}</view>
+                </view>
+                <view class="info-item">
+                  <view class="label">浠诲姟鐘舵��:</view>
+                  <view class="value">{{ getStatusText(task.status) }}</view>
+                </view>
+              </view>
+              <view class="info-row">
+                <view class="info-item">
+                  <view class="label">鍑哄彂鍦�:</view>
+                  <view class="value">{{ task.startLocation }}</view>
+                </view>
+                <view class="info-item">
+                  <view class="label">鐩殑鍦�:</view>
+                  <view class="value">{{ task.endLocation }}</view>
+                </view>
+              </view>
+              <view class="info-row">
+                <view class="info-item">
+                  <view class="label">鍑哄彂鏃堕棿:</view>
+                  <view class="value">{{ task.startTime }}</view>
+                </view>
+                <view class="info-item">
+                  <view class="label">鎵ц浜哄憳:</view>
+                  <view class="value">{{ task.assignee }}</view>
+                </view>
+              </view>
+            </view>
+          </view>
+          
+          <!-- 鎿嶄綔鎸夐挳 -->
+          <view class="task-actions">
+            <button 
+              class="action-btn" 
+              :class="{ disabled: isActionDisabled(task, 'depart') }"
+              @click="handleTaskAction(task, 'depart')"
+              v-if="task.status !== 'completed'"
+            >
+              鍑哄彂
+            </button>
+            <button 
+              class="action-btn" 
+              :class="{ disabled: isActionDisabled(task, 'arrive') }"
+              @click="handleTaskAction(task, 'arrive')"
+              v-if="task.status !== 'completed'"
+            >
+              宸插埌杈�
+            </button>
+            <button 
+              class="action-btn" 
+              :class="{ disabled: isActionDisabled(task, 'return') }"
+              @click="handleTaskAction(task, 'return')"
+              v-if="task.status !== 'completed'"
+            >
+              杩旂▼
+            </button>
+            <button 
+              class="action-btn" 
+              :class="{ disabled: isActionDisabled(task, 'settle') }"
+              @click="handleTaskAction(task, 'settle')"
+              v-if="task.status !== 'completed'"
+            >
+              缁撶畻
+            </button>
+            <button 
+              class="action-btn primary" 
+              :class="{ disabled: isActionDisabled(task, 'complete') }"
+              @click="handleTaskAction(task, 'complete')"
+              v-if="task.status !== 'completed'"
+            >
+              宸插畬鎴�
+            </button>
+          </view>
+        </view>
+        
+        <view class="no-data" v-if="runningTasks.length === 0">
+          <uni-icons type="info" size="40" color="#ccc"></uni-icons>
+          <text>鏆傛棤姝e湪杩愯鐨勪换鍔�</text>
+        </view>
+      </view>
+    </scroll-view>
   </view>
 </template>
 
 <script>
+  import { mapState } from 'vuex'
+  
   export default {
-    onLoad: function() {
+    data() {
+      return {
+        // 妯℃嫙鐢ㄦ埛缁戝畾鐨勮溅杈嗕俊鎭�
+        boundVehicle: '绮12345', // 妯℃嫙宸茬粦瀹氳溅杈�
+        
+        // 妯℃嫙娑堟伅鏁版嵁
+        messages: [
+          {
+            id: 1,
+            type: 'create', // 鍒涘缓鎴愬姛
+            content: 'TD 1011 骞垮窞澶╂渤->骞垮窞涓滅珯锛屾椂闂达細13锛�20 浠诲姟鍒涘缓鎴愬姛',
+            time: '2023-05-15 13:20',
+            read: false,
+            taskId: 1
+          },
+          {
+            id: 2,
+            type: 'push', // 浠诲姟鎺ㄩ��
+            content: 'TD1021 骞垮窞澶╂渤->骞垮窞涓滅珯锛屾椂闂达細13锛�20 鍑哄彂锛岃鍙婃椂澶勭悊',
+            time: '2023-05-15 13:25',
+            read: false,
+            taskId: 2
+          },
+          {
+            id: 3,
+            type: 'status', // 浠诲姟鐘舵�佸彉鏇�
+            content: 'TD1021 骞垮窞澶╂渤->骞垮窞涓滅珯锛屾椂闂达細13锛�20锛屼换鍔℃鍦ㄨ浆杩愪腑',
+            time: '2023-05-15 14:30',
+            read: true,
+            taskId: 2
+          },
+          {
+            id: 4,
+            type: 'create', // 鍒涘缓鎴愬姛
+            content: 'TD 1022 娣卞湷鍗楀北->娣卞湷绂忕敯锛屾椂闂达細15锛�10 浠诲姟鍒涘缓鎴愬姛',
+            time: '2023-05-15 15:10',
+            read: false,
+            taskId: 3
+          },
+          {
+            id: 5,
+            type: 'push', // 浠诲姟鎺ㄩ��
+            content: 'TD1023 娣卞湷鍗楀北->娣卞湷绂忕敯锛屾椂闂达細16锛�00 鍑哄彂锛岃鍙婃椂澶勭悊',
+            time: '2023-05-15 16:00',
+            read: true,
+            taskId: 4
+          }
+        ],
+        
+        // 妯℃嫙姝e湪杩愯鐨勪换鍔″垪琛�
+        taskList: [
+          {
+            id: 1,
+            title: '绱ф�ョ淮淇换鍔�',
+            type: 'maintenance', // 缁翠慨淇濆吇
+            startLocation: '骞垮窞甯傚ぉ娌冲尯XX璺�123鍙�',
+            endLocation: '骞垮窞甯傜櫧浜戝尯YY璺�456鍙�',
+            startTime: '2023-05-15 15:00',
+            assignee: '寮犱笁',
+            status: 'pending',
+            vehicle: '绮12345',
+            taskNo: 'RW20230515001'
+          },
+          {
+            id: 2,
+            title: '瀹氭湡淇濆吇浠诲姟',
+            type: 'maintenance', // 缁翠慨淇濆吇
+            startLocation: '娣卞湷甯傚崡灞卞尯XX璺�789鍙�',
+            endLocation: '娣卞湷甯傜鐢板尯YY璺�999鍙�',
+            startTime: '2023-05-14 10:00',
+            assignee: '鏉庡洓',
+            status: 'processing',
+            vehicle: '绮67890',
+            taskNo: 'RW20230514002'
+          },
+          {
+            id: 5,
+            title: '鎬ユ晳杞繍浠诲姟',
+            type: 'emergency', // 鎬ユ晳杞繍
+            startLocation: '骞垮窞甯傝秺绉�鍖哄尰闄㈣矾1鍙�',
+            endLocation: '骞垮窞甯傛捣鐝犲尯鍖婚櫌璺�2鍙�',
+            startTime: '2023-05-16 14:00',
+            assignee: '寮犲尰鐢�,鏉庢姢澹�',
+            status: 'pending',
+            vehicle: '绮33333',
+            taskNo: 'RW20230516005'
+          },
+          {
+            id: 6,
+            title: '绂忕杞︿换鍔�',
+            type: 'welfare', // 绂忕杞�
+            startLocation: '骞垮窞甯傝崝婀惧尯绀惧尯璺�10鍙�',
+            endLocation: '骞垮窞甯傚ぉ娌冲尯鍏昏�侀櫌璺�20鍙�',
+            startTime: '2023-05-17 08:00',
+            assignee: '鐜嬪徃鏈�',
+            status: 'processing',
+            vehicle: '绮44444',
+            taskNo: 'RW20230517006'
+          }
+        ]
+      }
+    },
+    computed: {
+      ...mapState({
+        userName: state => state.user.name
+      }),
+      
+      // 姝e湪杩愯鐨勪换鍔★紙寰呭鐞嗗拰澶勭悊涓殑浠诲姟锛�
+      runningTasks() {
+        return this.taskList.filter(task => 
+          task.status === 'pending' || task.status === 'processing'
+        );
+      },
+      
+      // 鏈娑堟伅鏁伴噺
+      unreadMessageCount() {
+        return this.messages.filter(message => !message.read).length;
+      }
+    },
+    methods: {
+      // 璺宠浆鍒扮粦瀹氳溅杈嗛〉闈�
+      goToBindVehicle() {
+        // 璺宠浆鍒扮粦瀹氳溅杈嗙殑椤甸潰
+        this.$tab.navigateTo('/pages/bind-vehicle');
+      },
+      
+      // 璺宠浆鍒版秷鎭〉闈�
+      goToMessages() {
+        this.$tab.switchTab('/pages/message/index');
+      },
+      
+      // 鏌ョ湅浠诲姟璇︽儏
+      viewTaskDetail(task) {
+        // 璺宠浆鍒颁换鍔¤鎯呴〉闈�
+        this.$tab.navigateTo(`/pages/task/detail?id=${task.id}`);
+      },
+      
+      // 鍒ゆ柇鎿嶄綔鎸夐挳鏄惁绂佺敤
+      isActionDisabled(task, action) {
+        // 鏍规嵁浠诲姟鐘舵�佸拰鎿嶄綔绫诲瀷鍒ゆ柇鏄惁绂佺敤
+        switch (action) {
+          case 'depart':
+            return task.status !== 'pending';
+          case 'arrive':
+            return task.status !== 'processing';
+          case 'return':
+            return task.status !== 'processing';
+          case 'settle':
+            return task.status !== 'processing';
+          case 'complete':
+            return task.status !== 'processing';
+          default:
+            return false;
+        }
+      },
+      
+      // 澶勭悊浠诲姟鎿嶄綔
+      handleTaskAction(task, action) {
+        if (this.isActionDisabled(task, action)) {
+          return;
+        }
+        
+        switch (action) {
+          case 'depart':
+            // 鍑哄彂鎿嶄綔锛屾牴鎹换鍔$被鍨嬫樉绀轰笉鍚岀殑纭淇℃伅
+            let departMessage = '纭畾瑕佹爣璁颁负宸插嚭鍙戝悧锛�';
+            if (task.type !== 'maintenance' && task.type !== 'refuel' && task.type !== 'inspection') {
+              departMessage = '鍙戝嚭鍘荤洰鐨勫湴,纭锛�';
+            }
+            this.$modal.confirm(departMessage).then(() => {
+              task.status = 'processing';
+              this.$modal.showToast('宸插嚭鍙�');
+              // 杩欓噷鍙互璋冪敤API鏇存柊浠诲姟鐘舵��
+            }).catch(() => {});
+            break;
+          case 'arrive':
+            // 宸插埌杈炬搷浣�
+            this.$modal.confirm('宸茬粡鍒拌揪鐩殑鍦帮紝纭锛�').then(() => {
+              this.$modal.showToast('宸插埌杈�');
+              // 杩欓噷鍙互璋冪敤API鏇存柊浠诲姟鐘舵��
+            }).catch(() => {});
+            break;
+          case 'return':
+            // 杩旂▼鎿嶄綔
+            this.$modal.confirm('鐜板湪宸茬粡杩旂▼涓紝纭锛�').then(() => {
+              this.$modal.showToast('杩旂▼涓�');
+              // 杩欓噷鍙互璋冪敤API鏇存柊浠诲姟鐘舵��
+            }).catch(() => {});
+            break;
+          case 'settle':
+            // 缁撶畻鎿嶄綔锛岃烦杞埌缁撶畻椤甸潰
+            this.$tab.navigateTo(`/pages/task/settlement?id=${task.id}`);
+            break;
+          case 'complete':
+            // 宸插畬鎴愭搷浣�
+            this.$modal.confirm('浠诲姟鏄惁宸茬粡鍏ㄩ儴瀹屾垚锛岀‘璁わ紵').then(() => {
+              task.status = 'completed';
+              this.$modal.showToast('浠诲姟宸插畬鎴�');
+              // 杩欓噷鍙互璋冪敤API鏇存柊浠诲姟鐘舵��
+            }).catch(() => {});
+            break;
+        }
+      },
+      
+      getStatusText(status) {
+        const statusMap = {
+          'pending': '寰呭鐞�',
+          'processing': '澶勭悊涓�',
+          'completed': '宸插畬鎴�'
+        }
+        return statusMap[status] || '鏈煡'
+      },
+      
+      getTaskTypeText(type) {
+        const typeMap = {
+          'maintenance': '缁翠慨淇濆吇',
+          'refuel': '鍔犳补',
+          'inspection': '宸℃',
+          'emergency': '鎬ユ晳杞繍',
+          'welfare': '绂忕杞�'
+        }
+        return typeMap[type] || '鏈煡绫诲瀷'
+      }
     }
   }
 </script>
 
-<style>
-  .content {
+<style lang="scss">
+  .home-container {
+    padding: 20rpx;
+    background-color: #f5f5f5;
+    height: 100vh;
     display: flex;
     flex-direction: column;
-    align-items: center;
-    justify-content: center;
+    // 闅愯棌婊氬姩鏉′絾淇濇寔婊氬姩鍔熻兘
+    ::-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+ */
+    }
   }
-
-  .logo {
-    height: 200rpx;
-    width: 200rpx;
-    margin-top: 200rpx;
-    margin-left: auto;
-    margin-right: auto;
-    margin-bottom: 50rpx;
+  
+  // 鐢ㄦ埛淇℃伅鍖哄煙
+  .user-info-section {
+    background-color: white;
+    border-radius: 15rpx;
+    padding: 30rpx;
+    margin-bottom: 20rpx;
+    box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05);
+    flex-shrink: 0; // 闃叉鏀剁缉
+    
+    .user-info-content {
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+      
+      .user-details {
+        .user-name {
+          font-size: 36rpx;
+          font-weight: bold;
+          margin-bottom: 10rpx;
+          color: #333;
+        }
+        
+        .vehicle-info {
+          font-size: 28rpx;
+          color: #666;
+        }
+      }
+      
+      .bind-vehicle-btn {
+        background-color: #007AFF;
+        color: white;
+        border-radius: 10rpx;
+        padding: 15rpx 30rpx;
+        font-size: 28rpx;
+      }
+    }
   }
-
-  .text-area {
+  
+  // 娑堟伅鍏ュ彛
+  .message-entry {
     display: flex;
-    justify-content: center;
+    align-items: center;
+    background-color: white;
+    border-radius: 15rpx;
+    padding: 30rpx;
+    margin-bottom: 20rpx;
+    box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05);
+    position: relative;
+    
+    .message-icon {
+      margin-right: 20rpx;
+    }
+    
+    .message-text {
+      flex: 1;
+      font-size: 32rpx;
+      color: #333;
+    }
+    
+    .unread-dot {
+      position: absolute;
+      top: 15rpx;
+      right: 60rpx;
+      background-color: #ff4d4f;
+      color: white;
+      border-radius: 50%;
+      width: 32rpx;
+      height: 32rpx;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      font-size: 20rpx;
+    }
+    
+    .arrow {
+      margin-left: 20rpx;
+    }
   }
-
-  .title {
-    font-size: 36rpx;
-    color: #8f8f94;
+  
+  // 姝e湪杩愯鐨勪换鍔℃爣棰�
+  .running-tasks-header {
+    margin-bottom: 20rpx;
+    flex-shrink: 0; // 闃叉鏀剁缉
+    
+    .header-title {
+      font-size: 36rpx;
+      font-weight: bold;
+      color: #333;
+    }
   }
-</style>
+  
+  // 姝e湪杩愯鐨勪换鍔″垪琛�
+  .running-tasks-section {
+    flex: 1;
+    background-color: white;
+    border-radius: 15rpx;
+    padding: 30rpx;
+    box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05);
+    // 闅愯棌婊氬姩鏉′絾淇濇寔婊氬姩鍔熻兘
+    ::-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+ */
+    }
+    
+    .task-list {
+      .task-item {
+        background-color: #fafafa;
+        border-radius: 15rpx;
+        margin-bottom: 30rpx;
+        overflow: hidden;
+        
+        .task-main {
+          padding: 30rpx;
+          border-bottom: 1rpx solid #f0f0f0;
+          
+          .task-title {
+            font-size: 32rpx;
+            font-weight: bold;
+            margin-bottom: 20rpx;
+          }
+          
+          .task-info {
+            .info-row {
+              display: flex;
+              margin-bottom: 15rpx;
+              
+              &:last-child {
+                margin-bottom: 0;
+              }
+              
+              .info-item {
+                flex: 1;
+                display: flex;
+                
+                .label {
+                  font-size: 26rpx;
+                  color: #666;
+                  margin-right: 10rpx;
+                  white-space: nowrap;
+                }
+                
+                .value {
+                  font-size: 26rpx;
+                  flex: 1;
+                  word-break: break-all;
+                }
+              }
+            }
+          }
+        }
+        
+        .task-actions {
+          display: flex;
+          padding: 20rpx;
+          
+          .action-btn {
+            flex: 1;
+            height: 70rpx;
+            border-radius: 10rpx;
+            font-size: 26rpx;
+            margin: 0 5rpx;
+            background-color: #f0f0f0;
+            color: #333;
+            
+            &.primary {
+              background-color: #007AFF;
+              color: white;
+            }
+            
+            &.disabled {
+              opacity: 0.5;
+            }
+            
+            &:first-child {
+              margin-left: 0;
+            }
+            
+            &:last-child {
+              margin-right: 0;
+            }
+          }
+        }
+      }
+      
+      .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