You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Stream Chat技术咨询:如何实现消息定向可见(仅客服/仅客户)?

实现分角色可见的消息系统(仅支持团队/仅客户可见)

核心思路

给每条消息添加可见范围标识,后端存储时保留该标识,前端根据当前用户角色过滤显示内容;同时通过后端控制消息的推送范围,确保不同角色只收到自己权限内的消息。


后端实现

1. 定义消息数据模型

在数据库中为消息增加visibility字段,用于标记可见范围:

// Mongoose 模型示例(Node.js)
const messageSchema = new mongoose.Schema({
  content: { type: String, required: true },
  senderRole: { type: String, enum: ['support', 'customer', 'backend'], required: true },
  // 可见范围枚举:仅支持团队、仅客户、全部可见
  visibility: { type: String, enum: ['support_only', 'customer_only', 'all'], default: 'all' },
  conversationId: { type: mongoose.Schema.Types.ObjectId, ref: 'Conversation', required: true }
});

const Message = mongoose.model('Message', messageSchema);

2. 发送仅支持团队可见的消息

当支持团队发送内部备注,或后端触发内部消息时,设置visibility: 'support_only':

// 接口示例:支持团队发送内部消息
app.post('/messages/internal-support', async (req, res) => {
  // 先校验当前用户是否为支持团队角色(省略权限校验逻辑)
  const { content, conversationId } = req.body;
  
  const message = new Message({
    content,
    senderRole: 'support',
    visibility: 'support_only',
    conversationId
  });
  
  await message.save();
  
  // 通过 WebSocket 仅推送给该会话内的支持团队成员
  io.to(`support-convo-${conversationId}`).emit('new-message', message);
  
  res.status(201).json(message);
});

3. 发送仅客户可见的消息

后端直接触发时,设置visibility: 'customer_only',并仅推送给对应客户:

// 后端主动发送仅客户可见消息的函数
async function sendCustomerNotification(conversationId, content) {
  const message = new Message({
    content,
    senderRole: 'backend',
    visibility: 'customer_only',
    conversationId
  });
  
  await message.save();
  
  // 通过 WebSocket 仅推送给该会话的客户
  io.to(`customer-convo-${conversationId}`).emit('new-message', message);
  
  return message;
}

前端渲染逻辑

根据当前用户角色,过滤掉无权限查看的消息:

// React 消息列表组件示例
function MessageList({ messages, currentUserRole }) {
  const visibleMessages = messages.filter(msg => {
    if (currentUserRole === 'support') {
      // 支持团队看不到仅客户可见的消息
      return msg.visibility !== 'customer_only';
    } else if (currentUserRole === 'customer') {
      // 客户看不到仅支持团队可见的消息
      return msg.visibility !== 'support_only';
    }
    // 管理员等角色可查看全部消息
    return true;
  });

  return (
    <div className="message-list">
      {visibleMessages.map(msg => (
        <div key={msg._id} className={`message-bubble ${msg.senderRole}`}>
          {msg.content}
          {/* 给支持团队的内部消息添加可视化标记 */}
          {msg.visibility === 'support_only' && (
            <span className="internal-tag">内部备注</span>
          )}
        </div>
      ))}
    </div>
  );
}

关键注意事项

  • 权限校验:后端必须严格校验发送请求的用户角色,禁止客户通过接口发送support_only类型的消息;
  • 数据过滤:除了前端过滤,后端查询消息列表时也应根据用户角色过滤,避免敏感数据泄露;
  • 推送控制:WebSocket 推送时要精准发送到对应角色的会话频道,避免消息错发给无权限用户。

内容的提问来源于stack exchange,提问作者Leonardo Waterkemper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 07:10:33