前言
HM新出springboot入门项目《苍穹外卖》,笔者打算写一个系列学习笔记,“苍穹外卖项目解读”,内容主要从HM课程,自己实践,以及踩坑填坑出发,以技术,经验为主,记录学习,也希望能给在学想学的小伙伴一个参考。
注:本文章是直接拿到项目的最终代码,然后从代码出发,快速逆向学习技术经验! 可能需要一些前置知识
觉得文章有用可以关注点赞收藏期待更新^^,期待您的评论留言
苍穹外卖项目解读(一) 完整代码本地部署运行
苍穹外卖项目解读(二) 管理端JWT令牌、AOP注解开发、分页
苍穹外卖项目解读(三) redis、cache缓存解读
苍穹外卖项目解读(四) 微信小程序支付、定时任务、WebSocket
苍穹外卖项目解读(五 完结) POI Easyexcel excel操作
业务功能
本系列文章很少(基本没有)对业务进行解读,HM课程的老师已经讲解的很清晰了,所以有关业务的CRUD也就不再展开解读。今天的主要解读是JWT
分页
苍穹外卖项目使用的springboot + mybatis开发,没有用到MP,所以项目的分页功能就在文章中分析一下。课程中已经讲得很详细了,这里主要记录一下。
使用分页插件PageHelper.startPage
,调用dao层填充查询条件%#{name}%
,按照创建时间降序排列。
PageHelper.startPage()
可以根据页码和条数拼合在select语句中,其Page对象是一个ArrayList,所以我们要声明PageResult,包括total全部条数,record 一页的记录信息
AOP注解开发
AOP切面开发,一个切面开发要包括三个部分,切面,切点,通知,我总结了3W记忆法(when what where)。
简单理解切面aspect:是一个类,表明了在何时(@before、@around…),做何事(通知方法)。
切点:何处(某个包下的所有方法,加注解的方法…)
注解AOP开发的话,就是我们声明出来一个注解,用注解来标定我们的切点
代码注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoFill {
//数据库操作类型:UPDATE INSERT
OperationType value(); //变量value 类型OperationType 枚举,在使用注解时可以填充value=xxx
}
------------------------------------------------
/**
* 切入点
*/
//真正切入点pointcut
@Pointcut("execution(* com.sky.mapper.*.*(..)) && @annotation(com.sky.annotation.AutoFill)")
public void autoFillPointCut(){
} //切点名称,方便通知使用
------------------------------------------------
/**
* 前置通知,在通知中进行公共字段的赋值
*/
@Before("autoFillPointCut()") //指明切点
public void autoFill(JoinPoint joinPoint){
} //具体通知,内容省略
------------------------------------------------
/**
* 插入员工数据
* @param employee
*/
@Insert("insert into employee (name, username, password, phone, sex, id_number, create_time, update_time, create_user, update_user,status) " +
"values " +
"(#{name},#{username},#{password},#{phone},#{sex},#{idNumber},#{createTime},#{updateTime},#{createUser},#{updateUser},#{status})")
@AutoFill(value = OperationType.INSERT)
//注解调用(流程:因为AutoFill被指明为切点,AOP会介入通知,进入insert前,执行@before通知,进入insert方法)
void insert(Employee employee);
JWT令牌
笔者结合前后端代码,以及JWT源码,梳理本项目的token访问认证。
首先介绍本项目token的作用:根据拦截器可知,SpringMVC在HandlerMapping之前,有一个preHandle,也就是去访问控制器时,预先处理一些符合路径的请求之后再打到控制器。
以下从拦截器介绍、JWT介绍、项目代码分析三个部分,逐步揭开项目JWT访问认证功能
拦截器介绍
一图看懂一个请求路径如何经过tomcat容器
preHandler(HttpServletRequest request, HttpServletResponse response, Object handler)
方法将在请求处理之前进行调用。SpringMVC中的Interceptor同Filter一样都是链式调用。每个Interceptor的调用会依据它的声明顺序依次执行,而且最先执行的都是Interceptor中的preHandle方法,所以可以在这个方法中进行一些前置初始化操作或者是对当前请求的一个预处理,也可以在这个方法中进行一些判断来决定请求