diff --git a/backend/src/main/java/io/metersphere/api/controller/APIReportController.java b/backend/src/main/java/io/metersphere/api/controller/APIReportController.java index 8ad8af9d20..5f41294711 100644 --- a/backend/src/main/java/io/metersphere/api/controller/APIReportController.java +++ b/backend/src/main/java/io/metersphere/api/controller/APIReportController.java @@ -11,7 +11,7 @@ import io.metersphere.commons.utils.PageUtils; import io.metersphere.commons.utils.Pager; import io.metersphere.commons.utils.SessionUtils; import io.metersphere.dto.DashboardTestDTO; -import io.metersphere.service.CheckOwnerService; +import io.metersphere.service.CheckPermissionService; import org.apache.shiro.authz.annotation.Logical; import org.apache.shiro.authz.annotation.RequiresRoles; import org.springframework.web.bind.annotation.*; @@ -27,7 +27,7 @@ public class APIReportController { @Resource private APIReportService apiReportService; @Resource - private CheckOwnerService checkOwnerService; + private CheckPermissionService checkPermissionService; @GetMapping("recent/{count}") public List recentTest(@PathVariable int count) { @@ -41,7 +41,7 @@ public class APIReportController { @GetMapping("/list/{testId}/{goPage}/{pageSize}") public Pager> listByTestId(@PathVariable String testId, @PathVariable int goPage, @PathVariable int pageSize) { - checkOwnerService.checkApiTestOwner(testId); + checkPermissionService.checkApiTestOwner(testId); Page page = PageHelper.startPage(goPage, pageSize, true); return PageUtils.setPageInfo(page, apiReportService.listByTestId(testId)); diff --git a/backend/src/main/java/io/metersphere/api/controller/APITestController.java b/backend/src/main/java/io/metersphere/api/controller/APITestController.java index ba511fa454..21150523d3 100644 --- a/backend/src/main/java/io/metersphere/api/controller/APITestController.java +++ b/backend/src/main/java/io/metersphere/api/controller/APITestController.java @@ -15,11 +15,13 @@ import io.metersphere.base.domain.ApiTest; import io.metersphere.base.domain.Schedule; import io.metersphere.commons.constants.RoleConstants; import io.metersphere.commons.constants.ScheduleGroup; -import io.metersphere.commons.utils.*; +import io.metersphere.commons.utils.CronUtils; +import io.metersphere.commons.utils.PageUtils; +import io.metersphere.commons.utils.Pager; +import io.metersphere.commons.utils.SessionUtils; import io.metersphere.controller.request.QueryScheduleRequest; import io.metersphere.dto.ScheduleDao; -import io.metersphere.service.CheckOwnerService; - +import io.metersphere.service.CheckPermissionService; import io.metersphere.service.ScheduleService; import org.apache.shiro.authz.annotation.Logical; import org.apache.shiro.authz.annotation.RequiresRoles; @@ -27,7 +29,6 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; - import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Date; @@ -46,7 +47,7 @@ public class APITestController { @Resource private ApiDefinitionService apiDefinitionService; @Resource - private CheckOwnerService checkownerService; + private CheckPermissionService checkownerService; @Resource private ApiTestCaseService apiTestCaseService; @Resource diff --git a/backend/src/main/java/io/metersphere/api/controller/ApiDefinitionController.java b/backend/src/main/java/io/metersphere/api/controller/ApiDefinitionController.java index 23a7a8c2b5..2fe060e97f 100644 --- a/backend/src/main/java/io/metersphere/api/controller/ApiDefinitionController.java +++ b/backend/src/main/java/io/metersphere/api/controller/ApiDefinitionController.java @@ -14,6 +14,7 @@ import io.metersphere.commons.constants.RoleConstants; import io.metersphere.commons.utils.PageUtils; import io.metersphere.commons.utils.Pager; import io.metersphere.commons.utils.SessionUtils; +import io.metersphere.service.CheckPermissionService; import io.metersphere.track.request.testcase.ApiCaseRelevanceRequest; import org.apache.shiro.authz.annotation.Logical; import org.apache.shiro.authz.annotation.RequiresRoles; @@ -30,6 +31,8 @@ import java.util.List; public class ApiDefinitionController { @Resource private ApiDefinitionService apiDefinitionService; + @Resource + private CheckPermissionService checkPermissionService; @PostMapping("/list/{goPage}/{pageSize}") public Pager> list(@PathVariable int goPage, @PathVariable int pageSize, @RequestBody ApiDefinitionRequest request) { @@ -41,18 +44,21 @@ public class ApiDefinitionController { @PostMapping(value = "/create", consumes = {"multipart/form-data"}) @RequiresRoles(value = {RoleConstants.TEST_MANAGER, RoleConstants.TEST_USER}, logical = Logical.OR) public void create(@RequestPart("request") SaveApiDefinitionRequest request, @RequestPart(value = "files") List bodyFiles) { + checkPermissionService.checkReadOnlyUser(); apiDefinitionService.create(request, bodyFiles); } @PostMapping(value = "/update", consumes = {"multipart/form-data"}) @RequiresRoles(value = {RoleConstants.TEST_MANAGER, RoleConstants.TEST_USER}, logical = Logical.OR) public void update(@RequestPart("request") SaveApiDefinitionRequest request, @RequestPart(value = "files") List bodyFiles) { + checkPermissionService.checkReadOnlyUser(); apiDefinitionService.update(request, bodyFiles); } @GetMapping("/delete/{id}") @RequiresRoles(value = {RoleConstants.TEST_MANAGER, RoleConstants.TEST_USER}, logical = Logical.OR) public void delete(@PathVariable String id) { + checkPermissionService.checkReadOnlyUser(); apiDefinitionService.delete(id); } diff --git a/backend/src/main/java/io/metersphere/api/controller/ApiModuleController.java b/backend/src/main/java/io/metersphere/api/controller/ApiModuleController.java index 9730e9cd86..69742559ef 100644 --- a/backend/src/main/java/io/metersphere/api/controller/ApiModuleController.java +++ b/backend/src/main/java/io/metersphere/api/controller/ApiModuleController.java @@ -5,7 +5,7 @@ import io.metersphere.api.dto.definition.DragModuleRequest; import io.metersphere.api.service.ApiModuleService; import io.metersphere.base.domain.ApiModule; import io.metersphere.commons.constants.RoleConstants; -import io.metersphere.service.CheckOwnerService; +import io.metersphere.service.CheckPermissionService; import org.apache.shiro.authz.annotation.Logical; import org.apache.shiro.authz.annotation.RequiresRoles; import org.springframework.web.bind.annotation.*; @@ -21,17 +21,17 @@ public class ApiModuleController { @Resource ApiModuleService apiModuleService; @Resource - private CheckOwnerService checkOwnerService; + private CheckPermissionService checkPermissionService; @GetMapping("/list/{projectId}/{protocol}") public List getNodeByProjectId(@PathVariable String projectId,@PathVariable String protocol) { - checkOwnerService.checkProjectOwner(projectId); + checkPermissionService.checkProjectOwner(projectId); return apiModuleService.getNodeTreeByProjectId(projectId,protocol); } @GetMapping("/list/plan/{planId}/{protocol}") public List getNodeByPlanId(@PathVariable String planId, @PathVariable String protocol) { - checkOwnerService.checkTestPlanOwner(planId); + checkPermissionService.checkTestPlanOwner(planId); return apiModuleService.getNodeByPlanId(planId, protocol); } diff --git a/backend/src/main/java/io/metersphere/api/controller/ApiScenarioModuleController.java b/backend/src/main/java/io/metersphere/api/controller/ApiScenarioModuleController.java index b51bc9aa4e..abcd2d86a5 100644 --- a/backend/src/main/java/io/metersphere/api/controller/ApiScenarioModuleController.java +++ b/backend/src/main/java/io/metersphere/api/controller/ApiScenarioModuleController.java @@ -5,14 +5,13 @@ import io.metersphere.api.dto.automation.DragApiScenarioModuleRequest; import io.metersphere.api.service.ApiScenarioModuleService; import io.metersphere.base.domain.ApiScenarioModule; import io.metersphere.commons.constants.RoleConstants; -import io.metersphere.service.CheckOwnerService; +import io.metersphere.service.CheckPermissionService; import org.apache.shiro.authz.annotation.Logical; import org.apache.shiro.authz.annotation.RequiresRoles; import org.springframework.web.bind.annotation.*; -import java.util.List; - import javax.annotation.Resource; +import java.util.List; @RequestMapping("/api/automation/module") @RestController @@ -22,11 +21,11 @@ public class ApiScenarioModuleController { @Resource ApiScenarioModuleService apiScenarioModuleService; @Resource - private CheckOwnerService checkOwnerService; + private CheckPermissionService checkPermissionService; @GetMapping("/list/{projectId}") public List getNodeByProjectId(@PathVariable String projectId) { - checkOwnerService.checkProjectOwner(projectId); + checkPermissionService.checkProjectOwner(projectId); return apiScenarioModuleService.getNodeTreeByProjectId(projectId); } @@ -44,7 +43,7 @@ public class ApiScenarioModuleController { @GetMapping("/list/plan/{planId}") public List getNodeByPlanId(@PathVariable String planId) { - checkOwnerService.checkTestPlanOwner(planId); + checkPermissionService.checkTestPlanOwner(planId); return apiScenarioModuleService.getNodeByPlanId(planId); } diff --git a/backend/src/main/java/io/metersphere/api/controller/ApiTestEnvironmentController.java b/backend/src/main/java/io/metersphere/api/controller/ApiTestEnvironmentController.java index ae274c383e..87d6e618ce 100644 --- a/backend/src/main/java/io/metersphere/api/controller/ApiTestEnvironmentController.java +++ b/backend/src/main/java/io/metersphere/api/controller/ApiTestEnvironmentController.java @@ -3,7 +3,7 @@ package io.metersphere.api.controller; import io.metersphere.api.service.ApiTestEnvironmentService; import io.metersphere.base.domain.ApiTestEnvironmentWithBLOBs; import io.metersphere.commons.constants.RoleConstants; -import io.metersphere.service.CheckOwnerService; +import io.metersphere.service.CheckPermissionService; import org.apache.shiro.authz.annotation.Logical; import org.apache.shiro.authz.annotation.RequiresRoles; import org.springframework.web.bind.annotation.*; @@ -19,11 +19,11 @@ public class ApiTestEnvironmentController { @Resource ApiTestEnvironmentService apiTestEnvironmentService; @Resource - private CheckOwnerService checkOwnerService; + private CheckPermissionService checkPermissionService; @GetMapping("/list/{projectId}") public List list(@PathVariable String projectId) { - checkOwnerService.checkProjectOwner(projectId); + checkPermissionService.checkProjectOwner(projectId); return apiTestEnvironmentService.list(projectId); } diff --git a/backend/src/main/java/io/metersphere/api/dto/definition/RunDefinitionRequest.java b/backend/src/main/java/io/metersphere/api/dto/definition/RunDefinitionRequest.java index 592e9ad0c9..b329cfcffa 100644 --- a/backend/src/main/java/io/metersphere/api/dto/definition/RunDefinitionRequest.java +++ b/backend/src/main/java/io/metersphere/api/dto/definition/RunDefinitionRequest.java @@ -15,6 +15,8 @@ public class RunDefinitionRequest { private String reportId; + private String name; + private String type; private String projectId; 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 1786eca223..de84c2c899 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 @@ -119,9 +119,15 @@ public class MsHTTPSamplerProxy extends MsTestElement { sampler.setPort(config.getConfig().getHttpConfig().getPort()); sampler.setProtocol(config.getConfig().getHttpConfig().getProtocol()); url = config.getConfig().getHttpConfig().getProtocol() + "://" + config.getConfig().getHttpConfig().getSocket(); + // 补充如果是完整URL 则用自身URL + boolean isUrl = false; + if (StringUtils.isNotEmpty(this.getUrl()) && isURL(this.getUrl())) { + url = this.getUrl(); + isUrl = true; + } URL urlObject = new URL(url); String envPath = StringUtils.equals(urlObject.getPath(), "/") ? "" : urlObject.getPath(); - if (StringUtils.isNotBlank(this.getPath())) { + if (StringUtils.isNotBlank(this.getPath()) && !isUrl) { envPath += this.getPath(); } if (CollectionUtils.isNotEmpty(this.getRest()) && this.isRest()) { @@ -243,6 +249,15 @@ public class MsHTTPSamplerProxy extends MsTestElement { tree.add(headerManager); } + public boolean isURL(String str) { + //转换为小写 + try { + new URL(str); + return true; + } catch (Exception e) { + return false; + } + } private boolean isRest() { return this.getRest().stream().filter(KeyValue::isEnable).filter(KeyValue::isValid).toArray().length > 0; 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 fc0e0f7fa3..7ba26ee3d1 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 @@ -98,11 +98,14 @@ public class Body { return StringUtils.equals(type, XML); } - public boolean isWwwFROM() { - return StringUtils.equals(type, WWW_FROM); + public void initKvs() { + this.kvs = new ArrayList<>(); + this.kvs.add(new KeyValue()); } - public boolean isFromData() { - return StringUtils.equals(type, FORM_DATA); + public void initBinary() { + this.binary = new ArrayList<>(); + this.binary.add(new KeyValue()); } + } diff --git a/backend/src/main/java/io/metersphere/api/dto/scenario/KeyValue.java b/backend/src/main/java/io/metersphere/api/dto/scenario/KeyValue.java index 25a9e982a1..328517e501 100644 --- a/backend/src/main/java/io/metersphere/api/dto/scenario/KeyValue.java +++ b/backend/src/main/java/io/metersphere/api/dto/scenario/KeyValue.java @@ -15,7 +15,7 @@ public class KeyValue { private List files; private String description; private String contentType; - private boolean enable; + private boolean enable = true; private boolean encode = true; private boolean required; diff --git a/backend/src/main/java/io/metersphere/api/parse/ApiImportAbstractParser.java b/backend/src/main/java/io/metersphere/api/parse/ApiImportAbstractParser.java index e455e98637..4b80284658 100644 --- a/backend/src/main/java/io/metersphere/api/parse/ApiImportAbstractParser.java +++ b/backend/src/main/java/io/metersphere/api/parse/ApiImportAbstractParser.java @@ -20,6 +20,7 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.net.URL; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; @@ -72,7 +73,7 @@ public abstract class ApiImportAbstractParser implements ApiImportParser { protected ApiDefinitionResult buildApiDefinition(String id, String name, String path, String method) { ApiDefinitionResult apiDefinition = new ApiDefinitionResult(); apiDefinition.setName(name); - apiDefinition.setPath(path); + apiDefinition.setPath(formatPath(path)); apiDefinition.setProtocol(RequestType.HTTP); apiDefinition.setMethod(method); apiDefinition.setId(id); @@ -81,17 +82,34 @@ public abstract class ApiImportAbstractParser implements ApiImportParser { return apiDefinition; } + private String formatPath(String url) { + try { + URL urlObject = new URL(url); + StringBuffer pathBuffer = new StringBuffer(urlObject.getPath()); + if (StringUtils.isNotEmpty(urlObject.getQuery())) { + pathBuffer.append("?").append(urlObject.getQuery()); + } + return pathBuffer.toString(); + } catch (Exception ex) { + return url; + } + } + protected MsHTTPSamplerProxy buildRequest(String name, String path, String method) { MsHTTPSamplerProxy request = new MsHTTPSamplerProxy(); request.setName(name); - request.setPath(path); + // 路径去掉域名/IP 地址,保留方法名称及参数 + request.setPath(formatPath(path)); request.setMethod(method); request.setProtocol(RequestType.HTTP); request.setId(UUID.randomUUID().toString()); request.setHeaders(new ArrayList<>()); request.setArguments(new ArrayList<>()); request.setRest(new ArrayList<>()); - request.setBody(new Body()); + Body body = new Body(); + body.initKvs(); + body.initBinary(); + request.setBody(body); return request; } 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 4d14e5a803..156e72c66c 100644 --- a/backend/src/main/java/io/metersphere/api/service/ApiAutomationService.java +++ b/backend/src/main/java/io/metersphere/api/service/ApiAutomationService.java @@ -289,6 +289,7 @@ public class ApiAutomationService { }); scenario.setVariables(variables); } + group.setEnableCookieShare(scenario.isEnableCookieShare()); LinkedList scenarios = new LinkedList<>(); scenarios.add(scenario); group.setHashTree(scenarios); diff --git a/backend/src/main/java/io/metersphere/api/service/ApiScenarioReportService.java b/backend/src/main/java/io/metersphere/api/service/ApiScenarioReportService.java index 907b610bb0..5275448ee0 100644 --- a/backend/src/main/java/io/metersphere/api/service/ApiScenarioReportService.java +++ b/backend/src/main/java/io/metersphere/api/service/ApiScenarioReportService.java @@ -16,10 +16,13 @@ import io.metersphere.base.mapper.TestPlanApiScenarioMapper; import io.metersphere.base.mapper.ext.ExtApiScenarioReportMapper; 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.DateUtils; +import io.metersphere.commons.utils.LogUtil; import io.metersphere.commons.utils.ServiceUtils; import io.metersphere.i18n.Translator; +import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -28,10 +31,7 @@ import sun.security.util.Cache; import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.text.DecimalFormat; -import java.util.Date; -import java.util.List; -import java.util.Map; -import java.util.UUID; +import java.util.*; @Service @Transactional(rollbackFor = Exception.class) @@ -55,6 +55,13 @@ public class ApiScenarioReportService { MSException.throwException(Translator.get("api_report_is_null")); } APIScenarioReportResult report = (APIScenarioReportResult) obj; + if (CollectionUtils.isNotEmpty(result.getScenarios())) { + try { + report.setName(result.getScenarios().get(0).getName() + "-" + DateUtils.getTimeString(System.currentTimeMillis())); + } catch (Exception e) { + LogUtil.error(e.getMessage()); + } + } // report detail ApiScenarioReportDetail detail = new ApiScenarioReportDetail(); detail.setReportId(result.getTestId()); @@ -72,7 +79,9 @@ public class ApiScenarioReportService { } report.setContent(new String(detail.getContent(), StandardCharsets.UTF_8)); this.save(report, runMode); - cache.put(report.getId(), report); + if (!report.getTriggerMode().equals(ReportTriggerMode.SCHEDULE.name())) { + cache.put(report.getId(), report); + } } /** diff --git a/backend/src/main/java/io/metersphere/controller/ProjectController.java b/backend/src/main/java/io/metersphere/controller/ProjectController.java index 2ce466d0d9..edf0d20024 100644 --- a/backend/src/main/java/io/metersphere/controller/ProjectController.java +++ b/backend/src/main/java/io/metersphere/controller/ProjectController.java @@ -9,7 +9,7 @@ import io.metersphere.commons.utils.Pager; import io.metersphere.commons.utils.SessionUtils; import io.metersphere.controller.request.ProjectRequest; import io.metersphere.dto.ProjectDTO; -import io.metersphere.service.CheckOwnerService; +import io.metersphere.service.CheckPermissionService; import io.metersphere.service.ProjectService; import org.apache.shiro.authz.annotation.Logical; import org.apache.shiro.authz.annotation.RequiresRoles; @@ -24,7 +24,7 @@ public class ProjectController { @Resource private ProjectService projectService; @Resource - private CheckOwnerService checkOwnerService; + private CheckPermissionService checkPermissionService; @GetMapping("/listAll") public List listAll() { @@ -74,7 +74,7 @@ public class ProjectController { @GetMapping("/delete/{projectId}") @RequiresRoles(value = {RoleConstants.TEST_MANAGER, RoleConstants.TEST_USER,}, logical = Logical.OR) public void deleteProject(@PathVariable(value = "projectId") String projectId) { - checkOwnerService.checkProjectOwner(projectId); + checkPermissionService.checkProjectOwner(projectId); projectService.deleteProject(projectId); } diff --git a/backend/src/main/java/io/metersphere/job/sechedule/ApiScenarioTestJob.java b/backend/src/main/java/io/metersphere/job/sechedule/ApiScenarioTestJob.java index 42e8b70f81..cb6be7bdaa 100644 --- a/backend/src/main/java/io/metersphere/job/sechedule/ApiScenarioTestJob.java +++ b/backend/src/main/java/io/metersphere/job/sechedule/ApiScenarioTestJob.java @@ -1,9 +1,7 @@ package io.metersphere.job.sechedule; -import io.metersphere.api.dto.SaveAPITestRequest; import io.metersphere.api.dto.automation.ExecuteType; import io.metersphere.api.dto.automation.RunScenarioRequest; -import io.metersphere.api.service.APITestService; import io.metersphere.api.service.ApiAutomationService; import io.metersphere.commons.constants.ReportTriggerMode; import io.metersphere.commons.constants.ScheduleGroup; @@ -56,7 +54,7 @@ public class ApiScenarioTestJob extends MsScheduleJob { request.setId(id); request.setReportId(id); request.setProjectId(projectID); - request.setTriggerMode(ReportTriggerMode.MANUAL.name()); + request.setTriggerMode(ReportTriggerMode.SCHEDULE.name()); request.setExecuteType(ExecuteType.Completed.name()); request.setScenarioIds(this.scenarioIds); request.setReportUserID(this.userId); diff --git a/backend/src/main/java/io/metersphere/performance/controller/PerformanceTestController.java b/backend/src/main/java/io/metersphere/performance/controller/PerformanceTestController.java index 9f49ebdacc..893ece5c87 100644 --- a/backend/src/main/java/io/metersphere/performance/controller/PerformanceTestController.java +++ b/backend/src/main/java/io/metersphere/performance/controller/PerformanceTestController.java @@ -14,7 +14,7 @@ import io.metersphere.dto.DashboardTestDTO; import io.metersphere.dto.LoadTestDTO; import io.metersphere.dto.ScheduleDao; import io.metersphere.performance.service.PerformanceTestService; -import io.metersphere.service.CheckOwnerService; +import io.metersphere.service.CheckPermissionService; import io.metersphere.service.FileService; import io.metersphere.track.request.testplan.*; import org.apache.shiro.authz.annotation.Logical; @@ -37,7 +37,7 @@ public class PerformanceTestController { @Resource private FileService fileService; @Resource - private CheckOwnerService checkOwnerService; + private CheckPermissionService checkPermissionService; @GetMapping("recent/{count}") public List recentTestPlans(@PathVariable int count) { @@ -59,14 +59,14 @@ public class PerformanceTestController { @GetMapping("/list/{projectId}") public List list(@PathVariable String projectId) { - checkOwnerService.checkProjectOwner(projectId); + checkPermissionService.checkProjectOwner(projectId); return performanceTestService.getLoadTestByProjectId(projectId); } @GetMapping("/state/get/{testId}") public LoadTest listByTestId(@PathVariable String testId) { - checkOwnerService.checkPerformanceTestOwner(testId); + checkPermissionService.checkPerformanceTestOwner(testId); return performanceTestService.getLoadTestBytestId(testId); } @@ -75,6 +75,7 @@ public class PerformanceTestController { @RequestPart("request") SaveTestPlanRequest request, @RequestPart(value = "file") List files ) { + checkPermissionService.checkReadOnlyUser(); return performanceTestService.save(request, files); } @@ -83,37 +84,39 @@ public class PerformanceTestController { @RequestPart("request") EditTestPlanRequest request, @RequestPart(value = "file", required = false) List files ) { - checkOwnerService.checkPerformanceTestOwner(request.getId()); + checkPermissionService.checkReadOnlyUser(); + checkPermissionService.checkPerformanceTestOwner(request.getId()); return performanceTestService.edit(request, files); } @GetMapping("/get/{testId}") public LoadTestDTO get(@PathVariable String testId) { - checkOwnerService.checkPerformanceTestOwner(testId); + checkPermissionService.checkPerformanceTestOwner(testId); return performanceTestService.get(testId); } @GetMapping("/get-advanced-config/{testId}") public String getAdvancedConfiguration(@PathVariable String testId) { - checkOwnerService.checkPerformanceTestOwner(testId); + checkPermissionService.checkPerformanceTestOwner(testId); return performanceTestService.getAdvancedConfiguration(testId); } @GetMapping("/get-load-config/{testId}") public String getLoadConfiguration(@PathVariable String testId) { - checkOwnerService.checkPerformanceTestOwner(testId); + checkPermissionService.checkPerformanceTestOwner(testId); return performanceTestService.getLoadConfiguration(testId); } @GetMapping("/get-jmx-content/{testId}") public String getJmxContent(@PathVariable String testId) { - checkOwnerService.checkPerformanceTestOwner(testId); + checkPermissionService.checkPerformanceTestOwner(testId); return performanceTestService.getJmxContent(testId); } @PostMapping("/delete") public void delete(@RequestBody DeleteTestPlanRequest request) { - checkOwnerService.checkPerformanceTestOwner(request.getId()); + checkPermissionService.checkReadOnlyUser(); + checkPermissionService.checkPerformanceTestOwner(request.getId()); performanceTestService.delete(request); } @@ -129,7 +132,7 @@ public class PerformanceTestController { @GetMapping("/file/metadata/{testId}") public List getFileMetadata(@PathVariable String testId) { - checkOwnerService.checkPerformanceTestOwner(testId); + checkPermissionService.checkPerformanceTestOwner(testId); return fileService.getFileMetadataByTestId(testId); } diff --git a/backend/src/main/java/io/metersphere/service/CheckOwnerService.java b/backend/src/main/java/io/metersphere/service/CheckPermissionService.java similarity index 76% rename from backend/src/main/java/io/metersphere/service/CheckOwnerService.java rename to backend/src/main/java/io/metersphere/service/CheckPermissionService.java index 84a100406a..cf7d210370 100644 --- a/backend/src/main/java/io/metersphere/service/CheckOwnerService.java +++ b/backend/src/main/java/io/metersphere/service/CheckPermissionService.java @@ -9,7 +9,6 @@ import io.metersphere.commons.utils.SessionUtils; import io.metersphere.i18n.Translator; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.shiro.authz.UnauthorizedException; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -18,7 +17,7 @@ import java.util.Set; import java.util.stream.Collectors; @Service -public class CheckOwnerService { +public class CheckPermissionService { @Resource private ProjectMapper projectMapper; @Resource @@ -32,6 +31,20 @@ public class CheckOwnerService { @Resource private ExtTestCaseReviewMapper extTestCaseReviewMapper; + + public void checkReadOnlyUser() { + String currentWorkspaceId = SessionUtils.getCurrentWorkspaceId(); + Set collect = Objects.requireNonNull(SessionUtils.getUser()).getUserRoles().stream() + .filter(ur -> + StringUtils.equals(ur.getRoleId(), RoleConstants.TEST_VIEWER)) + .map(UserRole::getSourceId) + .filter(sourceId -> StringUtils.equals(currentWorkspaceId, sourceId)) + .collect(Collectors.toSet()); + if (CollectionUtils.isNotEmpty(collect)) { + throw new RuntimeException(Translator.get("check_owner_read_only")); + } + } + public void checkProjectOwner(String projectId) { Set workspaceIds = getUserRelatedWorkspaceIds(); Project project = projectMapper.selectByPrimaryKey(projectId); @@ -42,7 +55,7 @@ public class CheckOwnerService { return; } if (!workspaceIds.contains(project.getWorkspaceId())) { - throw new UnauthorizedException(Translator.get("check_owner_project")); + throw new RuntimeException(Translator.get("check_owner_project")); } } @@ -67,7 +80,7 @@ public class CheckOwnerService { int result = extApiTestMapper.checkApiTestOwner(testId, workspaceIds); if (result == 0) { - throw new UnauthorizedException(Translator.get("check_owner_test")); + throw new RuntimeException(Translator.get("check_owner_test")); } } @@ -83,7 +96,7 @@ public class CheckOwnerService { int result = extLoadTestMapper.checkLoadTestOwner(testId, workspaceIds); if (result == 0) { - throw new UnauthorizedException(Translator.get("check_owner_test")); + throw new RuntimeException(Translator.get("check_owner_test")); } } @@ -95,7 +108,7 @@ public class CheckOwnerService { int result = extTestCaseMapper.checkIsHave(caseId, workspaceIds); if (result == 0) { - throw new UnauthorizedException(Translator.get("check_owner_case")); + throw new RuntimeException(Translator.get("check_owner_case")); } } @@ -106,7 +119,7 @@ public class CheckOwnerService { } int result = extTestPlanMapper.checkIsHave(planId, workspaceIds); if (result == 0) { - throw new UnauthorizedException(Translator.get("check_owner_plan")); + throw new RuntimeException(Translator.get("check_owner_plan")); } } @@ -117,7 +130,7 @@ public class CheckOwnerService { } int result = extTestCaseReviewMapper.checkIsHave(reviewId, workspaceIds); if (result == 0) { - throw new UnauthorizedException(Translator.get("check_owner_review")); + throw new RuntimeException(Translator.get("check_owner_review")); } } } diff --git a/backend/src/main/java/io/metersphere/track/controller/TestCaseController.java b/backend/src/main/java/io/metersphere/track/controller/TestCaseController.java index 5a5643202d..e87d9cd916 100644 --- a/backend/src/main/java/io/metersphere/track/controller/TestCaseController.java +++ b/backend/src/main/java/io/metersphere/track/controller/TestCaseController.java @@ -11,7 +11,7 @@ import io.metersphere.commons.utils.PageUtils; import io.metersphere.commons.utils.Pager; import io.metersphere.commons.utils.SessionUtils; import io.metersphere.excel.domain.ExcelResponse; -import io.metersphere.service.CheckOwnerService; +import io.metersphere.service.CheckPermissionService; import io.metersphere.service.FileService; import io.metersphere.track.dto.TestCaseDTO; import io.metersphere.track.request.testcase.EditTestCaseRequest; @@ -39,7 +39,7 @@ public class TestCaseController { @Resource TestCaseService testCaseService; @Resource - private CheckOwnerService checkOwnerService; + private CheckPermissionService checkPermissionService; @Resource private FileService fileService; @@ -51,7 +51,7 @@ public class TestCaseController { @GetMapping("/list/{projectId}") public List list(@PathVariable String projectId) { - checkOwnerService.checkProjectOwner(projectId); + checkPermissionService.checkProjectOwner(projectId); QueryTestCaseRequest request = new QueryTestCaseRequest(); request.setProjectId(projectId); return testCaseService.listTestCase(request); @@ -94,13 +94,13 @@ public class TestCaseController { @GetMapping("/get/{testCaseId}") public TestCaseWithBLOBs getTestCase(@PathVariable String testCaseId) { - checkOwnerService.checkTestCaseOwner(testCaseId); + checkPermissionService.checkTestCaseOwner(testCaseId); return testCaseService.getTestCase(testCaseId); } @GetMapping("/project/{testCaseId}") public Project getProjectByTestCaseId(@PathVariable String testCaseId) { - checkOwnerService.checkTestCaseOwner(testCaseId); + checkPermissionService.checkTestCaseOwner(testCaseId); return testCaseService.getProjectByTestCaseId(testCaseId); } @@ -119,14 +119,14 @@ public class TestCaseController { @PostMapping("/delete/{testCaseId}") @RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR) public int deleteTestCase(@PathVariable String testCaseId) { - checkOwnerService.checkTestCaseOwner(testCaseId); + checkPermissionService.checkTestCaseOwner(testCaseId); return testCaseService.deleteTestCase(testCaseId); } @PostMapping("/import/{projectId}/{userId}") @RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR) public ExcelResponse testCaseImport(MultipartFile file, @PathVariable String projectId, @PathVariable String userId) { - checkOwnerService.checkProjectOwner(projectId); + checkPermissionService.checkProjectOwner(projectId); return testCaseService.testCaseImport(file, projectId, userId); } diff --git a/backend/src/main/java/io/metersphere/track/controller/TestCaseNodeController.java b/backend/src/main/java/io/metersphere/track/controller/TestCaseNodeController.java index 0a7f52ee72..e651e58aee 100644 --- a/backend/src/main/java/io/metersphere/track/controller/TestCaseNodeController.java +++ b/backend/src/main/java/io/metersphere/track/controller/TestCaseNodeController.java @@ -2,7 +2,7 @@ package io.metersphere.track.controller; import io.metersphere.base.domain.TestCaseNode; import io.metersphere.commons.constants.RoleConstants; -import io.metersphere.service.CheckOwnerService; +import io.metersphere.service.CheckPermissionService; import io.metersphere.track.dto.TestCaseNodeDTO; import io.metersphere.track.request.testcase.DragNodeRequest; import io.metersphere.track.request.testcase.QueryNodeRequest; @@ -22,11 +22,11 @@ public class TestCaseNodeController { @Resource TestCaseNodeService testCaseNodeService; @Resource - private CheckOwnerService checkOwnerService; + private CheckPermissionService checkPermissionService; @GetMapping("/list/{projectId}") public List getNodeByProjectId(@PathVariable String projectId) { - checkOwnerService.checkProjectOwner(projectId); + checkPermissionService.checkProjectOwner(projectId); return testCaseNodeService.getNodeTreeByProjectId(projectId); } @@ -43,13 +43,13 @@ public class TestCaseNodeController { @GetMapping("/list/plan/{planId}") public List getNodeByPlanId(@PathVariable String planId) { - checkOwnerService.checkTestPlanOwner(planId); + checkPermissionService.checkTestPlanOwner(planId); return testCaseNodeService.getNodeByPlanId(planId); } @GetMapping("/list/review/{reviewId}") public List getNodeByReviewId(@PathVariable String reviewId) { - checkOwnerService.checkTestReviewOwner(reviewId); + checkPermissionService.checkTestReviewOwner(reviewId); return testCaseNodeService.getNodeByReviewId(reviewId); } diff --git a/backend/src/main/java/io/metersphere/track/controller/TestCaseReviewController.java b/backend/src/main/java/io/metersphere/track/controller/TestCaseReviewController.java index d9a755d0f9..84d9b809ef 100644 --- a/backend/src/main/java/io/metersphere/track/controller/TestCaseReviewController.java +++ b/backend/src/main/java/io/metersphere/track/controller/TestCaseReviewController.java @@ -9,7 +9,7 @@ import io.metersphere.commons.constants.RoleConstants; import io.metersphere.commons.utils.PageUtils; import io.metersphere.commons.utils.Pager; import io.metersphere.commons.utils.SessionUtils; -import io.metersphere.service.CheckOwnerService; +import io.metersphere.service.CheckPermissionService; import io.metersphere.track.dto.TestCaseReviewDTO; import io.metersphere.track.dto.TestReviewDTOWithMetric; import io.metersphere.track.request.testreview.QueryCaseReviewRequest; @@ -35,7 +35,7 @@ public class TestCaseReviewController { @Resource TestReviewProjectService testReviewProjectService; @Resource - CheckOwnerService checkOwnerService; + CheckPermissionService checkPermissionService; @PostMapping("/list/{goPage}/{pageSize}") public Pager> list(@PathVariable int goPage, @PathVariable int pageSize, @RequestBody QueryCaseReviewRequest request) { @@ -75,7 +75,7 @@ public class TestCaseReviewController { @GetMapping("/delete/{reviewId}") @RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR) public void deleteCaseReview(@PathVariable String reviewId) { - checkOwnerService.checkTestReviewOwner(reviewId); + checkPermissionService.checkTestReviewOwner(reviewId); testCaseReviewService.deleteCaseReview(reviewId); } @@ -107,14 +107,14 @@ public class TestCaseReviewController { @GetMapping("/get/{reviewId}") public TestCaseReview getTestReview(@PathVariable String reviewId) { - checkOwnerService.checkTestReviewOwner(reviewId); + checkPermissionService.checkTestReviewOwner(reviewId); return testCaseReviewService.getTestReview(reviewId); } @PostMapping("/edit/status/{reviewId}") @RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR) public void editTestPlanStatus(@PathVariable String reviewId) { - checkOwnerService.checkTestReviewOwner(reviewId); + checkPermissionService.checkTestReviewOwner(reviewId); testCaseReviewService.editTestReviewStatus(reviewId); } diff --git a/backend/src/main/java/io/metersphere/track/controller/TestPlanController.java b/backend/src/main/java/io/metersphere/track/controller/TestPlanController.java index 5e633c46f3..5730ace884 100644 --- a/backend/src/main/java/io/metersphere/track/controller/TestPlanController.java +++ b/backend/src/main/java/io/metersphere/track/controller/TestPlanController.java @@ -8,7 +8,7 @@ import io.metersphere.commons.constants.RoleConstants; import io.metersphere.commons.utils.PageUtils; import io.metersphere.commons.utils.Pager; import io.metersphere.commons.utils.SessionUtils; -import io.metersphere.service.CheckOwnerService; +import io.metersphere.service.CheckPermissionService; import io.metersphere.track.dto.TestCaseReportMetricDTO; import io.metersphere.track.dto.TestPlanDTO; import io.metersphere.track.dto.TestPlanDTOWithMetric; @@ -34,7 +34,7 @@ public class TestPlanController { @Resource TestPlanProjectService testPlanProjectService; @Resource - CheckOwnerService checkOwnerService; + CheckPermissionService checkPermissionService; @PostMapping("/list/{goPage}/{pageSize}") public Pager> list(@PathVariable int goPage, @PathVariable int pageSize, @RequestBody QueryTestPlanRequest request) { @@ -73,7 +73,7 @@ public class TestPlanController { @PostMapping("/get/{testPlanId}") public TestPlan getTestPlan(@PathVariable String testPlanId) { - checkOwnerService.checkTestPlanOwner(testPlanId); + checkPermissionService.checkTestPlanOwner(testPlanId); return testPlanService.getTestPlan(testPlanId); } @@ -92,14 +92,14 @@ public class TestPlanController { @PostMapping("/edit/status/{planId}") @RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR) public void editTestPlanStatus(@PathVariable String planId) { - checkOwnerService.checkTestPlanOwner(planId); + checkPermissionService.checkTestPlanOwner(planId); testPlanService.editTestPlanStatus(planId); } @PostMapping("/delete/{testPlanId}") @RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR) public int deleteTestPlan(@PathVariable String testPlanId) { - checkOwnerService.checkTestPlanOwner(testPlanId); + checkPermissionService.checkTestPlanOwner(testPlanId); return testPlanService.deleteTestPlan(testPlanId); } diff --git a/backend/src/main/resources/i18n/messages_en_US.properties b/backend/src/main/resources/i18n/messages_en_US.properties index b627fe4fb5..5ce5011793 100644 --- a/backend/src/main/resources/i18n/messages_en_US.properties +++ b/backend/src/main/resources/i18n/messages_en_US.properties @@ -164,6 +164,7 @@ check_owner_case=The current user does not have permission to operate this use c check_owner_plan=The current user does not have permission to operate this plan check_owner_review=The current user does not have permission to operate this review check_owner_comment=The current user does not have permission to manipulate this comment +check_owner_read_only=The current user in this workspace is a read-only user upload_content_is_null=Imported content is empty test_plan_notification=Test plan notification task_defect_notification=Task defect notification diff --git a/backend/src/main/resources/i18n/messages_zh_CN.properties b/backend/src/main/resources/i18n/messages_zh_CN.properties index 89c8359ead..a9824e3984 100644 --- a/backend/src/main/resources/i18n/messages_zh_CN.properties +++ b/backend/src/main/resources/i18n/messages_zh_CN.properties @@ -165,6 +165,7 @@ check_owner_case=当前用户没有操作此用例的权限 check_owner_plan=当前用户没有操作此计划的权限 check_owner_review=当前用户没有操作此评审的权限 check_owner_comment=当前用户没有操作此评论的权限 +check_owner_read_only=当前用户在此工作空间为只读用户 upload_content_is_null=导入内容为空 test_plan_notification=测试计划通知 task_defect_notification=缺陷任务通知 diff --git a/backend/src/main/resources/i18n/messages_zh_TW.properties b/backend/src/main/resources/i18n/messages_zh_TW.properties index ddd705a53e..f6e5762210 100644 --- a/backend/src/main/resources/i18n/messages_zh_TW.properties +++ b/backend/src/main/resources/i18n/messages_zh_TW.properties @@ -166,6 +166,7 @@ check_owner_case=當前用戶沒有操作此用例的權限 check_owner_plan=當前用戶沒有操作此計劃的權限 check_owner_review=當前用戶沒有操作此評審的權限 check_owner_comment=當前用戶沒有操作此評論的權限 +check_owner_read_only=當前用戶在此工作空間為只讀用戶 upload_content_is_null=導入內容為空 test_plan_notification=測試計畫通知 task_defect_notification=缺陷任務通知 diff --git a/frontend/src/business/components/api/automation/report/ApiReportList.vue b/frontend/src/business/components/api/automation/report/ApiReportList.vue index 6919193a43..c26086dcd2 100644 --- a/frontend/src/business/components/api/automation/report/ApiReportList.vue +++ b/frontend/src/business/components/api/automation/report/ApiReportList.vue @@ -69,7 +69,7 @@ import MsContainer from "../../../common/components/MsContainer"; import MsMainContainer from "../../../common/components/MsMainContainer"; import MsApiReportStatus from "./ApiReportStatus"; - import {_filter, _sort} from "@/common/js/utils"; + import {_filter, _sort,getCurrentProjectID} from "@/common/js/utils"; import MsTableOperatorButton from "../../../common/components/MsTableOperatorButton"; import ReportTriggerModeItem from "../../../common/tableItem/ReportTriggerModeItem"; import {REPORT_CONFIGS} from "../../../common/components/search/search-components"; @@ -130,6 +130,7 @@ if (this.testId !== 'all') { this.condition.testId = this.testId; } + this.condition.projectId = getCurrentProjectID(); let url = "/api/scenario/report/list/" + this.currentPage + "/" + this.pageSize; this.result = this.$post(url, this.condition, response => { let data = response.data; diff --git a/frontend/src/business/components/api/automation/report/components/RequestResultTail.vue b/frontend/src/business/components/api/automation/report/components/RequestResultTail.vue index 500eaa2f1c..7c1ccaf628 100644 --- a/frontend/src/business/components/api/automation/report/components/RequestResultTail.vue +++ b/frontend/src/business/components/api/automation/report/components/RequestResultTail.vue @@ -19,19 +19,14 @@ + :key="index" :indexNumber="index" :request="sub"/> - - -
- +
- -
- +
diff --git a/frontend/src/business/components/api/automation/report/components/RequestSubResult.vue b/frontend/src/business/components/api/automation/report/components/RequestSubResult.vue index 53e26c0c27..fa258162ac 100644 --- a/frontend/src/business/components/api/automation/report/components/RequestSubResult.vue +++ b/frontend/src/business/components/api/automation/report/components/RequestSubResult.vue @@ -3,7 +3,7 @@

- +
{{ indexNumber+1 }}
@@ -14,7 +14,16 @@ {{ request.name }}
- + +
+ {{ request.method }} +
+
+ +
+ {{ request.url }} +
+
{{ request.responseResult.responseCode }}
diff --git a/frontend/src/business/components/api/automation/report/components/ResponseText.vue b/frontend/src/business/components/api/automation/report/components/ResponseText.vue index d07d044d00..5d10582ba0 100644 --- a/frontend/src/business/components/api/automation/report/components/ResponseText.vue +++ b/frontend/src/business/components/api/automation/report/components/ResponseText.vue @@ -1,18 +1,19 @@ diff --git a/frontend/src/business/components/api/automation/scenario/ApiComponent.vue b/frontend/src/business/components/api/automation/scenario/ApiComponent.vue index f982f29274..70acb87907 100644 --- a/frontend/src/business/components/api/automation/scenario/ApiComponent.vue +++ b/frontend/src/business/components/api/automation/scenario/ApiComponent.vue @@ -5,15 +5,22 @@
{{request.index}}
+
+
{{request.index}}
+
{{request.index}}
- + {{$t('api_test.automation.api_list_import')}} - + + {{$t('api_test.automation.external_import')}} + + + {{$t('api_test.automation.customize_req')}} @@ -37,7 +44,12 @@
- + + + + + + @@ -96,20 +108,10 @@ try { let urlObject = new URL(this.request.url); let url = urlObject.protocol + "//" + urlObject.host + "/"; - if (url) { - let path = this.request.url.substr(url.length); - if (!path.startsWith('/')) { - path = "/" + path; - } - this.request.path = path; - } else { - this.request.url = this.request.path; - } } catch (e) { if (this.request.url) { this.request.path = this.request.url; - } else { - this.request.url = this.request.path; + this.request.url = undefined; } } } @@ -201,7 +203,7 @@ color: #F56C6C; } - .ms-left-buttion { + .ms-left-button { color: #F56C6C; background-color: #FCF1F1; margin-right: 20px; @@ -214,6 +216,19 @@ color: #008080; } + .ms-api-col-ot-import { + background-color: #EEF5FE; + border-color: #409EFF; + margin-right: 10px; + color: #409EFF; + } + + .ms-api-col-ot-import-button { + background-color: #EEF5FE; + margin-right: 20px; + color: #409EFF; + } + /deep/ .el-card__body { padding: 15px; } @@ -222,7 +237,7 @@ transform: rotate(90deg); } - .ms-create-buttion { + .ms-create-button { color: #008080; background-color: #EBF2F2; margin-right: 20px; diff --git a/frontend/src/business/components/api/automation/scenario/EditApiScenario.vue b/frontend/src/business/components/api/automation/scenario/EditApiScenario.vue index dfaf072dfb..e215b76665 100644 --- a/frontend/src/business/components/api/automation/scenario/EditApiScenario.vue +++ b/frontend/src/business/components/api/automation/scenario/EditApiScenario.vue @@ -782,7 +782,7 @@ apiImport(importData) { if (importData && importData.data) { importData.data.forEach(item => { - this.setApiParameter(item, "API", "Copy"); + this.setApiParameter(item, "API", "OT_IMPORT"); }) this.sort(); this.reload(); @@ -945,8 +945,4 @@ font-size: 13px; } - /deep/ .el-form-item__content { - line-height: 100%; - } - diff --git a/frontend/src/business/components/api/definition/ApiDefinition.vue b/frontend/src/business/components/api/definition/ApiDefinition.vue index 5f0719a8a3..07edcab884 100644 --- a/frontend/src/business/components/api/definition/ApiDefinition.vue +++ b/frontend/src/business/components/api/definition/ApiDefinition.vue @@ -78,10 +78,10 @@
- - - - + + + +
diff --git a/frontend/src/business/components/api/definition/components/case/ApiCaseList.vue b/frontend/src/business/components/api/definition/components/case/ApiCaseList.vue index 8ecfbe2067..64f0acbc46 100644 --- a/frontend/src/business/components/api/definition/components/case/ApiCaseList.vue +++ b/frontend/src/business/components/api/definition/components/case/ApiCaseList.vue @@ -172,9 +172,9 @@ } } this.apiCaseList = response.data; - // if (this.apiCaseList.length == 0) { - // this.addCase(); - // } + if (this.apiCaseList.length == 0 && !this.loaded) { + this.addCase(); + } }); } }, diff --git a/frontend/src/business/components/api/definition/components/complete/EditCompleteDubboApi.vue b/frontend/src/business/components/api/definition/components/complete/EditCompleteDubboApi.vue index b6b9c0f58a..84380d6fa3 100644 --- a/frontend/src/business/components/api/definition/components/complete/EditCompleteDubboApi.vue +++ b/frontend/src/business/components/api/definition/components/complete/EditCompleteDubboApi.vue @@ -22,7 +22,7 @@

{{$t('api_test.definition.request.req_param')}}

- +
diff --git a/frontend/src/business/components/api/definition/components/complete/EditCompleteHTTPApi.vue b/frontend/src/business/components/api/definition/components/complete/EditCompleteHTTPApi.vue index 0ceffaca5b..9648a9bbb3 100644 --- a/frontend/src/business/components/api/definition/components/complete/EditCompleteHTTPApi.vue +++ b/frontend/src/business/components/api/definition/components/complete/EditCompleteHTTPApi.vue @@ -77,7 +77,7 @@

{{$t('api_test.definition.request.req_param')}}

- +
diff --git a/frontend/src/business/components/api/definition/components/complete/EditCompleteSQLApi.vue b/frontend/src/business/components/api/definition/components/complete/EditCompleteSQLApi.vue index 8ffbd2e577..54bc58ea4e 100644 --- a/frontend/src/business/components/api/definition/components/complete/EditCompleteSQLApi.vue +++ b/frontend/src/business/components/api/definition/components/complete/EditCompleteSQLApi.vue @@ -21,7 +21,7 @@

{{$t('api_test.definition.request.req_param')}}

- +
diff --git a/frontend/src/business/components/api/definition/components/debug/DebugHttpPage.vue b/frontend/src/business/components/api/definition/components/debug/DebugHttpPage.vue index 55ab7ea8a9..bcb2bbb98b 100644 --- a/frontend/src/business/components/api/definition/components/debug/DebugHttpPage.vue +++ b/frontend/src/business/components/api/definition/components/debug/DebugHttpPage.vue @@ -16,7 +16,7 @@ + @command="handleCommand" size="small" v-if="testCase===undefined && !scenario"> {{$t('commons.test')}} {{$t('api_test.definition.request.save_as')}} @@ -76,7 +76,9 @@ method: [{required: true, message: this.$t('test_track.case.input_maintainer'), trigger: 'change'}], url: [ {max: 500, required: true, message: this.$t('commons.input_limit', [1, 500]), trigger: 'blur'}, - {validator: validateURL, trigger: 'blur'} + /* + {validator: validateURL, trigger: 'blur'} + */ ], }, debugForm: {method: REQ_METHOD[0].id, environmentId: ""}, diff --git a/frontend/src/business/components/api/definition/components/request/database/BasisParameters.vue b/frontend/src/business/components/api/definition/components/request/database/BasisParameters.vue index 63fb764d8d..a58ad0ae54 100644 --- a/frontend/src/business/components/api/definition/components/request/database/BasisParameters.vue +++ b/frontend/src/business/components/api/definition/components/request/database/BasisParameters.vue @@ -77,7 +77,7 @@
- + +{{$t('api_test.definition.request.pre_script')}}
@@ -120,6 +120,10 @@ request: {}, basisData: {}, moduleOptions: Array, + showScript: { + type: Boolean, + default: true, + }, isReadOnly: { type: Boolean, default: false @@ -172,7 +176,7 @@ this.reload(); }, copyRow(row) { - let obj =JSON.parse(JSON.stringify(row)); + let obj = JSON.parse(JSON.stringify(row)); obj.id = getUUID(); this.request.hashTree.push(obj); this.reload(); diff --git a/frontend/src/business/components/api/definition/components/request/dubbo/BasisParameters.vue b/frontend/src/business/components/api/definition/components/request/dubbo/BasisParameters.vue index 64a4065e72..9e3057827b 100644 --- a/frontend/src/business/components/api/definition/components/request/dubbo/BasisParameters.vue +++ b/frontend/src/business/components/api/definition/components/request/dubbo/BasisParameters.vue @@ -57,7 +57,7 @@
- + +{{$t('api_test.definition.request.pre_script')}}
+{{$t('api_test.definition.request.post_script')}} @@ -105,6 +105,10 @@ type: Boolean, default: false }, + showScript: { + type: Boolean, + default: true, + } }, data() { return { @@ -141,7 +145,7 @@ this.reload(); }, copyRow(row) { - let obj =JSON.parse(JSON.stringify(row)); + let obj = JSON.parse(JSON.stringify(row)); obj.id = getUUID(); this.request.hashTree.push(obj); this.reload(); diff --git a/frontend/src/business/components/api/definition/components/request/http/ApiHttpRequestForm.vue b/frontend/src/business/components/api/definition/components/request/http/ApiHttpRequestForm.vue index 47301e9c71..ef886a900d 100644 --- a/frontend/src/business/components/api/definition/components/request/http/ApiHttpRequestForm.vue +++ b/frontend/src/business/components/api/definition/components/request/http/ApiHttpRequestForm.vue @@ -85,7 +85,7 @@
- + +{{$t('api_test.definition.request.pre_script')}}
+{{$t('api_test.definition.request.post_script')}} @@ -131,6 +131,7 @@ }, props: { request: {}, + showScript: Boolean, headers: { type: Array, default() { diff --git a/frontend/src/business/components/api/definition/components/request/http/ApiRequestForm.vue b/frontend/src/business/components/api/definition/components/request/http/ApiRequestForm.vue index de97afb499..0f2274df8a 100644 --- a/frontend/src/business/components/api/definition/components/request/http/ApiRequestForm.vue +++ b/frontend/src/business/components/api/definition/components/request/http/ApiRequestForm.vue @@ -1,6 +1,6 @@ @@ -17,6 +17,10 @@ type: Boolean, default: true }, + showScript: { + type: Boolean, + default: true, + }, referenced: { type: Boolean, default: false diff --git a/frontend/src/business/components/api/definition/components/runtest/RunTestDubboPage.vue b/frontend/src/business/components/api/definition/components/runtest/RunTestDubboPage.vue index 8d1f43638d..4179a65ab4 100644 --- a/frontend/src/business/components/api/definition/components/runtest/RunTestDubboPage.vue +++ b/frontend/src/business/components/api/definition/components/runtest/RunTestDubboPage.vue @@ -29,7 +29,7 @@ - @@ -104,6 +104,9 @@ return this.runTest(); } }, + refresh(){ + this.$emit('refresh'); + }, runTest() { this.loading = true; this.api.request.name = this.api.id; diff --git a/frontend/src/business/components/api/definition/components/runtest/RunTestHTTPPage.vue b/frontend/src/business/components/api/definition/components/runtest/RunTestHTTPPage.vue index e3c2b2ddfd..861047c291 100644 --- a/frontend/src/business/components/api/definition/components/runtest/RunTestHTTPPage.vue +++ b/frontend/src/business/components/api/definition/components/runtest/RunTestHTTPPage.vue @@ -70,7 +70,7 @@ - { diff --git a/frontend/src/business/components/api/definition/components/runtest/RunTestSQLPage.vue b/frontend/src/business/components/api/definition/components/runtest/RunTestSQLPage.vue index c6094c3108..3a52f408dc 100644 --- a/frontend/src/business/components/api/definition/components/runtest/RunTestSQLPage.vue +++ b/frontend/src/business/components/api/definition/components/runtest/RunTestSQLPage.vue @@ -28,7 +28,7 @@ - @@ -103,6 +103,9 @@ return this.$refs['requestForm'].validate(); } }, + refresh(){ + this.$emit('refresh'); + }, runTest() { this.loading = true; this.api.request.name = this.api.id; diff --git a/frontend/src/business/components/api/definition/components/runtest/RunTestTCPPage.vue b/frontend/src/business/components/api/definition/components/runtest/RunTestTCPPage.vue index a9afdda538..687083ad33 100644 --- a/frontend/src/business/components/api/definition/components/runtest/RunTestTCPPage.vue +++ b/frontend/src/business/components/api/definition/components/runtest/RunTestTCPPage.vue @@ -29,7 +29,7 @@ - @@ -103,6 +103,9 @@ return this.$refs['requestForm'].validate(); } }, + refresh(){ + this.$emit('refresh'); + }, runTest() { this.loading = true; this.api.request.name = this.api.id; diff --git a/frontend/src/business/components/settings/system/TestResourcePool.vue b/frontend/src/business/components/settings/system/TestResourcePool.vue index 02871ad832..645396711c 100644 --- a/frontend/src/business/components/settings/system/TestResourcePool.vue +++ b/frontend/src/business/components/settings/system/TestResourcePool.vue @@ -47,14 +47,14 @@ + ref="testResourcePoolForm"> @@ -75,22 +75,25 @@
- + - + - - + + @@ -98,17 +101,19 @@
- + - + - @@ -132,100 +137,15 @@ - - - - - - - - - - - - - - - - Node - Kubernetes - - -
-
- - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
@@ -235,7 +155,7 @@ import MsTablePagination from "../../common/pagination/TablePagination"; import MsTableHeader from "../../common/components/MsTableHeader"; import MsTableOperator from "../../common/components/MsTableOperator"; import MsDialogFooter from "../../common/components/MsDialogFooter"; -import {listenGoBack, removeGoBackListener} from "../../../../common/js/utils"; +import {listenGoBack, removeGoBackListener} from "@/common/js/utils"; export default { name: "MsTestResourcePool", @@ -243,9 +163,8 @@ export default { data() { return { result: {}, - createVisible: false, + dialogVisible: false, infoList: [], - updateVisible: false, queryPath: "testresourcepool/list", condition: {}, items: [], @@ -253,6 +172,7 @@ export default { pageSize: 5, total: 0, form: {}, + requiredRules: [{required: true, message: this.$t('test_resource_pool.fill_the_data'), trigger: 'blur'}], rule: { name: [ {required: true, message: this.$t('test_resource_pool.input_pool_name'), trigger: 'blur'}, @@ -329,11 +249,11 @@ export default { this.initTableData(); }, create() { - this.createVisible = true; + this.dialogVisible = true; listenGoBack(this.closeFunc); }, edit(row) { - this.updateVisible = true; + this.dialogVisible = true; this.form = JSON.parse(JSON.stringify(row)); this.convertResources(); listenGoBack(this.closeFunc); @@ -363,8 +283,8 @@ export default { this.$info(this.$t('commons.delete_cancel')); }); }, - createTestResourcePool(createTestResourcePoolForm) { - this.$refs[createTestResourcePoolForm].validate(valid => { + createTestResourcePool() { + this.$refs.testResourcePoolForm.validate(valid => { if (valid) { let vri = this.validateResourceInfo(); if (vri.validate) { @@ -374,7 +294,7 @@ export default { type: 'success', message: this.$t('commons.save_success') }, - this.createVisible = false, + this.dialogVisible = false, this.initTableData()); }); } else { @@ -400,8 +320,8 @@ export default { }); this.form.resources = resources; }, - updateTestResourcePool(updateTestResourcePoolForm) { - this.$refs[updateTestResourcePoolForm].validate(valid => { + updateTestResourcePool() { + this.$refs.testResourcePoolForm.validate(valid => { if (valid) { let vri = this.validateResourceInfo(); if (vri.validate) { @@ -411,7 +331,7 @@ export default { type: 'success', message: this.$t('commons.modify_success') }, - this.updateVisible = false, + this.dialogVisible = false, this.initTableData(), self.loading = false); }); @@ -426,8 +346,7 @@ export default { }, closeFunc() { this.form = {}; - this.updateVisible = false; - this.createVisible = false; + this.dialogVisible = false; removeGoBackListener(this.closeFunc); }, changeSwitch(row) { diff --git a/frontend/src/business/components/track/case/TestCase.vue b/frontend/src/business/components/track/case/TestCase.vue index c3d5e3d94f..4ff0576e9e 100644 --- a/frontend/src/business/components/track/case/TestCase.vue +++ b/frontend/src/business/components/track/case/TestCase.vue @@ -19,6 +19,7 @@ @testCaseDetail="showTestCaseDetail" @batchMove="batchMove" @refresh="refresh" + @refreshAll="refreshAll" @moveToNode="moveToNode" ref="testCaseList"> @@ -131,6 +132,10 @@ export default { this.selectNode = {}; this.refreshTable(); }, + refreshAll() { + this.$refs.nodeTree.list(); + this.refresh(); + }, openRecentTestCaseEditDialog(caseId) { if (caseId) { // this.getProjectByCaseId(caseId); diff --git a/frontend/src/business/components/track/case/components/TestCaseImport.vue b/frontend/src/business/components/track/case/components/TestCaseImport.vue index 8688c52489..a82195348f 100644 --- a/frontend/src/business/components/track/case/components/TestCaseImport.vue +++ b/frontend/src/business/components/track/case/components/TestCaseImport.vue @@ -204,7 +204,7 @@ if (res.success) { this.$success(this.$t('test_track.case.import.success')); this.dialogVisible = false; - this.$emit("refresh"); + this.$emit("refreshAll"); } else { this.errList = res.errList; } @@ -223,7 +223,7 @@ if (res.success) { this.$success(this.$t('test_track.case.import.success')); this.dialogVisible = false; - this.$emit("refresh"); + this.$emit("refreshAll"); } else { this.xmindErrList = res.errList; } diff --git a/frontend/src/business/components/track/case/components/TestCaseList.vue b/frontend/src/business/components/track/case/components/TestCaseList.vue index 7062407e14..c55742624d 100644 --- a/frontend/src/business/components/track/case/components/TestCaseList.vue +++ b/frontend/src/business/components/track/case/components/TestCaseList.vue @@ -25,7 +25,7 @@ - +