后端
Java后端接口
新建SpringBoot项目
-
IDEA中Spring Initializer(JDK1.8)新建项目
-
groupid:com.markerhub
- Artifact:vueblog
- Packa在ge:com.markerhub
-
选择jar包
-
Developper Tools
- SpringBoot DevTools
- Lombok
-
web
- Spring web
-
SQL
- MySQL Driver
-
-
Project name : vue blog Project location:(要注意位置)
-
在搭建的pom.xml中< parent>将version修改为2.2.6
- devtools:项目的热加载重启插件
- lombok:简化代码的工具
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-web
</artifactId>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-devtools
</artifactId>
<scope>
runtime
</scope>
<optional>
true
</optional>
</dependency>
<dependency>
<groupId>
org.projectlombok
</groupId>
<artifactId>
lombok
</artifactId>
<optional>
true
</optional>
</dependency>
- 删除掉不需要的jar包
(目录.mvm,.gitignore,mvnw,mvnw.cmd)
整合MybatisPlus
导入jar包
- pom中导入mybatis plus的jar包,因为后面会涉及到代码生成,所以我们还需要导入页面模板引擎,这里我们用的是freemarker
- 在pom.xml中引入MP的依赖版本为3.2.0
- mp代码生成器的依赖
<!--mp-->
<dependency>
<groupId>
com.baomidou
</groupId>
<artifactId>
mybatis-plus-boot-starter
</artifactId>
<version>
3.2.0
</version>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-freemarker
</artifactId>
</dependency>
<dependency>
<groupId>
mysql
</groupId>
<artifactId>
mysql-connector-java
</artifactId>
<scope>
runtime
</scope>
</dependency>
<!--mp代码生成器-->
<dependency>
<groupId>
com.baomidou
</groupId>
<artifactId>
mybatis-plus-generator
</artifactId>
<version>
3.2.0
</version>
</dependency>
写Springboot配置文件
-
在src/main/java/resources下,原生为application.properties,改为application.yml
- rename文件,选中文件—refactor-rename(shift+F6)
- 配置了数据库信息
- mp的mapper的xml文件扫描路径
- 启动端口
# DataSource Config
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url:jdbc:mysql://localhost:3306/vuebloguseUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username: root
password:admin
mybatis-plus:
mapper-locations: classpath*:/mapper/**Mapper.xml
server:
port:8081
- 这里需要注意的是,数据库提前在MySQL中生成,一个名为vueblog的库,有m_blog和 m_user两张表
开启mapper接口扫描,添加分页插件
新建一个包:通过@mapperScan注解指定要变成实现类的接口所在的包,然后包下面的所有接口在编译之后都会生成相应的实现类; PaginationInterceptor是一个分页插件(这些过程都是官网给出的过程,只需复制即可)
- 在/src/main/java下的com.markerhub包上新建一个java class的同时建一个包,“config.MybatisPlusConfig”
代码生成
-
若未再用其他插件,那么现在就已经可以使用mybatis plus了
-
官方提供了一个代码生成器,写上自定义参数后,可以直接根据数据库表信息生成entity、service、mapper等接口和实现类
-
该代码生成工具直接在github寻找即可,此处直接用线程的类加入到项目中(下图中的CodeGeneration)
- 复制该CodeGeneration.java,在项目中的/src/main/java/com.markerhub上右键直接paste添加类
- 在复制进后,对其源码进行修改,主要是数据源部分的配置,数据库的选择,用户密码
(注意,一定不要轻易更改工作目录,随便移动)
-运行该类
-
输入表名
-
项目目录会自动生成controlller,entity,mapper,service
经过这一步,MybatisPlus已经继承到SpringBoot框架中
测试
注意,先前在CodeGenerator类中执行了该类自动生成了代码,在IDEA右上角显示未为
编写测试类
在UserController中编写测试方法
运行
注意在右上角更该运行类
在页面上键入localhost:8081/use/index/1,页面上有一条查询记录,即部署成功
统一结果封装
-
用一个Result类进行异步返回的统一结果封装,一般来说有三个元素是必要的
- 是否成功,可用code表示(如200表示成功,400表示异常)
- 结果消息
- 结果数据
-
前后端分离时,后端返回给前端的数据前端可以弹窗显示
public class Result implements Serializable { private int code; // 200是正常,非200表示异常 private String msg; private Object data; public static Result succ(Object data) { return succ(200, "操作成功", data); } public static Result succ(int code, String msg, Object data) { Result r = new Result(); r.setCode(code); r.setMsg(msg); r.setData(data); return r; } //失败时,code定为400,且此时msg最为重要 public static Result fail(String msg) { return fail(400, msg, null); } public static Result fail(String msg, Object data) { return fail(400, msg, data); } public static Result fail(int code, String msg, Object data) { Result r = new Result(); r.setCode(code); r.setMsg(msg); r.setData(data); return r; } }
-
@Data注解,需要lombok插件实现,能够在我们编译源码的时候自动帮我们生成这些方法。
-
@Data可为类快速生成get/set方法无需自实现
-
还会为类提供 equals()、hashCode()、toString() 方法
-
使用该注解时首先要添加jar包或maven依赖,
- 在Settings/Plugins 安装Lombok
- 在Settings/Build,Execution,Deployment / compiler / Annotation Processors中Enable annotation processing并Obtain processor from project classpath,然后Apply,Ok即可
-
整合shiro+jwt,会话共享
Shiro整合jwt逻辑
登陆逻辑
-
前端将用户名,密码传给后端
-
后端进行密码校验
- 错误密码则抛出异常
- 正确密码则生成jwt
-
后端将jwt返回给前端,前端做相应处理
资源访问逻辑
-
(登陆处理)用户访问接口,进入接口前定义了一个jwt filter
-
有jwt,则交给shiro进行登陆处理
- jwt异常(错误,过期)抛出异常,全局异常捕获处理
- jwt正常,尝试访问接口(Controller)
-
无jwt,尝试访问接口(Controller)
-
-
(权限注解过滤逻辑)在访问接口前进行前置拦截(注解过滤),通过Shiro注解实现
- 无权限时,抛出异常 ,全局异常捕获处理
- 有权限,真正进行访问接口(Controller)
跨域问题
- 由于采用jwt做token验证,需要在请求头中添加了一个“Authorization:jwt",后端响应时要在响应头中加上该自己段
- 虽然在整个业务逻辑中HTTP请求只有GET和POST,但是由于自定义了头导致变成复杂请求,因此还需要在处GET,POST,非自定义头的跨