项目持续更新中:

仿抖音短视频APP专栏

目录

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

对BO校验进行统一封装

 开发用户是否存在

开发创建用户Service

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


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

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

首先打开HBuider,在前端

短视频app架构设计 短视频app搭建_短视频app架构设计

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

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

短视频app架构设计 短视频app搭建_短视频app架构设计_02

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

短视频app架构设计 短视频app搭建_短视频app架构设计_03

 

短视频app架构设计 短视频app搭建_redis_04

 添加注解:

短视频app架构设计 短视频app搭建_前端_05

 开启校验: @Valid

绑定的BindingResult错误结果

短视频app架构设计 短视频app搭建_用户信息_06

 启动,测试:

短视频app架构设计 短视频app搭建_用户信息_07

 在接口文档中测试:

短视频app架构设计 短视频app搭建_短视频app架构设计_08

 

短视频app架构设计 短视频app搭建_短视频app架构设计_09

 

对BO校验进行统一封装

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

抽出这四段代码

短视频app架构设计 短视频app搭建_ooc_10

 在统一异常管理中:

短视频app架构设计 短视频app搭建_短视频app架构设计_11

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

去掉BaseInfoProperties中

短视频app架构设计 短视频app搭建_redis_12

在统一异常拦截中:

短视频app架构设计 短视频app搭建_短视频app架构设计_13

 

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

短视频app架构设计 短视频app搭建_ooc_14

 重启,测试:

短视频app架构设计 短视频app搭建_用户信息_15

 

短视频app架构设计 短视频app搭建_ooc_16

 开发用户是否存在

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

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

短视频app架构设计 短视频app搭建_短视频app架构设计_17

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

短视频app架构设计 短视频app搭建_前端_18

 

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

短视频app架构设计 短视频app搭建_前端_19

开发创建用户Service

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

短视频app架构设计 短视频app搭建_用户信息_20

 在实现类中:

短视频app架构设计 短视频app搭建_ooc_21

 查询可以不用加Transaction。

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

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

短视频app架构设计 短视频app搭建_短视频app架构设计_22

 这里涉及到了Sid,

短视频app架构设计 短视频app搭建_redis_23

 这里获得的是:

短视频app架构设计 短视频app搭建_redis_24

 我们这里使用nextshort()。

在service实现类中:

短视频app架构设计 短视频app搭建_redis_25

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

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

短视频app架构设计 短视频app搭建_用户信息_26

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

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;
    }
}

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

短视频app架构设计 短视频app搭建_ooc_27

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

短视频app架构设计 短视频app搭建_短视频app架构设计_28

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

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

实现我们的注册登录:

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

短视频app架构设计 短视频app搭建_用户信息_29

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

短视频app架构设计 短视频app搭建_redis_30

 

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,

短视频app架构设计 短视频app搭建_ooc_31

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

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

短视频app架构设计 短视频app搭建_短视频app架构设计_32

 

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中处理:

短视频app架构设计 短视频app搭建_redis_33

 在Meavn中install,启动,测试:

短视频app架构设计 短视频app搭建_前端_34

 

短视频app架构设计 短视频app搭建_redis_35

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