抽屉之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
  • 刚开始看到的新闻是没有评论数据的,只有点击了后才有,本质上就偷偷发了请求给后台,然后把评论数据返回显示在页面上
原文地址:https://www.cnblogs.com/zcok168/p/9797765.html