|
@@ -0,0 +1,158 @@
|
|
|
+package com.zanxiang.sdk.service.Impl;
|
|
|
+
|
|
|
+import com.alibaba.nacos.common.utils.CollectionUtils;
|
|
|
+import com.alibaba.nacos.common.utils.MD5Utils;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import com.zanxiang.common.enums.ExpireTimeEnum;
|
|
|
+import com.zanxiang.common.exception.BaseException;
|
|
|
+import com.zanxiang.common.redis.utils.RedisUtils;
|
|
|
+import com.zanxiang.common.text.UUID;
|
|
|
+import com.zanxiang.common.utils.bean.BeanUtils;
|
|
|
+import com.zanxiang.sdk.constant.RedisKeyConstant;
|
|
|
+import com.zanxiang.sdk.domain.dto.UserTokenDTO;
|
|
|
+import com.zanxiang.sdk.domain.entity.UserToken;
|
|
|
+import com.zanxiang.sdk.mapper.UserTokenMapper;
|
|
|
+import com.zanxiang.sdk.service.IUserTokenService;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import java.security.NoSuchAlgorithmException;
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @author : lingfeng
|
|
|
+ * @time : 2022-06-07
|
|
|
+ * @description : 用户token管理
|
|
|
+ */
|
|
|
+@Slf4j
|
|
|
+@Service
|
|
|
+public class UserTokenServiceImpl extends ServiceImpl<UserTokenMapper, UserToken> implements IUserTokenService {
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private RedisUtils<UserToken> redisUtils;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 通过用户设备获取token详情
|
|
|
+ *
|
|
|
+ * @param userId : 用户id
|
|
|
+ * @param deviceType : 设备类型
|
|
|
+ * @return : 返回token
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public UserTokenDTO getTokenInfoByUserDevice(Long userId, String deviceType) {
|
|
|
+ //查询缓存信息
|
|
|
+ String key = this.getUserTokenKey(userId, deviceType);
|
|
|
+ UserToken userToken = redisUtils.getCache(key);
|
|
|
+ if (userToken != null) {
|
|
|
+ return BeanUtils.copy(userToken, UserTokenDTO.class);
|
|
|
+ }
|
|
|
+ //缓存不存在, 查询数据库
|
|
|
+ userToken = super.getOne(new LambdaQueryWrapper<UserToken>()
|
|
|
+ .eq(UserToken::getUserId, userId)
|
|
|
+ .eq(UserToken::getDeviceType, deviceType));
|
|
|
+ if (userToken == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ return BeanUtils.copy(userToken, UserTokenDTO.class);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取用户token
|
|
|
+ *
|
|
|
+ * @param userId : 用户id
|
|
|
+ * @param deviceType : 设备类型
|
|
|
+ * @return : 返回token
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public String getUserToken(Long userId, String deviceType) {
|
|
|
+ //获取token
|
|
|
+ String token = this.createToken(userId, deviceType);
|
|
|
+ //查询数据库token信息
|
|
|
+ UserToken userToken = super.getOne(new LambdaQueryWrapper<UserToken>()
|
|
|
+ .eq(UserToken::getUserId, userId)
|
|
|
+ .eq(UserToken::getDeviceType, deviceType));
|
|
|
+ //不存在token数据, 直接创建
|
|
|
+ if (userToken == null) {
|
|
|
+ userToken = new UserToken(userId, token, deviceType);
|
|
|
+ super.save(userToken);
|
|
|
+ } else {
|
|
|
+ //梗系数据库
|
|
|
+ userToken.updateToken(token);
|
|
|
+ super.updateById(userToken);
|
|
|
+ }
|
|
|
+ //设置用户缓存
|
|
|
+ String userTokenKey = this.getUserTokenKey(userId, deviceType);
|
|
|
+ redisUtils.setCache(userTokenKey, userToken, ExpireTimeEnum.ONE_WEEK.getTime());
|
|
|
+ //设置token详情缓存
|
|
|
+ String tokenInfoKey = this.getTokenInfoKey(token, deviceType);
|
|
|
+ redisUtils.setCache(tokenInfoKey, userToken, ExpireTimeEnum.ONE_WEEK.getTime());
|
|
|
+ //返回token
|
|
|
+ return token;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 删除用户token
|
|
|
+ *
|
|
|
+ * @param userId : 用户id
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void deleteUserToken(Long userId) {
|
|
|
+ List<UserToken> userTokenList = super.list(new LambdaQueryWrapper<UserToken>()
|
|
|
+ .eq(UserToken::getUserId, userId));
|
|
|
+ if (CollectionUtils.isEmpty(userTokenList)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ userTokenList.forEach(userToken -> {
|
|
|
+ //根据主键删除数据库
|
|
|
+ super.removeById(userToken.getId());
|
|
|
+ //删除缓存
|
|
|
+ String userTokenKey = this.getUserTokenKey(userId, userToken.getDeviceType());
|
|
|
+ redisUtils.deleteCache(userTokenKey);
|
|
|
+ String tokenInfoKey = this.getTokenInfoKey(userToken.getToken(), userToken.getDeviceType());
|
|
|
+ redisUtils.deleteCache(tokenInfoKey);
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 创建token
|
|
|
+ *
|
|
|
+ * @param userId : 用户id
|
|
|
+ * @param deviceType : 设备类型
|
|
|
+ * @return : 返回token
|
|
|
+ */
|
|
|
+ private String createToken(Long userId, String deviceType) {
|
|
|
+ //生成随机数
|
|
|
+ String random = userId + deviceType + UUID.randomUUID().toString() + System.currentTimeMillis();
|
|
|
+ //创建token
|
|
|
+ try {
|
|
|
+ return MD5Utils.md5Hex(MD5Utils.md5Hex(random.getBytes()).getBytes());
|
|
|
+ } catch (NoSuchAlgorithmException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ throw new BaseException("生成token异常");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 拼接用户token缓存key
|
|
|
+ *
|
|
|
+ * @param userId : 用户id
|
|
|
+ * @param deviceType : 设备类型
|
|
|
+ * @return : 返回用户token的缓存key
|
|
|
+ */
|
|
|
+ private String getUserTokenKey(Long userId, String deviceType) {
|
|
|
+ return RedisKeyConstant.USER_TOKEN_KEY + "_" + userId + "_" + deviceType;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 拼接用户token缓存key
|
|
|
+ *
|
|
|
+ * @param token : 用户token
|
|
|
+ * @param deviceType : 设备类型
|
|
|
+ * @return : 返回用户token的缓存key
|
|
|
+ */
|
|
|
+ private String getTokenInfoKey(String token, String deviceType) {
|
|
|
+ return RedisKeyConstant.TOKEN_INFO_KEY + "_" + token + "_" + deviceType;
|
|
|
+ }
|
|
|
+}
|