技术好文共享:第二十二webchat(2)

简介: 技术好文共享:第二十二webchat(2)

1.聊天框切换


1.1.定义全局字典


//globe chat record dic


GLOBAL_CHAT_RECORD_DIC = {


'single':{},


'group':{},


}


1.2.增加归档


//在切换之前把之前的聊天内容归档


var current_session_id = $(".chat-box-title").attr("contact-id");


var current_session_type = $(".chat-box-title").attr("contact-type");


if(current_session_id){


GLOBAL_CHAT_RECORD_DIC【current_session_type】【current_session_id】 = $(".chat-box-window").html()


}


1.2.获取新内容


//获取新内容


var new_contact_chat_record = GLOBAL_CHAT_RECORD_DIC【contact_type】【contact_id】;


//如果是第一次从字典取值


if(typeof new_contact_chat_record == 'undefined'){


new_contact_chat_record = '';


}


//将内容赋予到对话框


$(".chat-box-window").html(new_contact_chat_record)


1.4.测试切换


2.消息展现到对话框


2.1.消息解析


function GetNewMsgs() {


console.log("--- getting new message ---");


$.getJSON("{% url 'get_new_msgs' %}",function(callback){


console.log(callback);


ParseNewMsgs(callback);//把新消息进行解析


GetNewMsgs();


});//end post


}


2.2.消息定义


function ParseNewMsgs(callback) {


var current_session_type = $(".chat-box-title").attr("contact-type");


var current_session_id = $(".chat-box-title").attr("contact-id");


for(var i in callback){


console.log(callback【i】);


// { from: "1", to: "5", type: "single", msg: "\n22", timestamp: 1521081612.0092783 }


if(callback【i】.from == current_session_id && current_session_type == callback【i】.type){


//此消息的发送方当前正在跟我聊天


var msg_item_ele = "" +


"" + callback【i】.from + "" +


"" + callback【i】.timestamp + "" +


"" + callback【i】.msg + "" +


"";


$(".chat-box-window").append(msg_item_ele);


}//end if


}//enf for


}


2.3.测试发送


ckl 向贾岛发消息:


贾岛给ckl回消息:


消息时断时续


3.消息暂存,登录后就接收


3.1.暂存消息到字典


for(var i in callback){


console.log(callback【i】);


// { from: "1", to: "5", type: "single", msg: "\n22", timestamp: 1521081612.0092783 }


var msg_item_ele = "" +


"" + callback【i】.from + "" +


"" + callback【i】.timestamp + "" +


"" + callback【i】.msg + "" +


"";


if(callback【i】.from == current_session_id && current_session_type == callback【i】.type){


//此消息的发送方当前正在跟我聊天


$(".chat-box-window").append(msg_item_ele);


} else {


//消息发送者当前没打开聊天框,消息暂存内存


if(GLOBAL_CHAT_RECORD_DIC【callback【i】.type】【callback【i】.from】){


GLOBAL_CHAT_RECORD_DIC【callback【i】.type】【callback【i】.from】 += msg_item_ele;


}else {


GLOBAL_CHAT_RECORD_DIC【callback【i】.type】【callback【i】.from】 = msg_item_ele;


}


}//end if


}//enf for


3.2.测试发送


3.2.1.贾岛没有在线的情况下发送


发送消息给贾岛:


贾岛不在线:


贾岛收取:


4.未读消息数量显示及取消


4.1.未读消息显示


4.1.1.增加新消息提醒


初始状态为隐藏及消息数量为0:


[/span>span class="badge hide"

新消息提醒:


    //新消息提醒


//var contact_ele = $(".list-group li【contact-type='single'】").filter("li【contact-id='3'】")【0】;


var contact_ele = $(".list-group li【contact-type='"+ callback【i】.type +"'】").filter("li【contact-id='"+ callback【i】.from +"'】")【0】;


var current_new_msg_num = $(contact_ele).find(".badge").text();


$(contact_ele).find(".badge").removeClass("hide");


var ckl = $(contact_ele).find(".badge").text(parseInt(current_new_msg_num)+1);


4.1.2.测试新消息提醒


向贾岛发消息:


接收ckl的消息:


4.2.接收消息后,隐藏消息


4.2.1.隐藏消息


//将内容赋予到对话框


$(".chat-box-window").html(new_contact_chat_record)


//消息接收完毕后,隐藏提醒信息


var contact_ele = $(".list-group li【contact-type='"+ contact_type +"'】").filter("li【contact-id='"+ contact_id +"'】");


$(contact_ele).find(".badge").text(0);


$(contact_ele).find(".badge").addClass("hide");


4.2.2.测试消息接收后隐藏


发送消息:


接收消息:


5.群组聊天


5.1.群组展示


5.1.1.前端添加


基本跟用户没有区别,相对应的字段修改为group


[/span>div role="tabpanel" class="tab-pane" id="group-tab"

[/span>ul class="list-group"

{% for group in request.user.userprofile.group_members.select_related %}


[/span>li contact-type="group" contact-id="{ { group.id }}" onclick="OpenChatWindow(this)" class="list-group-item"

[/span>span class="badge hide"

[/span>span class="contact-name"


{% endfor %}




5.1.2.显示群组


5.2.群组发消息


5.2.1.修改view,增加group


@login_required


def send_msg(request):


print(request.POST)


print(request.POST.get("msg"))


print(request.POST.get('data'))


msg_data = request.POST.get('data')


#如果消息存在


if msg_data:


msg_data = json.loads(msg_data)


#消息增加时间蹉


msg_data【'timestamp'】 = time.time()


#如果消息类型为‘single’


if msg_data【'type'】 == 'single':


if not GLOBAL_MSG_QUEUES.get(int(msg_data【"to"】)):


GLOBAL_MSG_QUEUES【int(msg_data【"to"】)】 = queue.Queue()


GLOBAL_MSG_QUEUES【int(msg_data【"to"】)】.put(msg_data)


else:


group_obj = models.WebGroup.objects.get(id=msg_data【'to'】)


for member in group_obj.members.select_related():


#如果字典不存在这个用户的queue


if not GLOBAL_MSG_QUEUES.get(member.id):


GLOBAL_MSG_QUEUES【int(member.id)】 = queue.Queue()


if member.id != request.user.userprofile.id:


GLOBAL_MSG_QUEUES【member.id】.put(msg_data)


5.2.2.前端展示修改


function ParseNewMsgs(callback) {


var current_session_type = $(".chat-box-title").attr("contact-type");


var current_session_id = $(".chat-box-title").attr("contact-id");


for(var i in callback){


console.log(callback【i】);


if(callback【i】.type == 'single'){


var msg_from_contact_id = callback【i】【'from'】;


} else {//如果是group


var msg_from_contact_id = callback【i】【'to'】;


}


// { from: "1", to: "5", type: "single", msg: "\n22", timestamp: 1521081612.0092783 }


var msg_item_ele = "" +


"" + msg_from_contact_id + "" +


"" + callback【i】.timestamp + "" +


"" + callback【i】.msg + "" +


"";


if(callback【i】.from == current_session_id && current_session_type == callback【i】.type){


//此消息的发送方当前正在跟我聊天


$(".chat-box-window").append(msg_item_ele);


} else {


//消息发送者当前没打开聊天框,消息暂存内存


if(GLOBAL_CHAT_RECORD_DIC【callback【i】.type】【msg_from_contact_id】){


GLOBAL_CHAT_RECORD_DIC【callback【i】.type】【msg_from_contact_id】 += msg_item_ele;


}else {


GLOBAL_CHAT_RECORD_DIC【callback【i】.type】【msg_from_contact_id】 = msg_item_ele;


}


}//end if


//新消息提醒


//var contact_ele = $(".list-group li【contact-type='single'】").filter("li【contact-id='3'】")【0】;


var contact_ele = $(".list-group li【contact-type='"+ callback【i】.type +"'】").filter("li【contact-id='"+ msg_from_contact_id +"'】")【0】;


var current_new_msg_num = $(contact_ele).find(".badge").text();


//代码效果参考:http://www.jhylw.com.cn/095532223.html

$(contact_ele).find(".badge").removeClass("hide");

var ckl = $(contact_ele).find(".badge").text(parseInt(current_new_msg_num)+1);


}//enf for


}


5.2.3.测试结果


ckl 发群消息:


贾岛接收群消息:


贾岛回复消息:


贾岛查看消息:


ckl 查看消息:


5.2.4.用户名展示


添加用户名字段:


if (contact_type && contact_id){


var msg_item ={


'from': "{ { request.user.userprofile.id }}",


'from_name':"{ { request.user.userprofile.name }}",


'to' :contact_id,


'type':contact_type,


'msg' : msg_text


};


if(callback【i】.type == 'single'){


var msg_from_contact_id = callback【i】【'from_name'】;


} else {//如果是group


var msg_from_contact_id = callback【i】【'to'】;


}

相关文章
MySQL单表数据不要超过500万行:是经验数值,还是黄金铁律?
原文地址:梁桂钊的博客 博客地址:http://blog.720ui.com 欢迎关注公众号:「服务端思维」。一群同频者,一起成长,一起精进,打破认知的局限性。 今天,探讨一个有趣的话题:MySQL 单表数据达到多少时才需要考虑分库分表?有人说 2000 万行,也有人说 500 万行。
20743 0
|
机器学习/深度学习 数据采集 自然语言处理
|
11月前
|
Web App开发 人工智能 自然语言处理
WebChat:开源的网页内容增强问答 AI 助手,基于 Chrome 扩展的最佳实践开发,支持自定义 API 和本地大模型
WebChat 是一个基于 Chrome 扩展开发的 AI 助手,能够帮助用户理解和分析当前网页的内容,支持自定义 API 和本地大模型。
841 1
|
Ubuntu 网络协议
怎么在Ubuntu系统云服务器搭建自己的幻兽帕鲁服务器?幻兽帕鲁搭建教程
《幻兽帕鲁》是热门开放世界生存游戏,玩家收集并利用“帕鲁”进行多样活动。为享受多人模式,需自建服务器:选云主机(推荐4C/16G/5M起)、装Steamcmd及游戏环境。登录Steam购游戏后,输入服务器地址即可联机畅玩。
355 1
怎么在Ubuntu系统云服务器搭建自己的幻兽帕鲁服务器?幻兽帕鲁搭建教程
|
JavaScript
vue中关于element的el-image 图片预览功能增加一个下载按钮
vue中关于element的el-image 图片预览功能增加一个下载按钮
1459 0
【完美解决】Github action报错remote: Write access to repository not granted.
【完美解决】Github action报错remote: Write access to repository not granted.
|
Linux PHP
Linux环境下安装pecl工具,PHP扩展便捷安装
Linux环境下安装pecl工具,PHP扩展便捷安装
620 0
|
机器学习/深度学习 数据采集 运维
【VLDB】融合transformer和对抗学习的多变量异常检测算法TranAD论文和代码解读
# 一、前言 今天的文章来自VLDB TranAD: Deep Transformer Networks for Anomaly Detection in Multivariate Time Series Data ![](https://ata2-img.oss-cn-zhangjiakou.aliyuncs.com/neweditor/10c1f546-c86d-4bec-b64c-7366
1173 1
【VLDB】融合transformer和对抗学习的多变量异常检测算法TranAD论文和代码解读
table合并单元格 colspan(跨列)和rowspan(跨行)
table合并单元格 colspan(跨列)和rowspan(跨行)
3113 0
|
数据库 索引
深入理解Streamlit中的按钮行为(四):示例与最佳实践(下)
深入理解Streamlit中的按钮行为(四):示例与最佳实践
3132 0