『博客开发日记-后台』之新增用户接口的实现

本文最后更新于 2026年5月18日 下午

新增用户接口的实现


新增用户接口的需求

检查用户名是否已经存在

检查部门是否存在

检查角色是否存在,且不能包含系统超级管理员角色

新增用户并设置默认密码并加密后入库

保存用户角色关联


代码实现

创建 AddRoleDto

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
/**
* 添加用户请求DTO
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel(description = "添加用户请求对象")
public class AddUserDto {

@ApiModelProperty(value = "用户头像", example = "技术相关的文章")
private String avatar;

@NotBlank(message = "部门id不能为空")
@ApiModelProperty(value = "部门id", required = true, example = "3")
private String deptId;

@ApiModelProperty(value = "邮箱", example = "2962933152@qq.com")
private String email;

@ApiModelProperty(value = "用户性别,(0 男,1 女,2 隐藏)", example = "0")
private String sex;

@ApiModelProperty(value = "手机号", example = "1234567890")
private String mobile;

@NotBlank(message = "昵称不能为空")
@ApiModelProperty(value = "昵称", required = true, example = "云梦泽")
private String nickname;

@NotEmpty(message = "角色不能为空")
@ApiModelProperty(value = "角色id列表", required = true, example = "[1,2,3]")
private List<Long> roleIds;

@NotBlank(message = "状态不能为空")
@Pattern(regexp = "^[01]$", message = "状态只能为0或1")
@ApiModelProperty(value = "状态(0-正常,1-禁用)", required = true, example = "0")
private String status;

@NotBlank(message = "用户名不能为空")
@ApiModelProperty(value = "用户名", required = true, example = "云梦泽")
private String username;

}

在 AdminUserServiceImpl 中实现方法

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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
 //添加用户
@Override
public ResponseResult addUser(AddUserDto addUserDto)
{
//检查用户名是否已经存在
LambdaQueryWrapper<SysUser> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(SysUser::getUsername, addUserDto.getUsername());
long count = sysUserService.count(queryWrapper);
if (count > 0) {
return ResponseResult.errorResult(AppHttpCodeEnum.SYSTEM_ERROR, "用户名重复,请使用其他用户名!");
}

//检查手机号是否已经存在 因为手机号和邮箱不是必填项 所以用 StringUtils.hasText() 来防止查空数据
if (StringUtils.hasText(addUserDto.getMobile())) {
queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(SysUser::getPhone, addUserDto.getMobile());
count = sysUserService.count(queryWrapper);
if (count > 0) {
return ResponseResult.errorResult(AppHttpCodeEnum.SYSTEM_ERROR, "手机号重复,请使用其他手机号!");
}
}

//检查邮箱是否已经存在
if (StringUtils.hasText(addUserDto.getEmail())) {
queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(SysUser::getEmail, addUserDto.getEmail());
count = sysUserService.count(queryWrapper);
if (count > 0) {
return ResponseResult.errorResult(AppHttpCodeEnum.SYSTEM_ERROR, "邮箱重复,请使用其他邮箱!");
}
}

//检查部门是否存在
SysDept dept = null;
if (StringUtils.hasText(addUserDto.getDeptId())) {
try {
dept = sysDeptService.getById(Long.valueOf(addUserDto.getDeptId()));
} catch (NumberFormatException e) {
return ResponseResult.errorResult(AppHttpCodeEnum.SYSTEM_ERROR, "部门ID格式不正确");
}
}
if (dept == null) {
return ResponseResult.errorResult(AppHttpCodeEnum.SYSTEM_ERROR, "部门不存在!");
}

//检查角色是否存在,且不能包含系统超级管理员角色
for (Long roleId : addUserDto.getRoleIds())
{
SysRole role = sysRoleService.getById(roleId);
if (role == null) {
return ResponseResult.errorResult(AppHttpCodeEnum.SYSTEM_ERROR, "角色不存在!");
}
if (Objects.equals(role.getId(), 1L)) {
return ResponseResult.errorResult(AppHttpCodeEnum.SYSTEM_ERROR, "不能分配系统超级管理员角色!");
}
}

//新增用户并设置默认密码并加密后入库
SysUser user = BeanCopyUtils.copyBean(addUserDto, SysUser.class);
user.setPassword(new BCryptPasswordEncoder().encode("user123456"));

boolean save = sysUserService.save(user);
if (!save) {
return ResponseResult.errorResult(AppHttpCodeEnum.SYSTEM_ERROR, "新增用户失败!");
}

//保存用户角色关联
List<SysUserRole> userRoles = addUserDto.getRoleIds().stream()
.map(roleId -> {
SysUserRole userRole = new SysUserRole();
userRole.setUserId(user.getId());
userRole.setRoleId(roleId);
userRole.setCreateTime(new Date());
return userRole;
})
.collect(Collectors.toList());

for (SysUserRole userRole : userRoles) {
sysUserRoleMapper.insert(userRole);
}

return ResponseResult.okResult();
}




PS:该系列只做为作者学习开发项目做的笔记用

不一定符合读者来学习,仅供参考


预告

后续会记录博客的开发过程

每次学习会做一份笔记来进行发表

“一花一世界,一叶一菩提”


版权所有 © 2026 云梦泽
欢迎访问我的个人网站:https://hgt12.github.io/


『博客开发日记-后台』之新增用户接口的实现
http://example.com/2026/05/17/『博客开发日记-后台』之新增用户接口的实现/
作者
云梦泽
发布于
2026年5月17日
更新于
2026年5月18日
许可协议