diff --git a/.gitignore b/.gitignore index 165db4e885..309a8126a5 100644 --- a/.gitignore +++ b/.gitignore @@ -14,7 +14,8 @@ yarn-debug.log* yarn-error.log* # Editor directories and files -.idea +.idea/* +!.idea/icon.png **/*.iml .vscode *.suo diff --git a/.idea/icon.png b/.idea/icon.png new file mode 100644 index 0000000000..15fb97a693 Binary files /dev/null and b/.idea/icon.png differ diff --git a/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsHTTPSamplerProxy.java b/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsHTTPSamplerProxy.java index 2d88dde7f5..d70423500e 100644 --- a/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsHTTPSamplerProxy.java +++ b/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsHTTPSamplerProxy.java @@ -130,7 +130,7 @@ public class MsHTTPSamplerProxy extends MsTestElement { } // 1.8 之前历史数据 - if(StringUtils.isEmpty(this.getProjectId()) && config.getConfig()!= null && !config.getConfig().isEmpty()){ + if (StringUtils.isEmpty(this.getProjectId()) && config.getConfig() != null && !config.getConfig().isEmpty()) { this.setProjectId("historyProjectID"); } @@ -154,10 +154,11 @@ public class MsHTTPSamplerProxy extends MsTestElement { } URL urlObject = new URL(url); sampler.setDomain(URLDecoder.decode(urlObject.getHost(), "UTF-8")); - if (urlObject.getPort() > 0 && urlObject.getPort() != 10990 && StringUtils.isNotEmpty(this.getPort()) && this.getPort().startsWith("${")) { - sampler.setPort(urlObject.getPort()); - } else { + + if (urlObject.getPort() > 0 && urlObject.getPort() == 10990 && StringUtils.isNotEmpty(this.getPort()) && this.getPort().startsWith("${")) { sampler.setProperty("HTTPSampler.port", this.getPort()); + } else { + sampler.setPort(urlObject.getPort()); } sampler.setProtocol(urlObject.getProtocol()); sampler.setPath(urlObject.getPath()); 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 dc8adc3040..9f969416cb 100644 --- a/backend/src/main/java/io/metersphere/api/service/ApiAutomationService.java +++ b/backend/src/main/java/io/metersphere/api/service/ApiAutomationService.java @@ -21,10 +21,7 @@ import io.metersphere.api.dto.scenario.environment.EnvironmentConfig; import io.metersphere.api.jmeter.JMeterService; import io.metersphere.api.parse.ApiImportParser; import io.metersphere.base.domain.*; -import io.metersphere.base.mapper.ApiScenarioMapper; -import io.metersphere.base.mapper.ApiScenarioReportMapper; -import io.metersphere.base.mapper.TestCaseReviewScenarioMapper; -import io.metersphere.base.mapper.TestPlanApiScenarioMapper; +import io.metersphere.base.mapper.*; import io.metersphere.base.mapper.ext.*; import io.metersphere.commons.constants.*; import io.metersphere.commons.exception.MSException; @@ -61,6 +58,8 @@ import java.util.stream.Collectors; @Service @Transactional(rollbackFor = Exception.class) public class ApiAutomationService { + @Resource + ApiScenarioModuleMapper apiScenarioModuleMapper; @Resource private ExtScheduleMapper extScheduleMapper; @Resource @@ -242,9 +241,14 @@ public class ApiAutomationService { } else { scenario.setUserId(request.getUserId()); } - if (StringUtils.isEmpty(request.getApiScenarioModuleId()) || StringUtils.isEmpty(request.getModulePath())) { - scenario.setApiScenarioModuleId("default-module"); - scenario.setModulePath("/默认模块"); + if (StringUtils.isEmpty(request.getApiScenarioModuleId()) || StringUtils.isEmpty(request.getModulePath()) || "default-module".equals(request.getApiScenarioModuleId())) { + ApiScenarioModuleExample example = new ApiScenarioModuleExample(); + example.createCriteria().andProjectIdEqualTo(request.getProjectId()).andNameEqualTo("默认模块"); + List modules = apiScenarioModuleMapper.selectByExample(example); + if (CollectionUtils.isNotEmpty(modules)) { + scenario.setApiScenarioModuleId(modules.get(0).getId()); + scenario.setModulePath(modules.get(0).getName()); + } } return scenario; } diff --git a/backend/src/main/java/io/metersphere/api/service/ApiDefinitionService.java b/backend/src/main/java/io/metersphere/api/service/ApiDefinitionService.java index d6be5e5be4..435846891b 100644 --- a/backend/src/main/java/io/metersphere/api/service/ApiDefinitionService.java +++ b/backend/src/main/java/io/metersphere/api/service/ApiDefinitionService.java @@ -94,6 +94,8 @@ public class ApiDefinitionService { private ApiTestEnvironmentService environmentService; @Resource private EsbApiParamService esbApiParamService; + @Resource + ApiModuleMapper apiModuleMapper; private static Cache cache = Cache.newHardMemoryCache(0, 3600 * 24); @@ -262,9 +264,14 @@ public class ApiDefinitionService { test.setEnvironmentId(request.getEnvironmentId()); test.setUserId(request.getUserId()); test.setTags(request.getTags()); - if (StringUtils.isEmpty(request.getModulePath()) || StringUtils.isEmpty(request.getModuleId())) { - test.setModulePath("/默认模块"); - test.setModuleId("default-module"); + if (StringUtils.isEmpty(request.getModulePath()) || StringUtils.isEmpty(request.getModuleId()) || "default-module".equals(request.getModuleId())) { + ApiModuleExample example = new ApiModuleExample(); + example.createCriteria().andProjectIdEqualTo(test.getProjectId()).andProtocolEqualTo(test.getProtocol()).andNameEqualTo("默认模块"); + List modules = apiModuleMapper.selectByExample(example); + if (CollectionUtils.isNotEmpty(modules)) { + test.setModuleId(modules.get(0).getId()); + test.setModulePath(modules.get(0).getName()); + } } apiDefinitionMapper.updateByPrimaryKeySelective(test); return test; @@ -290,9 +297,14 @@ public class ApiDefinitionService { test.setStatus(APITestStatus.Underway.name()); test.setModulePath(request.getModulePath()); test.setModuleId(request.getModuleId()); - if (StringUtils.isEmpty(request.getModulePath()) || StringUtils.isEmpty(request.getModuleId())) { - test.setModulePath("/默认模块"); - test.setModuleId("default-module"); + if (StringUtils.isEmpty(request.getModulePath()) || StringUtils.isEmpty(request.getModuleId()) || "default-module".equals(request.getModuleId())) { + ApiModuleExample example = new ApiModuleExample(); + example.createCriteria().andProjectIdEqualTo(test.getProjectId()).andProtocolEqualTo(test.getProtocol()).andNameEqualTo("默认模块"); + List modules = apiModuleMapper.selectByExample(example); + if (CollectionUtils.isNotEmpty(modules)) { + test.setModuleId(modules.get(0).getId()); + test.setModulePath("/默认模块"); + } } test.setResponse(JSONObject.toJSONString(request.getResponse())); test.setEnvironmentId(request.getEnvironmentId()); @@ -604,9 +616,14 @@ public class ApiDefinitionService { } for (int i = 0; i < data.size(); i++) { ApiDefinitionWithBLOBs item = data.get(i); - if (StringUtils.isEmpty(item.getModuleId()) || StringUtils.isEmpty(item.getModulePath())) { - item.setModuleId("default-module"); - item.setModulePath("/默认模块"); + if (StringUtils.isEmpty(item.getModuleId()) || StringUtils.isEmpty(item.getModulePath()) || "default-module".equals(item.getModuleId())) { + ApiModuleExample example = new ApiModuleExample(); + example.createCriteria().andProjectIdEqualTo(item.getProjectId()).andProtocolEqualTo(item.getProtocol()).andNameEqualTo("默认模块"); + List modules = apiModuleMapper.selectByExample(example); + if (CollectionUtils.isNotEmpty(modules)) { + item.setModuleId(modules.get(0).getId()); + item.setModulePath(modules.get(0).getName()); + } } if (item.getName().length() > 255) { item.setName(item.getName().substring(0, 255)); diff --git a/backend/src/main/java/io/metersphere/api/service/ApiModuleService.java b/backend/src/main/java/io/metersphere/api/service/ApiModuleService.java index a0eddeeca5..b620710743 100644 --- a/backend/src/main/java/io/metersphere/api/service/ApiModuleService.java +++ b/backend/src/main/java/io/metersphere/api/service/ApiModuleService.java @@ -39,8 +39,6 @@ public class ApiModuleService extends NodeTreeService { @Resource ExtApiModuleMapper extApiModuleMapper; @Resource - private ApiDefinitionMapper apiDefinitionMapper; - @Resource private ExtApiDefinitionMapper extApiDefinitionMapper; @Resource private TestPlanProjectService testPlanProjectService; @@ -61,6 +59,22 @@ public class ApiModuleService extends NodeTreeService { } public List getNodeTreeByProjectId(String projectId, String protocol) { + // 判断当前项目下是否有默认模块,没有添加默认模块 + ApiModuleExample example = new ApiModuleExample(); + example.createCriteria().andProjectIdEqualTo(projectId).andProtocolEqualTo(protocol).andNameEqualTo("默认模块"); + long count = apiModuleMapper.countByExample(example); + if (count <= 0) { + ApiModule record = new ApiModule(); + record.setId(UUID.randomUUID().toString()); + record.setName("默认模块"); + record.setProtocol(protocol); + record.setPos(1.0); + record.setLevel(1); + record.setCreateTime(System.currentTimeMillis()); + record.setUpdateTime(System.currentTimeMillis()); + record.setProjectId(projectId); + apiModuleMapper.insert(record); + } List apiModules = extApiModuleMapper.getNodeTreeByProjectId(projectId, protocol); return getNodeTrees(apiModules); } diff --git a/backend/src/main/java/io/metersphere/api/service/ApiScenarioModuleService.java b/backend/src/main/java/io/metersphere/api/service/ApiScenarioModuleService.java index 23493f60c5..18ad89eed4 100644 --- a/backend/src/main/java/io/metersphere/api/service/ApiScenarioModuleService.java +++ b/backend/src/main/java/io/metersphere/api/service/ApiScenarioModuleService.java @@ -53,6 +53,22 @@ public class ApiScenarioModuleService extends NodeTreeService getNodeTreeByProjectId(String projectId) { + // 判断当前项目下是否有默认模块,没有添加默认模块 + ApiScenarioModuleExample example = new ApiScenarioModuleExample(); + example.createCriteria().andProjectIdEqualTo(projectId).andNameEqualTo("默认模块"); + long count = apiScenarioModuleMapper.countByExample(example); + if (count <= 0) { + ApiScenarioModule record = new ApiScenarioModule(); + record.setId(UUID.randomUUID().toString()); + record.setName("默认模块"); + record.setPos(1.0); + record.setLevel(1); + record.setCreateTime(System.currentTimeMillis()); + record.setUpdateTime(System.currentTimeMillis()); + record.setProjectId(projectId); + apiScenarioModuleMapper.insert(record); + } + List nodes = extApiScenarioModuleMapper.getNodeTreeByProjectId(projectId); return getNodeTrees(nodes); } diff --git a/backend/src/main/java/io/metersphere/performance/parse/xml/reader/jmx/JmeterDocumentParser.java b/backend/src/main/java/io/metersphere/performance/parse/xml/reader/jmx/JmeterDocumentParser.java index 09fbda18a5..a8d33e4391 100644 --- a/backend/src/main/java/io/metersphere/performance/parse/xml/reader/jmx/JmeterDocumentParser.java +++ b/backend/src/main/java/io/metersphere/performance/parse/xml/reader/jmx/JmeterDocumentParser.java @@ -701,9 +701,11 @@ public class JmeterDocumentParser implements DocumentParser { switch (unit) { case "M": duration = String.valueOf(Long.parseLong(duration) * 60); + rampUp = String.valueOf(Long.parseLong(rampUp) * 60); break; case "H": duration = String.valueOf(Long.parseLong(duration) * 60 * 60); + rampUp = String.valueOf(Long.parseLong(rampUp) * 60 * 60); break; default: break; @@ -804,9 +806,11 @@ public class JmeterDocumentParser implements DocumentParser { switch (unit) { case "M": hold = String.valueOf(Long.parseLong(hold) * 60); + rampUp = String.valueOf(Long.parseLong(rampUp) * 60); break; case "H": hold = String.valueOf(Long.parseLong(hold) * 60 * 60); + rampUp = String.valueOf(Long.parseLong(rampUp) * 60 * 60); break; default: break; diff --git a/backend/src/main/java/io/metersphere/track/service/TestCaseNodeService.java b/backend/src/main/java/io/metersphere/track/service/TestCaseNodeService.java index 2e6658799e..636deb6ac0 100644 --- a/backend/src/main/java/io/metersphere/track/service/TestCaseNodeService.java +++ b/backend/src/main/java/io/metersphere/track/service/TestCaseNodeService.java @@ -107,6 +107,21 @@ public class TestCaseNodeService extends NodeTreeService { } public List getNodeTreeByProjectId(String projectId) { + // 判断当前项目下是否有默认模块,没有添加默认模块 + TestCaseNodeExample example = new TestCaseNodeExample(); + example.createCriteria().andProjectIdEqualTo(projectId).andNameEqualTo("默认模块"); + long count = testCaseNodeMapper.countByExample(example); + if (count <= 0) { + TestCaseNode record = new TestCaseNode(); + record.setId(UUID.randomUUID().toString()); + record.setName("默认模块"); + record.setPos(1.0); + record.setLevel(1); + record.setCreateTime(System.currentTimeMillis()); + record.setUpdateTime(System.currentTimeMillis()); + record.setProjectId(projectId); + testCaseNodeMapper.insert(record); + } List testCaseNodes = extTestCaseNodeMapper.getNodeTreeByProjectId(projectId); return getNodeTrees(testCaseNodes); } diff --git a/backend/src/main/java/io/metersphere/track/service/TestCaseService.java b/backend/src/main/java/io/metersphere/track/service/TestCaseService.java index 1ed153236f..881d60f382 100644 --- a/backend/src/main/java/io/metersphere/track/service/TestCaseService.java +++ b/backend/src/main/java/io/metersphere/track/service/TestCaseService.java @@ -52,6 +52,8 @@ import java.util.stream.Collectors; @Service @Transactional(rollbackFor = Exception.class) public class TestCaseService { + @Resource + TestCaseNodeMapper testCaseNodeMapper; @Resource TestCaseMapper testCaseMapper; @@ -90,6 +92,18 @@ public class TestCaseService { @Resource TestCaseTestMapper testCaseTestMapper; + private void setNode(TestCaseWithBLOBs testCase){ + if (StringUtils.isEmpty(testCase.getNodeId()) || StringUtils.isEmpty(testCase.getNodePath()) || "default-module".equals(testCase.getNodeId())) { + TestCaseNodeExample example = new TestCaseNodeExample(); + example.createCriteria().andProjectIdEqualTo(testCase.getProjectId()).andNameEqualTo("默认模块"); + List nodes = testCaseNodeMapper.selectByExample(example); + if (CollectionUtils.isNotEmpty(nodes)) { + testCase.setNodeId(nodes.get(0).getId()); + testCase.setNodePath("/" + nodes.get(0).getName()); + } + } + } + public TestCaseWithBLOBs addTestCase(TestCaseWithBLOBs testCase) { testCase.setName(testCase.getName()); checkTestCaseExist(testCase); @@ -100,7 +114,7 @@ public class TestCaseService { testCase.setReviewStatus(TestCaseReviewStatus.Prepare.name()); testCase.setDemandId(testCase.getDemandId()); testCase.setDemandName(testCase.getDemandName()); - + this.setNode(testCase); testCaseMapper.insert(testCase); return testCase; } @@ -179,7 +193,7 @@ public class TestCaseService { String steps = tc.getSteps(); String remark = tc.getRemark(); if (StringUtils.equals(steps, testCase.getSteps()) && StringUtils.equals(remark, caseRemark)) { - //MSException.throwException(Translator.get("test_case_already_exists")); + //MSException.throwException(Translator.get("test_case_already_exists")); isExt = true; } } @@ -195,16 +209,16 @@ public class TestCaseService { * 根据id和pojectId查询id是否在数据库中存在。 * 在数据库中单id的话是可重复的,id与projectId的组合是唯一的 */ - public Integer checkIdExist(Integer id, String projectId){ + public Integer checkIdExist(Integer id, String projectId) { TestCaseExample example = new TestCaseExample(); TestCaseExample.Criteria criteria = example.createCriteria(); if (null != id) { criteria.andNumEqualTo(id); criteria.andProjectIdEqualTo(projectId); long count = testCaseMapper.countByExample(example); //查询是否有包含此ID的数据 - if(count == 0){ //如果ID不存在 + if (count == 0) { //如果ID不存在 return null; - }else { //有对应ID的数据 + } else { //有对应ID的数据 return id; } } @@ -415,7 +429,7 @@ public class TestCaseService { testcase.setSort(sort.getAndIncrement()); testcase.setNum(num.decrementAndGet()); testcase.setReviewStatus(TestCaseReviewStatus.Prepare.name()); - mapper.insert(testcase); + mapper.insert(testcase); }); } sqlSession.flushStatements(); @@ -443,6 +457,7 @@ public class TestCaseService { /** * 把Excel中带ID的数据更新到数据库 + * * @param testCases * @param projectId */ @@ -820,14 +835,14 @@ public class TestCaseService { if (files != null) { files.forEach(file -> { - final FileMetadata fileMetadata = fileService.saveFile(file,testCaseWithBLOBs.getProjectId()); + final FileMetadata fileMetadata = fileService.saveFile(file, testCaseWithBLOBs.getProjectId()); TestCaseFile testCaseFile = new TestCaseFile(); testCaseFile.setFileId(fileMetadata.getId()); testCaseFile.setCaseId(request.getId()); testCaseFileMapper.insert(testCaseFile); }); } - + this.setNode(request); editTestCase(request); return request.getId(); } diff --git a/backend/src/main/resources/db/migration/V79__v1.8.1_release.sql b/backend/src/main/resources/db/migration/V79__v1.8.1_release.sql new file mode 100644 index 0000000000..4c177ecbc6 --- /dev/null +++ b/backend/src/main/resources/db/migration/V79__v1.8.1_release.sql @@ -0,0 +1,5 @@ +-- file name length change +ALTER TABLE file_metadata + MODIFY name VARCHAR(250) NOT NULL COMMENT 'File name'; +-- api_scenario_report modify column length +ALTER TABLE api_scenario_report MODIFY COLUMN name VARCHAR(300); \ No newline at end of file diff --git a/frontend/src/business/components/api/automation/ApiAutomation.vue b/frontend/src/business/components/api/automation/ApiAutomation.vue index 11dc10b0f9..180b05750b 100644 --- a/frontend/src/business/components/api/automation/ApiAutomation.vue +++ b/frontend/src/business/components/api/automation/ApiAutomation.vue @@ -190,13 +190,17 @@ this.activeName = name; let currentScenario = { status: "Underway", principal: getCurrentUser().id, - apiScenarioModuleId: "root", id: getUUID(), + apiScenarioModuleId: "default-module", id: getUUID(), modulePath: "/" + this.$t("commons.module_title") }; if (this.nodeTree && this.nodeTree.length > 0) { currentScenario.apiScenarioModuleId = this.nodeTree[0].id; currentScenario.modulePath = this.nodeTree[0].path; } + + if (this.selectNodeIds && this.selectNodeIds.length > 0) { + currentScenario.apiScenarioModuleId = this.selectNodeIds[0]; + } this.tabs.push({label: label, name: name, currentScenario: currentScenario}); } if (tab.name === 'edit') { diff --git a/frontend/src/business/components/api/automation/scenario/AddBasisScenario.vue b/frontend/src/business/components/api/automation/scenario/AddBasisScenario.vue index ae28794b28..43a3b5d57b 100644 --- a/frontend/src/business/components/api/automation/scenario/AddBasisScenario.vue +++ b/frontend/src/business/components/api/automation/scenario/AddBasisScenario.vue @@ -117,6 +117,9 @@ if (this.currentModule && this.currentModule.id != "root") { this.scenarioForm.modulePath = this.currentModule.method !== undefined ? this.currentModule.method : null; this.scenarioForm.apiScenarioModuleId = this.currentModule.id; + }else{ + this.scenarioForm.modulePath = this.$t("commons.module_title"); + this.scenarioForm.apiScenarioModuleId = "default-module"; } }, getMaintainerOptions() { diff --git a/frontend/src/business/components/api/automation/scenario/ApiScenarioModule.vue b/frontend/src/business/components/api/automation/scenario/ApiScenarioModule.vue index fc3266b5bc..c93547beca 100644 --- a/frontend/src/business/components/api/automation/scenario/ApiScenarioModule.vue +++ b/frontend/src/business/components/api/automation/scenario/ApiScenarioModule.vue @@ -29,7 +29,7 @@ @refresh="refresh" ref="basisScenario"/> - + @@ -82,9 +82,7 @@ trashEnable: false }, data: [], - extendTreeNodes: [], currentModule: undefined, - moduleOptions: [], operators: [ { label: this.$t('api_test.automation.add_scenario'), @@ -141,11 +139,9 @@ this.result = this.$get("/api/automation/module/list/" + this.projectId, response => { if (response.data != undefined && response.data != null) { this.data = response.data; - let moduleOptions = []; this.data.forEach(node => { - buildNodePath(node, {path: ''}, moduleOptions); + buildTree(node, {path: ''}); }); - this.moduleOptions = moduleOptions } }); this.$refs.apiImport.open(this.currentModule); @@ -163,11 +159,9 @@ this.result = this.$get("/api/automation/module/list/" + this.projectId, response => { if (response.data != undefined && response.data != null) { this.data = response.data; - let moduleOptions = []; this.data.forEach(node => { - buildNodePath(node, {path: ''}, moduleOptions); + buildTree(node, {path: ''}); }); - this.moduleOptions = moduleOptions } }); this.$refs.apiImport.open(this.currentModule); @@ -188,17 +182,10 @@ this.result = this.$get(url, response => { if (response.data != undefined && response.data != null) { this.data = response.data; - this.extendTreeNodes = []; - this.extendTreeNodes.unshift({ - "id": "root", - "name": this.$t('commons.module_title'), - "level": 0, - "children": this.data, - }); - this.extendTreeNodes.forEach(node => { + this.data.forEach(node => { buildTree(node, {path: ''}); }); - this.$emit('setModuleOptions', this.extendTreeNodes); + this.$emit('setModuleOptions', this.data); this.$emit('setNodeTree', this.data); if (this.$refs.nodeTree) { this.$refs.nodeTree.filter(this.condition.filterText); diff --git a/frontend/src/business/components/api/automation/scenario/api/AddBasisApi.vue b/frontend/src/business/components/api/automation/scenario/api/AddBasisApi.vue index 31f10c7792..09349bb9e6 100644 --- a/frontend/src/business/components/api/automation/scenario/api/AddBasisApi.vue +++ b/frontend/src/business/components/api/automation/scenario/api/AddBasisApi.vue @@ -84,7 +84,7 @@ callback(); }; return { - httpForm: {environmentId: "", moduleId: "root"}, + httpForm: {environmentId: "", moduleId: "default-module"}, moduleOptions: [], httpVisible: false, currentModule: {}, @@ -251,14 +251,7 @@ let url = "/api/module/list/" + getCurrentProjectID() + "/" + data.protocol; this.result = this.$get(url, response => { if (response.data != undefined && response.data != null) { - let data = response.data; - this.moduleOptions = []; - this.moduleOptions.unshift({ - "id": "root", - "name": this.$t('commons.module_title'), - "level": 0, - "children": data, - }); + this.moduleOptions = response.data; this.moduleOptions.forEach(node => { buildTree(node, {path: ''}); }); @@ -282,7 +275,7 @@ data.protocol = "DUBBO"; } data.id = getUUID(); - this.httpForm = {id: data.id, name: data.name, protocol: data.protocol, path: data.path, method: api.method, userId: getCurrentUser().id, request: data, moduleId: "root"}; + this.httpForm = {id: data.id, name: data.name, protocol: data.protocol, path: data.path, method: api.method, userId: getCurrentUser().id, request: data, moduleId: "default-module"}; this.getMaintainerOptions(); this.list(data); this.httpVisible = true; diff --git a/frontend/src/business/components/api/automation/scenario/common/ApiBaseComponent.vue b/frontend/src/business/components/api/automation/scenario/common/ApiBaseComponent.vue index 2cff5e9ca6..706f6e2cb3 100644 --- a/frontend/src/business/components/api/automation/scenario/common/ApiBaseComponent.vue +++ b/frontend/src/business/components/api/automation/scenario/common/ApiBaseComponent.vue @@ -32,7 +32,7 @@ - + diff --git a/frontend/src/business/components/api/definition/ApiDefinition.vue b/frontend/src/business/components/api/definition/ApiDefinition.vue index 659458f6cb..3abdc02222 100644 --- a/frontend/src/business/components/api/definition/ApiDefinition.vue +++ b/frontend/src/business/components/api/definition/ApiDefinition.vue @@ -302,6 +302,9 @@ api.moduleId = this.nodeTree[0].id; api.modulePath = this.nodeTree[0].path; } + if (this.selectNodeIds && this.selectNodeIds.length > 0) { + api.moduleId = this.selectNodeIds[0]; + } this.handleTabsEdit(this.$t('api_test.definition.request.title'), e, api); }, handleTabClose() { diff --git a/frontend/src/business/components/api/definition/components/basis/AddBasisApi.vue b/frontend/src/business/components/api/definition/components/basis/AddBasisApi.vue index 7bd6e6124a..055a927db7 100644 --- a/frontend/src/business/components/api/definition/components/basis/AddBasisApi.vue +++ b/frontend/src/business/components/api/definition/components/basis/AddBasisApi.vue @@ -154,6 +154,9 @@ if (this.currentModule != null) { this.httpForm.modulePath = this.currentModule.method != undefined ? this.currentModule.method : null; this.httpForm.moduleId = this.currentModule.id; + } else { + this.httpForm.modulePath = this.$t("commons.module_title"); + this.httpForm.moduleId = "default-module"; } }, diff --git a/frontend/src/business/components/api/definition/components/module/ApiModule.vue b/frontend/src/business/components/api/definition/components/module/ApiModule.vue index 387ce3d13e..1d2e735ff6 100644 --- a/frontend/src/business/components/api/definition/components/module/ApiModule.vue +++ b/frontend/src/business/components/api/definition/components/module/ApiModule.vue @@ -130,13 +130,6 @@ this.result = this.$get(url, response => { if (response.data != undefined && response.data != null) { this.data = response.data; - this.data.unshift({ - "id": "default-module", - "name": this.$t('commons.module_title'), - "level": 0, - "path": "/" + this.$t('commons.module_title'), - "children": [], - }); this.data.forEach(node => { buildTree(node, {path: ''}); }); diff --git a/frontend/src/business/components/performance/test/components/ExistFiles.vue b/frontend/src/business/components/performance/test/components/ExistFiles.vue index bcecb0713c..e264843c2b 100644 --- a/frontend/src/business/components/performance/test/components/ExistFiles.vue +++ b/frontend/src/business/components/performance/test/components/ExistFiles.vue @@ -154,35 +154,39 @@ export default { } let rows = this.existFiles.filter(f => this.selectIds.has(f.id)); + let jmxIds = []; for (let i = 0; i < rows.length; i++) { let row = rows[i]; if (this.tableData.filter(f => f.name === row.name).length > 0) { - this.$error(this.$t('load_test.delete_file') + ', name: ' + row.name); - this.selectIds.clear(); - return; + setTimeout(() => { + this.$warning(this.$t('load_test.delete_file') + 'name: ' + row.name); + }, 100); + continue; } + if (row.type.toUpperCase() === 'JMX') { + jmxIds.push(row.id); + } + this.tableData.push({ + name: row.name, + size: (row.size / 1024).toFixed(2) + ' KB', + type: row.type.toUpperCase(), + updateTime: row.lastModified, + }); } if (this.loadType === 'resource') { rows.forEach(row => { this.fileList.push(row); - this.tableData.push({ - name: row.name, - size: (row.size / 1024).toFixed(2) + ' KB', - type: row.type.toUpperCase(), - updateTime: row.lastModified, - }); }) this.$success(this.$t('test_track.case.import.success')); - this.loadFileVisible = false; - this.selectIds.clear(); + this.close(); return; } - this.getJmxContents(); + this.getJmxContents(jmxIds); }, - getJmxContents() { - this.projectLoadingResult = this.$post('/performance/export/jmx', [...this.selectIds], (response) => { + getJmxContents(jmxIds) { + this.projectLoadingResult = this.$post('/performance/export/jmx', jmxIds, (response) => { let data = response.data; if (!data) { return; @@ -195,18 +199,11 @@ export default { }); let file = new File([d.jmx], d.name); this.uploadList.push(file); - this.tableData.push({ - name: file.name, - size: (file.size / 1024).toFixed(2) + ' KB', - type: 'JMX', - updateTime: file.lastModified, - }); }); this.$emit('fileChange', this.scenarios); this.$success(this.$t('test_track.case.import.success')); - this.loadFileVisible = false; - this.selectIds.clear(); + this.close(); }); }, beforeUploadFile(file) { diff --git a/frontend/src/business/components/track/case/components/TestCaseCreate.vue b/frontend/src/business/components/track/case/components/TestCaseCreate.vue index 98d5bbec1e..31b6d3d606 100644 --- a/frontend/src/business/components/track/case/components/TestCaseCreate.vue +++ b/frontend/src/business/components/track/case/components/TestCaseCreate.vue @@ -114,8 +114,8 @@ export default { this.testCaseForm.nodePath = this.currentModule.path; this.testCaseForm.nodeId = this.currentModule.id; } else { - this.testCaseForm.nodePath = "/全部用例" - this.testCaseForm.nodeId = "root" + this.testCaseForm.nodePath = "/默认模块" + this.testCaseForm.nodeId = "default-module" } this.result = this.$post(path, this.testCaseForm, response => { this.testCaseForm.id = response.data.id diff --git a/frontend/src/business/components/track/case/components/TestCaseEdit.vue b/frontend/src/business/components/track/case/components/TestCaseEdit.vue index 5ed25a3951..96e8d81efa 100644 --- a/frontend/src/business/components/track/case/components/TestCaseEdit.vue +++ b/frontend/src/business/components/track/case/components/TestCaseEdit.vue @@ -35,7 +35,7 @@ - @@ -314,8 +314,8 @@ export default { dialogFormVisible: false, form: { name: '', - module: 'root', - nodePath:'', + module: 'default-module', + nodePath:'/默认模块', maintainer: getCurrentUser().id, priority: 'P0', type: '', @@ -416,7 +416,7 @@ export default { }; }); }, 1000); - if(this.selectNode && this.selectNode.data){ + if(this.selectNode && this.selectNode.data && !this.form.id){ this.form.module = this.selectNode.data.id; this.form.nodePath = this.selectNode.data.path; } @@ -432,7 +432,16 @@ export default { created() { this.loadOptions(); this.addListener(); // 添加 ctrl s 监听 - + if(this.selectNode && this.selectNode.data && !this.form.id){ + this.form.module = this.selectNode.data.id; + this.form.nodePath = this.selectNode.data.path; + }else{ + this.form.module =this.treeNodes && this.length>0? this.treeNodes[0].id:""; + } + if (this.type === 'edit' || this.type === 'copy') { + this.form.module = this.currentTestCaseInfo.nodeId; + this.form.nodePath = this.currentTestCaseInfo.nodePath; + } }, methods: { setModule(id,data) { @@ -836,16 +845,11 @@ export default { this.getTestOptions() }, getModuleOptions() { - this.moduleOptions = []; - this.moduleOptions.unshift({ - "id": "root", - "name": this.$t('commons.module_title'), - "level": 0, - "children": this.treeNodes, - }); - this.moduleOptions.forEach(node => { - buildTree(node, {path: ''}); + let moduleOptions = []; + this.treeNodes.forEach(node => { + buildNodePath(node, {path: ''}, moduleOptions); }); + this.moduleOptions = moduleOptions; }, getMaintainerOptions() { let workspaceId = localStorage.getItem(WORKSPACE_ID); diff --git a/frontend/src/business/components/track/common/NodeTree.vue b/frontend/src/business/components/track/common/NodeTree.vue index 80a9ea0aba..fb4929c35e 100644 --- a/frontend/src/business/components/track/common/NodeTree.vue +++ b/frontend/src/business/components/track/common/NodeTree.vue @@ -32,7 +32,7 @@ { this.treeNodes = response.data; + this.treeNodes.forEach(node => { + buildTree(node, {path: ''}); + }); if (this.$refs.nodeTree) { this.$refs.nodeTree.filter(); } diff --git a/frontend/src/business/components/xpack b/frontend/src/business/components/xpack index 2115bd28a9..07951ba17a 160000 --- a/frontend/src/business/components/xpack +++ b/frontend/src/business/components/xpack @@ -1 +1 @@ -Subproject commit 2115bd28a90854d2b6276a90878934715498c584 +Subproject commit 07951ba17aef6f29e50cfd68e40de3266f9a60cd