项目持续更新中:
仿抖音短视频APP专栏
目录
注册登录-BO接受前端参数验证
对BO校验进行统一封装
开发用户是否存在
开发创建用户Service
实现短信注册登录与分布式会话
填入验证码到达我们的后端是需要两个字段,分别是手机号和验证码,这里我们以Body形式交给后端,再去校验。注册和登录我们放在一起:
首先打开HBuider,在前端
对于这两个字段,我们都要对它进行相应的校验。
@RequestBody代表我们的Body对象 ,是前端传过来的,我们把它作为业务对象,business obje在model中我们创建创建一个新的package,构建我们自己BO的对象:
通过注解对它进行相对的校验,首先在pom中添加依赖:
开启校验: @Valid
绑定的BindingResult错误结果
启动,测试:
在接口文档中测试:
BO校验通过在Controller接口对result做解析,但是以后我们后续做微服务接口会出问题,并且它会破坏我们接口的完整性,于是我们相应用更加好的方式处理:
抽出这四段代码
在统一异常管理中:
于是我们在controller中可以直接进行判断。
在统一异常拦截中:
所以在这里@Valid就可以进行我们的校验。
重启,测试:
BO校验通过之后,需要判断业务是否存在,存在返回用户信息,不存在注册用户
第一,实现我们的service,创建package,接口和实现。
接口实现,重新方法,与数据层进行交互:
在mapper接口中最好添加一个@Repository
在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);
所以在我们的后端需要去构建用户信息,
我们在数据库中尽量不去修改,所以我们重新创建一个新的视图层来做展示:
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,启动,测试:
在这里就完成了我们的一个注册。