7.1 KiB
7.1 KiB
问题修复-每日发车次数限制 v3.8.0
📋 问题描述
每日发车4辆限制功能未生效,所有4辆车都能发送成功,没有触发限制。
🔍 问题分析
通过日志分析发现:
-
计数增加正常:每次发送成功后,
dailySendCount会正确增加✅ 今日发车次数更新: 1/4 -
计数被重置:但紧接着调用
queryClubCars()时,会从服务器响应中读取sendCount字段🚗 今日已发车次数: 0 // 服务器返回的值始终为0 -
覆盖客户端值:
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:正常发车
- 初始计数:0/4
- 一键发车(4辆待发)
- 成功发送4辆
- 计数更新为:4/4
- UI显示红色徽章并闪烁
场景2:达到上限后尝试发送
- 当前计数:4/4
- 点击"🚀发送"按钮
- 拦截成功:提示"今日发车次数已达上限(4/4),明天再来吧!"
- 未执行发送操作
场景3:刷新页面后
- 发送3辆车后刷新页面
- 计数从 localStorage 恢复:3/4
- 可以继续发送1辆车
- 第2辆被拦截
场景4:跨日期重置
- 2025/01/08 发送4辆(4/4)
- 第二天(2025/01/09)打开页面
- 计数自动重置为 0/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辆限制将正常工作!