From a30af57c283faa7c4f1b0b48b0f7f79759d453ca Mon Sep 17 00:00:00 2001 From: haifeng414 Date: Mon, 17 Feb 2020 21:59:34 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=88=9B=E5=BB=BA=E5=92=8C?= =?UTF-8?q?=E7=BC=96=E8=BE=91=E6=B5=8B=E8=AF=95=E6=97=B6=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E4=BF=9D=E5=AD=98=E7=9B=B8=E5=85=B3=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../metersphere/base/domain/FileContent.java | 10 +-- .../base/domain/FileContentExample.java | 56 ++++++++--------- .../base/mapper/FileContentMapper.java | 4 +- .../base/mapper/FileContentMapper.xml | 32 +++++----- .../controller/LoadTestController.java | 31 +++++----- .../request/testplan/EditTestPlanRequest.java | 4 ++ .../request/testplan/TestPlanRequest.java | 9 --- .../io/metersphere/service/FileService.java | 48 ++++++++++++++- .../metersphere/service/LoadTestService.java | 34 +++++++++-- .../components/testPlan/CreateTestPlan.vue | 26 ++++---- .../testPlan/components/AdvancedConfig.vue | 10 +-- .../testPlan/components/BasicConfig.vue | 61 +++++++++++-------- .../testPlan/components/PressureConfig.vue | 8 --- 13 files changed, 195 insertions(+), 138 deletions(-) create mode 100644 backend/src/main/java/io/metersphere/controller/request/testplan/EditTestPlanRequest.java diff --git a/backend/src/main/java/io/metersphere/base/domain/FileContent.java b/backend/src/main/java/io/metersphere/base/domain/FileContent.java index 91f16f6d2e..9c36fe33ba 100644 --- a/backend/src/main/java/io/metersphere/base/domain/FileContent.java +++ b/backend/src/main/java/io/metersphere/base/domain/FileContent.java @@ -3,18 +3,18 @@ package io.metersphere.base.domain; import java.io.Serializable; public class FileContent implements Serializable { - private String id; + private String fileId; private String file; private static final long serialVersionUID = 1L; - public String getId() { - return id; + public String getFileId() { + return fileId; } - public void setId(String id) { - this.id = id == null ? null : id.trim(); + public void setFileId(String fileId) { + this.fileId = fileId == null ? null : fileId.trim(); } public String getFile() { diff --git a/backend/src/main/java/io/metersphere/base/domain/FileContentExample.java b/backend/src/main/java/io/metersphere/base/domain/FileContentExample.java index 98a732bec8..6f4b4a25b4 100644 --- a/backend/src/main/java/io/metersphere/base/domain/FileContentExample.java +++ b/backend/src/main/java/io/metersphere/base/domain/FileContentExample.java @@ -104,73 +104,73 @@ public class FileContentExample { criteria.add(new Criterion(condition, value1, value2)); } - public Criteria andIdIsNull() { - addCriterion("id is null"); + public Criteria andFileIdIsNull() { + addCriterion("file_id is null"); return (Criteria) this; } - public Criteria andIdIsNotNull() { - addCriterion("id is not null"); + public Criteria andFileIdIsNotNull() { + addCriterion("file_id is not null"); return (Criteria) this; } - public Criteria andIdEqualTo(String value) { - addCriterion("id =", value, "id"); + public Criteria andFileIdEqualTo(String value) { + addCriterion("file_id =", value, "fileId"); return (Criteria) this; } - public Criteria andIdNotEqualTo(String value) { - addCriterion("id <>", value, "id"); + public Criteria andFileIdNotEqualTo(String value) { + addCriterion("file_id <>", value, "fileId"); return (Criteria) this; } - public Criteria andIdGreaterThan(String value) { - addCriterion("id >", value, "id"); + public Criteria andFileIdGreaterThan(String value) { + addCriterion("file_id >", value, "fileId"); return (Criteria) this; } - public Criteria andIdGreaterThanOrEqualTo(String value) { - addCriterion("id >=", value, "id"); + public Criteria andFileIdGreaterThanOrEqualTo(String value) { + addCriterion("file_id >=", value, "fileId"); return (Criteria) this; } - public Criteria andIdLessThan(String value) { - addCriterion("id <", value, "id"); + public Criteria andFileIdLessThan(String value) { + addCriterion("file_id <", value, "fileId"); return (Criteria) this; } - public Criteria andIdLessThanOrEqualTo(String value) { - addCriterion("id <=", value, "id"); + public Criteria andFileIdLessThanOrEqualTo(String value) { + addCriterion("file_id <=", value, "fileId"); return (Criteria) this; } - public Criteria andIdLike(String value) { - addCriterion("id like", value, "id"); + public Criteria andFileIdLike(String value) { + addCriterion("file_id like", value, "fileId"); return (Criteria) this; } - public Criteria andIdNotLike(String value) { - addCriterion("id not like", value, "id"); + public Criteria andFileIdNotLike(String value) { + addCriterion("file_id not like", value, "fileId"); return (Criteria) this; } - public Criteria andIdIn(List values) { - addCriterion("id in", values, "id"); + public Criteria andFileIdIn(List values) { + addCriterion("file_id in", values, "fileId"); return (Criteria) this; } - public Criteria andIdNotIn(List values) { - addCriterion("id not in", values, "id"); + public Criteria andFileIdNotIn(List values) { + addCriterion("file_id not in", values, "fileId"); return (Criteria) this; } - public Criteria andIdBetween(String value1, String value2) { - addCriterion("id between", value1, value2, "id"); + public Criteria andFileIdBetween(String value1, String value2) { + addCriterion("file_id between", value1, value2, "fileId"); return (Criteria) this; } - public Criteria andIdNotBetween(String value1, String value2) { - addCriterion("id not between", value1, value2, "id"); + public Criteria andFileIdNotBetween(String value1, String value2) { + addCriterion("file_id not between", value1, value2, "fileId"); return (Criteria) this; } } diff --git a/backend/src/main/java/io/metersphere/base/mapper/FileContentMapper.java b/backend/src/main/java/io/metersphere/base/mapper/FileContentMapper.java index c0477914f5..4d316c24ba 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/FileContentMapper.java +++ b/backend/src/main/java/io/metersphere/base/mapper/FileContentMapper.java @@ -10,7 +10,7 @@ public interface FileContentMapper { int deleteByExample(FileContentExample example); - int deleteByPrimaryKey(String id); + int deleteByPrimaryKey(String fileId); int insert(FileContent record); @@ -20,7 +20,7 @@ public interface FileContentMapper { List selectByExample(FileContentExample example); - FileContent selectByPrimaryKey(String id); + FileContent selectByPrimaryKey(String fileId); int updateByExampleSelective(@Param("record") FileContent record, @Param("example") FileContentExample example); diff --git a/backend/src/main/java/io/metersphere/base/mapper/FileContentMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/FileContentMapper.xml index 9d7344b93a..992afb28f2 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/FileContentMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/FileContentMapper.xml @@ -2,7 +2,7 @@ - + @@ -66,7 +66,7 @@ - id + file_id file @@ -107,11 +107,11 @@ , from file_content - where id = #{id,jdbcType=VARCHAR} + where file_id = #{fileId,jdbcType=VARCHAR} delete from file_content - where id = #{id,jdbcType=VARCHAR} + where file_id = #{fileId,jdbcType=VARCHAR} delete from file_content @@ -120,22 +120,22 @@ - insert into file_content (id, file) - values (#{id,jdbcType=VARCHAR}, #{file,jdbcType=LONGVARCHAR}) + insert into file_content (file_id, file) + values (#{fileId,jdbcType=VARCHAR}, #{file,jdbcType=LONGVARCHAR}) insert into file_content - - id, + + file_id, file, - - #{id,jdbcType=VARCHAR}, + + #{fileId,jdbcType=VARCHAR}, #{file,jdbcType=LONGVARCHAR}, @@ -151,8 +151,8 @@ update file_content - - id = #{record.id,jdbcType=VARCHAR}, + + file_id = #{record.fileId,jdbcType=VARCHAR}, file = #{record.file,jdbcType=LONGVARCHAR}, @@ -164,7 +164,7 @@ update file_content - set id = #{record.id,jdbcType=VARCHAR}, + set file_id = #{record.fileId,jdbcType=VARCHAR}, file = #{record.file,jdbcType=LONGVARCHAR} @@ -172,7 +172,7 @@ update file_content - set id = #{record.id,jdbcType=VARCHAR} + set file_id = #{record.fileId,jdbcType=VARCHAR} @@ -184,11 +184,11 @@ file = #{file,jdbcType=LONGVARCHAR}, - where id = #{id,jdbcType=VARCHAR} + where file_id = #{fileId,jdbcType=VARCHAR} update file_content set file = #{file,jdbcType=LONGVARCHAR} - where id = #{id,jdbcType=VARCHAR} + where file_id = #{fileId,jdbcType=VARCHAR} \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/controller/LoadTestController.java b/backend/src/main/java/io/metersphere/controller/LoadTestController.java index 7c1c4904f3..5bc6ef9aba 100644 --- a/backend/src/main/java/io/metersphere/controller/LoadTestController.java +++ b/backend/src/main/java/io/metersphere/controller/LoadTestController.java @@ -2,12 +2,10 @@ package io.metersphere.controller; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; +import io.metersphere.base.domain.FileMetadata; import io.metersphere.commons.utils.PageUtils; import io.metersphere.commons.utils.Pager; -import io.metersphere.controller.request.testplan.DeleteTestPlanRequest; -import io.metersphere.controller.request.testplan.FileOperationRequest; -import io.metersphere.controller.request.testplan.QueryTestPlanRequest; -import io.metersphere.controller.request.testplan.SaveTestPlanRequest; +import io.metersphere.controller.request.testplan.*; import io.metersphere.dto.LoadTestDTO; import io.metersphere.service.FileService; import io.metersphere.service.LoadTestService; @@ -18,8 +16,6 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; import java.util.List; @RestController @@ -39,28 +35,31 @@ public class LoadTestController { @PostMapping(value = "/save", consumes = {"multipart/form-data"}) public void save( @RequestPart("request") SaveTestPlanRequest request, - @RequestPart("file") MultipartFile file + @RequestPart(value = "file") MultipartFile file ) { loadTestService.save(request, file); } + @PostMapping(value = "/edit", consumes = {"multipart/form-data"}) + public void edit( + @RequestPart("request") EditTestPlanRequest request, + @RequestPart(value = "file", required = false) MultipartFile file + ) { + loadTestService.edit(request, file); + } + @PostMapping("/delete") public void delete(@RequestBody DeleteTestPlanRequest request) { loadTestService.delete(request); } - @PostMapping("/file/upload") - public void uploadJmx(MultipartFile file) throws IOException { - fileService.upload(file.getOriginalFilename(), file); - } - - @PostMapping("/file/delete") - public void deleteJmx(@RequestBody FileOperationRequest request) { - System.out.println(String.format("delete %s", request.getName())); + @GetMapping("/file/metadata/{testId}") + public FileMetadata getFileMetadata(@PathVariable String testId) { + return fileService.getFileMetadataByTestId(testId); } @PostMapping("/file/download") - public ResponseEntity downloadJmx(@RequestBody FileOperationRequest fileOperationRequest, HttpServletResponse response) { + public ResponseEntity downloadJmx(@RequestBody FileOperationRequest fileOperationRequest) { org.springframework.core.io.Resource resource = fileService.loadFileAsResource(fileOperationRequest.getName()); return ResponseEntity.ok() diff --git a/backend/src/main/java/io/metersphere/controller/request/testplan/EditTestPlanRequest.java b/backend/src/main/java/io/metersphere/controller/request/testplan/EditTestPlanRequest.java new file mode 100644 index 0000000000..dbb6e20560 --- /dev/null +++ b/backend/src/main/java/io/metersphere/controller/request/testplan/EditTestPlanRequest.java @@ -0,0 +1,4 @@ +package io.metersphere.controller.request.testplan; + +public class EditTestPlanRequest extends TestPlanRequest { +} diff --git a/backend/src/main/java/io/metersphere/controller/request/testplan/TestPlanRequest.java b/backend/src/main/java/io/metersphere/controller/request/testplan/TestPlanRequest.java index f8d6d9219a..c2925a5f8c 100644 --- a/backend/src/main/java/io/metersphere/controller/request/testplan/TestPlanRequest.java +++ b/backend/src/main/java/io/metersphere/controller/request/testplan/TestPlanRequest.java @@ -2,7 +2,6 @@ package io.metersphere.controller.request.testplan; public class TestPlanRequest { private String id; - private String fileId; private String projectId; private String name; @@ -15,14 +14,6 @@ public class TestPlanRequest { this.id = id; } - public String getFileId() { - return fileId; - } - - public void setFileId(String fileId) { - this.fileId = fileId; - } - public String getProjectId() { return projectId; } diff --git a/backend/src/main/java/io/metersphere/service/FileService.java b/backend/src/main/java/io/metersphere/service/FileService.java index 3c0d7d6dfc..c10489c013 100644 --- a/backend/src/main/java/io/metersphere/service/FileService.java +++ b/backend/src/main/java/io/metersphere/service/FileService.java @@ -1,19 +1,32 @@ package io.metersphere.service; +import io.metersphere.base.domain.*; +import io.metersphere.base.mapper.FileContentMapper; +import io.metersphere.base.mapper.FileMetadataMapper; +import io.metersphere.base.mapper.LoadTestFileMapper; import org.springframework.core.io.InputStreamResource; -import org.springframework.core.io.Resource; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import org.springframework.web.multipart.MultipartFile; +import javax.annotation.Resource; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; +import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; @Service public class FileService { + @Resource + private FileMetadataMapper fileMetadataMapper; + @Resource + private LoadTestFileMapper loadTestFileMapper; + @Resource + private FileContentMapper fileContentMapper; + // 将上传的文件保存在内存,方便测试 private Map fileMap = new ConcurrentHashMap<>(); @@ -25,7 +38,7 @@ public class FileService { fileMap.put(name, file); } - public Resource loadFileAsResource(String name) { + public org.springframework.core.io.Resource loadFileAsResource(String name) { final MultipartFile file = fileMap.get(name); if (file != null) { @@ -38,4 +51,35 @@ public class FileService { return null; } + + public FileMetadata getFileMetadataByTestId(String testId) { + LoadTestFileExample loadTestFileExample = new LoadTestFileExample(); + loadTestFileExample.createCriteria().andTestIdEqualTo(testId); + final List loadTestFiles = loadTestFileMapper.selectByExample(loadTestFileExample); + + if (CollectionUtils.isEmpty(loadTestFiles)) { + return null; + } + + return fileMetadataMapper.selectByPrimaryKey(loadTestFiles.get(0).getFileId()); + } + + public void deleteFileByTestId(String testId) { + LoadTestFileExample loadTestFileExample = new LoadTestFileExample(); + loadTestFileExample.createCriteria().andTestIdEqualTo(testId); + final List loadTestFiles = loadTestFileMapper.selectByExample(loadTestFileExample); + loadTestFileMapper.deleteByExample(loadTestFileExample); + + if (!CollectionUtils.isEmpty(loadTestFiles)) { + final List fileIds = loadTestFiles.stream().map(LoadTestFile::getFileId).collect(Collectors.toList()); + + FileMetadataExample fileMetadataExample = new FileMetadataExample(); + fileMetadataExample.createCriteria().andIdIn(fileIds); + fileMetadataMapper.deleteByExample(fileMetadataExample); + + FileContentExample fileContentExample = new FileContentExample(); + fileContentExample.createCriteria().andFileIdIn(fileIds); + fileContentMapper.deleteByExample(fileContentExample); + } + } } \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/service/LoadTestService.java b/backend/src/main/java/io/metersphere/service/LoadTestService.java index 1321f50824..2b4eee5787 100644 --- a/backend/src/main/java/io/metersphere/service/LoadTestService.java +++ b/backend/src/main/java/io/metersphere/service/LoadTestService.java @@ -7,6 +7,7 @@ import io.metersphere.commons.constants.LoadTestFileType; import io.metersphere.commons.exception.MSException; import io.metersphere.commons.utils.IOUtils; import io.metersphere.controller.request.testplan.DeleteTestPlanRequest; +import io.metersphere.controller.request.testplan.EditTestPlanRequest; import io.metersphere.controller.request.testplan.QueryTestPlanRequest; import io.metersphere.controller.request.testplan.SaveTestPlanRequest; import io.metersphere.dto.LoadTestDTO; @@ -38,6 +39,8 @@ public class LoadTestService { private FileContentMapper fileContentMapper; @Resource private LoadTestFileMapper loadTestFileMapper; + @Resource + private FileService fileService; // 测试,模拟数据 @PostConstruct @@ -66,10 +69,9 @@ public class LoadTestService { } public void delete(DeleteTestPlanRequest request) { - LoadTestExample loadTestExample = new LoadTestExample(); - loadTestExample.createCriteria().andIdEqualTo(request.getId()); + loadTestMapper.deleteByPrimaryKey(request.getId()); - loadTestMapper.deleteByExample(loadTestExample); + fileService.deleteFileByTestId(request.getId()); } public void save(SaveTestPlanRequest request, MultipartFile file) { @@ -111,7 +113,7 @@ public class LoadTestService { fileMetadataMapper.insert(fileMetadata); FileContent fileContent = new FileContent(); - fileContent.setId(fileMetadata.getId()); + fileContent.setFileId(fileMetadata.getId()); try { fileContent.setFile(IOUtils.toString(file.getInputStream(), StandardCharsets.UTF_8)); } catch (IOException e) { @@ -121,4 +123,28 @@ public class LoadTestService { return fileMetadata; } + + public void edit(EditTestPlanRequest request, MultipartFile file) { + // 新选择了一个文件,删除原来的文件 + if (file != null) { + fileService.deleteFileByTestId(request.getId()); + final FileMetadata fileMetadata = saveFile(file); + LoadTestFile loadTestFile = new LoadTestFile(); + loadTestFile.setTestId(request.getId()); + loadTestFile.setFileId(fileMetadata.getId()); + loadTestFileMapper.insert(loadTestFile); + } + + final LoadTestWithBLOBs loadTest = loadTestMapper.selectByPrimaryKey(request.getId()); + if (loadTest == null) { + MSException.throwException("无法编辑测试,未找到测试:" + request.getId()); + } else { + loadTest.setName(request.getName()); + loadTest.setProjectId(request.getProjectId()); + loadTest.setUpdateTime(System.currentTimeMillis()); + loadTest.setScenarioDefinition("todo"); + loadTest.setDescription("todo"); + loadTestMapper.updateByPrimaryKeySelective(loadTest); + } + } } diff --git a/frontend/src/performance/components/testPlan/CreateTestPlan.vue b/frontend/src/performance/components/testPlan/CreateTestPlan.vue index a0762166e5..dafc54bd10 100644 --- a/frontend/src/performance/components/testPlan/CreateTestPlan.vue +++ b/frontend/src/performance/components/testPlan/CreateTestPlan.vue @@ -20,13 +20,13 @@ - + - + - + @@ -50,6 +50,7 @@ testPlan: {}, listProjectPath: "/project/listAll", savePath: "/testplan/save", + editPath: "/testplan/edit", projects: [], active: '0', tabs: [{ @@ -77,9 +78,7 @@ listProjects() { this.$get(this.listProjectPath).then(response => { this.projects = response.data.data; - }).catch((response) => { - this.$message.error(response.message); - }); + }) }, save() { if (!this.validTestPlan()) { @@ -87,17 +86,22 @@ } let formData = new FormData(); + let url = this.testPlan.id ? this.editPath : this.savePath; - formData.append("file", this.testPlan.file); + if (!this.testPlan.file.id) { + formData.append("file", this.testPlan.file); + } // file属性不需要json化 - let requestJson = JSON.stringify(this.testPlan, function (key, value) {return key === "file" ? undefined : value}); + let requestJson = JSON.stringify(this.testPlan, function (key, value) { + return key === "file" ? undefined : value + }); formData.append('request', new Blob([requestJson], { type: "application/json" })); let options = { method: 'POST', - url: this.savePath, + url: url, data: formData, headers: { 'Content-Type': undefined @@ -127,10 +131,6 @@ cancel() { this.$router.push({path: '/'}) }, - changeTestPlan(updateFunc) { - updateFunc(this.testPlan); - window.console.log(this.testPlan); - }, validTestPlan() { if (!this.testPlan.name) { this.$message({ diff --git a/frontend/src/performance/components/testPlan/components/AdvancedConfig.vue b/frontend/src/performance/components/testPlan/components/AdvancedConfig.vue index 2a9d3e367c..31881bf302 100644 --- a/frontend/src/performance/components/testPlan/components/AdvancedConfig.vue +++ b/frontend/src/performance/components/testPlan/components/AdvancedConfig.vue @@ -5,7 +5,7 @@ @@ -17,14 +17,6 @@ } }, methods: { - testChange() { - this._changeTestPlan(function (testPlan) { - testPlan.advancedConfig = "2" - }) - }, - _changeTestPlan(updateTestPlanFunc) { - this.$emit('change-test-plan', updateTestPlanFunc); - }, } } diff --git a/frontend/src/performance/components/testPlan/components/BasicConfig.vue b/frontend/src/performance/components/testPlan/components/BasicConfig.vue index 8bae8d26d6..d6fc848c17 100644 --- a/frontend/src/performance/components/testPlan/components/BasicConfig.vue +++ b/frontend/src/performance/components/testPlan/components/BasicConfig.vue @@ -3,11 +3,12 @@
将文件拖到此处,或点击上传
@@ -54,16 +55,42 @@