1、背景
用户删除后时重复添加同名用户报错,原因是因为删除用户时使用的是逻辑删除,并未从数据库中真实删除,由于用户信息还是比较重要的。
2、关键代码片段
Controller
/**
* 新增用户
*/
@PreAuthorize("@ss.hasPermi('system:user:add')")
@Log(title = "用户管理", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@Validated @RequestBody SysUser user) {
if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(user.getUserName()))) {
return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,登录账号已存在");
} else 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.setCreateBy(getUsername());
user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
return toAjax(userService.insertUser(user));
}
Service
/**
* 校验用户名称是否唯一
*
* @param userName 用户名称
* @return 结果
*/
String checkUserNameUnique(String userName);
/**
* 校验手机号码是否唯一
*
* @param user 用户信息
* @return 结果
*/
String checkPhoneUnique(SysUser user);
/**
* 校验email是否唯一
*
* @param user 用户信息
* @return 结果
*/
String checkEmailUnique(SysUser user);
Impl
/**
* 校验用户名称是否唯一
*
* @param userName 用户名称
* @return 结果
*/
@Override
public String checkUserNameUnique(String userName) {
int count = baseMapper.checkUserNameUnique(userName);
if (count > 0) {
return UserConstants.NOT_UNIQUE;
}
return UserConstants.UNIQUE;
}
/**
* 校验手机号码是否唯一
*
* @param user 用户信息
* @return
*/
@Override
public String checkPhoneUnique(SysUser user) {
String userId = StringUtils.isNull(user.getUserId()) ? "" : user.getUserId();
SysUser info = baseMapper.checkPhoneUnique(user.getPhonenumber());
if (StringUtils.isNotNull(info) && !info.getUserId().equals(userId)) {
return UserConstants.NOT_UNIQUE;
}
return UserConstants.UNIQUE;
}
/**
* 校验email是否唯一
*
* @param user 用户信息
* @return
*/
@Override
public String checkEmailUnique(SysUser user) {
String userId = StringUtils.isEmpty(user.getUserId()) ? "" : user.getUserId();
SysUser info = baseMapper.checkEmailUnique(user.getEmail());
if (StringUtils.isNotNull(info) && !info.getUserId().equals(userId)) {
return UserConstants.NOT_UNIQUE;
}
return UserConstants.UNIQUE;
}
mapper
public interface SysUserMapper extends BaseMapper<SysUser> {
/**
* 校验用户名称是否唯一
*
* @param userName 用户名称
* @return 结果
*/
int checkUserNameUnique(String userName);
}
下文修改了此处 checkxxxUnique 的查询条件 del_flag = '0'
<select id="checkUserNameUnique" parameterType="String" resultType="int">
select count(1) from sys_user where user_name = #{userName} limit 1
</select>
<select id="checkPhoneUnique" parameterType="String" resultMap="SysUserResult">
select user_id, phonenumber from sys_user where phonenumber = #{phonenumber} limit 1
</select>
<select id="checkEmailUnique" parameterType="String" resultMap="SysUserResult">
select user_id, email from sys_user where email = #{email} limit 1
</select>
灵活拙见:修改后代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.SysUserMapper">
<select id="checkUserNameUnique" parameterType="String" resultType="int">
select count(1) from sys_user where del_flag = '0' and user_name = #{userName} limit 1
</select>
<select id="checkPhoneUnique" parameterType="String" resultMap="SysUserResult">
select user_id, phonenumber from sys_user where del_flag = '0' and phonenumber = #{phonenumber} limit 1
</select>
<select id="checkEmailUnique" parameterType="String" resultMap="SysUserResult">
select user_id, email from sys_user where del_flag = '0' and email = #{email} limit 1
</select>
</mapper>
3、其他思考
实际最简单的方式是直接修改删除逻辑为物理删除,但是思考了一下后,由此不由得想到现如今好多系统,注销账户后会提示一周保留账号信息,软删除还是很有必要的,思考了如下参考方案。
标签:return,String,用户,索引,Plus,user,UserConstants,1Mybatis,UNIQUE From: https://www.cnblogs.com/Code-Rain/p/16547551.html