feat(tenant): 新增手机号唯一性校验逻辑,重构密码重置和短信验证码接口支持多租户

- 优化部门校验使用isEmpty()方法
- 在SysMessageServiceImpl中为短信发送添加租户隔离支持
This commit is contained in:
PIG AI committed 2025-07-15 10:06:45 +08:00
1 parent 2b64a4cfe1
commit 7be922ef0f
2 files changed
+25 -21

No files matched your search

@@ -43,6 +43,7 @@ import com.pig4cloud.pigx.common.core.exception.ErrorCodes;
import com.pig4cloud.pigx.common.core.util.MsgUtils; import com.pig4cloud.pigx.common.core.util.MsgUtils;
import com.pig4cloud.pigx.common.core.util.R; import com.pig4cloud.pigx.common.core.util.R;
import com.pig4cloud.pigx.common.data.cache.RedisUtils; import com.pig4cloud.pigx.common.data.cache.RedisUtils;
import com.pig4cloud.pigx.common.data.tenant.TenantBroker;
import com.pig4cloud.pigx.common.data.tenant.TenantContextHolder; import com.pig4cloud.pigx.common.data.tenant.TenantContextHolder;
import com.pig4cloud.pigx.common.file.core.FileTemplate; import com.pig4cloud.pigx.common.file.core.FileTemplate;
import com.pig4cloud.pigx.common.log.util.JacksonSensitiveFieldUtil; import com.pig4cloud.pigx.common.log.util.JacksonSensitiveFieldUtil;
@@ -119,7 +120,6 @@ public class SysMessageServiceImpl extends ServiceImpl<SysMessageMapper, SysMess
/** /**
* 发送信息 * 发送信息
*
* @param id id * @param id id
* @return true/false * @return true/false
*/ */
@@ -135,7 +135,6 @@ public class SysMessageServiceImpl extends ServiceImpl<SysMessageMapper, SysMess
/** /**
* 保存消息及其关联关系 * 保存消息及其关联关系
*
* @param sysMessage 消息对象 * @param sysMessage 消息对象
* @return 是否保存成功 * @return 是否保存成功
*/ */
@@ -146,7 +145,8 @@ public class SysMessageServiceImpl extends ServiceImpl<SysMessageMapper, SysMess
if (Objects.isNull(sysMessage.getId())) { if (Objects.isNull(sysMessage.getId())) {
baseMapper.insert(messageEntity); baseMapper.insert(messageEntity);
} else { }
else {
baseMapper.updateById(sysMessage); baseMapper.updateById(sysMessage);
} }
@@ -162,7 +162,8 @@ public class SysMessageServiceImpl extends ServiceImpl<SysMessageMapper, SysMess
relationEntity.setUserId(user.getId()); relationEntity.setUserId(user.getId());
relationMapper.insert(relationEntity); relationMapper.insert(relationEntity);
}); });
} else { }
else {
userMapper.selectList(Wrappers.emptyWrapper()).stream().map(SysUser::getUserId).forEach(userId -> { userMapper.selectList(Wrappers.emptyWrapper()).stream().map(SysUser::getUserId).forEach(userId -> {
SysMessageRelationEntity relationEntity = new SysMessageRelationEntity(); SysMessageRelationEntity relationEntity = new SysMessageRelationEntity();
relationEntity.setMsgId(messageEntity.getId()); relationEntity.setMsgId(messageEntity.getId());
@@ -175,7 +176,6 @@ public class SysMessageServiceImpl extends ServiceImpl<SysMessageMapper, SysMess
/** /**
* 获取用户的信息列表 * 获取用户的信息列表
*
* @return list * @return list
*/ */
@Override @Override
@@ -196,7 +196,6 @@ public class SysMessageServiceImpl extends ServiceImpl<SysMessageMapper, SysMess
/** /**
* 读取信息 * 读取信息
*
* @param id id * @param id id
* @return true/false * @return true/false
*/ */
@@ -213,7 +212,6 @@ public class SysMessageServiceImpl extends ServiceImpl<SysMessageMapper, SysMess
/** /**
* 获取信息 * 获取信息
*
* @param id id * @param id id
* @return messageVO * @return messageVO
*/ */
@@ -250,7 +248,6 @@ public class SysMessageServiceImpl extends ServiceImpl<SysMessageMapper, SysMess
/** /**
* 查询用户阅读情况 * 查询用户阅读情况
*
* @param page 分页 * @param page 分页
* @param messageId 消息ID * @param messageId 消息ID
* @param name 姓名 * @param name 姓名
@@ -271,14 +268,13 @@ public class SysMessageServiceImpl extends ServiceImpl<SysMessageMapper, SysMess
/** /**
* 发送手机验证码 TODO: 调用短信网关发送验证码,测试返回前端 * 发送手机验证码 TODO: 调用短信网关发送验证码,测试返回前端
*
* @param mobile mobile * @param mobile mobile
* @return code * @return code
*/ */
@Override @Override
public R<Boolean> sendSmsCode(String mobile) { public R<Boolean> sendSmsCode(String mobile) {
List<SysUser> userList = userMapper List<SysUser> userList = TenantBroker
.selectList(Wrappers.<SysUser>query().lambda().eq(SysUser::getPhone, mobile)); .noneAs(() -> userMapper.selectList(Wrappers.<SysUser>query().lambda().eq(SysUser::getPhone, mobile)));
if (CollUtil.isEmpty(userList)) { if (CollUtil.isEmpty(userList)) {
log.info("手机号未注册:{}", mobile); log.info("手机号未注册:{}", mobile);
@@ -308,7 +304,6 @@ public class SysMessageServiceImpl extends ServiceImpl<SysMessageMapper, SysMess
/** /**
* 发送短信 * 发送短信
*
* @param messageSmsDTO 消息 短信 DTO * @param messageSmsDTO 消息 短信 DTO
* @return {@link R } * @return {@link R }
*/ */
@@ -372,7 +367,6 @@ public class SysMessageServiceImpl extends ServiceImpl<SysMessageMapper, SysMess
/** /**
* 发送钩子消息 * 发送钩子消息
*
* @param messageHookDTO 消息挂钩 DTO * @param messageHookDTO 消息挂钩 DTO
* @return {@link R } * @return {@link R }
*/ */
@@ -449,7 +443,6 @@ public class SysMessageServiceImpl extends ServiceImpl<SysMessageMapper, SysMess
/** /**
* 发送邮件 * 发送邮件
*
* @param messageEmailDTO 留言内容 电子邮件 DTO * @param messageEmailDTO 留言内容 电子邮件 DTO
* @return {@link R } * @return {@link R }
*/ */
@@ -516,7 +509,6 @@ public class SysMessageServiceImpl extends ServiceImpl<SysMessageMapper, SysMess
/** /**
* 列出 Hook 业务代码 * 列出 Hook 业务代码
*
* @param messageHookDTO 消息钩子 DTO * @param messageHookDTO 消息钩子 DTO
* @return {@link R } * @return {@link R }
*/ */
@@ -47,6 +47,7 @@ import com.pig4cloud.pigx.common.core.util.R;
import com.pig4cloud.pigx.common.data.cache.RedisUtils; import com.pig4cloud.pigx.common.data.cache.RedisUtils;
import com.pig4cloud.pigx.common.data.datascope.DataScope; import com.pig4cloud.pigx.common.data.datascope.DataScope;
import com.pig4cloud.pigx.common.data.resolver.ParamResolver; import com.pig4cloud.pigx.common.data.resolver.ParamResolver;
import com.pig4cloud.pigx.common.data.tenant.TenantBroker;
import com.pig4cloud.pigx.common.excel.vo.ErrorMessage; import com.pig4cloud.pigx.common.excel.vo.ErrorMessage;
import com.pig4cloud.pigx.common.security.service.PigxUser; import com.pig4cloud.pigx.common.security.service.PigxUser;
import com.pig4cloud.pigx.common.security.util.SecurityUtils; import com.pig4cloud.pigx.common.security.util.SecurityUtils;
@@ -391,7 +392,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
// 执行数据插入操作 组装 UserDto // 执行数据插入操作 组装 UserDto
for (UserExcelVO excel : excelVOList) { for (UserExcelVO excel : excelVOList) {
// 个性化校验逻辑 // 个性化校验逻辑
List<SysUser> userList = this.list(); List<SysUser> userList = TenantBroker.noneAs(this::list);
Set<String> errorMsg = new HashSet<>(); Set<String> errorMsg = new HashSet<>();
// 校验用户名是否存在 // 校验用户名是否存在
@@ -402,11 +403,17 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_USER_USERNAME_EXISTING, excel.getUsername())); errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_USER_USERNAME_EXISTING, excel.getUsername()));
} }
// 校验手机号是否存在
boolean exsitPhone = userList.stream().anyMatch(sysUser -> excel.getPhone().equals(sysUser.getPhone()));
if (exsitPhone) {
errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_USER_PHONE_EXISTING, excel.getPhone()));
}
// 判断输入的部门名称列表是否合法 // 判断输入的部门名称列表是否合法
Optional<SysDept> deptOptional = deptList.stream() Optional<SysDept> deptOptional = deptList.stream()
.filter(dept -> excel.getDeptNameList().equals(dept.getName())) .filter(dept -> excel.getDeptNameList().equals(dept.getName()))
.findFirst(); .findFirst();
if (!deptOptional.isPresent()) { if (deptOptional.isEmpty()) {
errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_DEPT_DEPTNAME_INEXISTENCE, excel.getDeptNameList())); errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_DEPT_DEPTNAME_INEXISTENCE, excel.getDeptNameList()));
} }
@@ -488,15 +495,16 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public R<Boolean> registerUser(RegisterUserDTO userDto) { public R<Boolean> registerUser(RegisterUserDTO userDto) {
// 判断用户名是否存在 // 判断用户名是否存在
boolean usernameExists = this boolean usernameExists = TenantBroker
.exists(Wrappers.<SysUser>lambdaQuery().eq(SysUser::getUsername, userDto.getUsername())); .noneAs(() -> this.exists(Wrappers.<SysUser>lambdaQuery().eq(SysUser::getUsername, userDto.getUsername())));
if (usernameExists) { if (usernameExists) {
String message = MsgUtils.getMessage(ErrorCodes.SYS_USER_USERNAME_EXISTING, userDto.getUsername()); String message = MsgUtils.getMessage(ErrorCodes.SYS_USER_USERNAME_EXISTING, userDto.getUsername());
return R.failed(message); return R.failed(message);
} }
// 判断手机号是否存在 // 判断手机号是否存在
boolean phoneExists = this.exists(Wrappers.<SysUser>lambdaQuery().eq(SysUser::getPhone, userDto.getPhone())); boolean phoneExists = TenantBroker
.noneAs(() -> this.exists(Wrappers.<SysUser>lambdaQuery().eq(SysUser::getPhone, userDto.getPhone())));
if (phoneExists) { if (phoneExists) {
String message = MsgUtils.getMessage(ErrorCodes.SYS_USER_PHONE_EXISTING, userDto.getPhone()); String message = MsgUtils.getMessage(ErrorCodes.SYS_USER_PHONE_EXISTING, userDto.getPhone());
return R.failed(message); return R.failed(message);
@@ -626,7 +634,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
*/ */
@Override @Override
@CacheEvict(value = CacheConstants.USER_DETAILS, key = "#userDto.username") @CacheEvict(value = CacheConstants.USER_DETAILS, key = "#userDto.username")
public R<Boolean> resetUserPassword(RegisterUserDTO userDto) { public R resetUserPassword(RegisterUserDTO userDto) {
// 校验密码 // 校验密码
R checkedPassword = checkPassword(userDto.getUsername(), userDto.getPassword()); R checkedPassword = checkPassword(userDto.getUsername(), userDto.getPassword());
if (!checkedPassword.isOk()) { if (!checkedPassword.isOk()) {
@@ -666,6 +674,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
return R.failed("验证码错误"); return R.failed("验证码错误");
} }
TenantBroker.noneAs(() -> {
String username = lambdaQuery().select(SysUser::getUsername) String username = lambdaQuery().select(SysUser::getUsername)
.eq(SysUser::getPhone, userDto.getPhone()) .eq(SysUser::getPhone, userDto.getPhone())
.one() .one()
@@ -679,6 +688,9 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
.set(SysUser::getPasswordExpireFlag, CommonConstants.STATUS_NORMAL) .set(SysUser::getPasswordExpireFlag, CommonConstants.STATUS_NORMAL)
.eq(SysUser::getPhone, userDto.getPhone())); .eq(SysUser::getPhone, userDto.getPhone()));
cacheManager.getCache(CacheConstants.USER_DETAILS).evict(username); cacheManager.getCache(CacheConstants.USER_DETAILS).evict(username);
return username;
});
return R.ok(); return R.ok();
} }