项目持续更新中:
目录
填入验证码到达我们的后端是需要两个字段,分别是手机号和验证码,这里我们以Body形式交给后端,再去校验。注册和登录我们放在一起:
首先打开HBuider,在前端

对于这两个字段,我们都要对它进行相应的校验。
@RequestBody代表我们的Body对象 ,是前端传过来的,我们把它作为业务对象,business obje在model中我们创建创建一个新的package,构建我们自己BO的对象:

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


添加注解:
开启校验: @Valid
绑定的BindingResult错误结果

启动,测试:

在接口文档中测试:


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

在统一异常管理中:

于是我们在controller中可以直接进行判断。
去掉BaseInfoProperties中
在统一异常拦截中:

所以在这里@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);
第五步,前端需要获得用户信息包括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,启动,测试:


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