点赞

  • 点赞的过程:数字增加,并在后台点赞表记录数据

  • 需要发过去的数据:用户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)--点赞与评论树的更多相关文章

  1. 抽屉之Tornado实战(1)--分析与架构

    抽屉之Tornado实战(1)--分析与架构   项目模拟地址:http://dig.chouti.com/ 知识点应用: AJAX  用于偷偷发请求 原生ajax jQuery  ajax($.aj ...

  2. 抽屉之Tornado实战(9)--装饰器实现用户登录状态验证

    当然今天讲的验证,不只Tornado会用,以后用到web框架都会用到,最常见的场景就是只有用户登陆了才能执行某些操作,所以在执行这些操作前要先做登陆状态的验证. 比如:点赞,发布,评论等需要验证,都需 ...

  3. 抽屉之Tornado实战(2)--数据库表设计

    经过我们上次分析,数据库要有最基本的四张表,用户表,消息表,类型表,点赞表,评论表,接下来我们看着怎么设计吧 首先我们要清楚,表设计的代码是写在models下的 用户表 #一张表对应一个类 class ...

  4. 抽屉之Tornado实战(6)--session工厂(工厂方法模式)

    我之前写的session一般保存在服务器的内存里,那可以保存在缓存,或是数据库,那问题来了,不同地方,保存方式是不同的,所以需要定义不同的类,cache/redis/memcached类 sessio ...

  5. 抽屉之Tornado实战(7)--form表单验证

    在这里,我们把form表单验证的代码进行工具化了,以后稍微修改一下参数就可以拿来用了 先贴上代码 forms.py from backend.form import fields class Base ...

  6. 抽屉之Tornado实战(4)--发帖及上传图片

    对于链接,点击获取标题时,本质发送ajax请求,然后去链接抓取信息,发布又是发送ajax请求 发布信息,还要有发布者的信息,并在信息表需要记录发布者的用户名,发布者的头像,发布者的id,而这些信息可以 ...

  7. 抽屉之Tornado实战(3)--注册

    知识点应用:标签绑定事件,jQuery获取用户值-->AJAX发送数据-->后台路由系统-->业务逻辑处理-->ORM数据操作-->write返回-->AJAX回调 ...

  8. Tornado实战

    抽屉之Tornado实战(1)--分析与架构 抽屉之Tornado实战(2)--数据库表设计 抽屉之Tornado实战(3)--注册 抽屉之Tornado实战(4)--发帖及上传图片 抽屉之Torna ...

  9. tornado web高级开发项目之抽屉官网的页面登陆验证、form验证、点赞、评论、文章分页处理、发送邮箱验证码、登陆验证码、注册、发布文章、上传图片

    本博文将一步步带领你实现抽屉官网的各种功能:包括登陆.注册.发送邮箱验证码.登陆验证码.页面登陆验证.发布文章.上传图片.form验证.点赞.评论.文章分页处理以及基于tornado的后端和ajax的 ...

随机推荐

  1. docker内程序如何读取dockerfile和compose.yml中设置的环境变量

    docker内程序如何读取dockerfile和compose.yml中设置的环境变量 背景 compose文件中配置了服务A和服务B,其中B服务调用了A服务的接口,那么B的实现代码中该如何调用A的服 ...

  2. java框架篇---hibernate(一对多)映射关系

    一对多关系可以分为单向和双向. 一对多关系单向 单向就是只能从一方找到另一方,通常是从主控类找到拥有外键的类(表).比如一个母亲可以有多个孩子,并且孩子有母亲的主键作为外键.母亲与孩子的关系就是一对多 ...

  3. Oracle同一个用户下启动多个数据库实例

     oracle@yingxiang-testServer1 oradata]$ export ORACLE_SID=APPDB[oracle@yingxiang-testServer1 oradata ...

  4. 【iCore4 双核心板】4.3寸液晶模块程序发布

    一.说明 1.本资料包程序包含两部分,"CAPTURE"为液晶显示截图,"tft4.3"为ARM程序. 2.此程序只适合iCore4液晶模块. 3.iCore4 ...

  5. 前端项目微金所1 - bootstrap模板,Compatible(兼容),Viewport(视口),条件注释,第三方依赖,MediaQuery媒体查询

    前端项目微金所笔记1 基础的bootstrap模板 <!DOCTYPE html> <html lang="en"> <head> <me ...

  6. github管理开发代码流程

    首先.通过github网站新建一个仓库,得到仓库地址 https://github.com/piercalex/a.git 接着回到客户端,打开git shell: //在客户端配置账户信息 git ...

  7. centos6.5安装mongodb2.6

    下载地址:http://www.mongodb.org/downloads 解压命令:tar zxf mongodb-linux-i686-2.6.0.tgz 存放目录:/usr/local/mong ...

  8. 【12月21日】A股滚动市盈率PE历史新低排名

    2010年01月01日 到 2018年12月21日 之间,滚动市盈率历史新低排名.上市三年以上的公司,2018年12月21日市盈率在300以下的公司. 1 - 厦门象屿(SH600057) - 历史新 ...

  9. 深入理解 Java 虚拟机之学习笔记(2)

    本节介绍 Java堆的OutOfMemoryError测试 Eclipse Memory Analyzer分析内存溢出 虚拟机栈和本地方法栈StackOverflowError测试 方法区和运行时常量 ...

  10. 史上最简洁的UITableView Sections 展示包含NSDicionary 的NSArray

    这个最典型的就是电话本,然后根据A-Z分组, 当然很多例子,不过现在发现一个很简洁易懂的: 1. 准备数据,定义一个dictionary来显示所有的内容,这个dictionary对应的value全是数 ...