1.归档
(1)编写NewRepository类
//select date_format(n.update_time,'%Y') from t_news n group by date_format(n.update_time,'%Y') order by date_format(n.update_time,'%Y') desc
@Query("select function('date_format',n.updateTime,'%Y') as year from News n group by year order by year desc")
List<String> findGroupYear();
@Query("select n from News n where function('date_format',n.updateTime,'%Y') = ?1 ")
List<News> findByYear(String year);
(2)编写NewService类
List<Comment> listCommentByNewId(Long newId);
(3)编写NewServiceImpl类
@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){
//循环迭代,找出子代
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);
}
}
}
}
(4)编写ArchiveShowController类
@GetMapping("/comments/{newId}")
public String comments(@PathVariable Long newId, Model model){
model.addAttribute("comments",commentService.listCommentByNewId(newId));
return "new::commentList";
}
(5)界面展示
2.异常处理
(1)编写NotFoundException类
@ResponseStatus(HttpStatus.NOT_FOUND)
public class NotFoundException extends RuntimeException {
public NotFoundException() {
}
public NotFoundException(String message) {
super(message);
}
public NotFoundException(String message, Throwable cause) { //cause 异常原因
super(message, cause);
}
}
(2)编写ControllerExceptionHandler类
@ControllerAdvice
public class ControllerExceptionHandler {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@ExceptionHandler(Exception.class)
public ModelAndView exceptionHandler(HttpServletRequest request, Exception e) throws Exception {
logger.error("Request: URL: {},Exception: {}",request.getRequestURL(),e);
if (AnnotationUtils.findAnnotation(e.getClass(), ResponseStatus.class)!=null){
throw e;
}
ModelAndView mv = new ModelAndView();
mv.addObject("url",request.getRequestURL());
mv.addObject("exception",e);
mv.setViewName("/error/error");
return mv;
}
}
(3)界面展示
3.登录拦截
(1)编写LoginInterceptor类
public class LoginInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object handler) throws Exception{
if (request.getSession().getAttribute("user")==null){
response.sendRedirect("/admin");
return false;
}
return true;
}
}
(2)编写WebConfig类
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/admin/**")
.excludePathPatterns("/admin")
.excludePathPatterns("/admin/login");
}
}
(3)界面展示