1.發送驗證碼
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));
}
}
2.使用者登入
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
/**
* 驗證登入
* @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;
}