From 99b46de258673f93b73511552cc64bbb4c21a7ba Mon Sep 17 00:00:00 2001 From: "Captain.B" Date: Tue, 2 Feb 2021 10:53:55 +0800 Subject: [PATCH 1/4] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=B8=8B=E8=BD=BD?= =?UTF-8?q?jtl=E8=BF=87=E5=A4=A7=E5=AF=BC=E8=87=B4oom=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/mapper/ext/ExtFileContentMapper.java | 15 ++++++++++ .../PerformanceReportController.java | 11 ++------ .../performance/service/ReportService.java | 28 +++++++++++++++++-- .../report/PerformanceReportView.vue | 4 +-- 4 files changed, 45 insertions(+), 13 deletions(-) create mode 100644 backend/src/main/java/io/metersphere/base/mapper/ext/ExtFileContentMapper.java diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtFileContentMapper.java b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtFileContentMapper.java new file mode 100644 index 0000000000..badbe41a23 --- /dev/null +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtFileContentMapper.java @@ -0,0 +1,15 @@ +package io.metersphere.base.mapper.ext; + +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.io.InputStream; + +public interface ExtFileContentMapper { + @Select(value = { + "SELECT file ", + "FROM file_content ", + "WHERE file_id = #{id, jdbcType=VARCHAR}" + }) + InputStream selectZipBytes(@Param("id") String id); +} diff --git a/backend/src/main/java/io/metersphere/performance/controller/PerformanceReportController.java b/backend/src/main/java/io/metersphere/performance/controller/PerformanceReportController.java index 828cd04e5a..5031c4e889 100644 --- a/backend/src/main/java/io/metersphere/performance/controller/PerformanceReportController.java +++ b/backend/src/main/java/io/metersphere/performance/controller/PerformanceReportController.java @@ -16,9 +16,6 @@ import io.metersphere.performance.controller.request.ReportRequest; import io.metersphere.performance.service.ReportService; import org.apache.shiro.authz.annotation.Logical; import org.apache.shiro.authz.annotation.RequiresRoles; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @@ -137,11 +134,7 @@ public class PerformanceReportController { } @GetMapping("/jtl/download/{reportId}") - public ResponseEntity downloadJtl(@PathVariable String reportId) { - byte[] bytes = reportService.downloadJtl(reportId); - return ResponseEntity.ok() - .contentType(MediaType.parseMediaType("application/octet-stream")) - .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + reportId + ".jtl\"") - .body(bytes); + public void downloadJtlZip(@PathVariable String reportId, HttpServletResponse response) { + reportService.downloadJtlZip(reportId, response); } } diff --git a/backend/src/main/java/io/metersphere/performance/service/ReportService.java b/backend/src/main/java/io/metersphere/performance/service/ReportService.java index f6e9d65882..d453cf6d1d 100644 --- a/backend/src/main/java/io/metersphere/performance/service/ReportService.java +++ b/backend/src/main/java/io/metersphere/performance/service/ReportService.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import io.metersphere.base.domain.*; import io.metersphere.base.mapper.*; +import io.metersphere.base.mapper.ext.ExtFileContentMapper; import io.metersphere.base.mapper.ext.ExtLoadTestReportMapper; import io.metersphere.commons.constants.PerformanceTestStatus; import io.metersphere.commons.constants.ReportKeys; @@ -23,11 +24,15 @@ import io.metersphere.performance.engine.EngineFactory; import io.metersphere.service.FileService; import io.metersphere.service.TestResourceService; import org.apache.commons.lang3.StringUtils; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; +import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; +import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; @@ -52,6 +57,8 @@ public class ReportService { private LoadTestReportDetailMapper loadTestReportDetailMapper; @Resource private FileService fileService; + @Resource + private SqlSessionFactory sqlSessionFactory; public List getRecentReportList(ReportRequest request) { List orders = new ArrayList<>(); @@ -284,11 +291,28 @@ public class ReportService { return JSON.parseArray(content, ChartsData.class); } - public byte[] downloadJtl(String reportId) { + /** + * 流下载 jtl zip + */ + public void downloadJtlZip(String reportId, HttpServletResponse response) { LoadTestReportWithBLOBs report = getReport(reportId); if (StringUtils.isBlank(report.getFileId())) { throw new RuntimeException(Translator.get("load_test_report_file_not_exist")); } - return fileService.loadFileAsBytes(report.getFileId()); + response.setHeader("Content-Disposition", "attachment;fileName=" + reportId + ".zip"); + try (SqlSession sqlSession = sqlSessionFactory.openSession()) { + ExtFileContentMapper mapper = sqlSession.getMapper(ExtFileContentMapper.class); + try (InputStream inputStream = mapper.selectZipBytes(report.getFileId())) { + ServletOutputStream outputStream = response.getOutputStream(); + byte[] buffer = new byte[1024 * 4]; + int read; + while ((read = inputStream.read(buffer)) > -1) { + outputStream.write(buffer, 0, read); + } + } catch (Exception e) { + LogUtil.error(e); + MSException.throwException(e); + } + } } } diff --git a/frontend/src/business/components/performance/report/PerformanceReportView.vue b/frontend/src/business/components/performance/report/PerformanceReportView.vue index 1257af30cd..13a512d91e 100644 --- a/frontend/src/business/components/performance/report/PerformanceReportView.vue +++ b/frontend/src/business/components/performance/report/PerformanceReportView.vue @@ -293,12 +293,12 @@ export default { }; this.result = this.$request(config).then(response => { const content = response.data; - const blob = new Blob([content]); + const blob = new Blob([content], {type: "application/octet-stream"}); if ("download" in document.createElement("a")) { // 非IE下载 // chrome/firefox let aTag = document.createElement('a'); - aTag.download = this.reportId + ".jtl"; + aTag.download = this.reportId + ".zip"; aTag.href = URL.createObjectURL(blob); aTag.click(); URL.revokeObjectURL(aTag.href) From c74c7867254862da429d38f7a31fe57ff78cb190 Mon Sep 17 00:00:00 2001 From: wenyann <64353056+wenyann@users.noreply.github.com> Date: Tue, 2 Feb 2021 11:10:56 +0800 Subject: [PATCH 2/4] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=AF=BC=E5=85=A5?= =?UTF-8?q?swagger=EF=BC=8C=E6=A8=A1=E5=BC=8F=E9=80=89=E6=8B=A9=E8=A6=86?= =?UTF-8?q?=E7=9B=96=EF=BC=8C=E6=97=A0=E6=B3=95=E7=BC=96=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/metersphere/api/service/ApiDefinitionService.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 50a4671755..66143cb04d 100644 --- a/backend/src/main/java/io/metersphere/api/service/ApiDefinitionService.java +++ b/backend/src/main/java/io/metersphere/api/service/ApiDefinitionService.java @@ -350,7 +350,8 @@ public class ApiDefinitionService { private String setImportHashTree(ApiDefinitionWithBLOBs apiDefinition) { String request = apiDefinition.getRequest(); MsHTTPSamplerProxy msHTTPSamplerProxy = JSONObject.parseObject(request, MsHTTPSamplerProxy.class); - msHTTPSamplerProxy.setHashTree(null); + msHTTPSamplerProxy.setId(apiDefinition.getId()); + msHTTPSamplerProxy.setHashTree(new LinkedList<>()); apiDefinition.setRequest(JSONObject.toJSONString(msHTTPSamplerProxy)); return request; } From 66e9f091c2bdfa34b93b0f7a6ab2724e034986a0 Mon Sep 17 00:00:00 2001 From: Coooder-X <55648333+Coooder-X@users.noreply.github.com> Date: Tue, 2 Feb 2021 11:01:49 +0800 Subject: [PATCH 3/4] =?UTF-8?q?fix:=20=E8=A7=A3=E5=86=B3=20=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E8=87=AA=E5=8A=A8=E5=8C=96-=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=9C=BA=E6=99=AF=E5=8F=98=E9=87=8F=EF=BC=8C=E7=84=A6=E7=82=B9?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E5=88=87=E6=8D=A2=20(#1342)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/automation/scenario/variable/EditConstant.vue | 5 ----- 1 file changed, 5 deletions(-) diff --git a/frontend/src/business/components/api/automation/scenario/variable/EditConstant.vue b/frontend/src/business/components/api/automation/scenario/variable/EditConstant.vue index 81421a1bbc..23f3a945db 100644 --- a/frontend/src/business/components/api/automation/scenario/variable/EditConstant.vue +++ b/frontend/src/business/components/api/automation/scenario/variable/EditConstant.vue @@ -30,11 +30,6 @@ this.$refs.nameInput.focus(); }); }, - watch: { - editData() { - this.$refs.nameInput.focus(); - } - } } From f84f5fbbb35c76e0bfbfa6a7f2aa59b95800d730 Mon Sep 17 00:00:00 2001 From: chenjianxing Date: Tue, 2 Feb 2021 12:06:16 +0800 Subject: [PATCH 4/4] =?UTF-8?q?refactor:=20=E6=BB=9A=E5=8A=A8=E6=9D=A1?= =?UTF-8?q?=E5=8A=A0=E7=B2=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/definition/components/module/ApiModuleHeader.vue | 2 +- frontend/src/common/css/main.css | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/src/business/components/api/definition/components/module/ApiModuleHeader.vue b/frontend/src/business/components/api/definition/components/module/ApiModuleHeader.vue index be32a14310..404ad12629 100644 --- a/frontend/src/business/components/api/definition/components/module/ApiModuleHeader.vue +++ b/frontend/src/business/components/api/definition/components/module/ApiModuleHeader.vue @@ -145,7 +145,7 @@ export default { } .filter-input { - width: 175px; + width: 174px; padding-left: 3px; } diff --git a/frontend/src/common/css/main.css b/frontend/src/common/css/main.css index 02f89454da..6cffe9887d 100644 --- a/frontend/src/common/css/main.css +++ b/frontend/src/common/css/main.css @@ -122,8 +122,8 @@ html,body { /* 滚动条样式 */ ::-webkit-scrollbar{ - width: 5px; - height: 5px; + width: 10px; + height: 10px; position: fixed; } ::-webkit-scrollbar-thumb{