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