700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 26:第三章:开发通行证服务:9:【注册/登录】接口:验证码校验OK后 先根据手机号去

26:第三章:开发通行证服务:9:【注册/登录】接口:验证码校验OK后 先根据手机号去

时间:2023-09-14 16:11:02

相关推荐

26:第三章:开发通行证服务:9:【注册/登录】接口:验证码校验OK后 先根据手机号去

说明:

(1)本篇博客内容:继续开发【注册/登录】接口;

●在【25:第三章:开发通行证服务:8:【注册/登录】接口:接收并校验“手机号和验证码”参数;】中,【注册/登录】接口,只开发了【校验验证码是否OK】;

●本篇博客,继续完善【注册/登录】接口:验证码校验OK后,先根据手机号去查查该用户是否已存在,如果用户不存在就创建这个用户;

目录

一:继续完善【注册/登录】接口:验证码校验OK后,先根据手机号去查查该用户是否已存在,如果用户不存在就创建这个用户;

1.【user】用户微服务中,PassportController中的【注册/登录】接口:继续完善;

二:创建Service层,并创建对应的方法;

1.在【user】用户微服务中,创建service包,UserService接口、impl包,UserServiceImpl实现类;

2.UserService接口:定义两个方法:【根据手机号,查询该用户是否已存在:queryMobileIsExist()】、【新增用户:createUser()】;

3.UserServiceImpl实现类:实现上面定义的两个方法:【根据手机号,查询该用户是否已存在:queryMobileIsExist()】、【新增用户:createUser()】;

(1)先看下app_user用户表的内容;

(2)【根据手机号,查询该用户是否已存在:queryMobileIsExist()】:利用tkmybatis的Example,自定义查询条件;然后,去查询数据库;

(3.1)【新增用户:createUser()】:这个方法是个非查询操作,我们使用了【@Transactional】注解去控制事务;

(3.2)【新增用户:createUser()】:创建工具类,去生成app_user表的主键;(使用IdWorker工具类,基于雪花算法)

(3.3)【新增用户:createUser()】:设置用户默认昵称的时候,我们选择使用【用户+18888888888】的形式;而为了保护用户隐私,防止手机号泄露,我们在【common】通用工程中创建【信息脱敏工具DesensitizationUtil工具类】,来设置成【用户+18******888】的形式;

(3.4)【新增用户:createUser()】:设置用户头像图片的地址;

(3.5)【新增用户:createUser()】:设置用户生日;(在【common】通用工程中,创建了DateUtil工具类,其可以把【符合格式的日期字符串】转成【对应的java.util.Date格式的日期】)

(3.6)【新增用户:createUser()】:设置用户性别;(性别,在数据库中使用【性别 1:男 0:女 2:保密】的数字来代表的;所以,对于这种数据,老套路,最好使用枚举类管理起来)(在【common】通用工程中,创建枚举类Sex)

(3.7)【新增用户:createUser()】:设置用户用户激活状态(用户刚创建用户的时候,其状态默认设为“未激活”);(和“性别”同理,用户激活状态也使用枚举类管理起来)(在【common】通用工程中,创建枚举类UserStatus)

(3.8)【新增用户:createUser()】:构建好AppUser对象后,调用Dao层方法,去新增用户;

三:效果;

一:继续完善【注册/登录】接口:验证码校验OK后,先根据手机号去查查该用户是否已存在,如果用户不存在就创建这个用户;

1.【user】用户微服务中,PassportController中的【注册/登录】接口:继续完善;

/*** 【一键注册/登录,接口】* @param registLoginBo* @param result* @return*/@Overridepublic GraceJSONResult doLogin(@Valid RegistLoginBo registLoginBo, BindingResult result) {//0.判断BindingResult中是否保存了验证失败的错误信息,如果有,说明前端的输入是有问题的(手机号或者验证码,至少有一个没输入);// 那么,我们就获取这个错误信息,并构建一个GraceJSONResult统一返回对象,返回;if (result.hasErrors()) {Map<String, String> map = getErrorsFromBindingResult(result);return GraceJSONResult.errorMap(map);}//1.校验验证码是否匹配;//1.1 获取用户在前端输入的手机号和验证码;String mobile = registLoginBo.getMobile();String smsCode = registLoginBo.getSmsCode();//1.2 根据用户在前端输入的手机号,尝试去redis中获取对应的验证码;String redisSMSCode = redisOperator.get(MOBILE_SMSCODE + ":" + mobile);//1.3如果前端输入的验证码,在redis中不存在(说明:我们并没有针对【用户输入的这个手机号码】发送过验证码;// 或者说是用户在收到验证码短信后,过了30min后才使用,redis中存的验证码过期失效了),// 或者前端输入的验证码和redis中的不一样(说明:用户的验证码输错了);// 那么,就返回对应的,包含错误信息的GraceJSONResult统一返回对象;// 其中,这儿我们利用【mons.lang3】中的StringUtils工具类的isBlank()方法来判空;if (StringUtils.isBlank(redisSMSCode) || !redisSMSCode.equals(smsCode)) {return GraceJSONResult.errorCustom(ResponseStatusEnum.SMS_CODE_ERROR);}//2.利用手机号,查询数据库中,该用户是否已注册;AppUser user = userService.queryMobileIsExist(mobile);//2.1如果用户存在但是已经冻结;直接返回对应的(包含错误信息)的GraceJSONResult统一返回对象if ((user != null) && (user.getActiveStatus() == UserStatus.FROZEN.type)) {return GraceJSONResult.errorCustom(ResponseStatusEnum.USER_FROZEN);} else if (user == null) {//2.2如果用户为空,我们就去注册这个用户user = userService.createUser(mobile);}return GraceJSONResult.ok(user);}

说明:

(1)完善内容;

(2)在后面我们调用,后面编写的Service层的方法;所以这儿我们需要注入UserService对象;

(3)逻辑说明,看注释;

(4)Service层的UserService和UserServiceImpl,在下面介绍;

二:创建Service层,并创建对应的方法;

1.在【user】用户微服务中,创建service包,UserService接口、impl包,UserServiceImpl实现类;

2.UserService接口:定义两个方法:【根据手机号,查询该用户是否已存在:queryMobileIsExist()】、【新增用户:createUser()】;

package com.imooc.user.service;import com.imooc.pojo.AppUser;public interface UserService {/*** 查询【用户输入的手机号码】是否存在;即,查询用户是否存在;* 如果用户存在,返回user信息;* @param mobile* @return*/public AppUser queryMobileIsExist(String mobile);/*** 创建用户,新增用户记录到数据库;* @param mobile* @return*/public AppUser createUser(String mobile);}

说明:

(1)根据【注册/登录】接口的逻辑需求,在Service层这儿定义了两个方法:

●一个是:根据用户手机号,查询该用户是否已存在;一个是:新增用户;

3.UserServiceImpl实现类:实现上面定义的两个方法:【根据手机号,查询该用户是否已存在:queryMobileIsExist()】、【新增用户:createUser()】;

package com.imooc.user.service.impl;import com.imooc.enums.Sex;import com.imooc.enums.UserStatus;import com.imooc.pojo.AppUser;import com.imooc.user.mapper.AppUserMapper;import com.imooc.user.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;@Servicepublic class UserServiceImpl implements UserService {@Autowiredpublic AppUserMapper appUserMapper;@Autowiredpublic Sid sid;//这儿,课程方给提供了三张用户头像图片;自己可以先用着;private static final String USER_FACE0 = "http://122.152.205.72:88/group1/M00/00/05/CpoxxFw_8_qAIlFXAAAcIhVPdSg994.png";private static final String USER_FACE1 = "http://122.152.205.72:88/group1/M00/00/05/CpoxxF6ZUySASMbOAABBAXhjY0Y649.png";private static final String USER_FACE2 = "http://122.152.205.72:88/group1/M00/00/05/CpoxxF6ZUx6ANoEMAABTntpyjOo395.png";/*** 查询【用户输入的手机号码】是否存在;即,查询用户是否存在;* 如果用户存在,返回user信息;* @param mobile* @return*/@Overridepublic AppUser queryMobileIsExist(String mobile) {//1.利用tkmybatis的Example,自定义查询条件;// 1.1先创建一个查询实例,这个实例,是针对APPUser作查询的;Example userExample = new Example(AppUser.class);//1.2给上面的查询实例,增加查询条件;Example.Criteria userCriteria = userExample.createCriteria();//第一个参数:AppUser实体类中的mobile;第二个参数:queryMobileIsExist这个方法的mobile参数;userCriteria.andEqualTo("mobile", mobile);//2.利用创建好的查询条件,调用方法,去查数据库;AppUser appUser = appUserMapper.selectOneByExample(userExample);return appUser;}/*** 创建用户,新增用户记录到数据库;* @param mobile* @return*/@Transactional@Overridepublic AppUser createUser(String mobile) {/*** 互联网项目都要考虑可扩展性;如果以后的业务激增,就需要考虑分库分表;* 那么,数据库表的主键必须要保证全局唯一;所以,主键ID就不能使用自增主键了;*/String userId = sid.nextShort();//调用,获取一个主键id;AppUser appUser = new AppUser();appUser.setId(userId);//设置主键idappUser.setMobile(mobile);//设置mobile手机号appUser.setNickname("用户" + monDisplay(mobile));//设置昵称,这儿我们就用手机号设为其默认昵称了;(自然,我们也可以设置其他昵称;;比如百度账号的默认昵称是【baidu_38686yhjh67】这种)appUser.setFace(USER_FACE1);//设置用户头像图片的地址;appUser.setBirthday(DateUtil.stringToDate("2000-01-01"));//设置生日;appUser.setSex(Sex.secret.type);//设置性别,使用了枚举,默认未知appUser.setActiveStatus(UserStatus.INACTIVE.type);//设置用户激活状态,使用了枚举,默认未激活appUser.setTotalIncome(0);//设置用户收入,默认为0appUser.setCreatedTime(new Date());//创建时间,使用默认的当前时间appUser.setUpdatedTime(new Date());//更新时间,使用默认的当前时间appUserMapper.insert(appUser);return appUser;}}

说明:

(1)先看下app_user用户表的内容;

(2)【根据手机号,查询该用户是否已存在:queryMobileIsExist()】:利用tkmybatis的Example,自定义查询条件;然后,去查询数据库;

●首先,要引入Dao层的AppUserMapper接口的对象;然后,这儿我们需要在AppUserMapper接口上,增加一个@Repository注解(我们创建的时候,其默认是没有@Repository注解的);

●利用tkmybatis的【Example】创建查询实例,【Example.Criteria】设置查询条件;去数据库中查询;

(3.1)【新增用户:createUser()】:这个方法是个非查询操作,我们使用了【@Transactional】注解去控制事务;

●在【附加:Spring Boot项目,手动控制事务;(包括:总结了到目前为止,事务的所有内容;)】中我们总结了,至今为止遇到过的所有事务;;其中Spring中控制事务,就介绍了使用【@Transactional】注解去控制事务;

(3.2)【新增用户:createUser()】:创建工具类,去生成app_user表的主键;(使用IdWorker工具类,基于雪花算法)

●互联网项目都要考虑可扩展性、可维护性;尤其是分布式微服务项目,我们在以后的业务激增,就需要考虑分库分表;那么,如果分库分表的话,主键id就不能使用自增主键了;自增主键的可维护性很差;所以,我们需要使用全局id,其可以保证数据库表的主键全局唯一;

●为此,我们在【common】通用工程中,引入了一个第三方的主键生成的【idworker】;(其是基于雪花算法,生成唯一id的);

●要想使用这个工具类,我们需要注入Sid对象;

●PS:因为【idworker】是写在了【org.n3r.idworker】这个包中,而在【user】的主启动类上,需要设置@ComponentScan,以让其能够扫描到【org.n3r.idworker】这个包;;;否则,上步注入Sid对象时,其在IoC容器中会找不到Sid对象;

(3.3)【新增用户:createUser()】:设置用户默认昵称的时候,我们选择使用【用户+18888888888】的形式;而为了保护用户隐私,防止手机号泄露,我们在【common】通用工程中创建【信息脱敏工具DesensitizationUtil工具类】,来设置成【用户+18******888】的形式;

(3.4)【新增用户:createUser()】:设置用户头像图片的地址;

(3.5)【新增用户:createUser()】:设置用户生日;(在【common】通用工程中,创建了DateUtil工具类,其可以把【符合格式的日期字符串】转成【对应的java.util.Date格式的日期】)

(3.6)【新增用户:createUser()】:设置用户性别;(性别,在数据库中使用【性别 1:男 0:女 2:保密】的数字来代表的;所以,对于这种数据,老套路,最好使用枚举类管理起来)(在【common】通用工程中,创建枚举类Sex)

●有关枚举数据类型、枚举类,介绍过N次;枚举类的使用SOP也很明确,没什么好说的;如有需要可以参考【Spring Boot电商项目13:用户模块二:枚举类;】等很多其他相关文章;

(3.7)【新增用户:createUser()】:设置用户用户激活状态(用户刚创建用户的时候,其状态默认设为“未激活”);(和“性别”同理,用户激活状态也使用枚举类管理起来)(在【common】通用工程中,创建枚举类UserStatus)

(3.8)【新增用户:createUser()】:构建好AppUser对象后,调用Dao层方法,去新增用户;

三:效果;

(1)先全局install一下整个项目;

(2)运行【user】用户微服务的主启动类;

(3)我们在【http://localhost:8003/doc.html】Swagger2的页面上,去测试接口了;

……………………………………………………

PS:使用Swagger的时候,接口的接收参数的时候,最好使用@RequestParam等注解;(PS:这也是自己一直以来的习惯)

……………………………………………………

……………………………………………………

即,我们目前编写的逻辑是:对于新用户,我们去注册,然后返回用户信息;对于已注册,我们直接返回用户信息;

……………………………………………………

26:第三章:开发通行证服务:9:【注册/登录】接口:验证码校验OK后 先根据手机号去查查该用户是否已存在 如果用户不存在就创建这个用户;(tkmybatis查询构建查询条件 雪花算法 枚举类等等)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。