点评项目-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 完成发送验证码请求,以及登录请求,若本地数据库成功加入请求输入的手机号,则表示操作成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值