Spring Boot 實現登錄註冊功能

一、Spring Boot 簡介

Spring Boot 是基於 Spring Framework 核心的一個快速開發工具,通過自動配置、約定優於配置的方式,簡化了 Spring 應用的開發和部署。Spring Boot 不僅可以幫助我們快速開發 Web 應用,還提供了很多工具和組件,比如安全認證、資料庫操作、緩存操作、消息隊列和郵件等等,極大地提高了我們的開發效率。

二、登錄註冊功能的需求分析

一般情況下,Web 應用都需要用戶登錄和註冊功能,這些功能是基礎中的基礎。

具體用戶需求如下:

  1. 用戶需要能夠註冊一個新賬號
  2. 用戶需要能夠使用已有的賬號進行登錄
  3. 登錄成功後需要能夠跳轉到首頁或者個人中心頁面
  4. 登錄失敗需要給出相應的錯誤信息提示

三、準備工作

在開始編寫代碼之前,我們需要進行一些準備工作:

  1. 安裝 JDK 8 或以上版本
  2. 安裝 Maven
  3. 安裝任意一種 IDE,比如 Eclipse、IntelliJ IDEA 等

接下來,我們就可以開始創建一個基於 Spring Boot 的 Web 項目。

四、創建 Spring Boot 項目

我們可以使用 Spring Initializr 來快速創建一個 Spring Boot 項目。

  1. 打開https://start.spring.io/網站
  2. 選擇項目信息
    • 選擇項目語言:Java
    • 選擇 Spring Boot 版本:2.3.0 或以上版本
    • 輸入項目信息:GroupId、ArtifactId、Name、Description 等
    • 選擇項目依賴:Web、Spring Security、MyBatis(或其他的資料庫框架)等
  3. 點擊 Generate 按鈕下載項目模板
  4. 解壓下載的項目模板到本地目錄

五、實現登錄註冊功能

1. 資料庫設計

在登錄註冊功能實現中,我們需要兩個數據表:

CREATE TABLE user (
    user_id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(20) UNIQUE NOT NULL,
    password VARCHAR(100) NOT NULL,
    email VARCHAR(50) UNIQUE NOT NULL,
    create_time datetime NOT NULL
);

CREATE TABLE user_role (
    user_id INT NOT NULL,
    role_id INT NOT NULL,
    PRIMARY KEY (user_id, role_id),
    FOREIGN KEY (user_id) REFERENCES user(user_id),
    FOREIGN KEY (role_id) REFERENCES role(role_id)
);

這裡的 user 表用來存儲用戶註冊信息,user_role 表用來存儲用戶角色信息。

2. 實現註冊功能

註冊功能主要流程:

  1. 用戶填寫註冊表單,包括用戶名、郵箱、密碼等信息
  2. 後端校驗用戶輸入的信息是否合法,如果有錯誤信息需要返回給前端顯示
  3. 如果信息無誤,將用戶信息保存到資料庫,註冊成功後跳轉到登錄頁面

首先,我們需要創建一個 User 實體類來映射資料庫中的 user 表:

public class User {
    private Integer userId;
    private String username;
    private String password;
    private String email;
    private Date createTime;
    // getter 和 setter 省略
}

接下來,我們需要在 controller 中實現註冊功能,如下所示:

@Autowired
private UserService userService;

@PostMapping("/register")
public String register(User user) {
    Result result = userService.register(user);
    if (result.getCode() == ResultEnum.SUCCESS.getCode()) {
        return "redirect:/login";
    } else {
        return "register";
    }
}

上面的代碼中,我們注入了一個 UserService 對象,調用 register 方法接收用戶信息,如果註冊成功則跳轉到登錄頁面,否則返回註冊頁面並顯示錯誤信息。

UserService 代碼如下所示:

@Autowired
private UserMapper userMapper;

public Result register(User user) {
    // 1. 校驗用戶名、郵箱和密碼是否為空,用戶名和郵箱是否已經存在
    String username = user.getUsername();
    String email = user.getEmail();
    String password = user.getPassword();
    if (StringUtils.isEmpty(username) || StringUtils.isEmpty(email) || StringUtils.isEmpty(password)) {
        return ResultUtils.error(ResultEnum.E1001);
    }
    if (userMapper.getUserByUsername(username) != null) {
        return ResultUtils.error(ResultEnum.E1002);
    }
    if (userMapper.getUserByEmail(email) != null) {
        return ResultUtils.error(ResultEnum.E1003);
    }

    // 2. 將密碼使用 MD5 加密
    String md5Password = MD5Utils.encrypt(password);

    // 3. 將用戶信息存儲到資料庫中
    user.setPassword(md5Password);
    user.setCreateTime(new Date());
    userMapper.insertUser(user);

    return ResultUtils.success();
}

在 UserService 中,我們首先校驗了用戶名、郵箱和密碼是否為空,以及用戶名和郵箱是否已存在。然後將密碼使用 MD5 加密,並將用戶信息插入到資料庫中。

這裡我們使用了一個 Result 對象來封裝方法的返回結果,其代碼如下所示:

public class Result {
    private int code;
    private String message;
    private Object data;

    // getter 和 setter 省略
}

public enum ResultEnum {
    SUCCESS(0, "成功"),
    E1001(1001, "參數不完整"),
    E1002(1002, "用戶名已存在"),
    E1003(1003, "郵箱已存在");

    private int code;
    private String message;
    
    // 構造方法和 getter 省略
}

public class ResultUtils {

    public static Result success() {
        return success(null);
    }

    public static Result success(Object data) {
        Result result = new Result();
        result.setCode(ResultEnum.SUCCESS.getCode());
        result.setMessage(ResultEnum.SUCCESS.getMessage());
        result.setData(data);
        return result;
    }

    public static Result error(ResultEnum resultEnum) {
        Result result = new Result();
        result.setCode(resultEnum.getCode());
        result.setMessage(resultEnum.getMessage());
        return result;
    }
}

Result 是一個通用的返回結果封裝類,包括了代碼、消息和數據三個信息。ResultEnum 枚舉類定義了通用的返回狀態碼和錯誤信息,ResultUtils 是一個結果工具類,定義了常用的返回方法,比如成功和失敗,同時可以傳入不同的數據參數。

最後,我們需要在註冊頁面實現註冊表單,如下所示:

<form action="/register" method="post">
    <div class="form-group">
        <label for="username">用戶名</label>
        <input type="text" class="form-control" id="username" name="username">
    </div>
    <div class="form-group">
        <label for="email">郵箱</label>
        <input type="email" class="form-control" id="email" name="email">
    </div>
    <div class="form-group">
        <label for="password">密碼</label>
        <input type="password" class="form-control" id="password" name="password">
    </div>
    <button type="submit" class="btn btn-primary">註冊</button>
</form>

3. 實現登錄功能

登錄功能主要流程:

  1. 用戶填寫登錄表單,包括用戶名和密碼
  2. 後端校驗用戶輸入的用戶名和密碼是否正確,如果有錯誤信息需要返回給前端顯示
  3. 如果信息無誤,將用戶信息保存在 session 中,並跳轉到首頁或者個人中心頁面

同樣地,我們需要在 controller 中實現登錄功能,如下所示:

@Autowired
private UserService userService;

@PostMapping("/login")
public String login(String username, String password, HttpSession session) {
    User user = userService.login(username, password);
    if (user != null) {
        session.setAttribute("user", user);
        return "redirect:/index";
    } else {
        return "login";
    }
}

上面的代碼中,我們注入了 UserService 對象,調用 login 方法接收用戶名和密碼信息,如果登錄成功則將用戶信息存儲在 session 中,跳轉到首頁或者個人中心頁面,否則返回登錄頁面並顯示錯誤信息。

UserService 代碼如下所示:

@Autowired
private UserMapper userMapper;

public User login(String username, String password) {
    // 1. 根據用戶名查詢用戶信息
    User user = userMapper.getUserByUsername(username);
    if (user == null) {
        return null;
    }

    // 2. 判斷密碼是否正確
    String md5Password = MD5Utils.encrypt(password);
    if (!md5Password.equals(user.getPassword())) {
        return null;
    }

    return user;
}

在 UserService 中,我們首先查找用戶信息是否存在,然後將用戶輸入的密碼使用 MD5 進行加密,和資料庫中的密碼進行比對,如果正確則返回相應的用戶信息,否則返回 null。

最後,我們需要在登錄頁面實現登錄表單,如下所示:

<form action="/login" method="post">
    <div class="form-group">
        <label for="username">用戶名</label>
        <input type="text" class="form-control" id="username" name="username">
    </div>
    <div class="form-group">
        <label for="password">密碼</label>
        <input type="password" class="form-control" id="password" name="password">
    </div>
    <button type="submit" class="btn btn-primary">登錄</button>
</form>

六、總結

本文介紹了如何使用 Spring Boot 實現登錄註冊功能。具體來說,我們分析了註冊和登錄功能的需求,設計了相應的數據表,實現了後端的校驗和資料庫操作,最後在前端頁面中實現了相應的表單。通過本文,相信讀者可以更加深入地理解 Spring Boot 的核心特性和使用方式。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/244712.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 13:03
下一篇 2024-12-12 13:03

相關推薦

發表回復

登錄後才能評論