在线客服
这篇解决什么
会员和管理员会话落哪两张表、新消息怎么推。读完能对上 promotion_kefu_conversation 和 WebSocket 帧类型,不要去找独立客服微服务。
默认端口 48080。开启见 商城功能设计。会员账号见 会员功能设计。
示意图:HTTP 落库。推送走框架通道 /infra/ws,不是客服自己开端口。
从哪改
客服也在营销子模块。
| 名称 | 说明 | 仓库路径 |
|---|---|---|
| 会话 | @RequestMapping("/promotion/kefu-conversation") | ruoyi-office/yudao-module-mall/yudao-module-promotion-server/.../controller/admin/kefu/KeFuConversationController.java |
| 消息 | /promotion/kefu-message | KeFuMessageController |
| 会员发消息 | App 同路径 | controller/app/kefu/AppKeFuMessageController.java |
| 会话表 | promotion_kefu_conversation | KeFuConversationDO |
| 消息表 | promotion_kefu_message | KeFuMessageDO |
| PC 工作台 | WebSocket + Pinia | ruoyi-office-vben/apps/web-antd/src/views/mall/promotion/kefu/ |
| App 客服 | 管理员搬家 | ruoyi-office-uniapp/src/pages-mall/kefu/ |
官方菜单:客服中心 2797(mall/promotion/kefu/index),mobile_path 是 /pages-mall/kefu/index。权限字 promotion:kefu-message:send、promotion:kefu-conversation:*。
一个会员对应一条会话,getOrCreateConversation(senderId) 按 userId 建。删除是软删:userDeleted / adminDeleted。
字段
KeFuMessageContentTypeEnum:1 文本,2 图片,3 语音,4 视频,5 系统,10 商品,11 订单。
| 名称 | 说明 | 仓库路径 |
|---|---|---|
userId | 会员 | KeFuConversationDO |
adminUnreadMessageCount | 管理员未读 | 同上 |
adminPinned | 置顶 | 同上 |
senderType / receiverType | UserTypeEnum:会员 1,管理员 2 | KeFuMessageDO |
contentType / content | 类型 + 正文 | 同上 |
readStatus | 已读 | 同上 |
商品、订单消息没有 spuId / orderId 列。contentType 为 10 / 11 时,content 是 JSON 字符串,前端自己解析后跳转。
新消息 type:kefu_message_type。已读回执:kefu_message_read_status_change。历史列表仍走 GET /promotion/kefu-message/list。
通道在 infra
推送用 WebSocketSenderApi,连接 /infra/ws?token=...。客服页断线先查框架 WebSocket 和登录 Token,不要在 promotion 里加第二套长连接。
管理端才能接会话
PC 和 pages-mall/kefu 都是系统用户 + /admin-api。会员发消息走 App Controller。角色没勾客服中心时,工作台进不去。
按本仓库 DO 生成的 ER。会话对会员一对一。
配置与操作
走 商城系统 → 客服中心(2797,/mall/kefu)。一个会员一条会话,getOrCreateConversation 按 userId 建。管理员发消息要权限 promotion:kefu-message:send。
推送走框架 WebSocket /infra/ws?token=。商品 / 订单卡片的 content 是 JSON,没有独立 spuId 列。PC 和 pages-mall/kefu 都是系统用户。开启见 商城功能设计。

本系统截图:客服工作台。
