目录
前端流程
后端实现
找到对应的后端Controller方法
前端提交的是json格式的数据,后端要接收该数据需要使用RequestBody注解并提供对应的实体类。我们来看看实体类LoginFormDTO:
可以看到,有三个成员变量,分别对应手机号、验证码、密码。有密码字段是因为登录不仅可以验证码登录,也可以密码登录。
该Controller方法还有一个session参数,用于验证码校验,当校验成功时,把用户信息存入session。
修改Controller方法:
创建接口方法
实现接口方法
编写业务
代码分析
String phone = loginForm.getPhone();
if(RegexUtils.isPhoneInvalid(phone)){
return Result.fail("手机号格式错误!");
}
通过 RegexUtils.isPhoneInvalid(phone)
校验手机号的格式。如果手机号不符合预期格式,则返回错误提示,Result.fail("手机号格式错误!")
。
Object cacheCode = session.getAttribute("code");
String code = loginForm.getCode();
if(cacheCode == null || !cacheCode.toString().equals(code)){
return Result.fail("验证码错误");
}
从 session
中获取存储的验证码,并与用户提交的 loginForm.getCode()
进行比较。如果验证码不匹配,返回错误提示,Result.fail("验证码错误")
。
User user = query().eq("phone",phone).one();
根据手机号从数据库中查询用户,query().eq("phone",phone).one()
。
if(user == null){
user = createUserWithPhone(phone);
}
如果用户不存在,则调用 createUserWithPhone(phone)
创建新用户并保存到数据库。
session.setAttribute("user",user);
登录成功后,将用户信息保存到 session
中,便于后续访问时跟踪用户状态。
return Result.ok();
最后,返回登录成功的结果,Result.ok()
。
private User createUserWithPhone(String phone) {
User user = new User();
user.setPhone(phone);
user.setNickName(USER_NICK_NAME_PREFIX + RandomUtil.randomString(10));
save(user);
return user;
}
User
对象被初始化,并为其设置手机号。- 通过
RandomUtil.randomString(10)
随机生成一个 10 位长度的昵称,并为用户设置昵称,昵称以USER_NICK_NAME_PREFIX
作为前缀。 - 最后,将用户信息保存到数据库,并返回新创建的用户对象。
测试验证
前端使用一个手机号,得到验证码后登录,后端数据库会新增一条用户信息,但是前端登录成功后会弹回来,这是因为我们还没有做登录校验功能