【探花交友】用户登录总结

1.发送验证码

1.发送post请求 数据封装在map 获取map的手机号码

2.调用service层将手机号码 传入过去

3.正常返回状态码200

java 复制代码
@RestController
@RequestMapping("/user")
public class LoginController {

    @Autowired
    private UserService userService;

    /**
     * 获取登录验证码
     *   请求参数:phone (Map)
     *   响应:void
     */
    @PostMapping("/login")
    public ResponseEntity login(@RequestBody Map map){
        String phone =(String) map.get("phone");
        userService.sendMsg(phone);
        return ResponseEntity.ok(null); //正常返回状态码200
    }
}

1.随机生成6位数字验证码

2.将验证码存入reids 使用固定前缀+手机号码 过期时间5分钟

java 复制代码
@Service
public class UserService {

    @Autowired
    private SmsTemplate template;

    @Autowired
    private RedisTemplate<String,String> redisTemplate;

    /**
     * 发送短信验证码
     * @param phone
     */
    public void sendMsg(String phone) {
        //1、随机生成6位数字
        //String code = RandomStringUtils.randomNumeric(6);
        String code = "123456";
        //2、调用template对象,发送手机短信
        //template.sendSms(phone,code);
        //3、将验证码存入到redis
        redisTemplate.opsForValue().set("CHECK_CODE_"+phone,code, Duration.ofMinutes(5));
    }
 }

2.用户登录

1.从map中获得手机号码 和 验证码

2.调用service层 传入手机号码 和验证码

3.返回map map里必须要有token信息 和 isNew 是否新用户

java 复制代码
    /**
     * 检验登录
     */
    @PostMapping("/loginVerification")
    public ResponseEntity loginVerification(@RequestBody Map map) {
        //1、调用map集合获取请求参数
        String phone = (String) map.get("phone");
        String code = (String) map.get("verificationCode");
        //2、调用userService完成用户登录
        Map retMap = userService.loginVerification(phone,code);
        //3、构造返回
        return ResponseEntity.ok(retMap);
    }

4.从redis获取验证码

5.对redis验证码进行一个非空判断(防止已经删除了) 与 对传入来的验证码进行一个校验 如果

redis验证码非空 或 验证码错误 则抛出异常

6.删除redis存的验证码(防止重复使用)

7.创建一个boolean值 isNew 默认是false(不是新用户)

8.调用api传入手机号 查找用户

9.判断用户是否存在

8.如果不存在就是新用户 重新new一个(因为没查找出来是null 必须在new一个) 设置他的手机

号码 以及密码(密码默认123456 md5加密) 然后保存 返回它的用户id**(这里我有点不懂 insert 之后**

为什么user 就有id)

9.将id设置给user isNew=true 表示是个新用户

10.创建map 存入id和手机号码 使用jwt加密成token

11.创建map保存数据 将生成的token存入进去 和 isNew 返回给controller层

java 复制代码
/**
     * 验证登录
     * @param phone
     * @param code
     */
    public Map loginVerification(String phone, String code) {
        //1、从redis中获取下发的验证码
        String redisCode = redisTemplate.opsForValue().get("CHECK_CODE_" + phone);
        //2、对验证码进行校验(验证码是否存在,是否和输入的验证码一致)
        if(StringUtils.isEmpty(redisCode) || !redisCode.equals(code)) {
            //验证码无效
             throw new RuntimeException();
        }
        //3、删除redis中的验证码
        redisTemplate.delete("CHECK_CODE_" + phone);
        //4、通过手机号码查询用户
        User user = userApi.findByMobile(phone);
        boolean isNew = false;
        //5、如果用户不存在,创建用户保存到数据库中
        if(user == null) {
            user = new User();
            user.setMobile(phone);
            user.setPassword(DigestUtils.md5Hex("123456"));
            Long userId = userApi.save(user);
            user.setId(userId);
            isNew = true;
        }
        //6、通过JWT生成token(存入id和手机号码)
        Map tokenMap = new HashMap();
        tokenMap.put("id",user.getId());
        tokenMap.put("mobile",phone);
        String token = JwtUtils.getToken(tokenMap);
        //7、构造返回值
        Map retMap = new HashMap();
        retMap.put("token",token);
        retMap.put("isNew",isNew);

        return retMap;
    }
相关推荐
Wpa.wk4 分钟前
性能测试 - JMeter练习-JMeter录制Web端压测脚本操作步骤
java·前端·经验分享·jmeter·自动化
hqwest4 分钟前
码上通QT实战28--系统设置03-用户管理布局
开发语言·qt·qdialog·模态窗体·非模态窗体·qwidget!
萧曵 丶6 分钟前
Elasticsearch 高频面试题(高级 Java 开发版)
java·elasticsearch
无限进步_10 分钟前
【C语言&数据结构】二叉树链式结构完全指南:从基础到进阶
c语言·开发语言·数据结构·c++·git·算法·visual studio
xiaoliuliu1234511 分钟前
apache-tomcat-6.0.10使用步骤详解(附启动与部署教程)
java·tomcat·apache
TDengine (老段)13 分钟前
TDengine Node.js 语言连接器入门指南
大数据·开发语言·物联网·node.js·vim·时序数据库·tdengine
Re_zero13 分钟前
🍲 图解 JVM 内存模型:别背八股文了,直接进“Re-Zero 火锅店”干饭!
java·jvm
阿蒙Amon14 分钟前
C#每日面试题-简述命名空间和程序集
java·面试·c#
脏脏a15 分钟前
STL stack/queue 底层模拟实现与典型算法场景实践
开发语言·c++·stl_stack·stl_queue
烤麻辣烫16 分钟前
Java开发手册规则精选
java·开发语言·学习