package com.hmdp.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.copier.CopyOptions; import cn.hutool.core.lang.UUID; import cn.hutool.core.util.RandomUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.hmdp.dto.LoginFormDTO; import com.hmdp.dto.Result; import com.hmdp.dto.UserDTO; import com.hmdp.entity.User; import com.hmdp.mapper.UserMapper; import com.hmdp.service.IUserService; import com.hmdp.utils.RegexUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; import javax.annotation.Resource; import javax.servlet.http.HttpSession; import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; import static com.hmdp.utils.RedisConstants.*; import static com.hmdp.utils.SystemConstants.USER_NICK_NAME_PREFIX; /** *

* 服务实现类 *

* * @author 虎哥 * @since 2021-12-22 */ @Slf4j @Service public class UserServiceImpl extends ServiceImpl implements IUserService { @Resource private StringRedisTemplate stringRedisTemplate; @Override public Result sendCode(String phone, HttpSession session) { // 校验手机号是否合格 if(RegexUtils.isPhoneInvalid(phone)){ return Result.fail("手机号格式错误"); } // 合格生成验证码 String code = RandomUtil.randomNumbers(6); // // 保存到session // session.setAttribute("code",code); // 保存到redis,并且两分钟失效 stringRedisTemplate.opsForValue().set(LOGIN_CODE_KEY+phone,code,LOGIN_CODE_TTL, TimeUnit.MINUTES); // 发送验证码 log.debug("发送验证码成功,验证码为:{}",code); return Result.ok(); } @Override public Result login(LoginFormDTO loginForm, HttpSession session) { // 校验手机号是否合格 String phone = loginForm.getPhone(); if(RegexUtils.isPhoneInvalid(phone)){ return Result.fail("手机号格式错误"); } // 获取loginForm中的code对比session中的 String code = loginForm.getCode(); // if(code == null || !code.equals(session.getAttribute("code"))){ // return Result.fail("验证码错误"); // } String cacheCode = stringRedisTemplate.opsForValue().get(LOGIN_CODE_KEY+phone); if(code == null || !code.equals(cacheCode)){ return Result.fail("验证码错误"); } // 判断用户是否存在,存在存到session,不存在创建用户 User user = query().eq("phone", phone).one(); if (user == null){ user = saveUserByPhone(phone); save(user); } // session.setAttribute("user",user); // 保存用户信息到 redis中 // 随机生成token,作为登录令牌 String token = UUID.randomUUID().toString(true); // 将user对象转成hashMap UserDTO userDTO = BeanUtil.copyProperties(user, UserDTO.class); Map userMap = BeanUtil.beanToMap(userDTO, new HashMap<>(), CopyOptions.create() .setIgnoreNullValue(true) .setFieldValueEditor((fieldName, fieldValue) -> fieldValue.toString())); stringRedisTemplate.opsForHash().putAll(LOGIN_USER_KEY+token,userMap); stringRedisTemplate.expire(LOGIN_USER_KEY+token,LOGIN_USER_TTL,TimeUnit.MINUTES); return Result.ok(token); } private User saveUserByPhone(String phone) { User user = new User(); user.setPhone(phone); user.setNickName(USER_NICK_NAME_PREFIX+RandomUtil.randomString(10)); return user; } }