• 从零开始搭建仿抖音短视频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实现类中:

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

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

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

    1. package com.imooc.service.impl;
    2. import com.imooc.enums.Sex;
    3. import com.imooc.enums.YesOrNo;
    4. import com.imooc.mapper.UsersMapper;
    5. import com.imooc.pojo.Users;
    6. import com.imooc.service.UserService;
    7. import com.imooc.utils.DateUtil;
    8. import com.imooc.utils.DesensitizationUtil;
    9. import org.n3r.idworker.Sid;
    10. import org.springframework.beans.factory.annotation.Autowired;
    11. import org.springframework.stereotype.Service;
    12. import org.springframework.transaction.annotation.Transactional;
    13. import tk.mybatis.mapper.entity.Example;
    14. import java.util.Date;
    15. @Service
    16. public class UserServiceImpl implements UserService {
    17. @Autowired
    18. private UsersMapper usersMapper;
    19. @Autowired
    20. private Sid sid;
    21. private static final String USER_FACE1 = "http://122.152.205.72:88/group1/M00/00/05/CpoxxF6ZUySASMbOAABBAXhjY0Y649.png";
    22. @Override
    23. public Users queryMobileIsExist(String mobile) {
    24. Example userExample = new Example(Users.class);
    25. Example.Criteria criteria= userExample.createCriteria();
    26. criteria.andEqualTo("mobile",mobile);
    27. usersMapper.selectOneByExample(userExample);
    28. Users user = usersMapper.selectOneByExample(userExample);
    29. return user;
    30. }
    31. @Transactional
    32. @Override
    33. public Users createUser(String mobile) {
    34. //获得全局唯一主键
    35. String userId=sid.nextShort();
    36. Users user = new Users();
    37. user.setId(userId);
    38. user.setMobile(mobile);
    39. user.setNickname("用户:" + DesensitizationUtil.commonDisplay(mobile));
    40. user.setImoocNum("用户:" + DesensitizationUtil.commonDisplay(mobile));
    41. user.setFace(USER_FACE1);
    42. user.setBirthday(DateUtil.stringToDate("1900-01-01"));
    43. user.setSex(Sex.secret.type);
    44. user.setCountry("中国");
    45. user.setProvince("");
    46. user.setCity("");
    47. user.setDistrict("");
    48. user.setDescription("这家伙很懒,什么都没留下~");
    49. user.setCanImoocNumBeUpdated(YesOrNo.YES.type);
    50. user.setCreatedTime(new Date());
    51. user.setUpdatedTime(new Date());
    52. usersMapper.insert(user);
    53. return user;
    54. }
    55. }

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

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

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

     

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

    实现我们的注册登录:

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

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

     

    1. String mobile = registLoginBO.getMobile();
    2. String code = registLoginBO.getSmsCode();
    3. //1.从redis中获得验证码进行校验
    4. String redisCode = redis.get(MOBILE_SMSCODE+":"+mobile);
    5. if(StringUtils.isBlank(redisCode)||!redisCode.equalsIgnoreCase(code)){
    6. return GraceJSONResult.errorCustom(ResponseStatusEnum.SMS_CODE_ERROR);
    7. }
    8. //2.查询数据库,判断用户是否存在
    9. Users user = userService.queryMobileIsExist(mobile);
    10. if(user == null){
    11. //2.1如果用户为空,表示没有注册过,则为null,需要注册信息入库
    12. user = userService.createUser(mobile);
    13. }
    14. //3.如果不为空,可以继续下方业务,可以保存会话信息
    15. String uToken = UUID.randomUUID().toString();
    16. redis.set(REDIS_USER_TOKEN+":"+user.getId(),uToken);
    17. //4.用户登录注册成功以后,删除redis中的短信验证码
    18. redis.del(MOBILE_SMSCODE+":"+mobile);

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

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

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

     

    1. package com.imooc.vo;
    2. import lombok.AllArgsConstructor;
    3. import lombok.Data;
    4. import lombok.NoArgsConstructor;
    5. import lombok.ToString;
    6. import javax.persistence.Column;
    7. import javax.persistence.Id;
    8. import java.util.Date;
    9. @Data
    10. @AllArgsConstructor
    11. @NoArgsConstructor
    12. @ToString
    13. public class UsersVO {
    14. @Id
    15. private String id;
    16. private String mobile;
    17. private String nickname;
    18. private String imoocNum;
    19. private String face;
    20. private Integer sex;
    21. private Date birthday;
    22. private String country;
    23. private String province;
    24. private String city;
    25. private String district;
    26. private String description;
    27. private String bgImg;
    28. private Integer canImoocNumBeUpdated;
    29. private Date createdTime;
    30. private Date updatedTime;
    31. private String userToken; //用户token传递给前端
    32. }

    接着就能够在controller中处理:

     在Meavn中install,启动,测试:

     

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

  • 相关阅读:
    C++11标准模板(STL)- 算法(std::upper_bound)
    GBase 8c导出表参数说明
    程序员是如何思考的?
    Java实现停车场收费系统 JAVA+Vue+SpringBoot+MySQL
    Servlet
    电子学会青少年软件编程 Python编程等级考试二级真题解析(判断题)2021年9月
    基于LINUX的TCP协WireShark抓包分析
    关于用pygame来编写类满天星游戏的全记录
    SpringCloud - OpenFeign 参数传递和响应处理(全网最详细)
    【Java设计模式 规范与重构】 一 重构的目的、内容、时机、方法
  • 原文地址:https://blog.csdn.net/m0_64005381/article/details/127402269