用户信息的修改
这里和之前的新增用户一样,也要重置表单,和用户信息查询回滚参数信息过来
/**
* 根据用户编号获取详细信息
*/
@PreAuthorize("@ss.hasPermi('system:user:query')")
@GetMapping(value = { "/", "/{userId}" })
public AjaxResult getInfo(@PathVariable(value = "userId", required = false) Long userId)
{
userService.checkUserDataScope(userId);
AjaxResult ajax = AjaxResult.success();
List<SysRole> roles = roleService.selectRoleAll();
ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
ajax.put("posts", postService.selectPostAll());
if (StringUtils.isNotNull(userId))
{
ajax.put(AjaxResult.DATA_TAG, userService.selectUserById(userId));
ajax.put("postIds", postService.selectPostListByUserId(userId));
ajax.put("roleIds", roleService.selectRoleListByUserId(userId));
}
return ajax;
}
和新增用户不一样,是这次有了userId的参数,所以这次也会走if判断。
这次不止把所有的角色信息和岗位信息拿到,还拿了要修改的用户的角色信息和岗位信息拿到,还有把用户实体类封装,(那为什么还要拿角色和岗位信息,我觉得应该这样封装方便前端来用),然后返回给前端。
然后就出现了这个页面。
修改用户数据
我们试下修改数据,看下后端怎么实现。
首先找到确定的前端方法
和新增用户页面的确定方法一样,只不过这次有userId,会走红框方法区。
顺藤摸瓜也找到updateUser的请求后台方法。
这次是个put请求,我们也很自然找到对应的controller方法
/**
* 修改用户
*/
@PreAuthorize("@ss.hasPermi('system:user:edit')")
@Log(title = "用户管理", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@Validated @RequestBody SysUser user)
{
userService.checkUserAllowed(user);
if (StringUtils.isNotEmpty(user.getPhonenumber())
&& UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user)))
{
return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,手机号码已存在");
}
else if (StringUtils.isNotEmpty(user.getEmail())
&& UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user)))
{
return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在");
}
user.setUpdateBy(getUsername());
return toAjax(userService.updateUser(user));
}
这里可以看出新用户名和旧用户名
在第一检查是否修改某个用户,如果要修改的用户是超级管理员则抛出异常。
/**
* 校验用户是否允许操作
*
* @param user 用户信息
*/
@Override
public void checkUserAllowed(SysUser user)
{
if (StringUtils.isNotNull(user.getUserId()) && user.isAdmin())
{
throw new ServiceException("不允许操作超级管理员用户");
}
}
在检验手机号是否重复的时候
/**
* 校验手机号码是否唯一
*
* @param user 用户信息
* @return
*/
@Override
public String checkPhoneUnique(SysUser user)
{
Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId();
SysUser info = userMapper.checkPhoneUnique(user.getPhonenumber());
//如果info为空,说明手机号肯定没重复,但如果是info不为空的,有可能是同一个用户,如果不是同一个用户则说明手机号重复。
if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue())
{
return UserConstants.NOT_UNIQUE;
}
return UserConstants.UNIQUE;
}
这里的info肯定不是null,但因为是同一个用户,所以不能认为手机号是重复的,返回0给controller。
最后是更新数据库了
/**
* 修改保存用户信息
*
* @param user 用户信息
* @return 结果
*/
@Override
@Transactional
public int updateUser(SysUser user)
{
Long userId = user.getUserId();
// 删除用户与角色关联
userRoleMapper.deleteUserRoleByUserId(userId);
// 新增用户与角色管理
insertUserRole(user);
// 删除用户与岗位关联
userPostMapper.deleteUserPostByUserId(userId);
// 新增用户与岗位管理
insertUserPost(user);
return userMapper.updateUser(user);
}
这里的更新策略是,用户信息有update方法,中间表通过先删除后新增的策略,感觉又学到了小tips
这个修改方法也用了@Transactional注解,运用了事务的特性。
删除用户
/**
* 删除用户
*/
@PreAuthorize("@ss.hasPermi('system:user:remove')")
@Log(title = "用户管理", businessType = BusinessType.DELETE)
@DeleteMapping("/{userIds}")
public AjaxResult remove(@PathVariable Long[] userIds)
{
if (ArrayUtils.contains(userIds, getUserId()))
{
return error("当前用户不能删除");
}
return toAjax(userService.deleteUserByIds(userIds));
}
这里传入了一个数组,说明可以把要删除的userId放入数组,然后批量删除。
这里面第一个if判断,是防止用户把自己给删除。
然后进入删除业务层
/**
* 批量删除用户信息
*
* @param userIds 需要删除的用户ID
* @return 结果
*/
@Override
@Transactional
public int deleteUserByIds(Long[] userIds)
{
for (Long userId : userIds)
{
checkUserAllowed(new SysUser(userId));
}
// 删除用户与角色关联
userRoleMapper.deleteUserRole(userIds);
// 删除用户与岗位关联
userPostMapper.deleteUserPost(userIds);
return userMapper.deleteUserByIds(userIds);
}
foreach循环是查看,是否有超级管理员在这userIds,防止删除超级管理员。
接下来就是一个简单的通过数组参数来进行循环删除记录,把中间表的相关记录删除,而用户表则是设置一个删除标记。