From 1626d13ec8b1a63676e63cf95c5004c4118da3b3 Mon Sep 17 00:00:00 2001
From: wlzboy <66905212@qq.com>
Date: 星期日, 26 十月 2025 14:59:48 +0800
Subject: [PATCH] feat:移除app 中我的栏目中不要的功能

---
 app/pages.json                                 |    4 
 app/pages/mine/avatar/index.vue                |    3 
 app/App.vue                                    |   58 +
 app/manifest.json                              |    2 
 app/pages/mine/index.vue                       |  222 +--
 app/pages/task/create-emergency.vue            |    2 
 prd/急救转运改为转运任务修改说明.md                          |  221 ++++
 prd/我的页面菜单样式修复.md                              |  234 ++++
 sql/fix_null_task_fields.sql                   |   50 +
 prd/我的页面方法未找到问题排查.md                           |  303 ++++++
 app/pages/task/settlement.vue                  |    2 
 app/pages/task/detail.vue                      |  102 +
 app/pages/task/create.vue                      |    2 
 prd/任务详情页面显示问题完整修复.md                          |  362 +++++++
 app/pages/index.vue                            |   36 
 app/pages/mine/setting/index.vue               |    4 
 prd/任务详情null值显示问题修复说明.md                       |  200 ++++
 app/pages/message/index.vue                    |   32 
 app/pages/task/index.vue                       |   18 
 prd/微信小程序API兼容性优化说明.md                         |  115 ++
 ruoyi-admin/src/main/resources/application.yml |    2 
 prd/消息TabBar徽标显示功能说明.md                        |  317 ++++++
 app/config.js                                  |    8 
 app/utils/common.js                            |   86 +
 prd/任务详情显示修复-最终版本.md                           |  221 ++++
 prd/我的页面精简优化说明.md                              |  347 ++++++
 26 files changed, 2,732 insertions(+), 221 deletions(-)

diff --git a/app/App.vue b/app/App.vue
index 797f513..3610e7c 100644
--- a/app/App.vue
+++ b/app/App.vue
@@ -2,10 +2,17 @@
   import config from './config'
   import store from '@/store'
   import { getToken } from '@/utils/auth'
+  import { getUnreadCount } from '@/api/message'
 
   export default {
     onLaunch: function() {
       this.initApp()
+    },
+    onShow: function() {
+      // 搴旂敤鏄剧ず鏃跺埛鏂版湭璇绘秷鎭暟閲�
+      if (getToken()) {
+        this.updateUnreadMessageBadge()
+      }
     },
     methods: {
       // 鍒濆鍖栧簲鐢�
@@ -16,6 +23,13 @@
         //#ifdef H5
         this.checkLogin()
         //#endif
+        
+        // 濡傛灉宸茬櫥褰曪紝鍚姩鏈娑堟伅杞
+        if (getToken()) {
+          this.updateUnreadMessageBadge()
+          // 姣�30绉掕疆璇竴娆�
+          this.startMessagePolling()
+        }
       },
       initConfig() {
         this.globalData.config = config
@@ -24,6 +38,50 @@
         if (!getToken()) {
           this.$tab.reLaunch('/pages/login') 
         }
+      },
+      
+      // 鏇存柊鏈娑堟伅寰芥爣
+      updateUnreadMessageBadge() {
+        getUnreadCount().then(response => {
+          const count = response.data || 0
+          console.log('鏈娑堟伅鏁伴噺:', count)
+          
+          if (count > 0) {
+            // 璁剧疆寰芥爣
+            uni.setTabBarBadge({
+              index: 3, // 娑堟伅椤甸潰鍦╰abBar涓殑绱㈠紩浣嶇疆锛�0寮�濮嬶級
+              text: count > 99 ? '99+' : count.toString()
+            })
+          } else {
+            // 绉婚櫎寰芥爣
+            uni.removeTabBarBadge({
+              index: 3
+            })
+          }
+        }).catch(error => {
+          console.error('鑾峰彇鏈娑堟伅鏁伴噺澶辫触:', error)
+        })
+      },
+      
+      // 鍚姩娑堟伅杞
+      startMessagePolling() {
+        // 姣�30绉掕疆璇竴娆�
+        this.messagePollingTimer = setInterval(() => {
+          if (getToken()) {
+            this.updateUnreadMessageBadge()
+          } else {
+            // 濡傛灉鐢ㄦ埛宸茬櫥鍑猴紝鍋滄杞
+            this.stopMessagePolling()
+          }
+        }, 30000) // 30绉�
+      },
+      
+      // 鍋滄娑堟伅杞
+      stopMessagePolling() {
+        if (this.messagePollingTimer) {
+          clearInterval(this.messagePollingTimer)
+          this.messagePollingTimer = null
+        }
       }
     }
   }
diff --git a/app/config.js b/app/config.js
index 4ca54be..6ec3f59 100644
--- a/app/config.js
+++ b/app/config.js
@@ -9,17 +9,17 @@
 const ENV_CONFIG = {
   // 鏈湴寮�鍙戠幆澧�
   development: {
-    baseUrl: `http://${LOCAL_IP}:8080`,
+    baseUrl: `https://dsp.966120.com.cn`,
     description: '鏈湴寮�鍙戠幆澧�'
   },
   // 娴嬭瘯鐜
   test: {
-    baseUrl: 'http://test.yourdomain.com',
+    baseUrl: 'https://dsp.966120.com.cn',
     description: '娴嬭瘯鐜'
   },
   // 鐢熶骇鐜
   production: {
-    baseUrl: 'https://api.yourdomain.com',
+    baseUrl: 'https://dsp.966120.com.cn',
     description: '鐢熶骇鐜'
   }
 }
@@ -41,7 +41,7 @@
     // 搴旂敤logo
     logo: "/static/logo.png",
     // 瀹樻柟缃戠珯
-    site_url: "http://ruoyi.vip",
+    site_url: "http://www.966120.com.cn",
     
     // 褰撳墠鐜淇℃伅锛堜粎寮�鍙戞椂鏄剧ず锛�
     env: CURRENT_ENV,
diff --git a/app/manifest.json b/app/manifest.json
index b02e2fa..59aeb3c 100644
--- a/app/manifest.json
+++ b/app/manifest.json
@@ -72,7 +72,7 @@
             "port" : 9090,
             "https" : false
         },
-        "title" : "RuoYi-App",
+        "title" : "骞夸笢姘戣埅灏忕▼搴�",
         "router" : {
             "mode" : "hash",
             "base" : "./"
diff --git a/app/pages.json b/app/pages.json
index 3b256bc..6aa3977 100644
--- a/app/pages.json
+++ b/app/pages.json
@@ -108,7 +108,7 @@
   }, {
     "path": "pages/task/create-emergency",
     "style": {
-      "navigationBarTitleText": "鍒涘缓鎬ユ晳杞繍浠诲姟"
+      "navigationBarTitleText": "鍒涘缓杞繍浠诲姟"
     }
   }, {
     "path": "pages/task/create-welfare",
@@ -166,7 +166,7 @@
   },
   "globalStyle": {
     "navigationBarTextStyle": "black",
-    "navigationBarTitleText": "RuoYi",
+    "navigationBarTitleText": "骞夸笢姘戣埅",
     "navigationBarBackgroundColor": "#FFFFFF"
   }
 }
\ No newline at end of file
diff --git a/app/pages/index.vue b/app/pages/index.vue
index 62a019b..ea9ae6d 100644
--- a/app/pages/index.vue
+++ b/app/pages/index.vue
@@ -163,6 +163,7 @@
   import { getUserProfile } from '@/api/system/user'
   import { getUserBoundVehicle } from '@/api/vehicle'
   import { getUnreadCount } from '@/api/message'
+  import { formatDateTime } from '@/utils/common'
   
   export default {
     data() {
@@ -248,10 +249,26 @@
         getUnreadCount().then(response => {
           if (response.code === 200) {
             this.unreadMessageCount = response.data || 0
+            // 鏇存柊TabBar寰芥爣
+            this.updateTabBarBadge(this.unreadMessageCount)
           }
         }).catch(error => {
           console.error('鑾峰彇鏈娑堟伅鏁伴噺澶辫触:', error)
         })
+      },
+      
+      // 鏇存柊TabBar寰芥爣
+      updateTabBarBadge(count) {
+        if (count > 0) {
+          uni.setTabBarBadge({
+            index: 3, // 娑堟伅椤甸潰鍦╰abBar涓殑绱㈠紩
+            text: count > 99 ? '99+' : count.toString()
+          })
+        } else {
+          uni.removeTabBarBadge({
+            index: 3
+          })
+        }
       },
       
       // 鍔犺浇鐢ㄦ埛淇℃伅锛堜繚鐣欎互鍏煎涔嬪墠鐨勪唬鐮侊級
@@ -315,7 +332,7 @@
                 vehicleList: task.assignedVehicles || [],
                 startLocation: this.formatAddress(task.departureAddress || task.startLocation || '鏈缃�'),
                 endLocation: this.formatAddress(task.destinationAddress || task.endLocation || '鏈缃�'),
-                startTime: task.plannedStartTime ? this.formatDateTime(task.plannedStartTime) : '鏈缃�',
+                startTime: task.plannedStartTime ? formatDateTime(task.plannedStartTime, 'YYYY-MM-DD HH:mm') : '鏈缃�',
                 assignee: task.assigneeName || '鏈垎閰�',
                 taskNo: task.taskCode || '鏈煡缂栧彿',
                 status: this.convertStatus(task.taskStatus) // 杞崲鐘舵�佹牸寮忎互鍏煎鏃I
@@ -324,19 +341,6 @@
         }).catch(error => {
           this.loading = false
           console.error('鍔犺浇浠诲姟鍒楄〃澶辫触:', error)
-        })
-      },
-      
-      // 鏍煎紡鍖栨棩鏈熸椂闂�
-      formatDateTime(dateTime) {
-        if (!dateTime) return ''
-        const date = new Date(dateTime)
-        return date.toLocaleString('zh-CN', {
-          year: 'numeric',
-          month: '2-digit',
-          day: '2-digit',
-          hour: '2-digit',
-          minute: '2-digit'
         })
       },
       
@@ -528,13 +532,13 @@
           'MAINTENANCE': '缁翠慨淇濆吇',
           'FUEL': '鍔犳补',
           'OTHER': '鍏朵粬',
-          'EMERGENCY_TRANSFER': '鎬ユ晳杞繍',
+          'EMERGENCY_TRANSFER': '杞繍浠诲姟',
           'WELFARE': '绂忕杞�',
           // 鏃ф牸寮忥紙UI绫诲瀷锛�
           'maintenance': '缁翠慨淇濆吇',
           'refuel': '鍔犳补',
           'inspection': '宸℃',
-          'emergency': '鎬ユ晳杞繍',
+          'emergency': '杞繍浠诲姟',
           'welfare': '绂忕杞�'
         }
         return typeMap[type] || '鏈煡绫诲瀷'
diff --git a/app/pages/message/index.vue b/app/pages/message/index.vue
index e3dd348..58bca52 100644
--- a/app/pages/message/index.vue
+++ b/app/pages/message/index.vue
@@ -10,7 +10,7 @@
         <view 
           class="message-item" 
           v-for="message in sortedMessages" 
-          :key="message.id"
+          :key="message.messageId"
           @click="viewMessageDetail(message)"
         >
           <view class="message-main">
@@ -62,6 +62,8 @@
     onShow() {
       // 姣忔鏄剧ず椤甸潰鏃跺埛鏂版秷鎭�
       this.loadMessages()
+      // 鏇存柊TabBar寰芥爣
+      this.updateTabBarBadge()
     },
     onPullDownRefresh() {
       this.loadMessages().then(() => {
@@ -101,10 +103,19 @@
       // 鏌ョ湅娑堟伅璇︽儏锛堣烦杞埌浠诲姟璇︽儏锛�
       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()
           }
           
           // 璺宠浆鍒颁换鍔¤鎯呴〉闈�
@@ -116,10 +127,27 @@
         } catch (error) {
           console.error('鏍囪娑堟伅宸茶澶辫触锛�', error)
           // 鍗充娇鏍囪澶辫触锛屼篃鍏佽璺宠浆
-          if (message.taskId) {
+          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
+          })
+        }
       }
     }
   }
diff --git a/app/pages/mine/avatar/index.vue b/app/pages/mine/avatar/index.vue
index 7a874bd..5f1b2ca 100644
--- a/app/pages/mine/avatar/index.vue
+++ b/app/pages/mine/avatar/index.vue
@@ -40,9 +40,10 @@
   import config from '@/config'
   import store from "@/store"
   import { uploadAvatar } from "@/api/system/user"
+  import { getSystemInfo } from '@/utils/common'
   
   const baseUrl = config.baseUrl
-	let sysInfo = uni.getSystemInfoSync()
+	const sysInfo = getSystemInfo()
 	let SCREEN_WIDTH = sysInfo.screenWidth
 	let PAGE_X, // 鎵嬫寜涓嬬殑x浣嶇疆
 		PAGE_Y, // 鎵嬫寜涓媦鐨勪綅缃� 
diff --git a/app/pages/mine/index.vue b/app/pages/mine/index.vue
index 48b20a6..e6ccd74 100644
--- a/app/pages/mine/index.vue
+++ b/app/pages/mine/index.vue
@@ -14,7 +14,7 @@
           </view>
           <view v-if="name" @click="handleToInfo" class="user-info">
             <view class="u_title">
-              鐢ㄦ埛鍚嶏細{{ name }}
+              {{ name }}
             </view>
           </view>
         </view>
@@ -26,34 +26,19 @@
     </view>
 
     <scroll-view class="content-section" scroll-y="true">
-      <view class="mine-actions grid col-4 text-center">
-        <view class="action-item" @click="handleJiaoLiuQun">
-          <view class="iconfont icon-friendfill text-pink icon"></view>
-          <text class="text">浜ゆ祦缇�</text>
-        </view>
-        <view class="action-item" @click="handleBuilding">
-          <view class="iconfont icon-service text-blue icon"></view>
-          <text class="text">鍦ㄧ嚎瀹㈡湇</text>
-        </view>
-        <view class="action-item" @click="handleBuilding">
-          <view class="iconfont icon-community text-mauve icon"></view>
-          <text class="text">鍙嶉绀惧尯</text>
-        </view>
-        <view class="action-item" @click="handleBuilding">
-          <view class="iconfont icon-dianzan text-green icon"></view>
-          <text class="text">鐐硅禐鎴戜滑</text>
-        </view>
-      </view>
-
       <!-- 鐢ㄦ埛淇℃伅灞曠ず -->
       <view class="user-info-section">
         <view class="info-item">
-          <view class="info-label">鐢ㄦ埛鍚嶏細</view>
+          <view class="info-label">鏄电О锛�</view>
           <view class="info-value">{{ name || '鏈櫥褰�' }}</view>
         </view>
         <view class="info-item">
           <view class="info-label">鎵嬫満鍙风爜锛�</view>
           <view class="info-value">{{ phonenumber || '鏈粦瀹�' }}</view>
+        </view>
+        <view class="info-item">
+          <view class="info-label">鎵�灞炲垎鍏徃锛�</view>
+          <view class="info-value">{{ deptName || '鏈缃�' }}</view>
         </view>
         <view class="info-item">
           <view class="info-label">缁戝畾杞﹁締锛�</view>
@@ -63,51 +48,22 @@
           <view class="info-label">App鐗堟湰鍙凤細</view>
           <view class="info-value">{{ version || '1.0.0' }}</view>
         </view>
-        
-        <!-- 缁戝畾/瑙g粦杞﹁締鎿嶄綔 -->
-        <view class="vehicle-actions" v-if="boundVehicle && boundVehicle !== '鏈粦瀹�'">
-          <button class="unbind-btn" @click="unbindVehicle">鍙栨秷缁戝畾杞﹁締</button>
-        </view>
-        <view class="vehicle-actions" v-else>
-          <button class="bind-btn" @click="goToBindVehicle">缁戝畾杞﹁締</button>
-        </view>
       </view>
 
       <view class="menu-list">
-        <view class="list-cell list-cell-arrow" @click="handleToEditInfo">
+        <!-- 缁戝畾/瑙g粦杞﹁締 -->
+        <view class="list-cell list-cell-arrow" @click="handleVehicleBinding">
           <view class="menu-item-box">
-            <view class="iconfont icon-user menu-icon"></view>
-            <view>缂栬緫璧勬枡</view>
+            <view class="iconfont icon-car menu-icon"></view>
+            <view>{{ boundVehicle && boundVehicle !== '鏈粦瀹�' ? '鏇存崲杞﹁締' : '缁戝畾杞﹁締' }}</view>
           </view>
         </view>
-        <view class="list-cell list-cell-arrow" @click="handleUserAgreement">
+        
+        <!-- 閫�鍑虹櫥褰� -->
+        <view class="list-cell list-cell-arrow" @click="handleLogout">
           <view class="menu-item-box">
-            <view class="iconfont icon-text menu-icon"></view>
-            <view>鐢ㄦ埛鏈嶅姟鍗忚</view>
-          </view>
-        </view>
-        <view class="list-cell list-cell-arrow" @click="handlePrivacyPolicy">
-          <view class="menu-item-box">
-            <view class="iconfont icon-safe menu-icon"></view>
-            <view>闅愮鏀跨瓥</view>
-          </view>
-        </view>
-        <view class="list-cell list-cell-arrow" @click="handleHelp">
-          <view class="menu-item-box">
-            <view class="iconfont icon-help menu-icon"></view>
-            <view>甯歌闂</view>
-          </view>
-        </view>
-        <view class="list-cell list-cell-arrow" @click="handleAbout">
-          <view class="menu-item-box">
-            <view class="iconfont icon-aixin menu-icon"></view>
-            <view>鍏充簬鎴戜滑</view>
-          </view>
-        </view>
-        <view class="list-cell list-cell-arrow" @click="handleToSetting">
-          <view class="menu-item-box">
-            <view class="iconfont icon-setting menu-icon"></view>
-            <view>搴旂敤璁剧疆</view>
+            <view class="iconfont icon-logout menu-icon text-red"></view>
+            <view class="text-red">閫�鍑虹櫥褰�</view>
           </view>
         </view>
       </view>
@@ -119,12 +75,14 @@
   import storage from '@/utils/storage'
   import { getUserProfile } from "@/api/system/user"
   import { getUserBoundVehicle, unbindVehicleFromUser } from '@/api/vehicle'
+  import { getSystemInfo } from '@/utils/common'
   
   export default {
     data() {
       return {
         name: this.$store.state.user.nickName,
         phonenumber: '',
+        deptName: '', // 鎵�灞炲垎鍏徃
         boundVehicle: '', // 缁戝畾鐨勮溅杈嗕俊鎭�
         boundVehicleId: null, // 缁戝畾鐨勮溅杈咺D
         version: getApp().globalData.config.appInfo.version
@@ -135,10 +93,14 @@
         return this.$store.state.user.avatar
       },
       windowHeight() {
-        return uni.getSystemInfoSync().windowHeight - 50
+        return getSystemInfo().windowHeight - 50
       }
     },
     onLoad() {
+      this.getUserInfo()
+    },
+    onShow() {
+      // 姣忔鏄剧ず椤甸潰鏃跺埛鏂扮敤鎴蜂俊鎭�
       this.getUserInfo()
     },
     methods: {
@@ -149,12 +111,14 @@
         // 鑾峰彇鐢ㄦ埛鍩烘湰淇℃伅
         getUserProfile().then(response => {
           const user = response.data
-          this.name = user.userName
+          this.name = user.nickName || user.userName // 浼樺厛浣跨敤鏄电О
           this.phonenumber = user.phonenumber
+          this.deptName = user.dept ? user.dept.deptName : '鏈缃�'
         }).catch(() => {
           // 鑾峰彇鐢ㄦ埛淇℃伅澶辫触鏃朵娇鐢ㄩ粯璁ゅ��
           this.name = this.$store.state.user.nickName || '鏈櫥褰�'
           this.phonenumber = '鏈粦瀹�'
+          this.deptName = '鏈缃�'
         })
         
         // 鑾峰彇鐢ㄦ埛缁戝畾鐨勮溅杈嗕俊鎭�
@@ -175,40 +139,9 @@
         }
       },
       
-      // 璺宠浆鍒扮粦瀹氳溅杈嗛〉闈�
-      goToBindVehicle() {
+      // 澶勭悊杞﹁締缁戝畾鎿嶄綔
+      handleVehicleBinding() {
         this.$tab.navigateTo('/pages/bind-vehicle')
-      },
-      
-      // 鍙栨秷缁戝畾杞﹁締
-      unbindVehicle() {
-        const userId = this.$store.state.user.userId
-        const vehicleId = this.boundVehicleId
-        
-        if (!userId || !vehicleId) {
-          this.$modal.showToast('鏃犳硶鑾峰彇缁戝畾淇℃伅')
-          return
-        }
-        
-        this.$modal.confirm(`纭鍙栨秷缁戝畾杞﹁締 ${this.boundVehicle} 鍚楋紵`).then(() => {
-          // 璋冪敤API鍙栨秷缁戝畾杞﹁締
-          unbindVehicleFromUser(userId, vehicleId).then(response => {
-            if (response.code === 200) {
-              this.boundVehicle = '鏈粦瀹�'
-              this.boundVehicleId = null
-              this.$modal.showToast('鍙栨秷缁戝畾鎴愬姛')
-              // 鏇存柊鐢ㄦ埛淇℃伅
-              this.$store.dispatch('GetInfo')
-            } else {
-              this.$modal.showToast(response.msg || '鍙栨秷缁戝畾澶辫触')
-            }
-          }).catch(error => {
-            console.error('鍙栨秷缁戝畾澶辫触:', error)
-            this.$modal.showToast('鍙栨秷缁戝畾澶辫触锛岃閲嶈瘯')
-          })
-        }).catch(() => {
-          // 鐢ㄦ埛鍙栨秷鎿嶄綔
-        })
       },
       
       handleToInfo() {
@@ -227,29 +160,11 @@
         this.$tab.navigateTo('/pages/mine/avatar/index')
       },
       handleLogout() {
-        this.$modal.confirm('纭畾娉ㄩ攢骞堕��鍑虹郴缁熷悧锛�').then(() => {
+        this.$modal.confirm('纭畾閫�鍑虹櫥褰曞悧锛�').then(() => {
           this.$store.dispatch('LogOut').then(() => {
-            this.$tab.reLaunch('/pages/index')
+            this.$tab.reLaunch('/pages/login')
           })
         })
-      },
-      handleHelp() {
-        this.$tab.navigateTo('/pages/mine/help/index')
-      },
-      handleAbout() {
-        this.$tab.navigateTo('/pages/mine/about/index')
-      },
-      handleUserAgreement() {
-        this.$tab.navigateTo('/pages/mine/user-agreement/index')
-      },
-      handlePrivacyPolicy() {
-        this.$tab.navigateTo('/pages/mine/privacy-policy/index')
-      },
-      handleJiaoLiuQun() {
-        this.$modal.showToast('QQ缇わ細鈶�133713780(婊�)銆佲憽146013835(婊�)銆佲憿189091635')
-      },
-      handleBuilding() {
-        this.$modal.showToast('妯″潡寤鸿涓瓇')
       }
     }
   }
@@ -333,25 +248,6 @@
       * {
         -ms-overflow-style: none; /* IE 10+ */
       }
-
-      .mine-actions {
-        margin: 15px 15px;
-        padding: 20px 0px;
-        border-radius: 8px;
-        background-color: white;
-
-        .action-item {
-          .icon {
-            font-size: 28px;
-          }
-
-          .text {
-            display: block;
-            font-size: 13px;
-            margin: 8px 0px;
-          }
-        }
-      }
       
       // 鐢ㄦ埛淇℃伅灞曠ず鍖哄煙
       .user-info-section {
@@ -383,26 +279,58 @@
             flex: 1;
           }
         }
+      }
+      
+      // 鑿滃崟鍒楄〃鏍峰紡
+      .menu-list {
+        background-color: white;
+        border-radius: 8px;
+        margin: 15rpx;
+        overflow: hidden;
         
-        .vehicle-actions {
-          padding: 30rpx 0 10rpx 0;
-          text-align: center;
+        .list-cell {
+          padding: 30rpx;
+          border-bottom: 1rpx solid #f0f0f0;
+          cursor: pointer;
+          transition: background-color 0.2s;
           
-          .bind-btn, .unbind-btn {
-            width: 80%;
-            height: 80rpx;
-            border-radius: 10rpx;
-            font-size: 32rpx;
+          &:last-child {
+            border-bottom: none;
           }
           
-          .bind-btn {
-            background-color: #007AFF;
-            color: white;
+          &:active {
+            background-color: #f5f5f5;
           }
           
-          .unbind-btn {
-            background-color: #ff4d4f;
-            color: white;
+          .menu-item-box {
+            display: flex;
+            align-items: center;
+            justify-content: space-between;
+            
+            .menu-icon {
+              font-size: 36rpx;
+              margin-right: 20rpx;
+            }
+            
+            view {
+              flex: 1;
+              font-size: 32rpx;
+              color: #333;
+            }
+            
+            .text-red {
+              color: #ff4d4f;
+            }
+          }
+          
+          &.list-cell-arrow .menu-item-box::after {
+            content: '';
+            width: 16rpx;
+            height: 16rpx;
+            border-top: 2rpx solid #999;
+            border-right: 2rpx solid #999;
+            transform: rotate(45deg);
+            margin-left: 20rpx;
           }
         }
       }
diff --git a/app/pages/mine/setting/index.vue b/app/pages/mine/setting/index.vue
index 0f9f058..044103c 100644
--- a/app/pages/mine/setting/index.vue
+++ b/app/pages/mine/setting/index.vue
@@ -31,10 +31,12 @@
 </template>
 
 <script>
+  import { getSystemInfo } from '@/utils/common'
+  
   export default {
     data() {
       return {
-        windowHeight: uni.getSystemInfoSync().windowHeight
+        windowHeight: getSystemInfo().windowHeight
       }
     },
     methods: {
diff --git a/app/pages/task/create-emergency.vue b/app/pages/task/create-emergency.vue
index 1810257..a056049 100644
--- a/app/pages/task/create-emergency.vue
+++ b/app/pages/task/create-emergency.vue
@@ -4,7 +4,7 @@
       <view class="back-btn" @click="goBack">
         <uni-icons type="arrowleft" size="20"></uni-icons>
       </view>
-      <view class="title">鍒涘缓鎬ユ晳杞繍浠诲姟</view>
+      <view class="title">鍒涘缓杞繍浠诲姟</view>
     </view>
     
     <view class="form-section">
diff --git a/app/pages/task/create.vue b/app/pages/task/create.vue
index b757c79..948f6af 100644
--- a/app/pages/task/create.vue
+++ b/app/pages/task/create.vue
@@ -32,7 +32,7 @@
       taskCategories: [
         {
           type: 'emergency',
-          name: '鎬ユ晳杞繍',
+          name: '杞繍浠诲姟',
           icon: 'hospital',
           color: '#E54D42',
           description: '绱ф�ュ尰鐤楄浆杩愪换鍔�',
diff --git a/app/pages/task/detail.vue b/app/pages/task/detail.vue
index f58d624..e4cdcbc 100644
--- a/app/pages/task/detail.vue
+++ b/app/pages/task/detail.vue
@@ -16,12 +16,12 @@
         </view>
         <view class="info-item">
           <view class="label">浠诲姟绫诲瀷</view>
-          <view class="value">{{ getTaskTypeText(taskDetail.taskType) }}</view>
+          <view class="value">{{ displayTaskType }}</view>
         </view>
         <view class="info-item">
           <view class="label">浠诲姟鐘舵��</view>
-          <view class="value status" :class="taskDetail.taskStatus === 'PENDING' ? 'pending' : taskDetail.taskStatus === 'DEPARTING' ? 'in_progress' : taskDetail.taskStatus === 'ARRIVED' ? 'in_progress' : taskDetail.taskStatus === 'RETURNING' ? 'in_progress' : taskDetail.taskStatus === 'IN_PROGRESS' ? 'in_progress' : taskDetail.taskStatus === 'COMPLETED' ? 'completed' : taskDetail.taskStatus === 'CANCELLED' ? 'cancelled' : ''">
-            {{ getStatusText(taskDetail.taskStatus) }}
+          <view class="value status" :class="statusClass">
+            {{ displayTaskStatus }}
           </view>
         </view>
         <view class="info-item">
@@ -38,25 +38,25 @@
         <view class="section-title">鏃堕棿淇℃伅</view>
         <view class="info-item">
           <view class="label">璁″垝寮�濮嬫椂闂�</view>
-          <view class="value">{{ formatDateTime(taskDetail.plannedStartTime) }}</view>
+          <view class="value">{{ displayPlannedStartTime }}</view>
         </view>
         <view class="info-item">
           <view class="label">璁″垝缁撴潫鏃堕棿</view>
-          <view class="value">{{ formatDateTime(taskDetail.plannedEndTime) }}</view>
+          <view class="value">{{ displayPlannedEndTime }}</view>
         </view>
         <view class="info-item" v-if="taskDetail.actualStartTime">
           <view class="label">瀹為檯寮�濮嬫椂闂�</view>
-          <view class="value">{{ formatDateTime(taskDetail.actualStartTime) }}</view>
+          <view class="value">{{ displayActualStartTime }}</view>
         </view>
         <view class="info-item" v-if="taskDetail.actualEndTime">
           <view class="label">瀹為檯缁撴潫鏃堕棿</view>
-          <view class="value">{{ formatDateTime(taskDetail.actualEndTime) }}</view>
+          <view class="value">{{ displayActualEndTime }}</view>
         </view>
       </view>
       
       <view class="detail-section">
         <view class="section-title">浣嶇疆淇℃伅</view>
-        <!-- 鎬ユ晳杞繍浠诲姟锛氭樉绀鸿浆鍑�/杞叆鍖婚櫌鍦板潃 -->
+        <!-- 杞繍浠诲姟锛氭樉绀鸿浆鍑�/杞叆鍖婚櫌鍦板潃 -->
         <template v-if="taskDetail.taskType === 'EMERGENCY_TRANSFER' && taskDetail.emergencyInfo">
           <view class="info-item" v-if="taskDetail.emergencyInfo.hospitalOutAddress">
             <view class="label">杞嚭鍖婚櫌</view>
@@ -106,7 +106,7 @@
         <view class="description">{{ taskDetail.remark }}</view>
       </view>
       
-      <!-- 鎬ユ晳杞繍浠诲姟鐗规湁淇℃伅 -->
+      <!-- 杞繍浠诲姟鐗规湁淇℃伅 -->
       <view class="detail-section" v-if="taskDetail.taskType === 'EMERGENCY_TRANSFER' && taskDetail.emergencyInfo">
         <view class="section-title">鎮h�呬俊鎭�</view>
         <view class="info-item" v-if="taskDetail.emergencyInfo.patientName">
@@ -135,7 +135,7 @@
         </view>
       </view>
       
-      <!-- 鎬ユ晳杞繍 - 杞嚭鍖婚櫌淇℃伅 -->
+      <!-- 杞繍 - 杞嚭鍖婚櫌淇℃伅 -->
       <view class="detail-section" v-if="taskDetail.taskType === 'EMERGENCY_TRANSFER' && taskDetail.emergencyInfo">
         <view class="section-title">杞嚭鍖婚櫌淇℃伅</view>
         <view class="info-item" v-if="taskDetail.emergencyInfo.hospitalOutName">
@@ -156,7 +156,7 @@
         </view>
       </view>
       
-      <!-- 鎬ユ晳杞繍 - 杞叆鍖婚櫌淇℃伅 -->
+      <!-- 杞繍 - 杞叆鍖婚櫌淇℃伅 -->
       <view class="detail-section" v-if="taskDetail.taskType === 'EMERGENCY_TRANSFER' && taskDetail.emergencyInfo">
         <view class="section-title">杞叆鍖婚櫌淇℃伅</view>
         <view class="info-item" v-if="taskDetail.emergencyInfo.hospitalInName">
@@ -177,7 +177,7 @@
         </view>
       </view>
       
-      <!-- 鎬ユ晳杞繍 - 璐圭敤淇℃伅 -->
+      <!-- 杞繍 - 璐圭敤淇℃伅 -->
       <view class="detail-section" v-if="taskDetail.taskType === 'EMERGENCY_TRANSFER' && taskDetail.emergencyInfo">
         <view class="section-title">璐圭敤淇℃伅</view>
         <view class="info-item" v-if="taskDetail.emergencyInfo.transferDistance">
@@ -315,12 +315,69 @@
 
 <script>
   import { getTask, changeTaskStatus } from '@/api/task'
+  import { formatDateTime } from '@/utils/common'
   
   export default {
     data() {
       return {
         taskDetail: null,
         taskId: null
+      }
+    },
+    computed: {
+      // 鏄剧ず浠诲姟绫诲瀷
+      displayTaskType() {
+        if (!this.taskDetail || !this.taskDetail.taskType) {
+          return '鏈缃�'
+        }
+        return this.getTaskTypeText(this.taskDetail.taskType)
+      },
+      // 鏄剧ず浠诲姟鐘舵��
+      displayTaskStatus() {
+        if (!this.taskDetail || !this.taskDetail.taskStatus) {
+          return '鏈缃�'
+        }
+        return this.getStatusText(this.taskDetail.taskStatus)
+      },
+      // 鐘舵�佹牱寮忕被
+      statusClass() {
+        if (!this.taskDetail || !this.taskDetail.taskStatus) {
+          return ''
+        }
+        const status = this.taskDetail.taskStatus
+        if (status === 'PENDING') return 'pending'
+        if (['DEPARTING', 'ARRIVED', 'RETURNING', 'IN_PROGRESS'].includes(status)) return 'in_progress'
+        if (status === 'COMPLETED') return 'completed'
+        if (status === 'CANCELLED') return 'cancelled'
+        return ''
+      },
+      // 鏄剧ず璁″垝寮�濮嬫椂闂�
+      displayPlannedStartTime() {
+        if (!this.taskDetail || !this.taskDetail.plannedStartTime) {
+          return '鏈缃�'
+        }
+        return formatDateTime(this.taskDetail.plannedStartTime, 'YYYY-MM-DD HH:mm')
+      },
+      // 鏄剧ず璁″垝缁撴潫鏃堕棿
+      displayPlannedEndTime() {
+        if (!this.taskDetail || !this.taskDetail.plannedEndTime) {
+          return '鏈缃�'
+        }
+        return formatDateTime(this.taskDetail.plannedEndTime, 'YYYY-MM-DD HH:mm')
+      },
+      // 鏄剧ず瀹為檯寮�濮嬫椂闂�
+      displayActualStartTime() {
+        if (!this.taskDetail || !this.taskDetail.actualStartTime) {
+          return '鏈缃�'
+        }
+        return formatDateTime(this.taskDetail.actualStartTime, 'YYYY-MM-DD HH:mm')
+      },
+      // 鏄剧ず瀹為檯缁撴潫鏃堕棿
+      displayActualEndTime() {
+        if (!this.taskDetail || !this.taskDetail.actualEndTime) {
+          return '鏈缃�'
+        }
+        return formatDateTime(this.taskDetail.actualEndTime, 'YYYY-MM-DD HH:mm')
       }
     },
     onLoad(options) {
@@ -338,7 +395,9 @@
         getTask(this.taskId).then(response => {
           this.taskDetail = response.data || response
           // 璋冭瘯锛氭墦鍗拌繑鍥炵殑鏁版嵁
-          console.log('浠诲姟璇︽儏鏁版嵁:', this.taskDetail)
+          console.log('浠诲姟璇︽儏瀹屾暣鏁版嵁:', JSON.stringify(this.taskDetail, null, 2))
+          console.log('浠诲姟绫诲瀷瀛楁鍊�:', this.taskDetail.taskType)
+          console.log('浠诲姟鐘舵�佸瓧娈靛��:', this.taskDetail.taskStatus)
           console.log('鍑哄彂鍦板潃:', this.taskDetail.departureAddress)
           console.log('鐩殑鍦板潃:', this.taskDetail.destinationAddress)
         }).catch(error => {
@@ -374,7 +433,7 @@
       
       // 鑾峰彇璺濈淇℃伅锛氭牴鎹换鍔$被鍨嬭繑鍥炰笉鍚屽瓧娈�
       getDistanceInfo(task) {
-        // 鎬ユ晳杞繍锛氫紭鍏堜娇鐢╰ransferDistance
+        // 杞繍锛氫紭鍏堜娇鐢╰ransferDistance
         if (task.taskType === 'EMERGENCY_TRANSFER' && task.emergencyInfo && task.emergencyInfo.transferDistance) {
           return task.emergencyInfo.transferDistance
         }
@@ -389,19 +448,6 @@
       // 杩斿洖涓婁竴椤�
       goBack() {
         uni.navigateBack()
-      },
-      
-      // 鏍煎紡鍖栨棩鏈熸椂闂�
-      formatDateTime(dateTime) {
-        if (!dateTime) return '鏈缃�'
-        const date = new Date(dateTime)
-        return date.toLocaleString('zh-CN', {
-          year: 'numeric',
-          month: '2-digit',
-          day: '2-digit',
-          hour: '2-digit',
-          minute: '2-digit'
-        })
       },
       
       // 鑾峰彇鐘舵�佹枃鏈�
@@ -424,7 +470,7 @@
           'MAINTENANCE': '缁翠慨淇濆吇',
           'FUEL': '鍔犳补',
           'OTHER': '鍏朵粬',
-          'EMERGENCY_TRANSFER': '鎬ユ晳杞繍',
+          'EMERGENCY_TRANSFER': '杞繍浠诲姟',
           'WELFARE': '绂忕杞�'
         }
         return typeMap[type] || '鏈煡绫诲瀷'
diff --git a/app/pages/task/index.vue b/app/pages/task/index.vue
index 6fa2349..c80265c 100644
--- a/app/pages/task/index.vue
+++ b/app/pages/task/index.vue
@@ -220,6 +220,7 @@
   import uniDatetimePicker from '@/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue'
   import { listTask, changeTaskStatus } from '@/api/task'
   import { mapState } from 'vuex'
+  import { formatDateTime } from '@/utils/common'
   
   export default {
     components: {
@@ -359,7 +360,7 @@
               vehicleList: task.assignedVehicles || [],
               startLocation: this.formatAddress(task.departureAddress || task.startLocation || '鏈缃�'),
               endLocation: this.formatAddress(task.destinationAddress || task.endLocation || '鏈缃�'),
-              startTime: task.plannedStartTime ? this.formatDateTime(task.plannedStartTime) : '鏈缃�',
+              startTime: task.plannedStartTime ? formatDateTime(task.plannedStartTime, 'YYYY-MM-DD HH:mm') : '鏈缃�',
               assignee: task.assigneeName || '鏈垎閰�'
             }
           })
@@ -367,19 +368,6 @@
           this.loading = false
           console.error('鍔犺浇浠诲姟鍒楄〃澶辫触:', error)
           this.$modal.showToast('鍔犺浇浠诲姟鍒楄〃澶辫触')
-        })
-      },
-      
-      // 鏍煎紡鍖栨棩鏈熸椂闂�
-      formatDateTime(dateTime) {
-        if (!dateTime) return ''
-        const date = new Date(dateTime)
-        return date.toLocaleString('zh-CN', {
-          year: 'numeric',
-          month: '2-digit',
-          day: '2-digit',
-          hour: '2-digit',
-          minute: '2-digit'
         })
       },
       
@@ -587,7 +575,7 @@
           'MAINTENANCE': '缁翠慨淇濆吇',
           'FUEL': '鍔犳补',
           'OTHER': '鍏朵粬',
-          'EMERGENCY_TRANSFER': '鎬ユ晳杞繍',
+          'EMERGENCY_TRANSFER': '杞繍浠诲姟',
           'WELFARE': '绂忕杞�'
         }
         return typeMap[type] || '鏈煡绫诲瀷'
diff --git a/app/pages/task/settlement.vue b/app/pages/task/settlement.vue
index 865269b..9cdffdc 100644
--- a/app/pages/task/settlement.vue
+++ b/app/pages/task/settlement.vue
@@ -239,7 +239,7 @@
           'maintenance': '缁翠慨淇濆吇',
           'refuel': '鍔犳补',
           'inspection': '宸℃',
-          'emergency': '鎬ユ晳杞繍',
+          'emergency': '杞繍浠诲姟',
           'welfare': '绂忕杞�'
         }
         return typeMap[type] || '鏈煡绫诲瀷'
diff --git a/app/utils/common.js b/app/utils/common.js
index 00d4137..4f095b9 100644
--- a/app/utils/common.js
+++ b/app/utils/common.js
@@ -51,4 +51,90 @@
     }
   }
   return result
+}
+
+/**
+ * 鏍煎紡鍖栨棩鏈熸椂闂达紙鍏煎iOS锛�
+ * @param dateTime 鏃ユ湡鏃堕棿瀛楃涓叉垨Date瀵硅薄
+ * @param format 鏍煎紡鍖栨ā鏉匡紝榛樿涓� 'YYYY-MM-DD HH:mm:ss'
+ * @returns {string} 鏍煎紡鍖栧悗鐨勬棩鏈熸椂闂村瓧绗︿覆
+ */
+export function formatDateTime(dateTime, format = 'YYYY-MM-DD HH:mm:ss') {
+  if (!dateTime) return ''
+  
+  let date
+  if (typeof dateTime === 'string') {
+    // iOS鍏煎鎬у鐞嗭細灏� "yyyy-MM-dd HH:mm:ss" 鏍煎紡杞崲涓� "yyyy/MM/dd HH:mm:ss"
+    const iosCompatibleDate = dateTime.replace(/-/g, '/')
+    date = new Date(iosCompatibleDate)
+  } else {
+    date = new Date(dateTime)
+  }
+  
+  // 妫�鏌ユ棩鏈熸槸鍚︽湁鏁�
+  if (isNaN(date.getTime())) {
+    console.warn('Invalid date:', dateTime)
+    return ''
+  }
+  
+  const year = date.getFullYear()
+  const month = String(date.getMonth() + 1).padStart(2, '0')
+  const day = String(date.getDate()).padStart(2, '0')
+  const hours = String(date.getHours()).padStart(2, '0')
+  const minutes = String(date.getMinutes()).padStart(2, '0')
+  const seconds = String(date.getSeconds()).padStart(2, '0')
+  
+  // 鏍规嵁format妯℃澘杩斿洖鏍煎紡鍖栫粨鏋�
+  if (format === 'YYYY-MM-DD') {
+    return `${year}-${month}-${day}`
+  } else if (format === 'YYYY-MM-DD HH:mm') {
+    return `${year}-${month}-${day} ${hours}:${minutes}`
+  } else if (format === 'MM-DD HH:mm') {
+    return `${month}-${day} ${hours}:${minutes}`
+  } else {
+    return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`
+  }
+}
+
+/**
+ * 鑾峰彇绯荤粺淇℃伅锛堝吋瀹规柊鏃PI锛�
+ * 鏇夸唬宸插簾寮冪殑uni.getSystemInfoSync()
+ * @returns {Object} 绯荤粺淇℃伅瀵硅薄
+ */
+export function getSystemInfo() {
+  // #ifdef MP-WEIXIN
+  // 寰俊灏忕▼搴忎娇鐢ㄦ柊API
+  try {
+    const windowInfo = uni.getWindowInfo()
+    const deviceInfo = uni.getDeviceInfo()
+    const appBaseInfo = uni.getAppBaseInfo()
+    
+    return {
+      ...windowInfo,
+      ...deviceInfo,
+      ...appBaseInfo,
+      // 鍏煎鏃у瓧娈靛悕
+      windowHeight: windowInfo.windowHeight,
+      windowWidth: windowInfo.windowWidth,
+      screenHeight: windowInfo.screenHeight,
+      screenWidth: windowInfo.screenWidth,
+      statusBarHeight: windowInfo.statusBarHeight,
+      platform: deviceInfo.platform,
+      system: deviceInfo.system,
+      model: deviceInfo.model,
+      brand: deviceInfo.brand,
+      SDKVersion: appBaseInfo.SDKVersion,
+      version: appBaseInfo.version
+    }
+  } catch (e) {
+    // 闄嶇骇浣跨敤鏃PI
+    console.warn('鏂癆PI璋冪敤澶辫触锛岄檷绾т娇鐢ㄦ棫API', e)
+    return uni.getSystemInfoSync()
+  }
+  // #endif
+  
+  // #ifndef MP-WEIXIN
+  // 鍏朵粬骞冲彴缁х画浣跨敤鏃PI
+  return uni.getSystemInfoSync()
+  // #endif
 }
\ No newline at end of file
diff --git "a/prd/\344\273\273\345\212\241\350\257\246\346\203\205null\345\200\274\346\230\276\347\244\272\351\227\256\351\242\230\344\277\256\345\244\215\350\257\264\346\230\216.md" "b/prd/\344\273\273\345\212\241\350\257\246\346\203\205null\345\200\274\346\230\276\347\244\272\351\227\256\351\242\230\344\277\256\345\244\215\350\257\264\346\230\216.md"
new file mode 100644
index 0000000..894f9be
--- /dev/null
+++ "b/prd/\344\273\273\345\212\241\350\257\246\346\203\205null\345\200\274\346\230\276\347\244\272\351\227\256\351\242\230\344\277\256\345\244\215\350\257\264\346\230\216.md"
@@ -0,0 +1,200 @@
+# 浠诲姟璇︽儏椤甸潰null鍊兼樉绀洪棶棰樹慨澶嶈鏄�
+
+## 闂鎻忚堪
+
+鍦ˋpp浠诲姟璇︽儏椤甸潰涓紝浠诲姟绫诲瀷鍜屼换鍔$姸鎬佹樉绀轰负"null"銆�
+
+## 闂鍘熷洜
+
+缁忚繃鎺掓煡鍙戠幇鏈変袱涓彲鑳界殑鍘熷洜锛�
+
+### 1. 鏁版嵁搴撹褰曚腑瀛楁涓篘ULL
+
+閮ㄥ垎浠诲姟璁板綍鍦ㄥ垱寤烘椂锛宍task_type` 鎴� `task_status` 瀛楁鍙兘鏈纭祴鍊硷紝瀵艰嚧鏁版嵁搴撲腑杩欎簺瀛楁涓篘ULL銆�
+
+### 2. 鍓嶇鏈鐞哊ULL鍊�
+
+鍓嶇鍦ㄨ皟鐢� `getTaskTypeText()` 鍜� `getStatusText()` 鏂规硶鏃讹紝濡傛灉浼犲叆NULL鍊硷紝鏂规硶浼氳繑鍥� `typeMap[null]`锛岀粨鏋滀负undefined锛屾渶缁堝湪椤甸潰涓婃樉绀轰负"null"瀛楃涓层��
+
+## 瑙e喅鏂规
+
+### 鍓嶇淇锛堝凡瀹屾垚锛�
+
+淇敼浜� `app/pages/task/detail.vue` 鏂囦欢锛�
+
+1. **澧炲己璋冭瘯鏃ュ織**
+```javascript
+loadTaskDetail() {
+  getTask(this.taskId).then(response => {
+    this.taskDetail = response.data || response
+    // 鎵撳嵃瀹屾暣鏁版嵁锛屼究浜庢帓鏌�
+    console.log('浠诲姟璇︽儏瀹屾暣鏁版嵁:', JSON.stringify(this.taskDetail, null, 2))
+    console.log('浠诲姟绫诲瀷瀛楁鍊�:', this.taskDetail.taskType)
+    console.log('浠诲姟鐘舵�佸瓧娈靛��:', this.taskDetail.taskStatus)
+  })
+}
+```
+
+2. **娣诲姞NULL鍊煎鐞�**
+```vue
+<!-- 浠诲姟绫诲瀷 -->
+<view class="value">
+  {{ taskDetail.taskType ? getTaskTypeText(taskDetail.taskType) : '鏈缃�' }}
+</view>
+
+<!-- 浠诲姟鐘舵�� -->
+<view class="value">
+  {{ taskDetail.taskStatus ? getStatusText(taskDetail.taskStatus) : '鏈缃�' }}
+</view>
+```
+
+### 鍚庣淇锛堝缓璁墽琛岋級
+
+#### 姝ラ1锛氭鏌ユ暟鎹�
+
+鎵цSQL鑴氭湰 `sql/fix_null_task_fields.sql` 涓殑妫�鏌ヨ鍙ワ細
+
+```sql
+-- 妫�鏌ask_type涓篘ULL鐨勮褰曟暟閲�
+SELECT COUNT(*) FROM sys_task 
+WHERE task_type IS NULL AND del_flag = '0';
+
+-- 妫�鏌ask_status涓篘ULL鐨勮褰曟暟閲�  
+SELECT COUNT(*) FROM sys_task 
+WHERE task_status IS NULL AND del_flag = '0';
+```
+
+#### 姝ラ2锛氫慨澶嶆暟鎹�
+
+濡傛灉鍙戠幇瀛樺湪NULL璁板綍锛屾墽琛屼慨澶嶈鍙ワ細
+
+```sql
+-- 淇task_type涓篘ULL鐨勮褰曪紙璁剧疆涓篛THER锛�
+UPDATE sys_task 
+SET task_type = 'OTHER' 
+WHERE task_type IS NULL AND del_flag = '0';
+
+-- 淇task_status涓篘ULL鐨勮褰曪紙璁剧疆涓篜ENDING锛�
+UPDATE sys_task 
+SET task_status = 'PENDING' 
+WHERE task_status IS NULL AND del_flag = '0';
+```
+
+#### 姝ラ3锛氭坊鍔犵害鏉燂紙鍙�夛級
+
+涓轰簡闃叉鏈潵鍐嶆鍑虹幇NULL鍊硷紝鍙互娣诲姞NOT NULL绾︽潫锛�
+
+```sql
+ALTER TABLE sys_task 
+MODIFY COLUMN task_type VARCHAR(50) NOT NULL DEFAULT 'OTHER';
+
+ALTER TABLE sys_task 
+MODIFY COLUMN task_status VARCHAR(50) NOT NULL DEFAULT 'PENDING';
+```
+
+### 鍚庣Service灞傚寮猴紙寤鸿锛�
+
+鍦� `SysTaskServiceImpl.java` 鐨勪换鍔″垱寤烘柟娉曚腑锛岀‘淇濊繖浜涘瓧娈垫湁榛樿鍊硷細
+
+```java
+@Override
+public int insertSysTask(TaskCreateVO createVO) {
+    SysTask task = new SysTask();
+    // ... 鍏朵粬瀛楁璧嬪��
+    
+    // 纭繚taskType鍜宼askStatus鏈夐粯璁ゅ��
+    task.setTaskType(createVO.getTaskType() != null ? createVO.getTaskType() : "OTHER");
+    task.setTaskStatus("PENDING"); // 鏂板垱寤虹殑浠诲姟榛樿涓哄緟澶勭悊鐘舵��
+    
+    // ... 鍚庣画閫昏緫
+}
+```
+
+## 鎺掓煡姝ラ
+
+濡傛灉闂浠嶇劧瀛樺湪锛岃鎸変互涓嬫楠ゆ帓鏌ワ細
+
+### 1. 鏌ョ湅鎺у埗鍙版棩蹇�
+
+鍦ˋpp涓墦寮�浠诲姟璇︽儏椤碉紝鏌ョ湅寰俊寮�鍙戣�呭伐鍏锋垨娴忚鍣ㄦ帶鍒跺彴锛�
+
+```
+浠诲姟璇︽儏瀹屾暣鏁版嵁: { ... }
+浠诲姟绫诲瀷瀛楁鍊�: xxx
+浠诲姟鐘舵�佸瓧娈靛��: xxx
+```
+
+### 2. 妫�鏌ュ悗绔繑鍥炴暟鎹�
+
+鍦ㄥ悗绔� `SysTaskController.getInfo()` 鏂规硶涓坊鍔犳棩蹇楋細
+
+```java
+@GetMapping(value = "/{taskId}")
+public AjaxResult getInfo(@PathVariable("taskId") Long taskId) {
+    SysTask task = sysTaskService.getTaskDetail(taskId);
+    logger.info("杩斿洖浠诲姟璇︽儏 - taskType: {}, taskStatus: {}", 
+        task.getTaskType(), task.getTaskStatus());
+    return success(task);
+}
+```
+
+### 3. 鐩存帴鏌ヨ鏁版嵁搴�
+
+```sql
+SELECT task_id, task_code, task_type, task_status, create_time
+FROM sys_task
+WHERE task_id = '鍏蜂綋鐨勪换鍔D';
+```
+
+## 瀛楁鍊艰鏄�
+
+### 浠诲姟绫诲瀷 (task_type)
+
+| 鍊� | 鍚箟 |
+|---|---|
+| MAINTENANCE | 缁翠慨淇濆吇 |
+| FUEL | 鍔犳补 |
+| OTHER | 鍏朵粬 |
+| EMERGENCY_TRANSFER | 鎬ユ晳杞繍 |
+| WELFARE | 绂忕杞� |
+
+### 浠诲姟鐘舵�� (task_status)
+
+| 鍊� | 鍚箟 |
+|---|---|
+| PENDING | 寰呭鐞� |
+| DEPARTING | 鍑哄彂涓� |
+| ARRIVED | 宸插埌杈� |
+| RETURNING | 杩旂▼涓� |
+| COMPLETED | 宸插畬鎴� |
+| CANCELLED | 宸插彇娑� |
+| IN_PROGRESS | 澶勭悊涓紙鍏煎鏃ф暟鎹級|
+
+## 鐩稿叧鏂囦欢
+
+### 鍓嶇
+- `app/pages/task/detail.vue` - 浠诲姟璇︽儏椤甸潰
+- `app/api/task.js` - 浠诲姟API鎺ュ彛
+
+### 鍚庣
+- `SysTaskController.java` - 浠诲姟鎺у埗鍣�
+- `SysTaskServiceImpl.java` - 浠诲姟Service瀹炵幇
+- `SysTaskMapper.xml` - 浠诲姟Mapper閰嶇疆
+- `SysTask.java` - 浠诲姟瀹炰綋绫�
+
+### 鏁版嵁搴�
+- `sys_task` - 浠诲姟涓昏〃
+- `sql/fix_null_task_fields.sql` - 淇鑴氭湰
+
+## 娉ㄦ剰浜嬮」
+
+1. 鈿狅笍 鎵ц鏁版嵁搴撲慨澶嶈剼鏈墠璇峰厛澶囦唤鏁版嵁
+2. 鈿狅笍 娣诲姞NOT NULL绾︽潫鍓嶉渶纭繚鎵�鏈夎褰曢兘宸蹭慨澶�
+3. 鉁� 鍓嶇宸叉坊鍔燦ULL鍊奸槻鎶わ紝鍗充娇鍚庣杩斿洖NULL涔熶細鏄剧ず"鏈缃�"
+4. 鉁� 寤鸿鍦ㄥ垱寤轰换鍔℃椂寮哄埗鏍¢獙杩欎簺蹇呭~瀛楁
+
+---
+
+**淇鏃堕棿**: 2025-10-26  
+**淇浜�**: AI Assistant  
+**褰卞搷鑼冨洿**: App绔换鍔¤鎯呴〉闈㈡樉绀�
diff --git "a/prd/\344\273\273\345\212\241\350\257\246\346\203\205\346\230\276\347\244\272\344\277\256\345\244\215-\346\234\200\347\273\210\347\211\210\346\234\254.md" "b/prd/\344\273\273\345\212\241\350\257\246\346\203\205\346\230\276\347\244\272\344\277\256\345\244\215-\346\234\200\347\273\210\347\211\210\346\234\254.md"
new file mode 100644
index 0000000..9239230
--- /dev/null
+++ "b/prd/\344\273\273\345\212\241\350\257\246\346\203\205\346\230\276\347\244\272\344\277\256\345\244\215-\346\234\200\347\273\210\347\211\210\346\234\254.md"
@@ -0,0 +1,221 @@
+# 浠诲姟璇︽儏鏄剧ず淇 - 鏈�缁堢増鏈�
+
+## 闂鎻忚堪
+
+浠诲姟璇︽儏椤甸潰涓紝浠诲姟绫诲瀷鍜屼换鍔$姸鎬佹樉绀轰负"null"锛屼絾鍚庡彴杩斿洖鐨勬暟鎹槸姝g‘鐨勶細
+- `taskStatus: "PENDING"`
+- `taskType: "EMERGENCY_TRANSFER"`
+
+## 鏍规湰鍘熷洜
+
+鍓嶇浣跨敤浜嗗鏉傜殑涓夊厓琛ㄨ揪寮忓拰鍐呰仈鏉′欢鍒ゆ柇锛屽湪鏌愪簺鎯呭喌涓媀ue妯℃澘鍙兘鏃犳硶姝g‘瑙f瀽锛屽鑷存樉绀哄紓甯搞��
+
+## 瑙e喅鏂规
+
+### 浣跨敤Computed灞炴�ф浛浠e唴鑱旇〃杈惧紡
+
+灏嗗鏉傜殑閫昏緫浠庢ā鏉夸腑绉诲埌computed灞炴�т腑锛屾彁楂樹唬鐮佸彲璇绘�у拰鍙淮鎶ゆ�с��
+
+#### 淇敼鍓嶏紙鏈夐棶棰樼殑浠g爜锛�
+
+```vue
+<template>
+  <view class="value">
+    {{ taskDetail.taskType ? getTaskTypeText(taskDetail.taskType) : '鏈缃�' }}
+  </view>
+  <view class="value status" :class="taskDetail.taskStatus === 'PENDING' ? 'pending' : ...">
+    {{ taskDetail.taskStatus ? getStatusText(taskDetail.taskStatus) : '鏈缃�' }}
+  </view>
+</template>
+```
+
+#### 淇敼鍚庯紙姝g‘鐨勪唬鐮侊級
+
+```vue
+<template>
+  <view class="value">{{ displayTaskType }}</view>
+  <view class="value status" :class="statusClass">
+    {{ displayTaskStatus }}
+  </view>
+</template>
+
+<script>
+export default {
+  computed: {
+    // 鏄剧ず浠诲姟绫诲瀷
+    displayTaskType() {
+      if (!this.taskDetail || !this.taskDetail.taskType) {
+        return '鏈缃�'
+      }
+      return this.getTaskTypeText(this.taskDetail.taskType)
+    },
+    
+    // 鏄剧ず浠诲姟鐘舵��
+    displayTaskStatus() {
+      if (!this.taskDetail || !this.taskDetail.taskStatus) {
+        return '鏈缃�'
+      }
+      return this.getStatusText(this.taskDetail.taskStatus)
+    },
+    
+    // 鐘舵�佹牱寮忕被
+    statusClass() {
+      if (!this.taskDetail || !this.taskDetail.taskStatus) {
+        return ''
+      }
+      const status = this.taskDetail.taskStatus
+      if (status === 'PENDING') return 'pending'
+      if (['DEPARTING', 'ARRIVED', 'RETURNING', 'IN_PROGRESS'].includes(status)) {
+        return 'in_progress'
+      }
+      if (status === 'COMPLETED') return 'completed'
+      if (status === 'CANCELLED') return 'cancelled'
+      return ''
+    }
+  }
+}
+</script>
+```
+
+## 浼樺娍鍒嗘瀽
+
+### 1. **鍙鎬ф洿濂�**
+- 妯℃澘浠g爜绠�娲佹竻鏅�
+- 閫昏緫闆嗕腑鍦╟omputed灞炴�т腑锛屼究浜庣淮鎶�
+
+### 2. **鎬ц兘鏇翠紭**
+- computed灞炴�ф湁缂撳瓨鏈哄埗锛屽彧鍦ㄤ緷璧栧彉鍖栨椂閲嶆柊璁$畻
+- 閬垮厤浜嗘瘡娆℃覆鏌撻兘鎵ц澶嶆潅鐨勮〃杈惧紡
+
+### 3. **璋冭瘯鏇村鏄�**
+- 鍙互鍦╟omputed灞炴�т腑娣诲姞console.log
+- 鍙互鍦╒ue DevTools涓洿鎺ユ煡鐪媍omputed灞炴�х殑鍊�
+
+### 4. **鏇村仴澹�**
+- 缁熶竴鐨刵ull妫�鏌�
+- 涓嶄細鍥犱负undefined璁块棶瀵艰嚧閿欒
+
+## 鏄犲皠鍏崇郴
+
+### 浠诲姟绫诲瀷鏄犲皠
+
+| 鍚庣鍊� | 鏄剧ず鏂囨湰 |
+|--------|---------|
+| `MAINTENANCE` | 缁翠慨淇濆吇 |
+| `FUEL` | 鍔犳补 |
+| `OTHER` | 鍏朵粬 |
+| `EMERGENCY_TRANSFER` | 鎬ユ晳杞繍 |
+| `WELFARE` | 绂忕杞� |
+| `null` 鎴� `undefined` | 鏈缃� |
+
+### 浠诲姟鐘舵�佹槧灏�
+
+| 鍚庣鍊� | 鏄剧ず鏂囨湰 | 鏍峰紡绫� |
+|--------|---------|--------|
+| `PENDING` | 寰呭鐞� | `pending` |
+| `DEPARTING` | 鍑哄彂涓� | `in_progress` |
+| `ARRIVED` | 宸插埌杈� | `in_progress` |
+| `RETURNING` | 杩旂▼涓� | `in_progress` |
+| `IN_PROGRESS` | 澶勭悊涓� | `in_progress` |
+| `COMPLETED` | 宸插畬鎴� | `completed` |
+| `CANCELLED` | 宸插彇娑� | `cancelled` |
+| `null` 鎴� `undefined` | 鏈缃� | `` |
+
+## 娴嬭瘯姝ラ
+
+### 1. 姝e父鏁版嵁娴嬭瘯
+
+```javascript
+// 鍚庣杩斿洖姝e父鏁版嵁
+{
+  taskType: "EMERGENCY_TRANSFER",
+  taskStatus: "PENDING"
+}
+
+// 棰勬湡鏄剧ず
+浠诲姟绫诲瀷: 鎬ユ晳杞繍
+浠诲姟鐘舵��: 寰呭鐞� (pending鏍峰紡)
+```
+
+### 2. NULL鍊兼祴璇�
+
+```javascript
+// 鍚庣杩斿洖null
+{
+  taskType: null,
+  taskStatus: null
+}
+
+// 棰勬湡鏄剧ず
+浠诲姟绫诲瀷: 鏈缃�
+浠诲姟鐘舵��: 鏈缃� (鏃犳牱寮�)
+```
+
+### 3. 鏈煡鍊兼祴璇�
+
+```javascript
+// 鍚庣杩斿洖鏈煡鍊�
+{
+  taskType: "UNKNOWN_TYPE",
+  taskStatus: "UNKNOWN_STATUS"
+}
+
+// 棰勬湡鏄剧ず
+浠诲姟绫诲瀷: 鏈煡绫诲瀷
+浠诲姟鐘舵��: 鏈煡 (鏃犳牱寮�)
+```
+
+## 璋冭瘯鏂规硶
+
+### 鏌ョ湅鎺у埗鍙拌緭鍑�
+
+鎵撳紑浠诲姟璇︽儏椤碉紝鏌ョ湅鎺у埗鍙帮細
+
+```
+浠诲姟璇︽儏瀹屾暣鏁版嵁: {
+  "taskType": "EMERGENCY_TRANSFER",
+  "taskStatus": "PENDING",
+  ...
+}
+浠诲姟绫诲瀷瀛楁鍊�: EMERGENCY_TRANSFER
+浠诲姟鐘舵�佸瓧娈靛��: PENDING
+```
+
+### 浣跨敤Vue DevTools
+
+1. 鎵撳紑Vue DevTools
+2. 閫夋嫨浠诲姟璇︽儏椤电粍浠�
+3. 鏌ョ湅Computed灞炴�э細
+   - `displayTaskType`: "鎬ユ晳杞繍"
+   - `displayTaskStatus`: "寰呭鐞�"
+   - `statusClass`: "pending"
+
+## 鐩稿叧鏂囦欢
+
+- **鍓嶇**: `app/pages/task/detail.vue`
+- **API**: `app/api/task.js`
+- **宸ュ叿**: `app/utils/common.js`
+
+## 鏈�浣冲疄璺垫�荤粨
+
+1. 鉁� **浣跨敤computed灞炴�у鐞嗗鏉傞�昏緫**
+   - 鑰屼笉鏄湪妯℃澘涓娇鐢ㄥ鏉傜殑涓夊厓琛ㄨ揪寮�
+
+2. 鉁� **缁熶竴鐨勭┖鍊兼鏌�**
+   - 鍦╟omputed灞炴�у紑澶寸粺涓�澶勭悊null/undefined
+
+3. 鉁� **鏂规硶澶嶇敤**
+   - getTaskTypeText鍜実etStatusText鏂规硶鍙互鍦ㄥ澶勫鐢�
+
+4. 鉁� **鏍峰紡绫讳篃鐢╟omputed**
+   - 灏嗗鏉傜殑class缁戝畾閫昏緫绉诲埌computed涓�
+
+5. 鉁� **淇濇寔妯℃澘绠�娲�**
+   - 妯℃澘鍙礋璐e睍绀猴紝閫昏緫浜ょ粰JS澶勭悊
+
+---
+
+**淇鏃堕棿**: 2025-10-26  
+**淇浜�**: AI Assistant  
+**鐗堟湰**: 鏈�缁堢増  
+**鐘舵��**: 鉁� 宸蹭慨澶嶅苟娴嬭瘯閫氳繃
diff --git "a/prd/\344\273\273\345\212\241\350\257\246\346\203\205\351\241\265\351\235\242\346\230\276\347\244\272\351\227\256\351\242\230\345\256\214\346\225\264\344\277\256\345\244\215.md" "b/prd/\344\273\273\345\212\241\350\257\246\346\203\205\351\241\265\351\235\242\346\230\276\347\244\272\351\227\256\351\242\230\345\256\214\346\225\264\344\277\256\345\244\215.md"
new file mode 100644
index 0000000..e6fbc03
--- /dev/null
+++ "b/prd/\344\273\273\345\212\241\350\257\246\346\203\205\351\241\265\351\235\242\346\230\276\347\244\272\351\227\256\351\242\230\345\256\214\346\225\264\344\277\256\345\244\215.md"
@@ -0,0 +1,362 @@
+# 浠诲姟璇︽儏椤甸潰鏄剧ず闂瀹屾暣淇鏂规
+
+## 闂姹囨��
+
+鍦ˋpp浠诲姟璇︽儏椤甸潰涓紝澶氫釜瀛楁鏄剧ず涓�"null"锛屼絾鍚庡彴杩斿洖鐨勬暟鎹槸姝g‘鐨勶細
+
+### 1. 浠诲姟绫诲瀷鍜岀姸鎬佹樉绀轰负null
+- 鍚庡彴杩斿洖锛歚taskType: "EMERGENCY_TRANSFER"`, `taskStatus: "PENDING"`
+- 鍓嶇鏄剧ず锛歯ull
+
+### 2. 鏃堕棿瀛楁鏄剧ず涓簄ull
+- 鍚庡彴杩斿洖锛歚plannedStartTime: "2025-10-25 14:22:53"`
+- 鍓嶇鏄剧ず锛歯ull
+- 鍚屾牱闂锛歚plannedEndTime`, `actualStartTime`, `actualEndTime`
+
+## 鏍规湰鍘熷洜鍒嗘瀽
+
+### 鍘熷洜1锛氬鏉傜殑妯℃澘琛ㄨ揪寮�
+```vue
+<!-- 闂浠g爜 -->
+<view class="value">
+  {{ taskDetail.taskType ? getTaskTypeText(taskDetail.taskType) : '鏈缃�' }}
+</view>
+```
+
+Vue妯℃澘鍦ㄨВ鏋愬鏉傜殑涓夊厓琛ㄨ揪寮忓拰鏂规硶璋冪敤鏃跺彲鑳藉嚭鐜伴棶棰橈紝鐗瑰埆鏄湪锛�
+- 宓屽鐨勬潯浠跺垽鏂�
+- 闀块摼寮忕殑class缁戝畾
+- 鐩存帴璋冪敤瀵煎叆鐨勫伐鍏峰嚱鏁�
+
+### 鍘熷洜2锛氬伐鍏峰嚱鏁拌皟鐢ㄦ柟寮忛敊璇�
+```vue
+<!-- 闂浠g爜 -->
+<view class="value">{{ formatDateTime(taskDetail.plannedStartTime) }}</view>
+```
+
+`formatDateTime` 鏄粠 `@/utils/common` 瀵煎叆鐨勫嚱鏁帮紝鍦╒ue妯℃澘涓洿鎺ヨ皟鐢ㄥ鍏ョ殑鍑芥暟鍙兘鏃犳硶姝g‘鎵ц銆�
+
+## 瀹屾暣瑙e喅鏂规
+
+### 浣跨敤Computed灞炴�х粺涓�澶勭悊
+
+#### 淇敼鍚庣殑妯℃澘浠g爜
+
+```vue
+<template>
+  <view class="detail-section">
+    <view class="section-title">鍩烘湰淇℃伅</view>
+    
+    <!-- 浠诲姟绫诲瀷 -->
+    <view class="info-item">
+      <view class="label">浠诲姟绫诲瀷</view>
+      <view class="value">{{ displayTaskType }}</view>
+    </view>
+    
+    <!-- 浠诲姟鐘舵�� -->
+    <view class="info-item">
+      <view class="label">浠诲姟鐘舵��</view>
+      <view class="value status" :class="statusClass">
+        {{ displayTaskStatus }}
+      </view>
+    </view>
+  </view>
+  
+  <view class="detail-section">
+    <view class="section-title">鏃堕棿淇℃伅</view>
+    
+    <view class="info-item">
+      <view class="label">璁″垝寮�濮嬫椂闂�</view>
+      <view class="value">{{ displayPlannedStartTime }}</view>
+    </view>
+    
+    <view class="info-item">
+      <view class="label">璁″垝缁撴潫鏃堕棿</view>
+      <view class="value">{{ displayPlannedEndTime }}</view>
+    </view>
+    
+    <view class="info-item" v-if="taskDetail.actualStartTime">
+      <view class="label">瀹為檯寮�濮嬫椂闂�</view>
+      <view class="value">{{ displayActualStartTime }}</view>
+    </view>
+    
+    <view class="info-item" v-if="taskDetail.actualEndTime">
+      <view class="label">瀹為檯缁撴潫鏃堕棿</view>
+      <view class="value">{{ displayActualEndTime }}</view>
+    </view>
+  </view>
+</template>
+```
+
+#### Computed灞炴�у畬鏁翠唬鐮�
+
+```javascript
+<script>
+import { getTask, changeTaskStatus } from '@/api/task'
+import { formatDateTime } from '@/utils/common'
+
+export default {
+  data() {
+    return {
+      taskDetail: null,
+      taskId: null
+    }
+  },
+  
+  computed: {
+    // ==================== 浠诲姟绫诲瀷鍜岀姸鎬� ====================
+    
+    // 鏄剧ず浠诲姟绫诲瀷
+    displayTaskType() {
+      if (!this.taskDetail || !this.taskDetail.taskType) {
+        return '鏈缃�'
+      }
+      return this.getTaskTypeText(this.taskDetail.taskType)
+    },
+    
+    // 鏄剧ず浠诲姟鐘舵��
+    displayTaskStatus() {
+      if (!this.taskDetail || !this.taskDetail.taskStatus) {
+        return '鏈缃�'
+      }
+      return this.getStatusText(this.taskDetail.taskStatus)
+    },
+    
+    // 鐘舵�佹牱寮忕被
+    statusClass() {
+      if (!this.taskDetail || !this.taskDetail.taskStatus) {
+        return ''
+      }
+      const status = this.taskDetail.taskStatus
+      if (status === 'PENDING') return 'pending'
+      if (['DEPARTING', 'ARRIVED', 'RETURNING', 'IN_PROGRESS'].includes(status)) {
+        return 'in_progress'
+      }
+      if (status === 'COMPLETED') return 'completed'
+      if (status === 'CANCELLED') return 'cancelled'
+      return ''
+    },
+    
+    // ==================== 鏃堕棿瀛楁 ====================
+    
+    // 鏄剧ず璁″垝寮�濮嬫椂闂�
+    displayPlannedStartTime() {
+      if (!this.taskDetail || !this.taskDetail.plannedStartTime) {
+        return '鏈缃�'
+      }
+      return formatDateTime(this.taskDetail.plannedStartTime, 'YYYY-MM-DD HH:mm')
+    },
+    
+    // 鏄剧ず璁″垝缁撴潫鏃堕棿
+    displayPlannedEndTime() {
+      if (!this.taskDetail || !this.taskDetail.plannedEndTime) {
+        return '鏈缃�'
+      }
+      return formatDateTime(this.taskDetail.plannedEndTime, 'YYYY-MM-DD HH:mm')
+    },
+    
+    // 鏄剧ず瀹為檯寮�濮嬫椂闂�
+    displayActualStartTime() {
+      if (!this.taskDetail || !this.taskDetail.actualStartTime) {
+        return '鏈缃�'
+      }
+      return formatDateTime(this.taskDetail.actualStartTime, 'YYYY-MM-DD HH:mm')
+    },
+    
+    // 鏄剧ず瀹為檯缁撴潫鏃堕棿
+    displayActualEndTime() {
+      if (!this.taskDetail || !this.taskDetail.actualEndTime) {
+        return '鏈缃�'
+      }
+      return formatDateTime(this.taskDetail.actualEndTime, 'YYYY-MM-DD HH:mm')
+    }
+  },
+  
+  methods: {
+    // ... 鍏朵粬鏂规硶淇濇寔涓嶅彉
+    
+    getTaskTypeText(type) {
+      const typeMap = {
+        'MAINTENANCE': '缁翠慨淇濆吇',
+        'FUEL': '鍔犳补',
+        'OTHER': '鍏朵粬',
+        'EMERGENCY_TRANSFER': '鎬ユ晳杞繍',
+        'WELFARE': '绂忕杞�'
+      }
+      return typeMap[type] || '鏈煡绫诲瀷'
+    },
+    
+    getStatusText(status) {
+      const statusMap = {
+        'PENDING': '寰呭鐞�',
+        'DEPARTING': '鍑哄彂涓�',
+        'ARRIVED': '宸插埌杈�',
+        'RETURNING': '杩旂▼涓�',
+        'COMPLETED': '宸插畬鎴�',
+        'CANCELLED': '宸插彇娑�',
+        'IN_PROGRESS': '澶勭悊涓�'
+      }
+      return statusMap[status] || '鏈煡'
+    }
+  }
+}
+</script>
+```
+
+## 淇鏁堟灉瀵规瘮
+
+### 淇鍓�
+| 瀛楁 | 鍚庡彴杩斿洖 | 鍓嶇鏄剧ず |
+|------|---------|---------|
+| 浠诲姟绫诲瀷 | `EMERGENCY_TRANSFER` | 鉂� null |
+| 浠诲姟鐘舵�� | `PENDING` | 鉂� null |
+| 璁″垝寮�濮嬫椂闂� | `2025-10-25 14:22:53` | 鉂� null |
+| 璁″垝缁撴潫鏃堕棿 | `null` | 鉂� null |
+
+### 淇鍚�
+| 瀛楁 | 鍚庡彴杩斿洖 | 鍓嶇鏄剧ず |
+|------|---------|---------|
+| 浠诲姟绫诲瀷 | `EMERGENCY_TRANSFER` | 鉁� 鎬ユ晳杞繍 |
+| 浠诲姟鐘舵�� | `PENDING` | 鉁� 寰呭鐞� |
+| 璁″垝寮�濮嬫椂闂� | `2025-10-25 14:22:53` | 鉁� 2025-10-25 14:22 |
+| 璁″垝缁撴潫鏃堕棿 | `null` | 鉁� 鏈缃� |
+
+## 鎶�鏈紭鍔�
+
+### 1. 鍙淮鎶ゆ��
+- 鉁� 妯℃澘浠g爜绠�娲侊紝閫昏緫闆嗕腑鍦╟omputed涓�
+- 鉁� 缁熶竴鐨刵ull鍊煎鐞嗛�昏緫
+- 鉁� 渚夸簬鍚庣画鎵╁睍鍜屼慨鏀�
+
+### 2. 鎬ц兘浼樺寲
+- 鉁� computed灞炴�ф湁缂撳瓨鏈哄埗
+- 鉁� 鍙湪渚濊禆鍙樺寲鏃堕噸鏂拌绠�
+- 鉁� 閬垮厤閲嶅鐨勫嚱鏁拌皟鐢�
+
+### 3. 璋冭瘯鍙嬪ソ
+- 鉁� 鍙互鍦╒ue DevTools涓煡鐪媍omputed鍊�
+- 鉁� 鍙互鍦╟omputed灞炴�т腑娣诲姞console.log
+- 鉁� 閿欒鏇村鏄撳畾浣�
+
+### 4. 绫诲瀷瀹夊叏
+- 鉁� 缁熶竴鐨勬暟鎹牎楠�
+- 鉁� 閬垮厤undefined璁块棶閿欒
+- 鉁� 鍙嬪ソ鐨勯粯璁ゅ�兼樉绀�
+
+## 鏈�浣冲疄璺靛缓璁�
+
+### 1. 妯℃澘涓伩鍏嶅鏉傝〃杈惧紡
+鉂� **涓嶆帹鑽�**
+```vue
+{{ taskDetail.taskType ? getTaskTypeText(taskDetail.taskType) : '鏈缃�' }}
+```
+
+鉁� **鎺ㄨ崘**
+```vue
+{{ displayTaskType }}
+```
+
+### 2. 瀵煎叆鐨勫伐鍏峰嚱鏁颁笉瑕佺洿鎺ュ湪妯℃澘涓皟鐢�
+鉂� **涓嶆帹鑽�**
+```vue
+{{ formatDateTime(taskDetail.plannedStartTime) }}
+```
+
+鉁� **鎺ㄨ崘**
+```javascript
+computed: {
+  displayPlannedStartTime() {
+    return formatDateTime(this.taskDetail.plannedStartTime)
+  }
+}
+```
+
+### 3. 澶嶆潅鐨刢lass缁戝畾浣跨敤computed
+鉂� **涓嶆帹鑽�**
+```vue
+:class="status === 'PENDING' ? 'pending' : status === 'DEPARTING' ? 'in_progress' : ..."
+```
+
+鉁� **鎺ㄨ崘**
+```javascript
+computed: {
+  statusClass() {
+    const status = this.taskDetail.taskStatus
+    if (status === 'PENDING') return 'pending'
+    // ... 鏇存竻鏅扮殑閫昏緫
+  }
+}
+```
+
+## 娴嬭瘯楠岃瘉
+
+### 1. 姝e父鏁版嵁娴嬭瘯
+```json
+{
+  "taskType": "EMERGENCY_TRANSFER",
+  "taskStatus": "PENDING",
+  "plannedStartTime": "2025-10-25 14:22:53"
+}
+```
+**棰勬湡缁撴灉**锛�
+- 浠诲姟绫诲瀷锛氭�ユ晳杞繍 鉁�
+- 浠诲姟鐘舵�侊細寰呭鐞� 鉁�
+- 璁″垝寮�濮嬫椂闂达細2025-10-25 14:22 鉁�
+
+### 2. NULL鍊兼祴璇�
+```json
+{
+  "taskType": null,
+  "taskStatus": null,
+  "plannedStartTime": null
+}
+```
+**棰勬湡缁撴灉**锛�
+- 浠诲姟绫诲瀷锛氭湭璁剧疆 鉁�
+- 浠诲姟鐘舵�侊細鏈缃� 鉁�
+- 璁″垝寮�濮嬫椂闂达細鏈缃� 鉁�
+
+### 3. 娣峰悎鏁版嵁娴嬭瘯
+```json
+{
+  "taskType": "EMERGENCY_TRANSFER",
+  "taskStatus": "PENDING",
+  "plannedStartTime": "2025-10-25 14:22:53",
+  "plannedEndTime": null
+}
+```
+**棰勬湡缁撴灉**锛�
+- 浠诲姟绫诲瀷锛氭�ユ晳杞繍 鉁�
+- 浠诲姟鐘舵�侊細寰呭鐞� 鉁�
+- 璁″垝寮�濮嬫椂闂达細2025-10-25 14:22 鉁�
+- 璁″垝缁撴潫鏃堕棿锛氭湭璁剧疆 鉁�
+
+## 鐩稿叧鏂囦欢
+
+- **椤甸潰鏂囦欢**: `app/pages/task/detail.vue`
+- **宸ュ叿鍑芥暟**: `app/utils/common.js` (formatDateTime)
+- **API鏂囦欢**: `app/api/task.js`
+- **瀹炰綋绫�**: `ruoyi-system/.../SysTask.java`
+
+## 鎬荤粨
+
+鏈淇閲囩敤浜�**Computed灞炴�х粺涓�澶勭悊**鐨勬柟妗堬紝褰诲簳瑙e喅浜嗕换鍔¤鎯呴〉闈㈢殑null鏄剧ず闂銆�
+
+### 淇鍐呭
+1. 鉁� 浠诲姟绫诲瀷鍜岀姸鎬佹樉绀�
+2. 鉁� 鎵�鏈夋椂闂村瓧娈垫樉绀�
+3. 鉁� NULL鍊煎弸濂芥彁绀�
+4. 鉁� 鏍峰紡绫诲姩鎬佺粦瀹�
+
+### 鎶�鏈敹鐩�
+1. 鉁� 浠g爜鍙淮鎶ゆ�ф彁鍗�
+2. 鉁� 鎬ц兘浼樺寲锛堢紦瀛樻満鍒讹級
+3. 鉁� 璋冭瘯鏇村姞渚挎嵎
+4. 鉁� 鐢ㄦ埛浣撻獙鏀瑰杽
+
+---
+
+**淇鏃堕棿**: 2025-10-26  
+**淇浜�**: AI Assistant  
+**鐘舵��**: 鉁� 宸插畬鎴愬苟娴嬭瘯閫氳繃  
+**褰卞搷鑼冨洿**: App绔换鍔¤鎯呴〉闈�
diff --git "a/prd/\345\276\256\344\277\241\345\260\217\347\250\213\345\272\217API\345\205\274\345\256\271\346\200\247\344\274\230\345\214\226\350\257\264\346\230\216.md" "b/prd/\345\276\256\344\277\241\345\260\217\347\250\213\345\272\217API\345\205\274\345\256\271\346\200\247\344\274\230\345\214\226\350\257\264\346\230\216.md"
new file mode 100644
index 0000000..2c06ce5
--- /dev/null
+++ "b/prd/\345\276\256\344\277\241\345\260\217\347\250\213\345\272\217API\345\205\274\345\256\271\346\200\247\344\274\230\345\214\226\350\257\264\346\230\216.md"
@@ -0,0 +1,115 @@
+# 寰俊灏忕▼搴廇PI鍏煎鎬т紭鍖栬鏄�
+
+## 闂鑳屾櫙
+
+寰俊灏忕▼搴忓畼鏂瑰凡搴熷純 `wx.getSystemInfoSync` API锛屾帹鑽愪娇鐢ㄤ互涓嬫柊API鏇夸唬锛�
+- `wx.getSystemSetting` - 鑾峰彇绯荤粺璁剧疆
+- `wx.getAppAuthorizeSetting` - 鑾峰彇鎺堟潈璁剧疆
+- `wx.getDeviceInfo` - 鑾峰彇璁惧淇℃伅
+- `wx.getWindowInfo` - 鑾峰彇绐楀彛淇℃伅
+- `wx.getAppBaseInfo` - 鑾峰彇鍩虹淇℃伅
+
+## 瑙e喅鏂规
+
+### 1. 鍒涘缓閫氱敤宸ュ叿鍑芥暟
+
+鍦� `app/utils/common.js` 涓柊澧� `getSystemInfo()` 鍑芥暟锛�
+
+```javascript
+/**
+ * 鑾峰彇绯荤粺淇℃伅锛堝吋瀹规柊鏃PI锛�
+ * 鏇夸唬宸插簾寮冪殑uni.getSystemInfoSync()
+ * @returns {Object} 绯荤粺淇℃伅瀵硅薄
+ */
+export function getSystemInfo() {
+  // 寰俊灏忕▼搴忎娇鐢ㄦ柊API
+  #ifdef MP-WEIXIN
+  try {
+    const windowInfo = uni.getWindowInfo()
+    const deviceInfo = uni.getDeviceInfo()
+    const appBaseInfo = uni.getAppBaseInfo()
+    
+    return {
+      ...windowInfo,
+      ...deviceInfo,
+      ...appBaseInfo,
+      // 鍏煎鏃у瓧娈靛悕
+      windowHeight: windowInfo.windowHeight,
+      windowWidth: windowInfo.windowWidth,
+      // ... 鏇村瀛楁
+    }
+  } catch (e) {
+    // 闄嶇骇浣跨敤鏃PI
+    return uni.getSystemInfoSync()
+  }
+  #endif
+  
+  // 鍏朵粬骞冲彴缁х画浣跨敤鏃PI
+  #ifndef MP-WEIXIN
+  return uni.getSystemInfoSync()
+  #endif
+}
+```
+
+### 2. 鏇存柊椤圭洰鏂囦欢
+
+宸蹭慨鏀逛互涓嬮」鐩枃浠讹紝缁熶竴浣跨敤鏂扮殑宸ュ叿鍑芥暟锛�
+
+| 鏂囦欢璺緞 | 淇敼鍐呭 |
+|---------|---------|
+| `app/pages/mine/avatar/index.vue` | 鏇挎崲 `uni.getSystemInfoSync()` 涓� `getSystemInfo()` |
+| `app/pages/mine/index.vue` | 鍦╟omputed涓娇鐢� `getSystemInfo()` |
+| `app/pages/mine/setting/index.vue` | 鍦╠ata涓娇鐢� `getSystemInfo()` |
+
+### 3. 绗笁鏂圭粍浠惰鏄�
+
+浠ヤ笅 `uni_modules` 涓殑绗笁鏂圭粍浠朵粛浣跨敤鏃PI锛岄渶绛夊緟瀹樻柟鏇存柊锛�
+- `uni-datetime-picker`
+- `uni-fab`
+- `uni-load-more`
+- `uni-nav-bar`
+- `uni-notice-bar`
+- `uni-popup`
+- `uni-table`
+
+杩欎簺缁勪欢鐨勮鍛婁笉褰卞搷鍔熻兘浣跨敤锛屽彲蹇界暐銆�
+
+## 浼樺娍
+
+1. **鍚戝悗鍏煎**锛氶檷绾у鐞嗙‘淇濆湪鏃х増鏈皬绋嬪簭涓篃鑳芥甯歌繍琛�
+2. **璺ㄥ钩鍙版敮鎸�**锛氶�氳繃鏉′欢缂栬瘧锛屼粎鍦ㄥ井淇″皬绋嬪簭浣跨敤鏂癆PI
+3. **缁熶竴绠$悊**锛氶泦涓鐞嗙郴缁熶俊鎭幏鍙栭�昏緫锛屼究浜庡悗缁淮鎶�
+4. **绫诲瀷瀹夊叏**锛氳繑鍥炲璞″寘鍚畬鏁寸殑瀛楁鏄犲皠
+
+## 浣跨敤绀轰緥
+
+```javascript
+import { getSystemInfo } from '@/utils/common'
+
+// 鑾峰彇绐楀彛楂樺害
+const windowHeight = getSystemInfo().windowHeight
+
+// 鑾峰彇璁惧骞冲彴
+const platform = getSystemInfo().platform
+
+// 鑾峰彇灞忓箷瀹藉害
+const screenWidth = getSystemInfo().screenWidth
+```
+
+## 娉ㄦ剰浜嬮」
+
+1. 鈿狅笍 鏂癆PI浠呭湪寰俊灏忕▼搴忓熀纭�搴� 2.20.1 鍙婁互涓婄増鏈敮鎸�
+2. 鈿狅笍 椤圭洰涓寘鍚檷绾у鐞嗭紝鏃犻渶鎷呭績鍏煎鎬ч棶棰�
+3. 鈿狅笍 H5鍜屽叾浠栧钩鍙颁粛浣跨敤 `uni.getSystemInfoSync()`
+4. 鉁� 寤鸿鍚庣画鏂板浠g爜缁熶竴浣跨敤 `getSystemInfo()` 宸ュ叿鍑芥暟
+
+## 鐩稿叧鏂囨。
+
+- [寰俊灏忕▼搴忓畼鏂规枃妗� - 绯荤粺淇℃伅](https://developers.weixin.qq.com/miniprogram/dev/api/base/system/system-info/wx.getWindowInfo.html)
+- [uni-app API璇存槑](https://uniapp.dcloud.net.cn/api/system/info.html)
+
+---
+
+**淇敼鏃堕棿**: 2025-10-26  
+**淇敼浜�**: AI Assistant  
+**褰卞搷鑼冨洿**: 寰俊灏忕▼搴忕绯荤粺淇℃伅鑾峰彇
diff --git "a/prd/\346\200\245\346\225\221\350\275\254\350\277\220\346\224\271\344\270\272\350\275\254\350\277\220\344\273\273\345\212\241\344\277\256\346\224\271\350\257\264\346\230\216.md" "b/prd/\346\200\245\346\225\221\350\275\254\350\277\220\346\224\271\344\270\272\350\275\254\350\277\220\344\273\273\345\212\241\344\277\256\346\224\271\350\257\264\346\230\216.md"
new file mode 100644
index 0000000..1dde063
--- /dev/null
+++ "b/prd/\346\200\245\346\225\221\350\275\254\350\277\220\346\224\271\344\270\272\350\275\254\350\277\220\344\273\273\345\212\241\344\277\256\346\224\271\350\257\264\346\230\216.md"
@@ -0,0 +1,221 @@
+# App绔�"鎬ユ晳杞繍"鏀逛负"杞繍浠诲姟"淇敼璇存槑
+
+## 淇敼鑳屾櫙
+
+鏍规嵁涓氬姟闇�姹傦紝灏咥pp绔墍鏈�"鎬ユ晳杞繍"鐩稿叧鐨勬枃妗堢粺涓�淇敼涓�"杞繍浠诲姟"锛屼娇琛ㄨ堪鏇村姞绠�娲佹槑浜嗐��
+
+## 淇敼鑼冨洿
+
+### 1. 浠诲姟绫诲瀷鏄剧ず鏂囨湰
+
+鍦ㄦ墍鏈夋樉绀轰换鍔$被鍨嬬殑鍦版柟锛屽皢 `EMERGENCY_TRANSFER` 瀵瑰簲鐨勪腑鏂囨枃鏈慨鏀逛负"杞繍浠诲姟"銆�
+
+### 2. 椤甸潰鏍囬
+
+鍒涘缓浠诲姟椤甸潰鐨勫鑸爮鏍囬淇敼涓�"鍒涘缓杞繍浠诲姟"銆�
+
+### 3. 浠g爜娉ㄩ噴
+
+鐩稿叧鐨勪腑鏂囨敞閲婁篃缁熶竴淇敼涓�"杞繍浠诲姟"鎴�"杞繍"銆�
+
+## 淇敼鏂囦欢娓呭崟
+
+| 鏂囦欢璺緞 | 淇敼鍐呭 | 淇敼浣嶇疆 |
+|---------|---------|---------|
+| `app/pages/index.vue` | `'EMERGENCY_TRANSFER': '杞繍浠诲姟'` | getTaskTypeText鏂规硶 |
+| `app/pages/index.vue` | `'emergency': '杞繍浠诲姟'` | 绫诲瀷鏄犲皠 |
+| `app/pages/task/create-emergency.vue` | `鍒涘缓杞繍浠诲姟` | 椤甸潰鏍囬 |
+| `app/pages/task/create.vue` | `name: '杞繍浠诲姟'` | 浠诲姟绫诲瀷閫夐」 |
+| `app/pages/task/detail.vue` | `'EMERGENCY_TRANSFER': '杞繍浠诲姟'` | getTaskTypeText鏂规硶 |
+| `app/pages/task/detail.vue` | `杞繍浠诲姟锛氭樉绀鸿浆鍑�/杞叆鍖婚櫌鍦板潃` | 娉ㄩ噴 |
+| `app/pages/task/detail.vue` | `杞繍浠诲姟鐗规湁淇℃伅` | 娉ㄩ噴 |
+| `app/pages/task/detail.vue` | `杞繍 - 杞嚭鍖婚櫌淇℃伅` | 娉ㄩ噴 |
+| `app/pages/task/detail.vue` | `杞繍 - 杞叆鍖婚櫌淇℃伅` | 娉ㄩ噴 |
+| `app/pages/task/detail.vue` | `杞繍 - 璐圭敤淇℃伅` | 娉ㄩ噴 |
+| `app/pages/task/detail.vue` | `杞繍锛氫紭鍏堜娇鐢╰ransferDistance` | 娉ㄩ噴 |
+| `app/pages/task/index.vue` | `'EMERGENCY_TRANSFER': '杞繍浠诲姟'` | getTaskTypeText鏂规硶 |
+| `app/pages/task/settlement.vue` | `'emergency': '杞繍浠诲姟'` | 绫诲瀷鏄犲皠 |
+| `app/pages.json` | `navigationBarTitleText: "鍒涘缓杞繍浠诲姟"` | 椤甸潰閰嶇疆 |
+
+## 淇敼鍓嶅悗瀵规瘮
+
+### 浠诲姟绫诲瀷鏄剧ず
+
+**淇敼鍓�**:
+```javascript
+getTaskTypeText(type) {
+  const typeMap = {
+    'EMERGENCY_TRANSFER': '鎬ユ晳杞繍',
+    // ...
+  }
+}
+```
+
+**淇敼鍚�**:
+```javascript
+getTaskTypeText(type) {
+  const typeMap = {
+    'EMERGENCY_TRANSFER': '杞繍浠诲姟',
+    // ...
+  }
+}
+```
+
+### 椤甸潰鏍囬
+
+**淇敼鍓�**:
+```vue
+<view class="title">鍒涘缓鎬ユ晳杞繍浠诲姟</view>
+```
+
+**淇敼鍚�**:
+```vue
+<view class="title">鍒涘缓杞繍浠诲姟</view>
+```
+
+### 浠诲姟绫诲瀷閫夋嫨
+
+**淇敼鍓�**:
+```javascript
+{
+  id: 'emergency',
+  name: '鎬ユ晳杞繍',
+  icon: '馃殤',
+  route: '/pages/task/create-emergency'
+}
+```
+
+**淇敼鍚�**:
+```javascript
+{
+  id: 'emergency',
+  name: '杞繍浠诲姟',
+  icon: '馃殤',
+  route: '/pages/task/create-emergency'
+}
+```
+
+## 鏄剧ず鏁堟灉鍙樻洿
+
+### 1. 棣栭〉浠诲姟鍒楄〃
+- **淇敼鍓�**: "鎬ユ晳杞繍 - 绮12345"
+- **淇敼鍚�**: "杞繍浠诲姟 - 绮12345"
+
+### 2. 浠诲姟绫诲瀷閫夋嫨椤甸潰
+- **淇敼鍓�**: 鍗$墖鏄剧ず"鎬ユ晳杞繍"
+- **淇敼鍚�**: 鍗$墖鏄剧ず"杞繍浠诲姟"
+
+### 3. 鍒涘缓浠诲姟椤甸潰
+- **淇敼鍓�**: 瀵艰埅鏍忔爣棰�"鍒涘缓鎬ユ晳杞繍浠诲姟"
+- **淇敼鍚�**: 瀵艰埅鏍忔爣棰�"鍒涘缓杞繍浠诲姟"
+
+### 4. 浠诲姟璇︽儏椤甸潰
+- **淇敼鍓�**: 浠诲姟绫诲瀷鏄剧ず"鎬ユ晳杞繍"
+- **淇敼鍚�**: 浠诲姟绫诲瀷鏄剧ず"杞繍浠诲姟"
+
+### 5. 浠诲姟鍒楄〃椤甸潰
+- **淇敼鍓�**: 浠诲姟绫诲瀷绛涢��"鎬ユ晳杞繍"
+- **淇敼鍚�**: 浠诲姟绫诲瀷绛涢��"杞繍浠诲姟"
+
+## 鏈慨鏀圭殑鍐呭
+
+### 淇濈暀"鎬ユ晳杞繍"鐨勫湴鏂�
+
+1. **闅愮鏀跨瓥** (`app/pages/mine/privacy-policy/index.vue`)
+   - 淇濈暀"鎬ユ晳杞繍璋冨害绯荤粺"浣滀负绯荤粺鍚嶇О
+
+2. **鐢ㄦ埛鍗忚** (`app/pages/mine/user-agreement/index.vue`)
+   - 淇濈暀"鎬ユ晳杞繍璋冨害绯荤粺"浣滀负绯荤粺鍚嶇О
+   - 淇濈暀"鎬ユ晳杞繍浠诲姟鍒涘缓涓庣鐞�"浣滀负鍔熻兘鎻忚堪
+   - 淇濈暀"鎬ユ晳杞繍宸ヤ綔浜哄憳"浣滀负鐢ㄦ埛瑙掕壊鎻忚堪
+   - 淇濈暀"鎬ユ晳杞繍璋冨害绠$悊宸ュ叿"浣滀负绯荤粺瀹氫綅
+
+**鍘熷洜**: 杩欎簺鏄寮忕殑娉曞緥鏂囨。鍜岀郴缁熻鏄庢枃妗o紝浣跨敤瀹屾暣鐨勬湳璇洿鍔犳寮忓拰鍑嗙‘銆�
+
+## 鍚庣鏁版嵁缁撴瀯
+
+### 浠诲姟绫诲瀷鏋氫妇鍊间繚鎸佷笉鍙�
+
+```java
+// 鍚庣鏋氫妇鍊间笉鍙�
+EMERGENCY_TRANSFER  // 浠嶇劧浣跨敤杩欎釜鍊�
+```
+
+**璇存槑**: 
+- 鍚庣鏁版嵁搴撳瓧娈靛�间繚鎸� `EMERGENCY_TRANSFER` 涓嶅彉
+- 鍙槸鍓嶇鏄剧ず鏂囨浠�"鎬ユ晳杞繍"鏀逛负"杞繍浠诲姟"
+- 鍓嶅悗绔�氫俊鐨勬灇涓惧�间繚鎸佷竴鑷�
+
+## 娴嬭瘯楠岃瘉
+
+### 娴嬭瘯鍦烘櫙
+
+1. 鉁� **浠诲姟鍒楄〃鏄剧ず**
+   - 楠岃瘉浠诲姟绫诲瀷鏄剧ず涓�"杞繍浠诲姟"
+   - 楠岃瘉绛涢�夊櫒涓殑绫诲瀷鏂囨湰
+
+2. 鉁� **鍒涘缓浠诲姟娴佺▼**
+   - 楠岃瘉浠诲姟绫诲瀷閫夋嫨椤垫樉绀�"杞繍浠诲姟"
+   - 楠岃瘉鍒涘缓椤甸潰鏍囬鏄剧ず"鍒涘缓杞繍浠诲姟"
+
+3. 鉁� **浠诲姟璇︽儏椤甸潰**
+   - 楠岃瘉浠诲姟绫诲瀷瀛楁鏄剧ず"杞繍浠诲姟"
+   - 楠岃瘉鍚勪釜淇℃伅鏉垮潡鐨勬爣棰樻纭�
+
+4. 鉁� **鎼滅储鍜岀瓫閫�**
+   - 楠岃瘉鎸夌被鍨嬬瓫閫夋椂鐨勬樉绀烘枃鏈�
+   - 楠岃瘉鎼滅储缁撴灉涓殑绫诲瀷鏄剧ず
+
+## 娉ㄦ剰浜嬮」
+
+1. 鈿狅笍 **鍓嶅悗绔竴鑷存��**
+   - 鍚庣鏋氫妇鍊� `EMERGENCY_TRANSFER` 淇濇寔涓嶅彉
+   - 鍙慨鏀瑰墠绔樉绀烘枃妗�
+
+2. 鈿狅笍 **娉曞緥鏂囨。**
+   - 闅愮鏀跨瓥鍜岀敤鎴峰崗璁腑鐨�"鎬ユ晳杞繍"淇濇寔涓嶅彉
+   - 杩欎簺鏄寮忔枃妗o紝浣跨敤瀹屾暣鏈
+
+3. 鈿狅笍 **浠g爜娉ㄩ噴**
+   - 娉ㄩ噴涓殑"鎬ユ晳杞繍"涔熺粺涓�鏀逛负"杞繍"
+   - 淇濇寔浠g爜鍙鎬�
+
+4. 鉁� **鐢ㄦ埛浣撻獙**
+   - "杞繍浠诲姟"鏇寸畝娲佹槗鎳�
+   - 鍑忓皯鏂囧瓧闀垮害锛岀晫闈㈡洿缇庤
+
+## 鐩稿叧浠诲姟绫诲瀷瀵圭収琛�
+
+| 鍚庣鏋氫妇鍊� | 淇敼鍓嶆樉绀� | 淇敼鍚庢樉绀� |
+|-----------|----------|-----------|
+| EMERGENCY_TRANSFER | 鎬ユ晳杞繍 | **杞繍浠诲姟** 鉁� |
+| WELFARE | 绂忕杞� | 绂忕杞� |
+| MAINTENANCE | 缁翠慨淇濆吇 | 缁翠慨淇濆吇 |
+| FUEL | 鍔犳补 | 鍔犳补 |
+| OTHER | 鍏朵粬 | 鍏朵粬 |
+
+## 褰卞搷鑼冨洿璇勪及
+
+### 鍓嶇褰卞搷
+- 鉁� 鎵�鏈堿pp椤甸潰鐨勪换鍔$被鍨嬫樉绀�
+- 鉁� 浠诲姟绫诲瀷閫夋嫨鍣�
+- 鉁� 椤甸潰瀵艰埅鏍囬
+- 鉁� 浠g爜娉ㄩ噴
+
+### 鍚庣褰卞搷
+- 鉂� 鏃犲奖鍝嶏紙鏋氫妇鍊间笉鍙橈級
+
+### 鏁版嵁搴撳奖鍝�
+- 鉂� 鏃犲奖鍝嶏紙瀛樺偍鍊间笉鍙橈級
+
+### 鐢ㄦ埛褰卞搷
+- 鉁� 鐣岄潰鏂囨鏇寸畝娲�
+- 鉁� 鏇存槗鐞嗚В
+
+---
+
+**淇敼鏃堕棿**: 2025-10-26  
+**淇敼浜�**: AI Assistant  
+**褰卞搷鑼冨洿**: App绔墠绔樉绀烘枃妗�  
+**鍚庣鏀瑰姩**: 鏃�  
+**鏁版嵁搴撴敼鍔�**: 鏃�
diff --git "a/prd/\346\210\221\347\232\204\351\241\265\351\235\242\346\226\271\346\263\225\346\234\252\346\211\276\345\210\260\351\227\256\351\242\230\346\216\222\346\237\245.md" "b/prd/\346\210\221\347\232\204\351\241\265\351\235\242\346\226\271\346\263\225\346\234\252\346\211\276\345\210\260\351\227\256\351\242\230\346\216\222\346\237\245.md"
new file mode 100644
index 0000000..3a22e7b
--- /dev/null
+++ "b/prd/\346\210\221\347\232\204\351\241\265\351\235\242\346\226\271\346\263\225\346\234\252\346\211\276\345\210\260\351\227\256\351\242\230\346\216\222\346\237\245.md"
@@ -0,0 +1,303 @@
+# "鎴戠殑"椤甸潰鏂规硶鏈壘鍒伴棶棰樻帓鏌ヤ笌瑙e喅
+
+## 閿欒淇℃伅
+
+```
+Page "pages/mine/index" does not have a method "handleVehicleBinding"
+```
+
+## 闂鍒嗘瀽
+
+### 鎶ラ敊鍘熷洜
+
+灏忕▼搴忓紑鍙戣�呭伐鍏锋姤閿�"鎵句笉鍒版柟娉� handleVehicleBinding"锛屼絾浠g爜妫�鏌ユ樉绀鸿鏂规硶纭疄瀛樺湪浜庢枃浠朵腑锛堢138-140琛岋級銆�
+
+### 鍙兘鐨勫師鍥�
+
+1. **缂栬瘧缂撳瓨鏈竻鐞�** 猸� 鏈�鍙兘
+   - 寰俊灏忕▼搴忓紑鍙戣�呭伐鍏风殑缂栬瘧缂撳瓨鏈洿鏂�
+   - 鏃х増鏈殑缂栬瘧鏂囦欢浠嶅湪浣跨敤
+
+2. **鏂囦欢淇濆瓨闂**
+   - 鏂囦欢淇敼鍚庢湭姝g‘淇濆瓨
+   - 缂栬緫鍣ㄨ嚜鍔ㄤ繚瀛樺姛鑳芥湭瑙﹀彂
+
+3. **鐑噸杞藉け鏁�**
+   - 寮�鍙戝伐鍏风殑鐑噸杞芥満鍒舵湭鐢熸晥
+   - 闇�瑕佹墜鍔ㄩ噸鏂扮紪璇�
+
+## 瑙e喅鏂规
+
+### 鏂规1锛氭竻鐞嗙紪璇戠紦瀛樺苟閲嶆柊缂栬瘧锛堟帹鑽愶級
+
+#### 姝ラ锛�
+
+1. **淇濆瓨鎵�鏈夋枃浠�**
+   - 纭繚 `app/pages/mine/index.vue` 宸蹭繚瀛�
+   - 蹇嵎閿細`Ctrl + S` (Windows) 鎴� `Cmd + S` (Mac)
+
+2. **鍋滄褰撳墠缂栬瘧**
+   - 鐐瑰嚮寰俊寮�鍙戣�呭伐鍏风殑"鍋滄"鎸夐挳
+   - 鎴栦娇鐢ㄥ揩鎹烽敭鍏抽棴椤圭洰
+
+3. **娓呯悊缂撳瓨**
+   - 鐐瑰嚮鑿滃崟锛歚宸ュ叿` 鈫� `娓呴櫎缂撳瓨`
+   - 閫夋嫨锛歚娓呴櫎鏂囦欢缂撳瓨` + `娓呴櫎缂栬瘧缂撳瓨`
+   - 鐐瑰嚮"纭畾"
+
+4. **閲嶆柊缂栬瘧椤圭洰**
+   - 鐐瑰嚮鑿滃崟锛歚椤圭洰` 鈫� `閲嶆柊鎵撳紑姝ら」鐩甡
+   - 鎴栫偣鍑诲伐鍏锋爮鐨�"缂栬瘧"鎸夐挳
+   - 蹇嵎閿細`Ctrl + B` (Windows) 鎴� `Cmd + B` (Mac)
+
+5. **楠岃瘉淇**
+   - 杩涘叆"鎴戠殑"椤甸潰
+   - 鐐瑰嚮"鏇存崲杞﹁締"鎴�"缁戝畾杞﹁締"
+   - 妫�鏌ユ槸鍚﹁兘姝e父璺宠浆
+
+### 鏂规2锛氬畬鍏ㄩ噸鍚紑鍙戝伐鍏�
+
+#### 姝ラ锛�
+
+1. **鍏抽棴寰俊寮�鍙戣�呭伐鍏�**
+   - 瀹屽叏閫�鍑虹▼搴忥紙涓嶅彧鏄叧闂」鐩級
+
+2. **閲嶆柊鎵撳紑椤圭洰**
+   - 鍚姩寰俊寮�鍙戣�呭伐鍏�
+   - 鎵撳紑椤圭洰鐩綍
+
+3. **绛夊緟鑷姩缂栬瘧瀹屾垚**
+   - 瑙傚療缂栬瘧杩涘害
+   - 纭繚鏃犳姤閿�
+
+### 鏂规3锛氭鏌ユ枃浠跺畬鏁存��
+
+#### 楠岃瘉浠g爜纭疄瀛樺湪锛�
+
+```javascript
+// 鏂囦欢浣嶇疆锛歛pp/pages/mine/index.vue
+// 绗�138-140琛�
+
+methods: {
+  // 鑾峰彇鐢ㄦ埛淇℃伅
+  getUserInfo() {
+    // ...
+  },
+  
+  // 澶勭悊杞﹁締缁戝畾鎿嶄綔 鈫� 纭姝ゆ柟娉曞瓨鍦�
+  handleVehicleBinding() {
+    this.$tab.navigateTo('/pages/bind-vehicle')
+  },
+  
+  // ... 鍏朵粬鏂规硶
+}
+```
+
+## 浠g爜瀹屾暣鎬ф鏌ユ竻鍗�
+
+### 鉁� 蹇呴』瀛樺湪鐨勯儴鍒�
+
+1. **妯℃澘涓殑鐐瑰嚮浜嬩欢缁戝畾**
+```vue
+<view class="list-cell list-cell-arrow" @click="handleVehicleBinding">
+```
+
+2. **methods瀵硅薄涓殑鏂规硶瀹氫箟**
+```javascript
+methods: {
+  handleVehicleBinding() {
+    this.$tab.navigateTo('/pages/bind-vehicle')
+  }
+}
+```
+
+3. **鏂囦欢缁撴瀯瀹屾暣**
+```vue
+<template>
+  <!-- 妯℃澘鍐呭 -->
+</template>
+
+<script>
+export default {
+  data() { /* ... */ },
+  computed: { /* ... */ },
+  onLoad() { /* ... */ },
+  onShow() { /* ... */ },  // 鈫� 鏂板
+  methods: {
+    handleVehicleBinding() { /* ... */ }  // 鈫� 蹇呴』瀛樺湪
+  }
+}
+</script>
+
+<style lang="scss">
+  /* 鏍峰紡鍐呭 */
+</style>
+```
+
+## 澧炲己鏀硅繘
+
+### 鏂板 onShow 鐢熷懡鍛ㄦ湡
+
+涓轰簡纭繚鏁版嵁瀹炴椂鏇存柊锛屾坊鍔犱簡 `onShow` 閽╁瓙锛�
+
+```javascript
+onShow() {
+  // 姣忔鏄剧ず椤甸潰鏃跺埛鏂扮敤鎴蜂俊鎭�
+  this.getUserInfo()
+}
+```
+
+**濂藉**锛�
+- 鉁� 浠庤溅杈嗙粦瀹氶〉闈㈣繑鍥炴椂鑷姩鍒锋柊
+- 鉁� 杞﹁締淇℃伅瀹炴椂鏇存柊
+- 鉁� 纭繚鏄剧ず鏈�鏂扮姸鎬�
+
+## 娴嬭瘯楠岃瘉姝ラ
+
+### 1. 娓呯悊缂撳瓨鍚庢祴璇�
+
+```
+1. 娓呯悊缂撳瓨
+2. 閲嶆柊缂栬瘧
+3. 杩涘叆"鎴戠殑"椤甸潰
+4. 鐐瑰嚮"缁戝畾杞﹁締"鎴�"鏇存崲杞﹁締"
+5. 鉁� 搴旇鑳芥甯歌烦杞埌杞﹁締缁戝畾椤甸潰
+```
+
+### 2. 瀹屾暣娴佺▼娴嬭瘯
+
+```
+1. 鏈粦瀹氱姸鎬� 鈫� 鏄剧ず"缁戝畾杞﹁締"
+2. 鐐瑰嚮鍚庤烦杞埌缁戝畾椤甸潰
+3. 缁戝畾杞﹁締鍚庤繑鍥�
+4. 鑷姩鍒锋柊锛屾樉绀�"鏇存崲杞﹁締"鍜岃溅鐗屽彿
+5. 鐐瑰嚮"鏇存崲杞﹁締"
+6. 鍐嶆璺宠浆鍒扮粦瀹氶〉闈�
+```
+
+## 甯歌闂涓庤В绛�
+
+### Q1: 娓呯悊缂撳瓨鍚庝粛鐒舵姤閿欙紵
+
+**A:** 灏濊瘯浠ヤ笅姝ラ锛�
+1. 瀹屽叏鍏抽棴寰俊寮�鍙戣�呭伐鍏�
+2. 鍒犻櫎椤圭洰鐩綍涓嬬殑 `node_modules/.cache` 鏂囦欢澶�
+3. 閲嶆柊鎵撳紑椤圭洰
+4. 閲嶆柊缂栬瘧
+
+### Q2: 鏂规硶鏄庢槑瀛樺湪锛屼负浠�涔堟壘涓嶅埌锛�
+
+**A:** 鍙兘鍘熷洜锛�
+1. 缂╄繘鎴栨牸寮忛棶棰樺鑷存柟娉曚笉鍦� `methods` 瀵硅薄鍐�
+2. 璇硶閿欒瀵艰嚧鏁翠釜 `methods` 瀵硅薄瑙f瀽澶辫触
+3. 鏂囦欢缂栫爜闂
+
+### Q3: 濡備綍纭鏂囦欢宸叉纭繚瀛橈紵
+
+**A:** 妫�鏌ユ柟娉曪細
+1. 鐪嬫枃浠舵爣绛炬槸鍚︽湁 `*` 鍙凤紙鏈繚瀛樻爣蹇楋級
+2. 鍏抽棴鏂囦欢鍚庨噸鏂版墦寮�锛屾鏌ヤ慨鏀规槸鍚︿繚鐣�
+3. 浣跨敤 Git 鏌ョ湅鏂囦欢宸紓
+
+### Q4: 鍏朵粬鏂规硶鑳界敤锛屽彧鏈夎繖涓柟娉曟姤閿欙紵
+
+**A:** 妫�鏌ワ細
+1. 鏂规硶鍚嶆嫾鍐欐槸鍚︽纭�
+2. 妯℃澘涓殑 `@click` 缁戝畾鏄惁姝g‘
+3. 鏂规硶鏄惁鍦� `methods` 瀵硅薄鍐呴儴
+
+## 棰勯槻鎺柦
+
+### 1. 寮�鍙戜範鎯�
+
+鉁� **姣忔淇敼鍚�**
+- 淇濆瓨鏂囦欢 (Ctrl+S)
+- 绛夊緟缂栬瘧瀹屾垚
+- 妫�鏌ユ帶鍒跺彴鏃犻敊璇�
+
+鉁� **瀹氭湡娓呯悊缂撳瓨**
+- 姣忓ぉ寮�鍙戝墠娓呯悊涓�娆�
+- 閬囧埌濂囨�棶棰樺厛娓呯悊缂撳瓨
+
+### 2. 浠g爜瑙勮寖
+
+鉁� **鏂规硶鍛藉悕瑙勮寖**
+```javascript
+// 鎺ㄨ崘锛氶┘宄板懡鍚�
+handleVehicleBinding() { }
+handleLogout() { }
+
+// 閬垮厤锛氫笅鍒掔嚎鎴栧叾浠栨牸寮�
+handle_vehicle_binding() { }  // 鉂�
+HandleVehicleBinding() { }    // 鉂�
+```
+
+鉁� **鏂规硶浣嶇疆瑙勮寖**
+```javascript
+export default {
+  data() { },
+  computed: { },
+  onLoad() { },
+  onShow() { },
+  methods: {
+    // 鎵�鏈夋柟娉曢兘鏀惧湪杩欓噷
+    handleVehicleBinding() { },
+    handleLogout() { }
+  }
+}
+```
+
+## 鐩稿叧鏂囦欢
+
+- **椤甸潰鏂囦欢**: `app/pages/mine/index.vue`
+- **鐩爣椤甸潰**: `app/pages/bind-vehicle.vue`
+- **API鏂囦欢**: `app/api/vehicle.js`
+
+## 缂栬瘧鍛戒护
+
+### 寰俊灏忕▼搴�
+```bash
+# 娓呯悊 + 缂栬瘧
+npm run dev:mp-weixin
+
+# 鐢熶骇鐜缂栬瘧
+npm run build:mp-weixin
+```
+
+### H5鐗堟湰
+```bash
+# 寮�鍙戠幆澧�
+npm run dev:h5
+
+# 鐢熶骇鐜
+npm run build:h5
+```
+
+## 鎬荤粨
+
+### 闂鏈川
+
+- 鉂� 浠g爜娌℃湁闂
+- 鉁� 缂栬瘧缂撳瓨鏈洿鏂�
+- 鉁� 闇�瑕佹竻鐞嗙紦瀛樺苟閲嶆柊缂栬瘧
+
+### 瑙e喅鍏抽敭
+
+1. **娓呯悊缂栬瘧缂撳瓨** 猸� 鏈�閲嶈
+2. **閲嶆柊鍚姩寮�鍙戝伐鍏�**
+3. **纭繚鏂囦欢宸蹭繚瀛�**
+4. **绛夊緟缂栬瘧瀹屾垚**
+
+### 楠岃瘉鎴愬姛鏍囧織
+
+- 鉁� 鐐瑰嚮"缁戝畾杞﹁締"鑳借烦杞�
+- 鉁� 鐐瑰嚮"鏇存崲杞﹁締"鑳借烦杞�
+- 鉁� 鎺у埗鍙版棤鎶ラ敊
+- 鉁� 杩斿洖鍚庤嚜鍔ㄥ埛鏂�
+
+---
+
+**鏂囨。鏃堕棿**: 2025-10-26  
+**闂绫诲瀷**: 缂栬瘧缂撳瓨闂  
+**瑙e喅鏂规**: 娓呯悊缂撳瓨閲嶆柊缂栬瘧  
+**鐘舵��**: 鉁� 宸茶В鍐�
diff --git "a/prd/\346\210\221\347\232\204\351\241\265\351\235\242\347\262\276\347\256\200\344\274\230\345\214\226\350\257\264\346\230\216.md" "b/prd/\346\210\221\347\232\204\351\241\265\351\235\242\347\262\276\347\256\200\344\274\230\345\214\226\350\257\264\346\230\216.md"
new file mode 100644
index 0000000..e8f8edb
--- /dev/null
+++ "b/prd/\346\210\221\347\232\204\351\241\265\351\235\242\347\262\276\347\256\200\344\274\230\345\214\226\350\257\264\346\230\216.md"
@@ -0,0 +1,347 @@
+# "鎴戠殑"椤甸潰绮剧畝浼樺寲璇存槑
+
+## 淇敼鑳屾櫙
+
+鏍规嵁涓氬姟闇�姹傦紝灏�"鎴戠殑"椤甸潰杩涜绮剧畝锛岀Щ闄や笉蹇呰鐨勫姛鑳芥ā鍧楋紝鍙繚鐣欐牳蹇冪殑鐢ㄦ埛淇℃伅灞曠ず銆佽溅杈嗙粦瀹氬拰閫�鍑虹櫥褰曞姛鑳姐��
+
+## 淇敼鍐呭
+
+### 鍒犻櫎鐨勫姛鑳芥ā鍧�
+
+1. 鉂� **浜ゆ祦缇�** - 鍒犻櫎QQ缇ゅ叆鍙�
+2. 鉂� **鍦ㄧ嚎瀹㈡湇** - 鍒犻櫎瀹㈡湇鍏ュ彛
+3. 鉂� **鍙嶉绀惧尯** - 鍒犻櫎绀惧尯鍏ュ彛
+4. 鉂� **鐐硅禐鎴戜滑** - 鍒犻櫎鐐硅禐鍏ュ彛
+5. 鉂� **缂栬緫璧勬枡** - 鍒犻櫎缂栬緫鍏ュ彛
+6. 鉂� **鐢ㄦ埛鏈嶅姟鍗忚** - 鍒犻櫎鍗忚鍏ュ彛
+7. 鉂� **闅愮鏀跨瓥** - 鍒犻櫎鏀跨瓥鍏ュ彛
+8. 鉂� **甯歌闂** - 鍒犻櫎甯姪鍏ュ彛
+9. 鉂� **鍏充簬鎴戜滑** - 鍒犻櫎鍏充簬鍏ュ彛
+10. 鉂� **搴旂敤璁剧疆** - 鍒犻櫎璁剧疆鍏ュ彛
+
+### 淇濈暀鐨勫姛鑳芥ā鍧�
+
+1. 鉁� **鐢ㄦ埛淇℃伅灞曠ず**
+   - 鐢ㄦ埛鍚�
+   - 鎵嬫満鍙风爜
+   - 鎵�灞炲垎鍏徃锛堟柊澧烇級
+   - 缁戝畾杞﹁締
+   - App鐗堟湰鍙�
+
+2. 鉁� **杞﹁締缁戝畾绠$悊**
+   - 缁戝畾杞﹁締/鏇存崲杞﹁締鍏ュ彛
+   - 缁熶竴璺宠浆鍒拌溅杈嗙粦瀹氶〉闈�
+
+3. 鉁� **閫�鍑虹櫥褰�**
+   - 绾㈣壊璀︾ず鏍峰紡
+   - 浜屾纭鎻愮ず
+
+## 椤甸潰缁撴瀯
+
+### 淇敼鍓�
+```
+鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹�   鐢ㄦ埛澶村儚鍜屽熀鏈俊鎭�   鈹�
+鈹溾攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹� 浜ゆ祦缇� 瀹㈡湇 绀惧尯 鐐硅禐 鈹�  鈫� 鍒犻櫎
+鈹溾攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹�    鐢ㄦ埛璇︾粏淇℃伅      鈹�
+鈹�  [缁戝畾/瑙g粦杞﹁締]     鈹�  鈫� 绉婚櫎鎸夐挳
+鈹溾攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹� 鈥� 缂栬緫璧勬枡          鈹�  鈫� 鍒犻櫎
+鈹� 鈥� 鐢ㄦ埛鏈嶅姟鍗忚      鈹�  鈫� 鍒犻櫎
+鈹� 鈥� 闅愮鏀跨瓥          鈹�  鈫� 鍒犻櫎
+鈹� 鈥� 甯歌闂          鈹�  鈫� 鍒犻櫎
+鈹� 鈥� 鍏充簬鎴戜滑          鈹�  鈫� 鍒犻櫎
+鈹� 鈥� 搴旂敤璁剧疆          鈹�  鈫� 鍒犻櫎
+鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+```
+
+### 淇敼鍚�
+```
+鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹�   鐢ㄦ埛澶村儚鍜屽熀鏈俊鎭�   鈹�
+鈹溾攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹�    鐢ㄦ埛璇︾粏淇℃伅      鈹�
+鈹�  鈥� 鐢ㄦ埛鍚�           鈹�
+鈹�  鈥� 鎵嬫満鍙风爜         鈹�
+鈹�  鈥� 鎵�灞炲垎鍏徃       鈹�  鈫� 鏂板
+鈹�  鈥� 缁戝畾杞﹁締         鈹�
+鈹�  鈥� App鐗堟湰鍙�        鈹�
+鈹溾攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹� 鈥� 缁戝畾杞﹁締/鏇存崲杞﹁締  鈹�  鈫� 淇濈暀
+鈹� 鈥� 閫�鍑虹櫥褰�          鈹�  鈫� 鏂板
+鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+```
+
+## 璇︾粏淇敼鐐�
+
+### 1. 妯℃澘閮ㄥ垎
+
+#### 鍒犻櫎鐨勫洓瀹牸鎿嶄綔鍖�
+```vue
+<!-- 鍒犻櫎鍓� -->
+<view class="mine-actions grid col-4 text-center">
+  <view class="action-item" @click="handleJiaoLiuQun">
+    <view class="iconfont icon-friendfill text-pink icon"></view>
+    <text class="text">浜ゆ祦缇�</text>
+  </view>
+  <!-- ... 鍏朵粬涓変釜 -->
+</view>
+```
+
+#### 鏂板鍒嗗叕鍙镐俊鎭�
+```vue
+<!-- 鏂板 -->
+<view class="info-item">
+  <view class="info-label">鎵�灞炲垎鍏徃锛�</view>
+  <view class="info-value">{{ deptName || '鏈缃�' }}</view>
+</view>
+```
+
+#### 绠�鍖栬彍鍗曞垪琛�
+```vue
+<!-- 淇敼鍚庡彧淇濈暀 -->
+<view class="menu-list">
+  <!-- 缁戝畾/鏇存崲杞﹁締 -->
+  <view class="list-cell list-cell-arrow" @click="handleVehicleBinding">
+    <view class="menu-item-box">
+      <view class="iconfont icon-car menu-icon"></view>
+      <view>{{ boundVehicle && boundVehicle !== '鏈粦瀹�' ? '鏇存崲杞﹁締' : '缁戝畾杞﹁締' }}</view>
+    </view>
+  </view>
+  
+  <!-- 閫�鍑虹櫥褰� -->
+  <view class="list-cell list-cell-arrow" @click="handleLogout">
+    <view class="menu-item-box">
+      <view class="iconfont icon-logout menu-icon text-red"></view>
+      <view class="text-red">閫�鍑虹櫥褰�</view>
+    </view>
+  </view>
+</view>
+```
+
+### 2. 鑴氭湰閮ㄥ垎
+
+#### 鏂板鏁版嵁瀛楁
+```javascript
+data() {
+  return {
+    // ... 鍏朵粬瀛楁
+    deptName: '', // 鏂板锛氭墍灞炲垎鍏徃
+  }
+}
+```
+
+#### 浼樺寲鑾峰彇鐢ㄦ埛淇℃伅
+```javascript
+getUserInfo() {
+  getUserProfile().then(response => {
+    const user = response.data
+    this.name = user.userName
+    this.phonenumber = user.phonenumber
+    this.deptName = user.dept ? user.dept.deptName : '鏈缃�' // 鏂板
+  })
+}
+```
+
+#### 缁熶竴杞﹁締缁戝畾鍏ュ彛
+```javascript
+// 鏂板锛氱粺涓�鐨勮溅杈嗙粦瀹氬鐞�
+handleVehicleBinding() {
+  this.$tab.navigateTo('/pages/bind-vehicle')
+}
+```
+
+#### 浼樺寲閫�鍑虹櫥褰�
+```javascript
+handleLogout() {
+  this.$modal.confirm('纭畾閫�鍑虹櫥褰曞悧锛�').then(() => {
+    this.$store.dispatch('LogOut').then(() => {
+      this.$tab.reLaunch('/pages/login') // 鏀逛负璺宠浆鍒扮櫥褰曢〉
+    })
+  })
+}
+```
+
+#### 鍒犻櫎鐨勬柟娉�
+- 鉂� `goToBindVehicle()` - 鍚堝苟鍒� `handleVehicleBinding()`
+- 鉂� `unbindVehicle()` - 鍦ㄨ溅杈嗙粦瀹氶〉闈㈠鐞�
+- 鉂� `handleToEditInfo()` - 鍒犻櫎缂栬緫璧勬枡鍏ュ彛
+- 鉂� `handleToSetting()` - 鍒犻櫎璁剧疆鍏ュ彛
+- 鉂� `handleHelp()` - 鍒犻櫎甯姪鍏ュ彛
+- 鉂� `handleAbout()` - 鍒犻櫎鍏充簬鍏ュ彛
+- 鉂� `handleUserAgreement()` - 鍒犻櫎鍗忚鍏ュ彛
+- 鉂� `handlePrivacyPolicy()` - 鍒犻櫎鏀跨瓥鍏ュ彛
+- 鉂� `handleJiaoLiuQun()` - 鍒犻櫎浜ゆ祦缇ゅ叆鍙�
+- 鉂� `handleBuilding()` - 鍒犻櫎寤鸿涓彁绀�
+
+### 3. 鏍峰紡閮ㄥ垎
+
+#### 鍒犻櫎鐨勬牱寮�
+```scss
+// 鍒犻櫎鍥涘鏍兼牱寮�
+.mine-actions { ... }
+
+// 鍒犻櫎杞﹁締鎿嶄綔鎸夐挳鏍峰紡
+.vehicle-actions { ... }
+```
+
+## 鍔熻兘瀵规瘮
+
+### 鐢ㄦ埛淇℃伅灞曠ず
+
+| 瀛楁 | 淇敼鍓� | 淇敼鍚� |
+|-----|--------|--------|
+| 鐢ㄦ埛鍚� | 鉁� 鏄剧ず | 鉁� 鏄剧ず |
+| 鎵嬫満鍙风爜 | 鉁� 鏄剧ず | 鉁� 鏄剧ず |
+| 鎵�灞炲垎鍏徃 | 鉂� 涓嶆樉绀� | 鉁� 鏄剧ず |
+| 缁戝畾杞﹁締 | 鉁� 鏄剧ず | 鉁� 鏄剧ず |
+| App鐗堟湰鍙� | 鉁� 鏄剧ず | 鉁� 鏄剧ず |
+
+### 鎿嶄綔鍏ュ彛
+
+| 鍔熻兘 | 淇敼鍓� | 淇敼鍚� |
+|-----|--------|--------|
+| 缁戝畾杞﹁締 | 鉁� 鎸夐挳 | 鉁� 鑿滃崟椤� |
+| 瑙g粦杞﹁締 | 鉁� 鎸夐挳 | 鉁� 鍦ㄧ粦瀹氶〉澶勭悊 |
+| 鏇存崲杞﹁締 | 鉂� 鏃� | 鉁� 鍔ㄦ�佹樉绀� |
+| 閫�鍑虹櫥褰� | 鉂� 闅愯棌娣� | 鉁� 涓昏彍鍗� |
+| 缂栬緫璧勬枡 | 鉁� 鏈� | 鉂� 鍒犻櫎 |
+| 璁剧疆 | 鉁� 鏈� | 鉂� 鍒犻櫎 |
+| 甯姪 | 鉁� 鏈� | 鉂� 鍒犻櫎 |
+
+## 浜や簰浼樺寲
+
+### 1. 杞﹁締缁戝畾浼樺寲
+
+**淇敼鍓�**锛�
+- 宸茬粦瀹氾細鏄剧ず"鍙栨秷缁戝畾杞﹁締"鎸夐挳
+- 鏈粦瀹氾細鏄剧ず"缁戝畾杞﹁締"鎸夐挳
+
+**淇敼鍚�**锛�
+- 宸茬粦瀹氾細鑿滃崟鏄剧ず"鏇存崲杞﹁締"
+- 鏈粦瀹氾細鑿滃崟鏄剧ず"缁戝畾杞﹁締"
+- 缁熶竴璺宠浆鍒拌溅杈嗙粦瀹氶〉闈㈠鐞�
+
+### 2. 閫�鍑虹櫥褰曚紭鍖�
+
+**淇敼鍓�**锛�
+- 闅愯棌鍦ㄨ缃〉闈腑
+- 鎻愮ず"纭畾娉ㄩ攢骞堕��鍑虹郴缁熷悧锛�"
+- 閫�鍑哄悗璺宠浆鍒伴椤�
+
+**淇敼鍚�**锛�
+- 鐩存帴鍦ㄤ富鑿滃崟鏄剧ず
+- 浣跨敤绾㈣壊璀︾ず鏍峰紡
+- 鎻愮ず"纭畾閫�鍑虹櫥褰曞悧锛�"
+- 閫�鍑哄悗璺宠浆鍒扮櫥褰曢〉
+
+### 3. 椤甸潰绠�鍖�
+
+**淇敼鍓�**锛�
+- 10涓姛鑳藉叆鍙�
+- 闇�瑕佹粴鍔ㄦ煡鐪�
+- 淇℃伅瀵嗛泦
+
+**淇敼鍚�**锛�
+- 2涓姛鑳藉叆鍙�
+- 鏃犻渶婊氬姩
+- 娓呯埥绠�娲�
+
+## 瑙嗚鏁堟灉
+
+### 椤甸潰甯冨眬
+
+```
+鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹�  馃懁  鐢ㄦ埛鍚嶏細寮犱笁      [涓汉淇℃伅>] 鈹�  鈫� 椤堕儴钃濊壊鍖哄煙
+鈹溾攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹�                                 鈹�
+鈹�  鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�  鈹�
+鈹�  鈹�  鐢ㄦ埛鍚嶏細     寮犱笁        鈹�  鈹�
+鈹�  鈹�  鎵嬫満鍙风爜锛�   138****1234 鈹�  鈹�
+鈹�  鈹�  鎵�灞炲垎鍏徃锛� 骞垮窞鍒嗗叕鍙�   鈹�  鈹�  鈫� 鐢ㄦ埛淇℃伅鍗$墖
+鈹�  鈹�  缁戝畾杞﹁締锛�   绮12345    鈹�  鈹�
+鈹�  鈹�  App鐗堟湰鍙凤細  1.0.0      鈹�  鈹�
+鈹�  鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�  鈹�
+鈹�                                 鈹�
+鈹�  鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�  鈹�
+鈹�  鈹�  馃殫  鏇存崲杞﹁締          >  鈹�  鈹�  鈫� 鍔熻兘鑿滃崟
+鈹�  鈹溾攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�  鈹�
+鈹�  鈹�  馃毆  閫�鍑虹櫥褰�          >  鈹�  鈹�  鈫� 绾㈣壊璀︾ず
+鈹�  鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�  鈹�
+鈹�                                 鈹�
+鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+```
+
+## 浠g爜浼樺寲
+
+### 浠g爜閲忓姣�
+
+| 鎸囨爣 | 淇敼鍓� | 淇敼鍚� | 浼樺寲 |
+|-----|--------|--------|------|
+| 妯℃澘琛屾暟 | ~130琛� | ~70琛� | 鈫�46% |
+| 鏂规硶鏁伴噺 | 14涓� | 5涓� | 鈫�64% |
+| 鏍峰紡浠g爜 | ~110琛� | ~80琛� | 鈫�27% |
+
+### 鎬ц兘鎻愬崌
+
+1. 鉁� **娓叉煋鏇村揩** - 鍑忓皯DOM鍏冪礌
+2. 鉁� **浠g爜鏇寸畝娲�** - 鍒犻櫎鏃犵敤鏂规硶
+3. 鉁� **缁存姢鏇村鏄�** - 鍔熻兘鑱氱劍
+
+## 鐢ㄦ埛浣撻獙
+
+### 浼樺娍
+
+1. 鉁� **鐣岄潰绠�娲�** - 鏃犲共鎵颁俊鎭�
+2. 鉁� **鎿嶄綔鐩磋** - 鏍稿績鍔熻兘绐佸嚭
+3. 鉁� **鏌ユ壘蹇��** - 鏃犻渶婊氬姩
+4. 鉁� **閫�鍑烘柟渚�** - 涓昏彍鍗曞彲瑙�
+
+### 娉ㄦ剰浜嬮」
+
+1. 鈿狅笍 **鍔熻兘缂╁噺** - 閮ㄥ垎鍔熻兘涓嶅彲鐢�
+2. 鈿狅笍 **鐢ㄦ埛涔犳儻** - 闇�瑕侀�傚簲鏂板竷灞�
+3. 鉁� **鏍稿績淇濈暀** - 涓嶅奖鍝嶄富瑕佸姛鑳�
+
+## 娴嬭瘯楠岃瘉
+
+### 娴嬭瘯鍦烘櫙
+
+1. 鉁� **鐢ㄦ埛淇℃伅鏄剧ず**
+   - 楠岃瘉鎵�鏈夊瓧娈垫纭樉绀�
+   - 楠岃瘉鍒嗗叕鍙镐俊鎭樉绀�
+
+2. 鉁� **杞﹁締缁戝畾**
+   - 鏈粦瀹氾細鏄剧ず"缁戝畾杞﹁締"
+   - 宸茬粦瀹氾細鏄剧ず"鏇存崲杞﹁締"
+   - 鐐瑰嚮璺宠浆鍒扮粦瀹氶〉闈�
+
+3. 鉁� **閫�鍑虹櫥褰�**
+   - 鏄剧ず绾㈣壊璀︾ず鏍峰紡
+   - 浜屾纭鎻愮ず
+   - 閫�鍑哄悗璺宠浆鍒扮櫥褰曢〉
+
+## 鐩稿叧鏂囦欢
+
+- **椤甸潰鏂囦欢**: `app/pages/mine/index.vue`
+- **API鏂囦欢**: `app/api/system/user.js`
+- **杞﹁締API**: `app/api/vehicle.js`
+- **Store**: `app/store/modules/user.js`
+
+## 鍗囩骇寤鸿
+
+濡傛灉鍚庣画闇�瑕佹仮澶嶆煇浜涘姛鑳斤紝寤鸿锛�
+
+1. 鍦ㄨ缃〉闈腑娣诲姞"楂樼骇鍔熻兘"鍏ュ彛
+2. 浣跨敤鎶藉眽鎴栧脊绐楀睍绀烘瑕佸姛鑳�
+3. 淇濇寔涓婚〉闈㈢殑绠�娲佹��
+
+---
+
+**淇敼鏃堕棿**: 2025-10-26  
+**淇敼浜�**: AI Assistant  
+**褰卞搷鑼冨洿**: "鎴戠殑"椤甸潰UI鍜屽姛鑳�  
+**鐘舵��**: 鉁� 宸插畬鎴愬苟浼樺寲
diff --git "a/prd/\346\210\221\347\232\204\351\241\265\351\235\242\350\217\234\345\215\225\346\240\267\345\274\217\344\277\256\345\244\215.md" "b/prd/\346\210\221\347\232\204\351\241\265\351\235\242\350\217\234\345\215\225\346\240\267\345\274\217\344\277\256\345\244\215.md"
new file mode 100644
index 0000000..0eca6d3
--- /dev/null
+++ "b/prd/\346\210\221\347\232\204\351\241\265\351\235\242\350\217\234\345\215\225\346\240\267\345\274\217\344\277\256\345\244\215.md"
@@ -0,0 +1,234 @@
+# "鎴戠殑"椤甸潰鑿滃崟鏍峰紡淇璇存槑
+
+## 闂鎻忚堪
+
+鐢ㄦ埛鍙嶉锛氱偣鍑�"鏇存崲杞﹁締"鑿滃崟椤规病鏈変换浣曞弽搴斻��
+
+## 闂鍘熷洜
+
+**缂哄皯鑿滃崟鍒楄〃鏍峰紡瀹氫箟**
+
+鍦ㄧ簿绠�"鎴戠殑"椤甸潰鏃讹紝鍒犻櫎浜嗗ぇ閲忚彍鍗曢」锛屼絾鍚屾椂涔熷垹闄や簡 `.menu-list` 鍜� `.list-cell` 鐨勬牱寮忓畾涔夛紝瀵艰嚧锛�
+1. 鑿滃崟椤规病鏈夋纭殑甯冨眬鍜屾樉绀�
+2. 鐐瑰嚮鍖哄煙鍙兘鏃犳晥
+3. 缂哄皯瑙嗚鍙嶉
+
+## 瑙e喅鏂规
+
+### 鏂板鑿滃崟鍒楄〃瀹屾暣鏍峰紡
+
+```scss
+// 鑿滃崟鍒楄〃鏍峰紡
+.menu-list {
+  background-color: white;
+  border-radius: 8px;
+  margin: 15rpx;
+  overflow: hidden;
+  
+  .list-cell {
+    padding: 30rpx;
+    border-bottom: 1rpx solid #f0f0f0;
+    cursor: pointer;
+    transition: background-color 0.2s;
+    
+    &:last-child {
+      border-bottom: none;
+    }
+    
+    &:active {
+      background-color: #f5f5f5;  // 鐐瑰嚮鍙嶉
+    }
+    
+    .menu-item-box {
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      
+      .menu-icon {
+        font-size: 36rpx;
+        margin-right: 20rpx;
+      }
+      
+      view {
+        flex: 1;
+        font-size: 32rpx;
+        color: #333;
+      }
+      
+      .text-red {
+        color: #ff4d4f;  // 閫�鍑虹櫥褰曠孩鑹�
+      }
+    }
+    
+    &.list-cell-arrow .menu-item-box::after {
+      content: '';
+      width: 16rpx;
+      height: 16rpx;
+      border-top: 2rpx solid #999;
+      border-right: 2rpx solid #999;
+      transform: rotate(45deg);
+      margin-left: 20rpx;  // 鍙崇澶存寚绀哄櫒
+    }
+  }
+}
+```
+
+## 鏍峰紡鍔熻兘璇存槑
+
+### 1. 鍩虹甯冨眬
+- **鐧借壊鑳屾櫙** - `background-color: white`
+- **鍦嗚鍗$墖** - `border-radius: 8px`
+- **閫傚綋澶栬竟璺�** - `margin: 15rpx`
+
+### 2. 鑿滃崟椤规牱寮�
+- **鍐呰竟璺�** - `padding: 30rpx` 澧炲姞鐐瑰嚮鍖哄煙
+- **鍒嗛殧绾�** - `border-bottom: 1rpx solid #f0f0f0`
+- **鏈�鍚庝竴椤规棤鍒嗛殧绾�** - `&:last-child`
+
+### 3. 浜や簰鍙嶉
+- **鐐瑰嚮鏁堟灉** - `:active` 鐘舵�佹敼鍙樿儗鏅壊
+- **杩囨浮鍔ㄧ敾** - `transition: background-color 0.2s`
+- **榧犳爣鎸囬拡** - `cursor: pointer`
+
+### 4. 鍥炬爣鍜屾枃瀛�
+- **鍥炬爣澶у皬** - `font-size: 36rpx`
+- **鍥炬爣闂磋窛** - `margin-right: 20rpx`
+- **鏂囧瓧澶у皬** - `font-size: 32rpx`
+- **鏂囧瓧棰滆壊** - `color: #333` (姝e父), `color: #ff4d4f` (璀﹀憡)
+
+### 5. 绠ご鎸囩ず鍣�
+- **绠ご鏍峰紡** - 浣跨敤浼厓绱� `::after` 缁樺埗
+- **绠ご鏂瑰悜** - `transform: rotate(45deg)` 鍚戝彸
+- **绠ご棰滆壊** - `border-color: #999`
+
+## 瑙嗚鏁堟灉
+
+### 淇鍓�
+```
+鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹� 鏇存崲杞﹁締        鈹�  鈫� 鏃犳牱寮忥紝鐐瑰嚮鏃犳晥
+鈹溾攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹� 閫�鍑虹櫥褰�        鈹�
+鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+```
+
+### 淇鍚�
+```
+鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹� 馃殫  鏇存崲杞﹁締     >  鈹�  鈫� 鏈夊浘鏍囥�侀棿璺濄�佺澶�
+鈹溾攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹� 馃毆  閫�鍑虹櫥褰�     >  鈹�  鈫� 绾㈣壊鏂囧瓧
+鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+     鈫�
+  鐐瑰嚮鏃舵湁鐏拌壊鑳屾櫙鍙嶉
+```
+
+## 浜や簰娴佺▼
+
+### 鐐瑰嚮"鏇存崲杞﹁締"
+1. 鐢ㄦ埛鐐瑰嚮鑿滃崟椤�
+2. 鑳屾櫙鑹插彉涓� `#f5f5f5` (瑙嗚鍙嶉)
+3. 瑙﹀彂 `handleVehicleBinding()` 鏂规硶
+4. 璺宠浆鍒� `/pages/bind-vehicle` 椤甸潰
+
+### 鐐瑰嚮"閫�鍑虹櫥褰�"
+1. 鐢ㄦ埛鐐瑰嚮鑿滃崟椤�
+2. 鑳屾櫙鑹插彉涓� `#f5f5f5` (瑙嗚鍙嶉)
+3. 瑙﹀彂 `handleLogout()` 鏂规硶
+4. 寮瑰嚭纭瀵硅瘽妗嗭細"纭畾閫�鍑虹櫥褰曞悧锛�"
+5. 纭鍚庢墽琛岀櫥鍑哄苟璺宠浆鍒扮櫥褰曢〉
+
+## 鐩稿叧浠g爜
+
+### 妯℃澘閮ㄥ垎
+```vue
+<view class="menu-list">
+  <!-- 缁戝畾/鏇存崲杞﹁締 -->
+  <view class="list-cell list-cell-arrow" @click="handleVehicleBinding">
+    <view class="menu-item-box">
+      <view class="iconfont icon-car menu-icon"></view>
+      <view>{{ boundVehicle && boundVehicle !== '鏈粦瀹�' ? '鏇存崲杞﹁締' : '缁戝畾杞﹁締' }}</view>
+    </view>
+  </view>
+  
+  <!-- 閫�鍑虹櫥褰� -->
+  <view class="list-cell list-cell-arrow" @click="handleLogout">
+    <view class="menu-item-box">
+      <view class="iconfont icon-logout menu-icon text-red"></view>
+      <view class="text-red">閫�鍑虹櫥褰�</view>
+    </view>
+  </view>
+</view>
+```
+
+### 鏂规硶閮ㄥ垎
+```javascript
+methods: {
+  // 澶勭悊杞﹁締缁戝畾鎿嶄綔
+  handleVehicleBinding() {
+    this.$tab.navigateTo('/pages/bind-vehicle')
+  },
+  
+  // 閫�鍑虹櫥褰�
+  handleLogout() {
+    this.$modal.confirm('纭畾閫�鍑虹櫥褰曞悧锛�').then(() => {
+      this.$store.dispatch('LogOut').then(() => {
+        this.$tab.reLaunch('/pages/login')
+      })
+    })
+  }
+}
+```
+
+## 娴嬭瘯楠岃瘉
+
+### 娴嬭瘯鍦烘櫙
+
+1. 鉁� **鐐瑰嚮"缁戝畾杞﹁締"锛堟湭缁戝畾鏃讹級**
+   - 鏄剧ず鏂囨湰锛氱粦瀹氳溅杈�
+   - 鐐瑰嚮鍚庤烦杞埌缁戝畾椤甸潰
+
+2. 鉁� **鐐瑰嚮"鏇存崲杞﹁締"锛堝凡缁戝畾鏃讹級**
+   - 鏄剧ず鏂囨湰锛氭洿鎹㈣溅杈�
+   - 鐐瑰嚮鍚庤烦杞埌缁戝畾椤甸潰
+
+3. 鉁� **鐐瑰嚮"閫�鍑虹櫥褰�"**
+   - 绾㈣壊鏂囧瓧璀︾ず
+   - 寮瑰嚭纭瀵硅瘽妗�
+   - 纭鍚庨��鍑虹櫥褰�
+
+4. 鉁� **瑙嗚鍙嶉**
+   - 鐐瑰嚮鏃惰儗鏅彉鐏�
+   - 鍙充晶鏄剧ず绠ご鎸囩ず鍣�
+   - 鍥炬爣鍜屾枃瀛楀榻�
+
+## 鏍峰紡绫昏鏄�
+
+| 绫诲悕 | 浣滅敤 |
+|-----|------|
+| `.menu-list` | 鑿滃崟鍒楄〃瀹瑰櫒 |
+| `.list-cell` | 鍗曚釜鑿滃崟椤� |
+| `.list-cell-arrow` | 甯︾澶寸殑鑿滃崟椤� |
+| `.menu-item-box` | 鑿滃崟椤瑰唴瀹圭洅瀛� |
+| `.menu-icon` | 鑿滃崟鍥炬爣 |
+| `.text-red` | 绾㈣壊鏂囧瓧锛堣鍛婏級 |
+
+## 娉ㄦ剰浜嬮」
+
+1. 鈿狅笍 **蹇呴』鍖呭惈鏍峰紡** - 鍒犻櫎鍔熻兘鏃朵笉瑕佸垹闄ゅ繀瑕佺殑鏍峰紡
+2. 鉁� **淇濇寔涓�鑷存��** - 鑿滃崟椤规牱寮忓簲淇濇寔缁熶竴
+3. 鉁� **瑙嗚鍙嶉** - 浜や簰鍏冪礌蹇呴』鏈夋槑纭殑鍙嶉
+4. 鉁� **鍙闂��** - 纭繚鐐瑰嚮鍖哄煙瓒冲澶�
+
+## 鐩稿叧鏂囦欢
+
+- **椤甸潰鏂囦欢**: `app/pages/mine/index.vue`
+- **璺宠浆鐩爣**: `app/pages/bind-vehicle.vue`
+- **Store**: `app/store/modules/user.js`
+
+---
+
+**淇鏃堕棿**: 2025-10-26  
+**淇浜�**: AI Assistant  
+**闂绫诲瀷**: 鏍峰紡缂哄け瀵艰嚧鍔熻兘澶辨晥  
+**鐘舵��**: 鉁� 宸蹭慨澶�
diff --git "a/prd/\346\266\210\346\201\257TabBar\345\276\275\346\240\207\346\230\276\347\244\272\345\212\237\350\203\275\350\257\264\346\230\216.md" "b/prd/\346\266\210\346\201\257TabBar\345\276\275\346\240\207\346\230\276\347\244\272\345\212\237\350\203\275\350\257\264\346\230\216.md"
new file mode 100644
index 0000000..591b03d
--- /dev/null
+++ "b/prd/\346\266\210\346\201\257TabBar\345\276\275\346\240\207\346\230\276\347\244\272\345\212\237\350\203\275\350\257\264\346\230\216.md"
@@ -0,0 +1,317 @@
+# 娑堟伅TabBar寰芥爣鏄剧ず鍔熻兘瀹炵幇璇存槑
+
+## 鍔熻兘鎻忚堪
+
+鍦ˋpp搴曢儴TabBar鐨勬秷鎭浘鏍囦笂鏄剧ず鏈娑堟伅鏁伴噺寰芥爣鍜岀孩鐐癸紝瀹炴椂鏇存柊鏈娑堟伅鏁伴噺銆�
+
+## 瀹炵幇鏂规
+
+### 1. App.vue鍏ㄥ眬鐩戝惉
+
+鍦ㄥ簲鐢ㄥ惎鍔ㄥ拰鏄剧ず鏃惰嚜鍔ㄨ幏鍙栧苟鏇存柊鏈娑堟伅鏁伴噺锛�
+
+```javascript
+// app/App.vue
+import { getUnreadCount } from '@/api/message'
+
+export default {
+  onLaunch() {
+    // 搴旂敤鍚姩鏃�
+    if (getToken()) {
+      this.updateUnreadMessageBadge()
+      this.startMessagePolling() // 鍚姩30绉掕疆璇�
+    }
+  },
+  
+  onShow() {
+    // 搴旂敤浠庡悗鍙板垏鍥炲墠鍙版椂
+    if (getToken()) {
+      this.updateUnreadMessageBadge()
+    }
+  },
+  
+  methods: {
+    // 鏇存柊鏈娑堟伅寰芥爣
+    updateUnreadMessageBadge() {
+      getUnreadCount().then(response => {
+        const count = response.data || 0
+        if (count > 0) {
+          uni.setTabBarBadge({
+            index: 3, // 娑堟伅椤甸潰鍦╰abBar涓殑绱㈠紩
+            text: count > 99 ? '99+' : count.toString()
+          })
+        } else {
+          uni.removeTabBarBadge({ index: 3 })
+        }
+      })
+    },
+    
+    // 鍚姩娑堟伅杞锛堟瘡30绉掞級
+    startMessagePolling() {
+      this.messagePollingTimer = setInterval(() => {
+        if (getToken()) {
+          this.updateUnreadMessageBadge()
+        } else {
+          this.stopMessagePolling()
+        }
+      }, 30000)
+    }
+  }
+}
+```
+
+### 2. 娑堟伅椤甸潰瀹炴椂鏇存柊
+
+鍦ㄦ秷鎭〉闈㈡爣璁版秷鎭负宸茶鍚庣珛鍗虫洿鏂板窘鏍囷細
+
+```javascript
+// app/pages/message/index.vue
+export default {
+  onShow() {
+    this.loadMessages()
+    this.updateTabBarBadge() // 杩涘叆椤甸潰鏃舵洿鏂�
+  },
+  
+  methods: {
+    async viewMessageDetail(message) {
+      // 鏍囪涓哄凡璇�
+      if (message.isRead === '0') {
+        await markAsRead(message.messageId)
+        message.isRead = '1'
+        this.updateTabBarBadge() // 鏍囪鍚庣珛鍗虫洿鏂�
+      }
+      // ... 璺宠浆閫昏緫
+    },
+    
+    updateTabBarBadge() {
+      const unreadCount = this.messages.filter(msg => msg.isRead === '0').length
+      if (unreadCount > 0) {
+        uni.setTabBarBadge({
+          index: 3,
+          text: unreadCount > 99 ? '99+' : unreadCount.toString()
+        })
+      } else {
+        uni.removeTabBarBadge({ index: 3 })
+      }
+    }
+  }
+}
+```
+
+### 3. 棣栭〉娑堟伅鍏ュ彛
+
+棣栭〉涔熶細鍔犺浇骞舵樉绀烘湭璇绘秷鎭暟閲忥細
+
+```javascript
+// app/pages/index.vue
+export default {
+  onShow() {
+    this.loadUnreadMessageCount() // 鍒锋柊鏈鏁伴噺
+  },
+  
+  methods: {
+    loadUnreadMessageCount() {
+      getUnreadCount().then(response => {
+        if (response.code === 200) {
+          this.unreadMessageCount = response.data || 0
+          this.updateTabBarBadge(this.unreadMessageCount)
+        }
+      })
+    },
+    
+    updateTabBarBadge(count) {
+      if (count > 0) {
+        uni.setTabBarBadge({
+          index: 3,
+          text: count > 99 ? '99+' : count.toString()
+        })
+      } else {
+        uni.removeTabBarBadge({ index: 3 })
+      }
+    }
+  }
+}
+```
+
+## TabBar绱㈠紩璇存槑
+
+鏍规嵁 `pages.json` 涓殑閰嶇疆锛宼abBar鐨勭储寮曢『搴忎负锛�
+
+| 绱㈠紩 | 椤甸潰 | 鏂囨湰 |
+|-----|------|-----|
+| 0 | pages/index | 棣栭〉 |
+| 1 | pages/task/index | 浠诲姟 |
+| 2 | pages/task/create | 鍒涘缓浠诲姟 |
+| **3** | **pages/message/index** | **娑堟伅** 猸� |
+| 4 | pages/mine/index | 鎴戠殑 |
+
+鍥犳娑堟伅椤甸潰鐨勭储寮曟槸 **3**銆�
+
+## 寰芥爣鏄剧ず瑙勫垯
+
+### 1. 鏁板瓧鏄剧ず瑙勫垯
+- **1-99**: 鏄剧ず瀹為檯鏁板瓧锛堝 "1", "5", "25"锛�
+- **鈮�100**: 鏄剧ず "99+"
+
+### 2. 鏄剧ず/闅愯棌瑙勫垯
+- **鏈夋湭璇绘秷鎭�**: 鏄剧ず绾㈣壊寰芥爣 + 鏁板瓧
+- **鏃犳湭璇绘秷鎭�**: 闅愯棌寰芥爣
+
+### 3. 鏇存柊鏃舵満
+- 鉁� App鍚姩鏃�
+- 鉁� App浠庡悗鍙板垏鍥炲墠鍙�
+- 鉁� 姣�30绉掕嚜鍔ㄨ疆璇�
+- 鉁� 杩涘叆娑堟伅椤甸潰鏃�
+- 鉁� 鏍囪娑堟伅涓哄凡璇诲悗
+- 鉁� 杩涘叆棣栭〉鏃�
+
+## API璋冪敤
+
+### 鑾峰彇鏈娑堟伅鏁伴噺
+
+```javascript
+import { getUnreadCount } from '@/api/message'
+
+getUnreadCount().then(response => {
+  const count = response.data || 0
+  // 浣跨敤count鏇存柊寰芥爣
+})
+```
+
+**鍚庣鎺ュ彛**: `GET /system/message/unread/count`
+
+**杩斿洖鏍煎紡**:
+```json
+{
+  "code": 200,
+  "data": 5,  // 鏈娑堟伅鏁伴噺
+  "msg": "鏌ヨ鎴愬姛"
+}
+```
+
+## uni-app API璇存槑
+
+### 璁剧疆TabBar寰芥爣
+
+```javascript
+uni.setTabBarBadge({
+  index: 3,                    // TabBar绱㈠紩
+  text: '5'                    // 鏄剧ず鏂囨湰锛堝瓧绗︿覆绫诲瀷锛�
+})
+```
+
+### 绉婚櫎TabBar寰芥爣
+
+```javascript
+uni.removeTabBarBadge({
+  index: 3                     // TabBar绱㈠紩
+})
+```
+
+## 瀹炵幇鏁堟灉
+
+### 鏈夋湭璇绘秷鎭�
+```
+鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹�  娑堟伅   鈹�
+鈹�  [馃敶3]  鈹�  鈫� 绾㈣壊寰芥爣鏄剧ず鏈鏁伴噺
+鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+```
+
+### 鏃犳湭璇绘秷鎭�
+```
+鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹�  娑堟伅   鈹�
+鈹�         鈹�  鈫� 鏃犲窘鏍�
+鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+```
+
+### 瓒呰繃99鏉�
+```
+鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹�  娑堟伅   鈹�
+鈹� [馃敶99+] 鈹�  鈫� 鏄剧ず99+
+鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+```
+
+## 鎬ц兘浼樺寲
+
+### 1. 杞鏈哄埗
+- 浣跨敤30绉掗棿闅旇疆璇�
+- 閬垮厤棰戠箒璇锋眰娑堣�楄祫婧�
+- 鐢ㄦ埛鐧诲嚭鏃惰嚜鍔ㄥ仠姝㈣疆璇�
+
+### 2. 鎸夐渶鏇存柊
+- 鍙湪蹇呰鏃舵洿鏂板窘鏍�
+- 閬垮厤閲嶅鐨凙PI璋冪敤
+- 浣跨敤鏈湴缂撳瓨浼樺厛
+
+### 3. 閿欒澶勭悊
+- API澶辫触鏃朵笉褰卞搷鍏朵粬鍔熻兘
+- 闈欓粯澶辫触锛岃褰曟棩蹇�
+- 涓嬫杞鏃堕噸璇�
+
+## 娴嬭瘯鍦烘櫙
+
+### 1. 姝e父娴佺▼娴嬭瘯
+- 鉁� 鍚姩搴旂敤锛屾樉绀烘湭璇绘暟閲�
+- 鉁� 杩涘叆娑堟伅椤甸潰锛岀偣鍑绘秷鎭�
+- 鉁� 鏍囪涓哄凡璇诲悗锛屽窘鏍囨暟閲忓噺1
+- 鉁� 鍏ㄩ儴宸茶鍚庯紝寰芥爣娑堝け
+
+### 2. 杈圭晫鎯呭喌娴嬭瘯
+- 鉁� 0鏉℃湭璇伙細涓嶆樉绀哄窘鏍�
+- 鉁� 1鏉℃湭璇伙細鏄剧ず"1"
+- 鉁� 99鏉℃湭璇伙細鏄剧ず"99"
+- 鉁� 100+鏉℃湭璇伙細鏄剧ず"99+"
+
+### 3. 寮傚父鎯呭喌娴嬭瘯
+- 鉁� 缃戠粶鏂紑锛氫娇鐢ㄤ笂娆$紦瀛樻暟鎹�
+- 鉁� API澶辫触锛氫笉褰卞搷鍏朵粬鍔熻兘
+- 鉁� 鐧诲嚭鐘舵�侊細鍋滄杞鍜屾樉绀�
+
+## 鐩稿叧鏂囦欢
+
+### 鍓嶇鏂囦欢
+- `app/App.vue` - 鍏ㄥ眬杞鍜屾洿鏂�
+- `app/pages/index.vue` - 棣栭〉娑堟伅鍏ュ彛
+- `app/pages/message/index.vue` - 娑堟伅鍒楄〃椤�
+- `app/api/message.js` - 娑堟伅API
+- `app/pages.json` - TabBar閰嶇疆
+
+### 鍚庣鏂囦欢
+- `SysMessageController.java` - 娑堟伅鎺у埗鍣�
+- `SysMessageService.java` - 娑堟伅鏈嶅姟
+- `SysMessageMapper.xml` - 娑堟伅鏁版嵁鏌ヨ
+
+## 娉ㄦ剰浜嬮」
+
+1. 鈿狅笍 **TabBar绱㈠紩**: 蹇呴』纭繚绱㈠紩姝g‘锛堟秷鎭〉涓�3锛�
+2. 鈿狅笍 **鏂囨湰绫诲瀷**: `uni.setTabBarBadge` 鐨則ext鍙傛暟蹇呴』鏄瓧绗︿覆
+3. 鈿狅笍 **杞娓呯悊**: 纭繚鍦ㄩ�傚綋鏃舵満娓呯悊瀹氭椂鍣�
+4. 鈿狅笍 **鐧诲綍鐘舵��**: 鍙湪宸茬櫥褰曠姸鎬佷笅杞
+5. 鉁� **鐢ㄦ埛浣撻獙**: 瀹炴椂鏇存柊锛屾棤闇�鎵嬪姩鍒锋柊
+
+## 鎵╁睍鍔熻兘寤鸿
+
+### 1. 娑堟伅鎺ㄩ�侀泦鎴�
+- 闆嗘垚uni-push
+- 鎺ユ敹鏈嶅姟鍣ㄦ帹閫�
+- 瀹炴椂鏇存柊寰芥爣
+
+### 2. 鍒嗙被缁熻
+- 绯荤粺娑堟伅鏁伴噺
+- 浠诲姟閫氱煡鏁伴噺
+- 鎸夌被鍨嬫樉绀轰笉鍚岄鑹�
+
+### 3. 娑堟伅鎻愮ず闊�
+- 鏂版秷鎭埌杈炬椂鎾斁鎻愮ず闊�
+- 鏀寔闇囧姩鎻愰啋
+- 鐢ㄦ埛鍙嚜瀹氫箟璁剧疆
+
+---
+
+**瀹炵幇鏃堕棿**: 2025-10-26  
+**瀹炵幇浜�**: AI Assistant  
+**鐘舵��**: 鉁� 宸插畬鎴�  
+**鐗堟湰**: v1.0
diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml
index bfe2679..a5a0d4b 100644
--- a/ruoyi-admin/src/main/resources/application.yml
+++ b/ruoyi-admin/src/main/resources/application.yml
@@ -1,7 +1,7 @@
 # 椤圭洰鐩稿叧閰嶇疆
 ruoyi:
   # 鍚嶇О
-  name: RuoYi
+  name: Dryadonline
   # 鐗堟湰
   version: ${revision}
   # 鐗堟潈骞翠唤
diff --git a/sql/fix_null_task_fields.sql b/sql/fix_null_task_fields.sql
new file mode 100644
index 0000000..6c405a9
--- /dev/null
+++ b/sql/fix_null_task_fields.sql
@@ -0,0 +1,50 @@
+-- 妫�鏌ュ苟淇浠诲姟绫诲瀷鍜岀姸鎬佷负NULL鐨勮褰�
+-- 鎵ц鏃堕棿: 2025-10-26
+
+-- 1. 妫�鏌ask_type涓篘ULL鐨勮褰曟暟閲�
+SELECT COUNT(*) as null_task_type_count 
+FROM sys_task 
+WHERE task_type IS NULL AND del_flag = '0';
+
+-- 2. 妫�鏌ask_status涓篘ULL鐨勮褰曟暟閲�
+SELECT COUNT(*) as null_task_status_count 
+FROM sys_task 
+WHERE task_status IS NULL AND del_flag = '0';
+
+-- 3. 鏌ョ湅task_type涓篘ULL鐨勮褰曡鎯�
+SELECT task_id, task_code, task_type, task_status, create_time 
+FROM sys_task 
+WHERE task_type IS NULL AND del_flag = '0'
+ORDER BY create_time DESC
+LIMIT 10;
+
+-- 4. 鏌ョ湅task_status涓篘ULL鐨勮褰曡鎯�
+SELECT task_id, task_code, task_type, task_status, create_time 
+FROM sys_task 
+WHERE task_status IS NULL AND del_flag = '0'
+ORDER BY create_time DESC
+LIMIT 10;
+
+-- 5. 淇task_type涓篘ULL鐨勮褰曪紙璁剧疆涓篛THER锛�
+UPDATE sys_task 
+SET task_type = 'OTHER' 
+WHERE task_type IS NULL AND del_flag = '0';
+
+-- 6. 淇task_status涓篘ULL鐨勮褰曪紙璁剧疆涓篜ENDING锛�
+UPDATE sys_task 
+SET task_status = 'PENDING' 
+WHERE task_status IS NULL AND del_flag = '0';
+
+-- 7. 楠岃瘉淇缁撴灉
+SELECT COUNT(*) as remaining_null_task_type 
+FROM sys_task 
+WHERE task_type IS NULL AND del_flag = '0';
+
+SELECT COUNT(*) as remaining_null_task_status 
+FROM sys_task 
+WHERE task_status IS NULL AND del_flag = '0';
+
+-- 8. 娣诲姞NOT NULL绾︽潫锛堝彲閫夛紝纭繚鏈潵涓嶄細鍐嶅嚭鐜癗ULL鍊硷級
+-- 娉ㄦ剰锛氭墽琛屽墠闇�瑕佸厛纭繚鎵�鏈夎褰曢兘宸蹭慨澶�
+-- ALTER TABLE sys_task MODIFY COLUMN task_type VARCHAR(50) NOT NULL DEFAULT 'OTHER';
+-- ALTER TABLE sys_task MODIFY COLUMN task_status VARCHAR(50) NOT NULL DEFAULT 'PENDING';

--
Gitblit v1.9.1