Merge remote-tracking branch 'origin/master'
This commit is contained in:
commit
344b9f6f77
|
@ -6,11 +6,11 @@ ARG MS_VERSION=dev
|
|||
|
||||
RUN mkdir -p /opt/apps && mkdir -p /opt/jmeter
|
||||
|
||||
ADD backend/target/backend-1.0.jar /opt/apps
|
||||
ADD backend/target/backend-1.1.jar /opt/apps
|
||||
|
||||
ADD backend/target/classes/jmeter/ /opt/jmeter/
|
||||
|
||||
ENV JAVA_APP_JAR=/opt/apps/backend-1.0.jar
|
||||
ENV JAVA_APP_JAR=/opt/apps/backend-1.1.jar
|
||||
|
||||
ENV AB_OFF=true
|
||||
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
<parent>
|
||||
<artifactId>metersphere-server</artifactId>
|
||||
<groupId>io.metersphere</groupId>
|
||||
<version>1.0</version>
|
||||
<version>1.1</version>
|
||||
</parent>
|
||||
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
@ -376,4 +376,4 @@
|
|||
<url>https://maven.pkg.github.com/metersphere/jmeter-plugins-for-apache-dubbo</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
</project>
|
||||
</project>
|
||||
|
|
|
@ -16,7 +16,6 @@ import org.apache.shiro.authz.annotation.RequiresRoles;
|
|||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@RestController
|
||||
|
|
|
@ -16,9 +16,8 @@ import org.apache.shiro.authz.annotation.RequiresRoles;
|
|||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
|
||||
@RestController
|
||||
@RequestMapping(value = "/api")
|
||||
|
@ -95,7 +94,7 @@ public class APITestController {
|
|||
|
||||
@PostMapping(value = "/import", consumes = {"multipart/form-data"})
|
||||
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
|
||||
public ApiTest testCaseImport(@RequestPart(value = "file", required = false) MultipartFile file, @RequestPart("request") ApiTestImportRequest request) {
|
||||
public ApiTest testCaseImport(@RequestPart(value = "file", required = false) MultipartFile file, @RequestPart("request") ApiTestImportRequest request) {
|
||||
return apiTestService.apiTestImport(file, request);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,10 +1,7 @@
|
|||
package io.metersphere.api.dto.parse.postman;
|
||||
|
||||
import com.alibaba.fastjson.annotation.JSONField;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
public class PostmanItem {
|
||||
|
||||
|
|
|
@ -7,6 +7,7 @@ import lombok.EqualsAndHashCode;
|
|||
@Data
|
||||
public class ExtractRegex extends ExtractCommon {
|
||||
private String useHeaders;
|
||||
|
||||
public ExtractRegex() {
|
||||
setType(ExtractType.REGEX);
|
||||
}
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
package io.metersphere.api.jmeter;
|
||||
|
||||
import io.github.ningyu.jmeter.plugin.dubbo.sample.ProviderService;
|
||||
import io.metersphere.api.service.APIReportService;
|
||||
import io.metersphere.api.service.APITestService;
|
||||
import io.metersphere.commons.constants.APITestStatus;
|
||||
|
|
|
@ -10,11 +10,10 @@ import org.apache.jmeter.visualizers.backend.BackendListener;
|
|||
import org.apache.jorphan.collections.HashTree;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.io.InputStream;
|
||||
import java.lang.reflect.Field;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
@Service
|
||||
public class JMeterService {
|
||||
|
||||
|
|
|
@ -1,9 +1,6 @@
|
|||
package io.metersphere.api.parse;
|
||||
|
||||
import io.metersphere.commons.constants.ApiImportPlatform;
|
||||
import io.metersphere.commons.constants.FileType;
|
||||
import io.metersphere.performance.parse.EngineSourceParser;
|
||||
import io.metersphere.performance.parse.xml.XmlEngineSourceParse;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
public class ApiImportParserFactory {
|
||||
|
|
|
@ -7,8 +7,8 @@ import io.metersphere.api.dto.parse.ApiImport;
|
|||
import io.metersphere.api.dto.parse.postman.*;
|
||||
import io.metersphere.api.dto.scenario.Body;
|
||||
import io.metersphere.api.dto.scenario.KeyValue;
|
||||
import io.metersphere.api.dto.scenario.request.HttpRequest;
|
||||
import io.metersphere.api.dto.scenario.Scenario;
|
||||
import io.metersphere.api.dto.scenario.request.HttpRequest;
|
||||
import io.metersphere.api.dto.scenario.request.Request;
|
||||
import io.metersphere.commons.constants.MsRequestBodyType;
|
||||
import io.metersphere.commons.constants.PostmanRequestBodyMode;
|
||||
|
|
|
@ -6,8 +6,8 @@ import io.metersphere.api.dto.ApiTestImportRequest;
|
|||
import io.metersphere.api.dto.parse.ApiImport;
|
||||
import io.metersphere.api.dto.scenario.Body;
|
||||
import io.metersphere.api.dto.scenario.KeyValue;
|
||||
import io.metersphere.api.dto.scenario.request.HttpRequest;
|
||||
import io.metersphere.api.dto.scenario.Scenario;
|
||||
import io.metersphere.api.dto.scenario.request.HttpRequest;
|
||||
import io.metersphere.api.dto.scenario.request.Request;
|
||||
import io.metersphere.commons.constants.MsRequestBodyType;
|
||||
import io.metersphere.commons.constants.SwaggerParameterType;
|
||||
|
@ -64,7 +64,8 @@ public class Swagger2Parser extends ApiImportAbstractParser {
|
|||
Scenario scenario = Optional.ofNullable(scenarioMap.get(tag)).orElse(new Scenario());
|
||||
List<Request> requests = Optional.ofNullable(scenario.getRequests()).orElse(new ArrayList<>());
|
||||
requests.add(request);
|
||||
scenario.setRequests(requests);scenario.setName(tag);
|
||||
scenario.setRequests(requests);
|
||||
scenario.setName(tag);
|
||||
scenarioMap.put(tag, scenario);
|
||||
});
|
||||
} else {
|
||||
|
@ -86,7 +87,7 @@ public class Swagger2Parser extends ApiImportAbstractParser {
|
|||
List<Parameter> parameters = operation.getParameters();
|
||||
|
||||
for (Parameter parameter : parameters) {
|
||||
switch (parameter.getIn()){
|
||||
switch (parameter.getIn()) {
|
||||
// case SwaggerParameterType.PATH:
|
||||
// parsePathParameters(parameter, request);
|
||||
// break;
|
||||
|
@ -137,7 +138,7 @@ public class Swagger2Parser extends ApiImportAbstractParser {
|
|||
ArrayModel arrayModel = (ArrayModel) bodyParameter.getSchema();
|
||||
Property items = arrayModel.getItems();
|
||||
if (items instanceof RefProperty) {
|
||||
RefProperty refProperty = (RefProperty) items;
|
||||
RefProperty refProperty = (RefProperty) items;
|
||||
Model model = definitions.get(refProperty.getSimpleRef());
|
||||
JSONArray propertyList = new JSONArray();
|
||||
propertyList.add(getBodyJSONObjectParameters(model.getProperties(), definitions));
|
||||
|
@ -155,11 +156,11 @@ public class Swagger2Parser extends ApiImportAbstractParser {
|
|||
if (value instanceof ObjectProperty) {
|
||||
ObjectProperty objectProperty = (ObjectProperty) value;
|
||||
jsonObject.put(key, getBodyJSONObjectParameters(objectProperty.getProperties(), definitions));
|
||||
} else if (value instanceof ArrayProperty) {
|
||||
} else if (value instanceof ArrayProperty) {
|
||||
ArrayProperty arrayProperty = (ArrayProperty) value;
|
||||
Property items = arrayProperty.getItems();
|
||||
if (items instanceof RefProperty) {
|
||||
RefProperty refProperty = (RefProperty) items;
|
||||
RefProperty refProperty = (RefProperty) items;
|
||||
Model model = definitions.get(refProperty.getSimpleRef());
|
||||
JSONArray propertyList = new JSONArray();
|
||||
propertyList.add(getBodyJSONObjectParameters(model.getProperties(), definitions));
|
||||
|
|
|
@ -12,19 +12,16 @@ import io.metersphere.base.mapper.ext.ExtApiTestReportMapper;
|
|||
import io.metersphere.commons.constants.APITestStatus;
|
||||
import io.metersphere.commons.exception.MSException;
|
||||
import io.metersphere.commons.utils.ServiceUtils;
|
||||
import io.metersphere.commons.utils.SessionUtils;
|
||||
import io.metersphere.dto.DashboardTestDTO;
|
||||
import io.metersphere.i18n.Translator;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.time.Instant;
|
||||
import java.time.temporal.ChronoUnit;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.UUID;
|
||||
|
||||
@Service
|
||||
|
|
|
@ -34,9 +34,7 @@ import org.springframework.util.CollectionUtils;
|
|||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.File;
|
||||
import java.io.InputStream;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
@ -140,6 +138,7 @@ public class APITestService {
|
|||
testCaseService.checkIsRelateTest(testId);
|
||||
deleteFileByTestId(testId);
|
||||
apiReportService.deleteByTestId(testId);
|
||||
scheduleService.deleteByResourceId(testId);
|
||||
apiTestMapper.deleteByPrimaryKey(testId);
|
||||
}
|
||||
|
||||
|
|
|
@ -21,7 +21,7 @@ public class ApiTestEnvironmentService {
|
|||
private ApiTestEnvironmentMapper apiTestEnvironmentMapper;
|
||||
|
||||
public List<ApiTestEnvironmentWithBLOBs> list(String projectId) {
|
||||
ApiTestEnvironmentExample example =new ApiTestEnvironmentExample();
|
||||
ApiTestEnvironmentExample example = new ApiTestEnvironmentExample();
|
||||
example.createCriteria().andProjectIdEqualTo(projectId);
|
||||
return apiTestEnvironmentMapper.selectByExampleWithBLOBs(example);
|
||||
}
|
||||
|
@ -46,7 +46,7 @@ public class ApiTestEnvironmentService {
|
|||
return apiTestEnvironmentWithBLOBs.getId();
|
||||
}
|
||||
|
||||
private void checkEnvironmentExist (ApiTestEnvironmentWithBLOBs environment) {
|
||||
private void checkEnvironmentExist(ApiTestEnvironmentWithBLOBs environment) {
|
||||
if (environment.getName() != null) {
|
||||
ApiTestEnvironmentExample example = new ApiTestEnvironmentExample();
|
||||
ApiTestEnvironmentExample.Criteria criteria = example.createCriteria();
|
||||
|
|
|
@ -3,6 +3,7 @@ package io.metersphere.base.mapper.ext;
|
|||
import io.metersphere.base.domain.TestCase;
|
||||
import io.metersphere.track.request.testcase.QueryTestCaseRequest;
|
||||
import io.metersphere.track.dto.TestCaseDTO;
|
||||
import io.metersphere.track.request.testcase.TestCaseBatchRequest;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.util.List;
|
||||
|
@ -15,7 +16,7 @@ public interface ExtTestCaseMapper {
|
|||
|
||||
List<TestCaseDTO> listByMethod(@Param("request") QueryTestCaseRequest request);
|
||||
|
||||
List<TestCaseDTO> listBytestCaseIds(@Param("request") QueryTestCaseRequest request);
|
||||
List<TestCaseDTO> listBytestCaseIds(@Param("request") TestCaseBatchRequest request);
|
||||
|
||||
TestCase getMaxNumByProjectId(@Param("projectId") String projectId);
|
||||
|
||||
|
|
|
@ -192,9 +192,9 @@
|
|||
select test_case.*,api_test.name as apiName,load_test.name AS performName from test_case left join api_test on
|
||||
test_case.test_id=api_test.id left join load_test on test_case.test_id=load_test.id
|
||||
<where>
|
||||
<if test="request.testCaseIds!=null and request.testCaseIds.size() > 0">
|
||||
<if test="request.ids!=null and request.ids.size() > 0">
|
||||
and test_case.id in
|
||||
<foreach collection="request.testCaseIds" open="(" close=")" separator="," item="id">
|
||||
<foreach collection="request.ids" open="(" close=")" separator="," item="id">
|
||||
#{id}
|
||||
</foreach>
|
||||
</if>
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
package io.metersphere.commons.constants;
|
||||
|
||||
public enum ApiImportPlatform {
|
||||
public enum ApiImportPlatform {
|
||||
Metersphere, Postman, Swagger2
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
package io.metersphere.commons.constants;
|
||||
|
||||
public enum ReportTriggerMode {
|
||||
MANUAL,SCHEDULE,API
|
||||
public enum ReportTriggerMode {
|
||||
MANUAL, SCHEDULE, API
|
||||
}
|
||||
|
|
|
@ -1,14 +1,24 @@
|
|||
package io.metersphere.commons.exception;
|
||||
|
||||
public class MSException extends RuntimeException{
|
||||
public class MSException extends RuntimeException {
|
||||
|
||||
private MSException(String message) { super(message); }
|
||||
private MSException(String message) {
|
||||
super(message);
|
||||
}
|
||||
|
||||
private MSException(Throwable t) { super(t); }
|
||||
private MSException(Throwable t) {
|
||||
super(t);
|
||||
}
|
||||
|
||||
public static void throwException(String message) { throw new MSException(message); }
|
||||
public static void throwException(String message) {
|
||||
throw new MSException(message);
|
||||
}
|
||||
|
||||
public static MSException getException(String message) { throw new MSException(message); }
|
||||
public static MSException getException(String message) {
|
||||
throw new MSException(message);
|
||||
}
|
||||
|
||||
public static void throwException(Throwable t) { throw new MSException(t); }
|
||||
public static void throwException(Throwable t) {
|
||||
throw new MSException(t);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,6 +7,7 @@ public class MathUtils {
|
|||
/**
|
||||
* 获取百分比
|
||||
* 保留一位小数
|
||||
*
|
||||
* @param value
|
||||
* @return
|
||||
*/
|
||||
|
|
|
@ -7,9 +7,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
|
|||
import org.springframework.context.MessageSource;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.annotation.Primary;
|
||||
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
|
||||
import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;
|
||||
|
||||
import javax.validation.Validator;
|
||||
|
||||
|
@ -31,6 +29,7 @@ public class I18nConfig {
|
|||
|
||||
/**
|
||||
* JSR-303校验国际化
|
||||
*
|
||||
* @param messageSource
|
||||
* @return
|
||||
*/
|
||||
|
@ -43,7 +42,7 @@ public class I18nConfig {
|
|||
}
|
||||
|
||||
@Bean
|
||||
public Validator validator(LocalValidatorFactoryBean localValidatorFactoryBean){
|
||||
public Validator validator(LocalValidatorFactoryBean localValidatorFactoryBean) {
|
||||
return localValidatorFactoryBean.getValidator();
|
||||
}
|
||||
|
||||
|
|
|
@ -7,7 +7,6 @@ import com.fit2cloud.quartz.service.QuartzManageService;
|
|||
import com.fit2cloud.quartz.util.QuartzBeanFactory;
|
||||
import org.springframework.beans.factory.ObjectProvider;
|
||||
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
package io.metersphere.controller;
|
||||
|
||||
import io.metersphere.service.ScheduleService;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@ import io.metersphere.commons.constants.ParamConstants;
|
|||
import io.metersphere.commons.constants.RoleConstants;
|
||||
import io.metersphere.ldap.domain.LdapInfo;
|
||||
import io.metersphere.service.SystemParameterService;
|
||||
import org.apache.shiro.authz.annotation.Logical;
|
||||
import org.apache.shiro.authz.annotation.RequiresRoles;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
|
|
|
@ -9,6 +9,7 @@ import org.springframework.web.bind.annotation.GetMapping;
|
|||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
@ -34,7 +35,7 @@ public class UserRoleController {
|
|||
|
||||
@GetMapping("/all/{userId}")
|
||||
@RequiresRoles(RoleConstants.ADMIN)
|
||||
public List<Map<String,Object>> getUserRole(@PathVariable("userId") String userId) {
|
||||
public List<Map<String, Object>> getUserRole(@PathVariable("userId") String userId) {
|
||||
return userRoleService.getUserRole(userId);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,6 +3,7 @@ package io.metersphere.controller.request.member;
|
|||
import io.metersphere.base.domain.User;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
@ -11,6 +12,6 @@ import java.util.Map;
|
|||
@Setter
|
||||
public class UserRequest extends User {
|
||||
|
||||
private List<Map<String,Object>> roles = new ArrayList<>();
|
||||
private List<Map<String, Object>> roles = new ArrayList<>();
|
||||
|
||||
}
|
||||
|
|
|
@ -4,6 +4,7 @@ import io.metersphere.base.domain.Role;
|
|||
import io.metersphere.base.domain.UserRole;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Getter
|
||||
|
|
|
@ -11,9 +11,10 @@ public class ExcelErrData<T> {
|
|||
|
||||
private String errMsg;
|
||||
|
||||
public ExcelErrData(){}
|
||||
public ExcelErrData() {
|
||||
}
|
||||
|
||||
public ExcelErrData(T t, Integer rowNum,String errMsg){
|
||||
public ExcelErrData(T t, Integer rowNum, String errMsg) {
|
||||
this.t = t;
|
||||
this.rowNum = rowNum;
|
||||
this.errMsg = errMsg;
|
||||
|
|
|
@ -3,6 +3,7 @@ package io.metersphere.excel.domain;
|
|||
import lombok.Data;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
public class ExcelResponse<T> {
|
||||
|
||||
|
|
|
@ -13,12 +13,12 @@ import javax.validation.constraints.Pattern;
|
|||
public class TestCaseExcelData {
|
||||
|
||||
@NotBlank(message = "{cannot_be_null}")
|
||||
@Length(max=50)
|
||||
@Length(max = 50)
|
||||
@ExcelProperty("{test_case_name}")
|
||||
private String name;
|
||||
|
||||
@NotBlank(message = "{cannot_be_null}")
|
||||
@Length(max=1000)
|
||||
@Length(max = 1000)
|
||||
@ExcelProperty("{test_case_module}")
|
||||
@ColumnWidth(30)
|
||||
@Pattern(regexp = "^(?!.*//).*$", message = "{incorrect_format}")
|
||||
|
@ -45,21 +45,21 @@ public class TestCaseExcelData {
|
|||
|
||||
@ColumnWidth(50)
|
||||
@ExcelProperty("{test_case_prerequisite}")
|
||||
@Length(min=0, max=1000)
|
||||
@Length(min = 0, max = 1000)
|
||||
private String prerequisite;
|
||||
|
||||
@ColumnWidth(50)
|
||||
@ExcelProperty("{test_case_remark}")
|
||||
@Length(max=1000)
|
||||
@Length(max = 1000)
|
||||
private String remark;
|
||||
|
||||
@ColumnWidth(50)
|
||||
@ExcelProperty("{test_case_step_desc}")
|
||||
@Length(max=1000)
|
||||
@Length(max = 1000)
|
||||
private String stepDesc;
|
||||
|
||||
@ColumnWidth(50)
|
||||
@ExcelProperty("{test_case_step_result}")
|
||||
@Length(max=1000)
|
||||
@Length(max = 1000)
|
||||
private String stepResult;
|
||||
}
|
||||
|
|
|
@ -11,10 +11,12 @@ import io.metersphere.excel.utils.EasyExcelI18nTranslator;
|
|||
import io.metersphere.excel.utils.ExcelValidateHelper;
|
||||
import io.metersphere.i18n.Translator;
|
||||
|
||||
import java.lang.reflect.*;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.ParameterizedType;
|
||||
import java.lang.reflect.Type;
|
||||
import java.util.*;
|
||||
|
||||
public abstract class EasyExcelListener <T> extends AnalysisEventListener<T> {
|
||||
public abstract class EasyExcelListener<T> extends AnalysisEventListener<T> {
|
||||
|
||||
protected List<ExcelErrData<T>> errList = new ArrayList<>();
|
||||
|
||||
|
@ -29,7 +31,7 @@ public abstract class EasyExcelListener <T> extends AnalysisEventListener<T> {
|
|||
|
||||
protected Class<T> clazz;
|
||||
|
||||
public EasyExcelListener(){
|
||||
public EasyExcelListener() {
|
||||
Type type = getClass().getGenericSuperclass();
|
||||
this.clazz = (Class<T>) ((ParameterizedType) type).getActualTypeArguments()[0];
|
||||
//防止多线程修改运行时类注解后,saveOriginalExcelProperty保存的是修改后的值
|
||||
|
@ -61,7 +63,7 @@ public abstract class EasyExcelListener <T> extends AnalysisEventListener<T> {
|
|||
|
||||
if (!StringUtils.isEmpty(errMsg)) {
|
||||
ExcelErrData excelErrData = new ExcelErrData(t, rowIndex,
|
||||
Translator.get("number")+ " " + rowIndex + " " + Translator.get("row") + Translator.get("error")
|
||||
Translator.get("number") + " " + rowIndex + " " + Translator.get("row") + Translator.get("error")
|
||||
+ ":" + errMsg);
|
||||
errList.add(excelErrData);
|
||||
} else {
|
||||
|
@ -77,6 +79,7 @@ public abstract class EasyExcelListener <T> extends AnalysisEventListener<T> {
|
|||
/**
|
||||
* 可重写该方法
|
||||
* 自定义校验规则
|
||||
*
|
||||
* @param data
|
||||
* @param errMsg
|
||||
* @return
|
||||
|
@ -98,18 +101,19 @@ public abstract class EasyExcelListener <T> extends AnalysisEventListener<T> {
|
|||
|
||||
|
||||
/**
|
||||
* 校验excel头部
|
||||
* @param headMap 传入excel的头部(第一行数据)数据的index,name
|
||||
* @param context
|
||||
*/
|
||||
* 校验excel头部
|
||||
*
|
||||
* @param headMap 传入excel的头部(第一行数据)数据的index,name
|
||||
* @param context
|
||||
*/
|
||||
@Override
|
||||
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
|
||||
if (clazz != null){
|
||||
if (clazz != null) {
|
||||
try {
|
||||
Set<String> fieldNameSet = getFieldNameSet(clazz);
|
||||
Collection<String> values = headMap.values();
|
||||
for (String key : fieldNameSet) {
|
||||
if (!values.contains(key)){
|
||||
if (!values.contains(key)) {
|
||||
throw new ExcelAnalysisException(Translator.get("missing_header_information") + ":" + key);
|
||||
}
|
||||
}
|
||||
|
@ -121,17 +125,17 @@ public abstract class EasyExcelListener <T> extends AnalysisEventListener<T> {
|
|||
}
|
||||
|
||||
/**
|
||||
* @description: 获取注解里ExcelProperty的value
|
||||
* @description: 获取注解里ExcelProperty的value
|
||||
*/
|
||||
public Set<String> getFieldNameSet(Class clazz) throws NoSuchFieldException {
|
||||
Set<String> result = new HashSet<>();
|
||||
Field field;
|
||||
Field[] fields = clazz.getDeclaredFields();
|
||||
for (int i = 0; i < fields.length ; i++) {
|
||||
for (int i = 0; i < fields.length; i++) {
|
||||
field = clazz.getDeclaredField(fields[i].getName());
|
||||
field.setAccessible(true);
|
||||
ExcelProperty excelProperty = field.getAnnotation(ExcelProperty.class);
|
||||
if(excelProperty != null){
|
||||
if (excelProperty != null) {
|
||||
StringBuilder value = new StringBuilder();
|
||||
for (String v : excelProperty.value()) {
|
||||
value.append(v);
|
||||
|
@ -146,7 +150,7 @@ public abstract class EasyExcelListener <T> extends AnalysisEventListener<T> {
|
|||
return errList;
|
||||
}
|
||||
|
||||
public void close () {
|
||||
public void close() {
|
||||
this.easyExcelI18nTranslator.resetExcelProperty();
|
||||
}
|
||||
}
|
|
@ -42,7 +42,7 @@ public class TestCaseDataListener extends EasyExcelListener<TestCaseExcelData> {
|
|||
|
||||
if (nodePath != null) {
|
||||
String[] nodes = nodePath.split("/");
|
||||
if ( nodes.length > TestCaseConstants.MAX_NODE_DEPTH + 1) {
|
||||
if (nodes.length > TestCaseConstants.MAX_NODE_DEPTH + 1) {
|
||||
stringBuilder.append(Translator.get("test_case_node_level_tip") +
|
||||
TestCaseConstants.MAX_NODE_DEPTH + Translator.get("test_case_node_level"));
|
||||
}
|
||||
|
@ -122,7 +122,7 @@ public class TestCaseDataListener extends EasyExcelListener<TestCaseExcelData> {
|
|||
String pattern = "(^\\d+)(\\.)?";
|
||||
int index = stepDesc.length > stepRes.length ? stepDesc.length : stepRes.length;
|
||||
|
||||
for (int i = 0; i < index; i++){
|
||||
for (int i = 0; i < index; i++) {
|
||||
|
||||
JSONObject step = new JSONObject();
|
||||
step.put("num", i + 1);
|
||||
|
|
|
@ -1,24 +1,14 @@
|
|||
package io.metersphere.excel.utils;
|
||||
|
||||
import com.alibaba.excel.EasyExcel;
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import io.metersphere.commons.utils.LogUtil;
|
||||
import io.metersphere.excel.domain.TestCaseExcelData;
|
||||
import io.metersphere.exception.ExcelException;
|
||||
import io.metersphere.i18n.Translator;
|
||||
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.IOException;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.InvocationHandler;
|
||||
import java.lang.reflect.Proxy;
|
||||
import java.net.URLEncoder;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
public class EasyExcelExporter {
|
||||
|
||||
|
|
|
@ -33,12 +33,12 @@ public class EasyExcelI18nTranslator {
|
|||
private void readExcelProperty(Class clazz, BiConsumer<String, Map<String, Object>> operate) {
|
||||
Field field;
|
||||
Field[] fields = clazz.getDeclaredFields();
|
||||
for (int i = 0; i < fields.length ; i++) {
|
||||
for (int i = 0; i < fields.length; i++) {
|
||||
try {
|
||||
field = clazz.getDeclaredField(fields[i].getName());
|
||||
field.setAccessible(true);
|
||||
ExcelProperty excelProperty = field.getAnnotation(ExcelProperty.class);
|
||||
if(excelProperty != null){
|
||||
if (excelProperty != null) {
|
||||
InvocationHandler invocationHandler = Proxy.getInvocationHandler(excelProperty);
|
||||
Field fieldValue = invocationHandler.getClass().getDeclaredField("memberValues");
|
||||
fieldValue.setAccessible(true);
|
||||
|
@ -51,7 +51,7 @@ public class EasyExcelI18nTranslator {
|
|||
}
|
||||
|
||||
operate.accept(field.getName(), memberValues);
|
||||
|
||||
|
||||
}
|
||||
} catch (NoSuchFieldException e) {
|
||||
e.printStackTrace();
|
||||
|
@ -64,7 +64,7 @@ public class EasyExcelI18nTranslator {
|
|||
|
||||
public void saveOriginalExcelProperty() {
|
||||
readExcelProperty(clazz, (fieldName, memberValues) -> {
|
||||
List<String> values = Arrays.asList((String [])memberValues.get("value"));
|
||||
List<String> values = Arrays.asList((String[]) memberValues.get("value"));
|
||||
List<String> copyValues = new ArrayList<>();
|
||||
values.forEach(value -> {
|
||||
copyValues.add(value);
|
||||
|
@ -74,11 +74,11 @@ public class EasyExcelI18nTranslator {
|
|||
}
|
||||
|
||||
public void translateExcelProperty() {
|
||||
readExcelProperty(TestCaseExcelData.class, (fieldName, memberValues) -> {
|
||||
String [] values = (String[]) memberValues.get("value");
|
||||
readExcelProperty(TestCaseExcelData.class, (fieldName, memberValues) -> {
|
||||
String[] values = (String[]) memberValues.get("value");
|
||||
for (int j = 0; j < values.length; j++) {
|
||||
if (Pattern.matches("^\\{.+\\}$", values[j])) {
|
||||
values[j] = Translator.get(values[j].substring(1, values[j].length() - 1));
|
||||
values[j] = Translator.get(values[j].substring(1, values[j].length() - 1));
|
||||
}
|
||||
}
|
||||
memberValues.put("value", values);
|
||||
|
@ -87,7 +87,7 @@ public class EasyExcelI18nTranslator {
|
|||
|
||||
public void resetExcelProperty() {
|
||||
readExcelProperty(clazz, (fieldName, memberValues) -> {
|
||||
String [] values = (String[]) memberValues.get("value");
|
||||
String[] values = (String[]) memberValues.get("value");
|
||||
List<String> list = excelPropertyMap.get(fieldName);
|
||||
for (int j = 0; j < values.length; j++) {
|
||||
values[j] = list.get(j);
|
||||
|
|
|
@ -2,7 +2,6 @@ package io.metersphere.excel.utils;
|
|||
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
import javax.annotation.Resource;
|
||||
|
@ -20,7 +19,7 @@ public class ExcelValidateHelper {
|
|||
@Resource
|
||||
Validator validator;
|
||||
|
||||
public static <T> String validateEntity(T obj) throws NoSuchFieldException {
|
||||
public static <T> String validateEntity(T obj) throws NoSuchFieldException {
|
||||
StringBuilder result = new StringBuilder();
|
||||
Set<ConstraintViolation<T>> set = excelValidateHelper.validator.validate(obj, Default.class);
|
||||
if (set != null && !set.isEmpty()) {
|
||||
|
@ -28,7 +27,7 @@ public class ExcelValidateHelper {
|
|||
Field declaredField = obj.getClass().getDeclaredField(cv.getPropertyPath().toString());
|
||||
ExcelProperty annotation = declaredField.getAnnotation(ExcelProperty.class);
|
||||
//拼接错误信息,包含当前出错数据的标题名字+错误信息
|
||||
result.append(annotation.value()[0]+cv.getMessage()).append("; ");
|
||||
result.append(annotation.value()[0] + cv.getMessage()).append("; ");
|
||||
}
|
||||
}
|
||||
return result.toString();
|
||||
|
|
|
@ -7,11 +7,11 @@ public class ExcelException extends RuntimeException {
|
|||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
public ExcelException(String message, Exception e){
|
||||
public ExcelException(String message, Exception e) {
|
||||
super(message, e);
|
||||
}
|
||||
|
||||
public ExcelException(String message){
|
||||
public ExcelException(String message) {
|
||||
super(message);
|
||||
}
|
||||
|
||||
|
|
|
@ -20,7 +20,7 @@ public abstract class MsScheduleJob implements Job {
|
|||
this.userId = jobDataMap.getString("userId");
|
||||
this.expression = jobDataMap.getString("expression");
|
||||
|
||||
LogUtil.info(jobKey.getGroup()+ " Running: " + resourceId);
|
||||
LogUtil.info(jobKey.getGroup() + " Running: " + resourceId);
|
||||
LogUtil.info("CronExpression: " + expression);
|
||||
businessExecute(context);
|
||||
}
|
||||
|
|
|
@ -14,6 +14,7 @@ public class ScheduleManager {
|
|||
|
||||
/**
|
||||
* 添加 simpleJob
|
||||
*
|
||||
* @param jobKey
|
||||
* @param triggerKey
|
||||
* @param cls
|
||||
|
@ -22,7 +23,7 @@ public class ScheduleManager {
|
|||
* @throws SchedulerException
|
||||
*/
|
||||
public void addSimpleJob(JobKey jobKey, TriggerKey triggerKey, Class<? extends Job> cls, int repeatIntervalTime,
|
||||
JobDataMap jobDataMap) throws SchedulerException {
|
||||
JobDataMap jobDataMap) throws SchedulerException {
|
||||
|
||||
JobBuilder jobBuilder = JobBuilder.newJob(cls).withIdentity(jobKey);
|
||||
|
||||
|
@ -58,6 +59,7 @@ public class ScheduleManager {
|
|||
|
||||
/**
|
||||
* 添加 cronJob
|
||||
*
|
||||
* @param jobKey
|
||||
* @param triggerKey
|
||||
* @param jobClass
|
||||
|
@ -102,6 +104,7 @@ public class ScheduleManager {
|
|||
|
||||
/**
|
||||
* 修改 cronTrigger
|
||||
*
|
||||
* @param triggerKey
|
||||
* @param cron
|
||||
* @throws SchedulerException
|
||||
|
@ -149,6 +152,7 @@ public class ScheduleManager {
|
|||
|
||||
/**
|
||||
* 修改simpleTrigger触发器的触发时间
|
||||
*
|
||||
* @param triggerKey
|
||||
* @param repeatIntervalTime
|
||||
* @throws SchedulerException
|
||||
|
@ -199,12 +203,10 @@ public class ScheduleManager {
|
|||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @Title:
|
||||
* @Description: 根据job和trigger删除任务
|
||||
*
|
||||
* @param jobKey
|
||||
* @param triggerKey
|
||||
* @Title:
|
||||
* @Description: 根据job和trigger删除任务
|
||||
*/
|
||||
public void removeJob(JobKey jobKey, TriggerKey triggerKey) {
|
||||
|
||||
|
@ -248,6 +250,7 @@ public class ScheduleManager {
|
|||
|
||||
/**
|
||||
* 新增或者修改 simpleJob
|
||||
*
|
||||
* @param jobKey
|
||||
* @param triggerKey
|
||||
* @param clz
|
||||
|
@ -256,7 +259,7 @@ public class ScheduleManager {
|
|||
* @throws SchedulerException
|
||||
*/
|
||||
public void addOrUpdateSimpleJob(JobKey jobKey, TriggerKey triggerKey, Class clz,
|
||||
int intervalTime, JobDataMap jobDataMap) throws SchedulerException {
|
||||
int intervalTime, JobDataMap jobDataMap) throws SchedulerException {
|
||||
|
||||
if (scheduler.checkExists(triggerKey)) {
|
||||
modifySimpleJobTime(triggerKey, intervalTime);
|
||||
|
@ -273,6 +276,7 @@ public class ScheduleManager {
|
|||
|
||||
/**
|
||||
* 添加或修改 cronJob
|
||||
*
|
||||
* @param jobKey
|
||||
* @param triggerKey
|
||||
* @param jobClass
|
||||
|
|
|
@ -13,7 +13,10 @@ import io.metersphere.service.UserService;
|
|||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.shiro.SecurityUtils;
|
||||
import org.springframework.ldap.core.DirContextOperations;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
|
|
|
@ -14,7 +14,7 @@ public class Person {
|
|||
|
||||
@Id
|
||||
private Name id;
|
||||
@DnAttribute(value="uid",index = 0)
|
||||
@DnAttribute(value = "uid", index = 0)
|
||||
private String uid;
|
||||
@Attribute(name = "cn")
|
||||
private String commonName;
|
||||
|
|
|
@ -55,7 +55,6 @@ public class LdapService {
|
|||
getMappingAttr("email", dirContextOperations);
|
||||
|
||||
|
||||
|
||||
return dirContextOperations;
|
||||
}
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@ public class AppStartListener implements ApplicationListener<ApplicationReadyEve
|
|||
System.out.println("================= 应用启动 =================");
|
||||
|
||||
try {
|
||||
Thread.sleep(5*60*1000);
|
||||
Thread.sleep(5 * 60 * 1000);
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
|
|
@ -15,12 +15,11 @@ 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;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.OutputStream;
|
||||
import java.util.List;
|
||||
|
||||
@RestController
|
||||
|
@ -112,11 +111,15 @@ public class PerformanceReportController {
|
|||
}
|
||||
|
||||
@GetMapping("log/download/{reportId}/{resourceId}")
|
||||
public ResponseEntity<byte[]> downloadLog(@PathVariable String reportId, @PathVariable String resourceId) {
|
||||
byte[] bytes = reportService.downloadLog(reportId, resourceId);
|
||||
return ResponseEntity.ok()
|
||||
.contentType(MediaType.parseMediaType("application/octet-stream"))
|
||||
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"jmeter.log\"")
|
||||
.body(bytes);
|
||||
public void downloadLog(@PathVariable String reportId, @PathVariable String resourceId, HttpServletResponse response) throws Exception {
|
||||
try (OutputStream outputStream = response.getOutputStream()) {
|
||||
List<String> content = reportService.downloadLog(reportId, resourceId);
|
||||
response.setContentType("application/x-download");
|
||||
response.addHeader("Content-Disposition", "attachment;filename=jmeter.log");
|
||||
for (String log : content) {
|
||||
outputStream.write(log.getBytes());
|
||||
}
|
||||
outputStream.flush();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -100,6 +100,9 @@ public class PerformanceTestService {
|
|||
});
|
||||
}
|
||||
|
||||
//delete schedule
|
||||
scheduleService.deleteByResourceId(testId);
|
||||
|
||||
// delete load_test
|
||||
loadTestMapper.deleteByPrimaryKey(request.getId());
|
||||
|
||||
|
|
|
@ -25,6 +25,7 @@ import org.springframework.transaction.annotation.Transactional;
|
|||
import javax.annotation.Resource;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Service
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
|
@ -210,14 +211,13 @@ public class ReportService {
|
|||
return loadTestReportLogMapper.selectByExampleWithBLOBs(example);
|
||||
}
|
||||
|
||||
public byte[] downloadLog(String reportId, String resourceId) {
|
||||
public List<String> downloadLog(String reportId, String resourceId) {
|
||||
LoadTestReportLogExample example = new LoadTestReportLogExample();
|
||||
example.createCriteria().andReportIdEqualTo(reportId).andResourceIdEqualTo(resourceId);
|
||||
example.setOrderByClause("part desc");
|
||||
List<LoadTestReportLog> loadTestReportLogs = loadTestReportLogMapper.selectByExampleWithBLOBs(example);
|
||||
|
||||
String content = loadTestReportLogs.stream().map(LoadTestReportLog::getContent).reduce("", (a, b) -> a + b);
|
||||
return content.getBytes();
|
||||
return loadTestReportLogs.stream().map(LoadTestReportLog::getContent).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
public LoadTestReport getReport(String reportId) {
|
||||
|
|
|
@ -10,13 +10,12 @@ import org.springframework.stereotype.Service;
|
|||
import org.springframework.util.CollectionUtils;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
@Service
|
||||
public class FileService {
|
||||
@Resource
|
||||
|
|
|
@ -129,7 +129,7 @@ public class ProjectService {
|
|||
projectMapper.updateByPrimaryKeySelective(project);
|
||||
}
|
||||
|
||||
private void checkProjectExist (Project project) {
|
||||
private void checkProjectExist(Project project) {
|
||||
if (project.getName() != null) {
|
||||
ProjectExample example = new ProjectExample();
|
||||
example.createCriteria()
|
||||
|
|
|
@ -5,6 +5,7 @@ import io.metersphere.base.mapper.RoleMapper;
|
|||
import io.metersphere.base.mapper.ext.ExtRoleMapper;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
|
||||
|
|
|
@ -7,6 +7,7 @@ import io.metersphere.base.mapper.ScheduleMapper;
|
|||
import io.metersphere.commons.exception.MSException;
|
||||
import io.metersphere.commons.utils.LogUtil;
|
||||
import io.metersphere.commons.utils.SessionUtils;
|
||||
import io.metersphere.job.sechedule.ApiTestJob;
|
||||
import io.metersphere.job.sechedule.ScheduleManager;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.quartz.JobKey;
|
||||
|
@ -22,7 +23,7 @@ import java.util.UUID;
|
|||
@Service
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public class ScheduleService {
|
||||
|
||||
|
||||
@Resource
|
||||
private ScheduleMapper scheduleMapper;
|
||||
@Resource
|
||||
|
@ -52,9 +53,18 @@ public class ScheduleService {
|
|||
}
|
||||
|
||||
public int deleteSchedule(String scheduleId) {
|
||||
Schedule schedule = scheduleMapper.selectByPrimaryKey(scheduleId);
|
||||
removeJob(schedule.getResourceId());
|
||||
return scheduleMapper.deleteByPrimaryKey(scheduleId);
|
||||
}
|
||||
|
||||
public int deleteByResourceId(String resourceId) {
|
||||
ScheduleExample scheduleExample = new ScheduleExample();
|
||||
scheduleExample.createCriteria().andResourceIdEqualTo(resourceId);
|
||||
removeJob(resourceId);
|
||||
return scheduleMapper.deleteByExample(scheduleExample);
|
||||
}
|
||||
|
||||
public List<Schedule> listSchedule() {
|
||||
ScheduleExample example = new ScheduleExample();
|
||||
return scheduleMapper.selectByExample(example);
|
||||
|
@ -93,6 +103,10 @@ public class ScheduleService {
|
|||
return schedule;
|
||||
}
|
||||
|
||||
public void removeJob(String resourceId) {
|
||||
scheduleManager.removeJob(ApiTestJob.getJobKey(resourceId), ApiTestJob.getTriggerKey(resourceId));
|
||||
}
|
||||
|
||||
public void addOrUpdateCronJob(Schedule request, JobKey jobKey, TriggerKey triggerKey, Class clazz) {
|
||||
Boolean enable = request.getEnable();
|
||||
String cronExpression = request.getValue();
|
||||
|
|
|
@ -13,6 +13,7 @@ import org.apache.commons.lang3.BooleanUtils;
|
|||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.mail.javamail.JavaMailSenderImpl;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.mail.MessagingException;
|
||||
import java.util.*;
|
||||
|
|
|
@ -18,7 +18,6 @@ import org.apache.commons.collections4.CollectionUtils;
|
|||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.web.client.RestTemplate;
|
||||
|
|
|
@ -33,8 +33,8 @@ public class UserRoleService {
|
|||
return extUserRoleMapper.getWorkspaceMemberRoles(workspaceId, userId);
|
||||
}
|
||||
|
||||
public List<Map<String,Object>> getUserRole(String userId) {
|
||||
List<Map<String,Object>> list = new ArrayList<>();
|
||||
public List<Map<String, Object>> getUserRole(String userId) {
|
||||
List<Map<String, Object>> list = new ArrayList<>();
|
||||
UserRoleExample userRoleExample = new UserRoleExample();
|
||||
userRoleExample.createCriteria().andUserIdEqualTo(userId);
|
||||
List<UserRole> userRoles = userRoleMapper.selectByExample(userRoleExample);
|
||||
|
|
|
@ -26,7 +26,6 @@ import org.springframework.util.CollectionUtils;
|
|||
import javax.annotation.Resource;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
|
|
|
@ -62,40 +62,40 @@ public class TestCaseController {
|
|||
}
|
||||
|
||||
@PostMapping("/list")
|
||||
public List<TestCase> getTestCaseByNodeId(@RequestBody List<String> nodeIds){
|
||||
public List<TestCase> getTestCaseByNodeId(@RequestBody List<String> nodeIds) {
|
||||
return testCaseService.getTestCaseByNodeId(nodeIds);
|
||||
}
|
||||
|
||||
@PostMapping("/name")
|
||||
public List<TestCase> getTestCaseNames(@RequestBody QueryTestCaseRequest request){
|
||||
public List<TestCase> getTestCaseNames(@RequestBody QueryTestCaseRequest request) {
|
||||
return testCaseService.getTestCaseNames(request);
|
||||
}
|
||||
|
||||
@GetMapping("/get/{testCaseId}")
|
||||
public TestCaseWithBLOBs getTestCase(@PathVariable String testCaseId){
|
||||
public TestCaseWithBLOBs getTestCase(@PathVariable String testCaseId) {
|
||||
return testCaseService.getTestCase(testCaseId);
|
||||
}
|
||||
|
||||
@GetMapping("/project/{testCaseId}")
|
||||
public Project getProjectByTestCaseId(@PathVariable String testCaseId){
|
||||
public Project getProjectByTestCaseId(@PathVariable String testCaseId) {
|
||||
return testCaseService.getProjectByTestCaseId(testCaseId);
|
||||
}
|
||||
|
||||
@PostMapping("/add")
|
||||
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
|
||||
public void addTestCase(@RequestBody TestCaseWithBLOBs testCase){
|
||||
public void addTestCase(@RequestBody TestCaseWithBLOBs testCase) {
|
||||
testCaseService.addTestCase(testCase);
|
||||
}
|
||||
|
||||
@PostMapping("/edit")
|
||||
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
|
||||
public void editTestCase(@RequestBody TestCaseWithBLOBs testCase){
|
||||
public void editTestCase(@RequestBody TestCaseWithBLOBs testCase) {
|
||||
testCaseService.editTestCase(testCase);
|
||||
}
|
||||
|
||||
@PostMapping("/delete/{testCaseId}")
|
||||
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
|
||||
public int deleteTestCase(@PathVariable String testCaseId){
|
||||
public int deleteTestCase(@PathVariable String testCaseId) {
|
||||
return testCaseService.deleteTestCase(testCaseId);
|
||||
}
|
||||
|
||||
|
@ -107,24 +107,25 @@ public class TestCaseController {
|
|||
|
||||
@GetMapping("/export/template")
|
||||
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
|
||||
public void testCaseTemplateExport(HttpServletResponse response){
|
||||
public void testCaseTemplateExport(HttpServletResponse response) {
|
||||
testCaseService.testCaseTemplateExport(response);
|
||||
}
|
||||
@GetMapping("/export/testCase/{testCaseIds}")
|
||||
|
||||
@PostMapping("/export/testcase")
|
||||
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
|
||||
public void testCaseExport(HttpServletResponse response,QueryTestCaseRequest request){
|
||||
testCaseService.testCaseExport(response,request);
|
||||
public void testCaseExport(HttpServletResponse response, @RequestBody TestCaseBatchRequest request) {
|
||||
testCaseService.testCaseExport(response, request);
|
||||
}
|
||||
|
||||
@PostMapping("/batch/edit")
|
||||
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
|
||||
public void editTestCaseBath(@RequestBody TestCaseBatchRequest request){
|
||||
public void editTestCaseBath(@RequestBody TestCaseBatchRequest request) {
|
||||
testCaseService.editTestCaseBath(request);
|
||||
}
|
||||
|
||||
@PostMapping("/batch/delete")
|
||||
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
|
||||
public void deleteTestCaseBath(@RequestBody TestCaseBatchRequest request){
|
||||
public void deleteTestCaseBath(@RequestBody TestCaseBatchRequest request) {
|
||||
testCaseService.deleteTestCaseBath(request);
|
||||
}
|
||||
|
||||
|
|
|
@ -21,42 +21,43 @@ public class TestCaseNodeController {
|
|||
TestCaseNodeService testCaseNodeService;
|
||||
|
||||
@GetMapping("/list/{projectId}")
|
||||
public List<TestCaseNodeDTO> getNodeByProjectId(@PathVariable String projectId){
|
||||
public List<TestCaseNodeDTO> getNodeByProjectId(@PathVariable String projectId) {
|
||||
return testCaseNodeService.getNodeTreeByProjectId(projectId);
|
||||
}
|
||||
|
||||
/*模块列表列表*/
|
||||
@GetMapping("/list/all/plan/{planId}")
|
||||
public List<TestCaseNodeDTO> getAllNodeByPlanId(@PathVariable String planId){
|
||||
public List<TestCaseNodeDTO> getAllNodeByPlanId(@PathVariable String planId) {
|
||||
return testCaseNodeService.getAllNodeByPlanId(planId);
|
||||
}
|
||||
|
||||
@GetMapping("/list/plan/{planId}")
|
||||
public List<TestCaseNodeDTO> getNodeByPlanId(@PathVariable String planId){
|
||||
public List<TestCaseNodeDTO> getNodeByPlanId(@PathVariable String planId) {
|
||||
return testCaseNodeService.getNodeByPlanId(planId);
|
||||
}
|
||||
|
||||
@PostMapping("/add")
|
||||
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
|
||||
public String addNode(@RequestBody TestCaseNode node){
|
||||
public String addNode(@RequestBody TestCaseNode node) {
|
||||
return testCaseNodeService.addNode(node);
|
||||
}
|
||||
|
||||
@PostMapping("/edit")
|
||||
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
|
||||
public int editNode(@RequestBody DragNodeRequest node){
|
||||
public int editNode(@RequestBody DragNodeRequest node) {
|
||||
return testCaseNodeService.editNode(node);
|
||||
}
|
||||
|
||||
@PostMapping("/delete")
|
||||
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
|
||||
public int deleteNode(@RequestBody List<String> nodeIds){
|
||||
public int deleteNode(@RequestBody List<String> nodeIds) {
|
||||
//nodeIds 包含删除节点ID及其所有子节点ID
|
||||
return testCaseNodeService.deleteNode(nodeIds);
|
||||
}
|
||||
|
||||
@PostMapping("/drag")
|
||||
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
|
||||
public void dragNode(@RequestBody DragNodeRequest node){
|
||||
public void dragNode(@RequestBody DragNodeRequest node) {
|
||||
testCaseNodeService.dragNode(node);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,7 +3,6 @@ package io.metersphere.track.controller;
|
|||
import io.metersphere.base.domain.TestCaseReport;
|
||||
import io.metersphere.commons.constants.RoleConstants;
|
||||
import io.metersphere.track.request.testCaseReport.CreateReportRequest;
|
||||
import io.metersphere.track.dto.TestCaseReportMetricDTO;
|
||||
import io.metersphere.track.service.TestCaseReportService;
|
||||
import org.apache.shiro.authz.annotation.Logical;
|
||||
import org.apache.shiro.authz.annotation.RequiresRoles;
|
||||
|
@ -25,25 +24,25 @@ public class TestCaseReportController {
|
|||
}
|
||||
|
||||
@GetMapping("/get/{id}")
|
||||
public TestCaseReport get(@PathVariable String id){
|
||||
public TestCaseReport get(@PathVariable String id) {
|
||||
return testCaseReportService.getTestCaseReport(id);
|
||||
}
|
||||
|
||||
@PostMapping("/add")
|
||||
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
|
||||
public String addByTemplateId(@RequestBody CreateReportRequest request){
|
||||
public String addByTemplateId(@RequestBody CreateReportRequest request) {
|
||||
return testCaseReportService.addTestCaseReportByTemplateId(request);
|
||||
}
|
||||
|
||||
@PostMapping("/edit")
|
||||
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
|
||||
public void edit(@RequestBody TestCaseReport TestCaseReport){
|
||||
public void edit(@RequestBody TestCaseReport TestCaseReport) {
|
||||
testCaseReportService.editTestCaseReport(TestCaseReport);
|
||||
}
|
||||
|
||||
@PostMapping("/delete/{id}")
|
||||
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
|
||||
public int delete(@PathVariable String id){
|
||||
public int delete(@PathVariable String id) {
|
||||
return testCaseReportService.deleteTestCaseReport(id);
|
||||
}
|
||||
|
||||
|
|
|
@ -24,25 +24,25 @@ public class TestCaseReportTemplateController {
|
|||
}
|
||||
|
||||
@GetMapping("/get/{id}")
|
||||
public TestCaseReportTemplate get(@PathVariable String id){
|
||||
public TestCaseReportTemplate get(@PathVariable String id) {
|
||||
return testCaseReportTemplateService.getTestCaseReportTemplate(id);
|
||||
}
|
||||
|
||||
@PostMapping("/add")
|
||||
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
|
||||
public void add(@RequestBody TestCaseReportTemplate testCaseReportTemplate){
|
||||
public void add(@RequestBody TestCaseReportTemplate testCaseReportTemplate) {
|
||||
testCaseReportTemplateService.addTestCaseReportTemplate(testCaseReportTemplate);
|
||||
}
|
||||
|
||||
@PostMapping("/edit")
|
||||
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
|
||||
public void edit(@RequestBody TestCaseReportTemplate testCaseReportTemplate){
|
||||
public void edit(@RequestBody TestCaseReportTemplate testCaseReportTemplate) {
|
||||
testCaseReportTemplateService.editTestCaseReportTemplate(testCaseReportTemplate);
|
||||
}
|
||||
|
||||
@PostMapping("/delete/{id}")
|
||||
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
|
||||
public int delete(@PathVariable String id){
|
||||
public int delete(@PathVariable String id) {
|
||||
return testCaseReportTemplateService.deleteTestCaseReportTemplate(id);
|
||||
}
|
||||
|
||||
|
|
|
@ -63,41 +63,41 @@ public class TestPlanController {
|
|||
}
|
||||
|
||||
@PostMapping("/get/{testPlanId}")
|
||||
public TestPlan getTestPlan(@PathVariable String testPlanId){
|
||||
public TestPlan getTestPlan(@PathVariable String testPlanId) {
|
||||
return testPlanService.getTestPlan(testPlanId);
|
||||
}
|
||||
|
||||
@PostMapping("/add")
|
||||
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
|
||||
public void addTestPlan(@RequestBody TestPlan testPlan){
|
||||
public void addTestPlan(@RequestBody TestPlan testPlan) {
|
||||
testPlanService.addTestPlan(testPlan);
|
||||
}
|
||||
|
||||
@PostMapping("/edit")
|
||||
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
|
||||
public void editTestPlan(@RequestBody TestPlan testPlan){
|
||||
public void editTestPlan(@RequestBody TestPlan testPlan) {
|
||||
testPlanService.editTestPlan(testPlan);
|
||||
}
|
||||
|
||||
@PostMapping("/edit/status/{planId}")
|
||||
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
|
||||
public void editTestPlanStatus(@PathVariable String planId){
|
||||
public void editTestPlanStatus(@PathVariable String planId) {
|
||||
testPlanService.editTestPlanStatus(planId);
|
||||
}
|
||||
|
||||
@PostMapping("/delete/{testPlanId}")
|
||||
@RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR)
|
||||
public int deleteTestPlan(@PathVariable String testPlanId){
|
||||
public int deleteTestPlan(@PathVariable String testPlanId) {
|
||||
return testPlanService.deleteTestPlan(testPlanId);
|
||||
}
|
||||
|
||||
@PostMapping("/relevance")
|
||||
public void testPlanRelevance(@RequestBody PlanCaseRelevanceRequest request){
|
||||
public void testPlanRelevance(@RequestBody PlanCaseRelevanceRequest request) {
|
||||
testPlanService.testPlanRelevance(request);
|
||||
}
|
||||
|
||||
@GetMapping("/get/metric/{planId}")
|
||||
public TestCaseReportMetricDTO getMetric(@PathVariable String planId){
|
||||
public TestCaseReportMetricDTO getMetric(@PathVariable String planId) {
|
||||
return testPlanService.getMetric(planId);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,14 +2,13 @@ package io.metersphere.track.controller;
|
|||
|
||||
import com.github.pagehelper.Page;
|
||||
import com.github.pagehelper.PageHelper;
|
||||
import io.metersphere.base.domain.TestPlanTestCase;
|
||||
import io.metersphere.base.domain.TestPlanTestCaseWithBLOBs;
|
||||
import io.metersphere.commons.constants.RoleConstants;
|
||||
import io.metersphere.commons.utils.PageUtils;
|
||||
import io.metersphere.commons.utils.Pager;
|
||||
import io.metersphere.track.dto.TestPlanCaseDTO;
|
||||
import io.metersphere.track.request.testcase.TestPlanCaseBatchRequest;
|
||||
import io.metersphere.track.request.testplancase.QueryTestPlanCaseRequest;
|
||||
import io.metersphere.track.dto.TestPlanCaseDTO;
|
||||
import io.metersphere.track.service.TestPlanTestCaseService;
|
||||
import org.apache.shiro.authz.annotation.Logical;
|
||||
import org.apache.shiro.authz.annotation.RequiresRoles;
|
||||
|
@ -17,7 +16,6 @@ import org.springframework.web.bind.annotation.*;
|
|||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
@RequestMapping("/test/plan/case")
|
||||
|
|
|
@ -7,9 +7,12 @@ import io.metersphere.track.dto.TestPlanDTO;
|
|||
public abstract class ReportComponent {
|
||||
protected String componentId;
|
||||
protected TestPlanDTO testPlan;
|
||||
|
||||
public ReportComponent(TestPlanDTO testPlan) {
|
||||
this.testPlan = testPlan;
|
||||
}
|
||||
|
||||
public abstract void readRecord(TestPlanCaseDTO testCase);
|
||||
|
||||
public abstract void afterBuild(TestCaseReportMetricDTO testCaseReportMetric);
|
||||
}
|
||||
|
|
|
@ -11,6 +11,7 @@ import java.util.List;
|
|||
|
||||
public class ReportFailureResultComponent extends ReportComponent {
|
||||
private List<TestPlanCaseDTO> failureTestCases = new ArrayList<>();
|
||||
|
||||
public ReportFailureResultComponent(TestPlanDTO testPlan) {
|
||||
super(testPlan);
|
||||
componentId = "4";
|
||||
|
|
|
@ -55,7 +55,7 @@ public class ReportResultComponent extends ReportComponent {
|
|||
});
|
||||
|
||||
for (TestCaseReportModuleResultDTO moduleResult : moduleResultMap.values()) {
|
||||
moduleResult.setPassRate(MathUtils.getPercentWithDecimal(moduleResult.getPassCount()*1.0f/moduleResult.getCaseCount()));
|
||||
moduleResult.setPassRate(MathUtils.getPercentWithDecimal(moduleResult.getPassCount() * 1.0f / moduleResult.getCaseCount()));
|
||||
if (moduleResult.getCaseCount() <= 0) {
|
||||
moduleResultMap.remove(moduleResult.getModuleId());
|
||||
}
|
||||
|
@ -69,9 +69,9 @@ public class ReportResultComponent extends ReportComponent {
|
|||
|
||||
List<TestCaseNodeDTO> children = rootNode.getChildren();
|
||||
|
||||
if(children != null) {
|
||||
if (children != null) {
|
||||
Iterator<TestCaseNodeDTO> iterator = children.iterator();
|
||||
while(iterator.hasNext()){
|
||||
while (iterator.hasNext()) {
|
||||
getChildIds(iterator.next(), childIds);
|
||||
}
|
||||
}
|
||||
|
@ -95,7 +95,8 @@ public class ReportResultComponent extends ReportComponent {
|
|||
if (StringUtils.isNotBlank(testCase.getIssues())) {
|
||||
if (JSON.parseObject(testCase.getIssues()).getBoolean("hasIssues")) {
|
||||
moduleResult.setIssuesCount(moduleResult.getIssuesCount() + 1);
|
||||
};
|
||||
}
|
||||
;
|
||||
}
|
||||
moduleResultMap.put(rootNodeId, moduleResult);
|
||||
return;
|
||||
|
|
|
@ -1,9 +1,5 @@
|
|||
package io.metersphere.track.dto;
|
||||
|
||||
import io.metersphere.track.domain.ReportBaseInfoComponent;
|
||||
import io.metersphere.track.domain.ReportFailureResultComponent;
|
||||
import io.metersphere.track.domain.ReportResultChartComponent;
|
||||
import io.metersphere.track.domain.ReportResultComponent;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
package io.metersphere.track.dto;
|
||||
|
||||
import io.metersphere.base.domain.TestPlan;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
|
|
|
@ -12,7 +12,7 @@ import java.util.Map;
|
|||
@Setter
|
||||
public class QueryTestCaseRequest extends TestCase {
|
||||
|
||||
private String name;
|
||||
private String name;
|
||||
|
||||
private List<String> nodeIds;
|
||||
|
||||
|
|
|
@ -54,7 +54,7 @@ public class TestCaseNodeService {
|
|||
}
|
||||
|
||||
private void validateNode(TestCaseNode node) {
|
||||
if(node.getLevel() > TestCaseConstants.MAX_NODE_DEPTH){
|
||||
if (node.getLevel() > TestCaseConstants.MAX_NODE_DEPTH) {
|
||||
throw new RuntimeException(Translator.get("test_case_node_level_tip")
|
||||
+ TestCaseConstants.MAX_NODE_DEPTH + Translator.get("test_case_node_level"));
|
||||
}
|
||||
|
@ -97,7 +97,7 @@ public class TestCaseNodeService {
|
|||
|
||||
nodes.forEach(node -> {
|
||||
Integer level = node.getLevel();
|
||||
if( nodeLevelMap.containsKey(level) ){
|
||||
if (nodeLevelMap.containsKey(level)) {
|
||||
nodeLevelMap.get(level).add(node);
|
||||
} else {
|
||||
List<TestCaseNode> testCaseNodes = new ArrayList<>();
|
||||
|
@ -114,25 +114,26 @@ public class TestCaseNodeService {
|
|||
|
||||
/**
|
||||
* 递归构建节点树
|
||||
*
|
||||
* @param nodeLevelMap
|
||||
* @param rootNode
|
||||
* @return
|
||||
*/
|
||||
private TestCaseNodeDTO buildNodeTree(Map<Integer,List<TestCaseNode>> nodeLevelMap, TestCaseNode rootNode) {
|
||||
private TestCaseNodeDTO buildNodeTree(Map<Integer, List<TestCaseNode>> nodeLevelMap, TestCaseNode rootNode) {
|
||||
|
||||
TestCaseNodeDTO nodeTree = new TestCaseNodeDTO();
|
||||
BeanUtils.copyBean(nodeTree, rootNode);
|
||||
nodeTree.setLabel(rootNode.getName());
|
||||
|
||||
List<TestCaseNode> lowerNodes = nodeLevelMap.get(rootNode.getLevel() + 1);
|
||||
if(lowerNodes == null){
|
||||
if (lowerNodes == null) {
|
||||
return nodeTree;
|
||||
}
|
||||
|
||||
List<TestCaseNodeDTO> children = Optional.ofNullable(nodeTree.getChildren()).orElse(new ArrayList<>());
|
||||
|
||||
lowerNodes.forEach(node -> {
|
||||
if (node.getParentId() != null && node.getParentId().equals(rootNode.getId())){
|
||||
if (node.getParentId() != null && node.getParentId().equals(rootNode.getId())) {
|
||||
children.add(buildNodeTree(nodeLevelMap, node));
|
||||
nodeTree.setChildren(children);
|
||||
}
|
||||
|
@ -150,7 +151,7 @@ public class TestCaseNodeService {
|
|||
StringBuilder path = new StringBuilder(testCase.getNodePath());
|
||||
List<String> pathLists = Arrays.asList(path.toString().split("/"));
|
||||
pathLists.set(request.getLevel(), request.getName());
|
||||
path.delete( 0, path.length());
|
||||
path.delete(0, path.length());
|
||||
for (int i = 1; i < pathLists.size(); i++) {
|
||||
path = path.append("/").append(pathLists.get(i));
|
||||
}
|
||||
|
@ -175,6 +176,7 @@ public class TestCaseNodeService {
|
|||
/**
|
||||
* 获取当前计划下
|
||||
* 有关联数据的节点
|
||||
*
|
||||
* @param planId
|
||||
* @return
|
||||
*/
|
||||
|
@ -207,9 +209,9 @@ public class TestCaseNodeService {
|
|||
List<TestCaseNodeDTO> nodeTrees = getNodeTrees(nodes);
|
||||
|
||||
Iterator<TestCaseNodeDTO> iterator = nodeTrees.iterator();
|
||||
while(iterator.hasNext()){
|
||||
while (iterator.hasNext()) {
|
||||
TestCaseNodeDTO rootNode = iterator.next();
|
||||
if(pruningTree(rootNode, dataNodeIds)){
|
||||
if (pruningTree(rootNode, dataNodeIds)) {
|
||||
iterator.remove();
|
||||
}
|
||||
}
|
||||
|
@ -219,26 +221,27 @@ public class TestCaseNodeService {
|
|||
|
||||
/**
|
||||
* 去除没有数据的节点
|
||||
*
|
||||
* @param rootNode
|
||||
* @param nodeIds
|
||||
* @return 是否剪枝
|
||||
* */
|
||||
*/
|
||||
public boolean pruningTree(TestCaseNodeDTO rootNode, List<String> nodeIds) {
|
||||
|
||||
List<TestCaseNodeDTO> children = rootNode.getChildren();
|
||||
|
||||
if(children == null || children.isEmpty()){
|
||||
if (children == null || children.isEmpty()) {
|
||||
//叶子节点,并且该节点无数据
|
||||
if(!nodeIds.contains(rootNode.getId())){
|
||||
if (!nodeIds.contains(rootNode.getId())) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if(children != null) {
|
||||
if (children != null) {
|
||||
Iterator<TestCaseNodeDTO> iterator = children.iterator();
|
||||
while(iterator.hasNext()){
|
||||
while (iterator.hasNext()) {
|
||||
TestCaseNodeDTO subNode = iterator.next();
|
||||
if(pruningTree(subNode, nodeIds)){
|
||||
if (pruningTree(subNode, nodeIds)) {
|
||||
iterator.remove();
|
||||
}
|
||||
}
|
||||
|
@ -293,7 +296,8 @@ public class TestCaseNodeService {
|
|||
hasNode = true;
|
||||
createNodeByPathIterator(pathIterator, "/" + rootNodeName, nodeTree,
|
||||
pathMap, projectId, 2);
|
||||
};
|
||||
}
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -309,18 +313,19 @@ public class TestCaseNodeService {
|
|||
|
||||
/**
|
||||
* 根据目标节点路径,创建相关节点
|
||||
*
|
||||
* @param pathIterator 遍历子路径
|
||||
* @param path 当前路径
|
||||
* @param treeNode 当前节点
|
||||
* @param pathMap 记录节点路径对应的nodeId
|
||||
* @param path 当前路径
|
||||
* @param treeNode 当前节点
|
||||
* @param pathMap 记录节点路径对应的nodeId
|
||||
*/
|
||||
private void createNodeByPathIterator(Iterator<String> pathIterator, String path, TestCaseNodeDTO treeNode,
|
||||
Map<String, String> pathMap, String projectId, Integer level) {
|
||||
Map<String, String> pathMap, String projectId, Integer level) {
|
||||
|
||||
List<TestCaseNodeDTO> children = treeNode.getChildren();
|
||||
|
||||
if (children == null || children.isEmpty() || !pathIterator.hasNext()) {
|
||||
pathMap.put(path , treeNode.getId());
|
||||
pathMap.put(path, treeNode.getId());
|
||||
if (pathIterator.hasNext()) {
|
||||
createNodeByPath(pathIterator, pathIterator.next().trim(), treeNode, projectId, level, path, pathMap);
|
||||
}
|
||||
|
@ -336,7 +341,8 @@ public class TestCaseNodeService {
|
|||
hasNode = true;
|
||||
createNodeByPathIterator(pathIterator, path + "/" + child.getName(),
|
||||
child, pathMap, projectId, level + 1);
|
||||
};
|
||||
}
|
||||
;
|
||||
}
|
||||
|
||||
//若子节点中不包含该目标节点,则在该节点下创建
|
||||
|
@ -347,10 +353,9 @@ public class TestCaseNodeService {
|
|||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param pathIterator 迭代器,遍历子节点
|
||||
* @param nodeName 当前节点
|
||||
* @param pNode 父节点
|
||||
* @param nodeName 当前节点
|
||||
* @param pNode 父节点
|
||||
*/
|
||||
private void createNodeByPath(Iterator<String> pathIterator, String nodeName,
|
||||
TestCaseNodeDTO pNode, String projectId, Integer level,
|
||||
|
@ -467,7 +472,7 @@ public class TestCaseNodeService {
|
|||
}
|
||||
|
||||
List<TestCaseNodeDTO> children = rootNode.getChildren();
|
||||
if (children != null && children.size() > 0){
|
||||
if (children != null && children.size() > 0) {
|
||||
for (int i = 0; i < children.size(); i++) {
|
||||
buildUpdateTestCase(children.get(i), testCases, updateNodes, rootPath + '/', rootNode.getId(), level + 1);
|
||||
}
|
||||
|
|
|
@ -1,23 +1,22 @@
|
|||
package io.metersphere.track.service;
|
||||
|
||||
import io.metersphere.base.domain.*;
|
||||
import io.metersphere.base.mapper.*;
|
||||
import io.metersphere.base.mapper.ext.ExtTestCaseMapper;
|
||||
import io.metersphere.base.domain.TestCaseReport;
|
||||
import io.metersphere.base.domain.TestCaseReportExample;
|
||||
import io.metersphere.base.domain.TestCaseReportTemplate;
|
||||
import io.metersphere.base.domain.TestPlan;
|
||||
import io.metersphere.base.mapper.TestCaseReportMapper;
|
||||
import io.metersphere.base.mapper.TestCaseReportTemplateMapper;
|
||||
import io.metersphere.base.mapper.TestPlanMapper;
|
||||
import io.metersphere.base.mapper.ext.ExtTestPlanMapper;
|
||||
import io.metersphere.base.mapper.ext.ExtTestPlanTestCaseMapper;
|
||||
import io.metersphere.commons.constants.TestPlanTestCaseStatus;
|
||||
import io.metersphere.commons.utils.BeanUtils;
|
||||
import io.metersphere.track.request.testCaseReport.CreateReportRequest;
|
||||
import io.metersphere.track.request.testcase.QueryTestPlanRequest;
|
||||
import io.metersphere.track.request.testplancase.QueryTestPlanCaseRequest;
|
||||
import io.metersphere.track.dto.*;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.*;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
@Service
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
|
@ -37,7 +36,7 @@ public class TestCaseReportService {
|
|||
|
||||
public List<TestCaseReport> listTestCaseReport(TestCaseReport request) {
|
||||
TestCaseReportExample example = new TestCaseReportExample();
|
||||
if ( StringUtils.isNotBlank(request.getName()) ) {
|
||||
if (StringUtils.isNotBlank(request.getName())) {
|
||||
example.createCriteria().andNameEqualTo(request.getName());
|
||||
}
|
||||
return testCaseReportMapper.selectByExample(example);
|
||||
|
|
|
@ -26,11 +26,11 @@ public class TestCaseReportTemplateService {
|
|||
TestCaseReportTemplateExample example = new TestCaseReportTemplateExample();
|
||||
TestCaseReportTemplateExample.Criteria criteria1 = example.createCriteria();
|
||||
TestCaseReportTemplateExample.Criteria criteria2 = example.createCriteria();
|
||||
if ( StringUtils.isNotBlank(request.getName()) ) {
|
||||
if (StringUtils.isNotBlank(request.getName())) {
|
||||
criteria1.andNameLike("%" + request.getName() + "%");
|
||||
criteria2.andNameLike("%" + request.getName() + "%");
|
||||
}
|
||||
if ( StringUtils.isNotBlank(request.getWorkspaceId()) ) {
|
||||
if (StringUtils.isNotBlank(request.getWorkspaceId())) {
|
||||
criteria1.andWorkspaceIdEqualTo(request.getWorkspaceId());
|
||||
}
|
||||
if (request.getQueryDefault() != null) {
|
||||
|
@ -55,7 +55,7 @@ public class TestCaseReportTemplateService {
|
|||
testCaseReportTemplateMapper.updateByPrimaryKeyWithBLOBs(testCaseReportTemplate);
|
||||
}
|
||||
|
||||
private void checkCaseReportTemplateExist (TestCaseReportTemplate testCaseReportTemplate) {
|
||||
private void checkCaseReportTemplateExist(TestCaseReportTemplate testCaseReportTemplate) {
|
||||
TestCaseReportTemplateExample example = new TestCaseReportTemplateExample();
|
||||
example.createCriteria()
|
||||
.andNameEqualTo(testCaseReportTemplate.getName())
|
||||
|
|
|
@ -250,7 +250,7 @@ public class TestCaseService {
|
|||
if (!testCases.isEmpty()) {
|
||||
AtomicInteger sort = new AtomicInteger();
|
||||
AtomicInteger num = new AtomicInteger();
|
||||
num.set(getNextNum(projectId)+testCases.size());
|
||||
num.set(getNextNum(projectId) + testCases.size());
|
||||
testCases.forEach(testcase -> {
|
||||
testcase.setNodeId(nodePathMap.get(testcase.getNodePath()));
|
||||
testcase.setSort(sort.getAndIncrement());
|
||||
|
@ -310,7 +310,7 @@ public class TestCaseService {
|
|||
return list;
|
||||
}
|
||||
|
||||
public void testCaseExport(HttpServletResponse response, QueryTestCaseRequest request) {
|
||||
public void testCaseExport(HttpServletResponse response, TestCaseBatchRequest request) {
|
||||
EasyExcelExporter easyExcelExporter = null;
|
||||
try {
|
||||
easyExcelExporter = new EasyExcelExporter(TestCaseExcelData.class);
|
||||
|
@ -323,7 +323,7 @@ public class TestCaseService {
|
|||
}
|
||||
}
|
||||
|
||||
private List<TestCaseExcelData> generateTestCaseExcel(QueryTestCaseRequest request) {
|
||||
private List<TestCaseExcelData> generateTestCaseExcel(TestCaseBatchRequest request) {
|
||||
List<TestCaseDTO> TestCaseList = extTestCaseMapper.listBytestCaseIds(request);
|
||||
List<TestCaseExcelData> list = new ArrayList<>();
|
||||
SessionUser user = SessionUtils.getUser();
|
||||
|
@ -431,6 +431,7 @@ public class TestCaseService {
|
|||
|
||||
/**
|
||||
* 获取项目下一个num (页面展示的ID)
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
private int getNextNum(String projectId) {
|
||||
|
@ -438,7 +439,7 @@ public class TestCaseService {
|
|||
if (testCase == null) {
|
||||
return 100001;
|
||||
} else {
|
||||
return Optional.ofNullable(testCase.getNum()+1).orElse(100001);
|
||||
return Optional.ofNullable(testCase.getNum() + 1).orElse(100001);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,11 +1,13 @@
|
|||
package io.metersphere.track.service;
|
||||
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import io.metersphere.base.domain.*;
|
||||
import io.metersphere.base.mapper.*;
|
||||
import io.metersphere.base.mapper.TestCaseMapper;
|
||||
import io.metersphere.base.mapper.TestCaseReportMapper;
|
||||
import io.metersphere.base.mapper.TestPlanMapper;
|
||||
import io.metersphere.base.mapper.TestPlanTestCaseMapper;
|
||||
import io.metersphere.base.mapper.ext.ExtProjectMapper;
|
||||
import io.metersphere.base.mapper.ext.ExtTestPlanMapper;
|
||||
import io.metersphere.base.mapper.ext.ExtTestPlanTestCaseMapper;
|
||||
|
@ -16,15 +18,15 @@ import io.metersphere.commons.user.SessionUser;
|
|||
import io.metersphere.commons.utils.MathUtils;
|
||||
import io.metersphere.commons.utils.ServiceUtils;
|
||||
import io.metersphere.commons.utils.SessionUtils;
|
||||
import io.metersphere.controller.request.ProjectRequest;
|
||||
import io.metersphere.controller.request.member.QueryMemberRequest;
|
||||
import io.metersphere.dto.ProjectDTO;
|
||||
import io.metersphere.i18n.Translator;
|
||||
import io.metersphere.track.Factory.ReportComponentFactory;
|
||||
import io.metersphere.track.domain.ReportComponent;
|
||||
import io.metersphere.track.dto.*;
|
||||
import io.metersphere.track.dto.TestCaseReportMetricDTO;
|
||||
import io.metersphere.track.dto.TestPlanCaseDTO;
|
||||
import io.metersphere.track.dto.TestPlanDTO;
|
||||
import io.metersphere.track.dto.TestPlanDTOWithMetric;
|
||||
import io.metersphere.track.request.testcase.PlanCaseRelevanceRequest;
|
||||
import io.metersphere.track.request.testcase.QueryTestPlanRequest;
|
||||
import io.metersphere.i18n.Translator;
|
||||
import io.metersphere.track.request.testplancase.QueryTestPlanCaseRequest;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.ibatis.session.ExecutorType;
|
||||
|
@ -35,10 +37,8 @@ import org.springframework.stereotype.Service;
|
|||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
@Service
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
|
@ -75,7 +75,8 @@ public class TestPlanService {
|
|||
public void addTestPlan(TestPlan testPlan) {
|
||||
if (getTestPlanByName(testPlan.getName()).size() > 0) {
|
||||
MSException.throwException(Translator.get("plan_name_already_exists"));
|
||||
};
|
||||
}
|
||||
;
|
||||
testPlan.setId(UUID.randomUUID().toString());
|
||||
testPlan.setStatus(TestPlanStatus.Prepare.name());
|
||||
testPlan.setCreateTime(System.currentTimeMillis());
|
||||
|
@ -100,7 +101,7 @@ public class TestPlanService {
|
|||
return testPlanMapper.updateByPrimaryKeySelective(testPlan);
|
||||
}
|
||||
|
||||
private void checkTestPlanExist (TestPlan testPlan) {
|
||||
private void checkTestPlanExist(TestPlan testPlan) {
|
||||
if (testPlan.getName() != null) {
|
||||
TestPlanExample example = new TestPlanExample();
|
||||
example.createCriteria()
|
||||
|
@ -142,8 +143,8 @@ public class TestPlanService {
|
|||
|
||||
Map<String, TestCaseWithBLOBs> testCaseMap =
|
||||
testCaseMapper.selectByExampleWithBLOBs(testCaseExample)
|
||||
.stream()
|
||||
.collect(Collectors.toMap(TestCase::getId, testcase -> testcase));
|
||||
.stream()
|
||||
.collect(Collectors.toMap(TestCase::getId, testcase -> testcase));
|
||||
|
||||
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
|
||||
TestPlanTestCaseMapper batchMapper = sqlSession.getMapper(TestPlanTestCaseMapper.class);
|
||||
|
@ -193,7 +194,7 @@ public class TestPlanService {
|
|||
public List<TestPlanDTOWithMetric> listRelateAllPlan() {
|
||||
SessionUser user = SessionUtils.getUser();
|
||||
|
||||
QueryTestPlanRequest request = new QueryTestPlanRequest();
|
||||
QueryTestPlanRequest request = new QueryTestPlanRequest();
|
||||
request.setPrincipal(user.getId());
|
||||
request.setWorkspaceId(SessionUtils.getCurrentWorkspaceId());
|
||||
request.setPlanIds(extTestPlanTestCaseMapper.findRelateTestPlanId(user.getId(), SessionUtils.getCurrentWorkspaceId()));
|
||||
|
@ -231,8 +232,8 @@ public class TestPlanService {
|
|||
}
|
||||
});
|
||||
}
|
||||
testPlan.setPassRate(MathUtils.getPercentWithDecimal(testPlan.getTested() == 0 ? 0 : testPlan.getPassed()*1.0/testPlan.getTested()));
|
||||
testPlan.setTestRate(MathUtils.getPercentWithDecimal(testPlan.getTotal() == 0 ? 0 : testPlan.getTested()*1.0/testPlan.getTotal()));
|
||||
testPlan.setPassRate(MathUtils.getPercentWithDecimal(testPlan.getTested() == 0 ? 0 : testPlan.getPassed() * 1.0 / testPlan.getTested()));
|
||||
testPlan.setTestRate(MathUtils.getPercentWithDecimal(testPlan.getTotal() == 0 ? 0 : testPlan.getTested() * 1.0 / testPlan.getTotal()));
|
||||
});
|
||||
|
||||
return testPlans;
|
||||
|
@ -263,7 +264,7 @@ public class TestPlanService {
|
|||
List<ReportComponent> components = ReportComponentFactory.createComponents(componentIds.toJavaList(String.class), testPlan);
|
||||
|
||||
List<TestPlanCaseDTO> testPlanTestCases = listTestCaseByPlanId(planId);
|
||||
for (TestPlanCaseDTO testCase: testPlanTestCases) {
|
||||
for (TestPlanCaseDTO testCase : testPlanTestCases) {
|
||||
components.forEach(component -> {
|
||||
component.readRecord(testCase);
|
||||
});
|
||||
|
@ -287,7 +288,7 @@ public class TestPlanService {
|
|||
TestPlan testPlan = new TestPlan();
|
||||
testPlan.setId(planId);
|
||||
|
||||
for (String status: statusList){
|
||||
for (String status : statusList) {
|
||||
if (StringUtils.equals(status, TestPlanTestCaseStatus.Prepare.name())
|
||||
|| StringUtils.equals(status, TestPlanTestCaseStatus.Underway.name())) {
|
||||
testPlan.setStatus(TestPlanStatus.Underway.name());
|
||||
|
|
|
@ -1,7 +1,10 @@
|
|||
package io.metersphere.track.service;
|
||||
|
||||
import com.github.pagehelper.PageHelper;
|
||||
import io.metersphere.base.domain.*;
|
||||
import io.metersphere.base.domain.TestPlan;
|
||||
import io.metersphere.base.domain.TestPlanTestCaseExample;
|
||||
import io.metersphere.base.domain.TestPlanTestCaseWithBLOBs;
|
||||
import io.metersphere.base.domain.User;
|
||||
import io.metersphere.base.mapper.TestPlanTestCaseMapper;
|
||||
import io.metersphere.base.mapper.ext.ExtTestPlanTestCaseMapper;
|
||||
import io.metersphere.commons.constants.TestPlanTestCaseStatus;
|
||||
|
@ -9,11 +12,9 @@ import io.metersphere.commons.user.SessionUser;
|
|||
import io.metersphere.commons.utils.BeanUtils;
|
||||
import io.metersphere.commons.utils.ServiceUtils;
|
||||
import io.metersphere.commons.utils.SessionUtils;
|
||||
import io.metersphere.controller.request.OrderRequest;
|
||||
import io.metersphere.controller.request.member.QueryMemberRequest;
|
||||
import io.metersphere.service.UserService;
|
||||
import io.metersphere.track.dto.TestPlanCaseDTO;
|
||||
import io.metersphere.track.dto.TestPlanDTO;
|
||||
import io.metersphere.track.request.testcase.TestPlanCaseBatchRequest;
|
||||
import io.metersphere.track.request.testplancase.QueryTestPlanCaseRequest;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
<parent>
|
||||
<artifactId>metersphere-server</artifactId>
|
||||
<groupId>io.metersphere</groupId>
|
||||
<version>1.0</version>
|
||||
<version>1.1</version>
|
||||
</parent>
|
||||
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
<template>
|
||||
<el-dialog :title="$t('api_test.environment.environment_config')" :visible.sync="visible" class="environment-dialog" @close="close" :modal="false">
|
||||
<el-dialog :title="$t('api_test.environment.environment_config')" :visible.sync="visible" class="environment-dialog"
|
||||
@close="close" append-to-body ref="environmentConfig">
|
||||
<el-container v-loading="result.loading">
|
||||
<ms-aside-item :title="$t('api_test.environment.environment_list')" :data="environments" :item-operators="environmentOperators" :add-fuc="addEnvironment"
|
||||
:delete-fuc="deleteEnvironment" @itemSelected="environmentSelected" ref="environmentItems"/>
|
||||
|
|
|
@ -72,6 +72,7 @@
|
|||
this.checkLanguage(language);
|
||||
this.result = this.$post("/user/update/current", user, response => {
|
||||
localStorage.setItem(TokenKey, JSON.stringify(response.data));
|
||||
window.location.reload();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
@ -107,7 +107,7 @@
|
|||
}
|
||||
let caseId = this.$route.params.caseId;
|
||||
this.openRecentTestCaseEditDialog(caseId);
|
||||
this.$router.push('/track/case/all');
|
||||
// this.$router.push('/track/case/all');
|
||||
} else if (route.params.projectId){
|
||||
this.getProjects();
|
||||
this.getProjectById(route.params.projectId);
|
||||
|
@ -205,7 +205,7 @@
|
|||
this.$get('/project/get/' + id, response => {
|
||||
let project = response.data;
|
||||
this.setCurrentProject(project);
|
||||
this.$router.push('/track/case/all');
|
||||
// this.$router.push('/track/case/all');
|
||||
});
|
||||
}
|
||||
if (id === 'all') {
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
<div>
|
||||
|
||||
<el-dialog
|
||||
<el-dialog @close="close"
|
||||
:title="operationType == 'edit' ? ( readOnly ? $t('test_track.case.view_case') : $t('test_track.case.edit_case')) : $t('test_track.case.create')"
|
||||
:visible.sync="dialogFormVisible" width="65%">
|
||||
|
||||
|
@ -218,10 +218,9 @@
|
|||
|
||||
<script>
|
||||
|
||||
import {CURRENT_PROJECT, WORKSPACE_ID, TokenKey} from '../../../../../common/js/constants';
|
||||
import {WORKSPACE_ID, TokenKey} from '../../../../../common/js/constants';
|
||||
import MsDialogFooter from '../../../common/components/MsDialogFooter'
|
||||
|
||||
|
||||
export default {
|
||||
name: "TestCaseEdit",
|
||||
components: {MsDialogFooter},
|
||||
|
@ -290,11 +289,15 @@
|
|||
watch: {
|
||||
treeNodes() {
|
||||
this.getModuleOptions();
|
||||
},
|
||||
currentProject() {
|
||||
this.getTestOptions();
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
open(testCase) {
|
||||
this.resetForm();
|
||||
this.listenGoBack();
|
||||
this.operationType = 'add';
|
||||
if (testCase) {
|
||||
//修改
|
||||
|
@ -346,6 +349,18 @@
|
|||
}
|
||||
});
|
||||
},
|
||||
listenGoBack() {
|
||||
//监听浏览器返回操作,关闭该对话框
|
||||
if (window.history && window.history.pushState) {
|
||||
history.pushState(null, null, document.URL);
|
||||
window.addEventListener('popstate', this.close, false);
|
||||
}
|
||||
},
|
||||
close() {
|
||||
//移除监听,防止监听其他页面
|
||||
window.removeEventListener('popstate', this.goBack, false);
|
||||
this.dialogFormVisible = false;
|
||||
},
|
||||
saveCase() {
|
||||
this.$refs['caseFrom'].validate((valid) => {
|
||||
if (valid) {
|
||||
|
|
|
@ -290,9 +290,10 @@
|
|||
},
|
||||
exportTestCase() {
|
||||
let config = {
|
||||
url: '/test/case/export/testCase/' + [...this.selectIds],
|
||||
method: 'get',
|
||||
responseType: 'blob'
|
||||
url: '/test/case/export/testcase',
|
||||
method: 'post',
|
||||
responseType: 'blob',
|
||||
data: {ids: [...this.selectIds]}
|
||||
};
|
||||
this.result = this.$request(config).then(response => {
|
||||
const filename = this.$t('test_track.case.test_case') + ".xlsx";
|
||||
|
|
|
@ -8,7 +8,8 @@
|
|||
<el-menu-item :index="'/track/home'">
|
||||
{{ $t("i18n.home") }}
|
||||
</el-menu-item>
|
||||
<el-submenu v-permission="['test_manager','test_user','test_viewer']" index="3" popper-class="submenu">
|
||||
<el-submenu :class="{'deactivation':!isProjectActivation}"
|
||||
v-permission="['test_manager','test_user','test_viewer']" index="3" popper-class="submenu">
|
||||
<template v-slot:title>{{$t('commons.project')}}</template>
|
||||
<ms-recent-list :options="projectRecent"/>
|
||||
<el-divider/>
|
||||
|
@ -23,6 +24,7 @@
|
|||
<el-divider/>
|
||||
<ms-show-all :index="'/track/case/all'"/>
|
||||
<el-menu-item :index="testCaseEditPath" class="blank_item"></el-menu-item>
|
||||
<el-menu-item :index="testCaseProjectPath" class="blank_item"></el-menu-item>
|
||||
<ms-create-button v-permission="['test_manager','test_user']" :index="'/track/case/create'" :title="$t('test_track.case.create_case')"/>
|
||||
</el-submenu>
|
||||
|
||||
|
@ -55,6 +57,8 @@
|
|||
testPlanViewPath: '',
|
||||
isRouterAlive: true,
|
||||
testCaseEditPath: '',
|
||||
testCaseProjectPath: '',
|
||||
isProjectActivation: true,
|
||||
projectRecent: {
|
||||
title: this.$t('project.recent'),
|
||||
url: "/project/recent/5",
|
||||
|
@ -84,24 +88,38 @@
|
|||
}
|
||||
},
|
||||
watch: {
|
||||
'$route'(to, from) {
|
||||
let path = to.path;
|
||||
if (path.indexOf("/track/plan/view") >= 0) {
|
||||
this.testPlanViewPath = '/track/plan/view/' + this.$route.params.planId;
|
||||
this.reload();
|
||||
}
|
||||
if (path.indexOf("/track/case/edit") >= 0) {
|
||||
this.testCaseEditPath = '/track/case/edit/' + this.$route.params.caseId;
|
||||
this.reload();
|
||||
}
|
||||
'$route'(to) {
|
||||
this.init();
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.init();
|
||||
},
|
||||
methods: {
|
||||
reload() {
|
||||
this.isRouterAlive = false;
|
||||
this.$nextTick(function () {
|
||||
this.isRouterAlive = true;
|
||||
});
|
||||
},
|
||||
init() {
|
||||
let path = this.$route.path;
|
||||
if (path.indexOf("/track/case") >= 0 && !!this.$route.params.projectId) {
|
||||
this.testCaseProjectPath = path;
|
||||
//不激活项目菜单栏
|
||||
this.isProjectActivation = false;
|
||||
this.reload();
|
||||
} else {
|
||||
this.isProjectActivation = true;
|
||||
}
|
||||
if (path.indexOf("/track/plan/view") >= 0) {
|
||||
this.testPlanViewPath = path;
|
||||
this.reload();
|
||||
}
|
||||
if (path.indexOf("/track/case/edit") >= 0) {
|
||||
this.testCaseEditPath = path;
|
||||
this.reload();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -125,4 +143,9 @@
|
|||
.el-divider--horizontal {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.deactivation >>> .el-submenu__title {
|
||||
border-bottom: white !important;
|
||||
}
|
||||
|
||||
</style>
|
||||
|
|
|
@ -354,7 +354,6 @@
|
|||
}
|
||||
this.testCase = item;
|
||||
this.initTest();
|
||||
//
|
||||
this.stepResultChange();
|
||||
},
|
||||
openTestCaseEdit(testCase) {
|
||||
|
|
Loading…
Reference in New Issue