03秒杀系统业务之一 用户服务

架构设计(基础的组件)

涉及到的数据表

在这里插入图片描述

涉及到的模型(抽象,根据各层的需要)

在这里插入图片描述
在这里插入图片描述

根据各层不同的需求需要进行POJO的各种封装

用户注册

生成验证码

在这里插入图片描述

  • 前端填写手机号,传送给后端
  • 后端生成验证码,发送成功标志给前端
  • 前端获取到Json数据对其分析跳转到注册页面,进行表单填写

  @RequestMapping(value = "/getotp",method = {RequestMethod.POST},consumes = {CONTENT_TYPE_FORMED})//consumers传输的数据为form表单
    @ResponseBody
    //@RequestParam传送的参数
    public CommonReturnType getOtp(@RequestParam(name="telphone") String telphone){

        //需要按照一定的规则生成OTP验证码
        Random random = new Random();
        int randomInt = random.nextInt(99999);
        randomInt =randomInt+1000;
        String otpCode = String.valueOf(randomInt);

        //将OTP验证码同对应用户的手机号关联
        //可以使用Redis缓存的方式存储
        //在这里使用HttpSession的方式绑定手机号与OTPcODE
        httpServletRequest.getSession().setAttribute(telphone,otpCode);


        //将OTP验证码通过短信发送给用户,省略
        System.out.println("telphone="+telphone+"&optCode="+otpCode);

        //返回给前端数据
        /**
         * {data:null ,status:suyceess}
         */
        return CommonReturnType.create(null);
    }

在这里插入图片描述
在这里插入图片描述

提交注册的信息进行注册

在这里插入图片描述

前端提交注册数据表单---->验证码校验----->封装UserModel----->调用服务层的用户注册服务(保存用户,保存密码)

在这里插入图片描述

  • 前端提交的数据封装成后端的Model,然后Model当保存到数据库中的时候,需要转换成数据库表的格式(尤其是数据库Model对应数据库多个表的操作的时候),可以使用Beautils.Copy(src,dest),但需要注意在拷贝的时候,字段一定要对应(数据类型),否则可能存在赋值为空的情况
  • 对密码进行加密,再保存到数据库中
  • 对各个字段校验是否为空,可以使用validation工具,一般情况下前端提交的时候已经进行了一次校验,但是我们最后进行一次校验,越靠近用户的校验越好,可以提高用户的体验度。

   //用户注册接口
    @RequestMapping(value = "/register",method = {RequestMethod.POST},consumes = {CONTENT_TYPE_FORMED})
    @ResponseBody
    public CommonReturnType register(
            //前端传过来的数据
            @RequestParam(name="telphone") String telphone,
            @RequestParam(name="otpCode") String optCode,
            @RequestParam(name="name") String name,
            @RequestParam(name="gender") Byte gender,
            @RequestParam(name="age") Integer age,
            @RequestParam(name="password") String password
    ) throws BusinessException, UnsupportedEncodingException, NoSuchAlgorithmException {

            //验证手机号和对应的optCode相符合
        //获取会话中的验证码 进行比对
            String inSessionOptCode = (String)this.httpServletRequest.getSession().getAttribute(telphone);


            //使用对optCode进行笔记哦奥
        if(!StringUtils.equals(inSessionOptCode,optCode)){
            throw  new BusinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR,"短信验证码不符合");
        }

        //用户注册的流程
        UserModel userModel = new UserModel();
        userModel.setName(name);
        userModel.setGender(gender);
        userModel.setAge(age);
        userModel.setTelphone(telphone);
        userModel.setRegisterMode("byphone");
        userModel.setEncrptPassword(this.EncodeByMd5(password));

        //注册用户
        userService.register(userModel);

        //返回给前端数据
        return CommonReturnType.create(null);

    }

下面是保存用户信息与用户密码的服务
注意加了@Transactional注解


   @Override
    @Transactional //声明式事务
    public void register(UserModel userModel) throws BusinessException {
        if(userModel==null){
            throw new BusinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR);
        }

        //用户的注册流程:判空
//        if(StringUtils.isEmpty(userModel.getName())||
//                (userModel.getGender()==null)||
//                (userModel.getAge()==null)||
//                StringUtils.isEmpty(userModel.getTelphone())
//                ){
//            throw new BusinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR);
//        }

        //进行校验
        ValidationResult result = validatorImpl.validate(userModel);
        if(result.isHasErroes()){
            throw new BusinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR,result.getErrMsg());
        }

        //实现model--->dataObject方法//实现model--->dataObject方法
        UserDO userDO = convertFromModel(userModel);
        userDOMapper.insertSelective(userDO);
        userModel.setId(userDO.getId());

        //保存密码
        UserPasswordDO userPasswordDO = convertPasswordFromModel(userModel);
        userPasswordDOMapper.insertSelective(userPasswordDO);

    }

用户登录

校验用户提交的密码是否与数据库中的密码相等,若相等则跳转到商品页面
在这里插入图片描述

  • 从用户信息表中查找用户的信息,从密码表中查找用户密码,然后进行校验
  • 若校验成功则跳转到
 //用户登录接口
     /*
    用户的登入
     */
    @RequestMapping(value = "/login", method = RequestMethod.POST)
    @ResponseBody
    public CommonReturnType userLogin(@RequestParam("telphone") String telphone, @RequestParam("password") String password) throws BusinessException {
        UserModel userModel = null;

        if (StringUtils.isEmpty(telphone) || StringUtils.isEmpty(password)) {
            throw new BusinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR);
        }


        try {
            userModel = userService.validateLogin(telphone, EncodeByMd5(password));
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        //将登录凭证加入到合法用户的session中(只有登录了才能购买商品)
        HttpSession session = this.httpServletRequest.getSession();
        session.setAttribute("IS_LOGIN", true);
        session.setAttribute("USER_LOG", userModel);

//返回给前端成功的标志
        return CommonReturnType.create(null);
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值