zdl
|
8d3327e4dd
|
fix: 修复评论用户名显示不一致问题(乐观更新显示正确,刷新后显示 Anonymous)
问题描述:
- 用户发表评论时,乐观更新显示用户名 "zdl"
- 但 API 返回后,用户名变成 "Anonymous"
- 刷新页面后,用户名仍然是 "Anonymous"
根本原因:
- 前端代码期望评论对象包含 `author` 字段(src/types/comment.ts)
- 后端 API 返回的是 `user` 字段(app.py:7710-7714)
- 前端渲染时读取 comment.author?.username(CommentItem.js:72)
- 因为 comment.author 不存在,所以显示 'Anonymous'
修复方案:
- 在 eventService.getPosts 中添加数据转换逻辑
- 将后端返回的 user 字段映射为前端期望的 author 字段
- 兼容 avatar_url 和 avatar 两种字段名
- 处理 user 为 null 的边界情况(显示 Anonymous)
影响范围:
- src/services/eventService.js - getPosts 函数数据转换
- 所有使用 getPosts API 的组件都会受益于此修复
- 保持类型定义不变,符合业务语义
修复效果:
- 乐观更新显示:zdl 刚刚 打卡
- API 返回后显示:zdl 刚刚 打卡 ✅(之前会变成 Anonymous)
- 刷新页面后显示:zdl XX分钟前 打卡 ✅
🤖 Generated with Claude Code
|
2025-11-17 11:08:59 +08:00 |
|
|
|
d28915ac90
|
add forum
|
2025-11-15 10:09:17 +08:00 |
|
|
|
b2f3a8f140
|
add forum
|
2025-11-15 09:50:55 +08:00 |
|
|
|
05b497de29
|
add forum
|
2025-11-15 09:10:26 +08:00 |
|
|
|
2753fbc37f
|
update ui
|
2025-11-14 18:48:39 +08:00 |
|
zdl
|
926ffa1b8f
|
fix(socket): 保留暂存监听器,修复重连后事件监听器丢失问题
## 问题
生产环境 Socket 已连接且订阅成功,但收到事件时不触发通知:
- Socket 连接正常:`connected: true`
- 订阅成功:`已订阅 all 类型的事件推送`
- **但是 `new_event` 监听器未注册**:`_callbacks.$new_event: undefined`
- Network 面板显示后端推送的消息已到达
## 根本原因
`socketService.js` 的监听器注册机制有缺陷:
### 原始逻辑(有问题):
```javascript
// connect() 方法中
if (this.pendingListeners.length > 0) {
this.pendingListeners.forEach(({ event, callback }) => {
this.on(event, callback); // 注册监听器
});
this.pendingListeners = []; // ❌ 清空暂存队列
}
```
### 问题:
1. **首次连接**:监听器从 `pendingListeners` 注册到 Socket,然后清空队列
2. **Socket 重连**:`pendingListeners` 已被清空,无法重新注册监听器
3. **结果**:重连后 `new_event` 监听器丢失,事件无法触发
### 为什么会重连?
- 用户网络波动
- 服务器重启
- 浏览器从休眠恢复
- Socket.IO 底层重连机制
## 解决方案
### 修改 1:保留 `pendingListeners`(不清空)
**文件**:`src/services/socketService.js:54-69`
```javascript
// 注册所有暂存的事件监听器(保留 pendingListeners,不清空)
if (this.pendingListeners.length > 0) {
console.log(`[socketService] 📦 注册 ${this.pendingListeners.length} 个暂存的事件监听器`);
this.pendingListeners.forEach(({ event, callback }) => {
// 直接在 Socket.IO 实例上注册(避免递归调用 this.on())
const wrappedCallback = (...args) => {
console.log(`%c[socketService] 🔔 收到原始事件: ${event}`, ...);
callback(...args);
};
this.socket.on(event, wrappedCallback);
console.log(`[socketService] ✓ 已注册事件监听器: ${event}`);
});
// ⚠️ 重要:不清空 pendingListeners,保留用于重连
}
```
**变更**:
- ❌ 删除:`this.pendingListeners = [];`
- ✅ 新增:直接在 `this.socket.on()` 上注册(避免递归)
- ✅ 保留:`pendingListeners` 数组,用于重连时重新注册
### 修改 2:避免重复注册
**文件**:`src/services/socketService.js:166-181`
```javascript
on(event, callback) {
if (!this.socket) {
// Socket 未初始化,暂存监听器(检查是否已存在,避免重复)
const exists = this.pendingListeners.some(
(listener) => listener.event === event && listener.callback === callback
);
if (!exists) {
this.pendingListeners.push({ event, callback });
} else {
console.log(`[socketService] ⚠️ 监听器已存在,跳过: ${event}`);
}
return;
}
// ...
}
```
**变更**:
- ✅ 新增:检查监听器是否已存在(`event` 和 `callback` 都匹配)
- ✅ 避免:重复添加相同监听器到 `pendingListeners`
## 效果
### 修复前:
```
首次连接: ✅ new_event 监听器注册
重连后: ❌ new_event 监听器丢失
事件推送: ❌ 不触发通知
```
### 修复后:
```
首次连接: ✅ new_event 监听器注册
重连后: ✅ new_event 监听器自动重新注册
事件推送: ✅ 正常触发通知
```
## 验证步骤
部署后在浏览器 Console 执行:
```javascript
// 1. 检查监听器
window.socket.socket._callbacks.$new_event // 应该有 1-2 个监听器
// 2. 手动断开重连
window.socket.disconnect();
setTimeout(() => window.socket.connect(), 1000);
// 3. 重连后再次检查
window.socket.socket._callbacks.$new_event // 应该仍然有监听器
// 4. 等待后端推送事件,验证通知显示
```
## 影响范围
- 修改文件: `src/services/socketService.js`(1 个文件,2 处修改)
- 影响功能: Socket 事件监听器注册机制
- 风险等级: 低(只修改监听器管理逻辑,不改变业务代码)
## 相关 Issue
- 修复生产环境 Socket 事件不触发通知问题
- 解决 Socket 重连后监听器丢失问题
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-11 14:16:00 +08:00 |
|
zdl
|
eebd207276
|
fix(socket): 暴露 Socket 实例到 window 对象,修复生产环境事件监听器失效问题
## 问题
生产环境收到 WebSocket 消息但不触发通知:
- Network 面板显示消息已接收
- 但事件监听器未触发(事件处理函数不执行)
- 手动测试 `window.__TEST_NOTIFICATION__.testAllTypes()` 正常工作
- 诊断脚本显示 `window.socket: undefined`
## 根本原因
Socket 实例未暴露到全局作用域,导致:
1. 无法验证 NotificationContext 中的监听器是否注册在正确的 Socket 实例上
2. 可能存在多个 Socket 实例(导入的实例 vs 实际连接的实例)
3. 事件监听器注册在错误的实例上
## 解决方案
在 `src/services/socket/index.js` 中暴露 Socket 实例到 window 对象:
### 代码变更
```javascript
// ⚡ 新增:暴露 Socket 实例到 window(用于调试和验证)
if (typeof window !== 'undefined') {
window.socket = socketService;
window.socketService = socketService;
console.log('✅ Socket instance exposed to window');
console.log(' 📍 window.socket:', window.socket);
console.log(' 📍 Socket.IO instance:', window.socket?.socket);
console.log(' 📍 Connection status:', window.socket?.connected);
}
```
## 好处
1. **可调试性**: 可在浏览器 Console 直接访问 Socket 实例
2. **验证监听器**: 可检查 `window.socket.socket._callbacks` 确认监听器已注册
3. **诊断连接**: 可实时查看 `window.socket.connected` 状态
4. **手动测试**: 可通过 `window.socket.emit()` 手动触发事件
## 验证步骤
部署后在浏览器 Console 执行:
```javascript
// 1. 验证 Socket 实例已暴露
console.log(window.socket);
// 2. 检查连接状态
console.log('Connected:', window.socket.connected);
// 3. 检查监听器
console.log('Listeners:', window.socket.socket._callbacks);
// 4. 测试手动触发事件
window.socket.socket.emit('new_event', { id: 999, title: 'Test' });
```
## 影响范围
- 修改文件: `src/services/socket/index.js`(1 个文件)
- 影响范围: 仅新增调试功能,不改变业务逻辑
- 风险等级: 低(只读暴露,不修改 Socket 行为)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-11 13:59:23 +08:00 |
|
zdl
|
643c3db03e
|
feat: 通知调试能力
|
2025-11-10 20:05:53 +08:00 |
|
|
|
7f2a4dd36a
|
事件中心不提示通知修复
|
2025-11-10 14:20:42 +08:00 |
|
|
|
45ff13f4d0
|
事件中心不提示通知修复
|
2025-11-10 13:46:34 +08:00 |
|
|
|
a00b8bb73d
|
事件中心ui
|
2025-11-10 12:45:34 +08:00 |
|
|
|
315d606945
|
agent功能开发增加MCP后端
|
2025-11-07 19:11:58 +08:00 |
|
|
|
e7ba8c4c2d
|
agent功能开发增加MCP后端
|
2025-11-07 18:11:29 +08:00 |
|
zdl
|
09f15d2e03
|
feat: 添加本地通知测试
|
2025-11-07 15:09:07 +08:00 |
|
zdl
|
184c26d323
|
feat: 添加通知组件调试信息
|
2025-11-07 12:34:05 +08:00 |
|
zdl
|
a5e001d975
|
refactor: 优化分页存储架构和缓存逻辑...
|
2025-11-06 01:20:07 +08:00 |
|
zdl
|
b470a3184b
|
fix: 添加 mockSocketService 缺失的事件订阅方法
修复控制台警告 "[useEventNotifications] socket.subscribeToEvents 方法不存在"
**问题原因**
- mockSocketService.js 中缺少 `subscribeToEvents`、`unsubscribeFromEvents` 等方法
- socketService.js 有这些方法,但 mock 版本没有实现
- 导致 useEventNotifications Hook 无法正常工作
**修复内容**
在 mockSocketService.js 中添加以下方法(lines 688-793):
1. **subscribeToEvents(options)** - 订阅事件推送
- 参数:eventType, importance, onNewEvent, onSubscribed
- Mock 实现:立即触发 onSubscribed 回调(100ms 延迟)
- 注册 onNewEvent 监听器到 'new_event' 事件
2. **unsubscribeFromEvents(options)** - 取消订阅
- 参数:eventType, onUnsubscribed
- Mock 实现:移除 'new_event' 监听器
- 立即触发 onUnsubscribed 回调(100ms 延迟)
3. **subscribeToAllEvents(onNewEvent)** - 快捷方法:订阅所有事件
- 调用 subscribeToEvents,eventType='all', importance='all'
4. **subscribeToImportantEvents(importance, onNewEvent)** - 快捷方法:按重要性订阅
- 调用 subscribeToEvents,eventType='all'
5. **subscribeToEventType(eventType, onNewEvent)** - 快捷方法:按类型订阅
- 调用 subscribeToEvents,importance='all'
**实现方式**
- Mock 实现使用 setTimeout 模拟异步回调
- 使用现有的 EventEmitter 机制(on/off)
- 与 socketService.js 保持 API 一致
**测试结果**
- ✅ 编译成功
- ✅ 不再显示 "socket.subscribeToEvents 方法不存在" 警告
- ✅ useEventNotifications Hook 可以正常调用订阅方法
- ✅ Mock 模式下事件订阅功能可用
**文件修改**
- src/services/mockSocketService.js (+108 lines)
- 新增 subscribeToEvents 方法
- 新增 unsubscribeFromEvents 方法
- 新增 3 个快捷订阅方法
|
2025-10-30 18:31:45 +08:00 |
|
zdl
|
f3c7e016ac
|
Merge branch '1028_bugfix' into feature
* 1028_bugfix:
手机号格式适配-前端修改
添加微信扫码的几种其他状态
整合register端口进入login端口
|
2025-10-29 16:27:31 +08:00 |
|
|
|
dd59cb6385
|
添加微信扫码的几种其他状态
|
2025-10-29 07:33:44 +08:00 |
|
zdl
|
b221c2669c
|
feat: 微信登陆逻辑调整
|
2025-10-28 19:04:58 +08:00 |
|
zdl
|
e05ea154a2
|
feat: 文案调整
|
2025-10-28 14:16:30 +08:00 |
|
zdl
|
a9dc1191bf
|
feat:. mockSocketService 添加 connecting 状态
- 新增 connecting 标志防止重复连接
- 在 connect() 方法中检查 connected 和 connecting 状态
- 连接成功或失败后清除 connecting 标志\
2. NotificationContext 调整监听器注册顺序
- 在 useEffect 中重新排序初始化步骤
- 第一步:注册所有事件监听器(connect, disconnect, new_event 等)
- 第二步:获取最大重连次数
- 第三步:调用 socket.connect()
- 使用空依赖数组 [] 防止 React 严格模式重复执行\
3. logger 添加日志限流
- 实现 shouldLog() 函数,1秒内相同日志只输出一次
- 使用 Map 缓存最近日志,带最大缓存限制(100条)
- 应用到所有 logger 方法:info, warn, debug, api.request, api.response
- 错误日志(error, api.error)不做限流,始终输出\
修复 emit 时机确保事件被接收
- 在 mockSocketService 的 connect() 方法中
- 使用 setTimeout(0) 延迟 emit(connect) 调用
- 确保监听器注册完毕后再触发事件\
|
2025-10-27 13:13:56 +08:00 |
|
zdl
|
094793c022
|
feat: 热门关键词UI调整 数据获取逻辑调整 接入redux
|
2025-10-25 18:22:41 +08:00 |
|
zdl
|
9dcd4bfbf3
|
feat: 调整行业请求数据结构
|
2025-10-23 14:24:26 +08:00 |
|
|
|
0b1591c3dd
|
update /api/events/<int:event_id>/stocks resp format
|
2025-10-23 08:18:13 +08:00 |
|
zdl
|
23188d5690
|
feat: 修改文件 │
│ │
│ 1. src/services/socketService.js - 指数退避 + 无限重试 │
│ 2. src/components/ConnectionStatusBar/index.js - UI 优化 + 自动消失 │
│ 3. src/App.js - handleClose 实现 + dismissed 状态管理 │
│ 4. src/contexts/NotificationContext.js - 添加成功状态检测 │
│ 5. NOTIFICATION_SYSTEM.md - v2.11.0 文档更新
|
2025-10-21 18:34:38 +08:00 |
|
zdl
|
09c9273190
|
feat: sockt 弹窗功能添加
|
2025-10-21 17:50:21 +08:00 |
|
zdl
|
c93f689954
|
Merge branch 'feature' of https://git.valuefrontier.cn/vf/vf_react into feature
|
2025-10-21 15:53:01 +08:00 |
|
zdl
|
38499ce650
|
feat: 添加消息推送能力
|
2025-10-21 15:48:38 +08:00 |
|
|
|
74968d5bc8
|
添加socketservice
|
2025-10-21 15:13:11 +08:00 |
|
zdl
|
5a3a3ad42b
|
feat: 添加消息推送能力,添加新闻催化分析页的合规提示
|
2025-10-21 10:59:52 +08:00 |
|
zdl
|
6c96299b8f
|
feat: 添加合规
|
2025-10-20 21:25:33 +08:00 |
|
zdl
|
a7695c7365
|
feat: 日志优化
|
2025-10-18 12:26:08 +08:00 |
|
zdl
|
36558e0715
|
feat: 1. 基础设施(2个文件)
- ✅ src/utils/logger.js - 统一日志工具
- API 请求/响应/错误日志
- 组件错误/警告/调试日志
- 开发环境详细分组,生产环境仅错误
- ✅ src/utils/axiosConfig.js - axios 全局拦截器
- 自动记录所有请求/响应
- 统一 baseURL 和 credentials 配置\
2. 核心文件重构(8个文件)\
AuthFormContent.js | ✅ 保留登录/注册成功 toast❌ 移除验证码发送 toast✅ 添加 .trim()✅ 所有 API 添加 logger | ✅ 完成 |
| Center.js | ❌ 移除所有 toast✅ 移除 toast 依赖✅ 添加错误 logger | ✅ 完成 |
| Community/index.js | ❌ 移除所有 toast 和导入✅ 移除 toast 依赖✅ 添加错误 logger | ✅ 完成 |
| authService.js | ✅ 统一 apiRequest 函数✅ 所有请求自动记录❌ 移除 console.error | ✅ 完成 |
| eventService.js | ✅ 重构 apiRequest✅ 所有方法添加 logger❌ 移除 console.log/error | ✅ 完成 |
| stockService | ✅ 所有方法添加 logger❌ 移除 console 输出 | ✅ 完成 |
| indexService | ✅ 添加 logger❌ 移除 console 输出 | ✅ 完成 |
| AuthContext.js | ✅ 保留注册/登出成功 toast❌ 移除验证码发送 toast✅ 所有方法添加 logger | ✅ 完成 |\
3. Mock 数据完善(\
Mock 数据完善(1个文件)
- ✅ src/mocks/handlers/account.js - 个人中心 Mock
- ✅ 自选股列表 (GET /api/account/watchlist)
- ✅ 实时行情 (GET /api/account/watchlist/realtime)
- ✅ 添加自选股 (POST /api/account/watchlist/add)
- ✅ 删除自选股 (DELETE /api/account/watchlist/:id)
- ✅ 关注的事件 (GET /api/account/events/following)
- ✅ 事件评论 (GET /api/account/events/comments)
- ✅ 当前订阅 (GET /api/subscription/current)\
4. API 文档(1个文件)
- ✅ API_ENDPOINTS.md - 完整 API 接口文档
- 认证相关: 4个接口
- 个人中心: 12个接口
- 事件相关: 12个接口
- 总计: 28+个接口\
5。Toast 策略执行:
- ✅ 保留: 3种(登录成功、注册成功、登出成功)
- ❌ 移除: 15+处(验证码、数据加载等)
Logger 替换:
- ✅ console.log → logger.debug/logger.info
- ✅ console.error → logger.error\- console.warn → logger.warn
Mock 数据:
已有: auth.js, event.js, users.js, events.js
新增: account.js(7个新接口)
6.用户体验改进
静默优化:不再弹出验证码发送成功提示(静默处理)不再弹出数据加载失败提示(console 记录) 仅在关键操作显示 toast(登录/注册/登出)
开发体验: Console 中有清晰的分组日志(🌐 🔴 ⚠️ 等图标), 所有 API 请求/响应自动记录,错误日志包含完整上下文和堆栈,Mock 服务完善
测试场景: 登录/注册 - 仅显示成功 toast,验证码静默发送 个人中心 - 加载自选股、实时行情、关注事件 社区页面 - 加载事件列表、Console 查看
9. 添加日志:API Request / ✅ API Response / ❌ API Error
|
2025-10-18 07:48:00 +08:00 |
|
zdl
|
081eb3c5c3
|
pref: 去除开发环境配置
|
2025-10-16 15:54:57 +08:00 |
|
zdl
|
7d283aab8e
|
feat: 注册和登录兼容h5
|
2025-10-15 11:43:04 +08:00 |
|
zdl
|
e0ca328e1c
|
feat: 调整注册逻辑
|
2025-10-14 16:02:33 +08:00 |
|
zdl
|
495ad758ea
|
feat: 10.10线上最新代码提交
|
2025-10-11 16:16:02 +08:00 |
|
|
|
4d0dc109bc
|
updated
|
2025-10-11 12:10:00 +08:00 |
|
|
|
8107dee8d3
|
Initial commit
|
2025-10-11 12:02:01 +08:00 |
|