首页 > 其他分享 >5.用户手机验证码登录

5.用户手机验证码登录

时间:2022-10-30 12:24:43浏览次数:45  
标签:dubbo 登录 验证码 用户 tanhua user import com public

用户手机验证码登录

一、yapi接口文档

1665667290321

二、代码实现

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 {

    @Autowired
    private 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.Driver
    url: jdbc:mysql://127.0.0.1:3306/tanhua?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true&useSSL=false
    username: root
    password: 1234
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.136.160:8848 #nacos地址
dubbo:
  cloud:
    subscribed-services: 'tanhua-app-server'
  protocol:
    name: dubbo
    port: 20881
  registry:
    address: spring-cloud://localhost
  scan:
    base-packages: com.tanhua.dubbo.api

mybatis-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 {

    @DubboReference
   private UserApi userApi;

    @Test
    public void testFindByMobile() {
        User user = userApi.selectByPhoneNumber("13381313372");
        System.out.println(user);
    }
}

2.服务消费者

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

@RestController
@RequestMapping("/user")
public class LoginController {
   
    @Autowired
    private 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 {
    
    
    @Autowired
    private SmsTemplate smsTemplate;  //发送手机验证码模板

    @Autowired
    private RedisTemplate<String ,String> redisTemplate;

    @DubboReference
    private 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 {

    @Override
    public 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);
        }
    }

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

标签:dubbo,登录,验证码,用户,tanhua,user,import,com,public
From: https://www.cnblogs.com/zhangdashuaige/p/16840933.html

相关文章

  • 3.登录发送验证码
    登录发送验证码1.接口说明2.流程分析客户端发送请求服务端调用第三方组件发送验证码验证码发送成功,存入redis响应客户端,客户端跳转到输入验证码页面3.代码实现3......
  • SoringCloud(四) - 微信获取用户信息
    1、项目介绍2、微信公众平台和微信开放文档2.1微信公众平台2.1.1网址链接https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index......
  • Javaweb基础复习------Filter相关应用+登录验证案例的使用
    Filter(过滤器)基本步骤:1、定义类,实现Filter接口,并重写其所有方法2、配置Filter拦截资源的路径,在类上定义2WebFilter注解(WebFilter配置的路径,是拦截资源的路径)3、在d......
  • 验证码案例的实现---MyBatis+Session+Cookie
    展示验证码(jsp页面)首先,我们需要自己利用BufferedImage类去生成一张可以变换的验证码图片;之后,我们就可以利用这样一串代码去将验证码里面的内容获取到:这是一串测试代码:O......
  • useradd 创建用户
    创建用户目录创建新用户:sudouseradd-r-m-s/bin/bashdongyuanxin_2016150127。其中参数的意义如下:-r:建立系统账号-m:自动建立用户的登入目录-s:指定用户登入后所使用......
  • JAVA-登录
    packagecom.itheima;importjavax.swing.*;publicclassJFrame05{publicstaticvoidmain(String[]args){JFramejf=newJFrame();jf.s......
  • Javaweb基础复习------Cookie+Session案例的实现(登录注册案例)
    Cookie对象的创建--Cookiecookie=newCookie("key","value");发送Cookie:resp.addCookie();获取Cookie数据:req.getCookie("","");Cookie不能直接存储中文需要进行转......
  • Kubernetes_19_梳理出UserAccount用户账号一条线
    系列文章目录文章目录​​系列文章目录​​​​前言​​​​一、六种认证方式​​​​二、X509客户证书(最重要的用户账号凭证文件,默认方式)​​​​三、在HTTP请求中放入......
  • Npm 使用 Nexus 仓库的登录时候出现授权的问题
    例如,我们在npm登录Nexus的仓库的时候提示错误如下:npmERR!codeE401npmERR!Unabletoauthenticate,need:BASICrealm="SonatypeNexusRepositoryManager"npmER......
  • 用户场景
    用户场景一、用户1.权限起草、修改、发布、接受、管理公文确定公文密级注册登记个人账号2.功能公文草拟:根据自身需要进行公文的撰写,可与公文格式一同设计。公......