基于websocket vue 聊天demo 解决方案
基于websocket vue 聊天demo 解决方案
demo 背景 电商后台管理的客服
相关技术
- vuex
- axios
- vue
- websocket
聊天几种模型
一对一模型
一对一 消息只一个客户端发送 另一个客户端接收
场景 : 两个客户端之间的对话 私信

一对多模型
一对多 这种模型 一个客户端发送多个客户端接收
场景 : 系统通知推送 系统公告 广告推送 群聊

两种模型不一定是独立的 都是相互依存的 例如:当两个客户端之间进行聊天时那么属于一对一 如果其中一个客户端下线了那么这个客户端要发送一个一对多推送 告诉所有与这个客户端建立有连接的客户端 通知它们自己下线了
客服聊天的实现
客服聊天属于 客服人员 与顾客之间的一对一的聊天。
具体实现
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的方法
主要进行
- Websocket 实例化
- 监听websocket推送的消息
- 发送消息
- 发生错误 处理
另外根据需要 添加 未读消息操作 添加聊天记录等方法
核心:消息监听
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 {
/*滚动条整体样式*/
width: 8px; /*高宽分别对应横竖滚动条的尺寸*/
height: 1px;
}
.myScrollbar::-webkit-scrollbar-thumb {
/*滚动条里面小方块*/
border-radius: 10px;
background: transparent;
}
.myScrollbar::-webkit-scrollbar-track {
/*滚动条里面轨道*/
border-radius: 10px;
background: transparent;
}
基于websocket vue 聊天demo 解决方案的更多相关文章
- Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G
code&monkey Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...
- 基于WebSocket实现聊天室(Node)
基于WebSocket实现聊天室(Node) WebSocket是基于TCP的长连接通信协议,服务端可以主动向前端传递数据,相比比AJAX轮询服务器,WebSocket采用监听的方式,减轻了服务器压力 ...
- 第一节:.Net版基于WebSocket的聊天室样例
一. 说在前面的话 该篇文章为实时通讯系列的第一节,基于WebSocket编写了一个简易版聊天样例,主要作用是为引出后面SignalR系列的用法及其强大方便之处,通过这个样例与后续的SignalR对比 ...
- 基于websocket的netty demo
前面2文 基于http的netty demo 基于socket的netty demo 讲了netty在http和socket的使用,下面讲讲netty如何使用websocket websocket是h ...
- 【转】iOS基于WebSocket的聊天机制
原文网址:http://www.jianshu.com/p/21d9b3b94cfc WebSocket 的使得浏览器提供对 Socket 的支持成为可能,从而在浏览器和服务器之间提供了一个基于 TC ...
- 基于webSocket的聊天室
前言 不知大家在平时的需求中有没有遇到需要实时处理信息的情况,如站内信,订阅,聊天之类的.在这之前我们通常想到的方法一般都是采用轮训的方式每隔一定的时间向服务器发送请求从而获得最新的数据,但这样会浪费 ...
- 基于 WebSocket 的聊天和大文件上传(有进度提示)完美实现
大家好,好久没有写文章了,当然不是不想写,主要是工作太忙,公司有没有网络环境,不让上网,所以写的就少了.今天是2019年的最后一天,明天就要开始新的一年,当然也希望自己有一个新的开始.在2019年的最 ...
- [已解决][HTML5]基于WebSocket开发聊天室应用
WebSocket示例java的比较少,大部分是nodejs的,比较有名的是socket.io的chat, 借用下他的前端实现一套java的,后端基于https://github.com/genera ...
- 基于WebSocket和SpringBoot的群聊天室
引入 普通请求-响应方式:例如Servlet中HttpServletRequest和HttpServletResponse相互配合先接受请求.解析数据,再发出响应,处理完成后连接便断开了,没有数据的实 ...
随机推荐
- idea 2018.3.3版本激活到
新装的,还是试用版本,下面就是进行激活操作: 先下载 链接: https://pan.baidu.com/s/1o44bsO7tx3WGuO5GgT0ytw 提取码: gbmw 第一步:将bi ...
- SQLFlow使用中的注意事项--设置篇
SQLFlow 是用于追溯数据血缘关系的工具,它自诞生以来以帮助成千上万的工程师即用户解决了困扰许久的数据血缘梳理工作. 数据库中视图(View)的数据来自表(Table)或其他视图,视图中字段(Co ...
- 05.24 ICPC 2019-2020 North-Western Russia Regional Contest复现赛+Codeforces Round #645 (Div. 2)
A.Accurate Movement(复现赛) 题意:两个木块最左边都在0的位置,最右边分别为a,b(b>a),并且短的木条只能在长木条内移动,问两个木条需要移动多少次才能使两个木条的右端都在 ...
- nginx日志文件按天记录定时清理循环记录
问题 nginx日志默认记录在一个文件access.log中,时间长了会导致日志文件特别大,甚至磁盘占满. 解决方案 使用以下方法,将access.log文件每天一个,然后清过15天以前的文件. 方法 ...
- docker运行mysql数据库
1.搜索镜像源是否有mysql镜像 执行语句: sudo docker search mysql 2.拉取需要版本的mysql,执行语句: docker pull mysql:5.7 3.查看安装 ...
- 28.HashSet
4.HashSet集合 4.1HashSet集合概述和特点[应用] 底层数据结构是哈希表 不能保证存储和取出的顺序完全一致 不可以存储重复元素 没有索引,不能使用普通for循环遍历 4.2HashSe ...
- ES6新增数组的一些思考和使用
ES6数组的新增 伪数组转换为数组的两种方法 Array.from()把一个伪数组转换为一个真正的数组 伪数组:有下标和length,但是不能使用数组方法 let lis = document.que ...
- 常用加密算法学习总结之数字证书与TLS/SSL
数字证书 对于一个安全的通信,应该有以下特征: 完整性:消息在传输过程中未被篡改 身份验证:确认消息发送者的身份 不可否认:消息的发送者无法否认自己发送了信息 显然,数字签名和消息认证码是不符合要求的 ...
- [刷题] 257 Binary Tree Paths
要求 给定一棵二叉树,返回所有表示从根节点到叶子节点路径的字符串 示例 ["1->2->5","1->3"] 思路 递归地返回左右子树到叶子节 ...
- 将.netcore5.0(.net5)部署在Ubuntu的docker容器中
环境: 宿主机:winows 10 家庭版 虚拟机管理软件:Hyper-V 虚拟机系统:Ubuntu 20.10 Docker版本:Docker CE 20.10.2 ...