用户手机验证码登录

一、yapi接口文档

二、代码实现

1.服务提供者

1.1在tanhua-dubbo-db模块创建Mapper接口com/tanhua/dubbo/mappers/UserMapper.java(数据层,查询数据库)
package com.tanhua.dubbo.mappers;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.tanhua.model.domain.User;//对应哪个实体就是查哪张表,这是查User表
public interface UserMapper extends BaseMapper<User> {}
2.2在tanhua-dubbo-interface模块创建业务层接口com/tanhua/dubbo/api/UserApi.java
package com.tanhua.dubbo.api;import com.tanhua.model.domain.User;public interface UserApi {//根据手机号查找用户User selectByPhoneNumber(String phoneNumber);
}
3.3在在tanhua-dubbo-db模块创建创建业务层实现类com/tanhua/dubbo/api/UserApiImpl.java(调用mapper)
package com.tanhua.dubbo.api;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.tanhua.dubbo.mappers.UserMapper;
import com.tanhua.model.domain.User;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.factory.annotation.Autowired;@DubboService
public class UserApiImpl implements UserApi {@Autowiredprivate UserMapper userMapper;public User selectByPhoneNumber(String phoneNumber) {//1.构造查询条件QueryWrapper<User> qw =new QueryWrapper<>();qw.eq("mobile", phoneNumber);//2.根据手机号码查询用户User user = userMapper.selectOne(qw);return user;}
}
3.4创建服务启动类(mybatis mapper包扫描)
package com.tanhua.dubbo;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@MapperScan("com.tanhua.mapper")
public class TanHuaDbApplication {public static void main(String[] args) {SpringApplication.run(TanHuaDbApplication.class, args);}
}
3.5配置application.yml
server:port: 8081
spring:application:name: tanhua-dubbo-db #服务名称datasource: #数据源driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/tanhua?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true&useSSL=falseusername: rootpassword: 1234cloud:nacos:discovery:server-addr: 192.168.136.160:8848 #nacos地址
dubbo:cloud:subscribed-services: 'tanhua-app-server'protocol:name: dubboport: 20881registry:address: spring-cloud://localhostscan:base-packages: com.tanhua.dubbo.apimybatis-plus:global-config:db-config:table-prefix: tb_ #表名前缀id-type: auto #id生成策略
3.6在tanhua-app-server模块的测试模块创建com/itheima/test/UserApiTest.java测试
package com.itheima.test;import com.tanhua.dubbo.api.UserApi;
import com.tanhua.model.domain.User;
import com.tanhua.server.AppServerApplication;
import org.apache.dubbo.config.annotation.DubboReference;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;@RunWith(SpringRunner.class)
@SpringBootTest(classes = AppServerApplication.class)
public class UserApiTest {@DubboReferenceprivate UserApi userApi;@Testpublic void testFindByMobile() {User user = userApi.selectByPhoneNumber("13381313372");System.out.println(user);}
}

2.服务消费者

2.1表现层,在tanhua-app-server摸块的LoginController中编写代码

@RestController
@RequestMapping("/user")
public class LoginController {@Autowiredprivate UserService userService;/*** 用户登录接口* 1.请求路径:/user/loginVerification* 2.请求参数:phone(String),verificationCode(String)用map集合封装* 3.返回结果:token,isNew(封装到map集合返回)*/@PostMapping("/loginVerification")public ResponseEntity loginVerification(@RequestBody Map map){//1.接收参数String phone = (String) map.get("phone");String code = (String) map.get("verificationCode");//2.调用userServi//返回结果用map封装Map result =userService.loginVerification(phone,code);return ResponseEntity.ok(result);}
}

2.2业务层UserService步骤分析

  1. 从Redis缓存中获取验证码
  2. 判断用户输入的验证码与下发的手机验证码是否一致,不一致则抛出一个异常
  3. 删除Redis中缓存的验证码
  4. 用dubbo远程调用UserApi,根据手机号码查询用户
  5. .如果user为空,证明是新用户,把它存进数据库表
  6. 生成token(存入id和手机号码)
  7. 构造返回值
@Service
public class UserService {@Autowiredprivate SmsTemplate smsTemplate;  //发送手机验证码模板@Autowiredprivate RedisTemplate<String ,String> redisTemplate;@DubboReferenceprivate UserApi userApi;/*** 登录的业务层接口业务逻辑* @param phone* @param code* @return*/public Map loginVerification(String phone, String code) {//1.从Redis缓存中获取验证码String redisCode = redisTemplate.opsForValue().get("CHECK_CODE_" + phone);//2.判断用户输入的验证码与下发的手机验证码是否一致//不一致则抛出一个异常if(StringUtils.isEmpty(code) || ! redisCode.equals(code)){//验证码无效throw new RuntimeException("验证码无效");}//3.删除Redis中缓存的验证码redisTemplate.delete("CHECK_CODE_" + phone);//4.用dubbo远程调用UserApi,根据手机号码查询用户User user = userApi.selectByPhoneNumber(phone);boolean isNew =  false;//5.如果user为空,证明是新用户,把它存进数据库表if(user == null){user =new User();user.setMobile(phone);user.setCreated(new Date());user.setUpdated(new Date());user.setPassword(DigestUtils.md5Hex("123456"));Long userId = userApi.addNewUser(user);user.setId(userId);isNew =true;}//6.生成token(存入id和手机号码)Map userToken = new HashMap();userToken.put("id", user.getId());userToken.put("phone",phone);String token = JwtUtils.getToken(userToken);//7.构造返回值Map resultMap = new HashMap();resultMap.put("token", token);resultMap.put("isNew", isNew);return resultMap;}
}

3.代码优化

3.1在tanhua-model抽取BasePojo,com/tanhua/model/domain/BasePojo.java

@Data
public abstract class BasePojo implements Serializable {@TableField(fill = FieldFill.INSERT) //自动填充private Date created;@TableField(fill = FieldFill.INSERT_UPDATE)private Date updated;}

3.2自动填充

对于created和updated字段,每次操作都需要手动设置。为了解决这个问题,mybatis-plus支持自定义处理器的形式实现保存更新的自动填充

package com.tanhua.dubbo.server.handler;import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;import java.util.Date;@Component
public class MyMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {Object created = getFieldValByName("created", metaObject);if (null == created) {//字段为空,可以进行填充setFieldValByName("created", new Date(), metaObject);}Object updated = getFieldValByName("updated", metaObject);if (null == updated) {//字段为空,可以进行填充setFieldValByName("updated", new Date(), metaObject);}}@Overridepublic void updateFill(MetaObject metaObject) {//更新数据时,直接更新字段setFieldValByName("updated", new Date(), metaObject);}
}

aObject);
if (null == updated) {
//字段为空,可以进行填充
setFieldValByName(“updated”, new Date(), metaObject);
}
}

@Override
public void updateFill(MetaObject metaObject) {//更新数据时,直接更新字段setFieldValByName("updated", new Date(), metaObject);
}

}


5.用户手机验证码登录相关推荐

  1. 阿里云短信平台实现手机验证码登录

    阿里云短信平台实现手机验证码登录 首先创建一个工具类 工具类AliyunMessageUtil代码如下所示: public class AliyunMessageUtil {private stati ...

  2. 验证码登录开发----手机验证码登录

    手机验证码登录 需求分析 为了方便用户登录,移动端通常都会提供通过手机验证码登录的功能 手机验证码登录的优点: 方便快捷.无需注册,直接登录 使用短信验证码作为登录凭证,无需记忆密码 安全 登录流程: ...

  3. Keycloak实现手机验证码登录

    背景说明 使用Keycloak作为账号体系的项目中,经常会被问到Keycloak如何实现手机验证码登录,Keycloak有没有内置的基于短信的登录实现SMS-based two-/multi-fact ...

  4. 技术人员需要了解的手机验证码登录风险

    手机验证码登录是一种常见的应用登录方式,简单方便,不用记忆密码,市面上能见到的APP基本都支持这种登录方式,很多应用还把登录和注册集成到了一起,注册+登录一气呵成,给用户省去了很多麻烦,颇有一机在手. ...

  5. 【瑞吉外卖】day08:短信发送、手机验证码登录

    目录 4. 短信发送​编辑 4.1 短信服务介绍 4.2 阿里云短信服务介绍 4.3 阿里云短信服务准备 4.4 代码开发 5. 手机验证码登录 5.1 需求分析 5.2 数据模型 5.3 前端页面分 ...

  6. Java实现手机验证码登录和SpringSecurity权限控制

    手机验证码登录和SpringSecurity权限控制 手机快速登录功能,就是通过短信验证码的方式进行登录.这种方式相对于用户名密码登录方式,用户不需要记忆自己的密码,只需要通过输入手机号并获取验证码就 ...

  7. 瑞吉外卖(6)—手机验证码登录

    目录 一.手机验证码登录 1.1 短信发送 1.2 短信验证码登陆 1.2.1 需求分析 1.2.2 数据模型 1.2.3 代码开发 发送验证码(给的资料有点残缺,这里修改了) 使用验证码登陆(使用m ...

  8. 【瑞吉外卖项目】DAY5——第六章 手机验证码登录

    本章内容介绍手机验证码登录 点击获取验证码 收到短信,并输入验证码 点击登录,登录成功 短信发送_短信服务介绍和阿里云短信服务介绍 短信服务介绍 目前市面上有很多第三方提供的短信服务,这些第三方短信服 ...

  9. SpringSecurityOAuth2(7) 账号密码登录、手机验证码登录

    GitHub地址 码云地址 SpringSecurity 调用流程: 首先会进入UsernamePasswordAuthenticationFilter并且设置权限为null和是否授权为false,然 ...

最新文章

  1. 新疆兵团开展迎新春“送文化下基层”慰问演出活动
  2. 【论文写作分析】之三《基于预训练语言模型的案件要素识别方法》
  3. PHP学习总结(7)——PHP入门篇之PHP注释
  4. 轻松简单地开发Web Services 2
  5. 11月16日站立会议
  6. 【大健康】高保真交互原型模板+大健康生态问诊app+饮食运动数据血糖血压健康数据的管理移动端+在线挂号、体检预约、远程在线视频电话图文问诊医疗服务+积分商城设备管理+健康档案
  7. ODrive踩坑(四)AS5047P-SPI绝对值磁编码器,不需每次上电校准无刷电机,直接上电可用
  8. C#获取系统当前时间
  9. 最佳Excel导入实践(一)
  10. 字符串超长导致emWin卡死
  11. PCL 显示一只小白兔和Eigen矩阵
  12. [裴礼文数学分析中的典型问题与方法习题参考解答]4.3.21
  13. word中不能设置首字下沉的一个原因
  14. 阵列天线的赋形波束综合(一)
  15. 背记不如实战系列-javaGUI实例-计算器制作
  16. LTspice入门使用教程(导入元器件电压电流波形幅频特性曲线)
  17. SiamFC++与SiamBAN
  18. Laravel下载地址合集
  19. 浩顺小票网络打印机安装流程
  20. 泛世纪上英语,计算机,日语的录制课程。欢迎来下载

热门文章

  1. xmlhttp.readyState的值及解释-xmlhttp.status的值及解释
  2. GNOME 桌面顶部栏透明设置
  3. maven 中央仓库jar搜索
  4. 用DCGAN生成卡通人脸
  5. 一文看懂设备指纹如何防篡改、防劫持
  6. 判断一个字符串是否是对称字符串(一)
  7. PHP简单的学习笔记待完善
  8. [Oracle]如何获取指定表的约束类型(user_constraints 和user_cons_columns的联系使用)
  9. 3dmax:3dmax三维VR渲染设置之高级灯光渲染(经典案例—利用泛光灯制作台灯效果)图文教程
  10. MAYA MASH多米诺