Django项目--web聊天室
需求
做一个web聊天室,主要练习前端ajax与后台的交互:
一对一聊天和群组聊天
添加用户为好友
搜索并添加群组
管理员可以审批用户加群请求,群管理员可以有多个,群管理员可以删除,添加禁言群友
与聊天室里的人进行临时会话
可以在群组中发图片
可以与好友一对一发文件
知识点
1、多对多关联self,要有related_name=,null=true在多对多不起作用;
2、一张表有2个字段同时多对多一张表,会冲突,起一个关联名称 related_name =
3、textarea不能拖拉,resize: none;
4、js获取时间,d=new Date(); d.getHours().....
5、css样式'overflow:auto;'自动滚动,jQuery有滑动效果animate();
6、查询多对多结果以列表形式,select_related()
7、js获取csrf-token,ajax传到后台 ,页面中加{% csrf-token %},ajax获取input[name='csrfmiddlewaretoken']
8、Django队列,queue
9、jQuery定时器,取消息 setInterval()
10、浏览器存聊天记录 ,定义一个全局字典存起来。
11、js中判断字典是否有key,dict.hasOwnProperty(key)
11、递归函数最大迭代1000层,溢出会报错;ajax中递归与python的区别在于它会执行完函数的剩余部分再递归。
12、Django登录装饰器 @login_required
项目步骤
后台,利用models创建数据库表,包括表(userinfo.friends字段 ,chatgroups表)
进入后台admin页面,添加用户和群组等
前端页面设计,这里继承自前一章的BBS项目index.html
发送消息,js
分组标签,bootstrap
联系人全部获取,ajax
加入组的显示,ajax
切换正在聊天的对话框,onclick
发送消息时传给后台,js,SendMSG
后台解析消息,并放到Django队列,Django--queue
收信人收消息,ajax,get
处理队列列表,谁发的消息
收到的消息显示在对话框
阻塞住连接,阻塞等待队列中有消息
对话框按用户显示聊天记录
显示接收未读条数
群组聊天,复用单人聊天代码
登录验证
关键知识点
models:多对多关系
1
friends = models.ManyToManyField('self',related_name='friend',blank=True,null=True)
1
2
3
4
class ChatGroups(models.Model):
members = models.ManyToManyField(UserInfo,related_name='group_members',blank=True) #null=true在ManyToManyField字段不起作用
admin = models.ManyToManyField(UserInfo) #有其它多对多字段也同时关联了同样的字段,会冲突,所以要加一个related_name=
。。。。。。
webchat.html:获取键盘输入
1
2
3
4
5
6
7
8
9
10
11
$(function(){
$('body').delegate('textarea','keydown',function(e){
if(e.which == 13){
var input = $('textarea').val();
if($.trim(input).length > 0 ){
//SendMSG(input);
} //end if
$('textarea').val('');
} //endif
});//end delegate
}) //end document
js获取时间
1
2
3
4
5
function js_date(){
var date_obj = new Date();
var time = date_obj.getHours()+':'+date_obj.getMinutes()+':'+date_obj.getSeconds()
console.log(time);
}
滑动框动画效果
1
2
3
$(".chat-body").animate({
scrollTop:$(".chat-body")[0].scrollHeight
},500);
获取当前发送消息人姓名
1
2
'from':"{{ request.user.userinfo.id }}",
'from_name':"{{ request.user.userinfo.nickname }}",
js获取csrf-token
1
{% csrf_token %}
1
2
3
function CsrfToken(){
return $('input[name="csrfmiddlewaretoken"]').val();
}
1
2
3
def send_msg(request):
print request.POST.get('data')
#{"contact_type":"single_contact","to":"3","from":"7","from_name":"陈一","msg":"ss"}
后台,利用models创建数据库表,包括表(userinfo.friends字段 ,chatgroups表)
进入后台admin页面,添加用户和群组等
前端页面设计,这里继承自前一章的BBS项目index.html
发送消息,js
分组标签,bootstrap
联系人全部获取,ajax
加入组的显示,ajax
切换正在聊天的对话框,onclick
发送消息时传给后台,js,SendMSG
后台解析消息,并放到Django队列,Django--queue
收信人收消息,ajax,get
处理队列列表,谁发的消息
收到的消息显示在对话框
阻塞住连接,阻塞等待队列中有消息
对话框按用户显示聊天记录
显示接收未读条数
群组聊天,复用单人聊天代码
登录验证
models:多对多关系
|
1
|
friends = models.ManyToManyField('self',related_name='friend',blank=True,null=True) |
|
1
2
3
4
|
class ChatGroups(models.Model): members = models.ManyToManyField(UserInfo,related_name='group_members',blank=True) #null=true在ManyToManyField字段不起作用 admin = models.ManyToManyField(UserInfo) #有其它多对多字段也同时关联了同样的字段,会冲突,所以要加一个related_name= 。。。。。。 |
webchat.html:获取键盘输入
|
1
2
3
4
5
6
7
8
9
10
11
|
$(function(){ $('body').delegate('textarea','keydown',function(e){ if(e.which == 13){ var input = $('textarea').val(); if($.trim(input).length > 0 ){ //SendMSG(input); } //end if $('textarea').val(''); } //endif });//end delegate}) //end document |
js获取时间
|
1
2
3
4
5
|
function js_date(){ var date_obj = new Date(); var time = date_obj.getHours()+':'+date_obj.getMinutes()+':'+date_obj.getSeconds() console.log(time); } |
滑动框动画效果
|
1
2
3
|
$(".chat-body").animate({ scrollTop:$(".chat-body")[0].scrollHeight},500); |
获取当前发送消息人姓名
|
1
2
|
'from':"{{ request.user.userinfo.id }}",'from_name':"{{ request.user.userinfo.nickname }}", |
js获取csrf-token
|
1
|
{% csrf_token %} |
|
1
2
3
|
function CsrfToken(){ return $('input[name="csrfmiddlewaretoken"]').val();} |
|
1
2
3
|
def send_msg(request): print request.POST.get('data') #{"contact_type":"single_contact","to":"3","from":"7","from_name":"陈一","msg":"ss"} |
还可以通过cookie获取csrf,或者通过插件。具体参考《csrf-token》
登录验证
settings
|
1
|
LOGIN_URL = '/login/' |
views
|
1
2
3
4
5
|
from django.contrib.auth.decorators import login_required@login_requireddef function(request): ...... |
Django项目--web聊天室的更多相关文章
- Python开发一个WEB聊天室
项目实战:开发一个WEB聊天室 功能需求: 用户可以与好友一对一聊天 可以搜索.添加某人为好友 用户可以搜索和添加群 每个群有管理员可以审批用户的加群请求,群管理员可以用多个,群管理员可以删除.添加. ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(十二) 代码重构使用反射工厂解耦(一)缓存切换
前言 上一篇中,我们用了反射工厂来解除BLL和UI层耦合的问题.当然那是最简单的解决方法,再复杂一点的程序可能思路相同,但是在编程细节中需要考虑的就更多了,比如今天我在重构过程中遇到的问题.也是接下来 ...
- web聊天室
开发一个web聊天室 功能需求: 1.用户可以与好友一对一聊天 2.群聊 所需知识 1.Django 2.bootstrap 3.CSS 4.ajax 涉及到的新的知识点 1.如果设计表结构的时候,一 ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(零) 前言
前端时间听一个技术朋友说 LayIM 2.0 发布了,听到这个消息抓紧去官网看了一下.(http://layim.layui.com/)哎呀呀,还要购买授权[大家支持一下哦],果断买了企业版,喜欢钻研 ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(一) 之 基层数据搭建,让数据活起来(数据获取)
大家好,本篇是接上一篇 ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(零) 前言 ASP.NET SignalR WebIM系列第二篇.本篇会带领大家将 LayIM ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(二) 之 ChatServer搭建,连接服务器,以及注意事项。
上篇:ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(一) 之 基层数据搭建,让数据活起来(数据获取) 上一篇我们已经完成了初步界面的搭建工作,本篇将介绍IM的核心内容 ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(六) 之 Layim源码改造右键菜单--好友、组管理功能的实现。
前言 上一篇中讲解了加好友的流程,本篇将介绍好友管理,群组管理的右键菜单功能.当然由于菜单项目太多,都实现也得花费时间.只讲解一下我是如何从不知道怎么实现右键菜单到会自定义菜单的一个过程.另外呢,针对 ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(十) 之 自定义系统消息和总结
前言 本篇主要讲解一个东西,就是我们自定义系统消息.效果如下: 首先我们要做的准备工作就是改写 layim 的消息模板,如果不改的话就成为某个用户发送的消息了,那么体验就稍微差一些.找到模板我们看一下 ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室 实战系列(不断更新中)
项目简介 利用ASP.NET SignalR技术与Layim前端im框架实现的一个简单的web聊天室,包括单聊,群聊,加好友,加群,好友搜索,管理,群组管理,好友权限设置等功能.涉及技术: Elast ...
随机推荐
- GTD时间管理---非行动性
一:行动性和非行动有什么区别? 1:非行动性:指的是收集箱中的信息,是先存储后使用,这些信息平时都处于冬眠状态,只是要用到的时候能够找到它就好了.(偏向于处理生活) 2:行动性: 指的是收集箱中的信息 ...
- HTTP 错误 500.21 - Internal Server Error 处理程序“ExtensionlessUrlHandler-Integrated-4.0”在其模块列表中有一个错误模块“ManagedPipelineHandler”
导致这个错误出现的原因是因为.net Framework4.0没有注册 解决方法:打开运行命令行,运行下面的命令: C:\WINDOWS\Microsoft.NET\Framework\v4.0.30 ...
- 初始zookeeper与集群搭建实例
zookeeper是什么 Zookeeper,一种分布式应用的协作服务,是Google的Chubby一个开源的实现,是Hadoop的分布式协调服务,它包含一个简单的原语集,应用于分布式应用的协作服务, ...
- android:themes.xml
<?xml version="1.0" encoding="utf-8"?> <!-- Copyright (C) 2006 The Andr ...
- HDU 5902 GCD is Funny 数学
GCD is Funny 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5902 Description Alex has invented a ne ...
- windows7实现打印机共享的方法
windows7实现打印机共享的方法和windows xp差不多,就是在下图当中的设置: 具体方法请参照:http://jingyan.baidu.com/article/6d704a13e00a21 ...
- 关于stacking context和CSS z-index的总结
HTML中决定元素叠加顺序的CSS属性最有名的应该是z-index了.但是,往往在项目中发现有些情况和我们的预期不太一致.经过研究和学习,总算搞清楚了其中的关系.简单总结如下: 只有Positione ...
- 彩色的Shell
我常在命令行下工作,以前老被同事说"你整天在那个黑窗口上倒腾什么?" 现在这个问题变成了"你这个花花绿绿的窗口是什么东西?" 其实都是同一个东西:一个兼容于xterm的终端窗口,要么是PuTTY/Ki ...
- c++算法应用 预备
章 C + +程序设计 大家好!现在我们将要开始一个穿越" 数据结构.算法和程序" 这个抽象世界的特殊旅程,以解决现实生活中的许多难题.在程序开发过程中通常需要做到如下两点:一是高 ...
- thinking in object pool
1.背景 对象池为了避免频繁创建耗时或耗资源的大对象,事先在对象池中创建好一定数量的大对象,然后尽量复用对象池中的对象,用户用完大对象之后放回对象池. 2.问题 目前纵观主流语言的实现方式无外乎3个步 ...