程序员scholar 程序员scholar
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Python 基础

    • Python基础
  • Python 进阶

    • 装饰器与生成器
    • 异常处理
    • 标准库精讲
    • 模块与包
    • pip包管理工具
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
前端 (opens new window)
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Python 基础

    • Python基础
  • Python 进阶

    • 装饰器与生成器
    • 异常处理
    • 标准库精讲
    • 模块与包
    • pip包管理工具
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
前端 (opens new window)
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • 后端开发

    • Spring Boot多模块项目开发
    • Spring Boot图片资源返回
    • Spring Boot文件上传
    • Spring Boot文件下载
    • 对接第三方文件上传
    • Servlet 原生API
    • HttpServletResponse 和 ResponseEntity
    • 后端解决跨域问题
    • 后端拦截器
    • SpringBoot+Vue实现邮件发送与验证码验证
    • 谷歌验证码
    • 利用hutool工具类实现图片验证码
    • 统一返回格式
    • 通用 普通 登录模块
    • 通用 JWT 登录认证模块
    • 通用 普通 注册模块
      • 1. 数据库表设计
      • 2. 数据传输对象:RegisterRequest 和 RegisterResponse
      • 3. Mapper 层:UserMapper
      • 4. Service 层:RegisterService 和 RegisterServiceImpl
      • 5. Controller 层:RegisterController
      • 6. 前后端注册流程详细说明
      • 7. 返回格式示例
    • 基于 MyBatis curd
    • 基于 MyBatis-Plus curd
    • Java 常见对象模型
    • 开发枚举的使用
    • MyBatis与MyBatis-Plus日期类型处理
    • 接口日志拦截基础版
    • 接口日志拦截进阶版
    • 文件操作工具类
    • Spring Boot 数据校验
    • 幂等性
  • 前端开发

  • 开发笔记
  • 后端开发
scholar
2024-12-27
目录

通用 普通 注册模块

# 通用 普通 注册模块

本方案将详细介绍如何实现一个完整的用户注册模块,采用企业风格代码架构,涵盖数据库表设计、Controller 层、Service 层、Mapper 层和用户注册的逻辑,实现了数据校验、加密存储、响应格式标准化等功能,确保项目在实际生产环境中能够直接使用。

本方案包含以下部分:

  1. 数据库表设计
  2. 注册请求和响应 DTO
  3. Mapper 层:UserMapper
  4. Service 层:RegisterService 和 RegisterServiceImpl
  5. Controller 层:RegisterController
  6. 前后端注册流程详细说明
  7. 完整代码实现

# 1. 数据库表设计

说明:注册模块依然使用与登录模块相同的用户表,确保一致性。下面是用户表的设计:

CREATE TABLE `user` (
  `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
  `username` VARCHAR(50) NOT NULL COMMENT '用户名,唯一',
  `password` VARCHAR(100) NOT NULL COMMENT '密码,已加密',
  `email` VARCHAR(100) DEFAULT NULL COMMENT '邮箱',
  `phone` VARCHAR(20) DEFAULT NULL COMMENT '电话',
  `status` TINYINT(1) DEFAULT 1 COMMENT '账户状态:1-启用,0-禁用',
  `avatar` VARCHAR(255) DEFAULT NULL COMMENT '头像URL',
  `create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
1
2
3
4
5
6
7
8
9
10
11
12
13

重要字段说明:

  • username:注册时使用,唯一约束,防止重复注册。
  • password:注册时对密码进行加密存储,保障安全性。
  • email 和 phone:可选字段,后续可用于找回密码等功能。

# 2. 数据传输对象:RegisterRequest 和 RegisterResponse

说明:数据传输对象用于封装前端请求的数据和后端响应的数据。

注册请求 DTO:

import lombok.Data;

/**
 * @description 注册请求数据对象,用于封装前端传递的用户注册信息
 */
@Data
public class RegisterRequest {
    private String username;
    private String password;
    private String email;
    private String phone;
}
1
2
3
4
5
6
7
8
9
10
11
12

注册响应 DTO:

import lombok.Data;

/**
 * @description 注册响应数据对象,用于封装注册成功后的信息
 */
@Data
public class RegisterResponse {
    private String username;
    private String email;
    private String phone;
    private String avatar;
}
1
2
3
4
5
6
7
8
9
10
11
12

重要 API 和参数说明:

  • RegisterRequest:用于接收前端的用户名、密码、邮箱和电话。
  • RegisterResponse:用于返回注册成功后的用户信息。

# 3. Mapper 层:UserMapper

说明:使用 MyBatis 进行数据持久化操作,UserMapper 负责数据库的 CRUD 操作。

import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

/**
 * @description 用户持久化接口,定义数据库操作方法
 */
@Mapper
public interface UserMapper {

    /**
     * 根据用户名查询用户信息
     *
     * @param username 用户名
     * @return 用户信息
     */
    @Select("SELECT * FROM user WHERE username = #{username}")
    User findByUsername(String username);

    /**
     * 插入新的用户信息
     *
     * @param user 用户信息
     * @return 影响的行数
     */
    @Insert("INSERT INTO user(username, password, email, phone, avatar) " +
            "VALUES(#{username}, #{password}, #{email}, #{phone}, #{avatar})")
    int insertUser(User user);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

重要 API 和参数说明:

  • findByUsername(String username):根据用户名查询用户信息,判断是否已存在相同用户名的用户。
  • insertUser(User user):将注册信息插入数据库,成功插入后返回影响的行数。

# 4. Service 层:RegisterService 和 RegisterServiceImpl

说明:注册服务层负责处理用户的注册逻辑,包括用户名唯一性校验、密码加密、数据存储、返回响应结果。

注册服务接口:

/**
 * @description 注册服务接口,定义注册相关的方法
 */
public interface RegisterService {

    /**
     * 用户注册
     *
     * @param registerRequest 注册请求对象
     * @return 注册响应对象
     */
    RegisterResponse register(RegisterRequest registerRequest);
}
1
2
3
4
5
6
7
8
9
10
11
12
13

注册服务实现类:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import cn.hutool.crypto.digest.DigestUtil;

/**
 * @description 注册服务实现类,处理用户注册逻辑并保存用户信息
 */
@Service
public class RegisterServiceImpl implements RegisterService {

    @Autowired
    private UserMapper userMapper;

    @Override
    public RegisterResponse register(RegisterRequest registerRequest) {
        // 检查用户名是否已存在
        User existingUser = userMapper.findByUsername(registerRequest.getUsername());
        if (existingUser != null) {
            throw new CustomException(ResultCode.VALIDATE_FAILED, "用户名已存在");
        }

        // 密码加密
        String encryptedPassword = DigestUtil.md5Hex(registerRequest.getPassword());

        // 创建用户对象并设置属性
        User newUser = new User();
        newUser.setUsername(registerRequest.getUsername());
        newUser.setPassword(encryptedPassword);
        newUser.setEmail(registerRequest.getEmail());
        newUser.setPhone(registerRequest.getPhone());
        newUser.setAvatar("default_avatar_url"); // 可以设置一个默认头像

        // 保存用户信息到数据库
        int rows = userMapper.insertUser(newUser);
        if (rows <= 0) {
            throw new CustomException(ResultCode.FAILED, "注册失败");
        }

        // 构建注册响应对象
        RegisterResponse response = new RegisterResponse();
        response.setUsername(newUser.getUsername());
        response.setEmail(newUser.getEmail());
        response.setPhone(newUser.getPhone());
        response.setAvatar(newUser.getAvatar());

        return response;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48

重要 API 和参数说明:

  • register(RegisterRequest registerRequest):处理用户注册逻辑,包含用户名唯一性校验、密码加密、数据存储等。

# 5. Controller 层:RegisterController

说明:控制器层负责接收注册请求,并返回处理结果。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * @description 用户注册控制器,处理用户注册请求
 */
@RestController
@RequestMapping("/api/user")
public class RegisterController {

    @Autowired
    private RegisterService registerService;

    /**
     * 注册接口
     *
     * @param registerRequest 注册请求对象
     * @return 注册响应对象
     */
    @PostMapping("/register")
    public CommonResult<RegisterResponse> register(@RequestBody RegisterRequest registerRequest) {
        RegisterResponse response = registerService.register(registerRequest);
        return CommonResult.success(response);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

重要 API 和参数说明:

  • @PostMapping("/register"):处理注册请求,返回 CommonResult<RegisterResponse>。

# 6. 前后端注册流程详细说明

前端流程:

  1. 用户在注册页面输入用户名、密码、邮箱和电话。
  2. 前端将注册信息发送到后端注册接口。
  3. 注册成功后,后端返回用户信息,前端展示成功提示。

后端流程:

  1. 用户注册时,后端检查用户名是否已存在,避免重复注册。
  2. 密码加密存储,保障用户信息的安全性。
  3. 成功保存用户信息后,返回注册成功的用户信息。

# 7. 返回格式示例

以下是注册成功后的响应格式:

注册成功返回示例:

{
  "code": 200,
  "message": "操作成功",
  "data": {
    "username": "newuser",
    "email": "newuser@example.com",
    "phone": "1234567890",
    "avatar": "default_avatar_url"
  }
}
1
2
3
4
5
6
7
8
9
10

总结

本注册模块实现了用户注册的完整流程,具备以下优势:

  • 安全性:密码加密存储,避免明文密码泄露。
  • 可扩展性:可以方便地增加字段,如用户角色、权限等。
  • 完善的校验机制:避免重复注册,提高用户体验。
编辑此页 (opens new window)
上次更新: 2025/03/16, 22:19:39
通用 JWT 登录认证模块
基于 MyBatis curd

← 通用 JWT 登录认证模块 基于 MyBatis curd→

Theme by Vdoing | Copyright © 2019-2025 程序员scholar
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式