ソースを参照

Merge branch 'data-quota' of wangfan/adweb3-server into master

wangfan 3 ヶ月 前
コミット
8f6512b63a

+ 40 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/dmp/controller/TradeSparqController.java

@@ -7,8 +7,14 @@ import jakarta.servlet.http.HttpServletRequest;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.tuple.Pair;
+import org.apache.shiro.SecurityUtils;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.vo.LoginUser;
 import org.jeecg.common.util.FastJsonUtil;
 import org.jeecg.common.util.FastJsonUtil;
+import org.jeecg.modules.adweb.quota.entity.ResourceQuota;
+import org.jeecg.modules.adweb.quota.service.IResourceQuotaService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.http.*;
 import org.springframework.http.*;
 import org.springframework.util.DigestUtils;
 import org.springframework.util.DigestUtils;
@@ -16,6 +22,7 @@ import org.springframework.web.bind.annotation.*;
 import org.springframework.web.client.RestClientResponseException;
 import org.springframework.web.client.RestClientResponseException;
 import org.springframework.web.client.RestTemplate;
 import org.springframework.web.client.RestTemplate;
 
 
+import java.util.Objects;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
 /**
 /**
@@ -38,12 +45,30 @@ public class TradeSparqController {
     @Value("${tradesparq.api.secret}")
     @Value("${tradesparq.api.secret}")
     private String apiSecret;
     private String apiSecret;
 
 
+    @Autowired private IResourceQuotaService resourceQuotaService;
+
     private RestTemplate restTemplate = new RestTemplate();
     private RestTemplate restTemplate = new RestTemplate();
 
 
     @PostMapping("/**")
     @PostMapping("/**")
     @ResponseBody
     @ResponseBody
     public Result<JSONObject> forwardPost(
     public Result<JSONObject> forwardPost(
-            @RequestBody JSONObject requestBody, HttpServletRequest httpRequest) {
+            HttpServletRequest httpRequest, @RequestBody JSONObject requestBody) {
+        String uid = ((LoginUser) SecurityUtils.getSubject().getPrincipal()).getId();
+
+        // 0. 校验用户资源额度
+        boolean isQuotaLimited = this.isQuotaLimited(httpRequest, requestBody);
+        if (isQuotaLimited) {
+            Pair<Integer, Integer> customsDataQuota = resourceQuotaService.getCustomsDataQuota(uid);
+            if (customsDataQuota.getLeft() <= customsDataQuota.getRight()) {
+                log.warn("用户 {} 海关查询资源额度不足", uid);
+                return Result.error(
+                        String.format(
+                                "查询失败。用户资源额度为%d,已使用%d",
+                                customsDataQuota.getLeft(), customsDataQuota.getRight()),
+                        null);
+            }
+        }
+
         // 1. 生成签名
         // 1. 生成签名
         String sortedValues =
         String sortedValues =
                 requestBody.keySet().stream()
                 requestBody.keySet().stream()
@@ -61,6 +86,12 @@ public class TradeSparqController {
         try {
         try {
             ResponseEntity<JSONObject> responseEntity =
             ResponseEntity<JSONObject> responseEntity =
                     restTemplate.exchange(requestEntity, JSONObject.class);
                     restTemplate.exchange(requestEntity, JSONObject.class);
+
+            // 2.1 记录资源额度消耗
+            if (isQuotaLimited) {
+                resourceQuotaService.consumeCustomsDataQuota(uid);
+            }
+
             return Result.ok(responseEntity.getBody());
             return Result.ok(responseEntity.getBody());
         } catch (RestClientResponseException e) {
         } catch (RestClientResponseException e) {
             return Result.error(e.getStatusCode().value(), e.getMessage());
             return Result.error(e.getStatusCode().value(), e.getMessage());
@@ -101,4 +132,12 @@ public class TradeSparqController {
 
 
         return httpHeaders;
         return httpHeaders;
     }
     }
+
+    /** 判断TradeSparq API请求是否受资源额度限制 - {@link ResourceQuota} */
+    private boolean isQuotaLimited(HttpServletRequest httpRequest, JSONObject requestBody) {
+        // TODO: 假定当前只限制详单查询(/cds_v2/old_api/record)第一页请求
+        return StringUtils.endsWithIgnoreCase(
+                        httpRequest.getServletPath(), "/cds_v2/old_api/record")
+                && Objects.equals(requestBody.getInteger("page"), 1);
+    }
 }
 }

+ 36 - 33
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/adweb/site/controller/WPSiteController.java

@@ -1,9 +1,10 @@
 package org.jeecg.modules.adweb.site.controller;
 package org.jeecg.modules.adweb.site.controller;
 
 
-
 import jakarta.annotation.Resource;
 import jakarta.annotation.Resource;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletRequest;
+
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
+
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.shiro.SecurityUtils;
 import org.apache.shiro.SecurityUtils;
@@ -33,39 +34,41 @@ import java.util.List;
 @RequestMapping("/wpWebSite")
 @RequestMapping("/wpWebSite")
 public class WPSiteController {
 public class WPSiteController {
 
 
-    @Resource
-    private SelfWebSiteService selfWebSiteService;
+    @Resource private SelfWebSiteService selfWebSiteService;
 
 
-    @Resource
-    private AdwebRedisUtil adwebRedisUtil;
+    @Resource private AdwebRedisUtil adwebRedisUtil;
 
 
-    @Resource
-    private SiteManageService siteManageService;
+    @Resource private SiteManageService siteManageService;
 
 
-    @Resource
-    private DomainService domainService;
+    @Resource private DomainService domainService;
 
 
-    @Resource
-    private IResourceQuotaService resourceQuotaService;
+    @Resource private IResourceQuotaService resourceQuotaService;
 
 
     /**
     /**
      * 创建站点
      * 创建站点
      *
      *
      * @param templateId 模板id
      * @param templateId 模板id
-     * @param planId     域名
-     * @param name       站点名称
-     * @param uid        站点所属用户名称
-     * @param request    请求信息
+     * @param planId 域名
+     * @param name 站点名称
+     * @param uid 站点所属用户名称
+     * @param request 请求信息
      * @return 创建的站点信息
      * @return 创建的站点信息
      */
      */
     @RequestMapping("addWebsite")
     @RequestMapping("addWebsite")
-    public Result<?> createWebSiteByTempId(HttpServletRequest request, Long templateId, String planId, String name, String uid, Integer giveDay, Integer compensateDay) {
+    public Result<?> createWebSiteByTempId(
+            HttpServletRequest request,
+            Long templateId,
+            String planId,
+            String name,
+            String uid,
+            Integer giveDay,
+            Integer compensateDay) {
         log.info("新建站点模板:" + templateId + "; 站点名称:" + name + "; 套餐id:" + planId);
         log.info("新建站点模板:" + templateId + "; 站点名称:" + name + "; 套餐id:" + planId);
 
 
         // 校验用户网站资源额度
         // 校验用户网站资源额度
         Pair<Integer, Integer> websiteQuota = resourceQuotaService.getWebsiteQuota(uid);
         Pair<Integer, Integer> websiteQuota = resourceQuotaService.getWebsiteQuota(uid);
         if (websiteQuota.getLeft() <= websiteQuota.getRight()) {
         if (websiteQuota.getLeft() <= websiteQuota.getRight()) {
-            log.info("用户 {} 网站资源额度不足", uid);
+            log.warn("用户 {} 网站资源额度不足", uid);
             return Result.error(
             return Result.error(
                     String.format(
                     String.format(
                             "网站创建失败。用户资源额度为%d,已使用%d",
                             "网站创建失败。用户资源额度为%d,已使用%d",
@@ -89,25 +92,26 @@ public class WPSiteController {
 
 
         LoginUser user = SecureUtil.currentUser();
         LoginUser user = SecureUtil.currentUser();
         // 建站服务
         // 建站服务
-        selfWebSiteService.createSite(user, templateId, uid, name, planId, sysUser, giveDay, compensateDay);
+        selfWebSiteService.createSite(
+                user, templateId, uid, name, planId, sysUser, giveDay, compensateDay);
 
 
         return Result.OK("申请创建站点成功,请等待通知,或者去站点管理查看结果!");
         return Result.OK("申请创建站点成功,请等待通知,或者去站点管理查看结果!");
     }
     }
 
 
     /**
     /**
      * 发布网站接口
      * 发布网站接口
-     * <p>
-     * 该方法通过接收服务器ID、域名和站点代码来申请发布一个网站
-     * 用户通过该接口提交发布申请,实际的发布操作由后台异步处理
      *
      *
-     * @param request  HttpServletRequest对象,用于获取请求相关信息
+     * <p>该方法通过接收服务器ID、域名和站点代码来申请发布一个网站 用户通过该接口提交发布申请,实际的发布操作由后台异步处理
+     *
+     * @param request HttpServletRequest对象,用于获取请求相关信息
      * @param serverId 服务器ID,标识要发布的服务器
      * @param serverId 服务器ID,标识要发布的服务器
-     * @param domain   域名,标识要发布的网站域名
+     * @param domain 域名,标识要发布的网站域名
      * @param siteCode 站点代码,用于识别和验证要发布的站点
      * @param siteCode 站点代码,用于识别和验证要发布的站点
      * @return 返回一个Result对象,包含发布申请的结果信息
      * @return 返回一个Result对象,包含发布申请的结果信息
      */
      */
     @RequestMapping("releaseWebsite")
     @RequestMapping("releaseWebsite")
-    public Result<?> releaseWebsite(HttpServletRequest request, String serverId, String domain, String siteCode) {
+    public Result<?> releaseWebsite(
+            HttpServletRequest request, String serverId, String domain, String siteCode) {
 
 
         // 站点发布
         // 站点发布
         selfWebSiteService.releaseSite(request, serverId, domain, siteCode);
         selfWebSiteService.releaseSite(request, serverId, domain, siteCode);
@@ -127,7 +131,6 @@ public class WPSiteController {
         return selfWebSiteService.delReleaseWebsite(domain, siteId);
         return selfWebSiteService.delReleaseWebsite(domain, siteId);
     }
     }
 
 
-
     /**
     /**
      * 站点 启动/停止
      * 站点 启动/停止
      *
      *
@@ -160,7 +163,8 @@ public class WPSiteController {
 
 
     @RequestMapping(value = "/check/domain", method = RequestMethod.POST)
     @RequestMapping(value = "/check/domain", method = RequestMethod.POST)
     @ResponseBody
     @ResponseBody
-    public Result<?> checkDomain(HttpServletRequest request, String cname, String ip, String domain) {
+    public Result<?> checkDomain(
+            HttpServletRequest request, String cname, String ip, String domain) {
 
 
         log.info("====== checkDomain cname:{},ip:{},domain:{} ======", cname, ip, domain);
         log.info("====== checkDomain cname:{},ip:{},domain:{} ======", cname, ip, domain);
         if (cname.equalsIgnoreCase(domain) || ip.equalsIgnoreCase(domain)) {
         if (cname.equalsIgnoreCase(domain) || ip.equalsIgnoreCase(domain)) {
@@ -168,30 +172,29 @@ public class WPSiteController {
             return new Result<>(100, "请勿提交我们的CNAME或IP");
             return new Result<>(100, "请勿提交我们的CNAME或IP");
         }
         }
 
 
-        //提交的域名已发布或被他人使用
+        // 提交的域名已发布或被他人使用
         List<AdwebSite> siteList = siteManageService.checkSiteDomainIsExists(domain);
         List<AdwebSite> siteList = siteManageService.checkSiteDomainIsExists(domain);
         log.info("siteList:{}", siteList);
         log.info("siteList:{}", siteList);
         if (!siteList.isEmpty()) {
         if (!siteList.isEmpty()) {
             return new Result<>(102, "您填写的域名已发布或被他人使用,请勿重复提交!");
             return new Result<>(102, "您填写的域名已发布或被他人使用,请勿重复提交!");
         }
         }
-        //检验域名是否以http开头
+        // 检验域名是否以http开头
         List<String> headStrs = new ArrayList<>();
         List<String> headStrs = new ArrayList<>();
         headStrs.add("http://");
         headStrs.add("http://");
         headStrs.add("https://");
         headStrs.add("https://");
         boolean isHttp = domainService.checkDomainBegin(domain, headStrs);
         boolean isHttp = domainService.checkDomainBegin(domain, headStrs);
-        //isHttp == true 是以http或https开头 直接返回
+        // isHttp == true 是以http或https开头 直接返回
         if (isHttp) {
         if (isHttp) {
             return new Result<>(101, "域名请勿以http://或https://开头");
             return new Result<>(101, "域名请勿以http://或https://开头");
         }
         }
-        //检验域名是否指向cname或ip
+        // 检验域名是否指向cname或ip
         boolean isToCnameOrIp = domainService.checkDomainIsCnameOrIp(cname, domain, ip);
         boolean isToCnameOrIp = domainService.checkDomainIsCnameOrIp(cname, domain, ip);
         if (isToCnameOrIp) {
         if (isToCnameOrIp) {
-            //满足不以http等开头 并且域名指向cname或ip中的一个
+            // 满足不以http等开头 并且域名指向cname或ip中的一个
             return Result.ok();
             return Result.ok();
         } else {
         } else {
-            //未指向cname或ip任意一个
+            // 未指向cname或ip任意一个
             return new Result<>(103, "请确认您的域名已指向CNAME或IP");
             return new Result<>(103, "请确认您的域名已指向CNAME或IP");
         }
         }
     }
     }
-
 }
 }