使用SpringBoot快速实现短信验证码登录与Flyway+MyBatis最佳实践
前言
在现代Web应用中,短信验证码登录已成为主流认证方式之一。本文将带你从零开始,使用SpringBoot快速实现一个完整的短信验证码登录系统,并结合Flyway数据库迁移工具和MyBatis Generator自动生成代码,打造高效开发流程。
环境准备
1. 创建SpringBoot项目
前往Spring Initializr,选择以下依赖:
- Spring Web
- MyBatis Framework
- MySQL Driver
- Flyway Migration
2. 使用Docker启动MySQL
bash
docker run -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=wxshop -p 3306:3306 -d mysql
数据库迁移:Flyway配置
Flyway是一款优秀的数据库版本控制工具,可以帮助我们管理数据库变更。
1. 添加Flyway Maven插件
xml
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-maven-plugin</artifactId>
<version>9.22.3</version>
<configuration>
<url>jdbc:mysql://localhost:3306/wxshop?useSSL=false&allowPublicKeyRetrieval=true</url>
<user>root</user>
<password>root</password>
</configuration>
</plugin>
</plugins>
</build>
2. 创建数据库迁移脚本
bash
mkdir -p src/main/resources/db/migration
创建V1__CreateUser.sql文件:
sql
CREATE TABLE USER (
ID BIGINT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(100),
TEL VARCHAR(20) UNIQUE,
AVATAR_URL VARCHAR(1024),
CREATED_AT TIMESTAMP,
UPDATED_AT TIMESTAMP
);
3. 执行迁移
bash
mvn flyway:migrate
代码生成:MyBatis Generator配置
MyBatis Generator可以自动生成实体类、Mapper接口和XML映射文件,大幅提高开发效率。
1. 添加Maven插件
xml
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.4.0</version>
</plugin>
2. 优化后的generatorConfig.xml配置
xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="wxshop" targetRuntime="MyBatis3" defaultModelType="flat">
<!-- 注释配置 -->
<commentGenerator>
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!-- 数据库连接信息 -->
<jdbcConnection
driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/wxshop?useSSL=false&allowPublicKeyRetrieval=true"
userId="root"
password="root">
</jdbcConnection>
<!-- 生成POJO模型 -->
<javaModelGenerator
targetPackage="com.hcsp.wxshop"
targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
<property name="constructorBased" value="true"/>
</javaModelGenerator>
<!-- 生成SQL映射文件 -->
<sqlMapGenerator
targetPackage="com.hcsp.wxshop"
targetProject="src/main/resources">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!-- 生成Mapper接口 -->
<javaClientGenerator
type="XMLMAPPER"
targetPackage="com.hcsp.wxshop"
targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!-- 指定要生成的表 -->
<table tableName="USER" domainObjectName="User">
<property name="useActualColumnNames" value="false"/>
<generatedKey column="ID" sqlStatement="MySQL" identity="true"/>
<columnOverride column="AVATAR_URL" property="avatarUrl"/>
<columnOverride column="CREATED_AT" jdbcType="TIMESTAMP" property="createdAt"/>
<columnOverride column="UPDATED_AT" jdbcType="TIMESTAMP" property="updatedAt"/>
</table>
</context>
</generatorConfiguration>
3. 执行代码生成
bash
mvn mybatis-generator:generate -X
接口实现
1. 注册接口(发送验证码)
请求方法 : POST
路径 : /api/code
请求体:
json
{
"tel": "13812345678"
}
响应状态码:
- 用户已存在:
200 OK - 用户不存在:
201 Created - JSON格式错误:
400 Bad Request
实现代码:
java
@RestController
@RequestMapping("/api")
public class AuthController {
@Autowired
private UserMapper userMapper;
@PostMapping("/code")
public ResponseEntity<?> sendCode(@RequestBody Map<String, String> request) {
String tel = request.get("tel");
if (tel == null || tel.isEmpty()) {
return ResponseEntity.badRequest().build();
}
User user = userMapper.selectByTel(tel);
if (user != null) {
return ResponseEntity.ok().build();
} else {
// 实际项目中这里应该调用短信服务发送验证码
return ResponseEntity.status(HttpStatus.CREATED).build();
}
}
}
2. 登录接口
请求方法 : POST
路径 : /api/login
请求体:
json
{
"tel": "13812345678",
"code": "123456"
}
响应状态码:
- 成功:
302 Found(跳转到指定页面) - 用户名或验证码错误:
403 Forbidden - 用户不存在:
404 Not Found
实现代码:
java
@PostMapping("/login")
public ResponseEntity<?> login(@RequestBody LoginRequest request,
HttpSession session) {
// 验证验证码逻辑(实际项目中应与发送的验证码比对)
if (!"123456".equals(request.getCode())) {
return ResponseEntity.status(HttpStatus.FORBIDDEN).build();
}
User user = userMapper.selectByTel(request.getTel());
if (user == null) {
return ResponseEntity.notFound().build();
}
session.setAttribute("currentUser", user);
return ResponseEntity.status(HttpStatus.FOUND)
.location(URI.create("/home"))
.build();
}
3. 登出接口
请求方法 : POST
路径 : /api/logout
实现代码:
java
@PostMapping("/logout")
public ResponseEntity<?> logout(HttpSession session) {
session.removeAttribute("currentUser");
return ResponseEntity.ok().build();
}
Windows上Docker相关问题解决
如果在Windows上遇到Docker问题,可以尝试以下命令:
bash
wsl --set-default-version 2
wsl --update
总结
通过本文,我们实现了:
- 使用Docker快速搭建MySQL环境
- 配置Flyway进行数据库版本控制
- 使用MyBatis Generator自动生成代码
- 实现完整的短信验证码登录流程
这种开发模式结合了现代开发工具的最佳实践,可以大幅提高开发效率和代码质量。希望本文对你的项目开发有所帮助!