私聊、群聊、频道消息
这篇解决什么
三类消息落哪张表、发送和拉取走哪组接口。读完能对上 im_private_message / im_group_message / im_channel_message,以及用户只能发 normal=true 的类型。
默认端口 48080。先开模块见 IM 功能设计。实时推送见 IM WebSocket。
示意图:三张消息表分开。频道没有 C 端发送接口。
从哪改
| 名称 | 说明 | 仓库路径 |
|---|---|---|
| 私聊 | @RequestMapping("/im/message/private") | ruoyi-office/yudao-module-im/.../message/ImPrivateMessageController.java |
| 群聊 | /im/message/group | ImGroupMessageController |
| 频道拉取 | GET /im/channel/message/pull | ImChannelMessageController |
| 已读游标 | /im/conversation-read | ImConversationReadController |
| 运营审计 | /im/manager/message/* | manager/message/ |
用户页:views/im/home/pages/conversation/。运营页:views/im/manager/message/。
私聊:POST /send、GET /pull、PUT /read、DELETE /recall、GET /list。clientMessageId 做发送幂等。文本会先过敏感词。
群聊同样有 send / pull / read / recall。receiverUserIds 空=全员可见,有值=定向。未读靠 im_conversation_read,不靠消息行上的未读字段。
频道 C 端只有 GET /pull 和 PUT /read,没有 send。运营推素材。
ImConversationTypeEnum:1 私聊,2 群聊,3 频道。ImMessageStatusEnum:0 正常,2 已撤回(-1 仅客户端发送中)。回执 ImMessageReceiptStatusEnum:0 不需要,1 待完成,2 已完成。
用户可发类型:101 文本、102 图片、103 语音、104 视频、105 文件、107 合并、108 名片、115 表情。频道素材 125。撤回信号 2101。已读开关见 yudao.im.message:private-read-enabled / group-read-enabled 默认开;撤回窗口默认 5 分钟;pull 默认最近 30 天、单次最多 1000。
字段
| 名称 | 说明 | 仓库路径 |
|---|---|---|
clientMessageId | 客户端幂等键 | ImPrivateMessageDO / ImGroupMessageDO |
senderId / receiverId | 私聊两端 | ImPrivateMessageDO |
groupId | 群消息 | ImGroupMessageDO |
type / content | 类型 + JSON | 同上 |
status / receiptStatus | 撤回、回执 | 私聊;群聊也有回执列 |
maxReadMessageId | 会话已读位置 | ImConversationReadDO |
不是一张会话消息表
私聊、群聊、频道各一张。im_conversation_read 只存游标,不存正文。
信号类型不要当用户发送入口
READ / RECEIPT / 多数好友群事件 normal=false,不计入未读。前端发送框只允许 normal=true。
按本仓库 DO 生成的 ER。
配置与操作
用户页在 views/im/home/pages/conversation/。私聊 POST /im/message/private/send,群聊 POST /im/message/group/send,带 clientMessageId 做幂等。频道 C 端只有 GET /pull 和 PUT /read,没有 send。YAML yudao.im.message:private-read-enabled / group-read-enabled 默认开;撤回窗口默认 5 分钟;pull 默认最近 30 天、单次最多 1000。
发送后落对应三张消息表。未读靠 im_conversation_read 的 maxReadMessageId。用户可发 101 文本等到 115 表情;normal=false 的信号不要当前端发送入口。文本会先过敏感词。
