zdl
|
154bb76212
|
feat: 添加 H5 跳转小程序功能
- 后端: 新增 JS-SDK 签名接口和 URL Scheme 生成接口
- 前端: 创建 MiniProgramLauncher 组件,支持环境自适应
- 微信内 H5: 使用 wx-open-launch-weapp 开放标签
- 外部浏览器: 使用 URL Scheme 拉起微信
- PC 端: 显示小程序码引导扫码
- 引入微信 JS-SDK (jweixin-1.6.0.js)
- 新增 miniprogramService 服务层封装 API 调用
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-12-12 16:56:04 +08:00 |
|
|
|
cb64548058
|
update pay ui
|
2025-12-11 14:10:59 +08:00 |
|
|
|
04b7e527c2
|
update pay ui
|
2025-12-10 17:45:32 +08:00 |
|
zdl
|
c681b511b4
|
refactor: 股票数据管理迁移到 Redux,新增类型化 Hooks
- stockSlice: 新增 loadAllStocks action(带缓存检查)
- stockSlice: watchlist 结构升级为 { stock_code, stock_name }[]
- store/hooks.ts: 新增 useAppDispatch, useAppSelector 类型化 hooks
- stockService: 移除 getAllStocks(已迁移到 Redux)
- mock: 股票搜索支持模糊匹配 + 相关性排序
|
2025-12-05 17:21:36 +08:00 |
|
|
|
94ad679f6f
|
update pay ui
|
2025-12-03 15:19:23 +08:00 |
|
|
|
aaaf66ca09
|
update pay ui
|
2025-12-03 08:02:49 +08:00 |
|
zdl
|
cdbc2b04b5
|
feat: 精简日志
|
2025-11-26 15:34:11 +08:00 |
|
zdl
|
8129bcdbce
|
feat: 修复通知初始化问题
|
2025-11-26 10:55:38 +08:00 |
|
zdl
|
eba9d8f88f
|
perf: Socket 连接异步化,使用 requestIdleCallback 不阻塞首屏
- NotificationContext: 将 Socket 初始化包裹在 requestIdleCallback 中
- 设置 3 秒超时保护,确保连接不会被无限延迟
- 不支持 requestIdleCallback 的浏览器自动降级到 setTimeout(0)
- socket/index.js: 移除模块加载时的 console.log,减少首屏阻塞感知
- 所有页面的首屏渲染都不再被 Socket 连接阻塞
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2025-11-26 10:34:45 +08:00 |
|
zdl
|
0eedf306f4
|
Merge branch 'feature_2025/251117_pref' into feature_2025/251121_h5UI
* feature_2025/251117_pref: (159 commits)
feat: UI调整
feat: 将滚动事件移东到组件内部
feat: 去掉背景组件
feat: 拆分左侧栏、中间聊天区、右侧栏组件, Hooks 提取
feat: 简化主组件 index.js - 使用组件组合方式重构
feat: 创建 ChatArea 组件(含 MessageRenderer、ExecutionStepsDisplay 子组件)
feat:拆分工具函数
feat: 拆分BackgroundEffects 背景渐变装饰层
feat: RightSidebar (~420 行) - 模型/工具/统计 Tab 面板(单文件)
feat: LeftSidebar (~280 行) - 对话历史列表 + 用户信息卡片
feat: 修复bug
pref:移除黑夜模式
feat: 修复警告
feat: 提取常量配置
feat: 修复ts报错
feat: StockChartModal.tsx 替换 KLine 实现
update pay function
update pay function
update pay function
update pay function
...
|
2025-11-24 16:32:24 +08:00 |
|
|
|
0383e17a1f
|
update pay function
|
2025-11-24 08:05:19 +08:00 |
|
|
|
cb998badde
|
update pay function
|
2025-11-23 20:12:54 +08:00 |
|
|
|
fe47d3dcc6
|
update pay function
|
2025-11-23 18:11:48 +08:00 |
|
zdl
|
09f63f7984
|
feat: Socket.IO 连接地址(Mock 模式下连接生产环境)
|
2025-11-21 18:22:18 +08:00 |
|
|
|
668e0c98d6
|
update pay function
|
2025-11-20 16:59:09 +08:00 |
|
|
|
1867c075e4
|
update pay function
|
2025-11-20 13:43:04 +08:00 |
|
|
|
1a1fb5ba03
|
update pay function
|
2025-11-20 13:25:50 +08:00 |
|
|
|
af6b4a9e41
|
update pay function
|
2025-11-20 12:55:28 +08:00 |
|
zdl
|
4f9233ed14
|
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 |
|
|
|
41fa6e08b3
|
add forum
|
2025-11-15 10:09:17 +08:00 |
|
|
|
7297ffa84b
|
add forum
|
2025-11-15 09:50:55 +08:00 |
|
|
|
0ae5618ef9
|
add forum
|
2025-11-15 09:10:26 +08:00 |
|
|
|
3ea93ea4cb
|
update ui
|
2025-11-14 18:48:39 +08:00 |
|
zdl
|
c07bfb0e4b
|
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
|
8bd52074d8
|
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
|
aee79cd14d
|
feat: 通知调试能力
|
2025-11-10 20:05:53 +08:00 |
|
|
|
3bace2f402
|
事件中心不提示通知修复
|
2025-11-10 14:20:42 +08:00 |
|
|
|
6e2db2b90f
|
事件中心不提示通知修复
|
2025-11-10 13:46:34 +08:00 |
|
|
|
2e9a1a6afa
|
事件中心ui
|
2025-11-10 12:45:34 +08:00 |
|
|
|
a8f859e853
|
agent功能开发增加MCP后端
|
2025-11-07 19:11:58 +08:00 |
|
|
|
99bb51e526
|
agent功能开发增加MCP后端
|
2025-11-07 18:11:29 +08:00 |
|
zdl
|
8e6da17f42
|
feat: 添加本地通知测试
|
2025-11-07 15:09:07 +08:00 |
|
zdl
|
07be325a00
|
feat: 添加通知组件调试信息
|
2025-11-07 12:34:05 +08:00 |
|
zdl
|
56a4f2c181
|
refactor: 优化分页存储架构和缓存逻辑...
|
2025-11-06 01:20:07 +08:00 |
|
zdl
|
36902d8ad9
|
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
|
691627ac6c
|
Merge branch '1028_bugfix' into feature
* 1028_bugfix:
手机号格式适配-前端修改
添加微信扫码的几种其他状态
整合register端口进入login端口
|
2025-10-29 16:27:31 +08:00 |
|
|
|
67a5de91da
|
添加微信扫码的几种其他状态
|
2025-10-29 07:33:44 +08:00 |
|
zdl
|
e0341863fc
|
feat: 微信登陆逻辑调整
|
2025-10-28 19:04:58 +08:00 |
|
zdl
|
d876ec6ac6
|
feat: 文案调整
|
2025-10-28 14:16:30 +08:00 |
|
zdl
|
af012ae8d0
|
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
|
ef61e7b66c
|
feat: 热门关键词UI调整 数据获取逻辑调整 接入redux
|
2025-10-25 18:22:41 +08:00 |
|
zdl
|
cc743a3032
|
feat: 调整行业请求数据结构
|
2025-10-23 14:24:26 +08:00 |
|
|
|
990d60166e
|
update /api/events/<int:event_id>/stocks resp format
|
2025-10-23 08:18:13 +08:00 |
|
zdl
|
a4fd3dd309
|
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
|
9375d2ba14
|
feat: sockt 弹窗功能添加
|
2025-10-21 17:50:21 +08:00 |
|
zdl
|
b21033ba10
|
Merge branch 'feature' of https://git.valuefrontier.cn/vf/vf_react into feature
|
2025-10-21 15:53:01 +08:00 |
|
zdl
|
d0ad51cc17
|
feat: 添加消息推送能力
|
2025-10-21 15:48:38 +08:00 |
|
|
|
c043c40004
|
添加socketservice
|
2025-10-21 15:13:11 +08:00 |
|
zdl
|
ced6dbc559
|
feat: 添加消息推送能力,添加新闻催化分析页的合规提示
|
2025-10-21 10:59:52 +08:00 |
|
zdl
|
300c0a18a6
|
feat: 添加合规
|
2025-10-20 21:25:33 +08:00 |
|