BBS-评论功能

Posted king-home

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BBS-评论功能相关的知识,希望对你有一定的参考价值。

BBS-评论功能

技术图片

前端搭建

1、参考画面,编辑评论区有以下要素:

  • 昵称:

    <p>昵称:<input type="text" id="tbCommentAuthor" class="author" disabled="disabled" size="50" value=" request.user.username "></p>
  • 评论内容:

     <textarea name="" id="id_comment" cols="60" rows="10"></textarea>
  • 提交按钮:

    <button class="btn btn-primary" id="id_submit">提交评论</button>
# 前端品评论区搭建 #

% if request.user.is_authenticated %
    <div>
        <p><span class="glyphicon glyphicon-comment"></span>发布评论</p>
        <p>昵称:<input type="text" id="tbCommentAuthor" class="author" disabled="disabled" size="50"
                     value=" request.user.username "></p>
        <p>评论内容:</p>
        <p>
            <textarea name="" id="id_comment" cols="60" rows="10"></textarea>
        </p>
        <p>
            <button class="btn btn-primary" id="id_submit">提交评论</button>
        </p>
    </div>
% endif %

2、评论楼的页面搭建

  • 后端传送来所有的评论列表:comment_list

技术图片

  • 根据提示例子:

    利用for循环搭建页面吧

    每层的内容固定有

    • 楼层号:
    <span># forloop.counter 楼</span>
    • 发布时间:
    <span> comment.create_time|date:'Y-m-d' </span>
    • 发布用户
    <span><a href="/ comment.user.username /"> comment.user.username </a></span>
    • 回复按钮(涉及到子评论内容)
    <span class="pull-right reply" comment_id=" comment.pk " username=" comment.user.username "><a>回复</a></span>
    • 评论内容

      如果是子评论的话需要在评论内容加上:@+用户名

    <div>
    % if comment.parent %
    <p>@&nbsp; comment.parent.user.username </p>
    % endif %
     comment.content 
    </div>
  • 完整代码

    <ul class="list-group">
        % for comment in comment_list %
            <li class="list-group-item">
                <div>
                    <span># forloop.counter 楼</span>
                    <span> comment.create_time|date:'Y-m-d' </span>
                    <span><a href="/ comment.user.username /"> comment.user.username </a></span>
                    <span class="pull-right reply" comment_id=" comment.pk " username=" comment.user.username "><a>回复</a></span>
                    <div>
                        % if comment.parent %
                        <p>@&nbsp; comment.parent.user.username </p>
                        % endif %
                         comment.content 
                    </div>
                </div>
            </li>
        % endfor %
    
    </ul>

3、前端js代码

  • 提交按钮功能

    • 提交按钮获取所有的数据内容,用户id,评论id通过ajax发送给后端

    • 定义一个全局变量的parentId

    • 注意当为子评论的时候需要对评论的内容进行切分

      if (parentId)
          let indexVal = $content.indexOf('\n') + 1;
          $content = $content.slice(indexVal);
          console.log($content)
      
    • ajax功能编写

      // 评论逻辑代码
      // 定义一个全局的parentId变量名
      let parentId = '';
      $('#id_submit').click(function () 
          // 获取textarea内容
          let $content = $('#id_comment').val();
          // 判断parentId是否有值才能确定是否切内容
          if (parentId)
              let indexVal = $content.indexOf('\n') + 1;
              $content = $content.slice(indexVal);
              console.log($content)
          
          $.ajax(
              url: '/comment/',
              type: 'post',
              data: 
                  'article_id': ' article_obj.pk ',
                  'content': $content,
                  'csrfmiddlewaretoken': ' csrf_token ',
                  'parent_id': parentId,
              ,
              success: function (data) 
                  if(data.code == 100)
                      let userName = ' request.user.username ';
                      let content = $content;
                      let tempStr = `
                      <li class="list-group-item">
                          <div>
                              <span><a href="/$userName/">$userName:</a></span>
                              <p>
                                  $content
                              </p>
                          </div>
                      </li>
                      `;
                      // 查找url标签 添加子元素
                      $(".list-group").append(tempStr);
                      // 将textarea框中的内容清空
                      $('#id_comment').val('');
                      // 将全局的parentId清空
                      parentId = ''
                  
              
          )
      );
  • 回复功能按钮

    • 子评论需要将用户名的加入到textarea中,如何获取人名

      let pUserName = $(this).attr('username');
      let pCommentId = $(this).attr('comment_id');
    • 自动换行

      $('#id_comment').val('@'+pUserName+'\n');
    • 自动对焦

      $('#id_comment').focus();
    • 将全局的parent_id赋值

      parentId = pCommentId;

后端:

  • 获取前端发来的数据

    article_id = request.POST.get("article_id")
    content = request.POST.get('content')
    parent_id = request.POST.get('parent_id')
    
  • 检查用户是否登录

            if request.user.is_authenticated():
                with transaction.atomic():
                    # 在文章表中将普通的评论字段加1
                    models.Article.objects.filter(pk=article_id).update(comment_num = F('comment_num')+1)
                    # 在去评论表存储真正的数据
                    models.Comment.objects.create(user=request.user,article_id=article_id,content=content,parent_id=parent_id)
                back_dic['msg'] = '评论成功'
            else:
                back_dic['code'] = 110
                back_dic['msg'] = '请先登录'
        return JsonResponse(back_dic)

以上是关于BBS-评论功能的主要内容,如果未能解决你的问题,请参考以下文章

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

python小打小闹之简陋版BBS

BBS+Blog项目开发

BBS+Blog项目流程及补充知识点

bbs 第六天 评论 (评论列表展示发表评论)

BBS-文章详情页评论评论树