This commit is contained in:
shiziyuan9527 2021-01-26 16:15:01 +08:00
commit c3c9b70238
27 changed files with 367 additions and 59 deletions

View File

@ -243,21 +243,23 @@ public class APIBackendListenerClient extends AbstractBackendListenerClient impl
BaseSystemConfigDTO baseSystemConfigDTO = systemParameterService.getBaseInfo();
String url = reportUrl;
String url2 = reportUrl;
if (StringUtils.isEmpty(url)) {
url = baseSystemConfigDTO.getUrl() + "/#/api/report/view/" + report.getId();
url2 = baseSystemConfigDTO.getUrl() + "/#/api/automation/report";
}
String successContext = "";
String failedContext = "";
String subject = "";
String event = "";
if (StringUtils.equals(ReportTriggerMode.API.name(), report.getTriggerMode())) {
successContext = "接口测试 API任务通知:'" + report.getName() + "'执行成功" + "\n" + "请点击下面链接进入测试报告页面" + "\n" + url;
failedContext = "接口测试 API任务通知:'" + report.getName() + "'执行失败" + "\n" + "请点击下面链接进入测试报告页面" + "\n" + url;
successContext = "接口测试 API任务通知:'" + report.getName() + "'执行成功" + "\n" + "请点击下面链接进入测试报告页面" + "\n" + "旧版接口测试路径" + url + "\n" + "新版接口测试路径" + url2;
failedContext = "接口测试 API任务通知:'" + report.getName() + "'执行失败" + "\n" + "请点击下面链接进入测试报告页面" + "\n" + "旧版接口测试路径" + url + "\n" + "新版接口测试路径" + url2;
subject = Translator.get("task_notification_jenkins");
}
if (StringUtils.equals(ReportTriggerMode.SCHEDULE.name(), report.getTriggerMode())) {
successContext = "接口测试定时任务通知:'" + report.getName() + "'执行成功" + "\n" + "请点击下面链接进入测试报告页面" + "\n" + url;
failedContext = "接口测试定时任务通知:'" + report.getName() + "'执行失败" + "\n" + "请点击下面链接进入测试报告页面" + "\n" + url;
successContext = "接口测试定时任务通知:'" + report.getName() + "'执行成功" + "\n" + "请点击下面链接进入测试报告页面" + "\n" + "旧版接口测试路径" + url + "\n" + "新版接口测试路径" + url2;
failedContext = "接口测试定时任务通知:'" + report.getName() + "'执行失败" + "\n" + "请点击下面链接进入测试报告页面" + "\n" + "旧版接口测试路径" + url + "\n" + "新版接口测试路径" + url2;
subject = Translator.get("task_notification");
}
if (StringUtils.equals("Success", report.getStatus())) {

View File

@ -55,6 +55,9 @@ public class ApiDefinitionExecResultService {
saveResult.setCreateTime(System.currentTimeMillis());
saveResult.setUserId(Objects.requireNonNull(SessionUtils.getUser()).getId());
saveResult.setName(item.getName());
if (item.getName().indexOf("<->") != -1) {
saveResult.setName(item.getName().substring(0, item.getName().indexOf("<->")));
}
saveResult.setResourceId(item.getName());
saveResult.setContent(JSON.toJSONString(item));
saveResult.setStartTime(item.getStartTime());

View File

@ -14,6 +14,7 @@ import io.metersphere.api.dto.scenario.request.RequestType;
import io.metersphere.api.dto.swaggerurl.SwaggerTaskResult;
import io.metersphere.api.dto.swaggerurl.SwaggerUrlRequest;
import io.metersphere.api.jmeter.JMeterService;
import io.metersphere.api.jmeter.RequestResult;
import io.metersphere.api.jmeter.TestResult;
import io.metersphere.api.parse.ApiImportParser;
import io.metersphere.api.parse.ApiImportParserFactory;
@ -297,7 +298,7 @@ public class ApiDefinitionService {
}
}
private ApiDefinition importCreate(ApiDefinitionResult request, ApiDefinitionMapper batchMapper,ApiTestImportRequest apiTestImportRequest) {
private ApiDefinition importCreate(ApiDefinitionResult request, ApiDefinitionMapper batchMapper, ApiTestImportRequest apiTestImportRequest) {
SaveApiDefinitionRequest saveReq = new SaveApiDefinitionRequest();
BeanUtils.copyBean(saveReq, request);
final ApiDefinitionWithBLOBs apiDefinition = new ApiDefinitionWithBLOBs();
@ -313,7 +314,7 @@ public class ApiDefinitionService {
apiDefinition.setDescription(request.getDescription());
List<ApiDefinition> sameRequest = getSameRequest(saveReq);
if(StringUtils.equals("fullCoverage",apiTestImportRequest.getModeId())){
if (StringUtils.equals("fullCoverage", apiTestImportRequest.getModeId())) {
if (CollectionUtils.isEmpty(sameRequest)) {
batchMapper.insert(apiDefinition);
} else {
@ -321,9 +322,9 @@ public class ApiDefinitionService {
apiDefinition.setId(sameRequest.get(0).getId());
apiDefinitionMapper.updateByPrimaryKeyWithBLOBs(apiDefinition);
}
}else if(StringUtils.equals("incrementalMerge",apiTestImportRequest.getModeId())){
} else if (StringUtils.equals("incrementalMerge", apiTestImportRequest.getModeId())) {
batchMapper.insert(apiDefinition);
}else{
} else {
if (CollectionUtils.isEmpty(sameRequest)) {
batchMapper.insert(apiDefinition);
} else {
@ -372,7 +373,11 @@ public class ApiDefinitionService {
public void addResult(TestResult res) {
if (!res.getScenarios().isEmpty() && !res.getScenarios().get(0).getRequestResults().isEmpty()) {
cache.put(res.getTestId(), res.getScenarios().get(0).getRequestResults().get(0));
RequestResult result = res.getScenarios().get(0).getRequestResults().get(0);
if (result.getName().indexOf("<->") != -1) {
result.setName(result.getName().substring(0, result.getName().indexOf("<->")));
}
cache.put(res.getTestId(), result);
} else {
MSException.throwException(Translator.get("test_not_found"));
}
@ -451,7 +456,7 @@ public class ApiDefinitionService {
item.setName(item.getName().substring(0, 255));
}
item.setNum(num++);
importCreate(item, batchMapper,request);
importCreate(item, batchMapper, request);
if (i % 300 == 0) {
sqlSession.flushStatements();
}
@ -614,7 +619,7 @@ public class ApiDefinitionService {
/*swagger定时导入*/
public void createSchedule(Schedule request) {
/*保存swaggerUrl*/
SwaggerUrlProject swaggerUrlProject=new SwaggerUrlProject();
SwaggerUrlProject swaggerUrlProject = new SwaggerUrlProject();
swaggerUrlProject.setId(UUID.randomUUID().toString());
swaggerUrlProject.setProjectId(request.getProjectId());
swaggerUrlProject.setSwaggerUrl(request.getResourceId());
@ -631,33 +636,38 @@ public class ApiDefinitionService {
this.addOrUpdateSwaggerImportCronJob(request);
}
//关闭
public void updateSchedule(Schedule request){
public void updateSchedule(Schedule request) {
scheduleService.editSchedule(request);
this.addOrUpdateSwaggerImportCronJob(request);
}
//删除
public void deleteSchedule(ScheduleInfoSwaggerUrlRequest request){
public void deleteSchedule(ScheduleInfoSwaggerUrlRequest request) {
swaggerUrlProjectMapper.deleteByPrimaryKey(request.getId());
scheduleMapper.deleteByPrimaryKey(request.getTaskId());
}
//查询swaggerUrl详情
public SwaggerUrlProject getSwaggerInfo(String resourceId){
public SwaggerUrlProject getSwaggerInfo(String resourceId) {
return swaggerUrlProjectMapper.selectByPrimaryKey(resourceId);
}
public String getResourceId(SwaggerUrlRequest swaggerUrlRequest){
SwaggerUrlProjectExample swaggerUrlProjectExample=new SwaggerUrlProjectExample();
SwaggerUrlProjectExample.Criteria criteria=swaggerUrlProjectExample.createCriteria();
public String getResourceId(SwaggerUrlRequest swaggerUrlRequest) {
SwaggerUrlProjectExample swaggerUrlProjectExample = new SwaggerUrlProjectExample();
SwaggerUrlProjectExample.Criteria criteria = swaggerUrlProjectExample.createCriteria();
criteria.andProjectIdEqualTo(swaggerUrlRequest.getProjectId()).andSwaggerUrlEqualTo(swaggerUrlRequest.getSwaggerUrl()).andModuleIdEqualTo(swaggerUrlRequest.getModuleId());
List<SwaggerUrlProject> list=swaggerUrlProjectMapper.selectByExample(swaggerUrlProjectExample);
String resourceId="";
if(list.size()==1){
resourceId=list.get(0).getId();
List<SwaggerUrlProject> list = swaggerUrlProjectMapper.selectByExample(swaggerUrlProjectExample);
String resourceId = "";
if (list.size() == 1) {
resourceId = list.get(0).getId();
}
return resourceId;
}
public List<SwaggerTaskResult> getSwaggerScheduleList(String projectId){
public List<SwaggerTaskResult> getSwaggerScheduleList(String projectId) {
return extSwaggerUrlScheduleMapper.getSwaggerTaskList(projectId);
}

View File

@ -412,6 +412,7 @@ public class HistoricalDataUpgradeService {
MsScenario step = new MsScenario();
step.setId(scenario1.getId());
step.setName(scenario1.getName());
step.setEnable(scenario.isEnable());
step.setType("scenario");
step.setResourceId(UUID.randomUUID().toString());
step.setReferenced("REF");

View File

@ -14,6 +14,8 @@
<p>您所执行的 ${testName} 接口测试运行失败<br/>
请点击下面链接进入测试报告页面</p>
<a href="${url}/#/${type}/report/view/${id}">${url}/#/${type}/report/view/${id}</a>
<p>新版接口测试报告路径</p>
<a href="${url}/#/api/automation">${url}/#/api/automation</a>
</div>
</div>

View File

@ -13,6 +13,8 @@
<p>您所执行的 ${testName} 接口测试运行成功<br/>
请点击下面链接进入测试报告页面</p>
<a href="${url}/#/${type}/report/view/${id}">${url}/#/${type}/report/view/${id}</a>
<p>新版接口测试报告路径</p>
<a href="${url}/#/api/automation">${url}/#/api/automation</a>
</div>
</body>
</html>

View File

@ -148,7 +148,7 @@
<!-- 步骤组件-->
<ms-component-config :type="data.type" :scenario="data" :response="response" :currentScenario="currentScenario"
:currentEnvironmentId="currentEnvironmentId" :node="node"
@remove="remove" @copyRow="copyRow" @suggestClick="suggestClick"/>
@remove="remove" @copyRow="copyRow" @suggestClick="suggestClick" @refReload="reload"/>
</span>
</el-tree>
</div>
@ -423,7 +423,6 @@
document.removeEventListener("keydown", this.createCtrlSHandle);
},
createCtrlSHandle(event) {
console.log("create ctrl + s");
handleCtrlSEvent(event, this.editScenario);
},
getIdx(index) {
@ -884,7 +883,6 @@
}
this.enableCookieShare = obj.enableCookieShare;
this.scenarioDefinition = obj.hashTree;
console.log(this.scenarioDefinition)
}
}
if (this.currentScenario.copy) {

View File

@ -6,7 +6,7 @@
<ms-environment-select :project-id="projectId" v-if="isTestPlan" :is-read-only="isReadOnly" @setEnvironment="setEnvironment"/>
<el-input placeholder="搜索" @blur="initTable" class="search-input" size="small" @keyup.enter.native="initTable" v-model="condition.name"/>
<el-input :placeholder="$t('api_monitor.please_search')" @blur="initTable" class="search-input" size="small" @keyup.enter.native="initTable" v-model="condition.name"/>
<el-table v-loading="result.loading"
border
@ -26,7 +26,7 @@
<ms-tag v-if="scope.row.status == 'Prepare'" type="info" effect="plain" :content="$t('test_track.plan.plan_status_prepare')"/>
<ms-tag v-if="scope.row.status == 'Underway'" type="warning" effect="plain" :content="$t('test_track.plan.plan_status_running')"/>
<ms-tag v-if="scope.row.status == 'Completed'" type="success" effect="plain" :content="$t('test_track.plan.plan_status_completed')"/>
<ms-tag v-if="scope.row.status == 'Trash'" type="danger" effect="plain" content="废弃"/>
<ms-tag v-if="scope.row.status == 'Trash'" type="danger" effect="plain" :content="$t('test_track.plan.plan_status_trash')"/>
</template>
</el-table-column>

View File

@ -1,5 +1,5 @@
<template>
<relevance-dialog :title="'场景导入'" ref="relevanceDialog">
<relevance-dialog :title="$t('api_test.automation.scenario_import')" ref="relevanceDialog">
<template v-slot:aside>
<ms-api-scenario-module
@ -19,8 +19,8 @@
ref="apiScenarioList"/>
<template v-slot:footer>
<el-button type="primary" @click="copy" @keydown.enter.native.prevent>复制</el-button>
<el-button type="primary" @click="reference" @keydown.enter.native.prevent>引用</el-button>
<el-button type="primary" @click="copy" @keydown.enter.native.prevent>{{$t('commons.copy')}}</el-button>
<el-button type="primary" @click="reference" @keydown.enter.native.prevent> {{ $t('api_test.scenario.reference') }}</el-button>
</template>
</relevance-dialog>

View File

@ -12,7 +12,7 @@
<span @click.stop>
<slot name="headerLeft">
<i class="icon el-icon-arrow-right" :class="{'is-active': data.active}"
@click="active(data)"/>
@click="active(data)" v-if="data.type!='scenario'"/>
<el-input :draggable="draggable" v-if="isShowInput && isShowNameInput" size="small" v-model="data.name" class="name-input"
@blur="isShowInput = false" :placeholder="$t('commons.input_name')" ref="nameEdit"/>
<span v-else>

View File

@ -14,7 +14,7 @@
<el-tag size="mini" style="margin-left: 20px" v-if="request.referenced==='Deleted'" type="danger">{{$t('api_test.automation.reference_deleted')}}</el-tag>
<el-tag size="mini" style="margin-left: 20px" v-if="request.referenced==='Copy'">{{ $t('commons.copy') }}</el-tag>
<el-tag size="mini" style="margin-left: 20px" v-if="request.referenced ==='REF'">{{ $t('api_test.scenario.reference') }}</el-tag>
<ms-run :debug="false" :reportId="reportId" :run-data="runData"
<ms-run :debug="true" :reportId="reportId" :run-data="runData"
@runRefresh="runRefresh" ref="runTest"/>
</template>

View File

@ -42,6 +42,12 @@
this.isActive = true;
}
},
watch: {
result() {
this.response = this.result;
this.isActive = true;
}
},
methods: {
getExecResult() {
//

View File

@ -38,11 +38,15 @@
},
watch: {},
created() {
if (this.scenario.id && this.scenario.referenced === 'REF') {
if (this.scenario.id && this.scenario.referenced === 'REF' && !this.scenario.loaded) {
this.result = this.$get("/api/automation/getApiScenario/" + this.scenario.id, response => {
if (response.data) {
this.scenario.loaded = true;
if (response.data.scenarioDefinition) {
this.scenario.hashTree = JSON.parse(response.data.scenarioDefinition).hashTree;
}
this.scenario.name = response.data.name;
this.reload();
this.$emit('refReload');
} else {
this.scenario.referenced = "Deleted";
}
@ -58,7 +62,7 @@
},
computed: {
isDeletedOrRef() {
if (this.scenario.referenced!= undefined && this.scenario.referenced === 'Deleted' || this.scenario.referenced === 'REF') {
if (this.scenario.referenced != undefined && this.scenario.referenced === 'Deleted' || this.scenario.referenced === 'REF') {
return true
}
return false;

View File

@ -2,7 +2,7 @@
<div class="request-form">
<component :is="component" :scenario="scenario" :controller="scenario" :timer="scenario" :assertions="scenario" :extract="scenario" :jsr223-processor="scenario" :request="scenario" :currentScenario="currentScenario" :currentEnvironmentId="currentEnvironmentId" :node="node"
:draggable="true" :title="title" :color="titleColor" :background-color="backgroundColor" @suggestClick="suggestClick(node)" :response="response"
@remove="remove" @copyRow="copyRow"/>
@remove="remove" @copyRow="copyRow" @refReload="refReload"/>
</div>
</template>
@ -107,6 +107,9 @@
suggestClick(node) {
this.$emit('suggestClick', node);
},
refReload(){
this.$emit('refReload');
}
}
}
</script>

View File

@ -6,6 +6,26 @@
@click="handleAddTaskModel">
{{ $t('organization.message.create_new_notification') }}
</el-button>
<el-popover
placement="right-end"
title="示例"
width="400"
trigger="click"
:content="title">
<el-button icon="el-icon-warning" plain size="mini" slot="reference">
{{ $t('organization.message.mail_template_example') }}
</el-button>
</el-popover>
<el-popover
placement="right-end"
title="示例"
width="400"
trigger="click"
:content="robotTitle">
<el-button icon="el-icon-warning" plain size="mini" slot="reference">
{{ $t('organization.message.robot_template') }}
</el-button>
</el-popover>
</el-col>
</el-row>
<el-row>
@ -134,7 +154,35 @@ export default {
},
data() {
return {
title: '<!DOCTYPE html>\n' +
'<html lang="en">\n' +
'<head>\n' +
' <meta charset="UTF-8">\n' +
' <title>MeterSphere</title>\n' +
'</head>\n' +
'<body>\n' +
'<div>\n' +
' <div style="text-align: left">\n' +
' <p>尊敬的用户:</p>\n' +
' <p style="margin-left: 60px">您好:\n' +
' </div>\n' +
' <div style="margin-left: 100px">\n' +
' <p>您所执行的 ${testName} 接口测试运行失败<br/>\n' +
' 请点击下面链接进入测试报告页面</p>\n' +
' <a href="${url}/#/${type}/report/view/${id}">${url}/#/${type}/report/view/${id}</a>\n' +
' <p>新版接口测试报告路径</p>\n' +
' <a href="${url}/#/api/automation">${url}/#/api/automation</a>\n' +
' </div>\n' +
'\n' +
'</div>\n' +
'</body>\n' +
'</html>',
robotTitle:
"测试【任务通知】:'您所执行的 ${testName} ${type}测试运行${status}\n" +
"请点击下面链接进入测试报告页面\n" +
"${url}/#/${type}/report/view/${id}" +
"新版接口测试报告路径\n" +
"${url}/#/api/automation",
scheduleTask: [{
taskType: "scheduleTask",
event: "",

View File

@ -33,6 +33,7 @@
<i class="el-icon-edit" style="cursor:pointer" @click="showInput(apiCase)" v-tester/>
</span>
</span>
<div v-if="apiCase.id" style="color: #999999;font-size: 12px">
<span>
{{ apiCase.createTime | timestampFormatDate }}
@ -46,26 +47,28 @@
</el-col>
<el-col :span="4">
<div class="tag-item">
<div class="tag-item" @click.stop>
<ms-input-tag :currentScenario="apiCase" ref="tag" @keyup.enter.native="saveTestCase(apiCase)"/>
</div>
</el-col>
<el-col :span="4">
<ms-tip-button @click="singleRun(apiCase)" :tip="$t('api_test.run')" icon="el-icon-video-play"
style="background-color: #409EFF;color: white" size="mini" :disabled="!apiCase.id" circle v-tester/>
<ms-tip-button @click="copyCase(apiCase)" :tip="$t('commons.copy')" icon="el-icon-document-copy"
size="mini" :disabled="!apiCase.id || isCaseEdit" circle v-tester/>
<ms-tip-button @click="deleteCase(index,apiCase)" :tip="$t('commons.delete')" icon="el-icon-delete"
size="mini" :disabled="!apiCase.id || isCaseEdit" circle v-tester/>
<ms-api-extend-btns :is-case-edit="isCaseEdit" :environment="environment" :row="apiCase" v-tester/>
<span @click.stop>
<ms-tip-button @click="singleRun(apiCase)" :tip="$t('api_test.run')" icon="el-icon-video-play"
style="background-color: #409EFF;color: white" size="mini" :disabled="!apiCase.id" circle v-tester/>
<ms-tip-button @click="copyCase(apiCase)" :tip="$t('commons.copy')" icon="el-icon-document-copy"
size="mini" :disabled="!apiCase.id || isCaseEdit" circle v-tester/>
<ms-tip-button @click="deleteCase(index,apiCase)" :tip="$t('commons.delete')" icon="el-icon-delete"
size="mini" :disabled="!apiCase.id || isCaseEdit" circle v-tester/>
<ms-api-extend-btns :is-case-edit="isCaseEdit" :environment="environment" :row="apiCase" v-tester/>
</span>
</el-col>
<el-col :span="3">
<el-link type="danger" v-if="apiCase.execResult && apiCase.execResult==='error'" @click="showExecResult(apiCase)">
<el-link @click.stop type="danger" v-if="apiCase.execResult && apiCase.execResult==='error'" @click="showExecResult(apiCase)">
{{ getResult(apiCase.execResult) }}
</el-link>
<el-link v-else-if="apiCase.execResult && apiCase.execResult==='success'" @click="showExecResult(apiCase)">
<el-link @click.stop v-else-if="apiCase.execResult && apiCase.execResult==='success'" @click="showExecResult(apiCase)">
{{ getResult(apiCase.execResult) }}
</el-link>
<div v-else> {{ getResult(apiCase.execResult) }}</div>

View File

@ -29,6 +29,8 @@
<p class="tip">{{$t('api_test.definition.request.res_param')}} </p>
<ms-request-result-tail :response="responseData" :currentProtocol="currentProtocol" ref="debugResult"/>
<ms-jmx-step :request="request" :response="responseData"/>
<!-- 执行组件 -->
<ms-run :debug="true" :reportId="reportId" :run-data="runData" @runRefresh="runRefresh" ref="runTest"/>
</el-card>
@ -50,10 +52,12 @@
import {REQ_METHOD} from "../../model/JsonData";
import MsRequestResultTail from "../response/RequestResultTail";
import TcpBasisParameters from "../request/tcp/TcpBasisParameters";
import MsJmxStep from "../step/JmxStep";
export default {
name: "ApiConfig",
components: {
MsJmxStep,
TcpBasisParameters,
MsRequestResultTail, MsResponseResult, MsApiRequestForm, MsRequestMetric, MsResponseText, MsRun},
props: {

View File

@ -181,7 +181,7 @@ export default {
methods: {
scheduleEdit() {
if (!this.formData.swaggerUrl) {
this.$warning(this.$t('commons.please_upload'));
this.$warning(this.$t('commons.please_fill_path'));
this.swaggerSynchronization = !this.swaggerSynchronization
} else {
if (this.swaggerSynchronization) {

View File

@ -6,6 +6,26 @@
<el-button icon="el-icon-circle-plus-outline" plain size="mini" @click="handleAddTaskModel">
{{ $t('organization.message.create_new_notification') }}
</el-button>
<el-popover
placement="right-end"
title="示例"
width="400"
trigger="click"
:content="title">
<el-button icon="el-icon-warning" plain size="mini" slot="reference">
{{ $t('organization.message.mail_template_example') }}
</el-button>
</el-popover>
<el-popover
placement="right-end"
title="示例"
width="400"
trigger="click"
:content="robotTitle">
<el-button icon="el-icon-warning" plain size="mini" slot="reference">
{{ $t('organization.message.robot_template') }}
</el-button>
</el-popover>
</el-col>
</el-row>
<el-row>
@ -129,6 +149,19 @@ export default {
},
data() {
return {
title: "<!DOCTYPE html>\n" +
"<html lang=\"en\">\n" +
"<head>\n" +
" <meta charset=\"UTF-8\">\n" +
" <title>MeterSphere</title>\n" +
"</head>\n" +
"<body>\n" +
"<div>\n" +
" <p>${creator}发起了一个缺陷:${issuesName},请跟进</p>\n" +
"</div>\n" +
"</body>\n" +
"</html>",
robotTitle: "【任务通知】:${creator}发起了一个缺陷:${issuesName},请跟进",
defectTask: [{
taskType: "defectTask",
event: "",

View File

@ -6,6 +6,28 @@
<el-button icon="el-icon-circle-plus-outline" plain size="mini" @click="handleAddTaskModel">
{{ $t('organization.message.create_new_notification') }}
</el-button>
<el-popover
placement="right-end"
title="示例"
width="400"
trigger="click"
:content="title">
<el-button icon="el-icon-warning" plain size="mini" slot="reference">
{{ $t('organization.message.mail_template_example') }}
</el-button>
</el-popover>
<el-popover
placement="right-end"
title="示例"
width="400"
trigger="click"
:content="robotTitle">
<el-button icon="el-icon-warning" plain size="mini" slot="reference">
{{ $t('organization.message.robot_template') }}
</el-button>
</el-popover>
</el-col>
</el-row>
<el-row>
@ -132,6 +154,35 @@ export default {
},
data() {
return {
title: '<!DOCTYPE html>\n' +
'<html lang="en">\n' +
'<head>\n' +
' <meta charset="UTF-8">\n' +
' <title>MeterSphere</title>\n' +
'</head>\n' +
'<body>\n' +
'<div>\n' +
' <div style="text-align: left">\n' +
' <p>尊敬的用户:</p>\n' +
' <p style="margin-left: 60px">您好:\n' +
' </div>\n' +
' <div style="margin-left: 100px">\n' +
' <p>您所执行的 ${testName} 接口测试运行失败<br/>\n' +
' 请点击下面链接进入测试报告页面</p>\n' +
' <a href="${url}/#/${type}/report/view/${id}">${url}/#/${type}/report/view/${id}</a>\n' +
' <p>新版接口测试报告路径</p>\n' +
' <a href="${url}/#/api/automation">${url}/#/api/automation</a>\n' +
' </div>\n' +
'\n' +
'</div>\n' +
'</body>\n' +
'</html>',
robotTitle:
"测试【任务通知】:'您所执行的 ${testName} ${type}测试运行${status}\n" +
"请点击下面链接进入测试报告页面\n" +
"${url}/#/${type}/report/view/${id}" +
"新版接口测试报告路径\n" +
"${url}/#/api/automation",
jenkinsTask: [{
taskType: "jenkinsTask",
event: "",

View File

@ -6,6 +6,26 @@
@click="handleAddTaskModel">
{{ $t('organization.message.create_new_notification') }}
</el-button>
<el-popover
placement="right-end"
title="示例"
width="400"
trigger="click"
:content="title">
<el-button icon="el-icon-warning" plain size="mini" slot="reference">
{{ $t('organization.message.mail_template_example') }}
</el-button>
</el-popover>
<el-popover
placement="right-end"
title="示例"
width="400"
trigger="click"
:content="robotTitle">
<el-button icon="el-icon-warning" plain size="mini" slot="reference">
{{ $t('organization.message.robot_template') }}
</el-button>
</el-popover>
</el-col>
</el-row>
<el-row>
@ -135,7 +155,35 @@ export default {
},
data() {
return {
title: '<!DOCTYPE html>\n' +
'<html lang="en">\n' +
'<head>\n' +
' <meta charset="UTF-8">\n' +
' <title>MeterSphere</title>\n' +
'</head>\n' +
'<body>\n' +
'<div>\n' +
' <div style="text-align: left">\n' +
' <p>尊敬的用户:</p>\n' +
' <p style="margin-left: 60px">您好:\n' +
' </div>\n' +
' <div style="margin-left: 100px">\n' +
' <p>您所执行的 ${testName} 接口测试运行失败<br/>\n' +
' 请点击下面链接进入测试报告页面</p>\n' +
' <a href="${url}/#/${type}/report/view/${id}">${url}/#/${type}/report/view/${id}</a>\n' +
' <p>新版接口测试报告路径</p>\n' +
' <a href="${url}/#/api/automation">${url}/#/api/automation</a>\n' +
' </div>\n' +
'\n' +
'</div>\n' +
'</body>\n' +
'</html>',
robotTitle:
"测试【任务通知】:'您所执行的 ${testName} ${type}测试运行${status}\n" +
"请点击下面链接进入测试报告页面\n" +
"${url}/#/${type}/report/view/${id}" +
"新版接口测试报告路径\n" +
"${url}/#/api/automation",
scheduleTask: [{
taskType: "scheduleTask",
event: "",

View File

@ -6,6 +6,26 @@
<el-button icon="el-icon-circle-plus-outline" plain size="mini" @click="handleAddTaskModel">
{{ $t('organization.message.create_new_notification') }}
</el-button>
<el-popover
placement="right-end"
title="示例"
width="400"
trigger="click"
:content="title">
<el-button icon="el-icon-warning" plain size="mini" slot="reference">
{{ $t('organization.message.mail_template_example') }}
</el-button>
</el-popover>
<el-popover
placement="right-end"
title="示例"
width="400"
trigger="click"
:content="robotTitle">
<el-button icon="el-icon-warning" plain size="mini" slot="reference">
{{ $t('organization.message.robot_template') }}
</el-button>
</el-popover>
</el-col>
</el-row>
<el-row>
@ -130,6 +150,27 @@ export default {
},
data() {
return {
title: "<!DOCTYPE html>\n" +
"<html lang=\"en\">\n" +
"<head>\n" +
" <meta charset=\"UTF-8\">\n" +
" <title>MeterSphere</title>\n" +
"</head>\n" +
"<body>\n" +
"<div>\n" +
" <p style=\"text-align: left\">${creator} 创建的:<br>\n" +
" ${testPlanName}<br>\n" +
" 计划开始时间是:${start}<br>\n" +
" 计划结束时间为:${end}<br>\n" +
" 请跟进!<br>\n" +
" 点击下面链接进入测试计划页面</p>\n" +
" <a href=\"${url}/#/track/plan/all\">${url}/#/track/plan/all</a>\n" +
"</div>\n" +
"</body>\n" +
"</html>",
robotTitle:
" 【任务通知】:${creator} 创建的:${testPlanName}计划开始时间是:${start}计划结束时间是:${end}请跟进!/ ${status}" +
"点击下面链接进入测试计划页面${url}/#/track/plan/all",
testCasePlanTask: [{
taskType: "testPlanTask",
event: "",

View File

@ -6,6 +6,26 @@
<el-button icon="el-icon-circle-plus-outline" plain size="mini" @click="handleAddTaskModel">
{{ $t('organization.message.create_new_notification') }}
</el-button>
<el-popover
placement="right-end"
title="示例"
width="400"
trigger="click"
:content="title">
<el-button icon="el-icon-warning" plain size="mini" slot="reference">
{{ $t('organization.message.mail_template_example') }}
</el-button>
</el-popover>
<el-popover
placement="right-end"
title="示例"
width="400"
trigger="click"
:content="robotTitle">
<el-button icon="el-icon-warning" plain size="mini" slot="reference">
{{ $t('organization.message.robot_template') }}
</el-button>
</el-popover>
</el-col>
</el-row>
<el-row>
@ -130,6 +150,26 @@ export default {
},
data() {
return {
title: "<!DOCTYPE html>\n" +
"<html lang=\"en\">\n" +
"<head>\n" +
" <meta charset=\"UTF-8\">\n" +
" <title>MeterSphere</title>\n" +
"</head>\n" +
"<body>\n" +
"<div>\n" +
" <p style=\"text-align: left\">${creator} 创建的:<br>\n" +
" ${reviewName}待开始<br>\n" +
" 计划开始时间是:${start}<br>\n" +
" 计划结束时间为:${end}<br>\n" +
" 请跟进!/${status}<br>\n" +
" 点击下面链接进入评审页面进行审核</p>\n" +
" <a href=\"${url}/#/track/review/view/${id}\">${url}/#/track/review/view/${id}</a>\n" +
"</div>\n" +
"</body>\n" +
"</html>",
robotTitle: "【任务通知】:${creator} 创建的:${reviewName}待开始,计划开始时间是:${start}," +
"计划结束时间是:${end}请跟进!/ ${status}!点击下面链接进入测试评审页面${url}/#/track/review/view/${id}",
reviewTask: [{
taskType: "reviewTask",
event: "",

View File

@ -1,5 +1,5 @@
<template>
<div class="batch-move" v-loading="result.loading">
<div v-if="dialogVisible" class="batch-move" v-loading="result.loading">
<el-dialog :title="this.$t('test_track.case.select_catalog')"
:visible.sync="dialogVisible"
:before-close="close"
@ -25,15 +25,15 @@
</span>
<span class="node-title">{{node.label}}</span>
</span>
</template>
</el-tree>
</div>
<template v-slot:footer>
<ms-dialog-footer
@cancel="close"
@confirm="save"/>
</template>
</el-dialog>
</template>
</el-tree>
</div>
<template v-slot:footer>
<ms-dialog-footer
@cancel="close"
@confirm="save"/>
</template>
</el-dialog>
</div>
</template>

View File

@ -124,6 +124,7 @@ export default {
required: "{0} is required",
millisecond: 'ms',
please_upload: 'Please upload file',
please_fill_path: 'Please fill in the path',
reference_documentation: "Reference documentation",
already_exists: 'The name already exists',
modifier: 'Modifier',
@ -251,6 +252,8 @@ export default {
test_review_task_notice: 'Test review task notice',
defect_task_notification: 'Defect task notification',
create_new_notification: 'Create a new notification',
mail_template_example: 'Mail template',
robot_template: 'Robot template',
select_events: 'Select event',
select_receiving_method: 'Select receiving method',
mail: 'mail',

View File

@ -119,6 +119,7 @@ export default {
input_login_username: '请输入用户 ID 或 邮箱',
input_name: '请输入名称',
please_upload: '请上传文件',
please_fill_path: '请填写ur路径',
formatErr: '格式错误',
please_save: '请先保存',
reference_documentation: "参考文档",
@ -252,6 +253,8 @@ export default {
test_plan_task_notification: '测试计划任务通知',
test_review_task_notice: '测试评审任务通知',
create_new_notification: '创建新通知',
mail_template_example: '邮件模版',
robot_template: '机器人模版',
select_events: '选择事件',
defect_task_notification: '缺陷任务通知',
select_receiving_method: '选择接收方式',

View File

@ -119,6 +119,7 @@ export default {
input_login_username: '請輸入用戶 ID 或 郵箱',
input_name: '請輸入名稱',
please_upload: '請上傳文件',
please_fill_path: '請填寫ur路徑',
formatErr: '格式錯誤',
please_save: '請先保存',
reference_documentation: "參考文檔",
@ -252,6 +253,8 @@ export default {
test_plan_task_notification: '測試計劃任務通知',
test_review_task_notice: '測試評審任務通知',
create_new_notification: '創建新通知',
mail_template_example: '郵件範本示例',
robot_template: '機器人模版',
select_events: '選擇事件',
defect_task_notification: '缺陷任務通知',
select_receiving_method: '選擇接收方式',