TRX il y a 1 an
Parent
commit
17016a66fe

+ 18 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/upload/InterfaceUseRecordDao.java

@@ -0,0 +1,18 @@
+package com.zhongshu.card.server.core.dao.upload;
+
+import com.github.microservice.components.data.mongo.mongo.dao.MongoDao;
+import com.zhongshu.card.server.core.domain.upload.InterfaceUseRecord;
+
+/**
+ * 区域Dao
+ *
+ * @author TRX
+ * @date 2024/3/21
+ */
+public interface InterfaceUseRecordDao extends MongoDao<InterfaceUseRecord> {
+
+    InterfaceUseRecord findTopById(String id);
+
+    InterfaceUseRecord findTopByKeyAndInterfaceNameOrderByCreateTimeDesc(String key, String interfaceName);
+
+}

+ 43 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/upload/InterfaceUseRecord.java

@@ -0,0 +1,43 @@
+package com.zhongshu.card.server.core.domain.upload;
+
+import com.zhongshu.card.server.core.domain.base.SuperMain;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.checkerframework.common.aliasing.qual.NonLeaked;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 接口使用频率
+ *
+ * @author TRX
+ * @date 2025/2/18
+ */
+@Data
+@Document
+@AllArgsConstructor
+@NoArgsConstructor
+@NonLeaked
+public class InterfaceUseRecord extends SuperMain {
+
+    @Schema(description = "")
+    private String key;
+
+    private String interfaceName;
+
+    @Schema(description = "IP地址")
+    private String ip;
+
+    @Schema(description = "浏览器")
+    private String ua;
+
+    @Schema(description = "api地址")
+    private String url;
+
+    @Schema(description = "扩展信息")
+    private Map<String, Object> metaInfo = new HashMap<String, Object>();
+}

+ 4 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/base/SuperService.java

@@ -98,6 +98,10 @@ public abstract class SuperService {
         return authClientSecurityAuthenticationHelper.getParameter(new String[]{"projectoid", "projectOid"});
     }
 
+    public String getOpenId() {
+        return authClientSecurityAuthenticationHelper.getParameter(new String[]{"openId", "openid"});
+    }
+
     public String getHeadParam(String[] keys) {
         if (keys != null && keys.length > 0) {
             return authClientSecurityAuthenticationHelper.getParameter(keys);

+ 83 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/oss/InterfaceUseRecordService.java

@@ -0,0 +1,83 @@
+package com.zhongshu.card.server.core.service.oss;
+
+import com.github.microservice.core.util.net.IPUtil;
+import com.github.microservice.net.ResultContent;
+import com.zhongshu.card.server.core.dao.upload.InterfaceUseRecordDao;
+import com.zhongshu.card.server.core.domain.upload.InterfaceUseRecord;
+import com.zhongshu.card.server.core.service.base.SuperService;
+import jakarta.servlet.http.HttpServletRequest;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.ObjectUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
+
+/**
+ * 上传文件记录
+ *
+ * @author TRX
+ * @date 2025/2/18
+ */
+@Slf4j
+@Service
+public class InterfaceUseRecordService extends SuperService {
+
+    @Autowired
+    private InterfaceUseRecordDao interfaceUseRecordDao;
+
+    @Autowired
+    private HttpServletRequest request;
+
+    /**
+     * 判断是否可以上传
+     *
+     * @param key
+     * @return
+     */
+    public ResultContent judge(String key, String faceName) {
+        if (ObjectUtils.isNotEmpty(key)) {
+            InterfaceUseRecord fileRecord = interfaceUseRecordDao.findTopByKeyAndInterfaceNameOrderByCreateTimeDesc(key, faceName);
+            if (ObjectUtils.isNotEmpty(fileRecord)) {
+                if ((System.currentTimeMillis() - fileRecord.getCreateTime()) <= 1000) {
+                    return ResultContent.buildFail("上传太频繁,请稍后再试");
+                }
+            }
+        }
+        return ResultContent.buildSuccess();
+    }
+
+    public ResultContent judge(String key) {
+        String faceName = request.getRequestURL().toString();
+        return judge(key, faceName);
+    }
+
+    public ResultContent saveRecord(String key, String projectOid, Map<String, Object> metaInfo) {
+        String faceName = request.getRequestURL().toString();
+        return saveRecord(key, projectOid, faceName, metaInfo);
+    }
+
+    /**
+     * 保存上传记录
+     *
+     * @param key
+     * @return
+     */
+    public ResultContent saveRecord(String key, String projectOid, String faceName, Map<String, Object> metaInfo) {
+        InterfaceUseRecord interfaceUseRecord = new InterfaceUseRecord();
+        interfaceUseRecord.setKey(key);
+        interfaceUseRecord.setProjectOid(projectOid);
+        interfaceUseRecord.setMetaInfo(metaInfo);
+        interfaceUseRecord.setInterfaceName(faceName);
+        initEntityNoCheckOid(interfaceUseRecord);
+        try {
+            interfaceUseRecord.setUa(request.getHeader("User-Agent"));
+            interfaceUseRecord.setIp(IPUtil.getRemoteIp(request));
+            interfaceUseRecord.setUrl(request.getRequestURI());
+        } catch (Exception e) {
+            log.error("initLog error {}", e.getMessage());
+        }
+        interfaceUseRecordDao.save(interfaceUseRecord);
+        return ResultContent.buildSuccess();
+    }
+}

+ 18 - 8
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/oss/NetDiskOssBusService.java

@@ -3,7 +3,6 @@ package com.zhongshu.card.server.core.service.oss;
 import com.github.microservice.core.util.response.ResponseUtil;
 import com.github.microservice.net.ResultContent;
 import com.github.microservice.net.ResultState;
-import com.github.microservice.netdisk.client.example.AccountExample;
 import com.github.microservice.netdisk.client.model.file.CopyFileModel;
 import com.github.microservice.netdisk.client.model.file.FileItemModel;
 import com.github.microservice.netdisk.client.model.file.FileStoreModel;
@@ -37,17 +36,12 @@ import org.springframework.data.mongodb.gridfs.GridFsResource;
 import org.springframework.data.mongodb.gridfs.GridFsTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StreamUtils;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.UUID;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -82,9 +76,12 @@ public class NetDiskOssBusService extends SuperService {
     @Value("${spring.application.name}")
     private String applicationName;
 
+    @Autowired
+    private InterfaceUseRecordService interfaceUseRecordService;
+
     /**
-     * @return
      * @param file
+     * @return
      */
     public ResultContent<String> uploadMinioFile(MultipartFile file, OidParam param) throws IOException {
         @Cleanup var inputStream = file.getInputStream();
@@ -101,7 +98,14 @@ public class NetDiskOssBusService extends SuperService {
         if (StringUtils.isEmpty(accountId)) {
             return ResultContent.buildFail("");
         }
+        String faceName = "uploadMinioFile";
+        String key = getOpenId();
+        ResultContent fileContent = interfaceUseRecordService.judge(key, faceName);
+        if (fileContent.isFailed()) {
+            return ResultContent.buildFail(fileContent.getMsg());
+        }
 
+        String projectOid = getCurrentProjectOid();
         final String filename = CommonUtil.UUID() + "_" + file.getOriginalFilename();
         String mimeTypeName = ResponseUtil.getMimeType(FilenameUtils.getExtension(filename));
         gridFsTemplate.store(inputStream, filename, mimeTypeName).toHexString();
@@ -118,6 +122,12 @@ public class NetDiskOssBusService extends SuperService {
         this.gridFsTemplate.delete(makeQuery(filename));
         if (fileStoreModelResultContent.getState() == com.github.microservice.netdisk.client.content.ResultState.Success) {
             FileStoreModel fileStoreModel = fileStoreModelResultContent.getContent();
+            Map<String, Object> metaInfo = new HashMap<String, Object>();
+            metaInfo.put("fileName", filename);
+            metaInfo.put("size", file.getSize());
+            metaInfo.put("fileType", file.getOriginalFilename());
+            metaInfo.put("url", fileStoreModel.getUrl());
+            interfaceUseRecordService.saveRecord(key, projectOid, faceName, metaInfo);
             return ResultContent.buildSuccess(fileStoreModel.getUrl());
         } else {
             return ResultContent.buildFail(String.format("上传文件失败:%s", fileStoreModelResultContent.getMsg()));