// 客服的id
var kf_id = 0;
var kf_name = '';
// 是否点击显示表情的标志
var flag = 1;
// 发送锁 标识
var sendLock = 0;
// 是否显示默认的聊天记录
var commChat = 1;
// 两个时间段的消息相隔时间
var msg_time = 2;
var heartTime = 20 * 1000;
var lockReconnect = false; //避免重复连接
var socket;
// 连接服务器
if (config != undefined && config.socket != undefined) {
showloading(true);
var url = config.socket + ':' + config.port;
createWebSocket(url);
lockInput();
}
function createWebSocket(url) {
try {
socket = new WebSocket(url);
eventHandle();
} catch (e) {
reconnect(url);
}
}
function reconnect(url) {
if (lockReconnect) return;
lockReconnect = true;
//没连接上会一直重连,设置延迟避免请求过多
setTimeout(function () {
console.log('重连..')
createWebSocket(url);
lockReconnect = false;
}, 2000);
}
function eventHandle() {
// 监听关闭
socket.onclose = function () {
console.log('连接关闭')
reconnect(url);
};
// 监听错误
socket.onerror = function (err) {
showSystem({ content: '连接失败' });
document.getElementById('title').innerText = '连接失败';
};
// 建立连接
socket.onopen = function (res) {
console.log('连接成功');
showloading(false);
var login_data = '{"path":"api/userInit","param":{"type":"user","kf_type":2,"user_id":"' +
config.uid + '","user_name":"' + config.name + '","avatar_url":"' +
config.avatar + '","group_id":"' + config.group + '","data":"" },"access_token":"123456"}'
socket.send(login_data);
//心跳检测重置
heartCheck.reset().start();
// 解锁
unlockInput();
};
// 监听消息
socket.onmessage = function (res) {
var data = eval("(" + res.data + ")");
switch (data['message_type']) {
// 分配到客服
case 'connect':
kf_id = data.data.kf_id;
kf_name = data.data.kf_name;
var is_online = data.data.is_online == 2 ? "(离线)" : "(离线)";
showSystem({ content: '客服 ' + data.data.kf_name + ' 为您服务' });
document.getElementById('title').innerHTML = '与 ' + kf_name + ' 交流中' + is_online;
if (1 == commChat) {
showChatLog();
}
unlockInput();
break;
// 排队等待
case 'wait':
lockInput();
document.getElementById('title').innerHTML = '请稍后再来';
showSystem(data.data);
break;
// 监测聊天数据
case 'text':
var chekc_msg = checkMsgIsRepeat(data.data.msg_id);
if (chekc_msg) return;
showMsg(data.data, data.data.content);
break;
case 'img':
var chekc_msg = checkMsgIsRepeat(data.data.msg_id);
if (chekc_msg) return;
var content = data.data.content
showMsg(data.data, content, 'img');
break;
// 转接
case 'relinkMessage':
commChat = 2;
document.getElementById('title').innerHTML = '正在转接中...';
break;
// 客服下线
case 'kf_offline':
$('#title').children('font').show();
break;
// 客服上线
case 'kf_online':
// 添加离线
$('#title').children('font').hide();
break;
}
heartCheck.reset().start();
};
}
// 图片 文件上传
layui.use(['upload'], function () {
var upload = layui.upload;
// 执行实例
var uploadInstImg = upload.render({
elem: '#up-image' // 绑定元素
, accept: 'images'
, exts: 'jpg|jpeg|png|gif'
, url: '/index/upload/uploadImg' // 上传接口
, done: function (res) {
sendMsg('img[' + res.data.src + ']');
}
, error: function () {
// 请求异常回调
}
});
$('.layui-upload-file').hide();
});
$(function () {
// 监听输入改变发送按钮
$("#msg").bind('input porpertychange', function () {
if ($("#msg").val().length > 0) {
$(".layim-send").removeClass('layui-disabled');
} else {
$(".layim-send").addClass('layui-disabled');
}
});
// 点击发送
$("#send").click(function () {
sendMsg();
});
// 点击表情
$('#up-face').click(function (e) {
e.stopPropagation();
if (1 == flag) {
showFaces();
$('#face-box').show();
flag = 2;
} else {
$('#face-box').hide();
flag = 1;
}
});
// 监听点击旁边关闭表情
document.addEventListener("click", function () {
if (2 == flag) {
document.getElementById('face-box').style.display = 'none';
flag = 1;
}
});
});
// 发送消息
function sendMsg(sendMsg) {
if (1 == sendLock) {
return false;
}
var msg = (typeof (sendMsg) == 'undefined') ? $('#msg').val() : sendMsg;
if ('' == msg) {
return false;
}
var msg_id = uuid();
var _html = $("#chat-list").html();
var time = getTime();
var content = replaceContent(msg);
let content_type = '';
// 检测是否显示时间
var next_time = $("#chat-list").find('span').last().text();
var check_time = checkMegTime(next_time, time, msg_time);
if (check_time) {
_html += '
' + time + '';
}
_html += '';
_html += '';
_html += '
我 ';
_html += '' + content + '
';
$('#chat-list').html(_html);
if (msg.indexOf('img[') != -1) {
content_type = 'img'
}
msg = getCutout(msg);
// 发送消息
socket.send(JSON.stringify({
path: "api/chat",
param: {
"type": "user",
"to_id": kf_id,
"to_name": kf_name,
"group_id": "1",
"content": msg,
"content_type": content_type,
"msg_id": msg_id,
"from_name": config.name,
"from_id": config.user_id,
"from_avatar": config.avatar,
"data": ""
},
"access_token": "123456",
}));
// 储存我发出的信息
var key = kf_id + '-' + config.uid;
if (typeof (Storage) !== "undefined") {
var localMsg = getCache(key);
if (localMsg == null || localMsg.length == 0) {
localMsg = [];
}
localMsg.push({ type: 'mine', name: '我', time: time, content: content, avatar: config.avatar });
cacheChat({ key: key, data: localMsg });
}
$('#msg').val('');
$(".layim-send").addClass('layui-disabled');
// 滚动条自动定位到最底端
wordBottom();
}
// 展示发送来的消息
function showMsg(info, content, img, flag) {
var _html = $("#chat-list").html();
let index = content.indexOf('[')
if (index !== -1) {
content = content.slice(0, index) + 'face' + content.slice(index)
}
content = replaceContent(content);
// 检测是否显示时间
var next_time = $("#chat-list").find('span').last().text();
var check_time = checkMegTime(next_time, info.time, msg_time);
if (check_time) {
_html += `` + info.time + ``;
}
// _html += '' + info.time + '';
_html += '';
_html += '';
_html += '
' + info.name + ' ';
if (img == 'img') {
var type = 'img'
_html += '';
} else {
var type = 'text'
_html += '' + content + '
';
}
$('#chat-list').html(_html);
// 滚动条自动定位到最底端
wordBottom();
// 储存我收到的信息
var key = kf_id + '-' + config.uid;
if (typeof (Storage) !== "undefined" && typeof (flag) == "undefined") {
var localMsg = getCache(key);
if (localMsg == null || localMsg.length == 0) {
localMsg = [];
}
localMsg.push({ type: 'other', name: info.name, time: info.time, content: content, avatar: info.avatar, message_type: type });
cacheChat({ key: key, data: localMsg });
}
}
// 缓存聊天数据 [本地存储策略]
function cacheChat(obj) {
if (typeof (Storage) !== "undefined") {
localStorage.setItem(obj.key, JSON.stringify(obj.data));
}
}
// 从本地缓存中,拿出数据
function getCache(key) {
return JSON.parse(localStorage.getItem(key));
}
// 对话框定位到最底端
function wordBottom() {
// 滚动条自动定位到最底端
var box = $(".layim-chat-main");
box.scrollTop(box[0].scrollHeight);
}
// 锁住输入框
function lockInput() {
sendLock = 1;
document.getElementById('msg').setAttribute('readonly', 'readonly');
}
// 解锁输入框
function unlockInput() {
sendLock = 0;
document.getElementById('msg').removeAttribute('readonly');
}
// 展示表情数据
function showFaces() {
var alt = getFacesIcon();
var _html = ''
var len = alt.length;
for (var index = 0; index < len; index++) {
_html += '
';
}
_html += '
';
document.getElementById('face-box').innerHTML = _html;
}
// 选择表情
function checkFace(obj) {
var msg = document.getElementById('msg').value;
document.getElementById('msg').value = msg + ' face' + obj.title + ' ';
document.getElementById('face-box').style.display = 'none';
$(".layim-send").removeClass('layui-disabled');
flag = 1;
}
// 系统消息
function showSystem(info) {
$("#chat-list").append('' + info.content + '');
}
// 展示本地聊天缓存
function showChatLog() {
var chatLog = getCache(kf_id + '-' + config.uid);
if (chatLog == null || chatLog.length == 0) {
return;
}
var _html = '';
var len = chatLog.length;
for (var i = 0; i < len; i++) {
var item = chatLog[i];
if ('mine' == item.type) {
// 检测上次聊天时间
var check_time = false;
if (i > 1) {
var check_time = checkMegTime(chatLog[i - 1].time, item.time, msg_time);
}
if (check_time) {
_html += '' + item.time + '';
}
_html += '';
_html += '';
_html += '
' + item.name + ' ';
_html += '' + item.content + '
';
} else if ('other' == item.type) {
_html += '' + item.time + '';
_html += '';
_html += '';
_html += '
' + item.name + ' ';
if (item.message_type == 'img') {
_html += '';
} else {
_html += '' + item.content + '
';
}
}
}
document.getElementById('chat-list').innerHTML = _html;
// 滚动条自动定位到最底端
wordBottom();
}
// 退出
function loginOut() {
window.history.go(-1);
}
/**
* 检测消息是否重复
* @param {*} uid 用户id
* @param {*} msg_id 消息id
*/
function checkMsgIsRepeat(msg_id) {
if (!msg_id) return false;
var dom = $('chat-list').find('#' + msg_id);
if (!dom || dom.length == 0) return false;
return true;
}
// 加载loading
function showloading(t) {
if (t) { //如果是true则显示loading
loading = layer.load(1, {
shade: [0.1, '#fff'] //0.1透明度的白色背景
});
} else { //如果是false则关闭loading
layer.closeAll('loading');
}
}
//心跳检测
var heartCheck = {
timeout: heartTime,
timeoutObj: null,
serverTimeoutObj: null,
reset: function () {
clearTimeout(this.timeoutObj);
clearTimeout(this.serverTimeoutObj);
return this;
},
start: function () {
var self = this;
this.timeoutObj = setTimeout(function () {
//发送心跳
socket.send(JSON.stringify({
path: 'ping',
param: { 'type': 'user' }
}));
self.serverTimeoutObj = setTimeout(function () { //如果超过一定时间还没重置,说明后端主动断开了
reconnect(wsUrl);
}, self.timeout);
}, this.timeout);
}
};
// 显示大图
function showBigPic(obj) {
// console.log(obj);
var src = obj.src;
layer.photos({
photos: {
data: [{
"alt": "大图模式",
"src": src
}]
},
shade: 0.5,
closeBtn: 2,
anim: 0,
resize: false,
success: function (layero, index) {
}
});
}