html5客服系统源码(html可视化布局系统源码)

h5效果图 h5页面聊天 vue效果图 vue页面聊天 功能实现 springboot+webSocket实现官方地址https://docs.spring.io/spring-framework/docs/5.0.8.RELEASE/spring-framework-reference/web.html#websocket maven配置文件 <dependencies> <d…

h5效果图

spring boot vue实现H5聊天室客服功能

h5页面聊天

vue效果图

spring boot vue实现H5聊天室客服功能

vue页面聊天

功能完成

  • spring boot webSocket 实现
  • 官方网详细地址 https://docs.spring.io/spring-framework/docs/5.0.8.RELEASE/spring-framework-reference/web.html#websocket

maven 环境变量

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.78</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

webSocket 配备

package com.example.webchat.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
import org.springframework.web.socket.server.standard.ServletServerContainerFactoryBean;

/**
 * @author Mr.Fang
 * @title: WebSocketConfig
 * @Description: web socket 配备
 * @date 2021/11/14 13:12
 */
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(myHandler(), \"myHandler/\") // 浏览途径
                .addInterceptors(new WebSocketHandlerInterceptor())  // 配备回调函数
                .setAllowedOrigins(\"*\"); // 跨域请求
    }
    @Bean
    public ServletServerContainerFactoryBean createWebSocketContainer() {
        ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean();
        container.setMaxTextMessageBufferSize(8192);  // 例如信息缓冲区域尺寸、空余请求超时等
        container.setMaxBinaryMessageBufferSize(8192);
        return container;
    }
    @Bean
    public WebSocketHandler myHandler() {
        return new MyHandler();
    }

}

信息解决类

package com.example.webchat.config;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.example.webchat.pojo.DataVo;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.AbstractWebSocketHandler;

import java.io.IOException;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @author Mr.Fang
 * @title: MyHandler
 * @Description: 信息解决类
 * @date 2021/11/14 13:12
 */
public class MyHandler extends AbstractWebSocketHandler {
    private static int onlineCount = 0;
    //    线程安全
    private static Map<String, WebSocketSession> userMap = new ConcurrentHashMap<>(); // 客户
    private static Map<String, WebSocketSession> adminMap = new ConcurrentHashMap<>(); // 客服

    /**
     * @Description: 联接取得成功以后
     * @param session
     * @return void
     * @Author Mr.Fang
     * @date 2021/11/14 13:15
     */
    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws IOException {
        addOnlineCount(); // 现阶段客户加 1
        System.out.println(session.getId());
        Map<String, Object> map = session.getAttributes();
        Object token = map.get(\"token\");
        Object admin = map.get(\"admin\");
        DataVo dataVo = new DataVo();
        dataVo.setCode(9001).setMsg(\"连接取得成功\");
        if (Objects.nonNull(admin)) {
            adminMap.put(session.getId(), session); // 添加客服
        } else  {
            //        分配客服
            userMap.put(session.getId(), session); // 添加现阶段用户
            distribution(dataVo);
        }
        dataVo.setId(session.getId());
        System.out.println(\"用户连接取得成功:\"   admin);
        System.out.println(\"用户连接成功:\"   token);
        System.out.println(\"线上用户:\"   getOnlineCount());
        this.sendMsg(session, JSONObject.toJSONString(dataVo));
    }

    /**
     * @param vo
     * @return void
     * @Description: 分配客服
     * @Author Mr.Fang
     * @date 2021/11/14 13:13
     */
    private void distribution(DataVo vo) {
        if (adminMap.size() != 0) {
            Random random = new Random();
            int x = random.nextInt(adminMap.size());
            Set<String> values = adminMap.keySet();
            int j = 0;
            for (String str : values) {
                if (j == x) {
                    vo.setRecId(str);
                    System.out.println(\"分配ID:\"   str);
                    break;
                }
                j  ;
            }
        }
    }

    /**
     * @param session
     * @param message
     * @return void
     * @Description: 收取和发送信息
     * @Author Mr.Fang
     * @date 2021/11/14 13:13
     */
    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {

        System.out.print(\"用户ID:\"   session.getId());
        String payload = message.getPayload();
        System.out.println(\"接纳到的数据信息:\"   payload);
        DataVo dataVo = JSON.toJavaObject(JSON.parseObject(payload), DataVo.class); // json 转目标

        if (Objects.isNull(dataVo.getRecId()) || dataVo.getRecId().equals(\"\")) { // 用户客服为空 分配客服
            WebSocketSession socketSession = adminMap.get(session.getId());
            if (Objects.isNull(socketSession)) {
                this.distribution(dataVo);
            }
        }
        if (dataVo.getCode() == 9002) {
            if (Objects.nonNull(dataVo.getRecId())) { // user -> admin
                WebSocketSession socketSession = adminMap.get(dataVo.getRecId());
                dataVo.setSelfId(session.getId()).setRecId(\"\");
                this.sendMsg(socketSession, JSONObject.toJSONString(dataVo));
            } else if (Objects.nonNull(dataVo.getSelfId())) { // admin ->user
                WebSocketSession socketSession = userMap.get(dataVo.getSelfId());
                dataVo.setRecId(session.getId()).setSelfId(\"\");
                this.sendMsg(socketSession, JSONObject.toJSONString(dataVo));
            }
        }
    }

    /**
     * @param session
     * @param msg
     * @return void
     * @Description: 推送信息
     * @Author Mr.Fang
     * @date 2021/11/14 13:14
     */
    private void sendMsg(WebSocketSession session, String msg) throws IOException {
        session.sendMessage(new TextMessage(msg));
    }

    /**
     * @Description: 断掉连接以后
     * @param session
     * @param status
     * @return void
     * @Author Mr.Fang
     * @date 2021/11/14 13:14
     */
    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) {
        subOnlineCount(); // 现阶段用户加 1
        adminMap.remove(session.getId());
        userMap.remove(session.getId());
        System.out.println(\"用户断掉连接token:\"   session.getId());
        System.out.println(\"用户断开连接admin:\"   session.getId());
        System.out.println(\"线上用户:\"   getOnlineCount());

    }

    public static synchronized int getOnlineCount() {
        return onlineCount;
    }

    /**
     * @Description: 在线用户  1
     * @return void
     * @Author Mr.Fang
     * @date 2021/11/14 13:16
     */
    public static synchronized void addOnlineCount() {

        MyHandler.onlineCount  ;
    }

    /**
     * @Description: 线上用户 -1
     * @return void
     * @Author Mr.Fang
     * @date 2021/11/14 13:16
     */
    public static synchronized void subOnlineCount() {
        MyHandler.onlineCount--;
    }
}

配备回调函数

package com.example.webchat.config;

import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.http.server.ServletServerHttpRequest;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;
import java.util.Objects;

/**
 * @author Mr.Fang
 * @title: WebSocketHandlerInterceptor
 * @Description: 拦截器
 * @date 2021/11/14 13:12
 */
public class WebSocketHandlerInterceptor extends HttpSessionHandshakeInterceptor {

    /**
     * @param request
     * @param response
     * @param wsHandler
     * @param attributes
     * @return boolean
     * @Description: 握手以前
     * @Author Mr.Fang
     * @date 2021/11/14 13:18
     */
    @Override
    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {

        ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request;
        HttpServletRequest re = servletRequest.getServletRequest();
        Object token = re.getParameter(\"token\");
        Object admin = re.getParameter(\"admin\");
        if (Objects.isNull(token)) {
            return false;
        }
        re.getSession().setAttribute(\"admin\", admin);
        re.getSession().setAttribute(\"token\", token);
        return super.beforeHandshake(request, response, wsHandler, attributes);
    }

    /**
     * @param request
     * @param response
     * @param wsHandler
     * @param ex
     * @return boolean
     * @Description: 握手以后
     * @Author Mr.Fang
     * @date 2021/11/14 13:18
     */
    @Override
    public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception ex) {
        super.afterHandshake(request, response, wsHandler, ex);
    }
}

h5服务器端

<!DOCTYPE html>
<html>
	<head>
		<meta charset=\"utf-8\">
		<title>服务端</title>
		<style type=\"text/css\">
			#client {
				margin: 0px auto;
				width: 500px;
			}

			input {
				width: 80%;
				height: 40px;
				border-radius: 5px;
				border-color: #CCCCCC;
				outline: #01FA01;
			}

			#button {
				width: 84px;
				height: 46px;
				background-color: #5af3a5;
				color: #fff;
				font-size: 20px;
				border-radius: 5px;
				border: none;
				box-shadow: 1px 1px 1px 1px #ccc;
				cursor: pointer;
				outline: #01FA01;
			}
		</style>
	</head>
	<body>
		<div id=\"client\">
			<h1 style=\"text-align: center;\">服务器端推送信息</h1>
			<div id=\"content\" contenteditable=true
				style=\"width: 500px;height: 500px;margin: 0px auto;border: 1px solid #000000;padding: 10px;border-radius: 10px;overflow: auto;\">

			</div>
			<div style=\"padding: 5px;0px\">
				<input type=\"\" value=\"\" /> <button id=\"button\" type=\"button\">推送</button>
			</div>
		</div>
		<script src=\"http://code.jquery.com/jquery-2.1.1.min.js\"></script>
		<script type=\"text/javascript\">
			$(() => {
				var pushData = {
					code: 9002,
					msg: \'\',
					selfId: \'\',
				};
				var time = null;
				var path = \'ws://127.0.0.1:8009/myHandler/\';
				if (typeof(WebSocket) === \"undefined\") {
					alert(\'不兼容websocket\')
					return;
				}
				let id = Math.random(); // 随机数字
				// 创建对象socket
				var webSocket = new WebSocket(path   \'?token=\'   id \'&admin=1\');
				// 监视联接
				webSocket.onopen = function(event) {
					console.log(event);
					interval();
				};
				// 监视信息
				webSocket.onmessage = function(event) {
					let data = JSON.parse(event.data);
					 pushData.selfId = data.selfId;
					if (data.code == 9002) {
						$(\'#content\').append(
							`<p style=\"text-align: right;\"><span style=\"color:chocolate;\">${data.msg}</span>:手机客户端</p>`
						)
					} else if (data.code == 9001) {
						$(\'#content\').append(`<p style=\"color:#a09b9b;text-align:center;\" >联接取得成功</p>`);
					}
					console.log(event)
				};
				// 监视不正确
				webSocket.onerror = function(event) {
					console.log(event)
					$(\'#content\').append(`<p style=\"color:#a09b9b;text-align:center;\" >联接不正确</p>`);
					clearInterval();
				};
				// 推送信息
				$(\'#button\').click(() => {
					let v = $(\'input\').val();
					if (v) {
						pushData.code = 9002;
						pushData.msg = v;
						webSocket.send(JSON.stringify(pushData));
						$(\'#content\').append(
							`<p>服务器端:<span style=\"color: blueviolet;\">${v}</span></p>`
						)
						$(\'input\').val(\'\');
					}

				})

				function interval() {
					time = setInterval(() => {
						pushData.code = 9003;
						pushData.msg = \'心率\';
						webSocket.send(JSON.stringify(pushData));
					}, 5000);
				}

				function clearInterval() {
					clearInterval(time);
				}

			})
		</script>
	</body>
</html>

手机客户端

<!DOCTYPE html>
<html>
	<head>
		<meta charset=\"utf-8\">
		<title>客户端</title>
		<style type=\"text/css\">
			#client {
				margin: 0px auto;
				width: 500px;
			}

			input {
				width: 80%;
				height: 40px;
				border-radius: 5px;
				border-color: #CCCCCC;
				outline: #01FA01;
			}

			#button {
				width: 84px;
				height: 46px;
				background-color: #5af3a5;
				color: #fff;
				font-size: 20px;
				border-radius: 5px;
				border: none;
				box-shadow: 1px 1px 1px 1px #ccc;
				cursor: pointer;
				outline: #01FA01;	}
		</style>
	</head>
	<body>
		<div id=\"client\">
			<h1 style=\"text-align: center;\">手机客户端推送信息</h1>
			<div id=\"content\" contenteditable=true
				style=\"width: 500px;height: 500px;margin: 0px auto;border: 1px solid #000000;padding: 10px;border-radius: 10px;overflow: auto;\">

			</div>
			<div style=\"padding: 5px;0px\">
				<input type=\"\" value=\"\" /> <button id=\"button\" type=\"button\">推送</button>
			</div>
		</div>
		<script src=\"http://code.jquery.com/jquery-2.1.1.min.js\"></script>
		<script type=\"text/javascript\">
			$(() => {
				var pushData = {
					code: 9002,
					msg: \'\',
					recId: \'\',
				};
				var time = null;
				var path = \'ws://127.0.0.1:8009/myHandler/\';
				if (typeof(WebSocket) === \"undefined\") {
					alert(\'不兼容websocket\')
					return;
				}
				let id = Math.random(); // 随机数字
				// 创建对象socket
				var webSocket = new WebSocket(path   \'?token=\'   id);
				// 监视联接
				webSocket.onopen = function(event) {
					console.log(event);
					interval();
				};
				// 监视信息
				webSocket.onmessage = function(event) {
					let data = JSON.parse(event.data);
					if (data.code == 9002) {
						$(\'#content\').append(
							`<p style=\"text-align: right;\"><span style=\"color:chocolate;\">${data.msg}</span>:服务器端</p>`
						)
					} else if (data.code == 9001) {
						$(\'#content\').append(`<p style=\"color:#a09b9b;text-align:center;\" >联接取得成功</p>`);
					}
					console.log(event)
				};
				// 监视不正确
				webSocket.onerror = function(event) {
					console.log(event)
					$(\'#content\').append(`<p style=\"color:#a09b9b;text-align:center;\" >联接不正确</p>`);
					clearInterval();
				};
				// 推送信息
				$(\'#button\').click(() => {
					let v = $(\'input\').val();
					if (v) {
						pushData.code = 9002;
						pushData.msg = v;
						webSocket.send(JSON.stringify(pushData));
						$(\'#content\').append(
							`<p>手机客户端:<span style=\"color: blueviolet;\">${v}</span></p>`
						)
						$(\'input\').val(\'\');
					}

				})

				function interval() {
					time = setInterval(() => {
						pushData.code = 9003;
						pushData.msg = \'心率\';
						webSocket.send(JSON.stringify(pushData));
					}, 5000);
				}

				function clearInterval() {
					clearInterval(time);
				}

			})
		</script>
	</body>
</html>

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

(0)
上一篇 2022年5月7日 下午1:14
下一篇 2022年5月7日 下午1:16

相关推荐

  • 手机怎么录制屏幕视频,苹果手机录屏技巧及方法

    苹果全新的iOS11带来了很多的新功能,让果粉兴奋不已。最让人津津乐道的是控制中心可以设置自己需要的开关了并且支持录屏功能,终于不需要苦苦找第三方应用了。虽然自带的录屏功能简单,但是还是很简单实用的,配合各种视频制作软件可以制作出很有用的视频。 注意:使用iOS自带录屏需要将版本升级至iOS11以上。 首先,需要将屏幕录制添加到控制中心。在主屏幕打开【设置】,随后进入【控制中心】,然后下拉更多的找…

    2022年6月7日
    950
  • win10怎么设置窗口置顶,具体操作方法请看本篇详解

    Windows1015063版本系统发生了不小的变化,其中部分“通用应用平台”类型应用,已经有了“置顶”的功能。比如,Win10自带的“电影和电视”应用,就可以“置顶”了。下面,小编就分享windows10系统下置顶应用程序窗口的具体方法。 win10系列软件最新版本下载 Win10系统正式版3642.58MB下载微软Win10升级助手18.74MB下载 推荐:win10企业版官方下载 具体如下:…

    2022年7月13日
    640
  • 苹果通讯录怎么删除,苹果通讯录一次性删除方法

    之前分享了一期iPhone手机如何导入通讯录的教程,收到很多网友喜欢,其中个别网友在评论区咨询:iPhone手机通讯录里面如果有重复联系人,或者想要批量删除联系人该怎么办?难道非得一个个手动去删除么?过程也太痛苦了。 关于这几个网友咨询的问题,小编整理了一个教程,让大家可以简单的在iPhone手机内,批量整理重复联系人信息,批量删除联系人,可以让往日手动一个个删除的过程省时不少,大家可以一起学学:…

    2022年8月6日
    540
  • 微信辅助解封有什么要求,微信辅助解封流程说明图

    有网友表示,自己的微信登陆提示“被封号”了,这该怎么办呢?今天我就教大家如何解封,其实步骤很简单哦~ 需要注意的是,这个仅支持“未永久封号”的微信号,如果你被永久封号了,就爱莫能助啦~此外,一个月内只能解封一次。 1、首先,登陆微信出现提示,继续点【确定】,再点【我已了解,申请解封】; 2、这里填写手机号码,这个手机号必须和微信绑定的,但可以不是自己的;接着会提示你发短信,按要求照做就行; 3、返…

    2022年10月14日
    1140
  • 税前税后工资怎么计算,税前税后价格计算公式

    看到很多人都有这样的疑惑,那就是知道自己实际发了多少工资,如果有工资条还好说,没有工资条的同学都想计算下自己的个税到底交了多少血汗钱,还有自己交税前到底挣了多少辛苦钱! 上一期跟大家讲了怎么快速的使用Excel计算个人所得税,这下我们就知道税后工资来反推下我们的税前工资和个税多少! Max函数知道税后工资快速求税前工资 MAX()是取最大值的函数;语法为=MAX(number1,number2…)…

    2022年7月9日
    710
  • 微信怎么快速删除好友,批量删除微信好友教程分享

    很多人不知不觉用微信加了很多自己不联系的好友,很多都是无效的朋友,一个一个删除太麻烦了,今天我教大家如何快速删除好友,省时省力,看图: 看图先打开微信设置-打开隐私-打开不常用联系人-点击多选-点击要删除的朋友-点击删除。

    2022年6月9日
    760
  • 长沙网站策划学校,推荐一所高质量计算机类高校

    长沙职业中专类的学校很多,专业种类繁多,目前来说最吃香的专业要属计算机专业。如果有想来长沙读书的同学,小编可以推荐一所民办职业学校——长沙铁航中等职业技术学校。 学校坐落在历史文化名城——湖南长沙,校址位于全国排名前十的国家级经济技术开发区——长沙经开区的核心区域“星沙大学城”中心地带, 占据得天独厚的区位优势,东依湖南警察学院、北临湖南艺术职业学院、西接长沙电力职业技术学校,南靠湖南农业大学,交…

    2022年9月18日
    620
  • 服务器备份软件哪个好用(数据同步备份软件)

    说到服务器备份软件,你第一个想到的是什么?行了,别想了,小西给你推荐一款贼啦好用的服务器备份工具-FileYee,自动实时同步,完全不用你操心,建议收藏下载! FIleYee是一款非常好用的文件同步工具,她支持服务器文件备份、网盘、本次磁盘等设备,同时对于FTP的上传下载均支持断点续传,重试,随时确保文件的成功传输。下面我们看下基础操作步骤: 1、创建任务 首先我们需要创建备份任务,选择对应的源目…

    2022年5月13日
    780
  • 宝宝酸奶哪个牌子最好(推荐5个最易吸收的儿童进口酸奶品牌)

    国内儿童酸奶品牌良莠不齐,现在宝妈越来越倾向给孩子买进口儿童酸奶,但是这么多进口品牌宝妈你挑对了吗? 首先,儿童酸奶最好是常温,对宝宝肠胃无刺激;第二,儿童酸奶一定要是高蛋白生牛乳发酵,否则就是乳味饮料,营养价值不高;第三。儿童酸奶当然不能添加香精、人工色素、明胶和防腐剂了,少量糖调味是没有问题的。 下面5款进口儿童酸奶宝妈们可以根据需要选购给宝宝哦。 一,法国Pom’Potes法优乐儿童酸奶 优…

    2022年9月19日
    1120
  • 藏青色配什么颜色好看,揭秘藏青色最完美的搭配色

    藏青色衣服怎么搭配好看?藏青色在搭配上面其实有很多选择,不管是深色还是浅色都能搭配的很好看,其中红色、咖啡色、白色就是不错的选择,一起来学学吧。  藏青色适合什么肤色: 1、藏青色 很多肤色都可以接受的,但是偏黄 暗黄的肤色的人最好不要选择,蓝与黄的对比强烈-会使得肤色更黄,很不显人精神,另外肤色黑的人,也最好别选择藏蓝,整体还是过于暗淡了!(以上肤色如果非要穿的话,中间或者里面必须要稍大面积的其…

    2022年10月5日
    8.6K0

发表回复

登录后才能评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信