提交 946f7705 编写于 作者: F fengyw

feat: 优化验证码发送逻辑

上级 2a365cc5
package com.roncoo.education.common.core.aliyun;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* @author wujing
*/
@Data
@Accessors(chain = true)
public class Aliyun implements Serializable {
private static final long serialVersionUID = 1L;
private String aliyunAccessKeyId;
private String aliyunAccessKeySecret;
private String aliyunOssUrl;
private String aliyunOssEndpoint;
private String aliyunOssBucket;
// // 短信签名
// private String aliyunSmsSignName;
// private String aliyunSmsAccessKeyId;
// private String aliyunSmsAccessKeySecret;
// private String aliyunSmsAuthCode;
}
package com.roncoo.education.common.core.aliyun;
import cn.hutool.core.util.IdUtil;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.CannedAccessControlList;
import com.aliyun.oss.model.GeneratePresignedUrlRequest;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.PutObjectResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
/**
* @author fengyw
*/
@Slf4j
public final class AliyunOssUtil {
private final static String PREFIX = "education";
private AliyunOssUtil() {
}
public static String getUrlSign(Aliyun aliyun, String url, Date expires) {
GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(aliyun.getAliyunOssBucket(), url.replace(aliyun.getAliyunOssUrl(), ""));
generatePresignedUrlRequest.setExpiration(expires);
return url + "?" + getOssClient(aliyun.getAliyunOssEndpoint(), aliyun.getAliyunAccessKeyId(), aliyun.getAliyunAccessKeySecret()).generatePresignedUrl(generatePresignedUrlRequest).getQuery();
}
public static String uploadPic(File file, Aliyun aliyun) {
// 上传
try {
String name = file.getName();
String filePath = PREFIX + "/" + IdUtil.simpleUUID() + name.substring(name.lastIndexOf("."));
getOssClient(aliyun.getAliyunOssEndpoint(), aliyun.getAliyunAccessKeyId(), aliyun.getAliyunAccessKeySecret()).putObject(aliyun.getAliyunOssBucket(), filePath, file);
return aliyun.getAliyunOssUrl() + filePath;
} catch (Exception e) {
log.error("上传失败", e);
return "";
}
}
public static String uploadPic(MultipartFile file, Aliyun aliyun) {
// 上传
InputStream in = null;
try {
in = file.getInputStream();
String name = file.getOriginalFilename();
String filePath = PREFIX + "/" + IdUtil.simpleUUID() + name.substring(name.lastIndexOf("."));
getOssClient(aliyun.getAliyunOssEndpoint(), aliyun.getAliyunAccessKeyId(), aliyun.getAliyunAccessKeySecret()).putObject(aliyun.getAliyunOssBucket(), filePath, in);
return aliyun.getAliyunOssUrl() + filePath;
} catch (Exception e) {
log.error("上传失败", e);
return "";
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
}
}
}
}
public static String uploadDoc(File file, Aliyun aliyun) {
// 上传
try {
String name = file.getName();
String filePath = PREFIX + "/" + IdUtil.simpleUUID() + name.substring(name.lastIndexOf("."));
putObjectForFile(aliyun.getAliyunOssEndpoint(), aliyun.getAliyunAccessKeyId(), aliyun.getAliyunAccessKeySecret(), aliyun.getAliyunOssBucket(), filePath, new FileInputStream(file), file.getName());
return aliyun.getAliyunOssUrl() + filePath;
} catch (Exception e) {
log.error("上传失败", e);
return "";
}
}
public static String uploadDoc(MultipartFile file, Aliyun aliyun) {
InputStream in = null;
// 上传
try {
in = file.getInputStream();
String name = file.getOriginalFilename();
String filePath = PREFIX + "/" + IdUtil.simpleUUID() + name.substring(name.lastIndexOf("."));
putObjectForFile(aliyun.getAliyunOssEndpoint(), aliyun.getAliyunAccessKeyId(), aliyun.getAliyunAccessKeySecret(), aliyun.getAliyunOssBucket(), filePath, in, file.getOriginalFilename());
return aliyun.getAliyunOssUrl() + filePath;
} catch (Exception e) {
log.error("上传失败", e);
return "";
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
}
}
}
}
/**
* 根据url删除
*
* @param url
*/
public static void delete(String url, Aliyun aliyun) {
try {
String filePath = url.replace(aliyun.getAliyunOssUrl(), "");
deleteObject(aliyun.getAliyunOssBucket(), filePath, aliyun);
} catch (Exception e) {
log.error("上传失败", e);
}
}
private static String check(String url, String ossUrl) {
String key = url.replace(ossUrl, "");
if (key.startsWith("http")) {
if (ossUrl.startsWith("https")) {
ossUrl = "http" + ossUrl.substring(5, ossUrl.length());
} else {
ossUrl = "https" + ossUrl.substring(4, ossUrl.length());
}
}
return key.replace(ossUrl, "");
}
/**
* 文件存储入OSS
*
* @param bucketName
* @param key
* @param inputStream
*/
private static PutObjectResult putObjectForFile(String endpoint, String keyId, String keySecret, String bucketName, String key, InputStream inputStream, String fileName) {
OSS ossClient = getOssClient(endpoint, keyId, keySecret);
ObjectMetadata meta = new ObjectMetadata();
meta.setContentEncoding("UTF-8");
if (StringUtils.hasText(fileName)) {
meta.setContentDisposition("attachment;filename={}".replace("{}", fileName));
meta.setObjectAcl(CannedAccessControlList.Private);
}
return ossClient.putObject(bucketName, key, inputStream, meta);
}
private static OSS getOssClient(String endpoint, String keyId, String keySecret) {
return new OSSClientBuilder().build(endpoint, keyId, keySecret);
}
/**
* 删除Bucket中的Object
*
* @param bucketName
* @param key
* @throws IOException
*/
private static void deleteObject(String bucketName, String key, Aliyun aliyun) throws IOException {
getOssClient(aliyun.getAliyunOssEndpoint(), aliyun.getAliyunAccessKeyId(), aliyun.getAliyunAccessKeySecret()).deleteObject(bucketName, key);
}
}
//package com.roncoo.education.common.core.aliyun;
//
//import cn.hutool.json.JSONObject;
//import cn.hutool.json.JSONUtil;
//import com.aliyuncs.CommonRequest;
//import com.aliyuncs.DefaultAcsClient;
//import com.aliyuncs.IAcsClient;
//import com.aliyuncs.http.MethodType;
//import com.aliyuncs.profile.DefaultProfile;
//import com.aliyuncs.profile.IClientProfile;
//import lombok.extern.slf4j.Slf4j;
//
///**
// * @author fengyw
// */
//@Slf4j
//public final class AliyunSmsUtil {
//
// private AliyunSmsUtil() {
// }
//
// /**
// * 发送验证码
// *
// * @param mobile
// * @param code
// * @param aliyun
// */
// public static Boolean sendVerCode(String mobile, String code, Aliyun aliyun) {
// String templateParam = "{\"code\":\"{code}\"}".replace("{code}", code);
// return send(mobile, templateParam, aliyun.getAliyunSmsSignName(), aliyun.getAliyunSmsAuthCode(), aliyun.getAliyunSmsAccessKeyId(), aliyun.getAliyunSmsAccessKeySecret());
// }
//
// private static Boolean send(String phone, String templateParam, String signName, String templateCode, String accessKeyId, String accessKeySecret) {
// System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
// System.setProperty("sun.net.client.defaultReadTimeout", "10000");
// IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
// IAcsClient acsClient = new DefaultAcsClient(profile);
// // 组装请求对象
// CommonRequest request = new CommonRequest();
// request.setSysMethod(MethodType.POST);
// request.setSysDomain("dysmsapi.aliyuncs.com");
// request.setSysVersion("2017-05-25");
// request.setSysAction("SendSms");
// request.putQueryParameter("RegionId", "cn-hangzhou");
// request.putQueryParameter("PhoneNumbers", phone);
// request.putQueryParameter("SignName", signName);
// request.putQueryParameter("TemplateCode", templateCode);
// request.putQueryParameter("TemplateParam", templateParam);
// try {
// JSONObject resultJson = JSONUtil.parseObj(acsClient.getCommonResponse(request).getData());
// if (!"OK".equals(resultJson.getStr("Code"))) {
// log.error("短信发送错误={}", resultJson.getStr("Message"));
// return false;
// }
// return true;
// } catch (Exception e) {
// log.error("系统繁忙", e);
// return false;
// }
// }
//}
...@@ -26,9 +26,19 @@ public final class Constants { ...@@ -26,9 +26,19 @@ public final class Constants {
String ADMINI_MENU = "admin::menu::"; String ADMINI_MENU = "admin::menu::";
String ADMIN_VERI_CODE = "admin::ver::code::"; String ADMIN_VERI_CODE = "admin::ver::code::";
String USER_STUDY = "user::study::"; String USER_STUDY = "user::study::";
/**
* 资源
*/
String RESOURCE = "resource::"; String RESOURCE = "resource::";
/**
* 学习进度
*/
String PROGRESS = "progress::"; String PROGRESS = "progress::";
/**
* 短信验证码
*/
String CODE = "code::"; String CODE = "code::";
String CODE_STAT = "code::stat::";
} }
} }
...@@ -28,9 +28,9 @@ public class CacheRedis { ...@@ -28,9 +28,9 @@ public class CacheRedis {
*/ */
public <T> T set(String key, T t) { public <T> T set(String key, T t) {
if (t != null) { if (t != null) {
String value = JSUtil.toJsonString(t); String value = t.toString();
if (t instanceof String) { if (!(t instanceof String)) {
value = t.toString(); value = JSUtil.toJsonString(t);
} }
stringRedisTemplate.opsForValue().set(key, value, timeToLive, TimeUnit.MILLISECONDS); stringRedisTemplate.opsForValue().set(key, value, timeToLive, TimeUnit.MILLISECONDS);
} }
...@@ -42,9 +42,9 @@ public class CacheRedis { ...@@ -42,9 +42,9 @@ public class CacheRedis {
*/ */
public <T> T set(String key, T t, int time, TimeUnit timeUnit) { public <T> T set(String key, T t, int time, TimeUnit timeUnit) {
if (t != null) { if (t != null) {
String value = JSUtil.toJsonString(t); String value = t.toString();
if (t instanceof String) { if (!(t instanceof String)) {
value = t.toString(); value = JSUtil.toJsonString(t);
} }
stringRedisTemplate.opsForValue().set(key, value, time, timeUnit); stringRedisTemplate.opsForValue().set(key, value, time, timeUnit);
} }
...@@ -58,7 +58,7 @@ public class CacheRedis { ...@@ -58,7 +58,7 @@ public class CacheRedis {
return null; return null;
} }
public <T> T getByJson(String key, Class<T> clazz) { public <T> T get(String key, Class<T> clazz) {
String value = get(key); String value = get(key);
if (StringUtils.hasText(value)) { if (StringUtils.hasText(value)) {
return JSUtil.parseObject(value, clazz); return JSUtil.parseObject(value, clazz);
...@@ -66,12 +66,13 @@ public class CacheRedis { ...@@ -66,12 +66,13 @@ public class CacheRedis {
return null; return null;
} }
public <T> List<T> list(String key, Class<T> clazz) {
return JSUtil.parseArray(get(key), clazz);
}
public void delete(String key) { public void delete(String key) {
stringRedisTemplate.delete(key); stringRedisTemplate.delete(key);
} }
public <T> List<T> listByJson(String key, Class<T> clazz) {
return JSUtil.parseArray(get(key), clazz);
}
} }
package com.roncoo.education.common.core.sms; package com.roncoo.education.common.sms;
import lombok.Data; import lombok.Data;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
......
package com.roncoo.education.common.core.sms; package com.roncoo.education.common.sms;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil; import cn.hutool.crypto.SecureUtil;
......
...@@ -34,4 +34,13 @@ public class Upload implements Serializable { ...@@ -34,4 +34,13 @@ public class Upload implements Serializable {
private String minioSecretKey; private String minioSecretKey;
private String minioDomain; private String minioDomain;
private String minioBucket; private String minioBucket;
/**
* OSS
*/
private String aliyunOssEndpoint;
private String aliyunAccessKeyId;
private String aliyunAccessKeySecret;
private String aliyunOssUrl;
private String aliyunOssBucket;
} }
package com.roncoo.education.common.upload.impl; package com.roncoo.education.common.upload.impl;
import com.roncoo.education.common.core.aliyun.Aliyun; import cn.hutool.core.util.IdUtil;
import com.roncoo.education.common.core.aliyun.AliyunOssUtil; import com.aliyun.oss.OSS;
import com.roncoo.education.common.core.tools.BeanUtil; import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.CannedAccessControlList;
import com.aliyun.oss.model.ObjectMetadata;
import com.roncoo.education.common.upload.Upload; import com.roncoo.education.common.upload.Upload;
import com.roncoo.education.common.upload.UploadFace; import com.roncoo.education.common.upload.UploadFace;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
/** /**
* @author fengyw * @author fengyw
*/ */
...@@ -16,16 +21,45 @@ import org.springframework.web.multipart.MultipartFile; ...@@ -16,16 +21,45 @@ import org.springframework.web.multipart.MultipartFile;
@Component(value = "aliyun") @Component(value = "aliyun")
public class AliyunUploadImpl implements UploadFace { public class AliyunUploadImpl implements UploadFace {
private final static String PREFIX = "education";
@Override @Override
public String uploadPic(MultipartFile file, Upload upload) { public String uploadPic(MultipartFile file, Upload upload) {
Aliyun aliyun = BeanUtil.copyProperties(upload, Aliyun.class); return putObject(file, upload, CannedAccessControlList.PublicRead);
return AliyunOssUtil.uploadPic(file, aliyun);
} }
@Override @Override
public String uploadDoc(MultipartFile file, Upload upload) { public String uploadDoc(MultipartFile file, Upload upload) {
Aliyun aliyun = BeanUtil.copyProperties(upload, Aliyun.class); return putObject(file, upload, CannedAccessControlList.Private);
return AliyunOssUtil.uploadDoc(file, aliyun);
} }
/**
* 存入OSS
*/
private static String putObject(MultipartFile file, Upload upload, CannedAccessControlList cannedAcl) {
InputStream inputStream = null;
// 上传
try {
inputStream = file.getInputStream();
String name = file.getOriginalFilename();
String filePath = PREFIX + "/" + IdUtil.simpleUUID() + name.substring(name.lastIndexOf("."));
OSS ossClient = new OSSClientBuilder().build(upload.getAliyunOssEndpoint(), upload.getAliyunAccessKeyId(), upload.getAliyunAccessKeySecret());
ObjectMetadata meta = new ObjectMetadata();
meta.setContentEncoding("UTF-8");
meta.setContentDisposition("attachment;filename={}".replace("{}", name));
meta.setObjectAcl(cannedAcl);
ossClient.putObject(upload.getAliyunOssBucket(), filePath, inputStream, meta);
return upload.getAliyunOssUrl() + filePath;
} catch (Exception e) {
log.error("上传失败", e);
return "";
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
}
}
}
}
} }
package com.roncoo.education.system.feign.interfaces; package com.roncoo.education.system.feign.interfaces;
import com.roncoo.education.common.core.sms.SmsConfig; import com.roncoo.education.common.sms.SmsConfig;
import com.roncoo.education.system.feign.interfaces.vo.PayConfig; import com.roncoo.education.system.feign.interfaces.vo.PayConfig;
import com.roncoo.education.system.feign.interfaces.vo.SysConfig; import com.roncoo.education.system.feign.interfaces.vo.SysConfig;
import com.roncoo.education.system.feign.interfaces.vo.VodConfig; import com.roncoo.education.system.feign.interfaces.vo.VodConfig;
......
...@@ -41,7 +41,7 @@ public class UserStudyJob { ...@@ -41,7 +41,7 @@ public class UserStudyJob {
for (String key : keys) { for (String key : keys) {
if (cacheRedis.getStringRedisTemplate().getExpire(key, TimeUnit.MINUTES) < 1439) { if (cacheRedis.getStringRedisTemplate().getExpire(key, TimeUnit.MINUTES) < 1439) {
// 默认过期时间为60分钟,若剩余时间小于59分,则处理 // 默认过期时间为60分钟,若剩余时间小于59分,则处理
AuthUserStudyReq req = cacheRedis.getByJson(key, AuthUserStudyReq.class); AuthUserStudyReq req = cacheRedis.get(key, AuthUserStudyReq.class);
UserStudy userStudy = userStudyDao.getById(req.getStudyId()); UserStudy userStudy = userStudyDao.getById(req.getStudyId());
if (ResourceTypeEnum.VIDEO.getCode().equals(req.getResourceType()) || ResourceTypeEnum.AUDIO.getCode().equals(req.getResourceType())) { if (ResourceTypeEnum.VIDEO.getCode().equals(req.getResourceType()) || ResourceTypeEnum.AUDIO.getCode().equals(req.getResourceType())) {
userStudy.setProgress(req.getCurrentDuration().divide(req.getTotalDuration(), BigDecimal.ROUND_CEILING).multiply(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP)); userStudy.setProgress(req.getCurrentDuration().divide(req.getTotalDuration(), BigDecimal.ROUND_CEILING).multiply(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP));
......
...@@ -78,7 +78,7 @@ public class ApiUserStudyBiz extends BaseBiz { ...@@ -78,7 +78,7 @@ public class ApiUserStudyBiz extends BaseBiz {
} }
private Resource getByResource(AuthUserStudyReq req) { private Resource getByResource(AuthUserStudyReq req) {
Resource resource = cacheRedis.getByJson(Constants.RedisPre.RESOURCE + req.getResourceId(), Resource.class); Resource resource = cacheRedis.get(Constants.RedisPre.RESOURCE + req.getResourceId(), Resource.class);
if (ObjectUtil.isEmpty(resource)) { if (ObjectUtil.isEmpty(resource)) {
resource = resourceDao.getById(req.getResourceId()); resource = resourceDao.getById(req.getResourceId());
cacheRedis.set(Constants.RedisPre.RESOURCE + req.getResourceId(), resource, 1, TimeUnit.HOURS); cacheRedis.set(Constants.RedisPre.RESOURCE + req.getResourceId(), resource, 1, TimeUnit.HOURS);
...@@ -87,7 +87,7 @@ public class ApiUserStudyBiz extends BaseBiz { ...@@ -87,7 +87,7 @@ public class ApiUserStudyBiz extends BaseBiz {
} }
private UserStudy getUserStudy(AuthUserStudyReq req) { private UserStudy getUserStudy(AuthUserStudyReq req) {
UserStudy userStudy = cacheRedis.getByJson(Constants.RedisPre.USER_STUDY + req.getStudyId(), UserStudy.class); UserStudy userStudy = cacheRedis.get(Constants.RedisPre.USER_STUDY + req.getStudyId(), UserStudy.class);
if (ObjectUtil.isEmpty(userStudy)) { if (ObjectUtil.isEmpty(userStudy)) {
userStudy = dao.getById(req.getStudyId()); userStudy = dao.getById(req.getStudyId());
cacheRedis.set(Constants.RedisPre.USER_STUDY + req.getStudyId(), userStudy, 1, TimeUnit.HOURS); cacheRedis.set(Constants.RedisPre.USER_STUDY + req.getStudyId(), userStudy, 1, TimeUnit.HOURS);
......
package com.roncoo.education.system.feign; package com.roncoo.education.system.feign;
import com.roncoo.education.common.core.sms.SmsConfig; import com.roncoo.education.common.sms.SmsConfig;
import com.roncoo.education.system.feign.biz.FeignSysConfigBiz; import com.roncoo.education.system.feign.biz.FeignSysConfigBiz;
import com.roncoo.education.system.feign.interfaces.IFeignSysConfig; import com.roncoo.education.system.feign.interfaces.IFeignSysConfig;
import com.roncoo.education.system.feign.interfaces.vo.PayConfig; import com.roncoo.education.system.feign.interfaces.vo.PayConfig;
......
package com.roncoo.education.system.feign.biz; package com.roncoo.education.system.feign.biz;
import com.roncoo.education.common.core.sms.SmsConfig;
import com.roncoo.education.common.pay.util.AliPayConfig; import com.roncoo.education.common.pay.util.AliPayConfig;
import com.roncoo.education.common.pay.util.WxPayConfig; import com.roncoo.education.common.pay.util.WxPayConfig;
import com.roncoo.education.common.service.BaseBiz; import com.roncoo.education.common.service.BaseBiz;
import com.roncoo.education.common.sms.SmsConfig;
import com.roncoo.education.system.feign.interfaces.vo.PayConfig; import com.roncoo.education.system.feign.interfaces.vo.PayConfig;
import com.roncoo.education.system.feign.interfaces.vo.SysConfig; import com.roncoo.education.system.feign.interfaces.vo.SysConfig;
import com.roncoo.education.system.feign.interfaces.vo.VodConfig; import com.roncoo.education.system.feign.interfaces.vo.VodConfig;
......
...@@ -48,7 +48,7 @@ public class ApiCommonController { ...@@ -48,7 +48,7 @@ public class ApiCommonController {
} }
} }
@ApiOperation(value = "获取验证码", notes = "获取图片验证码") @ApiOperation(value = "获取图片验证码", notes = "获取图片验证码")
@GetMapping(value = "/code") @GetMapping(value = "/code")
public Result<ApiVerCodeResp> getVerCode() { public Result<ApiVerCodeResp> getVerCode() {
CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(200, 100, 4, 20); CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(200, 100, 4, 20);
......
...@@ -29,9 +29,9 @@ public class ApiUsersController { ...@@ -29,9 +29,9 @@ public class ApiUsersController {
private ApiUsersBiz biz; private ApiUsersBiz biz;
/** /**
* 注册验证码发送接口 * 验证码发送接口(注册验证码 + 重置密码验证码)
*/ */
@ApiOperation(value = "注册验证码发送接口", notes = "发送手机验证码") @ApiOperation(value = "验证码发送接口", notes = "发送手机验证码")
@RequestMapping(value = "/send/code", method = RequestMethod.POST) @RequestMapping(value = "/send/code", method = RequestMethod.POST)
public Result<String> sendCode(@RequestBody SendCodeReq req) { public Result<String> sendCode(@RequestBody SendCodeReq req) {
return biz.sendCode(req); return biz.sendCode(req);
......
...@@ -8,9 +8,9 @@ import cn.hutool.extra.servlet.ServletUtil; ...@@ -8,9 +8,9 @@ import cn.hutool.extra.servlet.ServletUtil;
import com.roncoo.education.common.cache.CacheRedis; import com.roncoo.education.common.cache.CacheRedis;
import com.roncoo.education.common.core.base.Result; import com.roncoo.education.common.core.base.Result;
import com.roncoo.education.common.core.enums.LoginStatusEnum; import com.roncoo.education.common.core.enums.LoginStatusEnum;
import com.roncoo.education.common.core.sms.SmsUtil;
import com.roncoo.education.common.core.tools.*; import com.roncoo.education.common.core.tools.*;
import com.roncoo.education.common.service.BaseBiz; import com.roncoo.education.common.service.BaseBiz;
import com.roncoo.education.common.sms.SmsUtil;
import com.roncoo.education.system.feign.interfaces.IFeignSysConfig; import com.roncoo.education.system.feign.interfaces.IFeignSysConfig;
import com.roncoo.education.user.dao.LogLoginDao; import com.roncoo.education.user.dao.LogLoginDao;
import com.roncoo.education.user.dao.UsersDao; import com.roncoo.education.user.dao.UsersDao;
...@@ -53,7 +53,6 @@ public class ApiUsersBiz extends BaseBiz { ...@@ -53,7 +53,6 @@ public class ApiUsersBiz extends BaseBiz {
if (!StringUtils.hasText(req.getMobile())) { if (!StringUtils.hasText(req.getMobile())) {
return Result.error("手机号不能为空"); return Result.error("手机号不能为空");
} }
// 验证码校验 // 验证码校验
String redisCode = cacheRedis.get(Constants.RedisPre.CODE + req.getMobile()); String redisCode = cacheRedis.get(Constants.RedisPre.CODE + req.getMobile());
if (!StringUtils.hasText(redisCode)) { if (!StringUtils.hasText(redisCode)) {
...@@ -62,6 +61,8 @@ public class ApiUsersBiz extends BaseBiz { ...@@ -62,6 +61,8 @@ public class ApiUsersBiz extends BaseBiz {
if (!req.getCode().equals(redisCode)) { if (!req.getCode().equals(redisCode)) {
return Result.error("验证码不正确"); return Result.error("验证码不正确");
} }
// 删除验证码缓存
cacheRedis.delete(Constants.RedisPre.CODE + req.getMobile());
if (!StringUtils.hasText(req.getMobilePwd())) { if (!StringUtils.hasText(req.getMobilePwd())) {
return Result.error("密码不能为空"); return Result.error("密码不能为空");
...@@ -96,8 +97,6 @@ public class ApiUsersBiz extends BaseBiz { ...@@ -96,8 +97,6 @@ public class ApiUsersBiz extends BaseBiz {
if (!StringUtils.hasText(req.getPassword())) { if (!StringUtils.hasText(req.getPassword())) {
return Result.error("密码不能为空"); return Result.error("密码不能为空");
} }
// 密码错误次数校验
// 用户校验 // 用户校验
Users user = userDao.getByMobile(req.getMobile()); Users user = userDao.getByMobile(req.getMobile());
if (null == user) { if (null == user) {
...@@ -155,15 +154,41 @@ public class ApiUsersBiz extends BaseBiz { ...@@ -155,15 +154,41 @@ public class ApiUsersBiz extends BaseBiz {
String code = NOUtil.getVerCode(); String code = NOUtil.getVerCode();
log.warn("手机号:{},验证码:{}", req.getMobile(), code); log.warn("手机号:{},验证码:{}", req.getMobile(), code);
// 正常应该是发送成功才放入缓存,这里方便没有短信通道的情况下,也能测试注册 // 验证码发送次数校验
if (!sendCodeCheck(req.getMobile())) {
return Result.error("验证码发送次数过多,请稍后再试");
}
// 正常应该是发送成功才放入缓存,这里方便没有短信通道的情况下,也能测试注册(上线需要删除,并打开下面)
cacheRedis.set(Constants.RedisPre.CODE + req.getMobile(), code, 5, TimeUnit.MINUTES); cacheRedis.set(Constants.RedisPre.CODE + req.getMobile(), code, 5, TimeUnit.MINUTES);
if (SmsUtil.sendVerCode(req.getMobile(), code, feignSysConfig.getSms())) { if (SmsUtil.sendVerCode(req.getMobile(), code, feignSysConfig.getSms())) {
// 发送成功才放入缓存
// cacheRedis.set(Constants.RedisPre.CODE + req.getMobile(), code, 5, TimeUnit.MINUTES);
return Result.success("发送成功"); return Result.success("发送成功");
} }
return Result.error("发送失败"); return Result.error("发送失败");
} }
/**
* 5分钟内,同一个手机号不能超2次发送验证码
*
* @param mobile
*/
private Boolean sendCodeCheck(String mobile) {
String count = cacheRedis.get(Constants.RedisPre.CODE_STAT + mobile);
if (StringUtils.hasText(count)) {
int countNum = Integer.valueOf(count);
if (countNum < 2) {
cacheRedis.set(Constants.RedisPre.CODE_STAT + mobile, countNum++);
return Boolean.TRUE;
}
} else {
cacheRedis.set(Constants.RedisPre.CODE_STAT + mobile, 1);
}
return Boolean.FALSE;
}
public Result<String> password(PasswordReq req) { public Result<String> password(PasswordReq req) {
// 验证码校验 // 验证码校验
String redisCode = cacheRedis.get(Constants.RedisPre.CODE + req.getMobile()); String redisCode = cacheRedis.get(Constants.RedisPre.CODE + req.getMobile());
...@@ -173,7 +198,10 @@ public class ApiUsersBiz extends BaseBiz { ...@@ -173,7 +198,10 @@ public class ApiUsersBiz extends BaseBiz {
if (!req.getCode().equals(redisCode)) { if (!req.getCode().equals(redisCode)) {
return Result.error("验证码不正确"); return Result.error("验证码不正确");
} }
if (StringUtils.isEmpty(req.getMobilePwd())) { // 删除验证码缓存
cacheRedis.delete(Constants.RedisPre.CODE + req.getMobile());
if (!StringUtils.hasText(req.getMobilePwd())) {
return Result.error("密码不能为空"); return Result.error("密码不能为空");
} }
// 密码校验 // 密码校验
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册