系统通知样式
系统通知是 content.type==="system" 的消息,渲染为居中的 .system-message > .system-text,不带头像与气泡。系统通知落在 conversationType=4、targetId=system 的系统会话;客户端用 getSystemMessages() 读取,审核拒绝产生的 message.blocked 也走同一形态。
概念
| 项 | 行为 |
|---|---|
| 消息结构 | {type:"system",text:"...",systemType?:"system_notification"|"broadcast"} |
| DOM | .message-item.system-message > .system-text(无头像/气泡/meta) |
| 读取 | RIM.getSystemMessages({limit,beforeSeq}) |
| 会话 | conversationType=4、targetId="system" |
| 审核联动 | message.blocked 系统通知(reject 后发送给发送者) |
| 管理端 | GET /api/admin/apps/{appkey}/messages?conversationType=4&targetId=system |
- 系统消息没有发送状态/已读人数语义,不显示
msg-meta。 - 系统通知仍会进入会话未读;
ChatView的自动已读逻辑按会话生效。 - 广播(
message.broadcast)与系统通知不同:前者不进入个人会话历史。
前置条件
- 已按 快速开始 完成
init与connect,页面能收发消息。 - 使用
@ni-paas/im-web/imkit(浏览器原生 ESM,无第三方依赖);自定义代码只调用 IMKit/IMLib 公开入口。 - 已引入默认样式:调用
ensureStyles(),或自行加载 IMKit 样式表。 - 自托管版无“UI 主题商店/付费皮肤”;所有自定义均为本地代码(不适用项)。
步骤
- 读取系统会话
连接后调用
client.getSystemMessages({limit:20}),把返回消息交给ChatView(conversationType=4,targetId="system")或MessageBubble渲染。 - 覆盖样式
针对
.system-message/.system-text设置字号、颜色、背景与圆角;不要依赖内联样式。 - 处理审核通知
收到
message.blocked后刷新系统会话或追加消息;提示用户消息已被屏蔽。 - 标记已读
进入系统会话后按普通会话逻辑清除未读;系统消息本身没有回执。
参数表
| API / 选择器 | 参数 | 说明 |
|---|---|---|
client.getSystemMessages(options) | {limit?:1-100,beforeSeq?} | 返回系统会话消息 |
ChatView | {conversationType:4,targetId:"system"} | 复用聊天视图渲染 |
MessageBubble | {message,isMine:false} | 单条渲染 |
| CSS | .system-message、.system-text | 样式覆盖点 |
示例
读取并渲染系统通知
JavaScript
import { ChatView, ensureStyles } from '@ni-paas/im-web/imkit';
ensureStyles();
const chat = new ChatView({
conversationType: 4,
targetId: 'system',
currentUserId: 'alice',
showReadCount: false,
autoReadReceipt: false, // 系统消息没有回执语义
});
chat.mount(document.getElementById('system-host'));
const result = await client.getSystemMessages({ limit: 20 });
if (result.code === 0) {
chat.setMessages(result.data.slice().reverse()); // 接口倒序,视图按时间正序
}
// 实时到达:把新系统消息追加到视图
client.addEventListener('messages', (payload) => {
const list = payload && payload.messages ? payload.messages : [];
for (const message of list) {
if (message.conversationType === 4 && message.targetId === 'system') {
chat.appendMessage(message);
}
}
});系统通知样式覆盖
JavaScript
.system-message {
display: flex;
justify-content: center;
padding: 10px 16px;
}
.system-message .system-text {
max-width: 82%;
padding: 6px 12px;
border-radius: 999px;
font-size: 12px;
line-height: 1.6;
color: var(--imkit-text-secondary);
background: color-mix(in srgb, var(--imkit-text) 8%, transparent);
text-align: center;
}
/* 审核拒绝通知可用文案前缀区分(message.blocked) */
.system-message .system-text[data-kind="blocked"] {
color: var(--imkit-danger);
}常见问题
系统通知能带头像/气泡吗?
内置渲染固定为居中文本;需要卡片形态请改用 custom 消息自行渲染。
getSystemMessages 返回顺序?
接口按时间倒序返回;渲染前一般需要 reverse() 成正序。
系统会话未读怎么清?
与普通会话一致:进入会话后调用清除未读/发送已读逻辑;系统消息本身没有已读回执。
如何区分审核拒绝通知?
服务端发送的是 message.blocked 系统通知;可按文本或 content.systemType 判断,必要时在业务层加标记。