|
@@ -1,158 +1,195 @@
|
|
|
-//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;
|
|
|
-// }
|
|
|
-//}
|
|
|
+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.sdk.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设备获取token详情
|
|
|
+ *
|
|
|
+ * @param token : 用户token
|
|
|
+ * @param deviceType : 设备类型
|
|
|
+ * @return : 返回用户token详情
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public UserTokenDTO getTokenInfoByTokenDevice(String token, String deviceType) {
|
|
|
+ //查询缓存信息
|
|
|
+ String tokenInfoKey = this.getTokenInfoKey(token, deviceType);
|
|
|
+ UserToken userToken = redisUtils.getCache(tokenInfoKey);
|
|
|
+ if (userToken != null) {
|
|
|
+ return BeanUtils.copy(userToken, UserTokenDTO.class);
|
|
|
+ }
|
|
|
+ //缓存不存在, 查询数据库
|
|
|
+ userToken = super.getOne(new LambdaQueryWrapper<UserToken>()
|
|
|
+ .eq(UserToken::getToken, token)
|
|
|
+ .eq(UserToken::getDeviceType, deviceType));
|
|
|
+ if (userToken == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ //设置token详情缓存
|
|
|
+ redisUtils.setCache(tokenInfoKey, userToken, ExpireTimeEnum.ONE_DAY.getTime());
|
|
|
+ //设置用户缓存
|
|
|
+ String userTokenKey = this.getUserTokenKey(userToken.getUserId(), deviceType);
|
|
|
+ redisUtils.setCache(userTokenKey, userToken, ExpireTimeEnum.ONE_DAY.getTime());
|
|
|
+ //返回数据
|
|
|
+ return BeanUtils.copy(userToken, UserTokenDTO.class);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 通过用户设备获取token详情
|
|
|
+ *
|
|
|
+ * @param userId : 用户id
|
|
|
+ * @param deviceType : 设备类型
|
|
|
+ * @return : 返回token
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public UserTokenDTO getTokenInfoByUserDevice(Long userId, String deviceType) {
|
|
|
+ //查询缓存信息
|
|
|
+ String userTokenKey = this.getUserTokenKey(userId, deviceType);
|
|
|
+ UserToken userToken = redisUtils.getCache(userTokenKey);
|
|
|
+ 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;
|
|
|
+ }
|
|
|
+ //设置token详情缓存
|
|
|
+ String tokenInfoKey = this.getTokenInfoKey(userToken.getToken(), deviceType);
|
|
|
+ redisUtils.setCache(tokenInfoKey, userToken, ExpireTimeEnum.ONE_DAY.getTime());
|
|
|
+ //设置用户缓存
|
|
|
+ redisUtils.setCache(userTokenKey, userToken, ExpireTimeEnum.ONE_DAY.getTime());
|
|
|
+ //返回数据
|
|
|
+ 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_DAY.getTime());
|
|
|
+ //设置token详情缓存
|
|
|
+ String tokenInfoKey = this.getTokenInfoKey(token, deviceType);
|
|
|
+ redisUtils.setCache(tokenInfoKey, userToken, ExpireTimeEnum.ONE_DAY.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;
|
|
|
+ }
|
|
|
+}
|