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)
bbs--点赞的更多相关文章
- BBS项目分布搭建四(点赞点踩及评论功能准备)
BBS项目分布搭建四(点赞点踩及评论功能) 1. 点赞点踩样式准备 # 在base.html文件中 head标签内 添加css模块: {% block css %} {% endblock %} # ...
- python自动化开发-[第二十二天]-bbs多级评论、点赞、上传文件
今日概要: 1.related_name和related_query_name的区别 2.through_fields的用途 3.django的事务提交 4.点赞的动画效果 5.多级评论的原理 6.上 ...
- bbs项目实现点赞和评论的功能
一.点赞功能 思路是这样的: 1.对点赞和踩都设置一个相同的class,然后对这个class绑定点击事件 2.点击触发ajax请求,我们对赞的标签设置了一个class属性,对踩的标签没有设置这个cla ...
- BBS - 文章详细页、点赞、踩灭
一.文章详细页 文章详细页:1.链接:<div><h5><a href="/blog/{{ article.user.username }}/articles/ ...
- BBS论坛 文章详情、点赞、评论
六.文章详情.点赞.评论 文章详情页面: def article_detail(request, username, article_id): # user_obj = models.UserInfo ...
- day74 bbs项目☞点赞与评论
目录 一.文章详情展示 1 将侧边栏做成inclusion_tag 二.点赞点踩功能 三.评论功能 整体总结: 在出现bug的时候,先判断是前端bug还是后端bug,再判断bug错误类型,以及报错信息 ...
- [deviceone开发]-心形点赞动画示例
一.简介 这个示例展示do_Animator组件的简单使用,通过点击"点赞"按钮,不断弹出心形图片,向上动画漂移到顶部消失.间隔时间和上下左右移动的步长都是一定范围的随机值.二.效 ...
- Python之路【第十八篇】Django小项目简单BBS论坛部分内容知识点
开发一个简单的BBS论坛 项目需求: 整体参考“抽屉新热榜” + “虎嗅网” 实现不同论坛版块 帖子列表展示 帖子评论数.点赞数展示 在线用户展示 允许登录用户发贴.评论.点赞 允许上传文件 帖子可被 ...
- python 学习笔记二十 django项目bbs论坛
项目:开发一个简单的BBS论坛 需求: 整体参考“抽屉新热榜” + “虎嗅网” 实现不同论坛版块 帖子列表展示 帖子评论数.点赞数展示 在线用户展示 允许登录用户发贴.评论.点赞 允许上传文件 帖子可 ...
- [deviceone开发]-直播APP心形点赞动画示例
一.简介 这个示例展示do_Animator组件的简单使用,通过点击"点赞"按钮,不断弹出心形图片,向上动画漂移到顶部消失.间隔时间和上下左右移动的步长都是一定范围的随机值. 二. ...
随机推荐
- shell习题第16题:查用户
[题目要求] 写个shell,看看你的Linux系统中是否有自定义的用户(普通用户),如有有的话统计个数 [核心要点] CentOS6,uid>=500 CentOS7,uid>=1000 ...
- Path.Combine(
// 获取程序的基目录. var dir1 = System.AppDomain.CurrentDomain.BaseDirectory; // 获取模块的完整路径. var dir2 = Syste ...
- javascript——获取元素方式
//1:依据id //var element = document.getElementById("test"); console.log(element); //2:依据clas ...
- WebApi 空项目生成帮助文档
1.创建一个WebApi的空项目 2.写一些接口,在接口文档中忽略某个方法可以使用 [ApiExplorerSettings(IgnoreApi = true)] 特性 3.在Nuget中添加 Mi ...
- 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 ...
- mysql 添加grant权限
GRANT USAGE ON *.* TO 'xxxx'@'x.%.%.%' WITH GRANT OPTION;
- # 机器学习算法总结-第四天(SKlearn/数据处理and特征工程)
总结: 量纲化(归一化,标准化) 缺失值处理(补0.均值.中值.众数.自定义) 编码/哑变量:忽略数字中自带数学性质(文字->数值类型) 连续特征离散化(二值化/分箱处理)
- 流媒体服务器搭建 ffmpeg + nginx
第一部分: mkdir ~/working 切换到~/working目录下 cd ~/working 获取nginx源码: wget http://nginx.org/download/nginx-1 ...
- Java BIO、NIO、AIO 基础,应用场景
Java对BIO.NIO.AIO的支持: Java BIO : 同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必 ...
- WebLogic 12c Linux 命令行 静默安装
CentOS 6.3安装配置Weblogic 10 http://www.linuxidc.com/Linux/2014-02/96918.htm Oracle WebLogic 11g 安装部署文 ...