由于用户的角色信息可能比较多,难以判断我们到底删除了哪些,添加了哪些,所以一开始就先山删除该用户的所有角色,再充型给该用户赋角色。
SysUserController
/**
* 修改管理员信息
* @param sysUser 管理员对象
* @return
*/
@ApiOperation("修改管理员信息")
@PutMapping
@PreAuthorize("hasAuthority('sys:user:update')")
public Result<String> modifySysUserInfo(@RequestBody SysUser sysUser) {
Integer count = sysUserService.modifySysUserInfo(sysUser);
return Result.handle(count>0);
}
SysUserServiceImpl
/**
* 修改管理员信息
* 1.删除原有的管理员与角色关系记录
* 2.添加新的管理员与角色关系记录
* 3.修改管理员信息
* @param sysUser
* @return
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Integer modifySysUserInfo(SysUser sysUser) {
// 获取管理员标识
Long userId = sysUser.getUserId();
// 删除原有的管理员与角色关系记录
sysUserRoleMapper.delete(new LambdaQueryWrapper<SysUserRole>()
.eq(SysUserRole::getUserId,userId)
);
// 添加管理员与角色关系记录
// 获取管理员的角色id集合
List<Long> roleIdList = sysUser.getRoleIdList();
// 判断是否有值
if (CollectionUtil.isNotEmpty(roleIdList) && roleIdList.size() != 0) {
// 创建管理员与角色关系的集合
List<SysUserRole> sysUserRoleList = new ArrayList<>();
// 循环遍历角色id集合
roleIdList.forEach(roleId -> {
// 创建管理员与角色的关系
SysUserRole sysUserRole = new SysUserRole();
sysUserRole.setUserId(userId);
sysUserRole.setRoleId(roleId);
/*// 新增管理员与角色的关系
注意:不建议在循环中操作数据库,大家尽量需要避免在循环中操作数据库
sysUserRoleMapper.insert(sysUserRole);*/
sysUserRoleList.add(sysUserRole);
});
// 批量添加管理员与角色的关系
sysUserRoleService.saveBatch(sysUserRoleList);
}
// 修改管理员信息
// 获取新密码(如果有值:说明管理员修改了密码,如果没有值:说明原密码不变)
String newPassword = sysUser.getPassword();
// 判断是否有值
if (StringUtils.hasText(newPassword)) {
// 有值:说明需要修改原密码
sysUser.setPassword(passwordEncoder.encode(newPassword));
}
return sysUserMapper.updateById(sysUser);
}
在spring boot的配置文件bootstrap.yml修改全局字段策略:更新时字段不能为空
mybatis-plus.global-config.db-config.update-strategy=not_null