点评项目-2-完善注册登录业务
业务一:向手机发送验证码
需要处理的业务:在网页发送 /user/code 路径下的 post 请求后,我们需要检验手机号后,向合法的手机号发送一个随机生成的电话号
第一步:UserController
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@PostMapping("/code")//向用户的手机号发送验证码
public Result sendCode(@RequestParam("phone") String phone, HttpSession session){
return userService.sendCode(phone,session);
}
}
第二步,UserService
public interface UserService {
Result sendCode(String phone, HttpSession session);
}
第三步,UserService 实现类 UserServiceImpl
@Service
public class UserServiceImpl implements UserService {
@Override
public Result sendCode(String phone, HttpSession session) {
//先用 hutool 工具校验手机号是否合法
if (phone == null || !PhoneUtil.isPhone(phone)) {
return Result.fail("请输入合法的手机号");//若不合法直接响应错误
}
//用 hutool 工具生成六位验证码
String code = RandomUtil.randomNumbers(6);
//将生成的验证码放入 session
session.setAttribute("code",code);
//给手机号发送验证码,这里模拟发送验证码的操作,而不是真正的发送
System.out.println("手机收到了一条验证码短信:"+code);
return Result.ok();
}
}
第四步,完善响应类,响应操作结果给页面
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result {
private Boolean success;
private String errorMsg;
private Object data;
private Long total;
public static Result ok(){
return new Result(true, null, null, null);
}
public static Result ok(Object data){
return new Result(true, null, data, null);
}
public static Result ok(List<?> data, Long total){
return new Result(true, null, data, total);
}
public static Result fail(String errorMsg){
return new Result(false, errorMsg, null, null);
}
}
业务二:完成验证码登录校验
需要处理的业务:在网页发送 /user/login路径下的 post 请求后,我们需要检验手机号后,判断数据库中是否存在该手机号用户,若有则直接登录,若没有,则创建新用户存入数据库后登录
第一步:UserController
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@PostMapping("/code")//向用户的手机号发送验证码
public Result sendCode(@RequestParam("phone") String phone, HttpSession session){
return userService.sendCode(phone,session);
}
@PostMapping("/login")//请求会传递过来一个 json,代表登录的信息
public Result login(@RequestBody LoginFormDTO loginFormDTO, HttpSession session){
return userService.login(loginFormDTO,session);
}
}
第二步,UserService
public interface UserService {
Result login(LoginFormDTO loginFormDTO, HttpSession session);
Result sendCode(String phone, HttpSession session);
}
第三步,UserService 实现类 UserServiceImpl
@Autowired
private UserMapper userMapper;
@Override
public Result login(LoginFormDTO loginFormDTO, HttpSession session) {
if(loginFormDTO == null){
return Result.fail("无效操作");
}
//校验手机号
String phone = loginFormDTO.getPhone();
if (phone == null || !PhoneUtil.isPhone(phone)) {
return Result.fail("请输入合法的手机号");//若不合法直接响应错误
}
//拿到 session 域中的验证码
String code1 = loginFormDTO.getCode();
Object code = session.getAttribute("code");
System.out.println("请求发进来一个验证码,为:"+code1);
System.out.println("session域中的验证码,为:"+code.toString());
if(!code.toString().equals(code1)){
return Result.fail("验证码输入错误,请重新输入");
}
//验证码正确,判断是否存在用户
User user = userMapper.selectByPhone(phone);
if(user == null){
//若不存在就创建一个用户并存入 mysql
user = createUserByPhone(phone);
userMapper.insert(user);
}
//保存用户登录信息
session.setAttribute("user",user);
return Result.ok();
}
private User createUserByPhone(String phone) {
User user = new User();
user.setPhone(phone);
user.setNickName("user_"+RandomUtil.randomString(10));
return user;
}
第四步,完善 Mapper 中的 selectByPhone 接口方法
@Mapper
public interface UserMapper extends BaseMapper<User> {
@Select("select * from tb_user where phone = #{phone}")
User selectByPhone(@Param("phone") String phone);
}
第五步,完善登录请求的 json 对应的封装类
登录请求 json 会发送:验证码,手机号,密码
当前验证的是验证码和手机号组合的登录请求,此时密码为 null
@Data
public class LoginFormDTO {
private String phone;
private String code;
private String password;
}
最后,使用前端或者 postman 完成发送验证码请求,以及登录请求,若本地数据库成功加入请求输入的手机号,则表示操作成功
原文地址:https://blog.csdn.net/m0_75138009/article/details/142620991
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!