抽屉之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‘
                )          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
  • 刚开始看到的新闻是没有评论数据的,只有点击了后才有,本质上就偷偷发了请求给后台,然后把评论数据返回显示在页面上

原文地址:https://www.cnblogs.com/xinsiwei18/p/5869717.html

时间: 2024-11-08 18:33:44

抽屉之Tornado实战(5)--点赞与评论树的相关文章

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

当然今天讲的验证,不只Tornado会用,以后用到web框架都会用到,最常见的场景就是只有用户登陆了才能执行某些操作,所以在执行这些操作前要先做登陆状态的验证. 比如:点赞,发布,评论等需要验证,都需要用到if self.session['is_login']进行判断,你可能觉得,这代码也不多啊,不过一旦网站大了,场景多了,可以写到你手抽筋,其实我们可以在执行post方法或get方法之前进行登陆状态的验证,用装饰器进行这么一个功能扩充就可以了 decrator.py #处理刷新页面的请求 def

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

项目模拟地址:http://dig.chouti.com/ 知识点应用: AJAX  用于偷偷发请求 原生ajax jQuery  ajax($.ajax) iframe伪造 上传文件 传统Form 弊端:会刷新页面   提醒:enctype='multiprt/form-data'记住这个特殊的设置 ajax上传:FormData方式(不是所有的浏览器都支持),Form表单+iframe(兼容性好) session  依赖cookie 验证码   基于session来做 Form验证 分页 数

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

经过我们上次分析,数据库要有最基本的四张表,用户表,消息表,类型表,点赞表,评论表,接下来我们看着怎么设计吧 首先我们要清楚,表设计的代码是写在models下的 用户表 #一张表对应一个类 class UserInfo(Base): #把表名赋给静态字段 __tablename__ = 'userinfo' #序号nid,用户名username,密码password,邮箱email,创建时间ctime #一行数据就是一个对象 nid = Column(Integer, primary_key=T

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

我之前写的session一般保存在服务器的内存里,那可以保存在缓存,或是数据库,那问题来了,不同地方,保存方式是不同的,所以需要定义不同的类,cache/redis/memcached类 session.py import config from hashlib import sha1 import os import time create_session_id = lambda: sha1(bytes('%s%s' % (os.urandom(16), time.time()), encod

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

对于链接,点击获取标题时,本质发送ajax请求,然后去链接抓取信息,发布又是发送ajax请求 发布信息,还要有发布者的信息,并在信息表需要记录发布者的用户名,发布者的头像,发布者的id,而这些信息可以通过session获得(前提是设置session要设置了这些信息) 对于文字,没什么好说的,就一个发布时需要发送ajax请求 对于图片,选择图片和上传图片一起做,即选择完图片,图片就上传到后台,并且在页面上展示图片效果,本质上也是偷偷发请求,而且绑定不是常见的onclick事件,而是onchange

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

知识点应用:标签绑定事件,jQuery获取用户值-->AJAX发送数据-->后台路由系统-->业务逻辑处理-->ORM数据操作-->write返回-->AJAX回调函数接收-->页面效果显示 第一步:我们要给前端的获取验证码按钮绑定一个onclick事件--发送邮件验证码 找到views下home  index.html找到标签,onclick=SendCode(this) 定义事件,获取邮箱,发送ajax请求 jQuery代码如下: function SendC

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

在这里,我们把form表单验证的代码进行工具化了,以后稍微修改一下参数就可以拿来用了 先贴上代码 forms.py from backend.form import fields class BaseForm: def __init__(self): self._value_dict = {} self._error_dict = {} self._valid_status = True def valid(self, handler): for field_name, field_obj in

Tornado实战

抽屉之Tornado实战(1)--分析与架构 抽屉之Tornado实战(2)--数据库表设计 抽屉之Tornado实战(3)--注册 抽屉之Tornado实战(4)--发帖及上传图片 抽屉之Tornado实战(5)--点赞与评论树 抽屉之Tornado实战(6)--session工厂(工厂方法模式) 抽屉之Tornado实战(7)--form表单验证 抽屉之Tornado实战(8)--发布新闻 抽屉之Tornado实战(9)--装饰器实现用户登录状态验证

爬虫学习---基础操作--抽屉新热榜自动点赞与豆瓣自动统一短评

爬虫的学习相对来说,比较烦锁,因为网站的反爬规则,经过两天的研究,终于搞定了抽屉新热榜自动点赞与豆瓣自动统一短评(豆瓣登录的验证码目前需要手动输入) 抽屉网的规则问题 示例如下: 1 import requests,re 2 from bs4 import BeautifulSoup 3 headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0' 4