Skip to content

Commit d3bb8f0

Browse files
committed
version update: web search+ private chat:本版本更新,引入联网搜索/私信功能
1 parent 083b1f5 commit d3bb8f0

33 files changed

Lines changed: 2408 additions & 32 deletions

File tree

.gitignore

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,7 @@ rabbitmq/
2727

2828
# local-development files
2929
develop_log/
30-
question/
30+
question/
31+
32+
# Claude Code 本地配置(不提交)
33+
.claude/

README.md

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
![Redis](https://img.shields.io/badge/Redis-Latest-DC382D?logo=redis)
88
![RabbitMQ](https://img.shields.io/badge/RabbitMQ-3.13-FF6600?logo=rabbitmq)
99
![LangChain4j](https://img.shields.io/badge/LangChain4j-0.35.0-blue)
10+
![Tavily](https://img.shields.io/badge/Tavily-Search-00B4D8)
11+
![WebSocket](https://img.shields.io/badge/WebSocket-实时私信-6366f1)
1012
![Vite](https://img.shields.io/badge/Vite-7.1-646CFF?logo=vite)
1113

1214
CoderHub 是一个面向开发/学习者的智能技术博客交流社区平台。不仅提供了体系化的技术博客阅读/发布功能,和项目/教程学习模块,更整合了目前热门的 AI Agent 能力,让开发者在阅读和学习过程中,能通过智能助手实时调取平台内的知识库,实现“所见即所得”的互动式学习体验。
@@ -48,8 +50,10 @@ CoderHub 是一个面向开发/学习者的智能技术博客交流社区平台
4850

4951
### 项目开发进度
5052

51-
目前仓库代码已完成 `v1.0.5` 版本的核心功能合并,系统整体运行稳定。
53+
目前仓库代码已完成 `v1.0.6` 版本的核心功能合并,系统整体运行稳定。
5254

55+
- **实时私信系统**:基于原生 WebSocket 实现双向实时通讯,信息中心、私信咨询入口已上线。
56+
- **AI 联网搜索**:集成 Tavily Search API,深度检索与联网可同时开启,本地知识库优先。
5357
- **基础设施更新**:完成 Docker 容器化重构,支持环境变量脱敏配置。
5458
- **CI/CD 集成**:集成 GitHub Actions,实现代码推送自动部署。
5559
- **开发阶段 (当前重点)**:优化 RAG 检索的准确率与 Top-K 召回策略;管理端图表统计增强,降低AI幻觉,增强智能体交互能力,计划引入代码相关Agent功能。
@@ -58,6 +62,25 @@ CoderHub 是一个面向开发/学习者的智能技术博客交流社区平台
5862

5963
### 更新日志
6064

65+
#### v1.0.6 (2026-03-17) - 实时私信系统
66+
67+
**💬 私信聊天功能上线**
68+
69+
- **WebSocket 实时通讯**:基于原生 Spring WebSocket(无 STOMP/SockJS 依赖),用户间消息毫秒级双向推送;支持断线自动重连,前端 5 秒后重试
70+
- **信息中心**:导航栏新增「信息中心」入口,未读消息红色角标实时更新;左侧联系人列表 + 右侧对话区的经典 IM 布局,兼容移动端折叠
71+
- **私信咨询**:文章作者卡片新增「私信咨询」按钮,一键跳转并自动打开与该作者的会话
72+
- **CoderHub 助手**:用户首次打开信息中心,系统自动创建欢迎会话并推送欢迎语,永久置顶于联系人列表顶部
73+
- **在线状态**:基于 WebSocket SESSIONS Map 实时判断对方是否在线,点击会话时动态查询
74+
75+
#### v1.0.5 (2026-03-14) - AI 联网搜索
76+
77+
**🌐 Tavily 联网搜索集成**
78+
79+
- 集成 **Tavily Search API**,AI 回答时可补充互联网实时内容;深度检索与联网搜索可同时开启
80+
- 优先级设计:本地 RAG 知识库优先,联网结果作为补充,避免互联网内容覆盖平台内容
81+
- 搜索结果卡片化展示,显示来源站点名(`github.com``stackoverflow.com` 等)及匹配度
82+
- 后端通过 OkHttp 直接调用 Tavily REST API,无额外依赖;API Key 通过环境变量注入
83+
6184
#### v1.0.5 (2026-03-11) - AI 深度检索升级 & 用户体验完善
6285

6386
**🤖 AI 深度检索(RAG)全面升级**

coderhub_backend/coderhub-common/src/main/java/com/eaxon/coderhubcommon/constant/RedisConstant.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,15 @@ public class RedisConstant {
147147
*/
148148
public static final String ARTICLE_FULLTEXT = "article:fulltext:";
149149

150+
// ==================== 私信聊天 ====================
151+
152+
/**
153+
* 私信未读总数
154+
* Key: chat:unread:{userId}
155+
* Value: Integer
156+
*/
157+
public static final String CHAT_UNREAD = "chat:unread:";
158+
150159
// ==================== 过期时间(单位:秒) ====================
151160

152161
public static final long EXPIRE_30_MINUTES = 30 * 60;

coderhub_backend/coderhub-pojo/src/main/java/com/eaxon/coderhubpojo/DTO/ChatRequestDTO.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ public class ChatRequestDTO {
4444
@Schema(description = "最大输出token数")
4545
private Integer maxTokens;
4646

47+
@Schema(description = "是否启用联网搜索(Tavily)")
48+
private Boolean useWebSearch;
49+
4750
/**
4851
* 对话消息(用于历史记录)
4952
*/

coderhub_backend/coderhub-pojo/src/main/java/com/eaxon/coderhubpojo/DTO/ChatStreamEvent.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,12 @@ public static class RecommendItem {
151151

152152
@Schema(description = "跳转链接")
153153
private String link;
154+
155+
@Schema(description = "来源URL(联网搜索结果)")
156+
private String sourceUrl;
157+
158+
@Schema(description = "来源站点名称,如 github.com")
159+
private String siteName;
154160
}
155161

156162
// =============== 静态工厂方法 ===============
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.eaxon.coderhubpojo.VO;
2+
3+
import java.time.LocalDateTime;
4+
5+
import lombok.AllArgsConstructor;
6+
import lombok.Builder;
7+
import lombok.Data;
8+
import lombok.NoArgsConstructor;
9+
10+
/**
11+
* 私信会话列表项 VO
12+
*/
13+
@Data
14+
@Builder
15+
@NoArgsConstructor
16+
@AllArgsConstructor
17+
public class ChatConversationVO {
18+
19+
private String id;
20+
21+
/** 对方用户ID */
22+
private String peerId;
23+
24+
/** 对方昵称 */
25+
private String peerName;
26+
27+
/** 对方头像 */
28+
private String peerAvatar;
29+
30+
/** 对方会员等级 */
31+
private Integer peerLevel;
32+
33+
/** 最新消息预览 */
34+
private String lastMessage;
35+
36+
/** 最新消息时间 */
37+
private LocalDateTime lastMsgAt;
38+
39+
/** 当前用户在此会话中的未读数 */
40+
private Integer unreadCount;
41+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.eaxon.coderhubpojo.VO;
2+
3+
import java.time.LocalDateTime;
4+
5+
import lombok.AllArgsConstructor;
6+
import lombok.Builder;
7+
import lombok.Data;
8+
import lombok.NoArgsConstructor;
9+
10+
/**
11+
* 私信消息 VO(用于历史记录和 WebSocket 推送)
12+
*/
13+
@Data
14+
@Builder
15+
@NoArgsConstructor
16+
@AllArgsConstructor
17+
public class ChatMsgVO {
18+
19+
private String id;
20+
21+
private String conversationId;
22+
23+
private String senderId;
24+
25+
private String senderName;
26+
27+
private String senderAvatar;
28+
29+
private String receiverId;
30+
31+
private String content;
32+
33+
private Integer isRead;
34+
35+
private LocalDateTime createdAt;
36+
37+
/** 是否是当前用户发送的(供前端判断气泡方向) */
38+
private Boolean isMine;
39+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.eaxon.coderhubpojo.entity;
2+
3+
import java.time.LocalDateTime;
4+
5+
import lombok.AllArgsConstructor;
6+
import lombok.Builder;
7+
import lombok.Data;
8+
import lombok.NoArgsConstructor;
9+
10+
/**
11+
* 私信会话实体(两个用户之间唯一)
12+
*/
13+
@Data
14+
@Builder
15+
@NoArgsConstructor
16+
@AllArgsConstructor
17+
public class ChatConversation {
18+
19+
/** 会话ID(UUID) */
20+
private String id;
21+
22+
/** 参与方1(两个userId中字典序较小者,保证唯一索引) */
23+
private String user1Id;
24+
25+
/** 参与方2(两个userId中字典序较大者) */
26+
private String user2Id;
27+
28+
/** 最新消息预览(截断到255字符) */
29+
private String lastMessage;
30+
31+
/** 最新消息时间 */
32+
private LocalDateTime lastMsgAt;
33+
34+
/** 会话创建时间 */
35+
private LocalDateTime createdAt;
36+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.eaxon.coderhubpojo.entity;
2+
3+
import java.time.LocalDateTime;
4+
5+
import lombok.AllArgsConstructor;
6+
import lombok.Builder;
7+
import lombok.Data;
8+
import lombok.NoArgsConstructor;
9+
10+
/**
11+
* 私信消息实体
12+
* 注意:命名为 ChatMsg 以避免与 LangChain4j 的 ChatMessage 类冲突
13+
*/
14+
@Data
15+
@Builder
16+
@NoArgsConstructor
17+
@AllArgsConstructor
18+
public class ChatMsg {
19+
20+
private String id;
21+
22+
private String conversationId;
23+
24+
private String senderId;
25+
26+
private String receiverId;
27+
28+
private String content;
29+
30+
/** 0=未读,1=已读 */
31+
private Integer isRead;
32+
33+
private LocalDateTime createdAt;
34+
}

coderhub_backend/coderhub-server/pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,12 @@
164164
<groupId>org.springframework.boot</groupId>
165165
<artifactId>spring-boot-starter-mail</artifactId>
166166
</dependency>
167+
168+
<!-- WebSocket(私信实时通讯) -->
169+
<dependency>
170+
<groupId>org.springframework.boot</groupId>
171+
<artifactId>spring-boot-starter-websocket</artifactId>
172+
</dependency>
167173
</dependencies>
168174

169175
<build>

0 commit comments

Comments
 (0)