web页面 之 超人性的点赞与狂踩

点赞

  我们在浏览一些文章或博客的时候,都看到过文章后有个赞或是踩,我们也都支持或是踩过!不知大家有没有这样的体验,就是:你随手点了一下,想撤销都撤不掉!!!哪怕是把鼠标点烂,他就是取消不掉!!!好气哦!有没有!同时一点也不人性化:可以让我取消了,我再点别的啊!或是我随手点错了,你不让我撤销,人家辛辛苦苦写出来的文章看到个踩,让作者怎么想?!所以我就想把这个做成可变动的!苦心专研还真实现了!!!以下就是关于点赞与狂踩的分享!

  鄙人写的这个在HTML模版页面中,使用了font-awesome这个前端组件中的样式!使用时记得要导入哦!!!再者点赞与狂踩JS代码整合成了一个函数!!!

<div class="articles_post_btn">
        <div id="div_digg">
            <div class="thumbs_up" id="ThumbsUp" num="1" onclick="upDown(this);">
                <span class="DiggNums" id="ThumbsCount">{{数据库中的数据,自行动态获取!}}</span>
                <span class="DiggBtn">
                    <i class="fa fa-thumbs-up" aria-hidden="true"></i>点赞</span>
            </div>
            <div class="step_on" id="StepOn" num="0" onclick="upDown(this);">
                <span class="DiggNums" id="StepCount">{{数据库中的数据,自行动态获取!}}</span>
                <span class="DiggBtn">
                    <i class="fa fa-thumbs-down" aria-hidden="true"></i>狂踩</span>
            </div>
            <span id="err" style="color:red;"></span>
        </div>
    </div>
HTML模版页面(赞与踩部分)
div.articles_post_btn{
    width: 97%;
    height:auto!important;
    overflow: hidden;
}

div#div_digg{
    width: 125px;
    height: auto!important;
    margin-top: 10px;
    margin-bottom: 10px;
    margin-left: 84%;
    text-align: center;
    font-size: 12px;
    /*background-color: #b92c28;*/
    position: relative;
    overflow: hidden;
}

div.thumbs_up,div.step_on{
    display: inline-block;
    width: auto!important;
    height: auto!important;
    min-width: 46px;
    min-height: 55px;
    margin-left: 10px;
    margin-top: 2px;
    padding-top:5px;
    text-align: center;
    color: #1b6d85;
    vertical-align: baseline;
    background-color: #f7f7f7;
    border-radius: 3px;
}

span.DiggNums{
    display: block;
    font-size: 14px;
    color: #075db3;
    padding: 3px 0;
    margin-bottom: 5px;
    border-radius: 5px;
}
span#ThumbsCount{
    background-color: #f2dede;
}

span#StepCount{
    background-color: #e3e3e3;
}

span.DiggBtn{
    display: block;
    padding-bottom: 5px;
    font-size: 13px;
    font-weight: 600;
}
赞与踩CSS样式
$(function () {
    var $art_id = $("#arts_id").text();
    var $user_id = $("#user_id").text();
    upDown = function (ths) {
        var num = $(ths).attr("num");
         var csrf = $('input[name="csrfmiddlewaretoken"]').val();
        $.ajax({
             url:"/upordown/",
             // headers:{'X-CSRFToken':$.cookie('csrftoken')},
             type:"POST",
             data:{"num":num,"articles_id":$art_id,"user_id":$user_id,'csrfmiddlewaretoken':csrf},
             dataType:"JSON",
             success:function (arg) {
                if(arg.status){
                    if(num == 1){
                        $("#ThumbsCount").text(arg.counts);
                        $("#err").text("");
                    }else{
                        $("#StepCount").text(arg.counts);
                        $("#err").text("");
                    }
                } else {
                    $("#err").text(arg.message)
                }
             }
         });
    };
        // $("#ThumbsUp").click(function () {
        //      $.ajax({
        //          url:"/upordown/",
        //          type:"POST",
        //          data:{"num":1,"articles_id":$art_id,"user_id":$user_id,csrfmiddlewaretoken:"{{ csrf_token }}"},
        //          dataType:"JSON",
        //          success:function (arg) {
        //             if(arg.status){
        //                 $("#ThumbsCount").text(arg.counts);
        //                 $("#err").text("");
        //             } else {
        //                 $("#rr").text(arg.message)
        //             }
        //          }
        //      })
        // });
        //
        // $("#StepOn").click(function () {
        //     $.ajax({
        //          url:"/upordown/",
        //          type:"POST",
        //          data:{"num":0,"articles_id":$art_id,"user_id":$user_id,csrfmiddlewaretoken:'{{ csrf_token }}'},
        //          dataType:"JSON",
        //          success:function (arg) {
        //             if(arg.status){
        //                 $("#StepCount").text(arg.counts);
        //                 $("#err").text("");
        //             } else {
        //                 $("#err").text(arg.message)
        //             }
        //          }
        //      })
        // });

});
赞与踩单击触发JS,往后台发送请求!
def upordown(request):
    """
    用户点赞及狂踩操作
    :param request: 请求提交的相关信息
    :return: #为页面Ajax返回的信息
    """
    ret = {"status": True, "message": None,"counts":None}
    users = request.session.get("users")
    up = request.POST.get("num")  #从模版传回的信息全部是字符串类型
    article_id = request.POST.get("articles_id")
    comment_id = request.POST.get("user_id")

    if not users: #如果用户未登录
        ret["status"] = False
        ret["message"] = "请先登录再操作!"
        return HttpResponse(json.dumps(ret))
    else: #用户登录 判断是否博客所属是不是当前用户
        user_id = users["nid"]
        if int(user_id) == int(comment_id): #如果是当前用户的话,返回信息 不能自己给自己点赞或踩
            ret["status"] = False
            ret["message"] = "对不起,不能给自己点赞或踩!"
            return HttpResponse(json.dumps(ret))
        else: #如果不是的话,就从数据库中去筛选
            n = models.UpDown.objects.filter(article_id=article_id,user_id=user_id).values("up").first() #从数据表中查询相关信息
            create_dict = {"up": up, "article_id": article_id, "user_id": user_id, }
            if not n:  #判断 如果没有在数据库中找到,则新添加一条数据
                with transaction.atomic(): #事务操作,出错回滚
                    if int(up) == 1:  #是点赞的话,
                        models.UpDown.objects.create(**create_dict) #点赞或是踩表创建一条数据
                        models.Article.objects.filter(nid=article_id).update(up_count=F("up_count")+1) #文章表对应的数据加1
                        currentid = models.Article.objects.filter(nid=article_id).values("up_count").first() #获取对应的数据,返回
                        ret["counts"]=currentid["up_count"]
                    else:  #是狂踩的话,原理同上
                        models.UpDown.objects.create(**create_dict)
                        models.Article.objects.filter(nid=article_id).update(down_count=F("down_count") + 1)
                        currentid = models.Article.objects.filter(nid=article_id).values("down_count").first()
                        ret["counts"] = currentid["down_count"]
                    return HttpResponse(json.dumps(ret))
            else: #如果查询的结果存在的话,说明已经赞或是踩过,判断这两次的操作是否相同
                if int(n["up"]) != int(up): #如果不相同的话,返回信息
                    ret["status"] = False
                    ret["message"] = "已完成赞或踩,不能重复操作!"
                    return HttpResponse(json.dumps(ret))
                else: #如果相同的话,就把对应的操作取消掉!!!
                    with transaction.atomic():  # 事务操作,出错回滚 把对应的点赞或是踩取消
                        if int(up) == 0:  #如果为0的话,就把踩的次数取消
                            models.Article.objects.filter(nid=article_id).update(down_count=F("down_count") - 1)
                            currentid = models.Article.objects.filter(nid=article_id).values("down_count").first()
                            ret["counts"] = currentid["down_count"]
                            models.UpDown.objects.filter(article_id=article_id, user_id=user_id).delete()
                        else:   #如果为1的话,就把赞的次数取消
                            models.Article.objects.filter(nid=article_id).update(up_count=F("up_count") - 1)
                            currentid = models.Article.objects.filter(nid=article_id).values("up_count").first()
                            ret["counts"] = currentid["up_count"]
                            models.UpDown.objects.filter(article_id=article_id, user_id=user_id).delete()
                        return HttpResponse(json.dumps(ret))
后台用于处理前端返回数据的函数
url(r'^upordown/',views.upordown,),
后台路由

 

posted @ 2017-08-07 12:53  细雨蓝枫  阅读(182)  评论(0编辑  收藏  举报