bbs---点赞

需求分析

页面展示

  1 点赞  和   踩灭  按钮展示

1 用户未登录,不处理点赞踩灭,给用户提供登录接口

2 登录

  1 第一次点点赞/踩灭

    1 点赞成功 数据+1 提示点赞成功

    2点赞失败 数据+1 提示踩灭成功

  2 第二/n次点点赞/踩灭

    1 点击点赞/踩灭,提示已点赞/踩灭过 

代码思路

1 html页面结构

页面展示

1 在文章视图函数中传入从orm中查询到的该文章的对象

2 在html中,通过模板语法,取到点赞数和踩灭数

  点赞 {{ article.up_count }}

  踩灭 {{ article.up_count }}

用户点赞/踩灭

1 由于点击不能确定点赞还是踩灭,我们把点赞和踩灭绑定统一个事件--------通过绑定同一个类完成

2 判断用户有没有登录

  没登录:跳转到登录页面,并且把当前的url传过去,方便登录后跳转回来

  登录:执行下面的

3 获取 文章id  用户id 点赞/踩灭

  文章id '{{ article.id }}'

  用户id '{{ request.user.id }}'

  点赞/踩灭:通过获取点赞/踩灭特有的类,能否取到值来判断  然后通过三元运算 赋值 True /False

4 ajax通过post请求把数据传给后端

5 后端 赋值状态码 获取 文章id 用户id 点赞/踩灭状态

  文章id

  用户id

  点赞/踩灭状态:坑1

6 通过文章id 用户id 取值判断用户是否点赞/踩灭过

  未点赞/踩灭过

    赋值状态码 添加点赞/踩灭记录   跟新文章的点赞/踩灭字段  ----------这里要用事务

  点赞/踩灭过

    赋值状态码 和  错误信息 返回

坑:

  1 通过ajax 传的True/False 时‘True’/'False',所以我们要通过三元运算重新赋值True/Flase

实际操作

html

  1. <!-- 点赞 开始-->
  2. <div class="clearfix">
  3. <div id="div_digg">
  4. <!-- 点赞 -->
  5. <div class="diggit digg">
  6. <span class="diggnum" id="digg_count">{{ article.up_count }}</span>
  7. </div>
  8. <!-- 反对 -->
  9. <div class="buryit digg">
  10. <span class="burynum" id="bury_count">{{ article.down_count }}</span>
  11. </div>
  12. <div class="clear"></div>
  13. <!-- 提示信息 -->
  14. <div class="diggword" id="digg_tips"></div>
  15. </div>
  16. </div>
  17. <!-- 点赞 结束-->
  18.  
  19. <script>
  20. // 给点赞和反对按钮绑定点击事件
  21. $(".digg").click(function () {
  22. // 1. 先判断有没有登录?
  23. if (!'{{ request.user.username }}') {
  24. // 如果没有登录就跳转到登录页面
  25. location.href = '/login/?next={{ request.get_full_path }}'
  26. }
  27. // 已经登录可以点赞或反对
  28. var userId = '{{ request.user.id }}';
  29. var articleId = '{{ article.id }}';
  30. // 如何区分是点赞还是反对?
  31. var isUp = $(this).hasClass('diggit');
  32. // 向后端发请求
  33. $.ajax({
  34. url: '/mengmeng/',
  35. type: 'post',
  36. data: {
  37. csrfmiddlewaretoken: $('[name="csrfmiddlewaretoken"]').val(),
  38. userId: userId,
  39. articleId: articleId,
  40. isUp: isUp
  41. },
  42. success: function (res) {
  43. console.log(res);
  44. if (res.code !== 0) {
  45. // 只需要把错误提示显示出来就可以
  46. $("#digg_tips").text(res.msg);
  47. } else {
  48. // 1. 先把点赞数或反对数更新一下
  49. if (isUp) {
  50. // 更新点赞数
  51. var $UpSpan = $("#digg_count");
  52. $UpSpan.text(+$UpSpan.text() + 1);
  53. } else {
  54. var $downSpan = $("#bury_count");
  55. $downSpan.text(+$downSpan.text() + 1)
  56. }
  57. // 2. 再显示提示
  58. $("#digg_tips").text(res.msg);
  59. }
  60. }
  61. })
  62. });
  63. </script>

views

  1. # 点赞
  2. def mengmeng(request):
  3. if request.method == "POST":
  4. res = {"code": 0}
  5. print(request.POST)
  6. user_id = request.POST.get("userId")
  7. article_id = request.POST.get("articleId")
  8. is_up = request.POST.get("isUp")
  9. print(is_up, type(is_up))
  10. is_up = True if is_up.upper() == 'TRUE' else False
  11. # 5.不能给自己点赞
  12. article_obj = models.Article.objects.filter(id=article_id, user_id=user_id)
  13. if article_obj:
  14. # 表示是给自己写的文章点赞
  15. res["code"] = 1
  16. res["msg"] = '不能给自己的文章点赞!' if is_up else '不能反对自己的内容!'
  17.  
  18. # 3.同一个人只能给同一篇文章点赞一次
  19. # 4.点赞和反对两个只能选一个
  20. # 判断一下当前这个人和这篇文章 在点赞表里有没有记录
  21. is_exist = models.ArticleUpDown.objects.filter(user_id=user_id, article_id=article_id).first()
  22. if is_exist:
  23. res["code"] = 1
  24. # 表示已经点赞过或反对过
  25. # if is_exist.is_up == True:
  26. # # 已经点过赞
  27. # res["msg"] = '已经点过赞'
  28. # else:
  29. # # 已经反对过
  30. # res["msg"] = '已经反对过'
  31.  
  32. res["msg"] = '已经点过赞' if is_exist.is_up else '已经反对过'
  33. else:
  34. # 真正点赞
  35. # 注意?
  36. # 事务操作,,
  37. with transaction.atomic():
  38. # 1. 先创建点赞记录
  39. models.ArticleUpDown.objects.create(user_id=user_id, article_id=article_id, is_up=is_up)
  40. # 2. 再更新文章表
  41. if is_up:
  42. # 更新点赞数
  43. models.Article.objects.filter(id=article_id).update(up_count=F('up_count')+1)
  44. else:
  45. # 更新反对数
  46. models.Article.objects.filter(id=article_id).update(down_count=F('down_count') + 1)
  47. res["msg"] = '点赞成功' if is_up else '反对成功'
  48. return JsonResponse(res)

bbs--点赞的更多相关文章

  1. BBS项目分布搭建四(点赞点踩及评论功能准备)

    BBS项目分布搭建四(点赞点踩及评论功能) 1. 点赞点踩样式准备 # 在base.html文件中 head标签内 添加css模块: {% block css %} {% endblock %} # ...

  2. python自动化开发-[第二十二天]-bbs多级评论、点赞、上传文件

    今日概要: 1.related_name和related_query_name的区别 2.through_fields的用途 3.django的事务提交 4.点赞的动画效果 5.多级评论的原理 6.上 ...

  3. bbs项目实现点赞和评论的功能

    一.点赞功能 思路是这样的: 1.对点赞和踩都设置一个相同的class,然后对这个class绑定点击事件 2.点击触发ajax请求,我们对赞的标签设置了一个class属性,对踩的标签没有设置这个cla ...

  4. BBS - 文章详细页、点赞、踩灭

    一.文章详细页 文章详细页:1.链接:<div><h5><a href="/blog/{{ article.user.username }}/articles/ ...

  5. BBS论坛 文章详情、点赞、评论

    六.文章详情.点赞.评论 文章详情页面: def article_detail(request, username, article_id): # user_obj = models.UserInfo ...

  6. day74 bbs项目☞点赞与评论

    目录 一.文章详情展示 1 将侧边栏做成inclusion_tag 二.点赞点踩功能 三.评论功能 整体总结: 在出现bug的时候,先判断是前端bug还是后端bug,再判断bug错误类型,以及报错信息 ...

  7. [deviceone开发]-心形点赞动画示例

    一.简介 这个示例展示do_Animator组件的简单使用,通过点击"点赞"按钮,不断弹出心形图片,向上动画漂移到顶部消失.间隔时间和上下左右移动的步长都是一定范围的随机值.二.效 ...

  8. Python之路【第十八篇】Django小项目简单BBS论坛部分内容知识点

    开发一个简单的BBS论坛 项目需求: 整体参考“抽屉新热榜” + “虎嗅网” 实现不同论坛版块 帖子列表展示 帖子评论数.点赞数展示 在线用户展示 允许登录用户发贴.评论.点赞 允许上传文件 帖子可被 ...

  9. python 学习笔记二十 django项目bbs论坛

    项目:开发一个简单的BBS论坛 需求: 整体参考“抽屉新热榜” + “虎嗅网” 实现不同论坛版块 帖子列表展示 帖子评论数.点赞数展示 在线用户展示 允许登录用户发贴.评论.点赞 允许上传文件 帖子可 ...

  10. [deviceone开发]-直播APP心形点赞动画示例

    一.简介 这个示例展示do_Animator组件的简单使用,通过点击"点赞"按钮,不断弹出心形图片,向上动画漂移到顶部消失.间隔时间和上下左右移动的步长都是一定范围的随机值. 二. ...

随机推荐

  1. shell习题第16题:查用户

    [题目要求] 写个shell,看看你的Linux系统中是否有自定义的用户(普通用户),如有有的话统计个数 [核心要点] CentOS6,uid>=500 CentOS7,uid>=1000 ...

  2. Path.Combine(

    // 获取程序的基目录. var dir1 = System.AppDomain.CurrentDomain.BaseDirectory; // 获取模块的完整路径. var dir2 = Syste ...

  3. javascript——获取元素方式

    //1:依据id //var element = document.getElementById("test"); console.log(element); //2:依据clas ...

  4. WebApi 空项目生成帮助文档

    1.创建一个WebApi的空项目 2.写一些接口,在接口文档中忽略某个方法可以使用  [ApiExplorerSettings(IgnoreApi = true)] 特性 3.在Nuget中添加 Mi ...

  5. Install CUDA 6.0 on Ubuntu 14.04 LTS

    Ubuntu 14.04 LTS is out, loads of new features have been added. Here are some procedures I followed ...

  6. mysql 添加grant权限

    GRANT USAGE ON *.* TO 'xxxx'@'x.%.%.%' WITH GRANT OPTION;

  7. # 机器学习算法总结-第四天(SKlearn/数据处理and特征工程)

    总结: 量纲化(归一化,标准化) 缺失值处理(补0.均值.中值.众数.自定义) 编码/哑变量:忽略数字中自带数学性质(文字->数值类型) 连续特征离散化(二值化/分箱处理)

  8. 流媒体服务器搭建 ffmpeg + nginx

    第一部分: mkdir ~/working 切换到~/working目录下 cd ~/working 获取nginx源码: wget http://nginx.org/download/nginx-1 ...

  9. Java BIO、NIO、AIO 基础,应用场景

    Java对BIO.NIO.AIO的支持: Java BIO : 同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必 ...

  10. WebLogic 12c Linux 命令行 静默安装

    CentOS 6.3安装配置Weblogic 10  http://www.linuxidc.com/Linux/2014-02/96918.htm Oracle WebLogic 11g 安装部署文 ...