项目持续更新中:

仿抖音短视频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 {@Autowiredprivate UsersMapper usersMapper;@Autowiredprivate Sid sid;private static final String USER_FACE1 = "http://122.152.205.72:88/group1/M00/00/05/CpoxxF6ZUySASMbOAABBAXhjY0Y649.png";@Overridepublic 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@Overridepublic 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 {@Idprivate 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,启动,测试:

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

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

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

    项目持续创作中: 仿抖音短视频APP项目专栏 目录 安装redis6.0缓存中间件 整合Redis并存储验证码 拦截器限制60s短信发送 优雅异常封装返回拦截器异常 安装redis6.0缓存中间件 需 ...

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

    项目持续更新中: 仿抖音短视频APP专栏 目录 用户退出登录 开发查询用户信息接口 统一封装修改用户信息(一) 统一封装修改用户信息(二) 用户退出登录 此时还没有实现退出登录. 在前端中,我们找到l ...

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

    目录 手机号--一键注册登录流程 构建流程图 用户登录流程 手机号一键注册登录流程图 腾讯云短信 SpringBoot集成腾讯云短信 完善发送短信接口 手机号--一键注册登录流程 构建流程图 用户登录 ...

  4. 从零开始搭建仿抖音短视频APP-后端消息业务模块开发(2)-基础版完结篇

    项目持续更新中: 仿抖音短视频APP专栏 目录 系统消息入库保存 MongoDB分页查询系统消息列表 删除系统消息 系统消息入库保存 这里还剩下最后一个点赞评论没有完成 这里如果点赞了你的评论,你们视 ...

  5. 从零开始搭建仿抖音短视频APP-构建后端项目

    项目持续创作中... ​​​​​​仿抖音短视频APP项目专栏 目录 聚合工程 构建父工程 构建子工程 构建接口工程并且暴露api接口 优雅Restful相应封装 Lombok与多环境profile 数 ...

  6. 从零开始搭建仿抖音短视频APP-后端开发消息业务模块(1)

    项目持续更新中: 仿抖音短视频APP专栏 目录 保存系统消息到MongoDB 系统消息入库保存-关注 系统消息入库保存-点赞短视频 系统消息入库保存-评论与回复 保存系统消息到MongoDB 我们把m ...

  7. 从零开始搭建仿抖音短视频APP-后端开发短视频业务模块(2)

    项目持续更新中: 仿抖音短视频APP 目录 实现数据层mybatis自定义mapper与sql 查询短视频列表api 实现下拉刷新和分页功能 实现数据层mybatis自定义mapper与sql 在数据 ...

  8. 从零开始搭建仿抖音短视频APP-后端开发短视频业务模块(3)

    项目持续更新中: 仿抖音短视频APP专栏 目录 视频详情页展示的数据层实现 视频详情页展示的api实现 短视频下载.复制连接.二维码展示 视频保存到相册 复制链接 二维码展示 实现转为私密或公开视频 ...

  9. 从零开始搭建仿抖音短视频APP--后端开发粉丝业务模块(3)

    项目持续创作中: 仿抖音短视频APP专栏 目录 实现用户点赞视频 用户取消点赞 用户是否点赞视频的判断 实现用户点赞视频 用户在点赞我们的视频后,我们需要去实现一些相关的业务, 这里需要对应到数据库的 ...

最新文章

  1. 手机搭载云服务器_华为云发布“鲲鹏云手机”:原生安卓系统、鲲鹏920加持
  2. 最小公倍数和最大公约数
  3. matlab里面filename1,matlab 每次从一个txt文件(里面每行是一个图像名字,如1.jpg之类的)读取一行字符串...
  4. Python函数嵌套定义的洪荒之力
  5. Node.js介绍及安装
  6. 关于一些常见的矢量格式图(SVG,EPS,wmf,emf)
  7. Typora设置高亮
  8. STM32解析航模遥控器的PPM信号
  9. 朋友圈文案_隐私条款
  10. 在通用计算机内 PC是指,计算机模拟考试题答案
  11. gred-cam 的tensorflow实现 热力图
  12. 查看Windows10系统版本的方法
  13. mysql序号rownum行号实现
  14. 基于Cplex的分支定界
  15. 盛世昊通:面向“双碳”目标,开拓汽车产业价值蓝海
  16. TP-LINK宽带路由器限速设置和P2P设置方法
  17. 3行代码实现自动刷抖音
  18. for(;;)和while(1)两种死循环的区别
  19. Yin算法应用(单片机\嵌入式)
  20. 怎么把png图片压缩到100k以内,3个工具高效处理

热门文章

  1. 笔记本CPU更换硅脂、液金散热对比测试
  2. 社群运营中KOL的作用
  3. 7-1 计算物体自由下落的距离
  4. 从源数据库抽取数据到中间库
  5. 错误:未报告的异常错误,必须对其进行捕获或声明以便抛出
  6. n平方的求和公式_1到N的平方和,立方和公式是怎么推导的
  7. 基于JAVA的机场航班起降与协调管理系统(论文+PPT+源码)
  8. 户外风景拍摄自然风光摄影网站搭建模板
  9. 利用CASS使用三种方法计算两期土方
  10. 机械制造作业考研题目答案分享——金属切削规律3