抽屉之Tornado实战(5)--点赞与评论树
点赞
点赞的过程:数字增加,并在后台点赞表记录数据
需要发过去的数据:用户id,新闻id
用户id从session里获得,那新闻id怎么获取呢?这想到分页是循环新闻列表来展示内容,循环的新闻id可以做为参数传入事件中(在事件里发送ajax请求),看前端代码:
<div class="content-list" id="content_list">
{% for item in new_list %}
<div class="item">
<a onclick="Favor(this,{{item.nid}})">点赞9</a>
</div>
{% end %}
</div>点赞数就在后台根据新闻id去统计对应的客户id数(点赞表中 )或者在新闻表在加一个字段--点赞数(favor_count),每次点了赞加个1
没点赞的,点了+1,点了赞的,再点-1
代码实现:
1、后端render+ list【新闻1,新闻2...】 前端{{% for item in new_list %}} 点赞标签绑定onclick=‘func(this,{{item.nid}})’
2、js:后台会返回一个操作编码,让前端判断,是加1操作,还是减1操作
function DoFavor(ths,nid){
//nid 新闻id
//只有登录状态才能发送点赞ajax请求
//获取特定登陆状态标签的属性值
if($('#action_nav').attr('is-login') == 'true'){
$.ajax({
url:'/favor',
type:'POST',
data:{news_id:nid},
dataType:'json',
success:function(arg){
if(arg.status){
//获取新闻点赞数显示标签
var $favorCount = $("#favor_count_"+nid);
//获取点赞数
var c = parseInt($favorCount.text());
if(arg.code == 2301){
//更新显示
$favorCount.text(c+1);
//给点赞图像加上活动状态
$(ths).find('span').addClass("active");
//加动态效果
AddFavorAnimation(ths);
}else if(arg.code == 2302){
//更新显示
$favorCount.text(c-1);
//给点赞图像去除活动状态
$(ths).find('span').removeClass('active');
//动画效果
}
}
}
})
}
}
3、后台判断处理
class FavorHandler(BaseRequestHandler):
#装饰器主要做了一件---对用户登陆状态进行验证,如果没登录,就不会执行post方法
@decrator.auth_login_json
def psot(self,*args,**kwargs):
#这对象相当于以前的字典,用封装错误信息,数据,状态
rep = BaseResponse()
news_id = self.get_argument("news_id",None)
if not news_id:
rep.summary = '新闻ID不能为空'
else:
user_info_id = self.session['user_info']['nid']
#创建链接
conn = ORM.session
#去数据库看看有没有已经点赞
has_favor = conn.query(ORM.Favor).filter(ORM.Favor.user_info_id == user_info_id,
ORM.Favor.news_id == new_id).count()
#如果已赞,再点就是取消赞
if has_favor:
#取消赞就去点赞表里把那条数据删除
conn.query(ORM.Favor).filter(ORM.Favor.user_inro_id == user_info_id,
ORM.Favor.news_id == news_id).delete()
#并在新闻表里修改点赞数-1
conn.query(ORM.News).filter(ORM.News.nid == news_id).update(
{"favor_count":ORM.News.favor_count - 1},synchronize_session='evaluate'
)
#设置编码
rep.code = StatusCodeEnum.FavorMinus
#如果没赞,加赞
else:
#给点赞表增加数据
conn.add(ORM.Favor(user_info_id=user_info_id,news_id=news_id,ctime=datetime.datetime.now))
#给新闻表的点赞跟新+1
conn.query(ORM.News).filter(ORM.News.nid == news_id).update(
{'favor_count':ORM.News.favor_count + 1},synchronize_session='evaluate'
)<br> rep.code = StatusCodeEnum.FavorPlus
conn.commit()
conn.close()
rep.status = True
self.write(json.dumps(rep.__dict__))
4、配置编码
FavorPlus = 2301
FavorMinus = 2302 class BaseRespinse: def __init__(self):
self.status = False
self.code = StatusCodeEnum.Success
self.data = None
self.summary = None
self.message = {}
评论树
- 评论树默认不展开,点击后展开,display:None
- 刚开始看到的新闻是没有评论数据的,只有点击了后才有,本质上就偷偷发了请求给后台,然后把评论数据返回显示在页面上
抽屉之Tornado实战(5)--点赞与评论树的更多相关文章
- 抽屉之Tornado实战(1)--分析与架构
抽屉之Tornado实战(1)--分析与架构 项目模拟地址:http://dig.chouti.com/ 知识点应用: AJAX 用于偷偷发请求 原生ajax jQuery ajax($.aj ...
- 抽屉之Tornado实战(9)--装饰器实现用户登录状态验证
当然今天讲的验证,不只Tornado会用,以后用到web框架都会用到,最常见的场景就是只有用户登陆了才能执行某些操作,所以在执行这些操作前要先做登陆状态的验证. 比如:点赞,发布,评论等需要验证,都需 ...
- 抽屉之Tornado实战(2)--数据库表设计
经过我们上次分析,数据库要有最基本的四张表,用户表,消息表,类型表,点赞表,评论表,接下来我们看着怎么设计吧 首先我们要清楚,表设计的代码是写在models下的 用户表 #一张表对应一个类 class ...
- 抽屉之Tornado实战(6)--session工厂(工厂方法模式)
我之前写的session一般保存在服务器的内存里,那可以保存在缓存,或是数据库,那问题来了,不同地方,保存方式是不同的,所以需要定义不同的类,cache/redis/memcached类 sessio ...
- 抽屉之Tornado实战(7)--form表单验证
在这里,我们把form表单验证的代码进行工具化了,以后稍微修改一下参数就可以拿来用了 先贴上代码 forms.py from backend.form import fields class Base ...
- 抽屉之Tornado实战(4)--发帖及上传图片
对于链接,点击获取标题时,本质发送ajax请求,然后去链接抓取信息,发布又是发送ajax请求 发布信息,还要有发布者的信息,并在信息表需要记录发布者的用户名,发布者的头像,发布者的id,而这些信息可以 ...
- 抽屉之Tornado实战(3)--注册
知识点应用:标签绑定事件,jQuery获取用户值-->AJAX发送数据-->后台路由系统-->业务逻辑处理-->ORM数据操作-->write返回-->AJAX回调 ...
- Tornado实战
抽屉之Tornado实战(1)--分析与架构 抽屉之Tornado实战(2)--数据库表设计 抽屉之Tornado实战(3)--注册 抽屉之Tornado实战(4)--发帖及上传图片 抽屉之Torna ...
- tornado web高级开发项目之抽屉官网的页面登陆验证、form验证、点赞、评论、文章分页处理、发送邮箱验证码、登陆验证码、注册、发布文章、上传图片
本博文将一步步带领你实现抽屉官网的各种功能:包括登陆.注册.发送邮箱验证码.登陆验证码.页面登陆验证.发布文章.上传图片.form验证.点赞.评论.文章分页处理以及基于tornado的后端和ajax的 ...
随机推荐
- npm错误:Error: listen EADDRNOTAVAIL
错误 Error: listen EADDRNOTAVAIL 127.0.0.1:8080 有两种情况 8080端口被绑定了 地址错误 Error: getaddrinfo ENOTFOUND 域名错 ...
- cocos2d-x 重力感应
本文没你想象的那么,,复杂.事实上就是通过重力感应控制个小球移动而已. 先看头文件: #ifndef __HELLOWORLD_SCENE_H__ #define __HELLOWORLD_SCENE ...
- 【emWin】例程二十九:窗口对象——Messagebox
简介: 使用MESSAGEBOX 小工具可在带有标题栏和“确定”按钮(必须按下才能关闭窗口)的 框架窗口中显示消息.本实验通过点击下图中的按键来创建一个Messagebox对话框. 触摸校准(上电可选 ...
- PaaS 应用引擎
这里主要是梳理一下应用引擎(XXXX App Engine),它一般被归类到PaaS领域.应用引擎即提供了各种编程语言开发的应用所需的一整套运行环境:它开箱即用,你只需部署应用的代码即可,无需前期的环 ...
- [转]理解下DMA/NorFlash/DDR下的Burst是个什么概念
DMA传送不经过CPU的控制,假如硬盘的数据不能经过DMA控制器读到内存,那么每完成一次将硬盘的数据读出来,再存放到内存的操作,都要通过CPU运行几条读写指令来完成,这时CPU就做不了别的事了,如果有 ...
- CAS (15) — CAS 线上环境 Ehcache Replication 的非稳定重现错误 java.util.ConcurrentModificationException
CAS (15) - CAS 线上环境 Ehcache Replication 的非稳定重现错误 摘要 线上环境在 EhCache Replication 过程中出现 java.util.Concur ...
- Genymotion模拟器出现INSTALL_FAILED_NO_MATCHING_ABIS 的解决办法
下载插件: http://files.cnblogs.com/files/feijian/genymotion-arm-translation_v1.1.zip 步骤: 将模拟器运行起来,然后将下载好 ...
- 【转帖】2015年2月份最佳的免费 UI 工具包
2015年2月份最佳的免费 UI 工具包 设计师们最喜欢 UI 工具包,这是一种思路拓展的方法,同时可以利用它们来解决各种复杂的项目,同时可用来了解其他设计师的风格.这里我们收集了最近这一个月一些最棒 ...
- Java8学习笔记(八)--方法引入的补充
在Java8学习笔记(三)--方法引入中,简要总结了方法引入时的使用规则,但不够完善.这里补充下几种情况: 从形参到实例方法的实参 示例 public class Example { static L ...
- QT QQuickView嵌入到QT MDI中
在学习QT的过程中发现有一个特别炫酷的行星例子“planets”,有两种实现版本: 一种是基于Qt 3D QML(planets-qml),另一种则是基于Quick和强大的Three.js(plane ...