Web开发|第七堂课—— 基于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托管接口文档,故不再更新当前接口文档

>>配置和使用swagger<<

接口
用户相关
用户注册
  • 简要描述
    用户注册接口
  • 请求URL
    http://localhost:8080/api/user/register
  • 请求方式
    POST
  • 参数
参数名 必选 类型说明
usernamestring用户名
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
  • 参数
参数名 必选 类型说明
usernamestring用户名
password string 密码
  • 返回示例
{
	“error_code”:0,
	“data”:{
		“uid”:”1”,
		”name”:”caesar”,
		”mobile”:”123456”,
}
  • 返回参数说明
  • 备注
    更多返回错误代码请看首页的错误代码
邮箱相关
邮箱添加
  • 简要描述
    用户绑定邮箱
  • 请求URL
    http://localhost:8080/api/mail/insert
  • 请求方式
    POST
  • 参数
参数名 必选 类型说明
idstring用户名
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
  • 参数
参数名 必选 类型说明
uidstringid
new_email string 新的邮箱
  • 返回示例
{
	“error_code”:0,
	“data”:{
		“uid”:”1”,
}
  • 返回参数说明
  • 备注
    更多返回错误代码请看首页的错误代码
数据字典
  1. mybatis_db.users
  • 用户表,保存用户数据
字段类型默认注释
字段类型默认注释
字段类型默认注释
字段类型默认注释
字段类型默认注释
字段类型默认注释
  • 备注:无
  1. mybatis_db.mails
  • 用户邮箱
字段类型长度默认注释
字段类型默认注释
字段类型默认注释
字段类型默认注释
字段类型默认注释
字段类型默认注释
- 备注

版本控制

github仓库
项目包括前端以及后端源码

实验

问题

解决前后端分离导致的跨域问题

知识

resultMap多表查询

resultType 和 resultMap的区别

小技巧

@getter、@setter注解可以取代多个domain类里面的getter、setter方法

操作步骤

  1. 定义mailMapper.xml
  2. 添加接口定义
  3. 接口调用

总结: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 区间表示接口异常

<<配置和使用swagger>>

  1. 配置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>
  1. 添加配置文件(多种方式,这里只介绍一种)
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/*")
        );
    }
}

  1. 更多
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
实现登录注册后端交互,可以按照以下步骤进行: 1. 创建一个SpringBoot项目,可以使用Spring Initializr来快速创建。 2. 添加MyBatis依赖,可以在pom.xml文件中添加以下依赖: ``` <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.0</version> </dependency> ``` 3. 创建数据库表,用于存储用户信息,例如用户ID、用户名、密码等。 4. 创建实体类,用于映射数据库表的字段。 5. 创建Mapper接口,用于定义SQL语句,可以使用注解方式或XML方式。 6. 创建Service层,用于调用Mapper接口,并对返回结果进行处理。 7. 创建Controller层,用于处理前后端交互,接收前端请求参数,并调用Service层进行处理,并返回相应结果给前端。 下面是一个简单的登录注册示例(以注解方式使用MyBatis): User.java ``` public class User { private int id; private String username; private String password; // ... // getters and setters } ``` UserMapper.java ``` @Mapper public interface UserMapper { @Select("SELECT * FROM user WHERE username = #{username} AND password = #{password}") User selectUserByUsernameAndPassword(@Param("username") String username, @Param("password") String password); @Insert("INSERT INTO user (username, password) VALUES (#{username}, #{password})") int insertUser(User user); } ``` UserService.java ``` @Service public class UserService { @Autowired private UserMapper userMapper; public User login(String username, String password) { return userMapper.selectUserByUsernameAndPassword(username, password); } public int register(User user) { return userMapper.insertUser(user); } } ``` UserController.java ``` @RestController public class UserController { @Autowired private UserService userService; @PostMapping("/login") public Result login(@RequestParam("username") String username, @RequestParam("password") String password) { User user = userService.login(username, password); if (user != null) { return Result.success("登录成功", user); } else { return Result.fail("用户名或密码错误"); } } @PostMapping("/register") public Result register(@RequestBody User user) { int result = userService.register(user); if (result > 0) { return Result.success("注册成功", user); } else { return Result.fail("注册失败"); } } } ``` 在上述示例中,我们定义了一个UserController类,用于处理前后端交互。其中,@RestController注解用于标记该类为RESTful服务,@PostMapping注解用于标记该方法接收POST请求,@RequestParam注解用于接收请求参数,@RequestBody注解用于接收请求体中的参数。 最后,我们需要定义一个Result类,用于封装返回结果: ``` public class Result { private int code; private String message; private Object data; // ... // getters and setters } ``` 通过封装Result类,我们可以统一返回结果的格式和内容,方便前端进行处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

caesarding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值