Browse Source

V1.0 新用户添加免费资产

wangPH 2 years ago
parent
commit
890c025275

+ 29 - 22
background-common/src/main/java/cn/kdan/compdf/config/JwtConfig.java

@@ -3,6 +3,8 @@ package cn.kdan.compdf.config;
 import cn.kdan.compdf.dto.LoginUserDTO;
 import cn.kdan.compdf.enums.AuthEnum;
 import cn.kdan.compdf.enums.JwtTokenEnum;
+import cn.kdan.compdf.exception.BusinessException;
+import lombok.SneakyThrows;
 import org.springframework.stereotype.Component;
 import io.jsonwebtoken.Claims;
 import io.jsonwebtoken.Jws;
@@ -10,7 +12,10 @@ import io.jsonwebtoken.Jwts;
 import io.jsonwebtoken.SignatureAlgorithm;
 import io.jsonwebtoken.security.Keys;
 
+import javax.crypto.Mac;
 import javax.crypto.SecretKey;
+import javax.crypto.spec.SecretKeySpec;
+import java.util.Base64;
 import java.util.Date;
 
 /**
@@ -47,34 +52,36 @@ public class JwtConfig {
      * @param jwtToken
      * @return
      */
-    public static LoginUserDTO checkJwt(String jwtToken) {
+    public static String checkJwt(String jwtToken) {
 
         Jws<Claims> claimsJws = Jwts.parser().setSigningKey(AuthEnum.SECRET.getBytes()).parseClaimsJws(jwtToken);
         // map
         Claims claims = claimsJws.getBody();
-        Long id = claims.get(JwtTokenEnum.ID,Long.class);
-        String username = claims.get(JwtTokenEnum.USERNAME,String.class);
-        String fullName = claims.get(JwtTokenEnum.FULL_NAME,String.class);
-        Long tenantId = claims.get(JwtTokenEnum.TENANT_ID,Long.class);
+        String email = claims.get(JwtTokenEnum.EMAIL, String.class);
 
-        return LoginUserDTO.builder()
-                .id(id)
-                .username(username)
-                .tenantId(tenantId)
-                .fullName(fullName)
-                .build();
+
+//        Long id = claims.get(JwtTokenEnum.ID,Long.class);
+//        String username = claims.get(JwtTokenEnum.USERNAME,String.class);
+//        String fullName = claims.get(JwtTokenEnum.FULL_NAME,String.class);
+//        Long tenantId = claims.get(JwtTokenEnum.TENANT_ID,Long.class);
+
+        return email;
     }
 
-/*    public static void main(String[] args) {
-//        String s = generateJwt(LoginUserDTO.builder().id(123L).username("kdan").tenantId("1").fullName("kk").build());
-//        System.out.println(s);
-        try {
-            String token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE2NjU5NzExMjYsImV4cCI6MTY2NTk3NDcyNiwiaWQiOjEyMywidXNlcm5hbWUiOiJrZGFuIiwidGVhbmF0SWQiOiIxIn0.LzPDSixl0RBqYCD60K3FXa8RBEFm9gbYboB6RqINGvM";
-            LoginUserDTO loginUserDTO = checkJwt(token);
-            System.out.println(loginUserDTO);
-        } catch (Exception e) {
-            throw new BusinessException("登录过期");
-        }
-    }*/
+//    @SneakyThrows
+//   public static void main(String[] args) {
+////        String s = generateJwt(LoginUserDTO.builder().id(123L).username("kdan").tenantId("1").fullName("kk").build());
+////        System.out.println(s);
+//       // 加密
+//
+//       try {
+//            String token = "eyJhbGciOiJIUzI1NiIsInR5cGUiOiJKV1QifQ.eyJlbWFpbCI6InBlbmdqaWFueW9uZ0BrZGFubW9iaWxlLmNvbSIsImlhdCI6MTY3MjYyOTM3NywianRpIjoiODk3NTk4ZjY4NDZjNjQ2NTQxYjU0M2MwNjRlYTdiYWYifQ.XuNzHvtUQvGsadpaxuv7kqfSdtn1oMdo76mHf8-TGBw";
+//            LoginUserDTO loginUserDTO = checkJwt(token);
+//            System.out.println(loginUserDTO);
+//        } catch (Exception e) {
+//            e.printStackTrace();
+//            throw new BusinessException("登录过期");
+//        }
+//    }
 
 }

+ 1 - 0
background-common/src/main/java/cn/kdan/compdf/enums/JwtTokenEnum.java

@@ -25,4 +25,5 @@ public interface JwtTokenEnum {
      */
     String TENANT_ID = "tenantId";
 
+    String EMAIL = "email";
 }

+ 8 - 0
background-common/src/main/java/cn/kdan/compdf/enums/RabbitMQEnum.java

@@ -55,5 +55,13 @@ public interface RabbitMQEnum {
      * webhooks更新路由规则
      */
     String BACKGROUND_WEBHOOKS_UPD_ROUTING_KEY = "background.webhooks.upd";
+    /**
+     * 资产增加队列
+     */
+    String BACKGROUND_USER_ASSET_RECHARGE_QUEUE = "background-user-asset-recharge-queue";
+    /**
+     * 资产增加路由规则
+     */
+    String BACKGROUND_USER_ASSET_RECHARGE_ROUTING_KEY = "background.user.asset.recharge";
 
 }

+ 2 - 0
background-gateway/src/main/java/cn/kdan/compdf/GatewayApplication.java

@@ -4,6 +4,7 @@ import cn.kdan.compdf.config.JwtConfig;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.cloud.openfeign.EnableFeignClients;
 import org.springframework.context.annotation.Import;
 
 /**
@@ -15,6 +16,7 @@ import org.springframework.context.annotation.Import;
 @Import({
         JwtConfig.class
 })
+@EnableFeignClients
 public class GatewayApplication {
     public static void main(String[] args) {
         SpringApplication.run(GatewayApplication.class, args);

+ 23 - 0
background-gateway/src/main/java/cn/kdan/compdf/feign/UserFeign.java

@@ -0,0 +1,23 @@
+package cn.kdan.compdf.feign;
+
+import cn.kdan.compdf.dto.LoginUserDTO;
+import cn.kdan.compdf.feign.fallback.UserFeignFallBackFactory;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+
+/**
+ * @author ComPDFKit-WPH 2023/1/2
+ */
+@FeignClient(name = "background-user",contextId="userInfo",fallbackFactory = UserFeignFallBackFactory.class)
+@Component
+public interface UserFeign {
+
+
+    @GetMapping("/")
+    LoginUserDTO getUserInfo(String email);
+
+    @PostMapping("/")
+    LoginUserDTO creatUser(String email);
+}

+ 30 - 0
background-gateway/src/main/java/cn/kdan/compdf/feign/fallback/UserFeignFallBackFactory.java

@@ -0,0 +1,30 @@
+package cn.kdan.compdf.feign.fallback;
+
+import cn.kdan.compdf.dto.LoginUserDTO;
+import cn.kdan.compdf.feign.UserFeign;
+import feign.hystrix.FallbackFactory;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author ComPDFKit-WPH 2023/1/2
+ */
+@Service
+public class UserFeignFallBackFactory implements FallbackFactory<UserFeign> {
+    @Override
+    public UserFeign create(Throwable throwable) {
+        return new UserFeign(){
+
+            @Override
+            public LoginUserDTO getUserInfo(String email) {
+
+                return null;
+            }
+
+            @Override
+            public LoginUserDTO creatUser(String email) {
+                return null;
+            }
+        };
+
+    }
+}

+ 15 - 4
background-gateway/src/main/java/cn/kdan/compdf/filter/AuthGlobalFilter.java

@@ -1,10 +1,12 @@
 package cn.kdan.compdf.filter;
 
+import cn.hutool.core.util.ObjectUtil;
 import cn.kdan.compdf.config.JwtConfig;
 import cn.kdan.compdf.dto.LoginUserDTO;
 import cn.kdan.compdf.enums.AuthEnum;
 import cn.kdan.compdf.enums.ResponseEnum;
 import cn.kdan.compdf.exception.BusinessException;
+import cn.kdan.compdf.feign.UserFeign;
 import com.alibaba.fastjson.JSON;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -34,6 +36,8 @@ public class AuthGlobalFilter implements GlobalFilter, Ordered {
 
     @Autowired
     private StringRedisTemplate redisTemplate;
+    @Autowired
+    private UserFeign userFeign;
 
     @Override
     public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
@@ -64,7 +68,13 @@ public class AuthGlobalFilter implements GlobalFilter, Ordered {
 
         // 3、解析
         try {
-            LoginUserDTO loginUserDTO = JwtConfig.checkJwt(authorization);
+            String email = JwtConfig.checkJwt(authorization);
+            // TODO 查询用户信息(username - email)
+            LoginUserDTO loginUserDTO = userFeign.getUserInfo(email);
+            if(ObjectUtil.isEmpty(loginUserDTO)){
+                loginUserDTO = userFeign.creatUser(email);
+            }
+
             // redie验证token是否过期
             Boolean flag = redisTemplate.hasKey(AuthEnum.USER_TOKEN_REDIS + authorization);
             if (null == flag || !flag) {
@@ -77,10 +87,11 @@ public class AuthGlobalFilter implements GlobalFilter, Ordered {
                 return response.writeWith(Mono.just(dataBuffer));
             }
 
+            LoginUserDTO finalLoginUserDTO = loginUserDTO;
             Consumer<HttpHeaders> httpHeaders = httpHeader -> {
-                httpHeader.set(AuthEnum.USER_ID_HEADER, loginUserDTO.getId().toString());
-                httpHeader.set(AuthEnum.USER_TENANT_ID_HEADER, loginUserDTO.getTenantId().toString());
-                httpHeader.set(AuthEnum.USER_NAME_HEADER, loginUserDTO.getUsername());
+                httpHeader.set(AuthEnum.USER_ID_HEADER, finalLoginUserDTO.getId().toString());
+                httpHeader.set(AuthEnum.USER_TENANT_ID_HEADER, finalLoginUserDTO.getTenantId().toString());
+                httpHeader.set(AuthEnum.USER_NAME_HEADER, finalLoginUserDTO.getUsername());
 //                httpHeader.set(AuthEnum.AUTHORIZATION, authorization);
             };
             ServerHttpRequest serverHttpRequest = exchange.getRequest().mutate().headers(httpHeaders).build();

+ 15 - 0
background-user/src/main/java/cn/kdan/compdf/config/RabbitConfig.java

@@ -98,6 +98,16 @@ public class RabbitConfig {
         return queue;
     }
 
+    /**
+     * 资产增加队列
+     */
+    @Bean
+    public Queue getAssetRechargeQueue(){
+        Queue queue = new Queue(RabbitMQEnum.BACKGROUND_USER_ASSET_RECHARGE_QUEUE, true, false, false, null);
+        rabbitAdmin.declareQueue(queue);
+        return queue;
+    }
+
 
     /**
      *  交换机绑定队列
@@ -123,4 +133,9 @@ public class RabbitConfig {
         return BindingBuilder.bind(getWebhooksUpdQueue()).to(getExchange()).with(RabbitMQEnum.BACKGROUND_WEBHOOKS_UPD_ROUTING_KEY);
     }
 
+    @Bean
+    public Binding getAssetRechargeBinding(){
+        return BindingBuilder.bind(getAssetRechargeQueue()).to(getExchange()).with(RabbitMQEnum.BACKGROUND_USER_ASSET_RECHARGE_ROUTING_KEY);
+    }
+
 }

+ 16 - 0
background-user/src/main/java/cn/kdan/compdf/constant/UserBalanceConstant.java

@@ -0,0 +1,16 @@
+package cn.kdan.compdf.constant;
+
+/**
+ * @author ComPDFKit-WPH 2022/12/30
+ */
+public interface UserBalanceConstant {
+
+    Integer DESCRIPTION_TYPE_FREE = 3;
+
+    String DESCRIPTION_FREE = "";
+
+    Integer CHANGE_TYPE_ADD = 1;
+
+
+    Integer BALANCE_CHANGE_FREE = 100;
+}

+ 26 - 0
background-user/src/main/java/cn/kdan/compdf/dto/AssetRechargeDTO.java

@@ -0,0 +1,26 @@
+package cn.kdan.compdf.dto;
+
+import lombok.Data;
+import lombok.ToString;
+
+import java.io.Serializable;
+
+/**
+ * @author ComPDFKit-WPH 2022/12/30
+ *
+ * 资产充值DTO
+ */
+@Data
+@ToString
+public class AssetRechargeDTO implements Serializable {
+
+    private Long tenantId;
+
+    private Integer asset;
+
+    private Integer assetType;
+
+
+
+
+}

+ 8 - 0
background-user/src/main/java/cn/kdan/compdf/service/BackgroundUserBalanceService.java

@@ -55,4 +55,12 @@ public interface BackgroundUserBalanceService extends IService<BackgroundUserBal
      * FreePlan 免费资产月底跟新记录数据同步
      */
     void freePlanSync(AddFreePlanDTO freePlanDTO);
+
+    /**
+     * 初始化资产
+     *
+     * @param userId   userId
+     * @param tenantId tenantId
+     */
+    void initUserBalance(Long userId, Long tenantId);
 }

+ 8 - 0
background-user/src/main/java/cn/kdan/compdf/service/BackgroundUserRemainService.java

@@ -42,4 +42,12 @@ public interface BackgroundUserRemainService extends IService<BackgroundUserRema
      * @param newestPlanAddFreeNum newestPlanAddFreeNum
      */
     void cleanFreeAssetTotal(Long tenantId, Integer newestPlanAddFreeNum);
+
+    /**
+     * 初始化资产
+     *
+     * @param userId   userId
+     * @param tenantId tenantId
+     */
+    void initFreeRemain(Long userId, Long tenantId);
 }

+ 7 - 0
background-user/src/main/java/cn/kdan/compdf/service/BackgroundUserService.java

@@ -42,4 +42,11 @@ public interface BackgroundUserService extends IService<BackgroundUser> {
      */
     LocalDateTime getUSerFirstLogin(Long tenantId);
 
+    /**
+     * 用户初始化资产信息
+     *
+     * @param userId   userId
+     * @param tenantId tenantId
+     */
+    void userInit(Long userId, Long tenantId);
 }

+ 18 - 0
background-user/src/main/java/cn/kdan/compdf/service/impl/BackgroundUserBalanceServiceImpl.java

@@ -3,6 +3,7 @@ package cn.kdan.compdf.service.impl;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.ObjectUtil;
+import cn.kdan.compdf.constant.UserBalanceConstant;
 import cn.kdan.compdf.dto.AddFreePlanDTO;
 import cn.kdan.compdf.dto.Asset;
 import cn.hutool.core.date.DateUtil;
@@ -261,6 +262,23 @@ public class BackgroundUserBalanceServiceImpl extends ServiceImpl<BackgroundUser
 
     }
 
+    @Override
+    public void initUserBalance(Long userId,Long tenantId){
+        BackgroundUserBalance userBalance = new BackgroundUserBalance();
+        userBalance.setUserId(userId);
+        userBalance.setTenantId(tenantId);
+        userBalance.setDate(LocalDateTime.now());
+        userBalance.setDescriptionType(UserBalanceConstant.DESCRIPTION_TYPE_FREE);
+        userBalance.setDescription(UserBalanceConstant.DESCRIPTION_FREE);
+        userBalance.setChangeType(UserBalanceConstant.CHANGE_TYPE_ADD);
+        userBalance.setBalanceChange(UserBalanceConstant.BALANCE_CHANGE_FREE);
+        userBalance.setRemainingFiles(UserBalanceConstant.BALANCE_CHANGE_FREE);
+
+        this.baseMapper.insert(userBalance);
+    }
+
+
+
     /**
      * 获取最新的plan资产余额
      *

+ 11 - 0
background-user/src/main/java/cn/kdan/compdf/service/impl/BackgroundUserRemainServiceImpl.java

@@ -1,6 +1,7 @@
 package cn.kdan.compdf.service.impl;
 
 import cn.kdan.compdf.config.RedisConstantServer;
+import cn.kdan.compdf.constant.UserBalanceConstant;
 import cn.kdan.compdf.dto.TenantAssetBalanceDTO;
 import cn.kdan.compdf.entity.BackgroundUserRemain;
 import cn.kdan.compdf.mapper.BackgroundUserRemainMapper;
@@ -57,5 +58,15 @@ public class BackgroundUserRemainServiceImpl extends ServiceImpl<BackgroundUserR
         this.baseMapper.updateCleanFreeTotal(tenantId,newestPlanAddFreeNum);
     }
 
+    @Override
+    public void initFreeRemain(Long userId,Long tenantId){
+        BackgroundUserRemain userRemain = new BackgroundUserRemain();
+        userRemain.setUserId(userId);
+        userRemain.setTenantId(tenantId);
+        userRemain.setTotalFiles(UserBalanceConstant.BALANCE_CHANGE_FREE);
+        userRemain.setUsedFiles(0);
+
+        this.baseMapper.insert(userRemain);
+    }
 
 }

+ 32 - 0
background-user/src/main/java/cn/kdan/compdf/service/impl/BackgroundUserServiceImpl.java

@@ -1,16 +1,23 @@
 package cn.kdan.compdf.service.impl;
 
+import cn.hutool.core.util.ObjectUtil;
 import cn.kdan.compdf.base.R;
 import cn.kdan.compdf.config.JwtConfig;
+import cn.kdan.compdf.config.RabbitConfig;
+import cn.kdan.compdf.constant.UserBalanceConstant;
+import cn.kdan.compdf.dto.AssetRechargeDTO;
 import cn.kdan.compdf.dto.ChangePasswordDTO;
 import cn.kdan.compdf.dto.LoginDTO;
 import cn.kdan.compdf.dto.LoginUserDTO;
 import cn.kdan.compdf.entity.BackgroundUser;
 import cn.kdan.compdf.enums.AuthEnum;
+import cn.kdan.compdf.enums.RabbitMQEnum;
 import cn.kdan.compdf.enums.ResponseEnum;
 import cn.kdan.compdf.exception.BusinessException;
 import cn.kdan.compdf.mapper.BackgroundUserMapper;
+import cn.kdan.compdf.service.BackgroundUserBalanceService;
 import cn.kdan.compdf.service.BackgroundUserProjectService;
+import cn.kdan.compdf.service.BackgroundUserRemainService;
 import cn.kdan.compdf.service.BackgroundUserService;
 import cn.kdan.compdf.utils.MD5Util;
 import cn.kdan.compdf.utils.TokenUtil;
@@ -20,7 +27,9 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.rabbit.core.RabbitTemplate;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Service;
@@ -34,6 +43,7 @@ import java.util.concurrent.TimeUnit;
  */
 @Slf4j
 @Service
+@RequiredArgsConstructor
 public class BackgroundUserServiceImpl extends ServiceImpl<BackgroundUserMapper, BackgroundUser> implements BackgroundUserService {
 
     @Autowired
@@ -41,6 +51,12 @@ public class BackgroundUserServiceImpl extends ServiceImpl<BackgroundUserMapper,
     @Autowired
     private BackgroundUserProjectService backgroundUserProjectService;
 
+    private final BackgroundUserRemainService userRemainService;
+    @Autowired
+    private BackgroundUserBalanceService userBalanceService;
+
+    private final RabbitTemplate rabbitTemplate;
+
     @Override
     public IPage<BackgroundUser> page(BackgroundUser query) {
         return this.page(new Page<>(query.getPage(), query.getSize()), Wrappers.query(query));
@@ -123,4 +139,20 @@ public class BackgroundUserServiceImpl extends ServiceImpl<BackgroundUserMapper,
                 .eq(BackgroundUser::getTenantId, tenantId)).getFirstLoginTime();
     }
 
+    @Override
+    public void userInit(Long userId, Long tenantId){
+        userBalanceService.initUserBalance(userId,tenantId);
+        userRemainService.initFreeRemain(userId,tenantId);
+        // 消息队列发送到转档同步数据
+        AssetRechargeDTO assetRechargeDTO = new AssetRechargeDTO();
+        assetRechargeDTO.setTenantId(tenantId);
+        assetRechargeDTO.setAssetType(UserBalanceConstant.DESCRIPTION_TYPE_FREE);
+        assetRechargeDTO.setAsset(UserBalanceConstant.BALANCE_CHANGE_FREE);
+        rabbitTemplate.convertAndSend(RabbitMQEnum.BACKGROUND_EXCHANGE,
+                RabbitMQEnum.BACKGROUND_USER_ASSET_RECHARGE_ROUTING_KEY,
+                assetRechargeDTO);
+    }
+
+
+
 }