发表于: 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.开始重构代码,将一些共性的抽取出来,并且使用常量

三.遇到的问题

暂无

四.收获

以上

五.项目进度情况

已延期,希望不要有第二次延期


返回列表 返回列表
评论

    分享到