Springboot项目-评论+分类页面+标签页面
2020-08-02 15:38
148 查看
1.实体类、Service层设计
首先要完成comment相关的类
[code]package com.whut.news.po; import javax.persistence.*; import java.util.ArrayList; import java.util.Date; import java.util.List; @Entity @Table(name = "t_comment") public class Comment { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String nickname; private String email; private String content; private String avatar; @Temporal(TemporalType.TIMESTAMP) private Date createTime; @ManyToOne private News news; @OneToMany(mappedBy = "parentComment") private List<Comment> replyComments = new ArrayList<>(); @ManyToOne private Comment parentComment; private boolean adminComment; public Comment(){ } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getNickname() { return nickname; } public void setNickname(String nickname) { this.nickname = nickname; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public String getAvatar() { return avatar; } public void setAvatar(String avatar) { this.avatar = avatar; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } public News getNews() { return news; } public void setNews(News news) { this.news = news; } public List<Comment> getReplyComments() { return replyComments; } public void setReplyComments(List<Comment> replyComments) { this.replyComments = replyComments; } public Comment getParentComment() { return parentComment; } public void setParentComment(Comment parentComment) { this.parentComment = parentComment; } public boolean isAdminComment() { return adminComment; } public void setAdminComment(boolean adminComment) { this.adminComment = adminComment; } @Override public String toString() { return "Comment{" + "id=" + id + ", nickname='" + nickname + '\'' + ", email='" + email + '\'' + ", content='" + content + '\'' + ", avatar='" + avatar + '\'' + ", createTime=" + createTime + ", news=" + news + ", replyComments=" + replyComments + ", parentComment=" + parentComment + ", adminComment=" + adminComment + '}'; } }
CommentRepository设计如下:
[code]package com.whut.news.dao; import com.whut.news.po.Comment; import org.springframework.data.domain.Sort; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; public interface CommentRepository extends JpaRepository<Comment,Long> { List<Comment> findByNewsIdAndParentCommentNull(Long newId, Sort sort); }
CommentService设计如下:
[code]package com.whut.news.service; import com.whut.news.po.Comment; import java.util.List; public interface CommentService { List<Comment> listCommentByNewId(Long newId); Comment saveComment(Comment comment); }
CommentServiceImpl设计如下:
[code]package com.whut.news.service.impl; import com.sun.org.apache.regexp.internal.RE; import com.whut.news.dao.CommentRepository; import com.whut.news.po.Comment; import com.whut.news.service.CommentService; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Date; import java.util.List; @Service public class CommentServiceImpl implements CommentService { @Autowired private CommentRepository commentRepository; @Override public List<Comment> listCommentByNewId(Long newId){ Sort sort = Sort.by("createTime"); List<Comment> comments = commentRepository.findByNewsIdAndParentCommentNull(newId,sort); return eachComment(comments); } private List<Comment> eachComment(List<Comment> comments){ List<Comment> commentsView = new ArrayList<>(); for (Comment comment: comments){ Comment c = new Comment(); BeanUtils.copyProperties(comment,c); commentsView.add(c); } //合并评论的各层子代到第一级子代集合中 combineChildren(commentsView); return commentsView; } private void combineChildren(List<Comment> comments){ for (Comment comment:comments){ List<Comment> replys1 = comment.getReplyComments(); for (Comment reply1 : replys1){ //循环迭代,找出子代,存放在临时tempReplys中 recursively(reply1); } comment.setReplyComments(tempReplys); //清除临时存放区 tempReplys = new ArrayList<>(); } } private List<Comment> tempReplys = new ArrayList<>(); private void recursively(Comment comment){ tempReplys.add(comment); if (comment.getReplyComments().size()>0){ List<Comment> replys = comment.getReplyComments(); for (Comment reply:replys){ tempReplys.add(reply); if (reply.getReplyComments().size()>0){ recursively(reply); } } } } @Override public Comment saveComment(Comment comment) { Long parentCommentId = comment.getParentComment().getId(); if (parentCommentId!=-1){ comment.setParentComment(commentRepository.findById(parentCommentId).orElse(null)); } else { comment.setParentComment(null); } comment.setCreateTime(new Date()); return commentRepository.save(comment); } }
2.controller层设计
一、CommentCotroller设计如下
[code]package com.whut.news.web; import com.whut.news.po.Comment; import com.whut.news.po.User; import com.whut.news.service.CommentService; import com.whut.news.service.NewService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import javax.servlet.http.HttpSession; @Controller public class CommentController { @Autowired private CommentService commentService; @Autowired private NewService newService; private String avatar = "https://tse4-mm.cn.bing.net/th/id/OIP.yweHqHF6IQl7i5yusCTwQQHaHa?pid=Api&rs=1"; @GetMapping("/comments/{newId}") public String comments(@PathVariable Long newId, Model model){ model.addAttribute("comments",commentService.listCommentByNewId(newId)); return "new::commentList"; } @PostMapping("/comments") public String post(Comment comment, HttpSession session){ Long newId = comment.getNews().getId(); comment.setNews(newService.getNew(newId)); User user = (User) session.getAttribute("user"); if (user!= null){ comment.setAdminComment(true); comment.setAvatar(avatar); } commentService.saveComment(comment); // System.out.println(commentService.saveComment(comment)); return "redirect:/comments/"+newId; } }
二、TypeShowController设计如下
[code]package com.whut.news.web; import com.whut.news.po.Type; import com.whut.news.service.NewService; import com.whut.news.service.TypeService; import com.whut.news.vo.NewQuery; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.web.PageableDefault; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import java.util.List; @Controller public class TypeShowController { @Autowired private TypeService typeService; @Autowired private NewService newService; @GetMapping("/types/{id}") public String types(@PageableDefault(size = 8,sort = {"updateTime"},direction = Sort.Direction.DESC) Pageable pageable, @PathVariable Long id, Model model){ List<Type> types = typeService.listTypeTop(20); if (id==-1){ id = types.get(0).getId(); } NewQuery newQuery = new NewQuery(); newQuery.setTypeId(id); model.addAttribute("types",types); model.addAttribute("page",newService.listNew(pageable,newQuery)); model.addAttribute("activeTypeId",id); return "types"; } }
三、ShowTagController设计如下
[code]package com.whut.news.web; import com.whut.news.po.Tag; import com.whut.news.service.NewService; import com.whut.news.service.TagService; import com.whut.news.vo.NewQuery; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.web.PageableDefault; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import java.util.List; @Controller public class TagShowController { @Autowired private NewService newService; @Autowired private TagService tagService; @GetMapping("/tags/{id}") public String tags(@PageableDefault(size = 8,sort = {"updateTime"},direction = Sort.Direction.DESC) Pageable pageable, @PathVariable Long id, Model model){ List<Tag> tags = tagService.listTagTop(20); if (id==-1){ id = tags.get(0).getId(); } NewQuery newQuery = new NewQuery(); newQuery.setTypeId(id); model.addAttribute("tags",tags); model.addAttribute("page",newService.listNew(id,pageable)); model.addAttribute("activeTagId",id); return "tags"; } }
三、总结
今天的主要内容是要把评论显示出来,但麻烦的是评论是一层套一层的,存在递归的可能性,所以需要递归查找相应评论所在的位置,刷新的时候不需要刷新整个页面,只需要刷新对应评论区的fragment就够了。总的来说内容不算难。
相关文章推荐
- 中软国际实训十一:SpringBoot项目——评论+分类、标签页面实现
- spring boot新闻管理项目——评论功能和按标签、类型显示新闻
- 中软国际实训八:SpringBoot项目——分类管理+标签管理
- Spring Boot 完成首页的分类与标签页面,实现跳转拦截
- spring boot项目标签管理+分类管理
- SpringBoot 2.0.5整合eureka时项目启动时进入不了Eureka的web管理页面。。。
- spring boot项目页面不能跳转
- springBoot项目打包部署后页面代码没有更新
- IDEA中创建SpringBoot项目和标签报红解决方法
- springboot freemarker页面引入shiro标签
- springboot项目打包部署外部Tomcat访问页面时出现ErrorPageFilter异常
- SpringBoot项目访问任意接口跳转到login登录页面
- 基于IDEA的springboot项目使用templates的页面出现中文乱码的情况的解决方法
- springboot项目找不到css,js资源,页面报错404
- spring boot项目整合activiti后,打开页面需要验证
- spring boot项目:新闻类别和标签的增删改查实现
- Vue项目部署在Spring Boot出现页面空白问题的解决方案
- 基于spring boot实现评论和分类功能
- 评论+分类页面+标签页面
- SpringBoot项目如何访问jsp页面的示例代码