项目1在线交流平台-3.开发交流社区核心功能模块-6.添加不同级别评论-事务管理数据

参考牛客网高级项目教程

功能需求及处理策略

在这里插入图片描述 在这里插入图片描述
  • 能够给帖子进行评论-即新增评论
  • 能够给评论进行回复-即新增一级回复
  • 能够给指定的回复进行回复-并能指明向哪个用户的回复

1.dao层处理相关数据

  • 由于,在帖子的数据库表设计时,增加了冗余字段:评论数量
  • 因此,每增加一条帖子的评论,都要更新帖子数据库的评论数量
    • 因此,在业务层要增加事务处理

增加评论数据

接口方法声明
/** 增加评论 */
int insertComment(Comment comment);
sql编写
<sql id="insertFields">
    insert into comment(user_id, entity_type, entity_id, target_id, content, status, create_time)
      values (#{userId}, #{entityType}, #{entityId}, #{targetId}, #{content}, #{status}, #{createTime})
</sql>
<!--    增加评论-->
    <insert id="insertComment" parameterType="comment" keyProperty="id">
        <include refid="insertFields"></include>
    </insert>

更新帖子的评论数量

接口方法声明
/** 更新指定id的帖子的评论数量 */
int updateCommentCount(int id, int commentCount);
sql编写
<!--    更新帖子的评论数量-->
    <update id="updateCommentCount">
        update discuss_post set comment_count = #{commentCount} where id = #{id}
    </update>

2. Service处理-事务管理

  • 先执行添加评论的业务
  • 添加后,要及时更新帖子的评论数量
  • 对这个两个操作添加进一个事务,进行管理,要么都成功,要么失败一个就回滚
  • 注意:只更新帖子的评论数量,评论的评论不包括
/** 处理添加评论的业务-事务管理-更新帖子评论 */
    @Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED)
    public int addComment(Comment comment) {
        // 先添加评论
        // -注意过滤敏感词
        // -业务层,只处理接受来的原材料进行加工入库和查询,如何创造原材料是上级的逻辑
        if(comment == null) {
            throw new IllegalArgumentException("参数不能为空!");
        }
        comment.setContent(HtmlUtils.htmlEscape(comment.getContent()));
        comment.setContent(sensitiveFilter.filter(comment.getContent()));
        int res = commentMapper.insertComment(comment);

        // 在一个事务中,进行更新帖子评论
        // 只更新帖子的评论数量,评论的评论不包括
        if(comment.getEntityType() == ENTITY_TYPE_POST) {
            discussPostMapper.updateCommentCount(comment.getEntityId(),
                    commentMapper.selectComments(ENTITY_TYPE_POST, comment.getEntityId()));
        }

        return res;
    }

3. Controller层处理添加请求

  • 直接用Comment类接受参数,参数中的标签name属性名要和类中的属性名一致即可自动接受

  • 还要对Comment类做一些其他基本设置

    @Controller
    @RequestMapping("/comment")
    public class CommentController implements CommunityConstant {
        @Autowired
        CommentService commentService;
        
        @Autowired
        HostHolder hostHolder;
        
        @RequestMapping(value = "/add/{discussPostId}", method = RequestMethod.POST)
        public String addComment(@PathVariable("discussPostId") int discussPostId, Comment comment) {
            // 除请求中需要写的评论内容外,需提供其他素材
            comment.setCreateTime(new Date());
            comment.setUserId(hostHolder.getUser().getId());
            comment.setStatus(0);
            return "redirect:/discuss/detail/" + discussPostId;
        }
    }
    

4. View层模板页面处理

4.1 对帖子的回复

在这里插入图片描述
RestFul风格路径动态拼接
  • 可以直接用访问帖子详情页面的请求中传入的model数据-post
<form class="replyform" th:method="post" th:action="@{|/comment/add/${post.id}|}">
placeholder
  • 提示语默认显示,当文本框中输入内容时提示语消失
<textarea placeholder="在这里畅所欲言你的看法吧!" name="content"></textarea>
隐藏域
  • type=“hidden”

  • 在浏览器中看不到隐藏域,但是在提交表单时可以看到隐藏域的内容被提交至服务器

  • 可以将一些有用信息传给服务器

    • 访问详情页面请求中传入的model数据-post的id作为entityId
    • 告诉服务器entityType 是帖子
<input type="hidden" name="entityType" value="1">
<input type="hidden" name="entityId" th:value="${post.id}">
submit
  • 使用submit按钮提交,而不是普通的button按钮

  • 几种按钮区别:

    <!--按钮
      value:按钮上的文字
    -->
    <p>
        <!--提交-->
        <input type="submit" value="登录">
        <!--重置--使用-->
        <input type="reset" value="清空">
        <!--普通按钮:一般会和javascript结合使用,点击按钮xxx-->
        <input type="button" value="点我">
        <!--图片按钮
            type="image"
        -->
        <input type="image" src="../statics/images/bd.png">
    </p>
    

4.2 对评论的一级回复

在这里插入图片描述

同样,用表单的post请求
<form method="post" th:action="@{|/comment/add/${post.id}|}">
同样使用隐藏框向服务器提交请求数据
  • 一级回复的entityId
    • 访问详情页面请求中传入的model数据-comments列表中的每一个评论-cvo.comment.id
<input type="text" class="input-size" name="content" placeholder="请输入你的观点"/>
<input type="hidden" name="entityType" value="2">
<input type="hidden" name="entityId" th:value="${cvo.comment.id}">

4.3 对回复的回复

在这里插入图片描述

回复框的层次动态调整
  • 每点击对目标回复的回复,会跳出回复框,且回复框的层次动态调整

  • 需要设定回复框动态id,且能获取这个动态id

    • 设定动态id,根据回复框的遍历次数来设定
    <div th:id="|huifu-${rvoStat.count}|" class="mt-4 collapse">
    
    • 获取这个动态id

      <li class="d-inline ml-2"><a th:href="|#huifu-${rvoStat.count}|" data-toggle="collapse" class="text-primary">回复</a></li>
      
同样,设定post请求表单
<form method="post" th:action="@{|/comment/add/${post.id}|}">
要对指定targetUser回复,提示框内容动态调整
<input type="text" class="input-size" name="content" th:placeholder="|回复${rvo.user.username}|"/>
同样,使用隐藏框向服务器提交数据
  • 注意,非一级的所有回复的entityId都是评论的id,这样,可以根据评论的id查询出关联的所有回复
    • name=“entityId” th:value="${cvo.comment.id}",不是rvo.reply.id
<!--要回复的是当前回复的作者,当前的回复可以从rvo中获取-->
<input type="text" class="input-size" name="content" th:placeholder="|回复${rvo.user.username}|"/>
<input type="hidden" name="entityType" value="2">
<input type="hidden" name="entityId" th:value="${cvo.comment.id}">
<input type="hidden" name="targetId" th:value="${rvo.user.id}">

测试结果

  • 测试添加对帖子的回复

    在这里插入图片描述

  • 测试添加对评论的回复

    在这里插入图片描述

  • 测试对指定回复的回复

    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值