This commit is contained in:
chenjianxing 2020-07-28 16:22:57 +08:00
commit d513ae4403
18 changed files with 311 additions and 239 deletions

View File

@ -44,6 +44,11 @@
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
@ -126,10 +131,6 @@
<version>1.2.72</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
</dependency>
<!-- openapi -->
<dependency>
<groupId>org.springdoc</groupId>

View File

@ -4,13 +4,17 @@ import io.metersphere.config.JmeterProperties;
import io.metersphere.config.KafkaProperties;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.ldap.LdapAutoConfiguration;
import org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.context.annotation.PropertySource;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication(exclude = {QuartzAutoConfiguration.class})
@SpringBootApplication(exclude = {
QuartzAutoConfiguration.class,
LdapAutoConfiguration.class
})
@ServletComponentScan
@EnableConfigurationProperties({
KafkaProperties.class,

View File

@ -48,6 +48,7 @@ public class ShiroConfig implements EnvironmentAware {
filterChainDefinitionMap.put("/", "anon");
filterChainDefinitionMap.put("/signin", "anon");
filterChainDefinitionMap.put("/ldap/signin", "anon");
filterChainDefinitionMap.put("/ldap/open", "anon");
filterChainDefinitionMap.put("/isLogin", "anon");
filterChainDefinitionMap.put("/css/**", "anon");
filterChainDefinitionMap.put("/js/**", "anon");

View File

@ -7,6 +7,7 @@ import com.alibaba.excel.exception.ExcelAnalysisException;
import com.alibaba.excel.util.StringUtils;
import io.metersphere.commons.utils.LogUtil;
import io.metersphere.excel.domain.ExcelErrData;
import io.metersphere.excel.domain.TestCaseExcelData;
import io.metersphere.excel.utils.EasyExcelI18nTranslator;
import io.metersphere.excel.utils.ExcelValidateHelper;
import io.metersphere.i18n.Translator;
@ -24,6 +25,8 @@ public abstract class EasyExcelListener<T> extends AnalysisEventListener<T> {
protected EasyExcelI18nTranslator easyExcelI18nTranslator;
protected List<TestCaseExcelData> excelDataList = new ArrayList<>();
/**
* 每隔2000条存储数据库然后清理list 方便内存回收
*/

View File

@ -10,10 +10,7 @@ import io.metersphere.i18n.Translator;
import io.metersphere.track.service.TestCaseService;
import org.apache.commons.lang3.StringUtils;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.UUID;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
@ -57,10 +54,35 @@ public class TestCaseDataListener extends EasyExcelListener<TestCaseExcelData> {
if (!userIds.contains(data.getMaintainer())) {
stringBuilder.append(Translator.get("user_not_exists") + "" + data.getMaintainer() + "; ");
}
if (testCaseNames.contains(data.getName())) {
TestCaseWithBLOBs testCase = new TestCaseWithBLOBs();
BeanUtils.copyBean(testCase, data);
testCase.setProjectId(projectId);
String steps = getSteps(data);
testCase.setSteps(steps);
boolean dbExist = testCaseService.exist(testCase);
boolean excelExist = false;
if (dbExist) {
// db exist
stringBuilder.append(Translator.get("test_case_already_exists_excel") + "" + data.getName() + "; ");
} else {
// @Data 重写了 equals hashCode 方法
excelExist = excelDataList.contains(data);
}
if (excelExist) {
// excel exist
stringBuilder.append(Translator.get("test_case_already_exists_excel") + "" + data.getName() + "; ");
} else {
excelDataList.add(data);
}
} else {
testCaseNames.add(data.getName());
excelDataList.add(data);
}
return stringBuilder.toString();
}
@ -103,6 +125,13 @@ public class TestCaseDataListener extends EasyExcelListener<TestCaseExcelData> {
testCase.setNodePath(nodePath);
String steps = getSteps(data);
testCase.setSteps(steps);
return testCase;
}
public String getSteps(TestCaseExcelData data) {
JSONArray jsonArray = new JSONArray();
String[] stepDesc = new String[1];
@ -124,7 +153,8 @@ public class TestCaseDataListener extends EasyExcelListener<TestCaseExcelData> {
for (int i = 0; i < index; i++) {
JSONObject step = new JSONObject();
// 保持插入顺序判断用例是否有相同的steps
JSONObject step = new JSONObject(true);
step.put("num", i + 1);
Pattern descPattern = Pattern.compile(pattern);
@ -150,10 +180,7 @@ public class TestCaseDataListener extends EasyExcelListener<TestCaseExcelData> {
jsonArray.add(step);
}
testCase.setSteps(jsonArray.toJSONString());
return testCase;
return jsonArray.toJSONString();
}
}

View File

@ -13,10 +13,7 @@ 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.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@ -82,4 +79,9 @@ public class LdapController {
ldapService.authenticate(request);
}
@GetMapping("/open")
public boolean isOpen() {
return ldapService.isOpen();
}
}

View File

@ -92,9 +92,7 @@ public class LdapService {
if (result.size() == 1) {
return result.get(0);
}
} catch (NameNotFoundException e) {
MSException.throwException(Translator.get("login_fail_ou_error"));
} catch (InvalidNameException e) {
} catch (NameNotFoundException | InvalidNameException e) {
MSException.throwException(Translator.get("login_fail_ou_error"));
} catch (InvalidSearchFilterException e) {
MSException.throwException(Translator.get("login_fail_filter_error"));
@ -125,9 +123,7 @@ public class LdapService {
MSException.throwException(Translator.get("ldap_ou_is_null"));
}
String[] arr = ou.split("\\|");
return arr;
return ou.split("\\|");
}
private static class MsContextMapper extends AbstractContextMapper<DirContextOperations> {
@ -217,4 +213,11 @@ public class LdapService {
return result;
}
public boolean isOpen() {
String open = service.getValue(ParamConstants.LDAP.OPEN.getValue());
if (StringUtils.isBlank(open)) {
return false;
}
return StringUtils.equals(Boolean.TRUE.toString(), open);
}
}

View File

@ -106,13 +106,16 @@ public class TestCaseService {
TestCaseExample.Criteria criteria = example.createCriteria();
criteria.andNameEqualTo(testCase.getName())
.andProjectIdEqualTo(testCase.getProjectId())
.andNodeIdEqualTo(testCase.getNodeId())
.andNodePathEqualTo(testCase.getNodePath())
.andTypeEqualTo(testCase.getType())
.andMaintainerEqualTo(testCase.getMaintainer())
.andPriorityEqualTo(testCase.getPriority())
.andMethodEqualTo(testCase.getMethod());
// if (StringUtils.isNotBlank(testCase.getNodeId())) {
// criteria.andNodeIdEqualTo(testCase.getTestId());
// }
if (StringUtils.isNotBlank(testCase.getTestId())) {
criteria.andTestIdEqualTo(testCase.getTestId());
}
@ -371,8 +374,8 @@ public class TestCaseService {
JSONArray jsonArray = JSON.parseArray(steps);
for (int j = 0; j < jsonArray.size(); j++) {
int num = j + 1;
step.append(num + ":" + jsonArray.getJSONObject(j).getString("desc") + "\n");
result.append(num + ":" + jsonArray.getJSONObject(j).getString("result") + "\n");
step.append(num + "." + jsonArray.getJSONObject(j).getString("desc") + "\n");
result.append(num + "." + jsonArray.getJSONObject(j).getString("result") + "\n");
}
data.setStepDesc(step.toString());
@ -471,4 +474,21 @@ public class TestCaseService {
return Optional.ofNullable(testCase.getNum() + 1).orElse(100001);
}
}
/**
* 导入用例前检查数据库是否存在此用例
* @param testCaseWithBLOBs
* @return
*/
public boolean exist(TestCaseWithBLOBs testCaseWithBLOBs) {
try {
checkTestCaseExist(testCaseWithBLOBs);
} catch (MSException e) {
return true;
}
return false;
}
}

View File

@ -74,3 +74,7 @@ quartz.scheduler-name=msServerJob
spring.servlet.multipart.max-file-size=30MB
spring.servlet.multipart.max-request-size=30MB
# actuator
management.server.port=8083
management.endpoints.web.exposure.include=*

View File

@ -157,6 +157,6 @@
</logger>
<logger name="com.alibaba.nacos.naming.client.listener" additivity="false" level="ERROR"/>
<logger name="org.apache.dubbo.registry.nacos.NacosRegistry" additivity="false" level="ERROR"/>
<logger name="org.apache.dubbo" additivity="false" level="ERROR"/>
</configuration>

View File

@ -1,5 +1,5 @@
<template>
<div class="container" v-loading="loading">
<div class="container" v-loading="loading" :element-loading-text="$t('api_report.running')">
<div class="main-content">
<el-card>
<section class="report-container" v-if="this.report.testId">

View File

@ -4,7 +4,7 @@
{{ description }}
</div>
<el-form-item label="Protocol" prop="protocol" class="dubbo-form-item">
<el-select v-model="config.protocol" class="select-100">
<el-select v-model="config.protocol" class="select-100" clearable>
<el-option v-for="p in protocols" :key="p" :label="p" :value="p"/>
</el-select>
</el-form-item>

View File

@ -32,13 +32,13 @@
</el-form-item>
<el-form-item label="Async" prop="async" class="dubbo-form-item">
<el-select v-model="consumer.async" class="select-100">
<el-select v-model="consumer.async" class="select-100" clearable>
<el-option v-for="option in asyncOptions" :key="option" :label="option" :value="option"/>
</el-select>
</el-form-item>
<el-form-item label="LoadBalance" prop="loadBalance" class="dubbo-form-item">
<el-select v-model="consumer.loadBalance" class="select-100">
<el-select v-model="consumer.loadBalance" class="select-100" clearable>
<el-option v-for="option in loadBalances" :key="option" :label="option" :value="option"/>
</el-select>
</el-form-item>

View File

@ -4,7 +4,7 @@
{{ description }}
</div>
<el-form-item label="Protocol" prop="protocol" class="dubbo-form-item">
<el-select v-model="registry.protocol" class="select-100">
<el-select v-model="registry.protocol" class="select-100" clearable>
<el-option v-for="p in protocols" :key="p" :label="p" :value="p"/>
</el-select>
</el-form-item>

View File

@ -474,6 +474,7 @@ export default {
sub_result: "Sub Result",
detail: "Report detail",
delete: "Delete report",
running: "The test is running",
},
test_track: {
test_track: "Track",

View File

@ -473,6 +473,7 @@ export default {
sub_result: "子请求",
detail: "报告详情",
delete: "删除报告",
running: "测试执行中",
},
test_track: {
test_track: "测试跟踪",

View File

@ -473,6 +473,7 @@ export default {
sub_result: "子請求",
detail: "報告詳情",
delete: "刪除報告",
running: "測試執行中",
},
test_track: {
test_track: "測試跟踪",

View File

@ -17,8 +17,8 @@
<div class="form">
<el-form-item v-slot:default>
<el-radio-group v-model="form.authenticate">
<el-radio label="LDAP" size="mini">LDAP</el-radio>
<el-radio label="LOCAL" size="mini">普通登录</el-radio>
<el-radio label="LDAP" size="mini" v-if="openLdap">LDAP</el-radio>
<el-radio label="LOCAL" size="mini" v-if="openLdap">普通登录</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item prop="username">
@ -81,7 +81,8 @@
]
},
msg: '',
ready: false
ready: false,
openLdap: false
}
},
beforeCreate() {
@ -92,6 +93,9 @@
window.location.href = "/"
}
});
this.$get("/ldap/open", response => {
this.openLdap = response.data;
})
},
created: function () {
// ,,
@ -145,7 +149,7 @@
if (!language) {
this.$get("language", response => {
language = response.data;
localStorage.setItem(DEFAULT_LANGUAGE, language)
localStorage.setItem(DEFAULT_LANGUAGE, language);
window.location.href = "/"
})
} else {