从零开始搭建仿抖音短视频APP-开发用户业务模块(3)

项目持续更新中:

仿抖音短视频APP专栏

目录

 注册登录-BO接受前端参数验证

对BO校验进行统一封装

 开发用户是否存在

开发创建用户Service

实现短信注册登录与分布式会话


 注册登录-BO接受前端参数验证

填入验证码到达我们的后端是需要两个字段,分别是手机号和验证码,这里我们以Body形式交给后端,再去校验。注册和登录我们放在一起:

首先打开HBuider,在前端

 对于这两个字段,我们都要对它进行相应的校验。

@RequestBody代表我们的Body对象 ,是前端传过来的,我们把它作为业务对象,business obje在model中我们创建创建一个新的package,构建我们自己BO的对象:

 通过注解对它进行相对的校验,首先在pom中添加依赖:

 

 添加注解:

 开启校验: @Valid

绑定的BindingResult错误结果

 启动,测试:

 在接口文档中测试:

 

 

对BO校验进行统一封装

BO校验通过在Controller接口对result做解析,但是以后我们后续做微服务接口会出问题,并且它会破坏我们接口的完整性,于是我们相应用更加好的方式处理:

抽出这四段代码

 在统一异常管理中:

 于是我们在controller中可以直接进行判断。

去掉BaseInfoProperties中

在统一异常拦截中:

 

所以在这里@Valid就可以进行我们的校验。

 重启,测试:

 

 开发用户是否存在

BO校验通过之后,需要判断业务是否存在,存在返回用户信息,不存在注册用户

第一,实现我们的service,创建package,接口和实现。

 接口实现,重新方法,与数据层进行交互:

 

在mapper接口中最好添加一个@Repository

开发创建用户Service

在service接口中创建用户信息返回用户对象的方法:

 在实现类中:

 查询可以不用加Transaction。

创建用户,涉及到用户主键,常用的是自增id,现如今已经不用了。后期考虑到业务扩展,做分库分表,需要全局的主键,全局用户id。

在这里使用插件,通过它生成唯一主键。

 这里涉及到了Sid,

 这里获得的是:

 我们这里使用nextshort()。

在service实现类中:

发现无法被注入,因为第三方额外的包无法被默认的扫描器扫描。 

在启动类中,添加自定义扫描路径:

 接着在实现类中,设置我们的用户信息:

package com.imooc.service.impl;

import com.imooc.enums.Sex;
import com.imooc.enums.YesOrNo;
import com.imooc.mapper.UsersMapper;
import com.imooc.pojo.Users;
import com.imooc.service.UserService;
import com.imooc.utils.DateUtil;
import com.imooc.utils.DesensitizationUtil;
import org.n3r.idworker.Sid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example;

import java.util.Date;

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UsersMapper usersMapper;


    @Autowired
    private Sid sid;
    private static final String USER_FACE1 = "http://122.152.205.72:88/group1/M00/00/05/CpoxxF6ZUySASMbOAABBAXhjY0Y649.png";


    @Override
    public Users queryMobileIsExist(String mobile) {
        Example userExample = new Example(Users.class);
        Example.Criteria criteria= userExample.createCriteria();
        criteria.andEqualTo("mobile",mobile);
        usersMapper.selectOneByExample(userExample);
        Users user = usersMapper.selectOneByExample(userExample);
        return user;
    }

    @Transactional
    @Override
    public Users createUser(String mobile) {
        //获得全局唯一主键
        String userId=sid.nextShort();

        Users user = new Users();
        user.setId(userId);

        user.setMobile(mobile);
        user.setNickname("用户:" + DesensitizationUtil.commonDisplay(mobile));
        user.setImoocNum("用户:" + DesensitizationUtil.commonDisplay(mobile));
        user.setFace(USER_FACE1);


        user.setBirthday(DateUtil.stringToDate("1900-01-01"));
        user.setSex(Sex.secret.type);

        user.setCountry("中国");
        user.setProvince("");
        user.setCity("");
        user.setDistrict("");
        user.setDescription("这家伙很懒,什么都没留下~");
        user.setCanImoocNumBeUpdated(YesOrNo.YES.type);

        user.setCreatedTime(new Date());
        user.setUpdatedTime(new Date());

        usersMapper.insert(user);

        return user;
    }
}

这里涉及到我们脱敏的一个工具,也是我们可以直接去使用的。还有一些枚举,可以直接使用。

用户头像这里我们用线上的一个头像,也可以使用自己的:

 构建用户信息之后,通过UserMapper的insert插入,最后将user返回给我们的前端。

 

实现短信注册登录与分布式会话

实现我们的注册登录:

在BO中获得我们的mobile和code ,获得之后,需要将验证码额外校验一次

注入UserService ,通过service来获得用户:

 

    String mobile = registLoginBO.getMobile();
        String code = registLoginBO.getSmsCode();

        //1.从redis中获得验证码进行校验
        String redisCode = redis.get(MOBILE_SMSCODE+":"+mobile);
        if(StringUtils.isBlank(redisCode)||!redisCode.equalsIgnoreCase(code)){
            return GraceJSONResult.errorCustom(ResponseStatusEnum.SMS_CODE_ERROR);
        }
        //2.查询数据库,判断用户是否存在
        Users user = userService.queryMobileIsExist(mobile);
        if(user == null){
            //2.1如果用户为空,表示没有注册过,则为null,需要注册信息入库
            user = userService.createUser(mobile);
        }

        //3.如果不为空,可以继续下方业务,可以保存会话信息
        String uToken = UUID.randomUUID().toString();
        redis.set(REDIS_USER_TOKEN+":"+user.getId(),uToken);

        //4.用户登录注册成功以后,删除redis中的短信验证码
        redis.del(MOBILE_SMSCODE+":"+mobile);

 第五步,前端需要获得用户信息包括token,

 所以在我们的后端需要去构建用户信息,

我们在数据库中尽量不去修改,所以我们重新创建一个新的视图层来做展示:

 

package com.imooc.vo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

import javax.persistence.Column;
import javax.persistence.Id;
import java.util.Date;

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class UsersVO {
    @Id
    private String id;
    private String mobile;
    private String nickname;
    private String imoocNum;
    private String face;
    private Integer sex;
    private Date birthday;
    private String country;
    private String province;
    private String city;
    private String district;
    private String description;
    private String bgImg;
    private Integer canImoocNumBeUpdated;
    private Date createdTime;
    private Date updatedTime;

    private String userToken;   //用户token传递给前端
}

接着就能够在controller中处理:

 在Meavn中install,启动,测试:

 

在这里就完成了我们的一个注册。 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

什么时候养猫猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值