1.用户输入手机号获取验证码开始.
说明一下,如果需要在获取手机号验证码之前进行一个图片滑块校验,参看前一篇博文
1.1前端获取数据封装类
@Data
public class NoteDTO extends InputObject {
/**
* 手机号
*/
private String UserAccount;
/**
* 短信验证码
*/
private String code;
/**
* 滑块校验的uuid
*/
private String uuid;
/**
* 滑块校验的横向滑动的参数
*/
private Integer moveEnd_X;
}
1.2 判断用户是否存在
这里把主要业务放进了controller层,望周知
首先对手机号判断数据库是否存在,也就是是否已经注册
/**
* @return
* @Author
* @Description 校验该账户是否存在
* @Date 9:38 2019/10/15
* @Param [sportUserAccountVo]
**/
@PostMapping("/userExist")
public OutputObject getVerificationCode(@RequestBody NoteDTO noteDTO) {
//查询该账户是否存在
UserInfoPo byUserAccount = userInfoService.findByUserAccount(noteDTO.getUserAccount());
if (byUserAccount != null) {
return new OutputObject(StatusCode.PHONE_NUMBER_RIGISTED.getCode(), StatusCode.PHONE_NUMBER_RIGISTED.getMessage(), new ArrayList());
}
return new OutputObject(StatusCode.SUCCESS.getCode(), StatusCode.SUCCESS.getMessage(), new ArrayList());
}
Service层
/**
* @Author
* @Description
* @Date 14:07 2019/10/14
* @Param [sportUserAccountVo]
* @return
**/
@Override
public UserInfoPo findByUserAccount(String userAccount) {
//查出该用户的所有信息
UserInfoPo userInfoPos = userInfoMapper.findUserInfoByUserAccount(userAccount);
return userInfoPos;
}
dao层 主要是普通的查询操作,在这里我解释一下OutPutObject是控制层的数据响应,也就是状态码,当然也可以是个对象。
/**
* @Author
* @Description
* @Date 19:44 2019/10/14
* @Param [userAccount]
* @return
**/
UserInfoPo findUserInfoByUserAccount(@Param("userAccount") String userAccount);
1.3 发送短信验证码和校验验证码
这里的校验验证码单独分开来方便解耦,后面的很多操作都会用到这个校验功能,或者抽取一个工具类也是可以的。这里校验是在发送短信时我们在Redis中存入,验证时通过用户的标识,从Redis中取出来,相对比较安全的方式。
// An highlighted block
/**
* @return com.deyi.govaffair.pojo.OutputObject
* @Description 发送短信方法
* @Param [noteDTO]
**/
@RequestMapping(value = "send", method = RequestMethod.POST)
public OutputObject messageSend(@RequestBody NoteDTO noteDTO, HttpSession session) {
//查询该账户是否存在
UserInfoPo byUserAccount = userInfoService.findByUserAccount(noteDTO.getUserAccount());
if (byUserAccount != null) {
return new OutputObject(StatusCode.PHONE_NUMBER_RIGISTED.getCode(), StatusCode.PHONE_NUMBER_RIGISTED.getMessage(), new ArrayList());
}
//从Session中获取uuid的值对应的裁剪横向距离
int CJX = (int) session.getAttribute(noteDTO.getUuid());
//用户拉取裁剪图片的横向距离
int moveEnd_X = noteDTO.getMoveEnd_X();
if (moveEnd_X > CJX - 10 && moveEnd_X < CJX + 10) { //偏差在10之内
System.out.println("拼接成功");
//map.put("YZ", "1");
LOGGER.info("发送短信:{}", noteDTO);
if (EmptyUtil.isEmpty(noteDTO.getUserAccount())) {
return new OutputObject(StatusCode.PHONE_NUMBER_IS_NULL.getCode(), StatusCode.PHONE_NUMBER_IS_NULL.getMessage(), new ArrayList());
}
String code = RandomUtil.getRandom(4);
//调用发送短信服务,发送成功之后存储到redis
/*
* phoneNumber 手机号
* verificationCode 验证码
* expire过期时间(分钟)
*/
Map<String, String> map1 = new HashMap<>();
map1.put("phoneNumber", noteDTO.getUserAccount());
map1.put("verificationCode", code);
map1.put("expire", "10");
RongLianSmsSendUtils.sendVerificationCode(map1);
redisManager.set(RedisPrefix.MESSAGE_CODE.getInfo() + noteDTO.getUserAccount(), code, 600);
return new OutputObject(StatusCode.SUCCESS.getCode(), StatusCode.SUCCESS.getMessage(), 1);
}
return new OutputObject(StatusCode.FAIL.getCode(), StatusCode.FAIL.getMessage(), 0);
}
/**
* 短信验证码验证接口
* @param noteDTO
* @return com.deyi.govaffair.pojo.OutputObject
* @author 张汉飞
* @date 2019-07-20 15:22:59
*/
@RequestMapping(value ="verification", method=RequestMethod.POST)
public OutputObject messageSendVerification(@RequestBody NoteDTO noteDTO){
if(EmptyUtil.isEmpty(noteDTO.getUserAccount())){
return new OutputObject(StatusCode.PHONE_NUMBER_IS_NULL.getCode(),StatusCode.PHONE_NUMBER_IS_NULL.getMessage(),new ArrayList());
}
if(EmptyUtil.isEmpty(noteDTO.getCode())){
return new OutputObject(StatusCode.CODE_IS_NULL.getCode(),StatusCode.CODE_IS_NULL.getMessage(),new ArrayList());
}
Object redisMessageCode = redisManager.get(RedisPrefix.MESSAGE_CODE.getInfo() + noteDTO.getUserAccount());
if(EmptyUtil.isNotEmpty(redisMessageCode) && redisMessageCode.equals(noteDTO.getCode())){
return new OutputObject(StatusCode.SUCCESS.getCode(),StatusCode.SUCCESS.getMessage(),new ArrayList());
}
return new OutputObject(StatusCode.CODE_MISS.getCode(),StatusCode.CODE_MISS.getMessage(),new ArrayList());
}
1.4当然前面的校验必须通过,接下来才是注册。
在这里我们不厌其烦的对验证码、用户账号、用户信息的校验当然是为了规范和安全。
/**
* @return com.deyi.govaffair.pojo.OutputObject
* @Description 用户注册接口
* @Param [userInfoDTO]
**/
@PostMapping("register")
public OutputObject register(@RequestBody UserInfoDTO userInfoDTO) {
//判断用户名(手机号是否未空)
if (EmptyUtil.isEmpty(userInfoDTO.getUserAccount())) {
return new OutputObject(StatusCode.PHONE_NUMBER_IS_NULL.getCode(), StatusCode.PHONE_NUMBER_IS_NULL.getMessage(), new ArrayList());
}
//查询该账户是否存在存在
UserInfoPo byUserAccount = userInfoService.findByUserAccount(userInfoDTO.getUserAccount());
if (byUserAccount != null) {
return new OutputObject(StatusCode.PHONE_NUMBER_RIGISTED.getCode(), StatusCode.PHONE_NUMBER_RIGISTED.getMessage(), new ArrayList());
}
if (EmptyUtil.isEmpty(userInfoDTO.getCode())) {
return new OutputObject(StatusCode.CODE_IS_NULL.getCode(), StatusCode.CODE_IS_NULL.getMessage(), new ArrayList());
}
Object redisMessageCode = redisManager.get(RedisPrefix.MESSAGE_CODE.getInfo() + userInfoDTO.getUserAccount());
//校验验证码
if (EmptyUtil.isNotEmpty(redisMessageCode) && redisMessageCode.equals(userInfoDTO.getCode())) {
//将验证码存储在redis中的前缀为 message:code: 的key批量删除
redisManager.del(RedisPrefix.MESSAGE_CODE.getInfo() + userInfoDTO.getUserAccount());
//执行保存操作
OutputObject outputObject = userInfoService.saveUserInfo(userInfoDTO);
return new OutputObject(StatusCode.SUCCESS.getCode(), StatusCode.SUCCESS.getMessage(), new ArrayList());
}
return new OutputObject(StatusCode.CODE_MISS.getCode(), StatusCode.CODE_MISS.getMessage(), new ArrayList());
}
其中的持久层和业务层只是简单的展示,主要是对数据库的查,增相信对大家都是便饭,思路讲清楚,具体的大家应该都能实现。