设为首页 收藏本站
查看: 382|回复: 0

六、BBS只点赞点踩如何是实现

[复制链接]
累计签到:505 天
连续签到:1 天
发表于 2022-11-12 12:35:48 | 显示全部楼层 |阅读模式
点赞点踩思路构建前端如何区分用户是点赞还是点踩了,笨方法:直接写两个事件绑定,这样代码冗余
进阶方法:1、给各点赞和点踩的标签各绑定一个事件
    两个标签对应的代码一模一样,仅仅是否点赞点踩这一个参数不一样而已<script>
    //给所有的action类绑定事件
    $('.action').click(function (){
        alert($(this).hasClass('diggit'))
    })
</script>
前端代码HTML部分{#    点赞点踩样式开始#}
<div class="clearfix">
    <div id="div_digg" >
        <div class="diggit action" >  # 加action类
            <span class="diggnum" id="digg_count">{{ article_obj.up_num }}</span>
        </div>
        <div class="buryit action" > 加action类
            <span class="burynum" id="bury_count">{{ article_obj.down_num }}</span>
        </div>
        <div class="clear"></div>
        <div class="diggword" id="digg_tips" style="color: red"> # ajax添加报错信息
        </div>
    </div>
</div>
{#    点赞点踩样式结束#}
前端代码JS部分{% block js %}
   
<script>
    // 给所有的action类绑定事件
        $('.action').click(function (){
            
{#alert($(this).hasClass('diggit'))#}
            let isUp = $(this).hasClass('diggit'); 判断类有没有点赞的属性,js的布尔值
            let $div = $(this); 为了实现查找点赞点踩的数据动态展示
            // 朝后端发送ajax请求
            $.ajax({
               
url:'/up_or_down/',
                type:'post',
                data:{
                    
'article_id':'{{ article_obj.pk }}',
                    'is_up':isUp,#后端接收的是字符串类型
                    'csrfmiddlewaretoken':'{{csrf_token}}',
                },
                success:function (args){
                    
// 前端返回不用的点赞逻辑
                    if(args.code==1000){
                        
$('#digg_tips').text(args.msg)
                        
// 前端获取到数字加1
                        // 想获取到前端的数字
                        let oldNum = $div.children().text()
                        $div.
children().text(Number(oldNum)+1)// 字符串的拼接1+1=11 11+1=111,所以一定要先转换类型

                    }else{
                        
$('#digg_tips').html(args.msg) 为什么用HTML:因为要给用户返回一个可以登录的页面,后端传了A标签
                    }
                }
            })
        })
{% endblock %}
后端代码import json
from django.db.models import F
def up_or_down(request):
   
"""
    1.校验用户是否登陆
    2.判断当前文章是否是当前用户自己写的(自己不能点自己的文章)
    3.当前用户是否已经给当前文章点过了
    4.
操作数据库了
    :param request:
    :return:
    """
    if request.is_ajax():
        back_dic = {
'code':1000,'msg':''}
        
# 1 先判断当前用户是否登陆
        if request.user.is_authenticated(): # 前面用了auth模块的auth.login(request,user_obj)
            article_id = request.POST.get(
'article_id')
            is_up = request.POST.get(
'is_up') # 在前端是布尔值,但是传到后端变成字符串需要自己转换
            # print(is_up,type(is_up))  # true <class 'str'>
            is_up = json.loads(is_up)  # 记得转换
            # print(is_up, type(is_up))  # True <class 'bool'>
            # 2 判断当前文章是否是当前用户自己写的  根据文章id查询文章对象 根据文章对象查作者 根request.user比对
            article_obj = models.Article.objects.filter(pk=article_id).first()
            
if not article_obj.blog.userinfo == request.user: 这个我也没搞懂为什么 article_obj.blog.userinfo 可以拿到用户的对象
                # 3 校验当前用户是否已经点了      哪个地方记录了用户到底点没点
                is_click = models.UpAndDown.objects.filter(user=request.user,article=article_obj)
               
if not is_click:
                    
# 4 操作数据库 记录数据      要同步操作普通字段
                    # 判断当前用户点了赞还是踩 从而决定给哪个字段加一
                    if is_up:
                        
# 给点赞数加一
                        models.Article.objects.filter(pk=article_id).update(up_num = F('up_num') + 1) 用到了F拿到数据结果的方法
                        back_dic['msg'] = '点赞成功'
                    else:
                        
# 给点踩数加一
                        models.Article.objects.filter(pk=article_id).update(down_num=F('down_num') + 1) 用到了F拿到数据结果的方法
                        back_dic[
'msg'] = '点踩成功'
                    # 操作点赞点踩表 保存结果
                    models.UpAndDown.objects.create(user=request.user,article=article_obj,is_up=is_up)
               
else:
                    back_dic[
'code'] = 1001
                    back_dic['msg'] = '你已经点过了,不能再点了'  # 这里你可以做的更加的详细 提示用户到底点了赞还是点了踩
            else:
                back_dic[
'code'] = 1002
                back_dic['msg'] = '你个臭不要脸的!'
        else:
            back_dic[
'code'] = 1003
            back_dic['msg'] = '请先<a href="/login/">登陆</a>'
        return JsonResponse(back_dic)


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-1002692-1-1.html 上篇帖子: 感谢大佬分享的Django百度网盘 下篇帖子: 七、BBS根评论与子评论如何实现
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表