下面给你一套毕设/课设通用、逻辑完整、老师爱问、答辩不翻车的方案:

《基于 SpringBoot + MySQL + WebSocket 的在线客服系统(坐席分配 + 聊天记录持久化)》

这套方案的亮点是:

WebSocket 实时通信

坐席自动分配算法

聊天记录落库

并发 & 会话管理清晰

非常适合作为 Java Web / SpringBoot 课程设计或本科毕设


一、选题背景(论文可直接用)

随着互联网服务的发展,企业对在线客服系统的需求日益增长。传统客服系统存在以下问题:

  • 依赖轮询,实时性差、资源消耗大

  • 坐席分配不合理,导致用户等待时间长

  • 聊天记录未持久化,难以追溯与质检

  • 缺乏并发会话管理能力

本系统基于 SpringBoot + WebSocket + MySQL,实现了用户与客服之间的实时通信、坐席智能分配及聊天记录持久化,提升了客服效率和用户体验。


二、技术架构

浏览器(JS WebSocket)
↓
SpringBoot WebSocket
├── WebSocketHandler(消息处理)
├── SessionManager(会话管理)
├── AgentDispatcher(坐席分配)
├── Service(业务层)
├── Mapper(MyBatis)
↓
MySQL(用户、坐席、消息)

技术

作用

SpringBoot

快速开发

WebSocket

全双工实时通信

MyBatis

ORM

MySQL

数据持久化

Jackson

JSON 序列化

Thymeleaf / Vue

前端展示


三、系统角色

1️⃣ 用户(访客)

  • 发起会话

  • 发送/接收消息

  • 查看历史记录

2️⃣ 客服坐席

  • 接收系统分配的会话

  • 同时处理多个会话

  • 回复用户消息

3️⃣ 管理员

  • 坐席管理

  • 会话监控

  • 聊天记录查询


四、核心业务流程(答辩必画)

用户发起连接
   ↓
WebSocket 建立连接
   ↓
系统分配空闲坐席
   ↓
绑定会话(用户 ↔ 坐席)
   ↓
双方实时聊天
   ↓
消息落库
   ↓
会话结束 / 超时关闭

五、数据库设计(核心表)

1️⃣ 用户表 user

CREATE TABLE user (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  username VARCHAR(50),
  type INT COMMENT '1-用户 2-客服'
);

2️⃣ 客服坐席表 agent

CREATE TABLE agent (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  user_id BIGINT,
  max_session INT DEFAULT 5,
  current_session INT DEFAULT 0,
  status INT DEFAULT 1 COMMENT '1-在线 0-离线'
);

3️⃣ 会话表 chat_session

CREATE TABLE chat_session (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  user_id BIGINT,
  agent_id BIGINT,
  start_time DATETIME,
  end_time DATETIME,
  status INT COMMENT '1-进行中 2-已结束'
);

4️⃣ 聊天记录表 chat_message(⭐核心)

CREATE TABLE chat_message (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  session_id BIGINT,
  sender_id BIGINT,
  receiver_id BIGINT,
  content TEXT,
  send_time DATETIME,
  is_read TINYINT DEFAULT 0
);

六、WebSocket 核心实现

1️⃣ WebSocket 配置

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(chatWebSocketHandler(), "/ws/chat")
                .setAllowedOrigins("*");
    }

    @Bean
    public WebSocketHandler chatWebSocketHandler() {
        return new ChatWebSocketHandler();
    }
}

2️⃣ WebSocket 处理器(核心)

@Component
public class ChatWebSocketHandler extends TextWebSocketHandler {

    @Autowired
    private SessionManager sessionManager;

    @Autowired
    private AgentDispatcher agentDispatcher;

    @Override
    public void afterConnectionEstablished(WebSocketSession session) {
        Long userId = getUserId(session);
        sessionManager.putUserSession(userId, session);

        // 用户连接后分配坐席
        Long agentId = agentDispatcher.dispatch();
        sessionManager.bindSession(userId, agentId);
    }

    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) {
        ChatMsg msg = JSON.parseObject(message.getPayload(), ChatMsg.class);
        chatService.saveAndSend(msg);
    }
}

七、坐席分配算法(⭐ 创新点)

最少连接数分配(推荐)

@Service
public class AgentDispatcher {

    public Long dispatch() {
        return agentMapper.selectLeastLoadedAgent();
    }
}
SELECT id
FROM agent
WHERE status = 1
  AND current_session < max_session
ORDER BY current_session ASC
LIMIT 1;

📌 老师常问:为什么不用轮询?

✅ 答:轮询可能导致部分坐席过载,最少连接数更均衡。


八、聊天记录持久化

@Service
public class ChatService {

    @Transactional
    public void saveAndSend(ChatMsg msg) {
        // 1. 落库
        chatMessageMapper.insert(msg);

        // 2. 推送
        WebSocketSession session =
                sessionManager.getSession(msg.getReceiverId());
        if (session != null && session.isOpen()) {
            session.sendMessage(
                new TextMessage(JSON.toJSONString(msg))
            );
        }
    }
}

九、会话管理(关键)

@Component
public class SessionManager {

    private final Map<Long, WebSocketSession> userSessions = new ConcurrentHashMap<>();

    public void putUserSession(Long userId, WebSocketSession session) {
        userSessions.put(userId, session);
    }

    public WebSocketSession getSession(Long userId) {
        return userSessions.get(userId);
    }
}

✅ 使用 ConcurrentHashMap保证线程安全


十、前端 WebSocket 示例

const socket = new WebSocket("ws://localhost:8080/ws/chat");

socket.onopen = () => {
    socket.send(JSON.stringify({
        senderId: 1,
        receiverId: 2,
        content: "你好,客服"
    }));
};

socket.onmessage = (event) => {
    console.log("收到消息:" + event.data);
};

十一、系统特色(答辩亮点)

✅ WebSocket 全双工实时通信

✅ 坐席负载均衡分配算法

✅ 聊天记录持久化 & 可追溯

✅ 并发会话管理(线程安全)

✅ 可扩展为分布式 / 微服务

✅ 可接入 AI 客服 / 机器人


十二、论文结构建议

章节

内容

第1章

绪论

第2章

相关技术(WebSocket、SpringBoot)

第3章

需求分析

第4章

系统设计(架构、E-R图、时序图)

第5章

系统实现(连接、分配、存储)

第6章

系统测试

第7章

总结与展望


十三、可扩展方向(体现工作量)

✅ 消息已读未读

✅ 客服排队机制

✅ 聊天记录检索(ES)

✅ 文件/图片消息

✅ 分布式 WebSocket(Redis + STOMP)

✅ 接入大模型客服机器人

更多推荐