[个人笔记]基于SpringBoot的新闻管理系统 归档展示/登录拦截/异常处理功能
归档功能
归档功能是根据数据库中新闻更新时间,按一定的时间间隔进行分类显示,本项目中按照年进行划分,划分之后任然按照更新时间进行排序
功能实现
1.修改NewRepository
在NewRepository中增加两个方法,一个按年进行分组,一个根据年进行查询
//SELECT date_format(n.upadte_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.修改Service
同样在NewService中增加归档和获取新闻接口方法
//同事能装下String和List<News> 归档 Map<String,List<News>> archiveNew(); //新闻数 Long countNew();
在Impl中实现这两方法,使用一个LinkedHashMap将年和当年下的新闻储存,方便查找和调用
@Override public Map<String, List<News>> archiveNew() { List<String> years = newRepository.findGroupYear(); //hashmap是无序的集合 里面的顺序是混乱的 所以要用linkedhashmap 它是有序的 Map<String,List<News>> map = new LinkedHashMap<>(); for (String year:years){ map.put(year, newRepository.findByYear(year)); } return map; } @Override public Long countNew() { return newRepository.count(); }
3.新增Controller
新增一个ArchiveShowController,在传往前端archive.html界面的参数为archiveMap和newCount 调用service中的方法传入这两部分数据
@Controller public class ArchiveShowController { @Autowired private NewService newService; @GetMapping("/archives") public String archives(Model model){ model.addAttribute("archiveMap", newService.archiveNew()); model.addAttribute("newsCount",newService.countNew()); // System.out.println("显示"+ model); return "archives"; } }
效果展示图:
## 登录拦截
1.
继承HandlerInterceptorAdapter实现方法
org.springframework.web.servlet.handler.HandlerInterceptorAdapter是由spring MVC提供的一个适配器,只需要继承它就可以自定义拦截器,该类提供了三个方法 preHandle 、 postHandle 、afterCompletion,只需要根据自己的业务选择相应的方法进行覆盖即可
preHandle :在请求未到达Conterller之前进行预处理
postHandle :该方法是请求对应Controller执行完毕之后,但是页面为渲染之前
afterCompletion:这个方法的执行顺序是Controller执行完毕并且页面渲染之后的回调方法
登录拦截,是需要在请求到达Controller前处理,因此只需要实现preHandle方法
LoginInterceptor.java
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.注入HandlerInterceptorAdapter
声明一个WebConfig类将HandlerInterceptorAdapter注入
@Configuration public class WebConfig implements WebMvcConfigurer {//实现里面的接口 //本身的admin需要放行 @Override public void addInterceptors(InterceptorRegistry registry) { //登录拦截器 registry.addInterceptor(new LoginInterceptor()) .addPathPatterns("/admin/**") .excludePathPatterns("/admin") .excludePathPatterns("/admin/login"); } }
3.效果展示
输入localhost:8080/admin/loginin,错误的路径会直接跳转到登陆界面
## 异常处理
@ResponseStatus 定义一个异常类NotFoundException,继承RuntimeException
@ResponseStatus(HttpStatus.NOT_FOUND) public class NotFoundException extends RuntimeException{ public NotFoundException() { } public NotFoundException(String message) { super(message); } public NotFoundException(String message, Throwable cause) { super(message, cause); } }
再在ControllerExceptionHandler进行异常处理
通过 @ControllerAdvice+@ExceptionHandler 注解处理异常
@ControllerAdvice 对全局异常进行处理
@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.getRequestURI(),e); if (AnnotationUtils.findAnnotation(e.getClass(), ResponseStatus.class)!=null){ throw e; } ModelAndView mv = new ModelAndView(); mv.addObject("url",request.getRequestURI()); mv.addObject("exception",e); //把错误页面添加到异常处理 mv.setViewName("error/error"); return mv; } }
- Spring Boot 会员管理系统之处理文件上传功能
- 基于ArcGIS10.0和Oracle10g的空间数据管理平台一(C#开发)-系统功能介绍及展示
- (开源项目)基于springboot的后台管理系统基本框架
- 基于Spring Boot、Spring Cloud & Alibaba、OAuth2的分布式微服务架构权限管理系统
- springboot开发笔记(4.后台系统登录)
- Spring Boot 系列@ControllerAdvice 拦截异常并统一处理
- 从零开始,SpringBoot+Redis+MySQL搭建个人博客(六)-----添加登录功能并实现访问网址即跳转主页
- SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例
- niaobulashi-一个基于springboot shrio的权限管理系统
- SpringBoot秒杀系统实战10-JSR303参数校验+全局异常处理
- Mybatis+SpringMVC的简单学生管理系统(提供数据库设计)|登录、验证、用户等级不同功能不同、留言、增删改查等
- 新闻cms管理系统(二) ---- 后台登录功能
- Spring Boot 学习笔记(十三)——全局异常处理
- SpringBoot Web/API的通用异常处理[嗡汤圆的小笔记]
- springboot结合全局异常处理实现登录注册验证
- 基于SSM框架的管理系统:登录功能
- SpringBoot 整合Shiro 实现登录验证拦截功能
- 笔记: SpringBoot + VUE实现数据字典展示功能
- SpringBoot秒杀系统实战09-使用两次MD5实现登录功能
- Laravel 框架基于自带的用户系统实现登录注册及错误处理功能分析