UserServiceImpl

package com.seemygo.shop.cloud.service.impl;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.seemygo.shop.cloud.domain.User;
import com.seemygo.shop.cloud.exception.BusinessException;
import com.seemygo.shop.cloud.mapper.UserMapper;
import com.seemygo.shop.cloud.redis.MemberRedisKey;
import com.seemygo.shop.cloud.resp.MemberServerMsg;
import com.seemygo.shop.cloud.service.IUserService;
import com.seemygo.shop.cloud.util.JSONUtil;
import com.seemygo.shop.cloud.util.MD5Util;
import com.seemygo.shop.cloud.vo.LoginVo;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;


import java.util.UUID;

@Service
public class UserServiceImpl implements IUserService {

    @Autowired
    private final UserMapper userMapper;
    private final StringRedisTemplate redisTemplate;


    public UserServiceImpl(UserMapper userMapper, StringRedisTemplate redisTemplate) {
        this.userMapper = userMapper;
        this.redisTemplate = redisTemplate;
    }

    @Override
    public User findById(Long id) {
        return userMapper.selectByPrimaryKey(id);
    }

    @Override
    public String login(LoginVo loginVo) {
        if (StringUtils.isEmpty(loginVo.getUsername())) {
            throw new BusinessException(MemberServerMsg.PARAM_ERROR);
        }

        User user = this.findById(Long.parseLong(loginVo.getUsername()));
        if (user == null) {
            throw new BusinessException(MemberServerMsg.USERNAME_OR_PASSWORD_ERROR);
        }
        String inputPassword = MD5Util.formPass2DbPass(loginVo.getPassword(), user.getSalt());
        if (!inputPassword.equals(user.getPassword())) {
            throw new BusinessException(MemberServerMsg.USERNAME_OR_PASSWORD_ERROR);
        }
        // 生成 token
        return createToken(user);
    }

    private String createToken(User user) {
        String token = UUID.randomUUID().toString().replaceAll("-", "");
        try {
            // 保存到 redis
            String userStr = new ObjectMapper().writeValueAsString(user);
            redisTemplate.opsForValue().set(
                    MemberRedisKey.USER_TOKEN_KEY.join(token), // 真实key
                    userStr,  // 用户对象转成 json 字符串
                    MemberRedisKey.USER_TOKEN_KEY.getExpireTime(), // token 的过期时间
                    MemberRedisKey.USER_TOKEN_KEY.getUnit()); // 过期时间对应的单位
        } catch (Exception e) {
            e.printStackTrace();
        }
        return token;
    }

    @Override
    public User findByToken(String token) {
        String json = redisTemplate.opsForValue().get(MemberRedisKey.USER_TOKEN_KEY.join(token));
        if (!org.springframework.util.StringUtils.isEmpty(json)) {
            return JSONUtil.parseObject(json, User.class);
        }
        return null;
    }

    @Override
    public boolean refreshToken(String token) {
        // redis 刷新 token 有效时间
        Boolean expire = redisTemplate.expire(
                MemberRedisKey.USER_TOKEN_KEY.join(token),
                MemberRedisKey.USER_TOKEN_KEY.getExpireTime(),
                MemberRedisKey.USER_TOKEN_KEY.getUnit());
        return expire != null && expire;
    }
}

 

posted @ 2021-12-10 08:09  白芷100  阅读(153)  评论(0)    收藏  举报