业务一:向手机发送验证码
需要处理的业务:在网页发送 /user/code 路径下的 post 请求后,我们需要检验手机号后,向合法的手机号发送一个随机生成的电话号
第一步:UserController
java">@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;@PostMapping("/code")//向用户的手机号发送验证码public Result sendCode(@RequestParam("phone") String phone, HttpSession session){return userService.sendCode(phone,session);}}
第二步,UserService
java">public interface UserService {Result sendCode(String phone, HttpSession session);}
第三步,UserService 实现类 UserServiceImpl
java">@Service
public class UserServiceImpl implements UserService {@Overridepublic Result sendCode(String phone, HttpSession session) {//先用 hutool 工具校验手机号是否合法if (phone == null || !PhoneUtil.isPhone(phone)) {return Result.fail("请输入合法的手机号");//若不合法直接响应错误}//用 hutool 工具生成六位验证码String code = RandomUtil.randomNumbers(6);//将生成的验证码放入 sessionsession.setAttribute("code",code);//给手机号发送验证码,这里模拟发送验证码的操作,而不是真正的发送System.out.println("手机收到了一条验证码短信:"+code);return Result.ok();}
}
第四步,完善响应类,响应操作结果给页面
java">@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
java">@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate 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
java">public interface UserService {Result login(LoginFormDTO loginFormDTO, HttpSession session);Result sendCode(String phone, HttpSession session);}
第三步,UserService 实现类 UserServiceImpl
java"> @Autowiredprivate UserMapper userMapper;@Overridepublic 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){//若不存在就创建一个用户并存入 mysqluser = 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 接口方法
java">@Mapper
public interface UserMapper extends BaseMapper<User> {@Select("select * from tb_user where phone = #{phone}")User selectByPhone(@Param("phone") String phone);}
第五步,完善登录请求的 json 对应的封装类
登录请求 json 会发送:验证码,手机号,密码
当前验证的是验证码和手机号组合的登录请求,此时密码为 null
java">@Data
public class LoginFormDTO {private String phone;private String code;private String password;
}
最后,使用前端或者 postman 完成发送验证码请求,以及登录请求,若本地数据库成功加入请求输入的手机号,则表示操作成功