使用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. 实现完整的短信验证码登录流程

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

相关推荐
码事漫谈5 小时前
AI 技能工程入门:从独立能力到协作生态
后端
码事漫谈5 小时前
构建高并发AI服务网关:C++与gRPC的工程实践
后端
颜酱6 小时前
前端必备动态规划的10道经典题目
前端·后端·算法
半夏知半秋7 小时前
rust学习-闭包
开发语言·笔记·后端·学习·rust
LucianaiB7 小时前
【保姆级教程】10分钟把手机变成AI Agent:自动刷课、回消息,学不会我“退网”!
后端
Mr -老鬼8 小时前
功能需求对前后端技术选型的横向建议
开发语言·前端·后端·前端框架
IT=>小脑虎8 小时前
Go语言零基础小白学习知识点【基础版详解】
开发语言·后端·学习·golang
源代码•宸8 小时前
Golang语法进阶(并发概述、Goroutine、Channel)
服务器·开发语言·后端·算法·golang·channel·goroutine
Eric_见嘉8 小时前
NestJS 🧑‍🍳 厨子必修课(九):API 文档 Swagger
前端·后端·nestjs
a程序小傲9 小时前
小红书Java面试被问:TCC事务的悬挂、空回滚问题解决方案
java·开发语言·人工智能·后端·python·面试·职场和发展