• 基于websocket vue 聊天demo 解决方案


    基于websocket vue 聊天demo 解决方案

    demo 背景 电商后台管理的客服

    相关技术

    • vuex
    • axios
    • vue
    • websocket

    聊天几种模型

    1. 一对一模型

      一对一 消息只一个客户端发送 另一个客户端接收

    场景 : 两个客户端之间的对话 私信

    1. 一对多模型

      一对多 这种模型 一个客户端发送多个客户端接收

      场景 : 系统通知推送 系统公告 广告推送 群聊

    两种模型不一定是独立的 都是相互依存的 例如:当两个客户端之间进行聊天时那么属于一对一 如果其中一个客户端下线了那么这个客户端要发送一个一对多推送 告诉所有与这个客户端建立有连接的客户端 通知它们自己下线了

    客服聊天的实现

    客服聊天属于 客服人员 与顾客之间的一对一的聊天

    具体实现

    state: {
        //websocket实例
        socket: null,
        // 客户信息
        cusInfoList: [
        ],
    
        //当前对话客户聊天记录
        messageLog: [
    
        ],
        //当前对话客户id
        currCusId:'',
    
      },
    

    socket 用于创建websocket实例的存储 保证全局只有唯一的一个会话客户端

    cusInfoList 存储聊天对话列表 一般在服务端都有存储 可以主动请求服务端获取聊天列表

    messageLog 存储正在对话的客服与客户的聊天记录 当切换对话客户时更换聊天记录

    currCusId 正在对话的客户唯一标识符

    cusInfoList 中可以存储 用户头像 昵称 用户在线状态 待读消息数 最后一条消息 .......用于展示

      mutations: {
        //添加聊天记录
        messageLogChange(state, messages) {
       
        },
    
    
        //删除客户
        cusInfoListDel() {
        },
        //创建websocket实例
        init: function (state) {
    
          if (typeof WebSocket === "undefined") {
            alert("您的浏览器不支持socket");
          } else {
            // 实例化socket
            state.socket = new WebSocket('ws://192.168.31.199:8888/chat');
            // 监听socket连接
            state.socket.onopen = function () {
              console.log("socket连接成功")
            }
            // 监听socket错误信息
            state.socket.onerror = function () {
              console.log("连接错误")
            }
            // 监听socket消息
            state.socket.onmessage = function (msg) {
    
            }
            state.socket.onclose = function () {
              console.log("socket已经关闭")
            }
          }
        },
        //发送消息
        send: function (state, msg) {
          state.socket.send(JSON.stringify(msg))
        },
    
        //清空未读消息
        clearUnread(state , uid){
       
        }
    
      },
    

    mutations 中的方法都为操作state的方法

    主要进行

    1. Websocket 实例化
    2. 监听websocket推送的消息
    3. 发送消息
    4. 发生错误 处理

    另外根据需要 添加 未读消息操作 添加聊天记录等方法

    核心:消息监听

    state.socket.onmessage = function (msg) {}
    

    此方法用于监听收到的消息 可以是 二进制格式也可以是串格式 但不管那种格式 消息中一定会携带发送者信息和接收者信息 收到消息后 要判断几个方面

    每次切换聊天对象都要 注意 消息记录存储 未读消息清空

      actions: {
        getMessageLog(context, args) {
          context.commit('clearUnread', args.split(",")[0])
          Axios.get('http://192.168.31.199:8888/common/chat/messageRecord', {
              params: {
              
              }
            })
            .then(function (response) {
              context.commit('messageLogChange', response.data.data)
            })
            .catch(function (error) {
              console.log(error);
            });
        }
      },
    

    actions 发异步请求 例如获取客户信息 每次切换时获取聊天记录 等

    问题 1

    <div ref="myScrollbar">
      .......
    </div>
    

    点击消息发送后 滚动面板不会置底 vue 版本3.0(其他版本可能不同)

       //聊天置底
        scrollDown() {
          this.$refs.myScrollbar.scrollTop = this.$refs.myScrollbar.scrollHeight;
        },
    

    一定要在updated中调用

    updated() {
        this.scrollDown();
      },
    

    问题 2

    滚动态样式修改

    .myScrollbar::-webkit-scrollbar {
      /*滚动条整体样式*/
    
       8px; /*高宽分别对应横竖滚动条的尺寸*/
    
      height: 1px;
    }
    
    .myScrollbar::-webkit-scrollbar-thumb {
      /*滚动条里面小方块*/
    
      border-radius: 10px;
    
      background: transparent;
    }
    
    .myScrollbar::-webkit-scrollbar-track {
      /*滚动条里面轨道*/
    
      border-radius: 10px;
    
      background: transparent;
    }
    
  • 相关阅读:
    洛谷P4979 矿洞:坍塌
    [SHOI2015]脑洞治疗仪
    洛谷P2135 方块消除
    洛谷P1436 棋盘分割
    洛谷P2796 Facer的程序
    浅谈位运算
    [SDOI2006]最短距离
    12耐心_预测未来
    11耐心_有效市场假说
    02C++条件变量
  • 原文地址:https://www.cnblogs.com/huangshen/p/14501970.html
Copyright © 2020-2023  润新知