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

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

相关推荐
没差c36 分钟前
springboot集成flyway
java·spring boot·后端
三水不滴38 分钟前
Redis 过期删除与内存淘汰机制
数据库·经验分享·redis·笔记·后端·缓存
笨蛋不要掉眼泪1 小时前
Spring Boot集成LangChain4j:与大模型对话的极速入门
java·人工智能·后端·spring·langchain
sheji34164 小时前
【开题答辩全过程】以 基于SpringBoot的疗养院管理系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
短剑重铸之日4 小时前
《设计模式》第六篇:装饰器模式
java·后端·设计模式·装饰器模式
码界奇点6 小时前
基于Flask与OpenSSL的自签证书管理系统设计与实现
后端·python·flask·毕业设计·飞书·源代码管理
代码匠心7 小时前
从零开始学Flink:状态管理与容错机制
java·大数据·后端·flink·大数据处理
分享牛7 小时前
LangChain4j从入门到精通-11-结构化输出
后端·python·flask
知识即是力量ol8 小时前
在客户端直接上传文件到OSS
java·后端·客户端·阿里云oss·客户端直传
闻哥8 小时前
深入理解 Spring @Conditional 注解:原理与实战
java·jvm·后端·python·spring