提交 5f61f6dd 编写于 作者: F fengyw

修改

上级 6fc24fe0
......@@ -20,4 +20,9 @@ public class Aliyun implements Serializable {
private String aliyunOssEndpoint;
private String aliyunOssBucket;
// 短信签名
private String signName;
// 验证码模板
private String templateVer;
}
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.getSignName(), aliyun.getTemplateVer(), aliyun.getAliyunAccessKeyId(), aliyun.getAliyunAccessKeySecret());
}
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;
}
}
}
......@@ -33,6 +33,7 @@ public final class Constants {
String USER_STUDY = "user::study::";
String RESOURCE = "resource::";
String PROGRESS = "progress::";
String CODE = "code::";
}
}
......@@ -18,6 +18,10 @@ public final class NOUtil {
private NOUtil() {
}
public static String getVerCode() {
return RandomUtil.randomNumbers(6);
}
public static Long getOrderNo() {
return Long.valueOf(DateUtil.format(new Date(), YYYYMMDDHHMMSS) + RandomUtil.randomNumbers(3));
}
......
package com.roncoo.education.course.job;
import cn.hutool.core.collection.CollUtil;
import com.roncoo.education.common.core.tools.BeanUtil;
import com.roncoo.education.common.es.EsCourse;
import com.roncoo.education.course.dao.CourseDao;
import com.roncoo.education.course.dao.impl.mapper.entity.Course;
import com.roncoo.education.course.dao.impl.mapper.entity.CourseExample;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.data.elasticsearch.core.query.IndexQuery;
import org.springframework.data.elasticsearch.core.query.IndexQueryBuilder;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
/**
* 同步课程数据到es
*
* @author fengyw
*/
@Component
public class CourseJob {
@Autowired
private CourseDao courseDao;
@Autowired
private ElasticsearchRestTemplate elasticsearchRestTemplate;
/**
* 每分钟执行一次
*/
@Scheduled(fixedRate = 60000)
public void course() {
CourseExample example = new CourseExample();
List<Course> courseList = courseDao.listByExample(example);
if (CollUtil.isNotEmpty(courseList)) {
List<IndexQuery> queries = new ArrayList<>();
for (Course course : courseList) {
EsCourse esCourse = BeanUtil.copyProperties(course, EsCourse.class);
IndexQuery query = new IndexQueryBuilder().withObject(esCourse).build();
queries.add(query);
}
elasticsearchRestTemplate.indexOps(EsCourse.class).delete();
elasticsearchRestTemplate.bulkIndex(queries, IndexCoordinates.of(EsCourse.COURSE));
}
}
}
package com.roncoo.education.course.test;
import com.roncoo.education.common.core.base.Result;
import com.roncoo.education.course.job.CourseJob;
import com.roncoo.education.course.service.api.biz.ApiCourseBiz;
import com.roncoo.education.course.service.api.req.ApiCourseReq;
import com.roncoo.education.course.service.api.resp.ApiCourseResp;
......@@ -14,6 +15,9 @@ public class CourseTest extends BaseTest {
@Autowired
private ApiCourseBiz courseBiz;
@Autowired
private CourseJob courseJob;
@Test
public void view() {
ApiCourseReq req = new ApiCourseReq();
......@@ -21,4 +25,9 @@ public class CourseTest extends BaseTest {
Result<ApiCourseResp> result = courseBiz.view(req);
log.info("course={}", result.getData());
}
@Test
public void es() {
courseJob.course();
}
}
package com.roncoo.education.system.feign.interfaces;
import com.roncoo.education.common.core.aliyun.Aliyun;
import com.roncoo.education.common.core.base.Page;
import com.roncoo.education.system.feign.interfaces.qo.SysConfigEditQO;
import com.roncoo.education.system.feign.interfaces.qo.SysConfigPageQO;
......@@ -62,4 +63,7 @@ public interface IFeignSysConfig {
*/
@GetMapping(value = "/get/{id}")
SysConfigViewVO getById(@PathVariable(value = "id") Long id);
}
\ No newline at end of file
@GetMapping(value = "/getAliyun")
Aliyun getAliyun();
}
package com.roncoo.education.system.feign;
import com.roncoo.education.common.core.aliyun.Aliyun;
import com.roncoo.education.common.core.base.Page;
import com.roncoo.education.system.feign.biz.FeignSysConfigBiz;
import com.roncoo.education.system.feign.interfaces.IFeignSysConfig;
......@@ -54,4 +55,9 @@ public class FeignSysConfigController implements IFeignSysConfig {
public SysConfigViewVO getById(@PathVariable(value = "id") Long id) {
return biz.getById(id);
}
@Override
public Aliyun getAliyun() {
return biz.getAliyun();
}
}
package com.roncoo.education.system.feign.biz;
import com.roncoo.education.common.core.aliyun.Aliyun;
import com.roncoo.education.common.core.base.Page;
import com.roncoo.education.common.core.base.PageUtil;
import com.roncoo.education.common.core.tools.BeanUtil;
......@@ -18,6 +19,9 @@ import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import javax.validation.constraints.NotNull;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 系统配置
......@@ -57,4 +61,11 @@ public class FeignSysConfigBiz extends BaseBiz {
SysConfig record = dao.getById(id);
return BeanUtil.copyProperties(record, SysConfigViewVO.class);
}
public Aliyun getAliyun() {
SysConfigExample example = new SysConfigExample();
List<SysConfig> sysConfigs = dao.listByExample(example);
Map<String, String> map = sysConfigs.stream().collect(Collectors.toMap(SysConfig::getConfigKey, SysConfig::getConfigValue));
return BeanUtil.objToBean(map, Aliyun.class);
}
}
......@@ -4,6 +4,7 @@ import com.roncoo.education.common.core.base.Result;
import com.roncoo.education.user.service.api.biz.ApiUsersBiz;
import com.roncoo.education.user.service.api.req.PasswordReq;
import com.roncoo.education.user.service.api.req.RegisterReq;
import com.roncoo.education.user.service.api.req.SendCodeReq;
import com.roncoo.education.user.service.api.resp.UsersLoginResp;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
......@@ -26,6 +27,15 @@ public class ApiUsersController {
@Autowired
private ApiUsersBiz biz;
/**
* 注册验证码发送接口
*/
@ApiOperation(value = "注册验证码发送接口", notes = "发送手机验证码")
@RequestMapping(value = "/send/code", method = RequestMethod.POST)
public Result<String> sendCode(@RequestBody SendCodeReq req) {
return biz.sendCode(req);
}
/**
* 注册接口
*/
......
......@@ -2,22 +2,30 @@ package com.roncoo.education.user.service.api.biz;
import cn.hutool.core.util.IdUtil;
import cn.hutool.crypto.digest.DigestUtil;
import com.roncoo.education.common.cache.CacheRedis;
import com.roncoo.education.common.core.aliyun.AliyunSmsUtil;
import com.roncoo.education.common.core.base.Result;
import com.roncoo.education.common.core.enums.LoginStatusEnum;
import com.roncoo.education.common.core.tools.Constants;
import com.roncoo.education.common.core.tools.JWTUtil;
import com.roncoo.education.common.core.tools.NOUtil;
import com.roncoo.education.common.service.BaseBiz;
import com.roncoo.education.system.feign.interfaces.IFeignSysConfig;
import com.roncoo.education.user.dao.LogLoginDao;
import com.roncoo.education.user.dao.UsersDao;
import com.roncoo.education.user.dao.impl.mapper.entity.LogLogin;
import com.roncoo.education.user.dao.impl.mapper.entity.Users;
import com.roncoo.education.user.service.api.req.PasswordReq;
import com.roncoo.education.user.service.api.req.RegisterReq;
import com.roncoo.education.user.service.api.req.SendCodeReq;
import com.roncoo.education.user.service.api.resp.UsersLoginResp;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import java.util.concurrent.TimeUnit;
/**
* 用户基本信息
*
......@@ -30,6 +38,10 @@ public class ApiUsersBiz extends BaseBiz {
private UsersDao userDao;
@Autowired
private LogLoginDao logLoginDao;
@Autowired
private CacheRedis cacheRedis;
@Autowired
private IFeignSysConfig feignSysConfig;
@Transactional
......@@ -37,6 +49,16 @@ public class ApiUsersBiz extends BaseBiz {
if (StringUtils.isEmpty(req.getMobile())) {
return Result.error("手机号不能为空");
}
// 验证码校验
String redisCode = cacheRedis.get(Constants.RedisPre.CODE + req.getMobile());
if (!StringUtils.hasText(redisCode)) {
return Result.error("验证码已经过期");
}
if (!req.getCode().equals(redisCode)) {
return Result.error("验证码不正确");
}
if (StringUtils.isEmpty(req.getMobilePwd())) {
return Result.error("密码不能为空");
}
......@@ -113,4 +135,13 @@ public class ApiUsersBiz extends BaseBiz {
logLoginDao.save(record);
}
public Result<String> sendCode(SendCodeReq req) {
String code = NOUtil.getVerCode();
if (AliyunSmsUtil.sendVerCode(req.getMobile(), code, feignSysConfig.getAliyun())) {
// 缓存5分钟
cacheRedis.set(Constants.RedisPre.CODE + req.getMobile(), code, 5, TimeUnit.MINUTES);
return Result.success("发送成功");
}
return Result.error("发送失败");
}
}
/**
* Copyright 2015-现在 广州市领课网络科技有限公司
*/
package com.roncoo.education.user.service.api.req;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* <p>
* 用户基本信息
* </p>
*
* @author wujing123
*/
@Data
@Accessors(chain = true)
public class SendCodeReq implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 手机号码
*/
private String mobile;
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册