diff --git a/backend/pom.xml b/backend/pom.xml index 4e58121037..fd0fd01717 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -26,6 +26,7 @@ 1.5.3 5.1.0 5.1.0 + 6.2.0.202206071550-r @@ -403,6 +404,12 @@ poi-ooxml ${poi.version} + + + org.eclipse.jgit + org.eclipse.jgit + ${jgit.version} + diff --git a/backend/src/main/java/io/metersphere/api/dto/HashTreeInfoDTO.java b/backend/src/main/java/io/metersphere/api/dto/HashTreeInfoDTO.java new file mode 100644 index 0000000000..f162ba3eab --- /dev/null +++ b/backend/src/main/java/io/metersphere/api/dto/HashTreeInfoDTO.java @@ -0,0 +1,16 @@ +package io.metersphere.api.dto; + +import io.metersphere.base.domain.FileMetadata; +import lombok.Getter; +import lombok.Setter; +import org.apache.jorphan.collections.HashTree; + +import java.util.List; + +@Getter +@Setter +public class HashTreeInfoDTO { + private String jmx; + private HashTree hashTree; + private List repositoryFiles; +} diff --git a/backend/src/main/java/io/metersphere/api/dto/JmxInfoDTO.java b/backend/src/main/java/io/metersphere/api/dto/JmxInfoDTO.java index 79e290396f..07b58aaefc 100644 --- a/backend/src/main/java/io/metersphere/api/dto/JmxInfoDTO.java +++ b/backend/src/main/java/io/metersphere/api/dto/JmxInfoDTO.java @@ -3,10 +3,12 @@ package io.metersphere.api.dto; import io.metersphere.base.domain.FileMetadata; import lombok.Getter; import lombok.Setter; +import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; /** * @author song.tianyang @@ -33,4 +35,14 @@ public class JmxInfoDTO { this.name = StringUtils.replace(name, "/", ""); } + public void addFileMetadataLists(List list) { + if (CollectionUtils.isNotEmpty(list)) { + List fileMetadataIds = fileMetadataList.stream().map(FileMetadata::getId).collect(Collectors.toList()); + list.forEach(item -> { + if (!fileMetadataIds.contains(item.getId())) { + fileMetadataList.add(item); + } + }); + } + } } diff --git a/backend/src/main/java/io/metersphere/api/dto/definition/request/ElementUtil.java b/backend/src/main/java/io/metersphere/api/dto/definition/request/ElementUtil.java index 52692d3235..7942a34311 100644 --- a/backend/src/main/java/io/metersphere/api/dto/definition/request/ElementUtil.java +++ b/backend/src/main/java/io/metersphere/api/dto/definition/request/ElementUtil.java @@ -17,6 +17,7 @@ import io.metersphere.api.dto.scenario.request.BodyFile; import io.metersphere.api.service.ApiTestEnvironmentService; import io.metersphere.base.domain.ApiScenarioWithBLOBs; import io.metersphere.base.domain.ApiTestEnvironmentWithBLOBs; +import io.metersphere.base.domain.FileMetadata; import io.metersphere.base.mapper.ApiScenarioMapper; import io.metersphere.commons.constants.DelimiterConstants; import io.metersphere.commons.constants.LoopConstants; @@ -29,6 +30,7 @@ import io.metersphere.commons.utils.LogUtil; import io.metersphere.constants.RunModeConstants; import io.metersphere.i18n.Translator; import io.metersphere.jmeter.utils.ScriptEngineUtils; +import io.metersphere.metadata.service.FileMetadataService; import io.metersphere.plugin.core.MsParameter; import io.metersphere.plugin.core.MsTestElement; import io.metersphere.service.EnvironmentGroupProjectService; @@ -106,6 +108,7 @@ public class ElementUtil { list = config.getTransferVariables().stream().filter(ScenarioVariable::isCSVValid).filter(ScenarioVariable::isEnable).collect(Collectors.toList()); } if (CollectionUtils.isNotEmpty(list)) { + FileMetadataService fileMetadataService = CommonBeanFactory.getBean(FileMetadataService.class); list.forEach(item -> { CSVDataSet csvDataSet = new CSVDataSet(); csvDataSet.setEnabled(true); @@ -116,15 +119,28 @@ public class ElementUtil { if (CollectionUtils.isEmpty(item.getFiles())) { MSException.throwException(StringUtils.isEmpty(item.getName()) ? "CSVDataSet" : item.getName() + ":[ " + Translator.get("csv_no_exist") + " ]"); } else { + boolean isRef = false; + String fileId = null; + boolean isRepository = false; BodyFile file = item.getFiles().get(0); String path = BODY_FILE_DIR + "/" + item.getFiles().get(0).getId() + "_" + item.getFiles().get(0).getName(); if (StringUtils.equalsIgnoreCase(file.getStorage(), StorageConstants.FILE_REF.name())) { + isRef = true; + fileId = file.getFileId(); + if (fileMetadataService != null) { + FileMetadata fileMetadata = fileMetadataService.getFileMetadataById(fileId); + if (fileMetadata != null && StringUtils.equals(fileMetadata.getStorage(), StorageConstants.GIT.name())) { + isRepository = true; + } + } path = FileUtils.getFilePath(file); } - if (!config.isOperating() && !new File(path).exists()) { + if (!config.isOperating() && !isRepository && !new File(path).exists()) { MSException.throwException(StringUtils.isEmpty(item.getName()) ? "CSVDataSet" : item.getName() + ":[ " + Translator.get("csv_no_exist") + " ]"); } csvDataSet.setProperty("filename", path); + csvDataSet.setProperty("isRef", isRef); + csvDataSet.setProperty("fileId", fileId); } csvDataSet.setIgnoreFirstLine(false); csvDataSet.setProperty("shareMode", shareMode); diff --git a/backend/src/main/java/io/metersphere/api/dto/scenario/Body.java b/backend/src/main/java/io/metersphere/api/dto/scenario/Body.java index 31a64e6825..9486aaa0d6 100644 --- a/backend/src/main/java/io/metersphere/api/dto/scenario/Body.java +++ b/backend/src/main/java/io/metersphere/api/dto/scenario/Body.java @@ -148,9 +148,13 @@ public class Body { KeyValue keyValue, String requestId, boolean isBinary) { if (files != null) { files.forEach(file -> { + boolean isRef = false; + String fileId = null; String paramName = keyValue.getName() == null ? requestId : keyValue.getName(); String path = null; if (StringUtils.equalsIgnoreCase(file.getStorage(), StorageConstants.FILE_REF.name())) { + isRef = true; + fileId = file.getFileId(); path = FileUtils.getFilePath(file); } else if (StringUtils.isNotBlank(file.getId()) && !isBinary) { // 旧数据 @@ -164,7 +168,10 @@ public class Body { if (StringUtils.isBlank(mimetype)) { mimetype = ContentType.APPLICATION_OCTET_STREAM.getMimeType(); } - list.add(new HTTPFileArg(path, isBinary ? "" : paramName, mimetype)); + HTTPFileArg fileArg = new HTTPFileArg(path, isBinary ? "" : paramName, mimetype); + fileArg.setProperty("isRef", isRef); + fileArg.setProperty("fileId", fileId); + list.add(fileArg); }); } } diff --git a/backend/src/main/java/io/metersphere/api/dto/scenario/request/BodyFile.java b/backend/src/main/java/io/metersphere/api/dto/scenario/request/BodyFile.java index e1117a7681..d9ba67968f 100644 --- a/backend/src/main/java/io/metersphere/api/dto/scenario/request/BodyFile.java +++ b/backend/src/main/java/io/metersphere/api/dto/scenario/request/BodyFile.java @@ -8,7 +8,7 @@ import org.apache.commons.lang.StringUtils; public class BodyFile { private String id; private String name; - // LOCAL 和 引用(FILE_REF) + // LOCAL 和 引用(FILE_REF) / GIT private String storage; private String fileId; private String projectId; diff --git a/backend/src/main/java/io/metersphere/api/exec/scenario/ApiScenarioExecuteService.java b/backend/src/main/java/io/metersphere/api/exec/scenario/ApiScenarioExecuteService.java index 481ac0ae10..a1965947aa 100644 --- a/backend/src/main/java/io/metersphere/api/exec/scenario/ApiScenarioExecuteService.java +++ b/backend/src/main/java/io/metersphere/api/exec/scenario/ApiScenarioExecuteService.java @@ -28,7 +28,9 @@ import io.metersphere.commons.constants.APITestStatus; import io.metersphere.commons.constants.ApiRunMode; import io.metersphere.commons.constants.ReportTriggerMode; import io.metersphere.commons.exception.MSException; -import io.metersphere.commons.utils.*; +import io.metersphere.commons.utils.BeanUtils; +import io.metersphere.commons.utils.FileUtils; +import io.metersphere.commons.utils.ServiceUtils; import io.metersphere.constants.RunModeConstants; import io.metersphere.dto.JmeterRunRequestDTO; import io.metersphere.dto.MsExecResponseDTO; diff --git a/backend/src/main/java/io/metersphere/api/exec/scenario/ApiScenarioSerialService.java b/backend/src/main/java/io/metersphere/api/exec/scenario/ApiScenarioSerialService.java index 26c97c7cf6..230adb2e7a 100644 --- a/backend/src/main/java/io/metersphere/api/exec/scenario/ApiScenarioSerialService.java +++ b/backend/src/main/java/io/metersphere/api/exec/scenario/ApiScenarioSerialService.java @@ -7,7 +7,10 @@ import io.metersphere.api.exec.utils.RequestParamsUtil; import io.metersphere.api.jmeter.JMeterService; import io.metersphere.api.jmeter.utils.SmoothWeighted; import io.metersphere.api.service.ApiTestEnvironmentService; -import io.metersphere.base.domain.*; +import io.metersphere.base.domain.ApiExecutionQueueDetail; +import io.metersphere.base.domain.ApiScenarioReport; +import io.metersphere.base.domain.ApiScenarioWithBLOBs; +import io.metersphere.base.domain.TestPlanApiScenario; import io.metersphere.base.mapper.ApiScenarioMapper; import io.metersphere.base.mapper.ApiScenarioReportMapper; import io.metersphere.base.mapper.TestPlanApiScenarioMapper; diff --git a/backend/src/main/java/io/metersphere/api/jmeter/JMeterService.java b/backend/src/main/java/io/metersphere/api/jmeter/JMeterService.java index d9cabd07d8..e3aee3e927 100644 --- a/backend/src/main/java/io/metersphere/api/jmeter/JMeterService.java +++ b/backend/src/main/java/io/metersphere/api/jmeter/JMeterService.java @@ -8,6 +8,7 @@ import io.metersphere.api.jmeter.utils.SmoothWeighted; import io.metersphere.api.service.RemakeReportService; import io.metersphere.commons.constants.ApiRunMode; import io.metersphere.commons.utils.CommonBeanFactory; +import io.metersphere.commons.utils.HashTreeUtil; import io.metersphere.config.JmeterProperties; import io.metersphere.config.KafkaConfig; import io.metersphere.constants.BackendListenerConstants; @@ -189,6 +190,8 @@ public class JMeterService { if (request.getPool().isPool() && StringUtils.isNotBlank(request.getRunMode()) && !request.getRunMode().startsWith("UI")) { this.runNode(request); } else { + //解析hashTree,是否含有文件库文件 + HashTreeUtil.initRepositoryFiles(request); CommonBeanFactory.getBean(ExecThreadPoolExecutor.class).addTask(request); } } diff --git a/backend/src/main/java/io/metersphere/api/jmeter/MsApiBackendListener.java b/backend/src/main/java/io/metersphere/api/jmeter/MsApiBackendListener.java index 127126c241..d52d5f2a84 100644 --- a/backend/src/main/java/io/metersphere/api/jmeter/MsApiBackendListener.java +++ b/backend/src/main/java/io/metersphere/api/jmeter/MsApiBackendListener.java @@ -7,6 +7,7 @@ import io.metersphere.api.service.ApiExecutionQueueService; import io.metersphere.api.service.TestResultService; import io.metersphere.cache.JMeterEngineCache; import io.metersphere.commons.utils.CommonBeanFactory; +import io.metersphere.commons.utils.FileUtils; import io.metersphere.constants.BackendListenerConstants; import io.metersphere.constants.RunModeConstants; import io.metersphere.dto.ResultDTO; @@ -82,6 +83,7 @@ public class MsApiBackendListener extends AbstractBackendListenerClient implemen } catch (Exception e) { LoggerUtil.error("结果集处理异常", dto.getReportId(), e); } finally { + FileUtils.deleteBodyFiles(dto.getReportId()); if (FileServer.getFileServer() != null) { LoggerUtil.info("进入监听,开始关闭CSV", dto.getReportId()); FileServer.getFileServer().closeCsv(dto.getReportId()); diff --git a/backend/src/main/java/io/metersphere/api/jmeter/MsDebugListener.java b/backend/src/main/java/io/metersphere/api/jmeter/MsDebugListener.java index 8e5188c93a..e5aa2975c4 100644 --- a/backend/src/main/java/io/metersphere/api/jmeter/MsDebugListener.java +++ b/backend/src/main/java/io/metersphere/api/jmeter/MsDebugListener.java @@ -23,7 +23,9 @@ import io.metersphere.api.dto.RequestResultExpandDTO; import io.metersphere.api.dto.RunningParamKeys; import io.metersphere.api.exec.queue.PoolExecBlockingQueueUtil; import io.metersphere.api.exec.utils.ResultParseUtil; -import io.metersphere.commons.utils.*; +import io.metersphere.commons.utils.FileUtils; +import io.metersphere.commons.utils.LogUtil; +import io.metersphere.commons.utils.ResponseUtil; import io.metersphere.dto.RequestResult; import io.metersphere.jmeter.JMeterBase; import io.metersphere.utils.JMeterVars; @@ -108,6 +110,7 @@ public class MsDebugListener extends AbstractListenerElement implements SampleLi WebSocketUtils.sendMessageSingle(dto); WebSocketUtils.onClose(this.getName()); PoolExecBlockingQueueUtil.offer(this.getName()); + FileUtils.deleteBodyFiles(this.getName()); } @Override diff --git a/backend/src/main/java/io/metersphere/api/service/ApiAutomationService.java b/backend/src/main/java/io/metersphere/api/service/ApiAutomationService.java index 096b8f51e4..b706cf19bd 100644 --- a/backend/src/main/java/io/metersphere/api/service/ApiAutomationService.java +++ b/backend/src/main/java/io/metersphere/api/service/ApiAutomationService.java @@ -890,8 +890,10 @@ public class ApiAutomationService { } - private String generateJmx(ApiScenarioWithBLOBs apiScenario) { + private HashTreeInfoDTO generateJmx(ApiScenarioWithBLOBs apiScenario) { + String jmx = null; HashTree jmeterHashTree = new ListedHashTree(); + List repositoryMetadata = new ArrayList<>(); MsTestPlan testPlan = new MsTestPlan(); // 获取自定义JAR String projectId = apiScenario.getProjectId(); @@ -931,7 +933,8 @@ public class ApiAutomationService { if (isUseElement) { scenario.toHashTree(jmeterHashTree, scenario.getHashTree(), config); ElementUtil.accuracyHashTree(jmeterHashTree); - return scenario.getJmx(jmeterHashTree); + repositoryMetadata = FileUtils.getRepositoryFileMetadata(jmeterHashTree); + jmx = scenario.getJmx(jmeterHashTree); } else { MsThreadGroup group = new MsThreadGroup(); group.setLabel(apiScenario.getName()); @@ -942,13 +945,22 @@ public class ApiAutomationService { this.add(scenario); }}); testPlan.getHashTree().add(group); + testPlan.toHashTree(jmeterHashTree, testPlan.getHashTree(), config); + repositoryMetadata = FileUtils.getRepositoryFileMetadata(jmeterHashTree); + jmx = testPlan.getJmx(jmeterHashTree); } - testPlan.toHashTree(jmeterHashTree, testPlan.getHashTree(), config); + } catch (Exception ex) { LogUtil.error(ex); MSException.throwException(ex.getMessage()); } - return testPlan.getJmx(jmeterHashTree); + + + HashTreeInfoDTO returnDTO = new HashTreeInfoDTO(); + returnDTO.setJmx(jmx); + returnDTO.setHashTree(jmeterHashTree); + returnDTO.setRepositoryFiles(repositoryMetadata); + return returnDTO; } @@ -1143,7 +1155,11 @@ public class ApiAutomationService { MsTestPlan testPlan = new MsTestPlan(); testPlan.setHashTree(new LinkedList<>()); ApiScenarioDTO scenario = apiScenarios.get(0); - JmxInfoDTO jmxInfo = apiTestService.updateJmxString(generateJmx(scenario), scenario.getProjectId(), true); + + HashTreeInfoDTO hashTreeInfoDTO = generateJmx(scenario); + JmxInfoDTO jmxInfo = apiTestService.updateJmxString(hashTreeInfoDTO.getJmx(), scenario.getProjectId(), true); + jmxInfo.addFileMetadataLists(hashTreeInfoDTO.getRepositoryFiles()); + String name = request.getName() + ".jmx"; jmxInfo.setName(name); jmxInfo.setId(id); @@ -1677,10 +1693,11 @@ public class ApiAutomationService { apiScenarioWithBLOBs.forEach(item -> { if (StringUtils.isNotEmpty(item.getScenarioDefinition())) { - String jmx = generateJmx(item); - if (StringUtils.isNotEmpty(jmx)) { - ApiScenarioExportJmxDTO scenariosExportJmx = new ApiScenarioExportJmxDTO(item.getName(), apiTestService.updateJmxString(jmx, item.getProjectId(), false).getXml()); - JmxInfoDTO dto = apiTestService.updateJmxString(jmx, item.getProjectId(), true); + HashTreeInfoDTO hashTreeInfoDTO = generateJmx(item); + if (StringUtils.isNotEmpty(hashTreeInfoDTO.getJmx())) { + ApiScenarioExportJmxDTO scenariosExportJmx = new ApiScenarioExportJmxDTO(item.getName(), apiTestService.updateJmxString(hashTreeInfoDTO.getJmx(), item.getProjectId(), false).getXml()); + JmxInfoDTO dto = apiTestService.updateJmxString(hashTreeInfoDTO.getJmx(), item.getProjectId(), true); + dto.addFileMetadataLists(hashTreeInfoDTO.getRepositoryFiles()); scenariosExportJmx.setId(item.getId()); scenariosExportJmx.setVersion(item.getVersion()); //扫描需要哪些文件 @@ -1713,9 +1730,9 @@ public class ApiAutomationService { Map files = new LinkedHashMap<>(); scenarios.forEach(item -> { if (StringUtils.isNotEmpty(item.getScenarioDefinition())) { - String jmx = generateJmx(item); - if (StringUtils.isNotEmpty(jmx)) { - ApiScenarioExportJmxDTO scenariosExportJmx = new ApiScenarioExportJmxDTO(item.getName(), apiTestService.updateJmxString(jmx, item.getProjectId(), false).getXml()); + HashTreeInfoDTO hashTreeInfoDTO = generateJmx(item); + if (StringUtils.isNotEmpty(hashTreeInfoDTO.getJmx())) { + ApiScenarioExportJmxDTO scenariosExportJmx = new ApiScenarioExportJmxDTO(item.getName(), apiTestService.updateJmxString(hashTreeInfoDTO.getJmx(), item.getProjectId(), false).getXml()); String fileName = item.getName() + ".jmx"; String jmxStr = scenariosExportJmx.getJmx(); files.put(fileName, jmxStr.getBytes(StandardCharsets.UTF_8)); @@ -2032,7 +2049,9 @@ public class ApiAutomationService { apiScenarioList.forEach(item -> { MsTestPlan testPlan = new MsTestPlan(); testPlan.setHashTree(new LinkedList<>()); - JmxInfoDTO dto = apiTestService.updateJmxString(generateJmx(item), item.getProjectId(), true); + HashTreeInfoDTO hashTreeInfoDTO = generateJmx(item); + JmxInfoDTO dto = apiTestService.updateJmxString(hashTreeInfoDTO.getJmx(), item.getProjectId(), true); + dto.setFileMetadataList(hashTreeInfoDTO.getRepositoryFiles()); String name = item.getName() + ".jmx"; dto.setId(item.getId()); dto.setName(name); diff --git a/backend/src/main/java/io/metersphere/api/service/ApiJMeterFileService.java b/backend/src/main/java/io/metersphere/api/service/ApiJMeterFileService.java index 9d66f9e961..fa1c078a48 100644 --- a/backend/src/main/java/io/metersphere/api/service/ApiJMeterFileService.java +++ b/backend/src/main/java/io/metersphere/api/service/ApiJMeterFileService.java @@ -11,11 +11,13 @@ import io.metersphere.base.mapper.ApiExecutionQueueDetailMapper; import io.metersphere.base.mapper.ApiScenarioMapper; import io.metersphere.base.mapper.TestPlanApiScenarioMapper; import io.metersphere.commons.constants.ApiRunMode; +import io.metersphere.commons.constants.StorageConstants; import io.metersphere.commons.utils.CommonBeanFactory; import io.metersphere.commons.utils.FileUtils; import io.metersphere.commons.utils.LogUtil; import io.metersphere.dto.JmeterRunRequestDTO; import io.metersphere.metadata.service.FileMetadataService; +import io.metersphere.metadata.vo.repository.FileInfoDTO; import io.metersphere.service.EnvironmentGroupProjectService; import io.metersphere.service.PluginService; import io.metersphere.utils.LoggerUtil; @@ -46,6 +48,8 @@ public class ApiJMeterFileService { private ApiExecutionQueueDetailMapper executionQueueDetailMapper; @Resource private EnvironmentGroupProjectService environmentGroupProjectService; + @Resource + private FileMetadataService fileMetadataService; // 接口测试 用例/接口 private static final List CASE_MODES = new ArrayList<>() {{ this.add(ApiRunMode.DEFINITION.name()); @@ -211,21 +215,34 @@ public class ApiJMeterFileService { return jarFiles; } - private Map getMultipartFiles(HashTree hashTree) { + private Map getMultipartFiles(String reportId, HashTree hashTree) { Map multipartFiles = new LinkedHashMap<>(); // 获取附件 List files = new LinkedList<>(); - FileUtils.getFiles(hashTree, files); + FileUtils.getExecuteFiles(hashTree, reportId, files); if (CollectionUtils.isNotEmpty(files)) { + Map repositoryFileMap = new HashMap<>(); for (BodyFile bodyFile : files) { - File file = new File(bodyFile.getName()); - if (file != null && file.exists()) { - byte[] fileByte = FileUtils.fileToByte(file); - if (fileByte != null) { - multipartFiles.put(file.getAbsolutePath(), fileByte); + if (StringUtils.equals(bodyFile.getStorage(), StorageConstants.GIT.name()) + && StringUtils.isNotBlank(bodyFile.getFileId())) { + repositoryFileMap.put(bodyFile.getFileId(), bodyFile.getName()); + } else { + File file = new File(bodyFile.getName()); + if (file != null && file.exists()) { + byte[] fileByte = FileUtils.fileToByte(file); + if (fileByte != null) { + multipartFiles.put(file.getAbsolutePath(), fileByte); + } } } } + List fileInfoDTOList = fileMetadataService.downloadFileByIds(repositoryFileMap.keySet()); + fileInfoDTOList.forEach(repositoryFile -> { + if (repositoryFile.getFileByte() != null) { + multipartFiles.put(FileUtils.BODY_FILE_DIR + File.separator + repositoryFileMap.get(repositoryFile.getId()), repositoryFile.getFileByte()); + } + }); + } return multipartFiles; } @@ -242,6 +259,10 @@ public class ApiJMeterFileService { private byte[] zipFilesToByteArray(String testId, HashTree hashTree) { String bodyFilePath = FileUtils.BODY_FILE_DIR; String fileName = testId + ".jmx"; + + // 获取JMX使用到的附件 + Map multipartFiles = this.getMultipartFiles(testId, hashTree); + String jmx = new MsTestPlan().getJmx(hashTree); // 处理dubbo请求生成jmx文件 if (StringUtils.isNotEmpty(jmx)) { @@ -250,8 +271,7 @@ public class ApiJMeterFileService { Map files = new HashMap<>(); // 每个测试生成一个文件夹 files.put(fileName, jmx.getBytes(StandardCharsets.UTF_8)); - // 获取JMX使用到的附件 - Map multipartFiles = this.getMultipartFiles(hashTree); + if (multipartFiles != null && !multipartFiles.isEmpty()) { for (String k : multipartFiles.keySet()) { byte[] v = multipartFiles.get(k); diff --git a/backend/src/main/java/io/metersphere/base/domain/FileMetadata.java b/backend/src/main/java/io/metersphere/base/domain/FileMetadata.java index c05147b33b..62798d2823 100644 --- a/backend/src/main/java/io/metersphere/base/domain/FileMetadata.java +++ b/backend/src/main/java/io/metersphere/base/domain/FileMetadata.java @@ -35,7 +35,9 @@ public class FileMetadata implements Serializable { private String resourceType; - private String description; + private Boolean latest; + + private String refId; private static final long serialVersionUID = 1L; } \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/domain/FileMetadataExample.java b/backend/src/main/java/io/metersphere/base/domain/FileMetadataExample.java index 4296856f07..925d18a8cf 100644 --- a/backend/src/main/java/io/metersphere/base/domain/FileMetadataExample.java +++ b/backend/src/main/java/io/metersphere/base/domain/FileMetadataExample.java @@ -1113,6 +1113,136 @@ public class FileMetadataExample { addCriterion("resource_type not between", value1, value2, "resourceType"); return (Criteria) this; } + + public Criteria andLatestIsNull() { + addCriterion("latest is null"); + return (Criteria) this; + } + + public Criteria andLatestIsNotNull() { + addCriterion("latest is not null"); + return (Criteria) this; + } + + public Criteria andLatestEqualTo(Boolean value) { + addCriterion("latest =", value, "latest"); + return (Criteria) this; + } + + public Criteria andLatestNotEqualTo(Boolean value) { + addCriterion("latest <>", value, "latest"); + return (Criteria) this; + } + + public Criteria andLatestGreaterThan(Boolean value) { + addCriterion("latest >", value, "latest"); + return (Criteria) this; + } + + public Criteria andLatestGreaterThanOrEqualTo(Boolean value) { + addCriterion("latest >=", value, "latest"); + return (Criteria) this; + } + + public Criteria andLatestLessThan(Boolean value) { + addCriterion("latest <", value, "latest"); + return (Criteria) this; + } + + public Criteria andLatestLessThanOrEqualTo(Boolean value) { + addCriterion("latest <=", value, "latest"); + return (Criteria) this; + } + + public Criteria andLatestIn(List values) { + addCriterion("latest in", values, "latest"); + return (Criteria) this; + } + + public Criteria andLatestNotIn(List values) { + addCriterion("latest not in", values, "latest"); + return (Criteria) this; + } + + public Criteria andLatestBetween(Boolean value1, Boolean value2) { + addCriterion("latest between", value1, value2, "latest"); + return (Criteria) this; + } + + public Criteria andLatestNotBetween(Boolean value1, Boolean value2) { + addCriterion("latest not between", value1, value2, "latest"); + return (Criteria) this; + } + + public Criteria andRefIdIsNull() { + addCriterion("ref_id is null"); + return (Criteria) this; + } + + public Criteria andRefIdIsNotNull() { + addCriterion("ref_id is not null"); + return (Criteria) this; + } + + public Criteria andRefIdEqualTo(String value) { + addCriterion("ref_id =", value, "refId"); + return (Criteria) this; + } + + public Criteria andRefIdNotEqualTo(String value) { + addCriterion("ref_id <>", value, "refId"); + return (Criteria) this; + } + + public Criteria andRefIdGreaterThan(String value) { + addCriterion("ref_id >", value, "refId"); + return (Criteria) this; + } + + public Criteria andRefIdGreaterThanOrEqualTo(String value) { + addCriterion("ref_id >=", value, "refId"); + return (Criteria) this; + } + + public Criteria andRefIdLessThan(String value) { + addCriterion("ref_id <", value, "refId"); + return (Criteria) this; + } + + public Criteria andRefIdLessThanOrEqualTo(String value) { + addCriterion("ref_id <=", value, "refId"); + return (Criteria) this; + } + + public Criteria andRefIdLike(String value) { + addCriterion("ref_id like", value, "refId"); + return (Criteria) this; + } + + public Criteria andRefIdNotLike(String value) { + addCriterion("ref_id not like", value, "refId"); + return (Criteria) this; + } + + public Criteria andRefIdIn(List values) { + addCriterion("ref_id in", values, "refId"); + return (Criteria) this; + } + + public Criteria andRefIdNotIn(List values) { + addCriterion("ref_id not in", values, "refId"); + return (Criteria) this; + } + + public Criteria andRefIdBetween(String value1, String value2) { + addCriterion("ref_id between", value1, value2, "refId"); + return (Criteria) this; + } + + public Criteria andRefIdNotBetween(String value1, String value2) { + addCriterion("ref_id not between", value1, value2, "refId"); + return (Criteria) this; + } } public static class Criteria extends GeneratedCriteria { diff --git a/backend/src/main/java/io/metersphere/base/domain/FileMetadataWithBLOBs.java b/backend/src/main/java/io/metersphere/base/domain/FileMetadataWithBLOBs.java new file mode 100644 index 0000000000..c21ba876d7 --- /dev/null +++ b/backend/src/main/java/io/metersphere/base/domain/FileMetadataWithBLOBs.java @@ -0,0 +1,17 @@ +package io.metersphere.base.domain; + +import java.io.Serializable; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class FileMetadataWithBLOBs extends FileMetadata implements Serializable { + private String description; + + private String attachInfo; + + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/domain/FileModule.java b/backend/src/main/java/io/metersphere/base/domain/FileModule.java index 3b49f7d0f0..3b6d5f12da 100644 --- a/backend/src/main/java/io/metersphere/base/domain/FileModule.java +++ b/backend/src/main/java/io/metersphere/base/domain/FileModule.java @@ -23,5 +23,15 @@ public class FileModule implements Serializable { private String createUser; + private String moduleType; + + private String repositoryPath; + + private String repositoryToken; + + private String repositoryUserName; + + private String repositoryDesc; + private static final long serialVersionUID = 1L; } \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/domain/FileModuleExample.java b/backend/src/main/java/io/metersphere/base/domain/FileModuleExample.java index 0b04f3b988..428def6710 100644 --- a/backend/src/main/java/io/metersphere/base/domain/FileModuleExample.java +++ b/backend/src/main/java/io/metersphere/base/domain/FileModuleExample.java @@ -693,6 +693,286 @@ public class FileModuleExample { addCriterion("create_user not between", value1, value2, "createUser"); return (Criteria) this; } + + public Criteria andModuleTypeIsNull() { + addCriterion("module_type is null"); + return (Criteria) this; + } + + public Criteria andModuleTypeIsNotNull() { + addCriterion("module_type is not null"); + return (Criteria) this; + } + + public Criteria andModuleTypeEqualTo(String value) { + addCriterion("module_type =", value, "moduleType"); + return (Criteria) this; + } + + public Criteria andModuleTypeNotEqualTo(String value) { + addCriterion("module_type <>", value, "moduleType"); + return (Criteria) this; + } + + public Criteria andModuleTypeGreaterThan(String value) { + addCriterion("module_type >", value, "moduleType"); + return (Criteria) this; + } + + public Criteria andModuleTypeGreaterThanOrEqualTo(String value) { + addCriterion("module_type >=", value, "moduleType"); + return (Criteria) this; + } + + public Criteria andModuleTypeLessThan(String value) { + addCriterion("module_type <", value, "moduleType"); + return (Criteria) this; + } + + public Criteria andModuleTypeLessThanOrEqualTo(String value) { + addCriterion("module_type <=", value, "moduleType"); + return (Criteria) this; + } + + public Criteria andModuleTypeLike(String value) { + addCriterion("module_type like", value, "moduleType"); + return (Criteria) this; + } + + public Criteria andModuleTypeNotLike(String value) { + addCriterion("module_type not like", value, "moduleType"); + return (Criteria) this; + } + + public Criteria andModuleTypeIn(List values) { + addCriterion("module_type in", values, "moduleType"); + return (Criteria) this; + } + + public Criteria andModuleTypeNotIn(List values) { + addCriterion("module_type not in", values, "moduleType"); + return (Criteria) this; + } + + public Criteria andModuleTypeBetween(String value1, String value2) { + addCriterion("module_type between", value1, value2, "moduleType"); + return (Criteria) this; + } + + public Criteria andModuleTypeNotBetween(String value1, String value2) { + addCriterion("module_type not between", value1, value2, "moduleType"); + return (Criteria) this; + } + + public Criteria andRepositoryPathIsNull() { + addCriterion("repository_path is null"); + return (Criteria) this; + } + + public Criteria andRepositoryPathIsNotNull() { + addCriterion("repository_path is not null"); + return (Criteria) this; + } + + public Criteria andRepositoryPathEqualTo(String value) { + addCriterion("repository_path =", value, "repositoryPath"); + return (Criteria) this; + } + + public Criteria andRepositoryPathNotEqualTo(String value) { + addCriterion("repository_path <>", value, "repositoryPath"); + return (Criteria) this; + } + + public Criteria andRepositoryPathGreaterThan(String value) { + addCriterion("repository_path >", value, "repositoryPath"); + return (Criteria) this; + } + + public Criteria andRepositoryPathGreaterThanOrEqualTo(String value) { + addCriterion("repository_path >=", value, "repositoryPath"); + return (Criteria) this; + } + + public Criteria andRepositoryPathLessThan(String value) { + addCriterion("repository_path <", value, "repositoryPath"); + return (Criteria) this; + } + + public Criteria andRepositoryPathLessThanOrEqualTo(String value) { + addCriterion("repository_path <=", value, "repositoryPath"); + return (Criteria) this; + } + + public Criteria andRepositoryPathLike(String value) { + addCriterion("repository_path like", value, "repositoryPath"); + return (Criteria) this; + } + + public Criteria andRepositoryPathNotLike(String value) { + addCriterion("repository_path not like", value, "repositoryPath"); + return (Criteria) this; + } + + public Criteria andRepositoryPathIn(List values) { + addCriterion("repository_path in", values, "repositoryPath"); + return (Criteria) this; + } + + public Criteria andRepositoryPathNotIn(List values) { + addCriterion("repository_path not in", values, "repositoryPath"); + return (Criteria) this; + } + + public Criteria andRepositoryPathBetween(String value1, String value2) { + addCriterion("repository_path between", value1, value2, "repositoryPath"); + return (Criteria) this; + } + + public Criteria andRepositoryPathNotBetween(String value1, String value2) { + addCriterion("repository_path not between", value1, value2, "repositoryPath"); + return (Criteria) this; + } + + public Criteria andRepositoryTokenIsNull() { + addCriterion("repository_token is null"); + return (Criteria) this; + } + + public Criteria andRepositoryTokenIsNotNull() { + addCriterion("repository_token is not null"); + return (Criteria) this; + } + + public Criteria andRepositoryTokenEqualTo(String value) { + addCriterion("repository_token =", value, "repositoryToken"); + return (Criteria) this; + } + + public Criteria andRepositoryTokenNotEqualTo(String value) { + addCriterion("repository_token <>", value, "repositoryToken"); + return (Criteria) this; + } + + public Criteria andRepositoryTokenGreaterThan(String value) { + addCriterion("repository_token >", value, "repositoryToken"); + return (Criteria) this; + } + + public Criteria andRepositoryTokenGreaterThanOrEqualTo(String value) { + addCriterion("repository_token >=", value, "repositoryToken"); + return (Criteria) this; + } + + public Criteria andRepositoryTokenLessThan(String value) { + addCriterion("repository_token <", value, "repositoryToken"); + return (Criteria) this; + } + + public Criteria andRepositoryTokenLessThanOrEqualTo(String value) { + addCriterion("repository_token <=", value, "repositoryToken"); + return (Criteria) this; + } + + public Criteria andRepositoryTokenLike(String value) { + addCriterion("repository_token like", value, "repositoryToken"); + return (Criteria) this; + } + + public Criteria andRepositoryTokenNotLike(String value) { + addCriterion("repository_token not like", value, "repositoryToken"); + return (Criteria) this; + } + + public Criteria andRepositoryTokenIn(List values) { + addCriterion("repository_token in", values, "repositoryToken"); + return (Criteria) this; + } + + public Criteria andRepositoryTokenNotIn(List values) { + addCriterion("repository_token not in", values, "repositoryToken"); + return (Criteria) this; + } + + public Criteria andRepositoryTokenBetween(String value1, String value2) { + addCriterion("repository_token between", value1, value2, "repositoryToken"); + return (Criteria) this; + } + + public Criteria andRepositoryTokenNotBetween(String value1, String value2) { + addCriterion("repository_token not between", value1, value2, "repositoryToken"); + return (Criteria) this; + } + + public Criteria andRepositoryUserNameIsNull() { + addCriterion("repository_user_name is null"); + return (Criteria) this; + } + + public Criteria andRepositoryUserNameIsNotNull() { + addCriterion("repository_user_name is not null"); + return (Criteria) this; + } + + public Criteria andRepositoryUserNameEqualTo(String value) { + addCriterion("repository_user_name =", value, "repositoryUserName"); + return (Criteria) this; + } + + public Criteria andRepositoryUserNameNotEqualTo(String value) { + addCriterion("repository_user_name <>", value, "repositoryUserName"); + return (Criteria) this; + } + + public Criteria andRepositoryUserNameGreaterThan(String value) { + addCriterion("repository_user_name >", value, "repositoryUserName"); + return (Criteria) this; + } + + public Criteria andRepositoryUserNameGreaterThanOrEqualTo(String value) { + addCriterion("repository_user_name >=", value, "repositoryUserName"); + return (Criteria) this; + } + + public Criteria andRepositoryUserNameLessThan(String value) { + addCriterion("repository_user_name <", value, "repositoryUserName"); + return (Criteria) this; + } + + public Criteria andRepositoryUserNameLessThanOrEqualTo(String value) { + addCriterion("repository_user_name <=", value, "repositoryUserName"); + return (Criteria) this; + } + + public Criteria andRepositoryUserNameLike(String value) { + addCriterion("repository_user_name like", value, "repositoryUserName"); + return (Criteria) this; + } + + public Criteria andRepositoryUserNameNotLike(String value) { + addCriterion("repository_user_name not like", value, "repositoryUserName"); + return (Criteria) this; + } + + public Criteria andRepositoryUserNameIn(List values) { + addCriterion("repository_user_name in", values, "repositoryUserName"); + return (Criteria) this; + } + + public Criteria andRepositoryUserNameNotIn(List values) { + addCriterion("repository_user_name not in", values, "repositoryUserName"); + return (Criteria) this; + } + + public Criteria andRepositoryUserNameBetween(String value1, String value2) { + addCriterion("repository_user_name between", value1, value2, "repositoryUserName"); + return (Criteria) this; + } + + public Criteria andRepositoryUserNameNotBetween(String value1, String value2) { + addCriterion("repository_user_name not between", value1, value2, "repositoryUserName"); + return (Criteria) this; + } } public static class Criteria extends GeneratedCriteria { diff --git a/backend/src/main/java/io/metersphere/base/mapper/FileMetadataMapper.java b/backend/src/main/java/io/metersphere/base/mapper/FileMetadataMapper.java index 856da85602..58caabc7e8 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/FileMetadataMapper.java +++ b/backend/src/main/java/io/metersphere/base/mapper/FileMetadataMapper.java @@ -2,6 +2,7 @@ package io.metersphere.base.mapper; import io.metersphere.base.domain.FileMetadata; import io.metersphere.base.domain.FileMetadataExample; +import io.metersphere.base.domain.FileMetadataWithBLOBs; import java.util.List; import org.apache.ibatis.annotations.Param; @@ -12,25 +13,25 @@ public interface FileMetadataMapper { int deleteByPrimaryKey(String id); - int insert(FileMetadata record); + int insert(FileMetadataWithBLOBs record); - int insertSelective(FileMetadata record); + int insertSelective(FileMetadataWithBLOBs record); - List selectByExampleWithBLOBs(FileMetadataExample example); + List selectByExampleWithBLOBs(FileMetadataExample example); List selectByExample(FileMetadataExample example); - FileMetadata selectByPrimaryKey(String id); + FileMetadataWithBLOBs selectByPrimaryKey(String id); - int updateByExampleSelective(@Param("record") FileMetadata record, @Param("example") FileMetadataExample example); + int updateByExampleSelective(@Param("record") FileMetadataWithBLOBs record, @Param("example") FileMetadataExample example); - int updateByExampleWithBLOBs(@Param("record") FileMetadata record, @Param("example") FileMetadataExample example); + int updateByExampleWithBLOBs(@Param("record") FileMetadataWithBLOBs record, @Param("example") FileMetadataExample example); int updateByExample(@Param("record") FileMetadata record, @Param("example") FileMetadataExample example); - int updateByPrimaryKeySelective(FileMetadata record); + int updateByPrimaryKeySelective(FileMetadataWithBLOBs record); - int updateByPrimaryKeyWithBLOBs(FileMetadata record); + int updateByPrimaryKeyWithBLOBs(FileMetadataWithBLOBs record); int updateByPrimaryKey(FileMetadata record); } \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/FileMetadataMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/FileMetadataMapper.xml index 411fc898bf..c34853eaa8 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/FileMetadataMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/FileMetadataMapper.xml @@ -17,9 +17,12 @@ + + - + + @@ -81,10 +84,10 @@ id, `name`, `type`, `size`, create_time, update_time, project_id, `storage`, create_user, - update_user, tags, module_id, load_jar, `path`, resource_type + update_user, tags, module_id, load_jar, `path`, resource_type, latest, ref_id - description + description, attach_info @@ -305,9 +328,18 @@ resource_type = #{record.resourceType,jdbcType=VARCHAR}, + + latest = #{record.latest,jdbcType=BIT}, + + + ref_id = #{record.refId,jdbcType=VARCHAR}, + description = #{record.description,jdbcType=LONGVARCHAR}, + + attach_info = #{record.attachInfo,jdbcType=LONGVARCHAR}, + @@ -330,7 +362,10 @@ load_jar = #{record.loadJar,jdbcType=BIT}, `path` = #{record.path,jdbcType=VARCHAR}, resource_type = #{record.resourceType,jdbcType=VARCHAR}, - description = #{record.description,jdbcType=LONGVARCHAR} + latest = #{record.latest,jdbcType=BIT}, + ref_id = #{record.refId,jdbcType=VARCHAR}, + description = #{record.description,jdbcType=LONGVARCHAR}, + attach_info = #{record.attachInfo,jdbcType=LONGVARCHAR} @@ -351,12 +386,14 @@ module_id = #{record.moduleId,jdbcType=VARCHAR}, load_jar = #{record.loadJar,jdbcType=BIT}, `path` = #{record.path,jdbcType=VARCHAR}, - resource_type = #{record.resourceType,jdbcType=VARCHAR} + resource_type = #{record.resourceType,jdbcType=VARCHAR}, + latest = #{record.latest,jdbcType=BIT}, + ref_id = #{record.refId,jdbcType=VARCHAR} - + update file_metadata @@ -401,13 +438,22 @@ resource_type = #{resourceType,jdbcType=VARCHAR}, + + latest = #{latest,jdbcType=BIT}, + + + ref_id = #{refId,jdbcType=VARCHAR}, + description = #{description,jdbcType=LONGVARCHAR}, + + attach_info = #{attachInfo,jdbcType=LONGVARCHAR}, + where id = #{id,jdbcType=VARCHAR} - + update file_metadata set `name` = #{name,jdbcType=VARCHAR}, `type` = #{type,jdbcType=VARCHAR}, @@ -423,7 +469,10 @@ load_jar = #{loadJar,jdbcType=BIT}, `path` = #{path,jdbcType=VARCHAR}, resource_type = #{resourceType,jdbcType=VARCHAR}, - description = #{description,jdbcType=LONGVARCHAR} + latest = #{latest,jdbcType=BIT}, + ref_id = #{refId,jdbcType=VARCHAR}, + description = #{description,jdbcType=LONGVARCHAR}, + attach_info = #{attachInfo,jdbcType=LONGVARCHAR} where id = #{id,jdbcType=VARCHAR} @@ -441,7 +490,9 @@ module_id = #{moduleId,jdbcType=VARCHAR}, load_jar = #{loadJar,jdbcType=BIT}, `path` = #{path,jdbcType=VARCHAR}, - resource_type = #{resourceType,jdbcType=VARCHAR} + resource_type = #{resourceType,jdbcType=VARCHAR}, + latest = #{latest,jdbcType=BIT}, + ref_id = #{refId,jdbcType=VARCHAR} where id = #{id,jdbcType=VARCHAR} \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/FileModuleMapper.java b/backend/src/main/java/io/metersphere/base/mapper/FileModuleMapper.java index a6818f5210..87f48d8571 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/FileModuleMapper.java +++ b/backend/src/main/java/io/metersphere/base/mapper/FileModuleMapper.java @@ -16,15 +16,21 @@ public interface FileModuleMapper { int insertSelective(FileModule record); + List selectByExampleWithBLOBs(FileModuleExample example); + List selectByExample(FileModuleExample example); FileModule selectByPrimaryKey(String id); int updateByExampleSelective(@Param("record") FileModule record, @Param("example") FileModuleExample example); + int updateByExampleWithBLOBs(@Param("record") FileModule record, @Param("example") FileModuleExample example); + int updateByExample(@Param("record") FileModule record, @Param("example") FileModuleExample example); int updateByPrimaryKeySelective(FileModule record); + int updateByPrimaryKeyWithBLOBs(FileModule record); + int updateByPrimaryKey(FileModule record); } \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/FileModuleMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/FileModuleMapper.xml index 808a035e74..7f0488fc94 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/FileModuleMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/FileModuleMapper.xml @@ -11,6 +11,13 @@ + + + + + + + @@ -71,8 +78,28 @@ - id, project_id, `name`, parent_id, `level`, create_time, update_time, pos, create_user + id, project_id, `name`, parent_id, `level`, create_time, update_time, pos, create_user, + module_type, repository_path, repository_token, repository_user_name + + repository_desc + + - select + , + from file_module where id = #{id,jdbcType=VARCHAR} @@ -106,12 +135,14 @@ insert into file_module (id, project_id, `name`, parent_id, `level`, create_time, - update_time, pos, create_user - ) + update_time, pos, create_user, + module_type, repository_path, repository_token, + repository_user_name, repository_desc) values (#{id,jdbcType=VARCHAR}, #{projectId,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR}, #{parentId,jdbcType=VARCHAR}, #{level,jdbcType=INTEGER}, #{createTime,jdbcType=BIGINT}, - #{updateTime,jdbcType=BIGINT}, #{pos,jdbcType=DOUBLE}, #{createUser,jdbcType=VARCHAR} - ) + #{updateTime,jdbcType=BIGINT}, #{pos,jdbcType=DOUBLE}, #{createUser,jdbcType=VARCHAR}, + #{moduleType,jdbcType=VARCHAR}, #{repositoryPath,jdbcType=VARCHAR}, #{repositoryToken,jdbcType=VARCHAR}, + #{repositoryUserName,jdbcType=VARCHAR}, #{repositoryDesc,jdbcType=LONGVARCHAR}) insert into file_module @@ -143,6 +174,21 @@ create_user, + + module_type, + + + repository_path, + + + repository_token, + + + repository_user_name, + + + repository_desc, + @@ -172,6 +218,21 @@ #{createUser,jdbcType=VARCHAR}, + + #{moduleType,jdbcType=VARCHAR}, + + + #{repositoryPath,jdbcType=VARCHAR}, + + + #{repositoryToken,jdbcType=VARCHAR}, + + + #{repositoryUserName,jdbcType=VARCHAR}, + + + #{repositoryDesc,jdbcType=LONGVARCHAR}, + + + + + update file_metadata set module_id = #{moduleId} where project_id = #{projectId} and module_id is null diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtFileModuleMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtFileModuleMapper.xml index cadb942108..4e7424e5c1 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtFileModuleMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtFileModuleMapper.xml @@ -10,6 +10,7 @@ #{emp.updateTime,jdbcType=BIGINT}) +