String generateCode(String key) {
String code;
Long nowTime = System.currentTimeMillis();
List
@Override
public ApiResult sendEmailCode(Integer type, String email, Map templateParam) {
String sendCodePrefix;
Example example =Example.builder(User.class).andWhere(Sqls.custom().andEqualTo("username",email).andEqualTo("deleted",false)).build();
User user = userMapper.selectoneByExample(example);
if(Objects.nonNull(user)){
//发送短信的类型:目的是为了注册 那用户为空则已经注册
if (type.equals(SendCodeType.REGISTER.ordinal())) {
throw new BusinessException(ApiResult.USERNAME_IS_REGISTERED);
}
//用户注册过 但是被锁定
if (user.getStatus().equals(UserStatus.LOCKED.ordinal())) {
throw new BusinessException(ApiResult.BE_LOCKED);
}
if (type.equals(SendCodeType.FORGET_PWD.ordinal())) {
sendCodePrefix = RedisKeyPrefix.USER_FORGET_PWD_PREFIX + email;
} else if (type.equals(SendCodeType.BIND.ordinal())) {
// 手机号被绑定,无法发送
Example userAuthExample = Example.builder(UserAuth.class).where(Sqls.custom().andEqualTo("userId", user.getId())).build();
if (userAuthMapper.selectCountByExample(userAuthExample) > 0) {
throw new BusinessException(ApiResult.USER_AUTH_BIND);
}
sendCodePrefix = RedisKeyPrefix.USER_BIND_PHONE_PREFIX + email;
} else {
sendCodePrefix = RedisKeyPrefix.USER_UPDATE_PREFIX + email;
}
}else {
//用户为空
if (type.equals(SendCodeType.FORGET_PWD.ordinal())) {
throw new BusinessException(ApiResult.USERNAME_IS_NOT_EXIST);
} else if (type.equals(SendCodeType.BIND.ordinal())) {
sendCodePrefix = RedisKeyPrefix.USER_BIND_PHONE_PREFIX + email;
} else {
sendCodePrefix = RedisKeyPrefix.USER_REGISTER_PREFIX + email;
}
}
if (templateParam == null) {
//设置初始容量
templateParam = new HashMap<>(2);
}
String code = generateCode(sendCodePrefix);
redisTemplate.expireAt(sendCodePrefix, DateUtils.addMinutes(new Date(), 5));
templateParam.put(CODE, code);
//调用发送邮件接口
String result = emailService.sendCodeMail(email, code, "5", type, "zh");
if(result!=null){
return ApiResult.SUCCESS;
}
return ApiResult.BUSINESS_FAIL;
}
生成验证码的方法很有意思 避免频繁操作
这种redis操作hash的思想很有意思



