发表于: 2017-10-25 21:43:21
1 647
一.今天完成的主要事情
1.编写短信接口实现
代码如下
/**
* 发送短信接口
*
* @param
* @return
* @throws ServiceException
* @throws ServiceDaoException
*/
@RequestMapping(value = "/a/sms", method = RequestMethod.POST)
public String sendSms(HttpServletRequest request,
HttpServletResponse response, ModelMap model, String cellphone, Integer type) throws Exception {
log.info("sendSms() parameter: cellphone is : " + cellphone);
Integer validateResult = SMSUtil.validateCellphone(cellphone, type);
if (validateResult < 0) {
model.addAttribute("code", validateResult);
return "/common/failure";
}
//前台调用该接口时才会有次数限制
String code;
Long nowTime = System.currentTimeMillis();
try {
if (type <= 1) {
//根据手机号和类型获取相应的idList
List<Long> smsIds = smsService.getSmsIdsByCellphoneAndType(cellphone, type, 0, Integer.MAX_VALUE);
log.info("get countSmsIdsByCellphone size is : " + smsIds.size());
//如果为空,直接生成并发送验证码,不为空则继续判断
if (CollectionUtils.isNotEmpty(smsIds)) {
List<Sms> smsList = smsService.getObjectsByIds(smsIds);
log.info("get sms data size is : " + smsList.size());
//获取当天发送的信息记录
Long[] date = SMSUtil.getDate();
Sms smsToday = null;
for (Sms sms : smsList) {
if (sms.getCreateAt()>=date[0] && sms.getCreateAt()<=date[1]) {
smsToday = sms;
break;
}
}
//一个用户当天只能发送5条
if (DataUtils.isNotNullOrEmpty(smsToday)) {
if (smsToday.getCount() > 4) {
log.info("SMS exceeded sending times");
model.addAttribute("code", -1008);
return "/common/failure";
}
//如果发送时间小于5分钟,则发送原验证码
if ((nowTime - smsToday.getSendAt()) <= 1000 * 60 * 5) {
code = smsToday.getMessage();
} else {
code = SMSUtil.generateVerifyCode();
}
boolean result = sendSMS.sendSMS(cellphone, code, SMSUtil.getTemplateParam(type));
if (result) {
log.info("short message send success");
smsToday.setSendAt(nowTime);
smsToday.setMessage(code);
smsToday.setCount(smsToday.getCount() + 1);
smsService.update(smsToday);
log.info("update sms success");
model.addAttribute("code", 0);
return "/common/success";
} else {
log.info("short message send failure");
model.addAttribute("code", -1009);
return "/common/failure";
}
}
}
}
code = SMSUtil.generateVerifyCode();
boolean result = sendSMS.sendSMS(cellphone, code, SMSUtil.getTemplateParam(type));
if (result) {
log.info("short message send success");
Sms sms = new Sms();
sms.setMessage(code);
sms.setType(type);
sms.setCellphone(cellphone);
sms.setCount(1);
sms.setSendAt(nowTime);
sms.setTypeSendAt(nowTime);
sms.setCreateBy(-1L);
sms.setUpdateBy(-1L);
Long smsId = smsService.insert(sms);
log.info("insert sms success, smsId is : " + smsId);
model.addAttribute("code", 0);
return "/common/success";
} else {
log.info("short message send failure");
model.addAttribute("code", -1009);
return "/common/failure";
}
} catch (Throwable t) {
t.printStackTrace();
log.error(t.getMessage());
log.error("sendSms() error, parameters cellphone : " + cellphone + ", type :" + type);
model.addAttribute("code", -1);
return "/common/failure";
}
}
主要逻辑是:
1.先验证参数
2.根据手机号去短信表中查询相应记录
3.找出今天的该类型的短信记录
4.查看count字段,如果count字段大于4,则当天再不允许发短信
5.比较发送时间和该条记录创建时间的时间,如果小于5分钟,则发送之前相同的验证码;如果大于5分钟,则发送重新生成的验证码
6.更新或者新增一条记录
2.完成登陆,注册,登出等接口
这些接口的逻辑实现基本都比较类似,而拦截器的实现是借鉴了金信优客的实现,今天没时间了,还有一些部分看不太懂,明天再研究一下吧
二.明天要完成的计划
1.完成剩下的查询用户详情接口
2.开始重构代码,将一些共性的抽取出来,并且使用常量
三.遇到的问题
暂无
四.收获
以上
五.项目进度情况
已延期,希望不要有第二次延期
评论