package ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import .slf4j.Slf4j;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService{
private StringRedisTemplate stringRedisTemplate;
public Result sendCode(String phone, HttpSession session) {
//检验手机号
if ((phone)) {
return ("手机号无效");
}
//生成验证码
String code = (6);
//存入Redis,key值定义带上业务功能,防止其他使用手机号的功能模块重复,设置过期时间
().set(RedisConstants.LOGIN_CODE_KEY + phone, code,
RedisConstants.LOGIN_CODE_TTL, );
//发送验证码给用户
("给用户发送验证码============={}", code);
//返回
return ("发送成功");
}
public Result login(LoginFormDTO loginFormDTO, HttpSession session) {
//校验手机号
if ((())) {
return ("手机号无效");
}
//校验验证码
String cacheCode = ().get(RedisConstants.LOGIN_CODE_KEY + ());
String code = ();
if (code == null || !(cacheCode)) {
return ("验证码错误");
}
//根据手机号查询用户
User user = query().eq("phone", ()).one();
if (user == null) {
//用户不存在则创建用户
user = createUser(());
}
//将用户放入redis
//随机生成token,作为登录令牌
String token = ().toString(true);
//将user对象转化为Hash存储
//存储到redis
UserDTO userDTO = (user, );
Map<String, Object> map = (userDTO, new HashMap<>(3),
().ignoreNullValue()
//把所有字段的value都转成String,因为StringRedisTemplate的key-value只支持String类型
.setFieldValueEditor((fieldName, fieldValue) -> ()));
String userKey = RedisConstants.LOGIN_USER_KEY + token;
().putAll(userKey, map);
//设置有效期,否则大量用户登录,长期占用内存,半个小时过期,需要重新登录
(userKey, RedisConstants.LOGIN_USER_TTL, );
//返回user的token
return (token);
}
private User createUser(String phone) {
User user = new User();
(phone);
(SystemConstants.USER_NICK_NAME_PREFIX + (6));
save(user);
return user;
}
}