feat: 添加通知组件调试信息
This commit is contained in:
@@ -310,6 +310,7 @@ class MockSocketService {
|
|||||||
this.reconnectAttempts = 0;
|
this.reconnectAttempts = 0;
|
||||||
this.customReconnectTimer = null;
|
this.customReconnectTimer = null;
|
||||||
this.failConnection = false; // 是否模拟连接失败
|
this.failConnection = false; // 是否模拟连接失败
|
||||||
|
this.pushPaused = false; // 新增:暂停推送标志(保持连接)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -414,6 +415,7 @@ class MockSocketService {
|
|||||||
// 清除所有定时器
|
// 清除所有定时器
|
||||||
this.intervals.forEach(interval => clearInterval(interval));
|
this.intervals.forEach(interval => clearInterval(interval));
|
||||||
this.intervals = [];
|
this.intervals = [];
|
||||||
|
this.pushPaused = false; // 重置暂停状态
|
||||||
|
|
||||||
const wasConnected = this.connected;
|
const wasConnected = this.connected;
|
||||||
this.connected = false;
|
this.connected = false;
|
||||||
@@ -613,6 +615,12 @@ class MockSocketService {
|
|||||||
logger.info('mockSocketService', `Starting mock push: interval=${interval}ms, burst=${burstCount}`);
|
logger.info('mockSocketService', `Starting mock push: interval=${interval}ms, burst=${burstCount}`);
|
||||||
|
|
||||||
const pushInterval = setInterval(() => {
|
const pushInterval = setInterval(() => {
|
||||||
|
// 检查是否暂停推送
|
||||||
|
if (this.pushPaused) {
|
||||||
|
logger.info('mockSocketService', '⏸️ Mock push is paused, skipping this cycle...');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// 随机选择 1-burstCount 条消息
|
// 随机选择 1-burstCount 条消息
|
||||||
const count = Math.floor(Math.random() * burstCount) + 1;
|
const count = Math.floor(Math.random() * burstCount) + 1;
|
||||||
|
|
||||||
@@ -642,9 +650,34 @@ class MockSocketService {
|
|||||||
stopMockPush() {
|
stopMockPush() {
|
||||||
this.intervals.forEach(interval => clearInterval(interval));
|
this.intervals.forEach(interval => clearInterval(interval));
|
||||||
this.intervals = [];
|
this.intervals = [];
|
||||||
|
this.pushPaused = false; // 重置暂停状态
|
||||||
logger.info('mockSocketService', 'Mock push stopped');
|
logger.info('mockSocketService', 'Mock push stopped');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 暂停自动推送(保持连接和定时器运行)
|
||||||
|
*/
|
||||||
|
pausePush() {
|
||||||
|
this.pushPaused = true;
|
||||||
|
logger.info('mockSocketService', '⏸️ Mock push paused (connection and intervals maintained)');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 恢复自动推送
|
||||||
|
*/
|
||||||
|
resumePush() {
|
||||||
|
this.pushPaused = false;
|
||||||
|
logger.info('mockSocketService', '▶️ Mock push resumed');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询推送暂停状态
|
||||||
|
* @returns {boolean} 是否已暂停
|
||||||
|
*/
|
||||||
|
isPushPaused() {
|
||||||
|
return this.pushPaused;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 手动触发一条测试消息
|
* 手动触发一条测试消息
|
||||||
* @param {object} customData - 自定义消息数据(可选)
|
* @param {object} customData - 自定义消息数据(可选)
|
||||||
@@ -836,6 +869,27 @@ if (process.env.NODE_ENV === 'development') {
|
|||||||
logger.info('mockSocketService', `Current reconnection attempts: ${attempts}`);
|
logger.info('mockSocketService', `Current reconnection attempts: ${attempts}`);
|
||||||
return attempts;
|
return attempts;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// 暂停自动推送(保持连接)
|
||||||
|
pausePush: () => {
|
||||||
|
mockSocketService.pausePush();
|
||||||
|
logger.info('mockSocketService', '⏸️ Auto push paused');
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
|
||||||
|
// 恢复自动推送
|
||||||
|
resumePush: () => {
|
||||||
|
mockSocketService.resumePush();
|
||||||
|
logger.info('mockSocketService', '▶️ Auto push resumed');
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
|
||||||
|
// 查看推送暂停状态
|
||||||
|
isPushPaused: () => {
|
||||||
|
const paused = mockSocketService.isPushPaused();
|
||||||
|
logger.info('mockSocketService', `Push status: ${paused ? '⏸️ Paused' : '▶️ Active'}`);
|
||||||
|
return paused;
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
logger.info('mockSocketService', '💡 Mock Socket test functions available:');
|
logger.info('mockSocketService', '💡 Mock Socket test functions available:');
|
||||||
@@ -845,6 +899,9 @@ if (process.env.NODE_ENV === 'development') {
|
|||||||
logger.info('mockSocketService', ' __mockSocket.isConnected() - 查看连接状态');
|
logger.info('mockSocketService', ' __mockSocket.isConnected() - 查看连接状态');
|
||||||
logger.info('mockSocketService', ' __mockSocket.reconnect() - 手动重连');
|
logger.info('mockSocketService', ' __mockSocket.reconnect() - 手动重连');
|
||||||
logger.info('mockSocketService', ' __mockSocket.getAttempts() - 查看重连次数');
|
logger.info('mockSocketService', ' __mockSocket.getAttempts() - 查看重连次数');
|
||||||
|
logger.info('mockSocketService', ' __mockSocket.pausePush() - ⏸️ 暂停自动推送(保持连接)');
|
||||||
|
logger.info('mockSocketService', ' __mockSocket.resumePush() - ▶️ 恢复自动推送');
|
||||||
|
logger.info('mockSocketService', ' __mockSocket.isPushPaused() - 查看推送状态');
|
||||||
}
|
}
|
||||||
|
|
||||||
export default mockSocketService;
|
export default mockSocketService;
|
||||||
|
|||||||
@@ -78,10 +78,93 @@ if (typeof window !== 'undefined') {
|
|||||||
timestamp: new Date().toISOString(),
|
timestamp: new Date().toISOString(),
|
||||||
userAgent: navigator.userAgent,
|
userAgent: navigator.userAgent,
|
||||||
url: window.location.href,
|
url: window.location.href,
|
||||||
|
env: {
|
||||||
|
NODE_ENV: process.env.NODE_ENV,
|
||||||
|
REACT_APP_ENABLE_MOCK: process.env.REACT_APP_ENABLE_MOCK,
|
||||||
|
REACT_APP_USE_MOCK_SOCKET: process.env.REACT_APP_USE_MOCK_SOCKET,
|
||||||
|
REACT_APP_API_URL: process.env.REACT_APP_API_URL,
|
||||||
|
REACT_APP_ENV: process.env.REACT_APP_ENV,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
console.log('[Socket Diagnostics]', diagnostics);
|
console.log('[Socket Diagnostics]', diagnostics);
|
||||||
return diagnostics;
|
return diagnostics;
|
||||||
}
|
},
|
||||||
|
|
||||||
|
// 手动订阅事件
|
||||||
|
subscribe: (options = {}) => {
|
||||||
|
const { eventType = 'all', importance = 'all' } = options;
|
||||||
|
console.log(`[Socket Debug] Subscribing to events: type=${eventType}, importance=${importance}`);
|
||||||
|
|
||||||
|
if (socket.subscribeToEvents) {
|
||||||
|
socket.subscribeToEvents({
|
||||||
|
eventType,
|
||||||
|
importance,
|
||||||
|
onNewEvent: (event) => {
|
||||||
|
console.log('[Socket Debug] ✅ New event received:', event);
|
||||||
|
},
|
||||||
|
onSubscribed: (data) => {
|
||||||
|
console.log('[Socket Debug] ✅ Subscription confirmed:', data);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
console.error('[Socket Debug] ❌ subscribeToEvents method not available');
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// 测试连接质量
|
||||||
|
testConnection: () => {
|
||||||
|
console.log('[Socket Debug] Testing connection...');
|
||||||
|
const start = Date.now();
|
||||||
|
|
||||||
|
if (socket.emit) {
|
||||||
|
socket.emit('ping', { timestamp: start }, (response) => {
|
||||||
|
const latency = Date.now() - start;
|
||||||
|
console.log(`[Socket Debug] ✅ Connection OK - Latency: ${latency}ms`, response);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
console.error('[Socket Debug] ❌ Cannot test connection - socket.emit not available');
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// 检查配置是否正确
|
||||||
|
checkConfig: () => {
|
||||||
|
const config = {
|
||||||
|
socketType: SOCKET_TYPE,
|
||||||
|
useMock,
|
||||||
|
envVars: {
|
||||||
|
REACT_APP_ENABLE_MOCK: process.env.REACT_APP_ENABLE_MOCK,
|
||||||
|
REACT_APP_USE_MOCK_SOCKET: process.env.REACT_APP_USE_MOCK_SOCKET,
|
||||||
|
NODE_ENV: process.env.NODE_ENV,
|
||||||
|
REACT_APP_API_URL: process.env.REACT_APP_API_URL,
|
||||||
|
},
|
||||||
|
socketMethods: {
|
||||||
|
connect: typeof socket.connect,
|
||||||
|
disconnect: typeof socket.disconnect,
|
||||||
|
on: typeof socket.on,
|
||||||
|
emit: typeof socket.emit,
|
||||||
|
subscribeToEvents: typeof socket.subscribeToEvents,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
console.log('[Socket Debug] Configuration Check:', config);
|
||||||
|
|
||||||
|
// 检查潜在问题
|
||||||
|
const issues = [];
|
||||||
|
if (SOCKET_TYPE === 'MOCK' && process.env.NODE_ENV === 'production') {
|
||||||
|
issues.push('⚠️ WARNING: Using MOCK socket in production!');
|
||||||
|
}
|
||||||
|
if (!socket.subscribeToEvents) {
|
||||||
|
issues.push('❌ ERROR: subscribeToEvents method missing');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (issues.length > 0) {
|
||||||
|
console.warn('[Socket Debug] Issues found:', issues);
|
||||||
|
} else {
|
||||||
|
console.log('[Socket Debug] ✅ No issues found');
|
||||||
|
}
|
||||||
|
|
||||||
|
return { config, issues };
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
console.log(
|
console.log(
|
||||||
@@ -92,6 +175,190 @@ if (typeof window !== 'undefined') {
|
|||||||
'%cTry: window.__SOCKET_DEBUG__.getStatus()',
|
'%cTry: window.__SOCKET_DEBUG__.getStatus()',
|
||||||
'color: #2196F3;'
|
'color: #2196F3;'
|
||||||
);
|
);
|
||||||
|
console.log(
|
||||||
|
'%c window.__SOCKET_DEBUG__.checkConfig() - 检查配置',
|
||||||
|
'color: #2196F3;'
|
||||||
|
);
|
||||||
|
console.log(
|
||||||
|
'%c window.__SOCKET_DEBUG__.subscribe() - 手动订阅事件',
|
||||||
|
'color: #2196F3;'
|
||||||
|
);
|
||||||
|
console.log(
|
||||||
|
'%c window.__SOCKET_DEBUG__.testConnection() - 测试连接',
|
||||||
|
'color: #2196F3;'
|
||||||
|
);
|
||||||
|
|
||||||
|
// ========== 通知系统专用调试 API ==========
|
||||||
|
window.__NOTIFY_DEBUG__ = {
|
||||||
|
// 完整检查(配置+连接+订阅状态)
|
||||||
|
checkAll: () => {
|
||||||
|
console.log('\n==========【通知系统诊断】==========');
|
||||||
|
|
||||||
|
// 1. 检查 Socket 配置
|
||||||
|
const socketCheck = window.__SOCKET_DEBUG__.checkConfig();
|
||||||
|
console.log('\n✓ Socket 配置检查完成');
|
||||||
|
|
||||||
|
// 2. 检查连接状态
|
||||||
|
const status = window.__SOCKET_DEBUG__.getStatus();
|
||||||
|
console.log('\n✓ 连接状态:', status.connected ? '✅ 已连接' : '❌ 未连接');
|
||||||
|
|
||||||
|
// 3. 检查环境变量
|
||||||
|
console.log('\n✓ API Base:', process.env.REACT_APP_API_URL || '(使用相对路径)');
|
||||||
|
|
||||||
|
// 4. 检查浏览器通知权限
|
||||||
|
const browserPermission = Notification?.permission || 'unsupported';
|
||||||
|
console.log('\n✓ 浏览器通知权限:', browserPermission);
|
||||||
|
|
||||||
|
// 5. 汇总报告
|
||||||
|
const report = {
|
||||||
|
timestamp: new Date().toISOString(),
|
||||||
|
socket: {
|
||||||
|
type: SOCKET_TYPE,
|
||||||
|
connected: status.connected,
|
||||||
|
reconnectAttempts: status.reconnectAttempts,
|
||||||
|
},
|
||||||
|
env: socketCheck.config.envVars,
|
||||||
|
browserNotification: browserPermission,
|
||||||
|
issues: socketCheck.issues,
|
||||||
|
};
|
||||||
|
|
||||||
|
console.log('\n========== 诊断报告 ==========');
|
||||||
|
console.table(report);
|
||||||
|
|
||||||
|
if (report.issues.length > 0) {
|
||||||
|
console.warn('\n⚠️ 发现问题:', report.issues);
|
||||||
|
} else {
|
||||||
|
console.log('\n✅ 系统正常,未发现问题');
|
||||||
|
}
|
||||||
|
|
||||||
|
// 提供修复建议
|
||||||
|
if (!status.connected) {
|
||||||
|
console.log('\n💡 修复建议:');
|
||||||
|
console.log(' 1. 检查网络连接');
|
||||||
|
console.log(' 2. 尝试手动重连: __SOCKET_DEBUG__.reconnect()');
|
||||||
|
console.log(' 3. 检查后端服务是否运行');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (browserPermission === 'denied') {
|
||||||
|
console.log('\n💡 浏览器通知已被拒绝,请在浏览器设置中允许通知权限');
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('\n====================================\n');
|
||||||
|
|
||||||
|
return report;
|
||||||
|
},
|
||||||
|
|
||||||
|
// 手动订阅事件(简化版)
|
||||||
|
subscribe: (eventType = 'all', importance = 'all') => {
|
||||||
|
console.log(`\n[通知调试] 手动订阅事件: type=${eventType}, importance=${importance}`);
|
||||||
|
window.__SOCKET_DEBUG__.subscribe({ eventType, importance });
|
||||||
|
},
|
||||||
|
|
||||||
|
// 模拟接收通知(用于测试UI)
|
||||||
|
testNotify: (type = 'announcement') => {
|
||||||
|
console.log('\n[通知调试] 模拟通知:', type);
|
||||||
|
|
||||||
|
const mockNotifications = {
|
||||||
|
announcement: {
|
||||||
|
id: `test_${Date.now()}`,
|
||||||
|
type: 'announcement',
|
||||||
|
priority: 'important',
|
||||||
|
title: '🧪 测试公告通知',
|
||||||
|
content: '这是一条测试消息,用于验证通知系统是否正常工作',
|
||||||
|
publishTime: Date.now(),
|
||||||
|
pushTime: Date.now(),
|
||||||
|
},
|
||||||
|
stock_alert: {
|
||||||
|
id: `test_${Date.now()}`,
|
||||||
|
type: 'stock_alert',
|
||||||
|
priority: 'urgent',
|
||||||
|
title: '🧪 测试股票预警',
|
||||||
|
content: '贵州茅台触发价格预警: 1850.00元 (+5.2%)',
|
||||||
|
publishTime: Date.now(),
|
||||||
|
pushTime: Date.now(),
|
||||||
|
},
|
||||||
|
event_alert: {
|
||||||
|
id: `test_${Date.now()}`,
|
||||||
|
type: 'event_alert',
|
||||||
|
priority: 'important',
|
||||||
|
title: '🧪 测试事件动向',
|
||||||
|
content: 'AI大模型新政策发布,影响科技板块',
|
||||||
|
publishTime: Date.now(),
|
||||||
|
pushTime: Date.now(),
|
||||||
|
},
|
||||||
|
analysis_report: {
|
||||||
|
id: `test_${Date.now()}`,
|
||||||
|
type: 'analysis_report',
|
||||||
|
priority: 'normal',
|
||||||
|
title: '🧪 测试分析报告',
|
||||||
|
content: '2024年Q1市场策略报告已发布',
|
||||||
|
publishTime: Date.now(),
|
||||||
|
pushTime: Date.now(),
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const notification = mockNotifications[type] || mockNotifications.announcement;
|
||||||
|
|
||||||
|
// 触发 new_event 事件
|
||||||
|
if (socket.emit) {
|
||||||
|
// 对于真实 Socket,模拟服务端推送(实际上客户端无法这样做,仅用于Mock模式)
|
||||||
|
console.warn('⚠️ 真实 Socket 无法模拟服务端推送,请使用 Mock 模式或等待真实推送');
|
||||||
|
}
|
||||||
|
|
||||||
|
// 直接触发事件监听器(如果是 Mock 模式)
|
||||||
|
if (SOCKET_TYPE === 'MOCK' && socket.emit) {
|
||||||
|
socket.emit('new_event', notification);
|
||||||
|
console.log('✅ 已触发 Mock 通知事件');
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('通知数据:', notification);
|
||||||
|
return notification;
|
||||||
|
},
|
||||||
|
|
||||||
|
// 导出完整诊断报告
|
||||||
|
exportReport: () => {
|
||||||
|
const report = window.__NOTIFY_DEBUG__.checkAll();
|
||||||
|
|
||||||
|
// 生成可下载的 JSON
|
||||||
|
const blob = new Blob([JSON.stringify(report, null, 2)], { type: 'application/json' });
|
||||||
|
const url = URL.createObjectURL(blob);
|
||||||
|
const a = document.createElement('a');
|
||||||
|
a.href = url;
|
||||||
|
a.download = `notification-debug-${Date.now()}.json`;
|
||||||
|
a.click();
|
||||||
|
URL.revokeObjectURL(url);
|
||||||
|
|
||||||
|
console.log('✅ 诊断报告已导出');
|
||||||
|
return report;
|
||||||
|
},
|
||||||
|
|
||||||
|
// 快捷帮助
|
||||||
|
help: () => {
|
||||||
|
console.log('\n========== 通知系统调试 API ==========');
|
||||||
|
console.log('window.__NOTIFY_DEBUG__.checkAll() - 完整诊断检查');
|
||||||
|
console.log('window.__NOTIFY_DEBUG__.subscribe() - 手动订阅事件');
|
||||||
|
console.log('window.__NOTIFY_DEBUG__.testNotify(type) - 模拟通知 (announcement/stock_alert/event_alert/analysis_report)');
|
||||||
|
console.log('window.__NOTIFY_DEBUG__.exportReport() - 导出诊断报告');
|
||||||
|
console.log('\n========== Socket 调试 API ==========');
|
||||||
|
console.log('window.__SOCKET_DEBUG__.getStatus() - 获取连接状态');
|
||||||
|
console.log('window.__SOCKET_DEBUG__.checkConfig() - 检查配置');
|
||||||
|
console.log('window.__SOCKET_DEBUG__.reconnect() - 手动重连');
|
||||||
|
console.log('====================================\n');
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
console.log(
|
||||||
|
'%c[Notify Debug] Notification Debug API available at window.__NOTIFY_DEBUG__',
|
||||||
|
'color: #FF9800; font-weight: bold;'
|
||||||
|
);
|
||||||
|
console.log(
|
||||||
|
'%cTry: window.__NOTIFY_DEBUG__.checkAll() - 完整诊断',
|
||||||
|
'color: #FF9800;'
|
||||||
|
);
|
||||||
|
console.log(
|
||||||
|
'%c window.__NOTIFY_DEBUG__.help() - 查看所有命令',
|
||||||
|
'color: #FF9800;'
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export default socket;
|
export default socket;
|
||||||
|
|||||||
Reference in New Issue
Block a user