天天看點

使用者登入總結

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;
    }