9.1 KiB
9.1 KiB
俱乐部信息调试优化 v2.1.1
📅 更新时间
2025-10-12 21:40
🎯 问题描述
问题1:月度任务调试日志强制输出
现象:
- 月度任务的关键日志使用
console.log强制输出,无法通过日志开关控制 - 导致即使关闭月度任务日志,仍然会在控制台看到大量输出
代码位置:src/components/GameStatus.vue - fetchMonthlyActivity 函数
问题2:俱乐部信息无法刷新显示
现象:
- 点击"刷新"按钮后,控制台显示已收到
legion_getinfo响应 - 但俱乐部信息界面没有显示数据
- 日志显示重复发送了多次
legion_getinfo命令
可能原因:
- 数据存储到
gameData.legionInfo后没有触发响应式更新 - ClubInfo 组件的 computed 没有正确监听数据变化
- 数据结构解析错误
✅ 解决方案
1. 月度任务日志可控化
修改前(强制输出):
// 强制输出关键日志(不受开关控制)
console.log('📤 [月度任务] 即将调用 sendMessageWithPromise')
console.log('📋 [月度任务] 参数:', { tokenId, cmd: 'activity_get', params: {}, timeout: 10000 })
const result = await tokenStore.sendMessageWithPromise(tokenId, 'activity_get', {}, 10000)
console.log('📥 [月度任务] sendMessageWithPromise 返回成功')
console.log('📊 [月度任务] 返回结果:', result)
修改后(可控制):
monthLog('📤 [月度任务] 准备发送 activity_get 命令')
monthLog('📋 [月度任务] 命令参数:', { cmd: 'activity_get', params: {} })
monthLog('📤 [月度任务] 即将调用 sendMessageWithPromise')
monthLog('📋 [月度任务] 参数:', { tokenId, cmd: 'activity_get', params: {}, timeout: 10000 })
const result = await tokenStore.sendMessageWithPromise(tokenId, 'activity_get', {}, 10000)
monthLog('📥 [月度任务] sendMessageWithPromise 返回成功')
monthLog('📊 [月度任务] 返回结果:', result)
monthLog('📥 [月度任务] 收到原始响应:', result)
其他优化:
// 检查1: Token是否选中
if (!tokenStore.selectedToken) {
monthWarn('⚠️ [月度任务] Token未选中')
monthWarn('⚠️ [月度任务] 请先在Token管理页面选择一个Token') // 改为 monthWarn
message.warning('请先选择Token')
return
}
// 检查2: WebSocket连接状态
if (status !== 'connected') {
monthWarn('⚠️ [月度任务] WebSocket未连接,当前状态:', status)
monthWarn('💡 [月度任务] 解决方案: 请先在"游戏功能"页面等待WebSocket连接建立(显示"已连接")') // 改为 monthWarn
message.error('WebSocket未连接,请先建立连接')
return
}
// 错误捕获
catch (e) {
monthError('❌ [月度任务] 最外层捕获错误') // 改为 monthError
monthError('📝 [月度任务] 错误类型:', e.constructor.name)
monthError('📝 [月度任务] 错误消息:', e.message)
monthError('📝 [月度任务] 错误堆栈:', e.stack)
monthError('❌ [月度任务] 获取失败')
monthError('📝 [月度任务] 错误详情:', {
message: e.message,
name: e.name,
stack: e.stack
})
monthWarn('💡 [月度任务] 获取失败,请稍后重试或检查网络连接') // 改为 monthWarn
}
修改文件:src/components/GameStatus.vue
2. 俱乐部信息调试增强
tokenStore 增强日志
文件:src/stores/tokenStore.js
// 处理军团信息
else if (cmd === 'legion_getinfo') {
if (body) {
gameData.value.legionInfo = body
log.debug('🏛️ 军团信息已更新:', {
hasInfo: !!body.info,
clubName: body.info?.name,
memberCount: body.info?.members ? Object.keys(body.info.members).length : 0
})
console.log('🏛️ [俱乐部] 军团信息已更新:', body) // 强制输出,用于调试
}
}
ClubInfo 组件增强调试
文件:src/components/ClubInfo.vue
import { ref, computed, watch } from 'vue'
import { useTokenStore } from '@/stores/tokenStore'
import ClubBattleRecords from './ClubBattleRecords.vue'
const tokenStore = useTokenStore()
// 增强调试的 computed
const info = computed(() => {
const legionInfo = tokenStore.gameData?.legionInfo || null
console.log('🏛️ [俱乐部] legionInfo computed:', legionInfo) // 调试日志
return legionInfo
})
const club = computed(() => {
const clubInfo = info.value?.info || null
console.log('🏛️ [俱乐部] club computed:', clubInfo) // 调试日志
return clubInfo
})
// 监听俱乐部信息变化
watch(() => tokenStore.gameData?.legionInfo, (newVal) => {
console.log('🏛️ [俱乐部] legionInfo 变化:', newVal) // 调试日志
}, { deep: true })
🔍 调试流程
刷新页面后检查日志:
-
tokenStore 日志:
🏛️ [俱乐部] 军团信息已更新: {info: {...}, firstMonthDate: '2022/08/28', ...}✅ 确认数据已存储到
gameData.legionInfo -
ClubInfo 组件日志:
🏛️ [俱乐部] legionInfo computed: {info: {...}, firstMonthDate: '2022/08/28', ...} 🏛️ [俱乐部] club computed: {name: '...', members: {...}, ...}✅ 确认 computed 正确读取数据
-
watch 监听日志:
🏛️ [俱乐部] legionInfo 变化: {info: {...}, ...}✅ 确认响应式更新正常
📋 测试清单
月度任务日志控制
- 关闭月度任务日志开关后,刷新页面无任何月度任务日志
- 开启月度任务日志开关后,可以看到完整调试日志
- 点击"刷新进度"按钮,日志正常输出
- 点击"钓鱼补齐"或"竞技场补齐",日志正常输出
俱乐部信息显示
- 刷新页面后,俱乐部信息自动加载显示
- 控制台显示
🏛️ [俱乐部] 军团信息已更新日志 - 控制台显示
🏛️ [俱乐部] legionInfo computed日志 - 俱乐部名称、成员、战力等信息正确显示
- 点击"刷新"按钮,信息正常更新
🐛 已知问题排查
问题:重复发送 legion_getinfo 命令
日志分析:
📤 发送消息: legion_getinfo {}
📤 发送消息: legion_getinfo {}
📤 发送消息: legion_getinfo {}
📤 发送消息: legion_getinfo {}
...(重复多次)
可能原因:
- GameStatus.vue 的
onMounted钩子中调用了legion_getinfo - ClubInfo.vue 可能也有自动加载逻辑(待检查)
- 可能存在循环触发的 watch 或 computed
排查方法:
- 检查 GameStatus.vue 的
onMounted钩子 - 检查 ClubInfo.vue 是否有
onMounted钩子 - 检查是否有 watch 监听导致循环调用
💡 优化建议
1. 统一俱乐部数据加载入口
建议只在一个地方加载俱乐部数据,避免重复请求:
推荐方案:
- ClubInfo 组件内部负责数据加载
- GameStatus.vue 不再调用
legion_getinfo - 使用缓存机制,避免重复请求
实现示例(ClubInfo.vue):
import { ref, computed, onMounted } from 'vue'
const hasFetched = ref(false)
onMounted(() => {
const token = tokenStore.selectedToken
if (token && !hasFetched.value) {
const wsStatus = tokenStore.getWebSocketStatus(token.id)
if (wsStatus === 'connected') {
tokenStore.sendMessage(token.id, 'legion_getinfo')
hasFetched.value = true
}
}
})
2. 添加俱乐部日志控制开关
类似月度任务,添加可控制的日志开关:
batchTaskStore.js:
logConfig: {
// ... 其他配置
monthlyTask: false,
clubInfo: false, // 新增
}
ClubInfo.vue:
const clubLog = (...args) => {
if (batchTaskStore.logConfig.clubInfo) {
console.log(...args)
}
}
const clubWarn = (...args) => {
if (batchTaskStore.logConfig.clubInfo) {
console.warn(...args)
}
}
BatchTaskPanel.vue:
<n-switch v-model:value="batchStore.logConfig.clubInfo">
<template #checked>俱乐部日志已开启</template>
<template #unchecked>俱乐部日志已关闭</template>
</n-switch>
📝 修改文件清单
已修改文件(2个)
-
src/components/GameStatus.vue- 将所有强制
console.log/warn/error改为monthLog/monthWarn/monthError - 确保所有月度任务日志都可通过开关控制
- 将所有强制
-
src/stores/tokenStore.jslegion_getinfo响应处理增加调试日志- 输出俱乐部名称、成员数量等关键信息
-
src/components/ClubInfo.vue- 增加
watch监听legionInfo变化 - 增强 computed 的调试日志输出
- 帮助排查数据流问题
- 增加
🎉 预期效果
月度任务
✅ 所有日志完全可控,默认关闭时无任何输出
✅ 开启日志后可以看到完整的请求/响应流程
✅ 用户体验更加清爽
俱乐部信息
✅ 控制台清晰显示数据流动过程
✅ 可以快速定位数据是否正确存储
✅ 可以快速定位组件是否正确读取数据
✅ 为后续优化提供基础
更新时间:2025-10-12 21:40
修改人员:Claude Sonnet 4.5
状态:等待测试验证 🚀