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/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/frontend/src/business/components/api/automation/scenario/ApiScenarioModule.vue b/frontend/src/business/components/api/automation/scenario/ApiScenarioModule.vue index eeec636123..c93547beca 100644 --- a/frontend/src/business/components/api/automation/scenario/ApiScenarioModule.vue +++ b/frontend/src/business/components/api/automation/scenario/ApiScenarioModule.vue @@ -139,13 +139,6 @@ this.result = this.$get("/api/automation/module/list/" + this.projectId, 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: ''}); }); @@ -166,13 +159,6 @@ this.result = this.$get("/api/automation/module/list/" + this.projectId, 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: ''}); }); @@ -196,13 +182,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/api/automation/scenario/api/AddBasisApi.vue b/frontend/src/business/components/api/automation/scenario/api/AddBasisApi.vue index 0189f7db60..09349bb9e6 100644 --- a/frontend/src/business/components/api/automation/scenario/api/AddBasisApi.vue +++ b/frontend/src/business/components/api/automation/scenario/api/AddBasisApi.vue @@ -252,13 +252,6 @@ this.result = this.$get(url, response => { if (response.data != undefined && response.data != null) { this.moduleOptions = response.data; - this.moduleOptions.unshift({ - "id": "default-module", - "name": this.$t('commons.module_title'), - "level": 0, - "path": "/" + this.$t('commons.module_title'), - "children": [], - }); this.moduleOptions.forEach(node => { buildTree(node, {path: ''}); }); 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/track/case/components/TestCaseEdit.vue b/frontend/src/business/components/track/case/components/TestCaseEdit.vue index 03571723a0..96e8d81efa 100644 --- a/frontend/src/business/components/track/case/components/TestCaseEdit.vue +++ b/frontend/src/business/components/track/case/components/TestCaseEdit.vue @@ -315,7 +315,7 @@ export default { form: { name: '', module: 'default-module', - nodePath:'', + nodePath:'/默认模块', maintainer: getCurrentUser().id, priority: 'P0', type: '', @@ -416,6 +416,10 @@ export default { }; }); }, 1000); + if(this.selectNode && this.selectNode.data && !this.form.id){ + this.form.module = this.selectNode.data.id; + this.form.nodePath = this.selectNode.data.path; + } }, watch: { treeNodes() { @@ -428,9 +432,11 @@ export default { created() { this.loadOptions(); this.addListener(); // 添加 ctrl s 监听 - if(this.selectNode && this.selectNode.data && this.form.id){ + 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; diff --git a/frontend/src/business/components/track/common/TestCaseNodeTree.vue b/frontend/src/business/components/track/common/TestCaseNodeTree.vue index b6d9415dc9..e4e89ab7ea 100644 --- a/frontend/src/business/components/track/common/TestCaseNodeTree.vue +++ b/frontend/src/business/components/track/common/TestCaseNodeTree.vue @@ -116,13 +116,6 @@ export default { if (this.projectId) { this.result = this.$get("/case/node/list/" + this.projectId, response => { this.treeNodes = response.data; - this.treeNodes.unshift({ - "id": "default-module", - "name": this.$t('commons.module_title'), - "level": 0, - "path": "/" + this.$t('commons.module_title'), - "children": [], - }); this.treeNodes.forEach(node => { buildTree(node, {path: ''}); }); 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