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

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;
    }
相关推荐
清风拂山岗 明月照大江1 分钟前
Redis笔记汇总
java·redis·缓存
承渊政道2 分钟前
Linux系统学习【Linux系统的进度条实现、版本控制器git和调试器gdb介绍】
linux·开发语言·笔记·git·学习·gitee
xiaoxue..16 分钟前
合并两个升序链表 与 合并k个升序链表
java·javascript·数据结构·链表·面试
JQLvopkk26 分钟前
C# 轻量级工业温湿度监控系统(含数据库与源码)
开发语言·数据库·c#
忧郁的Mr.Li34 分钟前
SpringBoot中实现多数据源配置
java·spring boot·后端
玄同76540 分钟前
从 0 到 1:用 Python 开发 MCP 工具,让 AI 智能体拥有 “超能力”
开发语言·人工智能·python·agent·ai编程·mcp·trae
czy878747542 分钟前
深入了解 C++ 中的 `std::bind` 函数
开发语言·c++
消失的旧时光-19431 小时前
从 Kotlin 到 Dart:为什么 sealed 是处理「多种返回结果」的最佳方式?
android·开发语言·flutter·架构·kotlin·sealed
yq1982043011561 小时前
静思书屋:基于Java Web技术栈构建高性能图书信息平台实践
java·开发语言·前端
一个public的class1 小时前
你在浏览器输入一个网址,到底发生了什么?
java·开发语言·javascript