【频道】频道、频道素材
频道是运营向用户单向推送图文内容的能力,形态类似「公众号」:运营建好频道、维护图文素材,再把素材推送给订阅用户,用户在频道会话里看到图文卡片。频道模块由 yudao-module-im 后端模块的 channel 包实现,运营侧前端在 @/views/im/manager/channel 目录。
本文涉及频道表 im_channel、频道素材表 im_channel_material、频道消息表 im_channel_message 三张表:一个频道(im_channel)下有多条素材(im_channel_material);运营推送某条素材时,生成一条频道消息(im_channel_message)发给订阅者。
- 频道:公众号 / 频道本身,含名称、头像、业务码、启停状态。
- 频道素材:频道下的图文内容,支持站内富文本与外链两类。
- 频道消息:一次推送的记录,用户侧在频道会话里看到的就是它。
频道是「运营主导」的模块:建频道、建素材、推送都在运营后台完成;用户侧只是订阅与查看。因此本篇以运营侧为主线。
# 1. 频道
频道,由 ImChannelManagerController 提供接口(/im/manager/channel)。
# 1.1 表结构
省略 creator/create_time/updater/update_time/deleted/tenant_id 等通用字段
CREATE TABLE `im_channel` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`code` varchar(64) NOT NULL COMMENT '频道业务码;唯一',
`name` varchar(64) NOT NULL COMMENT '频道名称',
`avatar` varchar(512) DEFAULT NULL COMMENT '频道头像',
`sort` int NOT NULL DEFAULT '0' COMMENT '排序',
`status` tinyint NOT NULL DEFAULT '0' COMMENT '状态(0=启用,1=停用)',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='IM 频道表';
① code 频道业务码,全局唯一,是频道的稳定标识;name、avatar 是展示信息。
② status 启停状态(枚举 CommonStatusEnum),停用的频道不出现在选择列表(getSimpleChannelList 只返回启用频道)。
# 1.2 运营后台
对应 [IM 即时通讯 -> 频道管理 -> 频道列表] 菜单,对应 @/views/im/manager/channel 目录。支持新增 / 修改 / 删除频道(createChannel / updateChannel / deleteChannel)与分页查询。

# 2. 频道素材
频道素材,由 ImChannelMaterialManagerController 提供接口(/im/manager/channel-material);用户侧查看详情由 ImChannelMaterialController 提供(/im/channel/material)。
# 2.1 表结构
CREATE TABLE `im_channel_material` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`channel_id` bigint NOT NULL COMMENT '频道编号',
`type` tinyint NOT NULL COMMENT '内容类型(1=站内富文本,2=外链)',
`title` varchar(128) NOT NULL COMMENT '标题',
`cover_url` varchar(512) DEFAULT NULL COMMENT '封面图',
`summary` varchar(255) DEFAULT NULL COMMENT '摘要',
`content` mediumtext COMMENT '正文;富文本 HTML',
`url` varchar(512) DEFAULT NULL COMMENT '跳转链接',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='IM 频道素材表';
① channel_id 关联所属频道。
② type 内容类型(枚举 ImChannelMaterialTypeEnum:1=站内富文本,2=外链),决定点击图文卡片后的行为:
| 值 | 类型 | 点击行为 |
|---|---|---|
| 1 | 站内富文本 | url 为空,客户端按素材 id 拉 content 富文本正文,在内置详情页渲染 |
| 2 | 外链 | url 非空,直接跳转到该链接 |
③ title / cover_url / summary 是图文卡片的展示信息;content 富文本正文(仅站内类型用)。
# 2.2 运营后台
对应 [IM 即时通讯 -> 频道管理 -> 频道素材] 菜单。支持新增 / 修改 / 删除素材;编辑表单按 type 切换:站内富文本填正文编辑器,外链填跳转地址。

# 3. 频道消息(推送)
频道消息,运营侧推送由 ImChannelMessageManagerController 提供接口(/im/manager/channel-message);用户侧拉取 / 已读由 ImChannelMessageController 提供(/im/channel/message)。
# 3.1 表结构
CREATE TABLE `im_channel_message` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`channel_id` bigint NOT NULL COMMENT '频道编号(冗余便于检索)',
`material_id` bigint NOT NULL COMMENT '关联素材编号',
`type` smallint NOT NULL COMMENT '消息类型(125=素材)',
`content` varchar(8192) DEFAULT NULL COMMENT '消息内容;推送 payload JSON 快照',
`receiver_user_ids` varchar(1024) DEFAULT NULL COMMENT '接收人编号列表,逗号分隔;为空表示全员',
`send_time` datetime NOT NULL COMMENT '发送时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='IM 频道消息表';
① channel_id / material_id 关联频道与素材。content 是推送时的图文卡片快照(标题 / 封面 / 摘要 / 链接),富文本正文不在此存(仍在 im_channel_material.content)。
② receiver_user_ids 接收人范围,为空表示全员推送。
// TODO @AI:缺一个立即推送的截图;
# 3.2 推送流程
运营在「频道消息」选好频道与素材后点「推送」,调用 ImChannelMessageServiceImpl 的 sendMessage 方法:
- 落库:按素材生成一条
im_channel_message(type=125 素材),写入卡片快照。 - 推送:通过 WebSocket 把图文卡片推给接收用户(详见 《WebSocket 实时推送与离线消息》)。
- 拉取 / 已读:用户在线即时收到;离线时下次通过
pull按minId游标增量补齐,进入会话时readChannelMessages上报已读位点。
// TODO @AI:图片无法展示(晚点我跟你说修复了,你在重新截图)

# 4. 用户侧
用户侧没有独立的频道管理菜单,订阅的频道以会话形式出现在聊天工作台。频道会话里,每条推送渲染为图文卡片(MaterialBubble.vue):点击站内素材在内置详情页看富文本正文,点击外链素材跳转链接。素材卡片也能被转发到私聊 / 群聊(详见 《消息》 的素材类型)。
// TODO @AI:图片无法展示(晚点我跟你说修复了,你在重新截图)
