from comment.comment c
where c.parent_comment_id = #{id}
order by c.create_time desc
select *
from comment.comment c
where c.parent_comment_id = #{childId}
order by c.create_time desc
5. 控制器CommentController
package com.star.controller;
import com.star.entity.Comment;
import com.star.service.CommentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import java.util.List;
/**
-
@Description: 评论控制器
-
@Date: Created in 14:30 2020/4/14
-
@Author: ONESTAR
-
@QQ: 316392836
-
@URL: https://onestar.newstar.net.cn/
*/
@Controller
public class CommentController {
@Autowired
private CommentService commentService;
@Value(“${comment.avatar}”)
private String avatar;
@GetMapping(“/”)
public String comment() {
return “comment”;
}
@GetMapping(“/comment”)
public String comments(Model model) {
List comments = commentService.listComment();
model.addAttribute(“comments”, comments);
return “comment :: commentList”;
}
@PostMapping(“/comment”)
public String post(Comment comment) {
//设置头像
comment.setAvatar(avatar);
if (comment.getParentComment().getId() != null) {
comment.setParentCommentId(comment.getParentComment().getId());
}
commentService.saveComment(comment);
return “redirect:/comment”;
}
}
6. 接口实现类
逻辑都在接口实现类CommentServiceImpl里面实现,咱们来梳理一下逻辑(逻辑没梳理好,代码永远都是乱的,逻辑是第一步!!!),添加评论直接insert就可以了,这里主要讲一下查询:
-
根据id为“-1”查询出所有父评论
-
根据父评论的id查询出一级子回复
-
根据子回复的id循环迭代查询出所有子集回复
-
将查询出来的子回复放到一个集合中
要注意将父评论的姓名给set进去,代码如下:
package com.star.service.impl;
import com.star.dao.CommentDao;
import com.star.entity.Comment;
import com.star.service.CommentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
-
@Description:
-
@Date: Created in 13:44 2020/4/14
-
@Author: ONESTAR
-
@QQ: 316392836
-
@URL: https://onestar.newstar.net.cn/
*/
@Service
public class CommentServiceImpl implements CommentService {
@Autowired
private CommentDao commentDao;
//存放迭代找出的所有子代的集合
private List tempReplys = new ArrayList<>();
/**
-
@Description: 查询评论
-
@Auther: ONESTAR
-
@Date: 17:26 2020/4/14
-
@Param:
-
@Return: 评论消息
*/
@Override
public List listComment() {
//查询出父节点
List comments = commentDao.findByParentIdNull(Long.parseLong(“-1”));
for(Comment comment : comments){
Long id = comment.getId();
String parentNickname1 = comment.getNickname();
List childComments = commentDao.findByParentIdNotNull(id);
//查询出子评论
combineChildren(childComments, parentNickname1);
comment.setReplyComments(tempReplys);
tempReplys = new ArrayList<>();
}
return comments;
}
/**
-
@Description: 查询出子评论
-
@Auther: ONESTAR
-
@Date: 17:31 2020/4/14
-
@Param: childComments:所有子评论
-
@Param: parentNickname1:父评论的姓名
-
@Return:
*/
private void combineChildren(List childComments, String parentNickname1) {
//判断是否有一级子回复
if(childComments.size() > 0){
//循环找出子评论的id
for(Comment childComment : childComments){
String parentNickname = childComment.getNickname();
childComment.setParentNickname(parentNickname1);
tempReplys.add(childComment);
Long childId = childComment.getId();
//查询二级以及所有子集回复
recursively(childId, parentNickname);
}
}
}
/**
-
@Description: 循环迭代找出子集回复
-
@Auther: ONESTAR
-
@Date: 17:33 2020/4/14
-
@Param: childId:子评论的id
-
@Param: parentNickname1:子评论的姓名
-
@Return:
*/
private void recursively(Long childId, String parentNickname1) {
//根据子一级评论的id找到子二级评论
List replayComments = commentDao.findByReplayId(childId);
if(replayComments.size() > 0){
for(Comment replayComment : replayComments){
String parentNickname = replayComment.getNickname();
replayComment.setParentNickname(parentNickname1);
Long replayId = replayComment.getId();
tempReplys.add(replayComment);
//循环迭代找出子集回复
recursively(replayId,parentNickname);
}
}
}
@Override
//存储评论信息
public int saveComment(Comment comment) {
comment.setCreateTime(new Date());
return commentDao.saveComment(comment);
}
}
7. 前端页面comment.html
最后是前端显示页面,这里采用semantic-ui作为UI组件,使用thymeleaf模板解析,记得在static文件夹下创建images文件夹,并放一张名为avatar.png的图片
评论
小红
Today at 5:42PM
愿你走出半生,归来仍是少年!
小白
@ 小红
Today at 5:42PM
你也是!
发布