简单商城、在线客服管理系统

一套微服务在线客服系统:访客在商城页通过悬浮气泡咨询,客服在管理后台工作台实时接待(WebSocket 长连接),同时保留商城/后台本身的业务能力。

架构示意图

浏览器

┌──────────────────────┐ ┌──────────────────────────┐

│ 商城 customer-system │ │ 后台 admin-system │

│ Naive UI :3001 │ │ Element Plus :3000 │

│ 访客悬浮聊天窗 │ │ 客服工作台(SSO 免二次登录) │

└──────────┬───────────┘ └────────────┬─────────────┘

│ HTTP /api WS /ws │ HTTP /ocs-api WS /ocs-ws

▼ ▼

┌─────────────────────────┐

│ Spring Cloud Gateway:9000│ 统一入口/路由/静态文件

└────────────┬─────────────┘

┌───────────────────┼───────────────────┐

▼ ▼ ▼

┌────────────────┐ ┌─────────────────┐ ┌──────────────────────┐

│ admin-service │ │customer-service │ │ online-service │

│ :8080 │ │ :8081 │ │ :8082 HTTP + :9001 WS │

│ 用户/角色/权限 │ │ 客户/商品/购物车 │ │ 会话/消息/坐席/分配 │

│ admin_system 库│ │ customer_service│ │ online_customer_service│

└────────────────┘ └────────┬────────┘ └───────────┬──────────┘

│ Feign │

└───────────────────────┘ SSO 身份核实

┌─────────────┬──────────────┬───────────────┐

▼ ▼ ▼

MySQL 5.7 Redis Nacos 3

(三库独立) (token/在线状态/ (注册发现/配置)

路由/限流)

技术栈

┌───────────┬───────────────────────────────────────────────────────────────────────────────────────────────────────┐

│ 层 │ 技术 │

├───────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────┤

│ 语言/框架 │ Java 21、Spring Boot 3.5、Spring Cloud Alibaba 2025 │

├───────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────┤

│ 微服务 │ Spring Cloud Gateway(WebFlux 反应式)、OpenFeign、Nacos(注册+配置) │

├───────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────┤

│ 实时通信 │ Netty 手写 WebSocket 服务(9001),30s 心跳、指数退避重连、SYSTEM 事件帧封装;消息发送 HTTP/WS 双通道 │

├───────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────┤

│ 持久层 │ MyBatis-Plus 3.5(Lambda 语法为主)、MySQL 5.7(每服务独立库) │

├───────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────┤

│ 缓存 │ Redis:客服 token(8h 滑动续期+顶号)、在线状态、技能组路由、限流、策略应急覆盖 │

├───────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────┤

│ 后台前端 │ Vue 3.5 + TS + Vite + Element Plus + Pinia,token 存 localStorage,路由表按权限码动态注册 │

├───────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────┤

│ 商城前端 │ Vue 3.5 + TS + Vite + Naive UI + Pinia,客户 token 走 httpOnly cookie(不落 localStorage) │

├───────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────┤

│ 工程规范 │ Lombok、SLF4J + @Slf4j、构造器注入、统一 Result<T> / BusinessException、DTO/VO/DO 分层 │

└───────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────┘

几个关键设计

  • 三库隔离 + 最小耦合:权限点 ocsWorkbench:* 在 admin 库(决定"谁能进工作台"),坐席/会话在 online 库(决定"怎么接待");admin 登录后用 adminToken 调 online SSO 换客服

token,online 再反向 Feign 核实

  • 会话分配可热切换:轮询 / 最少接待(默认)/ 技能组优先 / 指定客服,支持 Redis 应急覆盖,无需重启

  • 访客身份兜底:已登录商城客户打开气泡时,后端从 customer_token cookie 自动识别身份,JS 读不到 token

  • 消息可靠性:clientMsgId 唯一索引做发送幂等(防重复消息)、乐观消息气泡 + 失败重发、游标分页拉历史、已读回执

整体就是一个典型的「网关 + 三业务服务 + Netty 长连接 + 双前端嵌入」Spring Cloud 教学/演示架构。

● 基础设施中间件(本地实际运行版本,已实测确认)

┌────────┬────────────────────────┬──────┬─────────────────────────────────────────────────────────────────────────────────┐

│ 中间件 │ 版本 │ 端口 │ 在本项目的用途 │

├────────┼────────────────────────┼──────┼─────────────────────────────────────────────────────────────────────────────────┤

│ MySQL │ 5.7.43 │ 3306 │ 三个服务各独立一库(admin_system / customer_service / online_customer_service) │

├────────┼────────────────────────┼──────┼─────────────────────────────────────────────────────────────────────────────────┤

│ Redis │ 5.0.14.1(Windows 版) │ 6379 │ 客服/客户 token、坐席在线状态、技能组路由、限流、分配策略应急覆盖 │

├────────┼────────────────────────┼──────┼─────────────────────────────────────────────────────────────────────────────────┤

│ Nacos │ 3.0.3 │ 8848 │ 服务注册发现 + 配置中心 │

└────────┴────────────────────────┴──────┴─────────────────────────────────────────────────────────────────────────────────┘

▎ 注意:MySQL 是 5.7 而非计划文档里写的 8.0,所以写 SQL 时要兼容 5.7(如没有窗口函数、注意 ONLY_FULL_GROUP_BY)。

与之配套的框架/组件版本(Maven,pom 实际声明)

┌──────────────────────┬─────────────────────────────┬──────────────────────────────────────────────────────┐

│ 组件 │ 版本 │ 说明 │

├──────────────────────┼─────────────────────────────┼──────────────────────────────────────────────────────┤

│ JDK │ 21 │ │

├──────────────────────┼─────────────────────────────┼──────────────────────────────────────────────────────┤

│ Spring Boot │ 3.5.x │ 父 POM 管理 │

├──────────────────────┼─────────────────────────────┼──────────────────────────────────────────────────────┤

│ Spring Cloud │ 2025.0.3 │ Gateway + OpenFeign │

├──────────────────────┼─────────────────────────────┼──────────────────────────────────────────────────────┤

│ Spring Cloud Alibaba │ 2025.0.0.0 │ Nacos 注册/配置(Nacos Client 3.0.3) │

├──────────────────────┼─────────────────────────────┼──────────────────────────────────────────────────────┤

│ MyBatis-Plus │ 3.5.9 │ ORM(mybatis-plus-spring-boot3-starter) │

├──────────────────────┼─────────────────────────────┼──────────────────────────────────────────────────────┤

│ Netty │ 随 Spring Boot BOM(4.2.x) │ 9001 端口手写 WebSocket 服务 │

├──────────────────────┼─────────────────────────────┼──────────────────────────────────────────────────────┤

│ Hutool │ 5.8.32 │ 工具库 │

├──────────────────────┼─────────────────────────────┼──────────────────────────────────────────────────────┤

│ Lombok │ 1.18.30 │ │

├──────────────────────┼─────────────────────────────┼──────────────────────────────────────────────────────┤

│ 构建 │ Maven │ 多模块:common / gateway / admin / customer / online │

└──────────────────────┴─────────────────────────────┴──────────────────────────────────────────────────────┘

前端侧 Node 22.21.1、Vite + Vue 3.5,属于构建工具链而非运行中间件。整套依赖 Spring Boot BOM 对齐版本,没有手工锁冲突的三方包。

开源地址:stormeryang (youbangbang_stormeryang) - Gitee.com

相关推荐
ACP广源盛139246256737 小时前
Type-C 扩展坞方案选型笔记:DP1.4 转 HDMI2.0 桥接方案评估@ACP
笔记·硬件架构·hdmi·国产芯片·扩展坞
ss2739 小时前
AI时代首先数据库-PostgreSQL实战笔记 | 22 PostgreSQL实例与集群
数据库·笔记·postgresql
ss2739 小时前
AI时代首先数据库-PostgreSQL实战笔记 | 21 PostgreSQL进程与内存架构介绍
数据库·笔记·postgresql
摇滚侠12 小时前
《Java并发编程之美》第 4 章 Java 并发包中原子操作类原理剖析 阅读笔记 7
java·笔记·python
Rabitebla13 小时前
【系统性学习笔记】Linux 权限篇(二):文件属性、权限修改与目录权限的底层逻辑
linux·c++·笔记·学习·算法
深圳老胡13 小时前
STM32CubeMX 2 与 STM32CubeMX 的主要区别
笔记·stm32·单片机·代码规范
叼烟扛炮15 小时前
Linux 学习笔记(十三):高效排错利器——GDB 调试器入门
linux·笔记·学习
Source.Liu16 小时前
【A11】服务器数据库结构笔记
服务器·数据库·笔记
1314lay_100716 小时前
ABAP 读取服务器的文件 OPEN DATASET,READ DATASET f_filepath INTO l_file.
经验分享·笔记
MichaelJohn17 小时前
我用 Obsidian + Claude Code + GitHub 搭了个真正「会生长」的第二大脑
笔记