【黑马点评-1登录验证功能】二、注册登录功能的逻辑和代码实现

login逻辑

1. 输入邮箱 + 验证码,校验邮箱格式

接受的输入为

  • 邮箱: phone
  • 用户输入的验证码:code

这里只用工具类检查邮箱格式(仅判空)

2. 检查验证码是否一致

1.从Redis中取出key"login:code:"+phone对应的value(字符串)。

String Cachecode = stringRedisTemplate.opsForValue().get(LOGIN_CODE_KEY + phone);
  1. 判断从Redis中取出的CacheCode和用户输入的code是否一致
if (!code.equals(Cachecode)) {
    return Result.fail("无效的验证码");
}

3. 查询用户信息

  1. 用Mybatis-Plus查询这个号码的单条记录
User user = query().eq("phone", phone).one();
  1. 这个User 实体对应MySQL中的tb_user
    字段如下
  • id(主键)
  • phone(索引)
  • password
  • nick_name
  • icon(头像)
  • create_time
  • update_time

4. 不存在,则createuser

  1. 如果user==null, 则调用createuser(String phone)方法

createuser(String phone)

  1. 创建实体user
  2. 设置属性
    • phone
    • nickname
  3. 用MyBatis-plus把这个user保存到数据库中

5. 存在,则生成token

5.1 生成一个唯一的令牌(使用hutool的工具类UUID的静态方法,得到字符串)

String token = UUID.randomUUID().toString();

5.2 将UserDto转换为HashMap存储

  1. 从user实体创建一个UserDTO对象(数据传输对象用于封装)
  2. 创建一个HashMap对象 userMap
  3. 使用Redis的hash结构存储
    • key为 "login:token:" + token
    • value为 userMap(包含field:ID,nickname,icon)
    String tokenKey = LOGIN_USER_KEY + token;
    stringRedisTemplate.opsForHash().putAll(tokenKey, userMap);
    
  4. 设置上面的key过期时间为30min
  5. 删除Redis中的key "login:code:"+phone,即该phone对应的验证码信息
  6. 返回token
    stringRedisTemplate.delete(LOGIN_CODE_KEY + phone);
    

UserDTO类有三个属性

  • id
  • nickName
  • icon
UserDTO userDTO = BeanUtil.copyProperties(user, UserDTO.class);
        HashMap<String, String> userMap = new HashMap<>();
        userMap.put("id", String.valueOf(userDTO.getId()));
        userMap.put("nickName", userDTO.getNickName());
        userMap.put("icon", userDTO.getIcon());
posted @ 2025-04-12 14:49  kuki'  阅读(47)  评论(0)    收藏  举报