bbs--点赞
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)
最新文章
- s5pv210 cpu运行debian
- ON DUPLICATE KEY UPDATE重复插入时更新
- react7 react 三目运算
- win7 64位DCOM配置(关于导出excel 配置计算机组件服务)(转)
- scp lost connection
- UIView的layoutSubviews和drawRect方法
- Centos JAVA Eclipse
- 通过java反射得到javabean的属性名称和值参考
- js 的数学处理方法
- Cannot declare class app\home\controller\Cases because the name is already in use
- Citrix 桌面虚拟化解决方案与VMware桌面虚拟化解决方案对比
- ubuntu11.04安装nginx+php+mysql
- VSCode 配置并使用less
- 守护模式,互斥锁,IPC通讯,生产者消费者模型
- 通过随机数获得学生成绩,并把每个元素赋值为学生的分数成绩,通过增强for循环遍历结果。
- learning ddr write leveling
- C语言中内存分配问题:
- ASP.NET MVC 使用Redis共享Session
- tensorflow显存管理
- 2018.09.30 bzoj2288:生日礼物(贪心+线段树)