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

    <!-- 点赞 开始-->
<div class="clearfix">
<div id="div_digg">
<!-- 点赞 -->
<div class="diggit digg">
<span class="diggnum" id="digg_count">{{ article.up_count }}</span>
</div>
<!-- 反对 -->
<div class="buryit digg">
<span class="burynum" id="bury_count">{{ article.down_count }}</span>
</div>
<div class="clear"></div>
<!-- 提示信息 -->
<div class="diggword" id="digg_tips"></div>
</div>
</div>
<!-- 点赞 结束--> <script>
// 给点赞和反对按钮绑定点击事件
$(".digg").click(function () {
// 1. 先判断有没有登录?
if (!'{{ request.user.username }}') {
// 如果没有登录就跳转到登录页面
location.href = '/login/?next={{ request.get_full_path }}'
}
// 已经登录可以点赞或反对
var userId = '{{ request.user.id }}';
var articleId = '{{ article.id }}';
// 如何区分是点赞还是反对?
var isUp = $(this).hasClass('diggit');
// 向后端发请求
$.ajax({
url: '/mengmeng/',
type: 'post',
data: {
csrfmiddlewaretoken: $('[name="csrfmiddlewaretoken"]').val(),
userId: userId,
articleId: articleId,
isUp: isUp
},
success: function (res) {
console.log(res);
if (res.code !== 0) {
// 只需要把错误提示显示出来就可以
$("#digg_tips").text(res.msg);
} else {
// 1. 先把点赞数或反对数更新一下
if (isUp) {
// 更新点赞数
var $UpSpan = $("#digg_count");
$UpSpan.text(+$UpSpan.text() + 1);
} else {
var $downSpan = $("#bury_count");
$downSpan.text(+$downSpan.text() + 1)
}
// 2. 再显示提示
$("#digg_tips").text(res.msg);
}
}
})
});
</script>

views

# 点赞
def mengmeng(request):
if request.method == "POST":
res = {"code": 0}
print(request.POST)
user_id = request.POST.get("userId")
article_id = request.POST.get("articleId")
is_up = request.POST.get("isUp")
print(is_up, type(is_up))
is_up = True if is_up.upper() == 'TRUE' else False
# 5.不能给自己点赞
article_obj = models.Article.objects.filter(id=article_id, user_id=user_id)
if article_obj:
# 表示是给自己写的文章点赞
res["code"] = 1
res["msg"] = '不能给自己的文章点赞!' if is_up else '不能反对自己的内容!' # 3.同一个人只能给同一篇文章点赞一次
# 4.点赞和反对两个只能选一个
# 判断一下当前这个人和这篇文章 在点赞表里有没有记录
is_exist = models.ArticleUpDown.objects.filter(user_id=user_id, article_id=article_id).first()
if is_exist:
res["code"] = 1
# 表示已经点赞过或反对过
# if is_exist.is_up == True:
# # 已经点过赞
# res["msg"] = '已经点过赞'
# else:
# # 已经反对过
# res["msg"] = '已经反对过' res["msg"] = '已经点过赞' if is_exist.is_up else '已经反对过'
else:
# 真正点赞
# 注意?
# 事务操作,,
with transaction.atomic():
# 1. 先创建点赞记录
models.ArticleUpDown.objects.create(user_id=user_id, article_id=article_id, is_up=is_up)
# 2. 再更新文章表
if is_up:
# 更新点赞数
models.Article.objects.filter(id=article_id).update(up_count=F('up_count')+1)
else:
# 更新反对数
models.Article.objects.filter(id=article_id).update(down_count=F('down_count') + 1)
res["msg"] = '点赞成功' if is_up else '反对成功'
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. hadoop 》》 django 简单操作hdfs 语句

    >> from django.shortcuts import render # Create your views here. from hdfs.client import Clien ...

  2. Linux (x86) Exploit 开发系列教程之四(使用return-to-libc绕过NX bit)

    (1)原理: “NX Bit”的漏洞缓解:使某些内存区域不可执行,并使可执行区域不可写.示例:使数据,堆栈和堆段不可执行,而代码段不可写. 在NX bit打开的情况下,基于堆栈的缓冲区溢出的经典方法将 ...

  3. [python]近日 用3种库 实现简单的窗口 的回顾~

    最近任务:利用python 实现以下4个窗口弹窗. 信息提示框 文本输入框(需在窗口消失后,返回 用户输入的值) 文件选择(需在窗口消失后, 返回 用户选择的文件名的全路径) 文件夹选择(需在窗口消失 ...

  4. spark异常篇-关闭程序

    在运行 spark 程序时,出于某种原因,我想停止运行,狂按 ctrl+c 不一定起作用 以下两种情况是不好关闭的 1. cluster 运行模式 2. SparkStreaming 程序 本文旨在收 ...

  5. 实例详解jQuery的无new构建

    jQuery的无new构建 jQuery框架的核心就是从HTML文档中匹配元素并对其执行操作. 回想一下使用 jQuery 的时候,实例化一个 jQuery 对象的方法: // 无 new 构造 $( ...

  6. C#通讯框架改写

    现有项目是利用C#的socket与PLC进行实时通讯,PLC有两种通讯模式——常规采集&高频采集. 其中常规采集大概在10ms左右发送一次数据,高频采集大概在2ms左右发送一次数据. 现有代码 ...

  7. 检索 COM 类工厂中 CLSID 为 {13C28AD0-F195-4319-B7D7-A1BDAA329FB8} 的组件失败,原因是出现以下错误: 80040154 没有注册类 (异常来自 HRESULT:0x80040154 (REGDB_E_CLASSNOTREG))。

    上午前客户突然来电说换了台电脑重新装的程序不能正常用,发来错误提示如图: 这错误显然不是程序错误,异常写的很清楚 ,COM组件没注册,搜一下CLSID, 原来是GridReport++ ,参考地址:  ...

  8. 转载:Web安全X-FRAME-OPTIONS 出现两个或多个的原因

    转载:https://blog.csdn.net/Teemo_2016/article/details/82051523 在配置文件中配置了 <httpProtocol>     < ...

  9. aop 的一些表达式

    切入点的表达式 execution(void cn.itcast.e_xml.a_before.UserServiceImpl.saveUser(java.lang.String,java.lang. ...

  10. C#DataGrid列值出现E形式的小数,将DataGrid表格上的数据保存至数据库表时会因格式转换不正确导致报错

    问题描述:在DataGridView中调整金额一列,当输入小数0.000001后会显示1E-6,此时进行保存操作时报错,提示无法将string类型转换成Decimal 原因分析:由于列调整金额为1E- ...