1.发送post请求 数据封装在map 获取map的手机号码
2.调用service层将手机号码 传入过去
3.正常返回状态码200
@RestController
@RequestMapping("/user")
public class LoginController {
@Autowired
private UserService userService;
/**
* 获取登录验证码
* 请求参数:phone (Map)
* 响应:void
*/
@PostMapping("/login")
public ResponseEntity login(@RequestBody Map map){
String phone =(String) map.get("phone");
userService.sendMsg(phone);
return ResponseEntity.ok(null); //正常返回状态码200
}
}
1.随机生成6位数字验证码
2.将验证码存入reids 使用固定前缀+手机号码 过期时间5分钟
@Service
public class UserService {
@Autowired
private SmsTemplate template;
@Autowired
private RedisTemplate<String,String> redisTemplate;
/**
* 发送短信验证码
* @param phone
*/
public void sendMsg(String phone) {
//1、随机生成6位数字
//String code = RandomStringUtils.randomNumeric(6);
String code = "123456";
//2、调用template对象,发送手机短信
//template.sendSms(phone,code);
//3、将验证码存入到redis
redisTemplate.opsForValue().set("CHECK_CODE_"+phone,code, Duration.ofMinutes(5));
}
}
1.从map中获得手机号码 和 验证码
2.调用service层 传入手机号码 和验证码
3.返回map map里必须要有token信息 和 isNew 是否新用户
/**
* 检验登录
*/
@PostMapping("/loginVerification")
public ResponseEntity loginVerification(@RequestBody Map map) {
//1、调用map集合获取请求参数
String phone = (String) map.get("phone");
String code = (String) map.get("verificationCode");
//2、调用userService完成用户登录
Map retMap = userService.loginVerification(phone,code);
//3、构造返回
return ResponseEntity.ok(retMap);
}
4.从redis获取验证码
5.对redis验证码进行一个非空判断(防止已经删除了) 与 对传入来的验证码进行一个校验 如果
redis验证码非空 或 验证码错误 则抛出异常
6.删除redis存的验证码(防止重复使用)
7.创建一个boolean值 isNew 默认是false(不是新用户)
8.调用api传入手机号 查找用户
9.判断用户是否存在
8.如果不存在就是新用户 重新new一个(因为没查找出来是null 必须在new一个) 设置他的手机
号码 以及密码(密码默认123456 md5加密) 然后保存 返回它的用户id(这里我有点不懂 insert 之后
为什么user 就有id)
9.将id设置给user isNew=true 表示是个新用户
10.创建map 存入id和手机号码 使用jwt加密成token
11.创建map保存数据 将生成的token存入进去 和 isNew 返回给controller层
/**
* 验证登录
* @param phone
* @param code
*/
public Map loginVerification(String phone, String code) {
//1、从redis中获取下发的验证码
String redisCode = redisTemplate.opsForValue().get("CHECK_CODE_" + phone);
//2、对验证码进行校验(验证码是否存在,是否和输入的验证码一致)
if(StringUtils.isEmpty(redisCode) || !redisCode.equals(code)) {
//验证码无效
throw new RuntimeException();
}
//3、删除redis中的验证码
redisTemplate.delete("CHECK_CODE_" + phone);
//4、通过手机号码查询用户
User user = userApi.findByMobile(phone);
boolean isNew = false;
//5、如果用户不存在,创建用户保存到数据库中
if(user == null) {
user = new User();
user.setMobile(phone);
user.setPassword(DigestUtils.md5Hex("123456"));
Long userId = userApi.save(user);
user.setId(userId);
isNew = true;
}
//6、通过JWT生成token(存入id和手机号码)
Map tokenMap = new HashMap();
tokenMap.put("id",user.getId());
tokenMap.put("mobile",phone);
String token = JwtUtils.getToken(tokenMap);
//7、构造返回值
Map retMap = new HashMap();
retMap.put("token",token);
retMap.put("isNew",isNew);
return retMap;
}