293 lines
8.5 KiB
Markdown
293 lines
8.5 KiB
Markdown
# 问题修复-发车次数按账号独立计数 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)测试吧!**
|
||
|