『博客开发日记-后台』之编辑角色接口的实现

本文最后更新于 2026年5月17日 晚上

编辑角色接口的实现


编辑角色接口的需求

其实编辑角色的需求和新增的差不多

要注意的是

不能对系统内置角色做任何更改

检查角色编码是否重复 需要排除自己

如果是自定义的角色部门数据

要先检验再删除再保存


代码实现

创建 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
/**
* 编辑角色请求DTO
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel(description = "编辑角色请求对象")
public class UpdateRoleDto
{

@NotBlank(message = "角色编码不能为空")
@ApiModelProperty(value = "角色编码", required = true, example = "testRole")
private String roleCode;

@NotBlank(message = "角色名称不能为空")
@ApiModelProperty(value = "角色名称", required = true, example = "测试角色")
private String name;

@ApiModelProperty(value = "排序", example = "1")
private Integer sort;

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

@ApiModelProperty(value = "数据权限(1-所有数据 2-部门及子部门数据 3-本部门数据 4-本人数据 5-自定义部门数据)", example = "4")
private Integer dataScope;

@ApiModelProperty(value = "自定义权限部门ID集合(dataScope=5时有效)")
private List<Long> deptIds;

@ApiModelProperty(value = "备注", example = "这是角色备注")
private String remark;

}

在 SysRoleServiceImpl 中实现方法

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

//编辑角色
@Override
public ResponseResult updateRole(Long id, UpdateRoleDto updateRoleDto)
{
//检查角色是否存在
SysRole oldRole = sysRoleService.getById(id);
if (oldRole == null) {
return ResponseResult.errorResult(AppHttpCodeEnum.SYSTEM_ERROR, "该角色不存在!");
}

//检查角色编码是否重复(排除自己)
LambdaQueryWrapper<SysRole> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SysRole::getRoleCode, updateRoleDto.getRoleCode())
.ne(SysRole::getId, id);
SysRole existRole = sysRoleService.getOne(wrapper);
if (existRole != null) {
return ResponseResult.errorResult(AppHttpCodeEnum.SYSTEM_ERROR, "角色编码已存在!");
}

//系统内置角色保护:禁止修改关键字段
boolean isProtectedRole = Objects.equals(oldRole.getRoleCode(), SystemConstants.ROLE_IS_ADMIN)
|| Objects.equals(oldRole.getId(), 1L);
if (isProtectedRole) {
if (!Objects.equals(oldRole.getRoleCode(), updateRoleDto.getRoleCode())) {
return ResponseResult.errorResult(AppHttpCodeEnum.SYSTEM_ERROR, "系统内置角色不允许修改角色编码!");
}
if (!Objects.equals(oldRole.getName(), updateRoleDto.getName())) {
return ResponseResult.errorResult(AppHttpCodeEnum.SYSTEM_ERROR, "系统内置角色不允许修改角色名称!");
}
if (updateRoleDto.getStatus() != null && !Objects.equals(updateRoleDto.getStatus(), SystemConstants.STATUS_NORMAL)) {
return ResponseResult.errorResult(AppHttpCodeEnum.SYSTEM_ERROR, "系统内置角色不允许禁用!");
}
if (updateRoleDto.getDataScope() != null && !Objects.equals(oldRole.getDataScope(), updateRoleDto.getDataScope())) {
return ResponseResult.errorResult(AppHttpCodeEnum.SYSTEM_ERROR, "系统内置角色不允许修改数据权限!");
}
}

//自定义部门权限时必须选择部门
if (updateRoleDto.getDataScope() != null
&& updateRoleDto.getDataScope().equals(SystemConstants.CUSTOM_DEPT_DATA_SCOPE)
&& (updateRoleDto.getDeptIds() == null || updateRoleDto.getDeptIds().isEmpty())) {
return ResponseResult.errorResult(AppHttpCodeEnum.SYSTEM_ERROR, "自定义数据权限时必须选择部门!");
}

//更新角色表
SysRole sysRole = BeanCopyUtils.copyBean(updateRoleDto, SysRole.class);
sysRole.setId(id);
boolean update = sysRoleService.updateById(sysRole);
if (!update) {
return ResponseResult.errorResult(AppHttpCodeEnum.SYSTEM_ERROR, "编辑角色失败!");
}

//先删除旧的角色部门关联
LambdaQueryWrapper<SysRoleDept> deptWrapper = new LambdaQueryWrapper<>();
deptWrapper.eq(SysRoleDept::getRoleId, id);
sysRoleDeptService.remove(deptWrapper);

//如果是自定义部门权限 则保存新的关联关系
if (updateRoleDto.getDataScope() != null
&& updateRoleDto.getDataScope().equals(SystemConstants.CUSTOM_DEPT_DATA_SCOPE)
&& updateRoleDto.getDeptIds() != null
&& !updateRoleDto.getDeptIds().isEmpty()) {
List<SysRoleDept> roleDeptList = new ArrayList<>();
for (Long deptId : updateRoleDto.getDeptIds()) {
SysRoleDept roleDept = new SysRoleDept();
roleDept.setRoleId(id);
roleDept.setDeptId(deptId);
roleDeptList.add(roleDept);
}

//将自定义的角色部门关联数据保存到 sys_role_dept 表
boolean saveDept = sysRoleDeptService.saveBatch(roleDeptList);
if (!saveDept) {
return ResponseResult.errorResult(AppHttpCodeEnum.SYSTEM_ERROR, "编辑角色部门关联失败!");
}
}

return ResponseResult.okResult();
}




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

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


预告

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

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

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


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


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