玩命加载中 . . .


springboot博客(八)(后端之留言板)

留言板

效果图

功能分析

  1. 和评论类似
  2. 对站点进行留言,回复
  3. 留言显示
    1. 查询留言列表的时候,需要将留言和回复加以区分,根据留言功能来看,有父留言、子留言(回复),并且父子留言在前端显示的位置有不同,这里细说一下查询:
      • 根据id为“-1”和博客id查询出所有父留言(父级留言id为‘-1’)
      • 根据父留言的id查询出一级子回复
      • 根据子回复的id循环迭代查询出所有子集回复
      • 将查询出来的子回复放到一个集合中

步骤

  1. 编写repository

    public interface MessageRepository extends JpaRepository<Message,Long> {
        //查找父级留言
        List<Message> findAllByParentMessageNull(Sort sort);
    }
    
  2. 编写service

    //查找留言信息
    List<Message> listMessage();
    //保存留言信息
    Message saveMessage(Message message);
    
    @Override
    public List<Message> listMessage() {
        Sort sort = new Sort(Sort.Direction.DESC,"createTime");
        List<Message> parentMessage = messageRepository.findAllByParentMessageNull(sort);//查找父级留言
        return eachMessage(parentMessage);//调用方法
    }
    
    @Override
    public Message saveMessage(Message message) {
        Long parentMessageId = message.getParentMessage().getId();//前端传来的是-1或者回复是传来的父id
        //前端只传来的id,我们需要存放的是message对象,所以进行以下操作
        if(parentMessageId != -1){
            //有父级
            message.setParentMessage(messageRepository.findOne(parentMessageId));
        }else{
            message.setParentMessage(null);
        }
        message.setCreateTime(new Date());
        Message m = messageRepository.save(message);
        return m;
    }
    /*
        将数据另外存在一个list中,避免改变表中数据
         */
    private List<Message> eachMessage(List<Message> parents){
        List<Message> messageView = new ArrayList<>();
        for (Message parent : parents){//遍历父留言
            Message m = new Message();
            BeanUtils.copyProperties(parent,m);
            messageView.add(m);//加到集合中
        }
        combineChildren(messageView);//调用方法
        return messageView;
    }
    /*
        遍历所有一级子回复
         */
    private void combineChildren(List<Message> messages){
        for(Message parent: messages){//遍历父留言
            List<Message> firstChilds = parent.getReplayMessage();//获得一级子留言
            for(Message firstChild : firstChilds){//遍历子留言
                recursively(firstChild);//调用方法
            }
            parent.setReplayMessage(temReplys);//将所有子留言,加入到父留言中
            temReplys = new ArrayList<>();//清空临时存放子留言的集合
        }
    }
    private List<Message> temReplys = new ArrayList<>();//临时存放子留言的集合
    
    private void recursively(Message firstChild){
        temReplys.add(firstChild);//将一级子留言存放进临时集合中
        if(firstChild.getReplayMessage().size()>0){//如果一级子留言还有子留言
            List<Message> nextChilds = firstChild.getReplayMessage();//获得二级子留言
            for(Message nextChild : nextChilds){//遍历二级子留言
                if(nextChild.getReplayMessage().size()>0){//如果二级子留言还有子留言
                    recursively(nextChild);//迭代(二级加入临时集合中,再看有没有更多的子留言)
                }
            }
        }
    }
    
  3. 编写controller

    @Value("${comment.avatar}")
    private String avatar;
    
    /*
        跳转到留言页面
         */
    @GetMapping("/message")
    public String message(){
        return "message";
    }
    
    /*
        片段刷新
         */
    @GetMapping("/messagecomment")
    public String messageComment(Model model){
        model.addAttribute("messages",messageService.listMessage());
        return "message :: messageList";
    }
    
    /*
        保存留言
         */
    @PostMapping("/message")
    public String post(Message message, HttpSession session){
        User user = (User) session.getAttribute("user");
        if(user != null){
            //是管理员
            message.setAvatar(user.getAvatar());
            message.setAdminMessage(true);
        }else{
            message.setAvatar(avatar);
        }
        messageService.saveMessage(message);
        return "redirect:/messagecomment";
    }
    
  4. 前端渲染

    ```html


文章作者: 小苏
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小苏 !
评论
 上一篇
在SpringBoot中用SpringAOP实现日志记录功能 在SpringBoot中用SpringAOP实现日志记录功能
Aop配置方式、requestContextHolder的使用,request能获取的信息,通知参数joinpoint能获取的信息
2020-12-05
下一篇 
springboot博客(七)(后端之音乐盒/前端页面优化) springboot博客(七)(后端之音乐盒/前端页面优化)
springboot博客(七)(后端之音乐盒/前端页面优化篇),这里是音乐盒模块的搭建,包括后端和前端渲染,及一些前端页面的优化
2020-12-02
  目录