数据层
数据库设计:
entity_type:评论的目标类别,比如1代表帖子,2代表评论。
entity_id:帖子的id。
target_id:评论的Id(用于做楼中楼回复),具有指向性的。
@Mapper
public interface CommentMapper {
List<Comment> selectCommentByEntity(int entityType,int entityId,int offset,int limit);//查询帖子的评论,还是评论的评论
int selectCountByEntity(int entityType,int entityId);
}
业务层
处理查询评论的业务、处理查询评论数量的业务
@Service
public class CommentService {
@Autowired
private CommentMapper commentMapper;
public List<Comment> findCommentByEntity(int entityType,int entityId,int offset,int limit){
return commentMapper.selectCommentByEntity(entityType,entityId,offset,limit);
}
public int findCommentByCount(int entityType,int entityId){
return commentMapper.selectCountByEntity(entityType,entityId);
}
}
表现层
显示帖子详情数据,同时在外循环中嵌套显示该帖子评论对应回复的数据
@RequestMapping(path = "/detail/{discussPostId}",method = RequestMethod.GET)
public String getDiscussPost(@PathVariable("discussPostId") int discussPostId, Model model, Page page){
//查询帖子
DiscussPost post = discussPostService.findDiscussPostById(discussPostId);
model.addAttribute("post",post);
//作者
User user = userService.findUserById(post.getUserId());
model.addAttribute("user",user);
//评论的分页信息
page.setLimit(5);
page.setPath("/discuss/detail/"+discussPostId);
page.setRows(post.getCommentCount());
//得到当前帖子的所有评论
//给帖子的评论:评论
//给评论的评论:回复
//这里是评论的列表
List<Comment> commentList =
commentService.findCommentByEntity(ENTITY_TYPE_POST, post.getId(), page.getOffset(), page.getLimit());
//View Object List
List<Map<String,Object>> commentVoList = new ArrayList<>();
if (commentList != null){
for (Comment comment :commentList){
//每次遍历创建一个map用于呈现封装的数据
//map 是一个评论的VO
Map<String, Object> commentVo = new HashMap<>();
//往VO中添加评论和作者
commentVo.put("comment",comment);
commentVo.put("user",userService.findUserById(comment.getUserId()));
//在这里,查询回复
List<Comment> replyList = commentService.findCommentByEntity(
ENTITY_TYPE_COMMENT, comment.getId(), 0, Integer.MAX_VALUE
);
//声明 回复 的VO列表
List<Map<String,Object>> replyVoList = new ArrayList<>();
if (replyList != null){
for (Comment reply : replyList){
Map<String,Object> replyVo = new HashMap<>();
//回复
replyVo.put("reply",reply);
//作者
replyVo.put("user",userService.findUserById(reply.getUserId()));
//回复有指向性
//查询到回复目标的User
User target = reply.getTargetId() == 0 ? null : userService.findUserById(reply.getTargetId());
replyVo.put("target",target);
//装入集合中
replyVoList.add(replyVo);
}
}
//上面的内循环处理了一个评论中的回复
//所以这里要把replyVoList装进去
commentVo.put("replys",replyVoList);
//装入回复数量
int replyCount = commentService.findCommentByCount(ENTITY_TYPE_COMMENT, comment.getId());
commentVo.put("replyCount",replyCount);
//整个在装进去
commentVoList.add(commentVo);
}
}
model.addAttribute("comments",commentVoList);
return "/site/discuss-detail";
}