编辑 | blame | 历史 | 原始文档

首页车辆绑定自动刷新功能说明

需求背景

用户在绑定车辆页面成功绑定车辆后,返回首页时需要自动刷新并显示最新的绑定车辆信息,确保用户能够立即看到绑定的车辆信息。

问题分析

原有实现

文件: app/pages/index.vue

问题点

  1. 只在 onLoad 时加载一次
    javascript onLoad() { this.loadUserProfile() // 只在页面首次加载时调用 this.loadRunningTasks() }

  2. onShow 未刷新车辆信息
    javascript onShow() { this.loadRunningTasks() // ❌ 只刷新任务,未刷新车辆 }

  3. 使用 getUserProfile 接口

  • 该接口主要用于获取用户基本信息
  • 不是专门获取绑定车辆的接口
  • 可能返回的数据不够及时

用户操作流程

graph LR
    A[首页] --> B[点击绑定车辆]
    B --> C[绑定车辆页面]
    C --> D[选择车辆]
    D --> E[绑定成功]
    E --> F[返回首页]
    F --> G{车辆信息更新?}
    G -->|原实现| H[❌ 不更新]
    G -->|新实现| I[✅ 自动更新]

解决方案

1. 导入专用 API

修改前:
javascript import { mapState } from 'vuex' import { listTask, changeTaskStatus } from '@/api/task' import { getUserProfile } from '@/api/system/user'

修改后:
javascript import { mapState } from 'vuex' import { listTask, changeTaskStatus } from '@/api/task' import { getUserProfile } from '@/api/system/user' import { getUserBoundVehicle } from '@/api/vehicle' // ✅ 新增专用API

2. 新增专用方法获取绑定车辆

新增方法: loadUserVehicle()

// 加载用户绑定的车辆信息
loadUserVehicle() {
  const userId = this.currentUser.userId
  if (!userId) {
    console.error('用户未登录,无法获取绑定车辆信息')
    this.boundVehicle = ''
    this.boundVehicleId = null
    return
  }
  
  getUserBoundVehicle(userId).then(response => {
    if (response.code === 200 && response.data) {
      const vehicle = response.data
      this.boundVehicle = vehicle.vehicleNumber || '未知车牌'
      this.boundVehicleId = vehicle.vehicleId
      console.log('用户绑定车辆:', this.boundVehicle)
    } else {
      this.boundVehicle = ''
      this.boundVehicleId = null
    }
  }).catch(error => {
    console.error('获取绑定车辆信息失败:', error)
    this.boundVehicle = ''
    this.boundVehicleId = null
  })
}

优势:
- ✅ 使用专用的 getUserBoundVehicle API
- ✅ 数据更准确、更及时
- ✅ 独立的错误处理
- ✅ 清空旧数据,避免显示过期信息

3. 更新生命周期钩子

修改前:
javascript onLoad() { this.loadUserProfile() // 使用通用接口 this.loadRunningTasks() }, onShow() { this.loadRunningTasks() // ❌ 只刷新任务 }

修改后:
javascript onLoad() { this.loadUserVehicle() // ✅ 使用专用方法 this.loadRunningTasks() }, onShow() { this.loadUserVehicle() // ✅ 每次显示都刷新车辆 this.loadRunningTasks() // ✅ 同时刷新任务 }

4. 保留原有方法(兼容性)

保留 loadUserProfile() 方法:
```javascript
// 加载用户信息(保留以兼容之前的代码)
loadUserProfile() {
const userId = this.currentUser.userId
if (!userId) {
console.error('用户未登录,无法获取用户信息')
return
}

getUserProfile().then(response => {
const userInfo = response.data || response
// 获取用户绑定的车辆信息
if (userInfo.boundVehicle) {
this.boundVehicle = userInfo.boundVehicle.vehicleNumber
this.boundVehicleId = userInfo.boundVehicle.vehicleId
}
}).catch(error => {
console.error('获取用户信息失败:', error)
})
}
```

作用:
- ✅ 保持向后兼容
- ✅ 如需获取更多用户信息时可以调用

实现效果

用户操作流程

  1. 首页显示
    用户信息区域: └─ 用户名: 张三 └─ 关联车牌号: 未绑定车牌号 └─ [绑定车辆] 按钮

  2. 点击绑定车辆

  1. 选择并绑定车辆
  • 选择车牌号:粤A12345
  • 点击"确认绑定"
  • 显示:车辆绑定成功
  • 自动返回首页(1.5秒后)
  1. 首页自动刷新
    用户信息区域: └─ 用户名: 张三 └─ 关联车牌号: 粤A12345 ← ✅ 自动更新 └─ [更换车辆] 按钮 ← ✅ 按钮文字变化

数据流程图

sequenceDiagram
    participant User as 用户
    participant Index as 首页
    participant Bind as 绑定页面
    participant API as 后端API
    
    User->>Index: 打开首页
    Index->>API: getUserBoundVehicle(userId)
    API-->>Index: 返回:未绑定
    Index-->>User: 显示:未绑定车牌号
    
    User->>Index: 点击绑定车辆
    Index->>Bind: 跳转到绑定页面
    
    User->>Bind: 选择车辆:粤A12345
    User->>Bind: 点击确认绑定
    Bind->>API: bindVehicleToUser(userId, vehicleId)
    API-->>Bind: 返回:绑定成功
    Bind-->>User: 提示:车辆绑定成功
    
    Bind->>Index: 返回首页(navigateBack)
    Note over Index: 触发 onShow()
    Index->>API: getUserBoundVehicle(userId)
    API-->>Index: 返回:粤A12345
    Index-->>User: 显示:关联车牌号: 粤A12345

核心改进点

1. 实时性提升

修改前:
- ❌ 绑定成功后返回首页,车辆信息不更新
- ❌ 需要手动刷新页面才能看到最新绑定

修改后:
- ✅ 绑定成功后返回首页,自动刷新车辆信息
- ✅ 用户体验流畅,无需任何额外操作

2. 数据准确性

修改前:
- ⚠️ 使用 getUserProfile 接口
- ⚠️ 可能存在缓存问题

修改后:
- ✅ 使用专用的 getUserBoundVehicle 接口
- ✅ 数据更准确、更及时

3. 错误处理

新增完善的错误处理:
javascript .catch(error => { console.error('获取绑定车辆信息失败:', error) this.boundVehicle = '' // 清空旧数据 this.boundVehicleId = null // 清空旧ID })

  • ✅ 失败时清空旧数据
  • ✅ 避免显示过期信息
  • ✅ 记录错误日志便于调试

4. 状态同步

多场景自动刷新:

  1. 首次进入首页 (onLoad)
  • ✅ 加载绑定车辆信息
  1. 从其他页面返回 (onShow)
  • ✅ 自动刷新绑定车辆信息
  • ✅ 适用于绑定、解绑等操作后返回
  1. 下拉刷新 (onPullDownRefresh)
  • ✅ 刷新任务列表
  • 💡 可扩展:同时刷新车辆信息

使用的 API 接口

getUserBoundVehicle

文件: app/api/vehicle.js

// 获取用户当前绑定的车辆
export function getUserBoundVehicle(userId) {
  return request({
    url: '/system/vehicle/user/bound/' + userId,
    method: 'get'
  })
}

后端接口: /system/vehicle/user/bound/{userId}

响应示例:
json { "code": 200, "msg": "操作成功", "data": { "vehicleId": 1, "vehicleNumber": "粤A12345", "vehicleType": "救护车", "vehicleBrand": "福特", "vehicleModel": "全顺" } }

无绑定时:
json { "code": 200, "msg": "操作成功", "data": null }

测试场景

场景1:首次绑定车辆

步骤:
1. 新用户首次登录
2. 首页显示"未绑定车牌号"
3. 点击"绑定车辆"按钮
4. 选择车牌号并绑定
5. 绑定成功,返回首页

预期结果:
- ✅ 首页显示绑定的车牌号
- ✅ 按钮文字变为"更换车辆"

场景2:更换绑定车辆

步骤:
1. 用户已绑定车辆:粤A12345
2. 首页显示"关联车牌号:粤A12345"
3. 点击"更换车辆"按钮
4. 选择新车牌号:粤B67890
5. 确认强制绑定
6. 绑定成功,返回首页

预期结果:
- ✅ 首页显示新车牌号:粤B67890
- ✅ 旧车牌号信息被清除

场景3:解绑车辆后返回

步骤:
1. 用户已绑定车辆:粤A12345
2. 进入个人中心
3. 点击"取消绑定车辆"
4. 解绑成功
5. 返回首页

预期结果:
- ✅ 首页显示"未绑定车牌号"
- ✅ 按钮文字变为"绑定车辆"

场景4:网络异常处理

步骤:
1. 断开网络连接
2. 打开首页

预期结果:
- ✅ 控制台输出错误日志
- ✅ 车辆信息为空,不显示过期数据
- ✅ 页面不崩溃

相关文件

修改的文件

  1. app/pages/index.vue - 首页

依赖的文件

  1. app/api/vehicle.js - 车辆 API
  2. app/pages/bind-vehicle.vue - 绑定车辆页面

相关文档

后续优化建议

1. 添加加载状态

显示加载中的提示,提升用户体验:

loadUserVehicle() {
  this.loadingVehicle = true  // 显示加载状态
  
  getUserBoundVehicle(userId).then(response => {
    // 处理数据...
  }).finally(() => {
    this.loadingVehicle = false  // 隐藏加载状态
  })
}

2. 添加缓存机制

避免频繁请求相同数据:

// 使用 Vuex 缓存绑定车辆信息
// 只有在绑定/解绑操作后才清除缓存

3. 扩展下拉刷新

下拉刷新时同时刷新车辆信息:

onPullDownRefresh() {
  this.loadUserVehicle()      // 新增:刷新车辆
  this.loadRunningTasks()
  setTimeout(() => {
    uni.stopPullDownRefresh()
  }, 1000)
}

4. 添加骨架屏

在数据加载时显示骨架屏,提升视觉体验:

<view v-if="loadingVehicle" class="skeleton">
  <!-- 骨架屏内容 -->
</view>
<view v-else class="vehicle-info">
  {{ boundVehicle || '未绑定车牌号' }}
</view>

总结

通过本次优化,实现了以下目标:

  1. 实时同步:绑定车辆成功后,首页自动显示最新绑定信息
  2. 专用接口:使用 getUserBoundVehicle 专用接口,数据更准确
  3. 生命周期优化:在 onShow 中刷新车辆信息,适配多种场景
  4. 错误处理:完善的错误处理机制,避免显示过期数据
  5. 向后兼容:保留原有方法,不影响其他功能

核心价值:
- 提升用户体验,操作更流畅
- 数据实时性更好,显示更准确
- 代码结构更清晰,易于维护

版本历史

版本 日期 修改内容 修改人

| 1.0 | 2025-10-15 | 实现首页车辆绑定自动刷新功能 | - |