var uinfo = { id: 'KF' + uid, username: uname, avatar: avatar, group: group }; // 创建一个Socket实例 var socket = new WebSocket('wss://' + socket_server+'?apiToken=8444fb09eec653b322a4ad74b836aed0'); // 打开Socket socket.onopen = function (res) { layui.use(['layer'], function () { var layer = layui.layer; layer.ready(function () { layer.msg('链接成功', {time: 1000}); }); }); // 登录 /*var login_data = '{"type":"init", "uid":"' + uinfo.id + '", "token":"OTY3NDMwIyRAJSFeKi8xNTYyMzEzOTAwLzE=", "name" : "' + uinfo.username + '", "avatar" : "' + uinfo.avatar + '", "group": ' + uinfo.group + '}';*/ var login_data = '{"type":"init","data":{"uid":"' + uinfo.id + '", "token":"ODMzNDk5IyRAJSFeKi8xNTYyNTc2NDY4LzE=","name":"' + uinfo.username + '","avatar":"","group":1}}'; socket.send(login_data); }; // 监听消息 socket.onmessage = function (res) { var data = eval("(" + res.data + ")");console.log(data) switch (data['message_type']) { // 服务端ping客户端 case 'ping': socket.send('{"type":"ping"}'); break; // 添加用户 case 'connect': addUser(data.data.user_info); break; // 移除访客到主面板 case 'delUser': delUser(data.data); break; // 监测聊天数据 case 'chatMessage': showUserMessage(data.data, data.data.content); break; } }; // 监听失败 socket.onerror = function(err){ layer.alert('连接失败,请联系管理员', {icon: 2, title: '错误提示'}); }; $(function () { // 获取服务用户列表 $.getJSON('/service/index/getUserList', function(res){ if(1 == res.code && res.data.length > 0){ $.each(res.data, function(k, v){ addUser(v); }); var id = $(".layui-unselect").find('li').eq(0).data('id'); var name = $(".layui-unselect").find('li').eq(0).data('name'); var avatar = $(".layui-unselect").find('li').eq(0).data('avatar'); var ip = $(".layui-unselect").find('li').eq(0).data('ip'); // 默认设置第一个用户为当前对话的用户 $("#active-user").attr('data-id', id).attr('data-name', name).attr('data-avatar', avatar).attr('data-ip', ip); $(".layui-unselect").find('li').eq(0).addClass('active').find('span:eq(1)').removeClass('layui-badge').text(''); $("#f-user").val(name); $("#f-ip").val(ip); $.getJSON('/service/index/getCity', {ip: ip}, function(res){ $("#f-area").val(res.data); }); // 拉取和这个人的聊天记录 $("#u-" + id).show(); getChatLog(id, 1); } }); // 监听快捷键发送 document.getElementById('msg-area').addEventListener('keydown', function (e) { if (e.keyCode != 13) return; e.preventDefault(); // 取消事件的默认动作 sendMessage(); }); // 点击表情 var index; $("#face").click(function (e) { e.stopPropagation(); layui.use(['layer'], function () { var layer = layui.layer; var isShow = $(".layui-whisper-face").css('display'); if ('block' == isShow) { layer.close(index); return; } var height = $(".chat-box").height() - 110; layer.ready(function () { index = layer.open({ type: 1, offset: [height + 'px', $(".layui-side").width() + 'px'], shade: false, title: false, closeBtn: 0, area: '395px', content: showFaces() }); }); }); }); $(document).click(function (e) { layui.use(['layer'], function () { var layer = layui.layer; if (isShow) { layer.close(index); return false; } }); }); // 发送消息 $("#send").click(function () { sendMessage(); }); // hover用户 $(".layui-unselect li").hover(function () { $(this).find('i').show(); }, function () { $(this).find('i').hide(); }); // 关闭用户 $('.close').click(function () { var uid = $(this).parent().data('id'); $(this).parent().remove(); // 清除左侧的用户列表 $('#u-' + uid).remove(); // 清除右侧的聊天详情 }); // 检测滚动,异步加载更多聊天数据 $(".chat-box").scroll(function () { var top = $(".chat-box").scrollTop(); }); // 会员转接 $("#scroll-link").click(function(){ var id = $("#active-user").attr('data-id'); var name = $("#active-user").attr('data-name'); var avatar = $("#active-user").attr('data-avatar'); var ip = $("#active-user").attr('data-ip'); if(id == '' || name == ''){ layer.msg("请选择要转接的会员"); } // 二次确认 var layerIndex = null; layerIndex = layer.confirm('确定转接 ' + name + ' ?', { title: '转接提示', closeBtn: 0, icon: 3, btn: ['确定', '取消'] // 按钮 }, function(){ layer.close(layerIndex); layerIndex = layer.open({ title: '', type: 1, area: ['30%', '40%'], content: $("#change-box") }); // 监听选择 layui.use(['form'], function(){ var form = layui.form; form.on('select(group)', function (data) { if(uinfo.group == data.value){ layer.msg("已经在该分组,不需要转接!"); }else{ layer.close(layerIndex); var group = data.value; // 分组 // 交换分组 var change_data = '{"type":"changeGroup", "uid":"' + id + '", "name" : "' + name + '", "avatar" : "' + avatar + '", "group": ' + group + ', "ip" : "' + ip + '"}'; //console.log(change_data); socket.send(change_data); // 将该会员从我的会话中移除 delUser({id: id}); layer.msg('转接成功'); } }); }); }, function(){ }); }); }); var isShow = false; layui.use(['element', 'form'], function () { var element = layui.element; var form = layui.form; }); // 图片 文件上传 layui.use(['upload', 'layer'], function () { var upload = layui.upload; var layer = layui.layer; // 执行实例 var uploadInstImg = upload.render({ elem: '#image' // 绑定元素 , accept: 'images' , exts: 'jpg|jpeg|png|gif' , url: '/service/upload/uploadImg' // 上传接口 , done: function (res) { sendMessage('img[' + res.data.src + ']'); showBigPic(); } , error: function () { // 请求异常回调 } }); var uploadInstFile = upload.render({ elem: '#file' // 绑定元素 , accept: 'file' , exts: 'zip|rar' , url: '/service/upload/uploadFile' // 上传接口 , done: function (res) { sendMessage('file(' + res.data.src + ')[' + res.msg + ']'); } , error: function () { // 请求异常回调 } }); }); // 展示表情数据 function showFaces() { isShow = true; var alt = getFacesIcon(); var _html = '
'; return _html; } // 选择表情 function checkFace(obj) { var word = $(".msg-area").val() + ' face' + $(obj).attr('title') + ' '; $(".msg-area").val(word).focus(); } // 发送消息 function sendMessage(sendMsg) { var msg = (typeof(sendMsg) == 'undefined') ? $(".msg-area").val() : sendMsg; if ('' == msg) { layui.use(['layer'], function () { var layer = layui.layer; return layer.msg('请输入回复内容', {time: 1000}); }); return false; } var word = msgFactory(msg, 'mine', uinfo); var uid = $("#active-user").attr('data-id'); var uname = $("#active-user").attr('data-name'); socket.send(JSON.stringify({ type: 'chatMessage', data: {to_id: uid, to_name: uname, content: msg, from_name: uinfo.username, from_id: uinfo.id, from_avatar: uinfo.avatar, conversationId: 49, isFirst: true} })); $("#u-" + uid).append(word); $(".msg-area").val(''); // 滚动条自动定位到最底端 wordBottom(); } // 关闭工单 function cc() { var uid = $("#active-user").attr('data-id'); socket.send(JSON.stringify({ type: 'kfCloseUser', data: {to_id: uid,kf_id:1,group_id:1,conversationId:13} })); } // 上线 function dd() { var uid = $("#active-user").attr('data-id'); socket.send(JSON.stringify({ type: 'kfOnline', data: {status: 1,uid: uinfo.id} })); } // 拒接 function ee() { var uid = $("#active-user").attr('data-id'); socket.send(JSON.stringify({ type: 'kfOnline', data: {status: 2,uid: uinfo.id} })); } // 展示客服发送来的消息 function showUserMessage(uinfo, content) { if ($('#f-' + uinfo.id).length == 0) { addUser(uinfo); } // 未读条数计数 if (!$('#f-' + uinfo.id).hasClass('active')) { var num = $('#f-' + uinfo.id).find('span:eq(1)').text(); if (num == '') num = 0; num = parseInt(num) + 1; $('#f-' + uinfo.id).find('span:eq(1)').removeClass('layui-badge').addClass('layui-badge').text(num); } var word = msgFactory(content, 'user', uinfo); setTimeout(function () { $("#u-" + uinfo.id).append(word); // 滚动条自动定位到最底端 wordBottom(); showBigPic(); }, 200); } // 消息发送工厂 function msgFactory(content, type, uinfo) { var _html = ''; if ('mine' == type) { _html += '
  • '; } else { _html += '
  • '; } _html += '
    '; _html += ''; if ('mine' == type) { _html += '' + getDate() + '' + uinfo.username + ''; } else { _html += '' + uinfo.name + '' + getDate() + ''; } _html += '
    ' + replaceContent(content) + '
    '; _html += '
  • '; return _html; } // 获取日期 function getDate() { var d = new Date(new Date()); return d.getFullYear() + '-' + digit(d.getMonth() + 1) + '-' + digit(d.getDate()) + ' ' + digit(d.getHours()) + ':' + digit(d.getMinutes()) + ':' + digit(d.getSeconds()); } //补齐数位 var digit = function (num) { return num < 10 ? '0' + (num | 0) : num; }; // 滚动条自动定位到最底端 function wordBottom() { var box = $(".chat-box"); box.scrollTop(box[0].scrollHeight); } // 切换在线用户 function changeUserTab(obj) { obj.addClass('active').siblings().removeClass('active'); wordBottom(); } // 添加用户到面板 function addUser(data) { console.log(data) var _html = '
  • '; _html += ''; _html += '' + data.name + ''; _html += '0'; _html += ''; _html += '
  • '; // 添加左侧列表 $("#user_list").append(_html); // 如果没有选中人,选中第一个 var hasActive = 0; $("#user_list li").each(function(){ if($(this).hasClass('active')){ hasActive = 1; } }); var _html2 = ''; _html2 += ''; // 添加主聊天面板 $('.chat-box').append(_html2); if(0 == hasActive){ $("#user_list").find('li').eq(0).addClass('active').find('span:eq(1)').removeClass('layui-badge').text(''); $("#u-" + data.id).show(); var id = $(".layui-unselect").find('li').eq(0).data('id'); var name = $(".layui-unselect").find('li').eq(0).data('name'); var ip = $(".layui-unselect").find('li').eq(0).data('ip'); var avatar = $(".layui-unselect").find('li').eq(0).data('avatar'); // 设置当前会话用户 $("#active-user").attr('data-id', id).attr('data-name', name).attr('data-avatar', avatar).attr('data-ip', ip); $("#f-user").val(name); $("#f-ip").val(ip); $.getJSON('/service/index/getCity', {ip: ip}, function(res){ $("#f-area").val(res.data); }); } getChatLog(data.id, 1); checkUser(); } // 操作新连接用户的 dom操作 function checkUser() { $(".layui-unselect").find('li').unbind("click"); // 防止事件叠加 // 切换用户 $(".layui-unselect").find('li').bind('click', function () { changeUserTab($(this)); var uid = $(this).data('id'); var avatar = $(this).data('avatar'); var name = $(this).data('name'); var ip = $(this).data('ip'); // 展示相应的对话信息 $('.chat-box ul').each(function () { if ('u-' + uid == $(this).attr('id')) { $(this).addClass('show-chat-detail').siblings().removeClass('show-chat-detail').attr('style', ''); return false; } }); // 去除消息提示 $(this).find('span').eq(1).removeClass('layui-badge').text(''); // 设置当前会话的用户 $("#active-user").attr('data-id', uid).attr('data-name', name).attr('data-avatar', avatar).attr('data-ip', ip); // 右侧展示详情 $("#f-user").val(name); $("#f-ip").val(ip); $.getJSON('/service/index/getCity', {ip: ip}, function(res){ $("#f-area").val(res.data); }); getChatLog(uid, 1); wordBottom(); }); } // 删除用户聊天面板 function delUser(data) { $("#f-" + data.id).remove(); // 清除左侧的用户列表 $('#u-' + data.id).remove(); // 清除右侧的聊天详情 } // 发送快捷语句 function sendWord(obj) { var msg = $(obj).data('word'); sendMessage(msg); } // 获取聊天记录 function getChatLog(uid, page, flag) { $.getJSON('/service/index/getChatLog', {uid: uid, page: page}, function(res){ if(1 == res.code && res.data.length > 0){ if(res.msg == res.total){ var _html = '
    没有更多了
    '; }else{ var _html = '
    更多记录
    '; } var len = res.data.length; for(var i = 0; i < len; i++){ var v = res.data[len - i - 1]; if ('mine' == v.type) { _html += '
  • '; } else { _html += '
  • '; } _html += '
    '; _html += ''; if ('mine' == v.type) { _html += '' + v.time_line + '' + v.from_name + ''; } else { _html += '' + v.from_name + '' + v.time_line + ''; } _html += '
    ' + replaceContent(v.content) + '
    '; _html += '
  • '; } setTimeout(function () { // 滚动条自动定位到最底端 if(typeof flag == 'undefined'){ $("#u-" + uid).html(_html); wordBottom(); }else{ $("#u-" + uid).prepend(_html); } showBigPic(); }, 100); } }); } // 显示大图 function showBigPic(){ $(".layui-whisper-photos").on('click', function () { var src = this.src; layer.photos({ photos: { data: [{ "alt": "大图模式", "src": src }] } , shade: 0.5 , closeBtn: 2 , anim: 0 , resize: false , success: function (layero, index) { } }); }); } // 获取更多的的记录 function getMore(obj){ $(obj).remove(); var page = $(obj).attr('data-page'); var uid = $(".layui-unselect").find('li').eq(0).data('id'); getChatLog(uid, page, 1); } // 打卡下班 function loginOut(){ layer.msg("正在关闭,未咨询完的用户", {time: 50000}); var len = $("#user_list li").length; var closeNum = 0; if(len == closeNum){ window.location.href = '/service/login/loginOut'; } $("#user_list li").each(function(){ var uid = $(this).data('id'); var activeUid = $("#active-user").attr('data-id'); if(uid == activeUid){ $("#active-user").attr('data-id', -999); } socket.send(JSON.stringify({ type: 'closeUser', uid: uid })); $(this).parent().remove(); // 清除左侧的用户列表 $('#u-' + uid).remove(); // 清除右侧的聊天详情 closeNum++; if(closeNum == len){ setTimeout(function(){ window.location.href = '/service/login/loginOut'; }, 1500); // 此处等待用户真的退出了 } }); }