基于sprintboot和mybatis实现前后端分离的用户注册登陆
实验
准备
实验目的
实现以下功能:
- 用户注册登陆
- (绑定)邮箱添加
- 邮箱模糊查询
- 邮箱信息修改
- 邮箱注销
- 单元测试
实验环境
- 后端:spring boot、mybatis、mysql
- 前端:html、css、js、jquery、ajax
- 工具:vscode(前端)、idea(后端)
接口文档
序言
这是一个用于学习的示例文档
hello world
全局错误码
错误码 | 错误解释 |
---|---|
1001 | 接口认证失败 |
1002 | 授权过期 |
1003 | 缺失参数 |
修改记录
- 2020年11月
日期 | 修改人 | 涉及接口 | 修改内容 |
---|---|---|---|
11月13日 | caesar | 所有 | 初始化接口内容 |
11月13日 | caesar | 邮箱相关-邮箱注册 | 修改url地址 |
11月15日 | Caesar | 所有 | 使用swagger托管接口文档,故不再更新当前接口文档 |
接口
用户相关
用户注册
- 简要描述
用户注册接口 - 请求URL
http://localhost:8080/api/user/register
- 请求方式
POST - 参数
参数名 | 必选 | 类型 | 说明 |
username | 是 | string | 用户名 |
password | 是 | string | 密码 |
mobile | 是 | string | 手机号 |
- 返回示例
{
#######示例#######
# 返回状态码 JSON
"error_code":0,
# 返回信息描述
"message":string,
# 返回值
"data":{
"uid":"1",
"name":"caesar",
"mobile":"123456",
}
- 返回参数说明
- 备注
更多返回错误代码请看首页的错误代码
用户登陆
- 简要描述
用户登陆接口 - 请求URL
http://localhost:8080/api/user/login
- 请求方式
POST - 参数
参数名 | 必选 | 类型 | 说明 |
username | 是 | string | 用户名 |
password | 是 | string | 密码 |
- 返回示例
{
“error_code”:0,
“data”:{
“uid”:”1”,
”name”:”caesar”,
”mobile”:”123456”,
}
- 返回参数说明
- 备注
更多返回错误代码请看首页的错误代码
邮箱相关
邮箱添加
- 简要描述
用户绑定邮箱 - 请求URL
http://localhost:8080/api/mail/insert
- 请求方式
POST - 参数
参数名 | 必选 | 类型 | 说明 |
id | 是 | string | 用户名 |
password | 是 | string | 密码 |
mobile | 是 | string | 手机号 |
- 返回示例
{
“error_code”:0,
“data”:{
“uid”:”1”,
”name”:”caesar”,
”email”:”123456”,
}
- 返回参数说明
- 备注
更多返回错误代码请看首页的错误代码
邮箱注销
- 简要描述
注销邮箱,修改is_used=0 - 请求URL
http://localhost:8080/api/email/cancel
- 请求方式
POST - 参数
参数名 | 必选 | 类型 | 说明 |
uid | 是 | string | 用户id |
- 返回示例
{
“error_code”:0,
“data”:{
“uid”:”1”,
}
}
- 返回参数说明
- 备注
更多返回错误代码请看首页的错误代码
邮箱列表
- 简要描述
展示邮箱列表 - 请求URL
http://localhost:8080/api/email/list
- 请求方式
POST - 参数
参数名 | 必选 | 类型 | 说明 |
- 返回示例
{
“error_code”:0,
“data”:{
“uid”:”1”,
”name”:”caesar”,
”mobile”:”123456”,
}
- 返回参数说明
- 备注
更多返回错误代码请看首页的错误代码
邮箱模糊查询
- 简要描述
邮箱模糊查询 - 请求URL
http://localhost:8080/api/email/select
- 请求方式
POST - 参数
参数名 | 必选 | 类型 | 说明 |
username | 必选 | 类型 | 说明 |
mobile | 必选 | 类型 | 说明 |
- 返回示例
{
“error_code”:0,
“data”:{
“uid”:”1”,
”name”:”caesar”,
”mobile”:”123456”,
}
- 返回参数说明
- 备注
更多返回错误代码请看首页的错误代码
邮箱信息修改
- 简要描述
修改邮箱信息 - 请求URL
http://localhost:8080/api/email/update
- 请求方式
POST - 参数
参数名 | 必选 | 类型 | 说明 |
uid | 是 | string | id |
new_email | 是 | string | 新的邮箱 |
- 返回示例
{
“error_code”:0,
“data”:{
“uid”:”1”,
}
- 返回参数说明
- 备注
更多返回错误代码请看首页的错误代码
数据字典
- mybatis_db.users
- 用户表,保存用户数据
字段 | 类型 | 空 | 默认 | 注释 |
字段 | 类型 | 空 | 默认 | 注释 |
字段 | 类型 | 空 | 默认 | 注释 |
字段 | 类型 | 空 | 默认 | 注释 |
字段 | 类型 | 空 | 默认 | 注释 |
字段 | 类型 | 空 | 默认 | 注释 |
- 备注:无
- mybatis_db.mails
- 用户邮箱
字段 | 类型 | 长度 | 默认 | 注释 |
字段 | 类型 | 空 | 默认 | 注释 |
字段 | 类型 | 空 | 默认 | 注释 |
字段 | 类型 | 空 | 默认 | 注释 |
字段 | 类型 | 空 | 默认 | 注释 |
字段 | 类型 | 空 | 默认 | 注释 |
版本控制
github仓库
项目包括前端以及后端源码
实验
问题
解决前后端分离导致的跨域问题
- 注解@CrossOrigin解决跨域问题
注解@CrossOrigin解决跨域问题
知识
resultMap多表查询
resultType 和 resultMap的区别
小技巧
@getter、@setter注解可以取代多个domain类里面的getter、setter方法
操作步骤
- 定义mailMapper.xml
- 添加接口定义
- 接口调用
总结:resultMap——collection映射的一个集合列表,处理的是一对多的关联关系
Mybatis缓存
一级缓存:作用于SqlSession
二级缓存:默认是关闭的
查询的顺序:二级缓存->一级缓存->数据库
状态码设计参考 继续阅读
部分HTTP请求返回状态码参考
200 - 请求成功
301 - 资源(网页等)被永久转移到其他URL
404 - 请求的资源(网页等)不存在
500 - 内部服务器错误
分类 | 区间 | 分类描述 |
---|---|---|
1** | 100~199 | 信息,服务器收到请求,需要请求者继续执行操作 |
2** | 200~299 | 成功,操作被成功接受并处理 |
3** | 300~399 | 重定向,需要进一步的操作以完成请求 |
4** | 400~499 | 客户端错误,请求包含语法错误或无法完成请求 |
5** | 500~599 | 服务器错误,服务器在处理请求过程中发生了错误 |
# 如果区间不够,可以设计成下面的四位数
# 1000~1999 区间表示参数错误
# 2000~2999 区间表示用户错误
# 3000~3999 区间表示接口异常
- 配置pom.xml文件
<!-- swagger核心组件,在代码配置swagger时会依赖到它 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<!-- swagger的用户界面,用于展示api接口文档 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
- 添加配置文件(多种方式,这里只介绍一种)
package com.example.web_class.config;
import com.google.common.base.Predicate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import static com.google.common.base.Predicates.not;
import static com.google.common.base.Predicates.or;
import static springfox.documentation.builders.RequestHandlerSelectors.withMethodAnnotation;
/**
*@ClassName: SpringfoxSwagger2Config
*@Description swagger配置文件
*@Author CaesarDing
*@Date 2020/11/15
*@Time 14:41
*/
@Configuration
@EnableSwagger2
//包扫描,在此包下的Controller都会被纳入swagger接口文档生成的范围,这里也可以配置类扫描,同时也可以在这个配置类里面细化过滤规则
@ComponentScan(basePackages = "com.example.web_class.controller")
public class SpringfoxSwagger2Config {
//组织Docket对象,翻译过来就是摘要的意思,它是生成API文档的核心对象,里面配置一些必要的信息
@Bean
public Docket swaggerSpringMvcPlugin(){
//指定规范,这里是SWAGGER_2
return new Docket(DocumentationType.SWAGGER_2)
//设定Api文档头信息,这个信息会展示在文档UI的头部位置
.apiInfo(swaggerDemoApiInfo())
.select()
//添加过滤条件,谓词过滤predicate,这里是自定义注解进行过滤
//.apis(not(withMethodAnnotation(SwaggerCustomIgnore.class)))
//这里配合@ComponentScan一起使用,又再次细化了匹配规则(当然,我们也可以只选择@ComponentScan、paths()方法当中的一中)
// .paths(allowPaths())
.build();
}
/**
*@Author CaesarDing
*@Description 自定义API文档基本信息实体
*@Date 2020/11/15
*@Time 14:52
*@Param []
*@Return com.google.common.base.Predicate<java.lang.String>
*@MethodName: allowPaths
*/
private ApiInfo swaggerDemoApiInfo() {
//构建联系实体,在UI界面会显示
Contact contact = new Contact("web_class", "http://caesarding.space", "caesarding07@gmail.com");
return new ApiInfoBuilder()
//联系人信息
.contact(contact)
//文档标题
.title("WebClass")
//文档描述
.description("WebClass API document 2020.11")
//文档版本
.version("1.0.0")
.build();
}
/**
*@Author CaesarDing
*@Description PATH匹配规则
*@Date 2020/11/15
*@Time 14:55
*@Param []
*@Return com.google.common.base.Predicate<java.lang.String>
*@MethodName: allowPaths
*/
private Predicate<String> allowPaths() {
return or(
PathSelectors.regex("/api/user/*")
);
}
}
- 更多