【黑马点评-1登录验证功能】二、注册登录功能的逻辑和代码实现
login逻辑
1. 输入邮箱 + 验证码,校验邮箱格式
接受的输入为
- 邮箱: phone
- 用户输入的验证码:code
这里只用工具类检查邮箱格式(仅判空)
2. 检查验证码是否一致
1.从Redis中取出key"login:code:"+phone对应的value(字符串)。
String Cachecode = stringRedisTemplate.opsForValue().get(LOGIN_CODE_KEY + phone);
- 判断从Redis中取出的CacheCode和用户输入的code是否一致
if (!code.equals(Cachecode)) {
return Result.fail("无效的验证码");
}
3. 查询用户信息
- 用Mybatis-Plus查询这个号码的单条记录
User user = query().eq("phone", phone).one();
- 这个User 实体对应MySQL中的
tb_user表
字段如下
- id(主键)
- phone(索引)
- password
- nick_name
- icon(头像)
- create_time
- update_time
4. 不存在,则createuser
- 如果
user==null, 则调用createuser(String phone)方法
createuser(String phone)
- 创建实体user
- 设置属性
- phone
- nickname
- 用MyBatis-plus把这个user保存到数据库中
5. 存在,则生成token
5.1 生成一个唯一的令牌(使用hutool的工具类UUID的静态方法,得到字符串)
String token = UUID.randomUUID().toString();
5.2 将UserDto转换为HashMap存储
- 从user实体创建一个UserDTO对象(数据传输对象用于封装)
- 创建一个HashMap对象 userMap
- 使用Redis的hash结构存储
- key为
"login:token:" + token - value为 userMap(包含field:ID,nickname,icon)
String tokenKey = LOGIN_USER_KEY + token; stringRedisTemplate.opsForHash().putAll(tokenKey, userMap); - key为
- 设置上面的key过期时间为30min
- 删除Redis中的key
"login:code:"+phone,即该phone对应的验证码信息 - 返回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());

浙公网安备 33010602011771号