中软国际实训记录(十二)
1.新闻归档
1.1 在数据库内编写年份分类排序的语句
需要我们在Query Console 下选择console Default,点击表做手动修改做年份归档SQL语句测试,然后提交进行数据更新
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
//从时间戳年月日+时分秒格式中提取出year分组降序
select * from t_news n where date_format(n.update_Time,'%Y') = 2020
//归档某一具体年份的所有新闻
1.2 对接口进行添加修改
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);
NewService
List<Comment> listCommentByNewId(Long newId);
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);
}
}
}
}
ArchiveShowController
@GetMapping("/comments/{newId}")
public String comments(@PathVariable Long newId, Model model){
model.addAttribute("comments",commentService.listCommentByNewId(newId));
return "new::commentList";
}
2.异常处理
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);
}
}
handler包下创建ControllerException类
@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.登录拦截
- 登录拦截需要使用到拦截器,依赖于使用到的Web框架,面向切面编程
3.1 interceptor包下创建LoginInterceptor类
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;
}
}
WebConfig
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/admin/**")
.excludePathPatterns("/admin")
.excludePathPatterns("/admin/login");
}
}
4.结果展示
4.1 归档
4.2 异常处理
4.3 登录拦截