redis实战05-实现短信验证码登录和注册功能
·
目录
前端流程

后端实现
找到对应的后端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作为前缀。 - 最后,将用户信息保存到数据库,并返回新创建的用户对象。
测试验证
前端使用一个手机号,得到验证码后登录,后端数据库会新增一条用户信息,但是前端登录成功后会弹回来,这是因为我们还没有做登录校验功能




更多推荐

所有评论(0)