# 问题修复-发车次数按账号独立计数 v3.8.1 ## 📋 问题描述 用户切换到新账号后,发现4辆待发车的车都无法发送,提示"今日发车次数已达上限: 4/4"。 **用户反馈**: > 明明我的四辆跑车都是待发车的状态,为什么不能发车?好像是上一个token的号发过车,限制4个车就满了,现在这个号的车就不能发了 ## 🔍 问题分析 ### 问题现象 ``` 当前账号状态: - 车辆1: 待发车 ✓ - 车辆2: 待发车 ✓ - 车辆3: 待发车 ✓ - 车辆4: 待发车 ✓ 但点击"一键发车"时: ⚠️ 今日发车次数已达上限: 4/4,跳过发送步骤 ``` ### 根本原因 **v3.8.0 版本的 localStorage key 设计有缺陷**: ```javascript // 旧版本 key(v3.8.0) const getTodayKey = () => { const today = new Date().toLocaleDateString('zh-CN', ...) return `car_daily_send_count_${today}` // 例如: car_daily_send_count_2025/01/08 } ``` **问题**: 1. Key 只包含日期,不包含 `tokenId` 2. 所有账号共享同一个计数器 3. 账号A发了4辆车 → 计数器变成 4/4 4. 切换到账号B → 计数器还是 4/4 5. 账号B无法发车 ❌ ### 执行流程(问题版本 v3.8.0) ``` 账号A(token_123): - 发送4辆车 - localStorage['car_daily_send_count_2025/01/08'] = "4" 切换账号 → 账号B(token_456): - 读取 localStorage['car_daily_send_count_2025/01/08'] → "4" - 计数器: 4/4 - 提示: "今日发车次数已达上限" ❌ - 无法发送任何车辆 ``` ## ✅ 解决方案 ### 1. **localStorage Key 增加 TokenId** ```javascript // 新版本 key(v3.8.1) const getTodayKey = (tokenId) => { const today = new Date().toLocaleDateString('zh-CN', ...) const currentTokenId = tokenId || tokenStore.selectedToken?.id || 'default' return `car_daily_send_count_${today}_${currentTokenId}` // 例如: car_daily_send_count_2025/01/08_token_123 } ``` **改进**: - Key 包含 `日期 + tokenId` - 每个账号有独立的计数器 - 不同账号互不影响 ### 2. **Token 切换监听** 添加 `watch` 监听器,自动切换计数器: ```javascript import { watch } from 'vue' // 监听 token 切换,重新加载对应 token 的发车次数 watch(() => tokenStore.selectedToken?.id, (newTokenId, oldTokenId) => { if (newTokenId !== oldTokenId) { const newCount = loadDailySendCount() dailySendCount.value = newCount console.log(`🔄 Token切换: ${oldTokenId} → ${newTokenId},发车计数: ${newCount}/4`) } }) ``` ## 🎯 修复效果 ### 执行流程(修复版本 v3.8.1) ``` 账号A(token_123): - 发送4辆车 - localStorage['car_daily_send_count_2025/01/08_token_123'] = "4" - 计数器: 4/4 ✓ 切换账号 → 账号B(token_456): - 读取 localStorage['car_daily_send_count_2025/01/08_token_456'] → null - 计数器: 0/4 ✓ - 可以正常发送4辆车 ✓ - 发送4辆车 - localStorage['car_daily_send_count_2025/01/08_token_456'] = "4" - 计数器: 4/4 ✓ 切换回账号A → 账号A(token_123): - 读取 localStorage['car_daily_send_count_2025/01/08_token_123'] → "4" - 计数器: 4/4 ✓ - 今日已发满,无法继续发车 ✓ ``` ## 📊 新增日志 ### 初始化日志 ``` 🚗 初始化发车计数: 0/4(今日: 2025/1/8,Token: token_1759860115131_cofnrgq8e) ``` ### Token 切换日志 ``` 🔄 Token切换: token_123 → token_456,发车计数: 0/4 ``` ### localStorage 数据结构 ```javascript // 账号A的计数 localStorage['car_daily_send_count_2025/01/08_token_123'] = "4" // 账号B的计数 localStorage['car_daily_send_count_2025/01/08_token_456'] = "2" // 账号C的计数 localStorage['car_daily_send_count_2025/01/08_token_789'] = "0" ``` ## 🧪 测试场景 ### 场景1:多账号独立计数 1. **账号A**:发送4辆车(4/4) 2. 切换到 **账号B**:显示 0/4 ✓ 3. **账号B**:发送2辆车(2/4) 4. 切换回 **账号A**:显示 4/4 ✓ 5. **账号A**:无法继续发车 ✓ 6. 切换回 **账号B**:显示 2/4 ✓ 7. **账号B**:可以继续发送2辆车 ✓ ### 场景2:刷新页面后切换账号 1. **账号A**:发送3辆车(3/4) 2. 刷新页面(Ctrl + F5) 3. 页面加载后显示:3/4 ✓ 4. 切换到 **账号B**:自动切换为 0/4 ✓ 5. **账号B**:可以正常发送4辆车 ✓ ### 场景3:跨日期自动重置(每个账号独立) 1. **2025/01/08**: - 账号A:发送4辆(4/4) - 账号B:发送2辆(2/4) 2. **2025/01/09**(第二天): - 账号A:自动重置为 0/4 ✓ - 账号B:自动重置为 0/4 ✓ - 两个账号都可以重新发送4辆车 ## 🔧 技术细节 ### localStorage Key 对比 | 版本 | Key 格式 | 问题 | |------|----------|------| | v3.8.0 | `car_daily_send_count_2025/01/08` | ❌ 所有账号共享 | | v3.8.1 | `car_daily_send_count_2025/01/08_token_123` | ✅ 按账号独立 | ### 数据迁移 旧版本的数据(`car_daily_send_count_2025/01/08`)不会自动删除,但也不会影响新版本。新版本会创建新的 key。 如需手动清理旧数据(可选),可在浏览器控制台执行: ```javascript // 清理旧版本的全局计数器 const today = new Date().toLocaleDateString('zh-CN', { year: 'numeric', month: '2-digit', day: '2-digit' }) localStorage.removeItem(`car_daily_send_count_${today}`) console.log('已清理旧版本数据') ``` ### watch 监听逻辑 ```javascript watch(() => tokenStore.selectedToken?.id, (newTokenId, oldTokenId) => { // 只有当 tokenId 真正改变时才触发 if (newTokenId !== oldTokenId) { // 从 localStorage 加载新 token 的计数 const newCount = loadDailySendCount() // 更新响应式变量 dailySendCount.value = newCount // 输出日志 console.log(`🔄 Token切换: ${oldTokenId} → ${newTokenId},发车计数: ${newCount}/4`) } }) ``` ## 📝 相关文件 ### 修改的文件 - `src/components/CarManagement.vue` - 修改 `getTodayKey()` 函数,增加 `tokenId` 参数 - 添加 `watch` 监听 token 切换 - 更新初始化日志,显示 tokenId - 导入 `watch` 函数 ### 新增文件 - `MD说明/问题修复-发车次数按账号独立计数v3.8.1.md` ### 前置版本 - `MD说明/问题修复-每日发车次数限制v3.8.0.md` ## 🔄 版本信息 - **版本号**: v3.8.1 - **修复日期**: 2025-01-08 - **修复内容**: - 修复发车次数计数器在多账号间共享的问题 - 添加按 tokenId 区分的独立计数 - 添加 token 切换监听,自动加载对应计数 - **依赖版本**: v3.8.0 ## 🚀 使用说明 ### 查看当前账号计数(调试用) ```javascript const today = new Date().toLocaleDateString('zh-CN', { year: 'numeric', month: '2-digit', day: '2-digit' }) const tokenId = 'your_token_id_here' // 替换为实际的 tokenId const count = localStorage.getItem(`car_daily_send_count_${today}_${tokenId}`) console.log(`账号 ${tokenId} 今日发车次数: ${count || 0}/4`) ``` ### 清除指定账号的计数(调试用) ```javascript const today = new Date().toLocaleDateString('zh-CN', { year: 'numeric', month: '2-digit', day: '2-digit' }) const tokenId = 'your_token_id_here' // 替换为实际的 tokenId localStorage.removeItem(`car_daily_send_count_${today}_${tokenId}`) location.reload() // 刷新页面 ``` ### 清除所有账号的计数(调试用) ```javascript const today = new Date().toLocaleDateString('zh-CN', { year: 'numeric', month: '2-digit', day: '2-digit' }) const prefix = `car_daily_send_count_${today}_` // 遍历所有 localStorage key Object.keys(localStorage).forEach(key => { if (key.startsWith(prefix)) { localStorage.removeItem(key) console.log(`已清除: ${key}`) } }) location.reload() // 刷新页面 ``` ## 🎨 UI 表现 ### 账号A(已发4辆) ``` ┌──────────────────────────────────┐ │ 🚗 俱乐部赛车 │ │ [4辆车] [🎫 0] [🚗 4/4] ← 红色闪烁 │ └──────────────────────────────────┘ ``` ### 切换到账号B(未发车) ``` ┌──────────────────────────────────┐ │ 🚗 俱乐部赛车 │ │ [4辆车] [🎫 0] [🚗 0/4] ← 绿色 │ └──────────────────────────────────┘ ``` --- **✅ 修复完成!现在每个账号都有独立的发车次数限制,互不影响!刷新页面(Ctrl + F5)测试吧!**