通用 普通 注册模块
# 通用 普通 注册模块
本方案将详细介绍如何实现一个完整的用户注册模块,采用企业风格代码架构,涵盖数据库表设计、Controller 层、Service 层、Mapper 层和用户注册的逻辑,实现了数据校验、加密存储、响应格式标准化等功能,确保项目在实际生产环境中能够直接使用。
本方案包含以下部分:
- 数据库表设计
- 注册请求和响应 DTO
- Mapper 层:
UserMapper - Service 层:
RegisterService和RegisterServiceImpl - Controller 层:
RegisterController - 前后端注册流程详细说明
- 完整代码实现
# 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
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
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
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
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
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
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
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. 前后端注册流程详细说明
前端流程:
- 用户在注册页面输入用户名、密码、邮箱和电话。
- 前端将注册信息发送到后端注册接口。
- 注册成功后,后端返回用户信息,前端展示成功提示。
后端流程:
- 用户注册时,后端检查用户名是否已存在,避免重复注册。
- 密码加密存储,保障用户信息的安全性。
- 成功保存用户信息后,返回注册成功的用户信息。
# 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
2
3
4
5
6
7
8
9
10
总结
本注册模块实现了用户注册的完整流程,具备以下优势:
- 安全性:密码加密存储,避免明文密码泄露。
- 可扩展性:可以方便地增加字段,如用户角色、权限等。
- 完善的校验机制:避免重复注册,提高用户体验。
编辑此页 (opens new window)
上次更新: 2025/03/16, 22:19:39