实践:Backbone作前端,Django+Tastypie作后端的简单Web在线聊天室
快速浏览更多在线 Demo
想查看源代码,可以自行F12,或在github中直接查看源码,或者欢迎直接留言。
一、界面设计:
二、数据模型设计
id 每个发言都有一个独立的id由tastypie自动生成
content 发言的内容
username 发言者
date 发言时间
三、前端制作
这里没有用到Backbone的Router,因为这里不需要记录hash记录
1.Div+CSS制作静态页面,这里item-template为每一个发言的模版
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<style type="text/css">
ul, li {
margin:0px;
padding:0px;
list-style:none;
}
body {
}
#wrapper {
width:1000px;
margin:0px auto;
}
#wrapper .header {
width: 100%;
background-color: rgb(46, 177, 232);
}
#wrapper .content {
width: 100%;
}
#wrapper .content .username {
color: red;
}
#wrapper .content .time {
color: orange;
}
#wrapper .content .item_content {
color: blue;
}
#wrapper .content_ul, #wrapper .item {
background-color: rgb(237, 237, 237);
padding: 10px;
}
#wrapper .destroy{
color: green;
font-weight: bold;
cursor: pointer;
}
#wrapper .footer {
width:100%;
float: left;
background-color: rgb(46, 177, 232);
padding: 10px 0px;
}
#wrapper .footer .fl {
width:80%;
float:left;
}
#wrapper .footer .fr{
width:20%;
float:left;
}
#wrapper .footer .fr::after {
clear:both;
}
#new_chat {
width: 100%;
height: 80px;
}
#wrapper .footer .fr_up {
margin-left: 30px;
margin-bottom: 10px;
}
#wrapper .footer .fr_down {
margin-left: 30px;
}
#nickname {
width: 97px;
}
#wrapper .footer .send {
width: 150px;
background-color: green;
display: block;
text-align: center;
padding: 20px;
text-decoration: none;
} </style>
</head>
<body>
<div id="wrapper">
<div class="header">
[ Chat Room Beta 1.0 ]
</div>
<div class="content">
<ul class="content_ul">
</ul>
</div>
<div class="footer">
<div class="fl"><textarea id="new_chat" autofocus></textarea></div>
<div class="fr">
<div class="fr_up">
呢称:<input id="nickname" type="text"/>
</div>
<div class="fr_down">
<button class="send" id="send">发送消息</button>
</div>
</div>
</div>
</div>
<script type="text/template" id="item-template">
<span class="username"><%=username %></span> : <span class="time"><%=date %></span> <a class="destroy">X</a><br />
<span class="item_content"><%=content %></span>
</script> <script src="/static/chatroom/js/vendor/jquery.js"></script>
<script src="/static/chatroom/js/vendor/underscore.js"></script>
<script src="/static/chatroom/js/vendor/backbone.js"></script>
<script src="/static/chatroom/js/models.js"></script>
<script src="/static/chatroom/js/views.js"></script>
</body>
</html>
2.Backbone Models 文件,为了方便,这里把model与collection都放到同一文件了,\static\chatroom\js\models.js
var Chat = Backbone.Model.extend({ urlRoot: '/api/v1/chat/', defualts: {
content: '',
username: '',
date: ''
}, clear: function () {
this.destroy();
}
}); var ChatList = Backbone.Collection.extend({ url: '/api/v1/chat/',
parse: function (response) {
return response.objects;
}, model: Chat });
3.Backbone Views文件,为了方便,参照todoMVC把视图划分为两个,一个是ChatView用于每个发言,一个为AppView用于整体处理,这里把ChatView与AppView都放到同一文件了,\static\chatroom\js\views.js
var chatList = new ChatList;//New 一个Collection下面会用到
var ChatView = Backbone.View.extend({
tagName: 'li',
className: 'item', template: _.template($('#item-template').html()),
events: {
'click .destroy': 'clear'
}, initialize: function () {
_.bindAll(this, 'render', 'remove');
this.model.bind('change', this.render);
this.model.bind('destroy', this.remove);
}, render: function () {
$(this.el).html(this.template(this.model.toJSON()));
This = $(this.el).find('.time');
This.text(This.text().split('.')[0].replace('T',' '));//注意这里tastypie提供的时间格式为:2015-03-01T23:52:26.854388 所以要对时间进行格式化一下
return this;
}, clear: function () {
this.model.clear();
}
}); var AppView = Backbone.View.extend({
el: $('#wrapper'), events: {
"click #send": "say"
}, initialize: function () {
_.bindAll(this, 'addOne', 'addAll');
this.nickname = this.$('#nickname');
this.textarea = this.$("#new_chat"); chatList.bind('add', this.addOne);
chatList.bind('reset', this.addAll);
chatList.fetch();
setInterval(function () {
chatList.fetch({ add: true });
}, 5000);
}, addOne: function (chat) {
//页面所有的数据都来源于server端,如果不是server端的数据,不应添加到页面上
if (!chat.isNew()) {
var view = new ChatView({ model: chat });
this.$(".content_ul").append(view.render().el);
$('.content').scrollTop($(".content_ul").height() + 50);
}
}, addAll: function () {
chatList.each(this.addOne);
}, say: function (event) {
chatList.create(this.newAttributes());
//为了满足IE和FF以及chrome
this.textarea.text('');
this.textarea.val('');
this.textarea.html(''); }, newAttributes: function () { var content = this.textarea.val();
if (content == '') {
content = this.textarea.text();
} return {
content: content,
username: this.nickname.val()
};
}
}); var appView = new AppView;//启动程序
到这里前端代码已经完成。
四、后端处理
这里用Django自带的SQLite作后台数据库
1.Django Model文件-D:\project\mysite\ChatRoom\models.py
from django.db import models class Chat(models.Model):
content = models.CharField(max_length=1024)
username = models.CharField(max_length=1024)
date = models.DateTimeField(auto_now_add=True)
2.配置TastyPie API文件-D:\project\mysite\ChatRoom\api\resources.py
from tastypie.authorization import Authorization
from tastypie import fields
from tastypie.resources import ModelResource
from ChatRoom.models import Chat class ChatResource(ModelResource):
class Meta:
queryset = Chat.objects.all()
resource_name = 'chat'
authorization = Authorization()
fields=['id','username','content','date']
3.Restfull API的Url文件配置-D:\project\mysite\mysite\urls.py
from django.conf.urls import patterns, include, url
from tastypie.api import Api
from ChatRoom.api.resources import ChatResource v1_api = Api(api_name='v1')
v1_api.register(ChatResource()) urlpatterns = patterns('',
url(r'^admin/', include(admin.site.urls)),
url(r'^api/', include(v1_api.urls)),
)
把数据库导好及配置好Tastypie,运行测试,可以正常留言!
参考引用
https://github.com/tastejs/todomvc
实践:Backbone作前端,Django+Tastypie作后端的简单Web在线聊天室的更多相关文章
- Django+Tastypie作后端,Backbone作前端的TodoMVC
TodoMVC是各种js框架入门的比较经典的例子,详细可查看github地址https://github.com/tastejs/todomvc 接着上篇文章, 1,先在github上把backbon ...
- Django+Tastypie作后端,RequireJS+Backbone作前端的TodoMVC
一.配置好环境 接着前一篇的例子,顺带测试一下已下载下来example里面的backbone_require的例子 注意:直接本地用backbone.localStorage插件运行TodoMVC会报 ...
- Go语言实践_实现一(服务器端)对多(客户端)在线聊天室
一.目的 运用Go语言中的goroutine和通道实现一个简单的一个服务器端对多个客户端的在线聊天 软件环境:Goland,Go1.9 代码仓库链接 二.设计思路 与一对一的设计思路类似,就是加了个线 ...
- Go语言实践_实现一(客户端)对一(服务器端)聊天室
一.目的 使用Go语言实现一个服务器端与客户端的聊天室. 软件:Goland,Go1.9 代码仓库地址 二.思路 1,首先启动服务器端,使用listen_socket函数监听IP地址上的客户端连接: ...
- WebSocket 网页聊天室的实现(服务器端:.net + windows服务,前端:Html5)
websocket是HTML5中的比较有特色一块,它使得以往在客户端软件中常用的socket在web程序中也能轻松的使用,较大的提高了效率.废话不多说,直接进入题. 网页聊天室包括2个部分,后端服务器 ...
- python + django + dwebsocket 实现简单的聊天室
使用库dwebsocket,具体参考此处 views.py: from dwebsocket.decorators import accept_websocket,require_websocket ...
- Django 前端通过json 取出后端数据
Django 前端通过json 取出后端数据 前端通过json 取出后端数据 步骤1:后台数据通过 JSON 序列化成字符串a 注意:1.json是1个字符串 2.通过json.dumps('xx ...
- 解决Django+Vue前后端分离的跨域问题及关闭csrf验证
前后端分离难免要接触到跨域问题,跨域的相关知识请参:跨域问题,解决之道 在Django和Vue前后端分离的时候也会遇到跨域的问题,因为刚刚接触Django还不太了解,今天花了好长的时间,查阅了 ...
- 前端angularjs+requirejs+dhtmlx 后端asp.net webapi
享一个前后端分离方案源码-前端angularjs+requirejs+dhtmlx 后端asp.net webapi 一.前言 半年前左右折腾了一个前后端分离的架子,这几天才想起来翻出来分享给大家 ...
随机推荐
- Java初学者笔记
Java初学者笔记 前提:认识汉字,认识英语单词,会用键盘打字 ------------------------------- 端口是什么: --------面向对象编程(OOP) 接口”(Inter ...
- 面试题目——《CC150》递归与动态规划
面试题9.1:有个小孩正在上楼梯,楼梯有n个台阶,小孩一次可以上1阶.2阶或者3阶.实现一个方法,计算小孩有多少种上楼梯的方式. 思路:第4个数是前三个数之和 注意:能不能使用递归,能不能建立一个很大 ...
- CSS选择器优先级总结
CSS三大特性-- 继承. 优先级和层叠. 继承:即子类元素继承父类的样式; 优先级:是指不同类别样式的权重比较; 层叠:是说当数量相同时,通过层叠(后者覆盖前者)的样式. css选择符分类 首先来看 ...
- Shell文件权限和脚本执行
一.预备知识 1.shell的作用 2.常识 (1)Tab键自动补全 使用Terminal时,输入命令的前几个字母,敲tab会自动补全命令或文件名.目录等. 好处:操作速度更快:不容易出错: ...
- gzip的使用
经常会有文件过大,给文件的传输和增添了很多的麻烦,早先得知apach有个base64貌似可以用来压缩文件,但是测试没有什么效果,反而增大了文件的大小.今天了解了java自带的gzip包,如获至宝,超级 ...
- Excel 锁定特定单元格 不允许更改
1.首先,excel默认所有单元格都是被"锁定"的--当"锁定单元格"按钮被激活时. 因此,第一步,选择所有单元格,设置单元格格式,取消"保护&quo ...
- int类型的正负数转换
int aid = -this.id; 不能直接转 必须先赋值给一个变量 int c = this.id; int a = c * (-1); this.id = a;
- JS跨域(ajax跨域、iframe跨域)解决方法及原理详解(jsonp)
这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被 ...
- Visual Studio常用快捷键
1. 代码自动对齐:CTRL+K+F 2. 撤销---使用组合键“Ctrl+Z”进行撤销操作 3. 反撤销---使用组合键“Ctrl+Y”进行反撤销操作 4. 使用组合键“Ctrl+J”或者使用组合键 ...
- 无阻塞加载js,防止因js加载不了影响页面显示
浏览器加载静态资源和js的方式都是线性加载,所以一般情况可以将js放到</body>前,防止UI线程的阻塞. 而某些时候我们既希望js在整个网页的头部就加载,又担心js阻塞导致网站加载缓慢 ...