使用SpringBoot快速实现短信验证码登录与Flyway+MyBatis最佳实践

使用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&amp;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&amp;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

总结

通过本文,我们实现了:

  1. 使用Docker快速搭建MySQL环境
  2. 配置Flyway进行数据库版本控制
  3. 使用MyBatis Generator自动生成代码
  4. 实现完整的短信验证码登录流程

这种开发模式结合了现代开发工具的最佳实践,可以大幅提高开发效率和代码质量。希望本文对你的项目开发有所帮助!

相关推荐
神奇的程序员1 小时前
从已损坏的备份中拯救数据
运维·后端·前端工程化
oden2 小时前
AI服务商切换太麻烦?一个AI Gateway搞定监控、缓存和故障转移(成本降40%)
后端·openai·api
李慕婉学姐3 小时前
【开题答辩过程】以《基于Android的出租车运行监测系统设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·后端·vue
m0_740043733 小时前
SpringBoot05-配置文件-热加载/日志框架slf4j/接口文档工具Swagger/Knife4j
java·spring boot·后端·log4j
招风的黑耳4 小时前
我用SpringBoot撸了一个智慧水务监控平台
java·spring boot·后端
Miss_Chenzr4 小时前
Springboot优卖电商系统s7zmj(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
期待のcode4 小时前
Springboot核心构建插件
java·spring boot·后端
2501_921649494 小时前
如何获取美股实时行情:Python 量化交易指南
开发语言·后端·python·websocket·金融
serendipity_hky5 小时前
【SpringCloud | 第5篇】Seata分布式事务
分布式·后端·spring·spring cloud·seata·openfeign
五阿哥永琪5 小时前
Spring Boot 中自定义线程池的正确使用姿势:定义、注入与最佳实践
spring boot·后端·python