Files
xyzw_web_helper/MD说明文件夹/问题修复-每日发车次数限制v3.8.0.md
2025-10-17 20:56:50 +08:00

7.1 KiB
Raw Permalink Blame History

问题修复-每日发车次数限制 v3.8.0

📋 问题描述

每日发车4辆限制功能未生效所有4辆车都能发送成功没有触发限制。

🔍 问题分析

通过日志分析发现:

  1. 计数增加正常:每次发送成功后,dailySendCount 会正确增加

    ✅ 今日发车次数更新: 1/4
    
  2. 计数被重置:但紧接着调用 queryClubCars() 时,会从服务器响应中读取 sendCount 字段

    🚗 今日已发车次数: 0  // 服务器返回的值始终为0
    
  3. 覆盖客户端值dailySendCount.value = sendCount 将客户端计数重置为0

执行流程(问题版本)

发送第1辆 → 计数+1 → 查询 → 服务器返回0 → 计数重置为0
发送第2辆 → 计数+1 → 查询 → 服务器返回0 → 计数重置为0
发送第3辆 → 计数+1 → 查询 → 服务器返回0 → 计数重置为0
发送第4辆 → 计数+1 → 查询 → 服务器返回0 → 计数重置为0

根本原因

服务器的 roleCar.sendCount 字段可能:

  • 不存在或位置不对
  • 或者服务器确实没有维护这个字段

解决方案

1. 客户端维护计数

不再完全依赖服务器返回的 sendCount,改为客户端自己维护,只在特定情况下更新:

// 只有当服务器返回的值更大时,才更新客户端计数
if (response.roleCar.sendCount !== undefined && response.roleCar.sendCount !== null) {
  if (response.roleCar.sendCount > dailySendCount.value) {
    dailySendCount.value = response.roleCar.sendCount
    saveDailySendCount(dailySendCount.value)
    console.log('🚗 从服务器更新今日发车次数:', dailySendCount.value)
  } else {
    console.log(`🚗 保持客户端发车次数: ${dailySendCount.value}(服务器值: ${response.roleCar.sendCount}`)
  }
} else {
  console.log('🚗 服务器未返回sendCount保持客户端计数:', dailySendCount.value)
}

2. localStorage 持久化

将发车次数保存到 localStorage按日期区分

// 生成今日的存储key
const STORAGE_KEY_PREFIX = 'car_daily_send_count_'
const getTodayKey = () => {
  const today = new Date().toLocaleDateString('zh-CN', { year: 'numeric', month: '2-digit', day: '2-digit' })
  return `${STORAGE_KEY_PREFIX}${today}`  // 例如: car_daily_send_count_2025/01/08
}

// 从localStorage加载
const loadDailySendCount = () => {
  try {
    const savedCount = localStorage.getItem(getTodayKey())
    return savedCount ? parseInt(savedCount, 10) : 0
  } catch (error) {
    console.error('读取发车次数失败:', error)
    return 0
  }
}

// 保存到localStorage
const saveDailySendCount = (count) => {
  try {
    localStorage.setItem(getTodayKey(), count.toString())
    console.log(`💾 已保存今日发车次数: ${count}`)
  } catch (error) {
    console.error('保存发车次数失败:', error)
  }
}

3. 发送成功后持久化

每次发送成功后,立即保存到 localStorage

if (response) {
  dailySendCount.value++
  saveDailySendCount(dailySendCount.value) // 持久化
  message.success(`车辆 ${carId} 发送成功(今日已发${dailySendCount.value}/4`)
  await queryClubCars()
}

🎯 修复效果

执行流程(修复版本)

初始化 → 从localStorage加载计数: 0/4

发送第1辆 → 计数+1 → 保存到localStorage → 查询
           → 服务器返回0 → 判断0 < 1 → 保持客户端计数1
           
发送第2辆 → 计数+1 → 保存到localStorage → 查询
           → 服务器返回0 → 判断0 < 2 → 保持客户端计数2
           
发送第3辆 → 计数+1 → 保存到localStorage → 查询
           → 服务器返回0 → 判断0 < 3 → 保持客户端计数3
           
发送第4辆 → 计数+1 → 保存到localStorage → 查询
           → 服务器返回0 → 判断0 < 4 → 保持客户端计数4
           → 达到上限!
           
尝试发送第5辆 → 检查计数4 >= 4 → 拦截!
                → 提示: "今日发车次数已达上限4/4明天再来吧"

📊 新增日志

初始化日志

🚗 初始化发车计数: 0/4今日: 2025/1/8

发送过程日志

🚀 开始发送车辆ID: 11p3-7462375今日已发0/4
🚀 车辆发送成功ID: 11p3-7462375
✅ 今日发车次数更新: 1/4
💾 已保存今日发车次数: 1
🚗 保持客户端发车次数: 1服务器值: 0

达到上限日志

⚠️ 今日发车次数已达上限: 4/4

🔧 技术细节

localStorage 数据结构

// Key 格式
car_daily_send_count_2025/01/08

// Value
"4"  // 字符串格式

跨日期自动重置

由于 localStorage key 包含日期不同日期会自动使用不同的key实现自动重置

2025/01/08: car_daily_send_count_2025/01/08 → 4
2025/01/09: car_daily_send_count_2025/01/09 → 0 (新的一天,自动重置)

🎨 UI 变化

未达上限0-3辆

[🚗 2/4]  // 绿色徽章

已达上限4辆

[🚗 4/4]  // 红色徽章 + 闪烁动画

🧪 测试场景

场景1正常发车

  1. 初始计数0/4
  2. 一键发车4辆待发
  3. 成功发送4辆
  4. 计数更新为4/4
  5. UI显示红色徽章并闪烁

场景2达到上限后尝试发送

  1. 当前计数4/4
  2. 点击"🚀发送"按钮
  3. 拦截成功:提示"今日发车次数已达上限4/4明天再来吧"
  4. 未执行发送操作

场景3刷新页面后

  1. 发送3辆车后刷新页面
  2. 计数从 localStorage 恢复3/4
  3. 可以继续发送1辆车
  4. 第2辆被拦截

场景4跨日期重置

  1. 2025/01/08 发送4辆4/4
  2. 第二天2025/01/09打开页面
  3. 计数自动重置为 0/4
  4. 可以继续发送4辆车

📝 相关文件

修改的文件

  • src/components/CarManagement.vue
    • 添加 loadDailySendCount() 函数
    • 添加 saveDailySendCount() 函数
    • 添加 getTodayKey() 函数
    • 修改 queryClubCars() 中的计数更新逻辑
    • 修改 sendCar() 添加持久化调用

新增文件

  • MD说明/问题修复-每日发车次数限制v3.8.0.md

🔄 版本信息

  • 版本号: v3.8.0
  • 修复日期: 2025-01-08
  • 修复内容:
    • 修复每日发车次数限制未生效的问题
    • 添加 localStorage 持久化功能
    • 优化计数更新逻辑,避免被服务器覆盖

🚀 使用说明

清除计数(调试用)

如需手动重置今日发车次数,可在浏览器控制台执行:

// 清除今日计数
const today = new Date().toLocaleDateString('zh-CN', { year: 'numeric', month: '2-digit', day: '2-digit' })
localStorage.removeItem(`car_daily_send_count_${today}`)
location.reload()  // 刷新页面

查看计数(调试用)

const today = new Date().toLocaleDateString('zh-CN', { year: 'numeric', month: '2-digit', day: '2-digit' })
console.log('今日发车次数:', localStorage.getItem(`car_daily_send_count_${today}`))

修复完成刷新页面Ctrl + F5每日发车4辆限制将正常工作