H5/APP客服端源码/uniapp在线客服系统源码开源了,全源码代码解读及发行安装教程...

news2024/11/17 10:54:39

前言

目前,即时通讯在线咨询在网站、APP、小程序中已经是不可获取的功能,尤其是专注于线上营销的商家,迫切需要一套可以随时与访客交流的即时通讯工具。

如果使用市面上的SaaS客服系统,会在功能上受限制,需要开通高级VIP,才能更好的使用,所以这些商家迫切需要可以私有化独立部署的客服系统,来满足自己的运营要求。

为了能够随时随地与访客进行沟通,客服需要能在手机端及时收到消息,随时回复消息,所以可以参考我的客服系统uniapp客服端进行开发(尾部附带客服端uniapp源码下载地址)

开发准备

首先,开发者需要具备一定的前端基础,才能立即代码逻辑结构,最好是了解现代化前端框架工具的使用

开发语言及工具

HBuilderX  uniapp框架  Vue.js

项目效果

  1. 客服访问H5页面或者下载APP后,进入登录页,在登录页需要输入服务端地址、用户名、密码
  2. 需要输入服务端地址的原因是,当客服系统是私有化部署在其他服务器上时,也可以直接对接,不需要修改源码中的接口地址
  3. 验证成功后,进入在线访客列表页,这里只是列出所有正在聊天的访客

  1. 也可以点击底部的tab标签,查看所有访客列表,这里是所有历史访客,能按名称、标签搜索查询访客
  2. 点击其中一个访客,进入访客聊天详情页面,在这个页面里可以看到聊天记录,发送消息给访客
  3. 客服可以发送文本、图片、表情、附件等,也可以发起语音、视频通话请求

代码目录结构

 这是一个uniapp项目,和vue.js项目的结构也基本一致

 即时通讯功能开发

项目的即时通讯功能,是基于WebSocket来实现的,不管是访客上下线,还是访客发送消息,都会通过webSocket发送到客服端。

客服端需要做的就是连接WebSocket,并且对接收到的消息根据类型进行不同的处理。

下面是聊天详情页对WebSocket部分进行处理的代码

里面对收到消息、上下线、消息预知、消息已读、语言视频请求等都进行了处理

                uni.onSocketMessage((res) => {
                //uni.$on('message',(res) => {
                    var redata = JSON.parse(res.data);
                    switch (redata.type) {
                        case "message":
                            _this.recvMessage(redata.data);
                            break;
                        case "inputing":
                            if (redata.data.from != _this.visitor_id) {
                                return;
                            }
                            if (redata.data.content != "") {
                                _this.inputingAction="正在输入:"+redata.data.content
                            }else{
                                _this.inputingAction="";
                            }
                            uni.setNavigationBarTitle({
                                title: "[在线]:" + _this.visitor_name
                            });

                            break;
                        case "read":
                            if (redata.data.visitor_id == _this.visitor_id) {
                                for(var i=0;i<this.messages.length;i++){
                                    this.$set(this.messages[i],'read_status',"已读");
                                }
                            }
                            break;
                        case "userOffline":
                            _this.showNoticeBar(redata.data.name + "离线");
                            if (redata.data.visitor_id != _this.visitor_id) {
                                return;
                            }
                            uni.setNavigationBarTitle({
                                title: "[离线]:" + _this.visitor_name
                            });
                            break;
                        case "userOnline":
                            toolsHelper.playVoice();
                            _this.showNoticeBar(redata.data.username + "来了");
                            if (redata.data.visitor_id != _this.visitor_id) {
                                return;
                            }
                            uni.setNavigationBarTitle({
                                title: "[在线]:" + _this.visitor_name
                            });
                            break;
                        case "callCancel":
                            _this.callClear();
                            break;
                        case "callpeer":
                                if(_this.peerjs.visitorId){
                                    uni.request({
                                        url: _this.baseUrl + '/kefu/callVisitor?token='+_this.token,
                                        method: 'POST',
                                        data: {
                                            peer_id:"222",
                                            visitor_id:redata.data.visitor_id,
                                            action:"refuse"
                                        }
                                    });
                                    return;
                                }
                                //通话请求
                                uni.showModal({
                                    title: '提示',
                                    content: redata.data.name+'请求通话?',
                                    cancelText: "拒绝", // 取消按钮的文字  
                                    confirmText: "接通", // 确认按钮的文字  
                                    showCancel: true, // 是否显示取消按钮,默认为 true
                                    confirmColor: '#39B54A',
                                    cancelColor: '#f55850',
                                    success: (res) => {
                                        if(res.confirm) {  
                                            console.log('comfirm') //点击确定之后执行的代码
                                            _this.initPeerjs(redata.data.visitor_id);
                                        } else {  
                                            uni.request({
                                                url: _this.baseUrl + '/kefu/callVisitor?token='+_this.token,
                                                method: 'POST',
                                                data: {
                                                    peer_id:"222",
                                                    visitor_id:redata.data.visitor_id,
                                                    action:"refuse"
                                                }
                                            });
                                        } 
                                    }
                                })
                            break;
                    }
                });

打包生成APP或H5

通过uniapp官网,我们可以直接云打包成原生APP

也可以只打包成H5,发布到自己服务目录下,就可以直接访问

结语

这里只展示了客服系统即时通讯部分功能的实现,除此之外还有很多功能没有展示,如果想看更多代码和效果,可以下载代码查看演示。

源码下载

https://gitee.com/taoshihan/go-fly-uni

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/349220.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AWS Control Tower

Hello大家好&#xff0c;在本课时我们将讨论AWS Control Tower。 **AWS Control Tower是AWS organizations的一个功能延伸&#xff0c;**它是设置在organizations的上层&#xff0c;并为您提供一些额外的控制。 通过Control Tower可以创建一个Landing zone&#xff0c;Landing…

linux安装jenkins

1. 官网寻找安装方式 进入到jenkins官网&#xff0c;找到对应的下载页面&#xff1a;https://www.jenkins.io/download/ 根据自己系统还有想要使用的版本&#xff0c;进行选择即可。这里我们使用CentOS作为示例&#xff0c;版本选择长期支持版&#xff08;LTS&#xff09; 2.…

DaVinci:色彩扭曲器

调色页面&#xff1a;色彩扭曲器 Color&#xff1a;Color Warper色彩扭曲器 Color Warper是一个非常强大的调色工具&#xff0c;它基于网格的形式&#xff0c;能将控制点从一个位置“扭曲”到另一位置&#xff0c;从而可同时调整两个颜色属性&#xff1a;“色相 - 饱和度”&…

最简单的物体识别例子

第一步下载百度EASYDL工具。 网址EasyDL 图像 然后下载本地训练工具包&#xff1a; 本地下载&#xff0c;运行。 首先创建数据集&#xff0c; 完成&#xff0c;创建目标任务。 选择物体检测创建任务 选择训练&#xff0c;将数据集引入 通用型小型设备SDK 选择这个可以本地直…

Lesson 7.2 Mini Batch K-Means与DBSCAN密度聚类

文章目录一、Mini Batch K-Means 算法原理与实现二、DBSCAN 密度聚类基本原理与实践1. K-Means 聚类算法的算法特性2. DBSCAN 密度聚类基本原理3. DBSCAN 密度聚类的 sklearn 实现除了 K-Means 快速聚类意外&#xff0c;还有两种常用的聚类算法。&#xff08;1&#xff09; 是能…

在国内优雅地使用Rancher部署k8s集群

Background 作为一款开源的企业级Kubernetes管理平台&#xff0c;Rancher进入中国已经5年了&#xff0c;在国内使用会有从Github上下载资源慢、拉镜像十分耗时、无法使用library和system-library等问题。通过配置也是可以解决的&#xff0c;即使用阿里云镜像仓库搭建Rancher。记…

2022浙江省“信息安全管理与评估“--应急响应日志分析解析(高职组)

2022浙江省“信息安全管理与评估”&#xff08;高职组&#xff09;任务书2022浙江省“信息安全管理与评估”任务书第一阶段竞赛项目试题第二阶段竞赛项目试题任务1&#xff1a;应急响应第三阶段竞赛项目试题2022浙江省“信息安全管理与评估”任务书 第一阶段竞赛项目试题 先略…

21岁,华科博士在读,我的赛事Top经验

Datawhale干货 作者&#xff1a;vaew&#xff0c;华中科技大学&#xff0c;博士二年级在读简介笔者vaew&#xff0c;21岁&#xff0c;现为华中科技大学机械科学与工程学院陶波教授课题组博士二年级学生。主要研究方向是基于视触融合的机器人灵巧操作。学业之余的研究兴趣包括图…

ChatGPT怎么样?

一、先说几个注意的地方1、chat.openai.com发现是中国网络的用户也会访问不了&#xff0c;或提示你此网站在此国家访问不了。2、短信接码平台要先充值&#xff0c;才能加购物车。3、印度、马来西亚、印尼的号不行可以换美国的很快就能收到&#xff08;找个便宜的&#xff09;。…

刷题25-重排链表

重排链表 解题思路&#xff1a;通过观察链表可以发现&#xff0c;把链表一分为二&#xff0c;后半段链表反转&#xff0c;然后两个链表穿插连接&#xff0c;当链表的节点总数是奇数时&#xff0c;要保证链表的前半段比后半段多一个节点。 关于把链表一分为二&#xff0c;可以…

CSS中的BFC详细讲解(易懂)

带你用最简单的方式理解最全面的BFC~~~1.先了解最常见定位方案普通流元素按照其在 HTML 中的先后位置至上而下布局行内元素水平排列&#xff0c;直到当行被占满然后换行&#xff0c;块级元素则会被渲染为完整的一个新行所有元素默认都是普通流定位浮动元素首先按照普通流的位置…

通过中断控制KUKA机器人暂停与再启动的具体方法示例

通过中断控制KUKA机器人暂停与再启动的具体方法示例 中断程序的基本介绍:  当出现例如输入信号变化等事先定义的事件时,机器人控制器中断当前程序,并处理一个已定义好的子程序  由中断而调用的子程序称为中断程序  最多允许同时声明32个中断  同一时间最多允许有16个…

Linux网络技术学习(六)—— 网络设备初始化(II)

文章目录初始化选项模块选项设备处理层初始化&#xff1a;net_dev_init用户空间辅助程序kmod解析热插拔虚拟设备虚拟设备范例通过/proc文件系统调整初始化选项 内核内建的组件以及模块加载的组件都能输入参数&#xff0c;使用户调整组件所实现的功能、重写默认值等 模块选项&…

Java微服务安全丨雪崩问题及解决方案

1.1.雪崩问题及解决方案 1.1.1.雪崩问题 微服务中&#xff0c;服务间调用关系错综复杂&#xff0c;一个微服务往往依赖于多个其它微服务。 如图&#xff0c;如果服务提供者I发生了故障&#xff0c;当前的应用的部分业务因为依赖于服务I&#xff0c;因此也会被阻塞。此时&…

微信小程序 之 原生开发

目录 一、前期预备 1. 预备知识 ​2. 注册账号 - 申请AppID 3. 下载小程序开发工具 4. 小程序项目结构 ​5. 小程序的MVVM架构 二、创建小程序项目 1. 查看注册的appId ​2. 创建项目 ​3. 新建页面 01 - 创建text页面文件夹 ​02 - 新建text的page ​03 - 在app.json中配置 ​…

从未想过制作数据可视化展示竟可以如此简单

还在跟着网络上一节课好几个小时的付费课程学习如何制作数据可视化大屏嘛&#xff1f;还在为不知道怎么设计数据展示排版而苦恼&#xff1f;今天教大家用最简单的方式制作一个数据可视化大屏&#xff0c;首先让我们看一下参考大屏样式&#xff1a;接下来我们将制作数据可视化大…

【Kubernetes】【九】Label,Deployment,Service

Label Label是kubernetes系统中的一个重要概念。它的作用就是在资源上添加标识&#xff0c;用来对它们进行区分和选择。 Label的特点&#xff1a; 一个Label会以key/value键值对的形式附加到各种对象上&#xff0c;如Node、Pod、Service等等一个资源对象可以定义任意数量的L…

Python正则表达式中group与groups的用法详解

本文主要介绍了Python正则表达式中group与groups的用法详解&#xff0c;文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值&#xff0c;需要的朋友们下面随着小编来一起学习学习吧目录在Python中&#xff0c;正则表达式的group和groups方…

阿里一面:你做过哪些代码优化?来一个人人可以用的极品案例

前言 在尼恩读者50交流群中&#xff0c;尼恩经常指导小伙伴改简历。 改简历所涉及的一个要点是&#xff1a; 在 XXX 项目中&#xff0c;完成了 XXX 模块的代码优化 另外&#xff0c;在面试的过程中&#xff0c;面试官也常常喜欢针对提问&#xff0c;来考察候选人对代码质量的追…

06 OpenCV 阈值处理、自适应处理与ostu方法

1 基本概念 CV2中使用阈值的作用是将灰度图像二值化&#xff0c;即将灰度图像的像素值根据一个设定的阈值分成黑白两部分。阈值处理可以用于图像分割、去除噪声、增强图像对比度等多个领域。例如&#xff0c;在物体检测和跟踪中&#xff0c;可以通过对图像进行阈值处理来提取目…