zoukankan      html  css  js  c++  java
  • 抽屉之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
    • 刚开始看到的新闻是没有评论数据的,只有点击了后才有,本质上就偷偷发了请求给后台,然后把评论数据返回显示在页面上
  • 相关阅读:
    Android收起虚拟键盘
    可收缩的TextView
    fragment的生命周期
    自定义闹钟 Reminder
    自定义 匹配文本框
    ManipulationStarted,ManipulationCompleted,ManipulationDelta
    wp———跳转系统设置页面的wifi、网络连接、蓝牙、飞行模式等
    [MySQL] 一致性读分析
    [MySQL] AUTO_INCREMENT lock Handing in InnoDB
    Chubby lock service for distributed system
  • 原文地址:https://www.cnblogs.com/zcok168/p/9797765.html
Copyright © 2011-2022 走看看