Merge branch 'master' of https://github.com/metersphere/metersphere
This commit is contained in:
commit
27f5264a88
|
@ -243,21 +243,23 @@ public class APIBackendListenerClient extends AbstractBackendListenerClient impl
|
||||||
|
|
||||||
BaseSystemConfigDTO baseSystemConfigDTO = systemParameterService.getBaseInfo();
|
BaseSystemConfigDTO baseSystemConfigDTO = systemParameterService.getBaseInfo();
|
||||||
String url = reportUrl;
|
String url = reportUrl;
|
||||||
|
String url2 = reportUrl;
|
||||||
if (StringUtils.isEmpty(url)) {
|
if (StringUtils.isEmpty(url)) {
|
||||||
url = baseSystemConfigDTO.getUrl() + "/#/api/report/view/" + report.getId();
|
url = baseSystemConfigDTO.getUrl() + "/#/api/report/view/" + report.getId();
|
||||||
|
url2 = baseSystemConfigDTO.getUrl() + "/#/api/automation/report";
|
||||||
}
|
}
|
||||||
String successContext = "";
|
String successContext = "";
|
||||||
String failedContext = "";
|
String failedContext = "";
|
||||||
String subject = "";
|
String subject = "";
|
||||||
String event = "";
|
String event = "";
|
||||||
if (StringUtils.equals(ReportTriggerMode.API.name(), report.getTriggerMode())) {
|
if (StringUtils.equals(ReportTriggerMode.API.name(), report.getTriggerMode())) {
|
||||||
successContext = "接口测试 API任务通知:'" + report.getName() + "'执行成功" + "\n" + "请点击下面链接进入测试报告页面" + "\n" + url;
|
successContext = "接口测试 API任务通知:'" + report.getName() + "'执行成功" + "\n" + "请点击下面链接进入测试报告页面" + "\n" + "旧版接口测试路径" + url + "\n" + "新版接口测试路径" + url2;
|
||||||
failedContext = "接口测试 API任务通知:'" + report.getName() + "'执行失败" + "\n" + "请点击下面链接进入测试报告页面" + "\n" + url;
|
failedContext = "接口测试 API任务通知:'" + report.getName() + "'执行失败" + "\n" + "请点击下面链接进入测试报告页面" + "\n" + "旧版接口测试路径" + url + "\n" + "新版接口测试路径" + url2;
|
||||||
subject = Translator.get("task_notification_jenkins");
|
subject = Translator.get("task_notification_jenkins");
|
||||||
}
|
}
|
||||||
if (StringUtils.equals(ReportTriggerMode.SCHEDULE.name(), report.getTriggerMode())) {
|
if (StringUtils.equals(ReportTriggerMode.SCHEDULE.name(), report.getTriggerMode())) {
|
||||||
successContext = "接口测试定时任务通知:'" + report.getName() + "'执行成功" + "\n" + "请点击下面链接进入测试报告页面" + "\n" + url;
|
successContext = "接口测试定时任务通知:'" + report.getName() + "'执行成功" + "\n" + "请点击下面链接进入测试报告页面" + "\n" + "旧版接口测试路径" + url + "\n" + "新版接口测试路径" + url2;
|
||||||
failedContext = "接口测试定时任务通知:'" + report.getName() + "'执行失败" + "\n" + "请点击下面链接进入测试报告页面" + "\n" + url;
|
failedContext = "接口测试定时任务通知:'" + report.getName() + "'执行失败" + "\n" + "请点击下面链接进入测试报告页面" + "\n" + "旧版接口测试路径" + url + "\n" + "新版接口测试路径" + url2;
|
||||||
subject = Translator.get("task_notification");
|
subject = Translator.get("task_notification");
|
||||||
}
|
}
|
||||||
if (StringUtils.equals("Success", report.getStatus())) {
|
if (StringUtils.equals("Success", report.getStatus())) {
|
||||||
|
|
|
@ -174,6 +174,11 @@ public class ApiModuleService extends NodeTreeService<ApiModuleDTO> {
|
||||||
ApiModuleExample.Criteria criteria = example.createCriteria();
|
ApiModuleExample.Criteria criteria = example.createCriteria();
|
||||||
criteria.andNameEqualTo(node.getName())
|
criteria.andNameEqualTo(node.getName())
|
||||||
.andProjectIdEqualTo(node.getProjectId());
|
.andProjectIdEqualTo(node.getProjectId());
|
||||||
|
|
||||||
|
if (StringUtils.isNotBlank(node.getProtocol())) {
|
||||||
|
criteria.andProtocolEqualTo(node.getProtocol());
|
||||||
|
}
|
||||||
|
|
||||||
if (StringUtils.isNotBlank(node.getParentId())) {
|
if (StringUtils.isNotBlank(node.getParentId())) {
|
||||||
criteria.andParentIdEqualTo(node.getParentId());
|
criteria.andParentIdEqualTo(node.getParentId());
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
package io.metersphere.commons.constants;
|
package io.metersphere.commons.constants;
|
||||||
|
|
||||||
public enum UserSource {
|
public enum UserSource {
|
||||||
LOCAL, LDAP
|
LOCAL, LDAP, CAS, OIDC
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,7 @@ public class ShiroUtils {
|
||||||
filterChainDefinitionMap.put("/authsource/list/allenable", "anon");
|
filterChainDefinitionMap.put("/authsource/list/allenable", "anon");
|
||||||
filterChainDefinitionMap.put("/sso/signin", "anon");
|
filterChainDefinitionMap.put("/sso/signin", "anon");
|
||||||
filterChainDefinitionMap.put("/sso/callback", "anon");
|
filterChainDefinitionMap.put("/sso/callback", "anon");
|
||||||
|
|
||||||
// for swagger
|
// for swagger
|
||||||
filterChainDefinitionMap.put("/swagger-ui.html", "anon");
|
filterChainDefinitionMap.put("/swagger-ui.html", "anon");
|
||||||
filterChainDefinitionMap.put("/swagger-ui/**", "anon");
|
filterChainDefinitionMap.put("/swagger-ui/**", "anon");
|
||||||
|
|
|
@ -56,13 +56,9 @@ public class LoginController {
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping(value = "/signout")
|
@GetMapping(value = "/signout")
|
||||||
public ResultHolder logout() {
|
public ResultHolder logout() throws Exception {
|
||||||
String ssoMode = env.getProperty("sso.mode");
|
userService.logout();
|
||||||
if (ssoMode != null && StringUtils.equalsIgnoreCase(SsoMode.CAS.name(), ssoMode)) {
|
SecurityUtils.getSubject().logout();
|
||||||
return ResultHolder.error("sso");
|
|
||||||
} else {
|
|
||||||
SecurityUtils.getSubject().logout();
|
|
||||||
}
|
|
||||||
return ResultHolder.success("");
|
return ResultHolder.success("");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -389,8 +389,6 @@ public class JmeterDocumentParser implements DocumentParser {
|
||||||
element.appendChild(createStringProp(document, "HTTPSampler.concurrentPool", "6"));
|
element.appendChild(createStringProp(document, "HTTPSampler.concurrentPool", "6"));
|
||||||
element.appendChild(createStringProp(document, "HTTPSampler.connect_timeout", ""));
|
element.appendChild(createStringProp(document, "HTTPSampler.connect_timeout", ""));
|
||||||
element.appendChild(createStringProp(document, "HTTPSampler.response_timeout", ""));
|
element.appendChild(createStringProp(document, "HTTPSampler.response_timeout", ""));
|
||||||
element.appendChild(createBoolProp(document, "HTTPSampler.image_parser", true));
|
|
||||||
element.appendChild(createBoolProp(document, "HTTPSampler.concurrentDwn", true));
|
|
||||||
hashTree.appendChild(element);
|
hashTree.appendChild(element);
|
||||||
// 空的 hashTree
|
// 空的 hashTree
|
||||||
hashTree.appendChild(document.createElement(HASH_TREE_ELEMENT));
|
hashTree.appendChild(document.createElement(HASH_TREE_ELEMENT));
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
package io.metersphere.service;
|
||||||
|
|
||||||
|
public interface SSOService {
|
||||||
|
void logout() throws Exception;
|
||||||
|
}
|
|
@ -10,6 +10,7 @@ import io.metersphere.commons.constants.UserStatus;
|
||||||
import io.metersphere.commons.exception.MSException;
|
import io.metersphere.commons.exception.MSException;
|
||||||
import io.metersphere.commons.user.SessionUser;
|
import io.metersphere.commons.user.SessionUser;
|
||||||
import io.metersphere.commons.utils.CodingUtil;
|
import io.metersphere.commons.utils.CodingUtil;
|
||||||
|
import io.metersphere.commons.utils.CommonBeanFactory;
|
||||||
import io.metersphere.commons.utils.SessionUtils;
|
import io.metersphere.commons.utils.SessionUtils;
|
||||||
import io.metersphere.controller.ResultHolder;
|
import io.metersphere.controller.ResultHolder;
|
||||||
import io.metersphere.controller.request.LoginRequest;
|
import io.metersphere.controller.request.LoginRequest;
|
||||||
|
@ -608,4 +609,11 @@ public class UserService {
|
||||||
public List<User> searchUser(String condition) {
|
public List<User> searchUser(String condition) {
|
||||||
return extUserMapper.searchUser(condition);
|
return extUserMapper.searchUser(condition);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void logout() throws Exception {
|
||||||
|
SSOService ssoService = CommonBeanFactory.getBean(SSOService.class);
|
||||||
|
if (ssoService != null) {
|
||||||
|
ssoService.logout();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit a18f543c2be6bcd8521a22094bb11aacc920ece4
|
Subproject commit ed891ee7503cc1ca4679b4779a5c12e2ffee986d
|
|
@ -14,6 +14,8 @@
|
||||||
<p>您所执行的 ${testName} 接口测试运行失败<br/>
|
<p>您所执行的 ${testName} 接口测试运行失败<br/>
|
||||||
请点击下面链接进入测试报告页面</p>
|
请点击下面链接进入测试报告页面</p>
|
||||||
<a href="${url}/#/${type}/report/view/${id}">${url}/#/${type}/report/view/${id}</a>
|
<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>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -13,6 +13,8 @@
|
||||||
<p>您所执行的 ${testName} 接口测试运行成功<br/>
|
<p>您所执行的 ${testName} 接口测试运行成功<br/>
|
||||||
请点击下面链接进入测试报告页面</p>
|
请点击下面链接进入测试报告页面</p>
|
||||||
<a href="${url}/#/${type}/report/view/${id}">${url}/#/${type}/report/view/${id}</a>
|
<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>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
|
@ -22,6 +22,7 @@
|
||||||
:trash-enable="trashEnable"
|
:trash-enable="trashEnable"
|
||||||
:checkRedirectID="checkRedirectID"
|
:checkRedirectID="checkRedirectID"
|
||||||
:isRedirectEdit="isRedirectEdit"
|
:isRedirectEdit="isRedirectEdit"
|
||||||
|
@openScenario="editScenario"
|
||||||
@edit="editScenario"
|
@edit="editScenario"
|
||||||
@changeSelectDataRangeAll="changeSelectDataRangeAll"
|
@changeSelectDataRangeAll="changeSelectDataRangeAll"
|
||||||
ref="apiScenarioList"/>
|
ref="apiScenarioList"/>
|
||||||
|
|
|
@ -100,7 +100,7 @@
|
||||||
<ms-table-operator-button :tip="$t('api_test.automation.copy')" icon="el-icon-document-copy" type=""
|
<ms-table-operator-button :tip="$t('api_test.automation.copy')" icon="el-icon-document-copy" type=""
|
||||||
@exec="copy(row)"/>
|
@exec="copy(row)"/>
|
||||||
<ms-table-operator-button :tip="$t('api_test.automation.remove')" icon="el-icon-delete" @exec="remove(row)" type="danger" v-tester/>
|
<ms-table-operator-button :tip="$t('api_test.automation.remove')" icon="el-icon-delete" @exec="remove(row)" type="danger" v-tester/>
|
||||||
<ms-scenario-extend-buttons :row="row"/>
|
<ms-scenario-extend-buttons @openScenario="openScenario" :row="row"/>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
@ -589,6 +589,9 @@ export default {
|
||||||
_filter(filters, this.condition);
|
_filter(filters, this.condition);
|
||||||
this.search();
|
this.search();
|
||||||
},
|
},
|
||||||
|
openScenario (item) {
|
||||||
|
this.$emit('openScenario', item)
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -3,12 +3,20 @@
|
||||||
width="45%" :destroy-on-close="true" >
|
width="45%" :destroy-on-close="true" >
|
||||||
<span>{{ $t('api_test.automation.scenario_ref') }}:</span>
|
<span>{{ $t('api_test.automation.scenario_ref') }}:</span>
|
||||||
<div class="refs" v-loading="scenarioLoading">
|
<div class="refs" v-loading="scenarioLoading">
|
||||||
<div v-for="(item, index) in scenarioRefs" :key="index" class="el-button--text">{{ item.name }}</div>
|
<div v-for="(item, index) in scenarioRefs" :key="index" class="el-button--text">
|
||||||
|
<el-link @click="openScenario(item)">
|
||||||
|
{{ item.name }}
|
||||||
|
</el-link>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<span>{{ $t('api_test.automation.plan_ref') }}:</span>
|
<span>{{ $t('api_test.automation.plan_ref') }}:</span>
|
||||||
<div class="refs">
|
<div class="refs">
|
||||||
<div v-for="(item, index) in planRefs" :key="index" class="el-button--text">{{ item.name }}</div>
|
<div v-for="(item, index) in planRefs" :key="index" class="el-button--text">
|
||||||
|
<router-link :to="'/track/plan/view/' + item.id">
|
||||||
|
{{ item.name }}
|
||||||
|
</router-link>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<template v-slot:footer>
|
<template v-slot:footer>
|
||||||
|
@ -47,6 +55,10 @@
|
||||||
open(row) {
|
open(row) {
|
||||||
this.getReferenceData(row);
|
this.getReferenceData(row);
|
||||||
this.visible = true
|
this.visible = true
|
||||||
|
},
|
||||||
|
openScenario(item) {
|
||||||
|
this.$emit('openScenario', item);
|
||||||
|
this.visible = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
<el-dropdown-item command="create_performance" v-tester>{{ $t('api_test.create_performance_test') }}</el-dropdown-item>
|
<el-dropdown-item command="create_performance" v-tester>{{ $t('api_test.create_performance_test') }}</el-dropdown-item>
|
||||||
</el-dropdown-menu>
|
</el-dropdown-menu>
|
||||||
</el-dropdown>
|
</el-dropdown>
|
||||||
<ms-reference-view ref="viewRef"/>
|
<ms-reference-view @openScenario="openScenario" ref="viewRef"/>
|
||||||
<ms-schedule-maintain ref="scheduleMaintain" @refreshTable="refreshTable"/>
|
<ms-schedule-maintain ref="scheduleMaintain" @refreshTable="refreshTable"/>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
@ -64,6 +64,9 @@
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
openScenario (item) {
|
||||||
|
this.$emit('openScenario', item)
|
||||||
|
},
|
||||||
refreshTable() {
|
refreshTable() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,26 @@
|
||||||
@click="handleAddTaskModel">
|
@click="handleAddTaskModel">
|
||||||
{{ $t('organization.message.create_new_notification') }}
|
{{ $t('organization.message.create_new_notification') }}
|
||||||
</el-button>
|
</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-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
<el-row>
|
<el-row>
|
||||||
|
@ -134,7 +154,35 @@ export default {
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
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: [{
|
scheduleTask: [{
|
||||||
taskType: "scheduleTask",
|
taskType: "scheduleTask",
|
||||||
event: "",
|
event: "",
|
||||||
|
|
|
@ -227,7 +227,7 @@
|
||||||
}); // 删除所有tab的 ctrl + s 监听
|
}); // 删除所有tab的 ctrl + s 监听
|
||||||
let tabs = this.apiTabs;
|
let tabs = this.apiTabs;
|
||||||
let index = tabs.findIndex(item => item.name === tab.name); // 找到当前选中tab的index
|
let index = tabs.findIndex(item => item.name === tab.name); // 找到当前选中tab的index
|
||||||
if (index != -1) {
|
if (index != -1 && this.$refs.apiConfig[index - 1]) {
|
||||||
this.$refs.apiConfig[index - 1].addListener(); // 为选中tab添加 ctrl + s 监听(index-1的原因是要除去第一个固有tab)
|
this.$refs.apiConfig[index - 1].addListener(); // 为选中tab添加 ctrl + s 监听(index-1的原因是要除去第一个固有tab)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -181,7 +181,7 @@ export default {
|
||||||
methods: {
|
methods: {
|
||||||
scheduleEdit() {
|
scheduleEdit() {
|
||||||
if (!this.formData.swaggerUrl) {
|
if (!this.formData.swaggerUrl) {
|
||||||
this.$warning(this.$t('commons.please_upload'));
|
this.$warning(this.$t('commons.please_fill_path'));
|
||||||
this.swaggerSynchronization = !this.swaggerSynchronization
|
this.swaggerSynchronization = !this.swaggerSynchronization
|
||||||
} else {
|
} else {
|
||||||
if (this.swaggerSynchronization) {
|
if (this.swaggerSynchronization) {
|
||||||
|
|
|
@ -469,7 +469,10 @@ export default {
|
||||||
return ids;
|
return ids;
|
||||||
},
|
},
|
||||||
showCaseRef(row) {
|
showCaseRef(row) {
|
||||||
this.$refs.viewRef.open(row);
|
let param = {};
|
||||||
|
Object.assign(param, row);
|
||||||
|
param.moduleId = undefined;
|
||||||
|
this.$refs.viewRef.open(param);
|
||||||
},
|
},
|
||||||
showEnvironment(row) {
|
showEnvironment(row) {
|
||||||
|
|
||||||
|
|
|
@ -5,14 +5,9 @@
|
||||||
</el-link>
|
</el-link>
|
||||||
<el-dropdown-menu slot="dropdown">
|
<el-dropdown-menu slot="dropdown">
|
||||||
<el-dropdown-item command="ref">{{ $t('api_test.automation.view_ref') }}</el-dropdown-item>
|
<el-dropdown-item command="ref">{{ $t('api_test.automation.view_ref') }}</el-dropdown-item>
|
||||||
<!-- <el-dropdown-item :disabled="isCaseEdit" command="add_plan">{{ $t('api_test.automation.batch_add_plan') }}</el-dropdown-item>-->
|
|
||||||
<el-dropdown-item :disabled="isCaseEdit" command="create_performance">{{ $t('api_test.create_performance_test') }}</el-dropdown-item>
|
<el-dropdown-item :disabled="isCaseEdit" command="create_performance">{{ $t('api_test.create_performance_test') }}</el-dropdown-item>
|
||||||
</el-dropdown-menu>
|
</el-dropdown-menu>
|
||||||
<ms-reference-view ref="viewRef"/>
|
<ms-reference-view ref="viewRef"/>
|
||||||
<!--测试计划-->
|
|
||||||
<el-drawer :visible.sync="planVisible" :destroy-on-close="true" direction="ltr" :withHeader="false" :title="$t('test_track.plan_view.test_result')" :modal="false" size="90%">
|
|
||||||
<ms-test-plan-list @addTestPlan="addTestPlan"/>
|
|
||||||
</el-drawer>
|
|
||||||
</el-dropdown>
|
</el-dropdown>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@ -36,7 +31,6 @@
|
||||||
planVisible: false,
|
planVisible: false,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
handleCommand(cmd) {
|
handleCommand(cmd) {
|
||||||
if (this.row.id) {
|
if (this.row.id) {
|
||||||
|
@ -44,9 +38,6 @@
|
||||||
case "ref":
|
case "ref":
|
||||||
this.$refs.viewRef.open(this.row);
|
this.$refs.viewRef.open(this.row);
|
||||||
break;
|
break;
|
||||||
case "add_plan":
|
|
||||||
this.addCaseToPlan();
|
|
||||||
break;
|
|
||||||
case "create_performance":
|
case "create_performance":
|
||||||
this.createPerformance(this.row);
|
this.createPerformance(this.row);
|
||||||
break;
|
break;
|
||||||
|
@ -113,16 +104,6 @@
|
||||||
this.$emit('runRefresh', {});
|
this.$emit('runRefresh', {});
|
||||||
});
|
});
|
||||||
|
|
||||||
},
|
|
||||||
addCaseToPlan() {
|
|
||||||
this.planVisible = true;
|
|
||||||
},
|
|
||||||
addTestPlan(plans) {
|
|
||||||
let obj = {planIds: plans, apiIds: [this.row.id]};
|
|
||||||
this.planVisible = false;
|
|
||||||
this.$post("/api/automation/scenario/plan", obj, response => {
|
|
||||||
this.$success(this.$t("commons.save_success"));
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -116,7 +116,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.search-bar {
|
.search-bar {
|
||||||
width: 200px
|
width: 240px
|
||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -28,6 +28,9 @@ import {getCurrentUser} from "@/common/js/utils";
|
||||||
import AboutUs from "./AboutUs";
|
import AboutUs from "./AboutUs";
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
|
|
||||||
|
const requireComponent = require.context('@/business/components/xpack/', true, /\.vue$/);
|
||||||
|
const auth = requireComponent.keys().length > 0 ? requireComponent("./auth/Auth.vue") : {};
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "MsUser",
|
name: "MsUser",
|
||||||
components: {AboutUs},
|
components: {AboutUs},
|
||||||
|
@ -42,6 +45,17 @@ export default {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
logout: function () {
|
||||||
|
axios.get("/signout").then(response => {
|
||||||
|
if (response.data.success) {
|
||||||
|
localStorage.clear();
|
||||||
|
window.location.href = "/login";
|
||||||
|
}
|
||||||
|
}).catch(error => {
|
||||||
|
localStorage.clear();
|
||||||
|
window.location.href = "/login";
|
||||||
|
});
|
||||||
|
},
|
||||||
handleCommand(command) {
|
handleCommand(command) {
|
||||||
switch (command) {
|
switch (command) {
|
||||||
case "personal":
|
case "personal":
|
||||||
|
@ -49,15 +63,7 @@ export default {
|
||||||
this.$router.push('/setting/personsetting').catch(error => error);
|
this.$router.push('/setting/personsetting').catch(error => error);
|
||||||
break;
|
break;
|
||||||
case "logout":
|
case "logout":
|
||||||
axios.get("/signout").then(response => {
|
this.logout();
|
||||||
if (response.data.success) {
|
|
||||||
localStorage.clear();
|
|
||||||
window.location.href = "/login";
|
|
||||||
}
|
|
||||||
}).catch(error => {
|
|
||||||
localStorage.clear();
|
|
||||||
window.location.href = "/login";
|
|
||||||
});
|
|
||||||
break;
|
break;
|
||||||
case "about":
|
case "about":
|
||||||
this.$refs.aboutUs.open();
|
this.$refs.aboutUs.open();
|
||||||
|
|
|
@ -6,6 +6,26 @@
|
||||||
<el-button icon="el-icon-circle-plus-outline" plain size="mini" @click="handleAddTaskModel">
|
<el-button icon="el-icon-circle-plus-outline" plain size="mini" @click="handleAddTaskModel">
|
||||||
{{ $t('organization.message.create_new_notification') }}
|
{{ $t('organization.message.create_new_notification') }}
|
||||||
</el-button>
|
</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-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
<el-row>
|
<el-row>
|
||||||
|
@ -129,6 +149,19 @@ export default {
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
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: [{
|
defectTask: [{
|
||||||
taskType: "defectTask",
|
taskType: "defectTask",
|
||||||
event: "",
|
event: "",
|
||||||
|
|
|
@ -6,6 +6,28 @@
|
||||||
<el-button icon="el-icon-circle-plus-outline" plain size="mini" @click="handleAddTaskModel">
|
<el-button icon="el-icon-circle-plus-outline" plain size="mini" @click="handleAddTaskModel">
|
||||||
{{ $t('organization.message.create_new_notification') }}
|
{{ $t('organization.message.create_new_notification') }}
|
||||||
</el-button>
|
</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-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
<el-row>
|
<el-row>
|
||||||
|
@ -132,6 +154,35 @@ export default {
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
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: [{
|
jenkinsTask: [{
|
||||||
taskType: "jenkinsTask",
|
taskType: "jenkinsTask",
|
||||||
event: "",
|
event: "",
|
||||||
|
|
|
@ -6,6 +6,26 @@
|
||||||
@click="handleAddTaskModel">
|
@click="handleAddTaskModel">
|
||||||
{{ $t('organization.message.create_new_notification') }}
|
{{ $t('organization.message.create_new_notification') }}
|
||||||
</el-button>
|
</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-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
<el-row>
|
<el-row>
|
||||||
|
@ -135,7 +155,35 @@ export default {
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
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: [{
|
scheduleTask: [{
|
||||||
taskType: "scheduleTask",
|
taskType: "scheduleTask",
|
||||||
event: "",
|
event: "",
|
||||||
|
|
|
@ -6,6 +6,26 @@
|
||||||
<el-button icon="el-icon-circle-plus-outline" plain size="mini" @click="handleAddTaskModel">
|
<el-button icon="el-icon-circle-plus-outline" plain size="mini" @click="handleAddTaskModel">
|
||||||
{{ $t('organization.message.create_new_notification') }}
|
{{ $t('organization.message.create_new_notification') }}
|
||||||
</el-button>
|
</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-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
<el-row>
|
<el-row>
|
||||||
|
@ -130,6 +150,27 @@ export default {
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
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: [{
|
testCasePlanTask: [{
|
||||||
taskType: "testPlanTask",
|
taskType: "testPlanTask",
|
||||||
event: "",
|
event: "",
|
||||||
|
|
|
@ -6,6 +6,26 @@
|
||||||
<el-button icon="el-icon-circle-plus-outline" plain size="mini" @click="handleAddTaskModel">
|
<el-button icon="el-icon-circle-plus-outline" plain size="mini" @click="handleAddTaskModel">
|
||||||
{{ $t('organization.message.create_new_notification') }}
|
{{ $t('organization.message.create_new_notification') }}
|
||||||
</el-button>
|
</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-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
<el-row>
|
<el-row>
|
||||||
|
@ -130,6 +150,26 @@ export default {
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
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: [{
|
reviewTask: [{
|
||||||
taskType: "reviewTask",
|
taskType: "reviewTask",
|
||||||
event: "",
|
event: "",
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
:condition="condition"
|
:condition="condition"
|
||||||
@search="$emit('refresh')"
|
@search="$emit('refresh')"
|
||||||
:show-create="false"
|
:show-create="false"
|
||||||
:tip="$t('commons.search_by_name_or_id')">
|
:tip="$t('commons.search_by_id_name_tag')">
|
||||||
<template v-slot:title>
|
<template v-slot:title>
|
||||||
接口用例
|
接口用例
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
<el-card class="card-content" v-loading="result.loading">
|
<el-card class="card-content" v-loading="result.loading">
|
||||||
<template v-slot:header>
|
<template v-slot:header>
|
||||||
<ms-table-header :is-tester-permission="true" :condition.sync="condition" @search="initTableData"
|
<ms-table-header :is-tester-permission="true" :condition.sync="condition" @search="initTableData"
|
||||||
:show-create="false" :tip="$t('commons.search_by_name_or_id')">
|
:show-create="false" :tip="$t('commons.search_by_id_name_tag')">
|
||||||
<template v-slot:title>
|
<template v-slot:title>
|
||||||
<node-breadcrumb class="table-title" :nodes="selectParentNodes" @refresh="breadcrumbRefresh"/>
|
<node-breadcrumb class="table-title" :nodes="selectParentNodes" @refresh="breadcrumbRefresh"/>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit 5abe43dc1f65b529ad59c17bfdc58aea33d23cad
|
Subproject commit 6d6ed5226849337876ecf55312aa6b5f13ba6472
|
|
@ -71,7 +71,8 @@ export default {
|
||||||
not_filled: 'Not filled',
|
not_filled: 'Not filled',
|
||||||
please_select: 'Please select',
|
please_select: 'Please select',
|
||||||
search_by_name: 'Search by name',
|
search_by_name: 'Search by name',
|
||||||
search_by_name_or_id: 'Search by name or id',
|
search_by_name_or_id: 'Search by ID/NAME',
|
||||||
|
search_by_id_name_tag: 'Search by ID/NAME/TAG',
|
||||||
personal_information: 'Personal Information',
|
personal_information: 'Personal Information',
|
||||||
exit_system: 'Exit System',
|
exit_system: 'Exit System',
|
||||||
verification: 'Verification',
|
verification: 'Verification',
|
||||||
|
@ -123,6 +124,7 @@ export default {
|
||||||
required: "{0} is required",
|
required: "{0} is required",
|
||||||
millisecond: 'ms',
|
millisecond: 'ms',
|
||||||
please_upload: 'Please upload file',
|
please_upload: 'Please upload file',
|
||||||
|
please_fill_path: 'Please fill in the path',
|
||||||
reference_documentation: "Reference documentation",
|
reference_documentation: "Reference documentation",
|
||||||
already_exists: 'The name already exists',
|
already_exists: 'The name already exists',
|
||||||
modifier: 'Modifier',
|
modifier: 'Modifier',
|
||||||
|
@ -250,6 +252,8 @@ export default {
|
||||||
test_review_task_notice: 'Test review task notice',
|
test_review_task_notice: 'Test review task notice',
|
||||||
defect_task_notification: 'Defect task notification',
|
defect_task_notification: 'Defect task notification',
|
||||||
create_new_notification: 'Create a new notification',
|
create_new_notification: 'Create a new notification',
|
||||||
|
mail_template_example: 'Mail template',
|
||||||
|
robot_template: 'Robot template',
|
||||||
select_events: 'Select event',
|
select_events: 'Select event',
|
||||||
select_receiving_method: 'Select receiving method',
|
select_receiving_method: 'Select receiving method',
|
||||||
mail: 'mail',
|
mail: 'mail',
|
||||||
|
|
|
@ -72,7 +72,8 @@ export default {
|
||||||
not_filled: '未填写',
|
not_filled: '未填写',
|
||||||
please_select: '请选择',
|
please_select: '请选择',
|
||||||
search_by_name: '根据名称搜索',
|
search_by_name: '根据名称搜索',
|
||||||
search_by_name_or_id: '根据ID或名称搜索',
|
search_by_name_or_id: '根据 ID/名称 搜索',
|
||||||
|
search_by_id_name_tag: '根据 ID/名称/标签 搜索',
|
||||||
personal_information: '个人信息',
|
personal_information: '个人信息',
|
||||||
exit_system: '退出系统',
|
exit_system: '退出系统',
|
||||||
verification: '验证',
|
verification: '验证',
|
||||||
|
@ -118,6 +119,7 @@ export default {
|
||||||
input_login_username: '请输入用户 ID 或 邮箱',
|
input_login_username: '请输入用户 ID 或 邮箱',
|
||||||
input_name: '请输入名称',
|
input_name: '请输入名称',
|
||||||
please_upload: '请上传文件',
|
please_upload: '请上传文件',
|
||||||
|
please_fill_path: '请填写ur路径',
|
||||||
formatErr: '格式错误',
|
formatErr: '格式错误',
|
||||||
please_save: '请先保存',
|
please_save: '请先保存',
|
||||||
reference_documentation: "参考文档",
|
reference_documentation: "参考文档",
|
||||||
|
@ -251,6 +253,8 @@ export default {
|
||||||
test_plan_task_notification: '测试计划任务通知',
|
test_plan_task_notification: '测试计划任务通知',
|
||||||
test_review_task_notice: '测试评审任务通知',
|
test_review_task_notice: '测试评审任务通知',
|
||||||
create_new_notification: '创建新通知',
|
create_new_notification: '创建新通知',
|
||||||
|
mail_template_example: '邮件模版',
|
||||||
|
robot_template: '机器人模版',
|
||||||
select_events: '选择事件',
|
select_events: '选择事件',
|
||||||
defect_task_notification: '缺陷任务通知',
|
defect_task_notification: '缺陷任务通知',
|
||||||
select_receiving_method: '选择接收方式',
|
select_receiving_method: '选择接收方式',
|
||||||
|
|
|
@ -72,7 +72,8 @@ export default {
|
||||||
not_filled: '未填寫',
|
not_filled: '未填寫',
|
||||||
please_select: '請選擇',
|
please_select: '請選擇',
|
||||||
search_by_name: '根據名稱搜索',
|
search_by_name: '根據名稱搜索',
|
||||||
search_by_name_or_id: '根據ID或名稱搜索',
|
search_by_name_or_id: '根據 ID/名稱 搜索',
|
||||||
|
search_by_id_name_tag: '根據 ID/名稱/標籤 搜索',
|
||||||
personal_information: '個人信息',
|
personal_information: '個人信息',
|
||||||
exit_system: '退出系統',
|
exit_system: '退出系統',
|
||||||
verification: '驗證',
|
verification: '驗證',
|
||||||
|
@ -118,6 +119,7 @@ export default {
|
||||||
input_login_username: '請輸入用戶 ID 或 郵箱',
|
input_login_username: '請輸入用戶 ID 或 郵箱',
|
||||||
input_name: '請輸入名稱',
|
input_name: '請輸入名稱',
|
||||||
please_upload: '請上傳文件',
|
please_upload: '請上傳文件',
|
||||||
|
please_fill_path: '請填寫ur路徑',
|
||||||
formatErr: '格式錯誤',
|
formatErr: '格式錯誤',
|
||||||
please_save: '請先保存',
|
please_save: '請先保存',
|
||||||
reference_documentation: "參考文檔",
|
reference_documentation: "參考文檔",
|
||||||
|
@ -251,6 +253,8 @@ export default {
|
||||||
test_plan_task_notification: '測試計劃任務通知',
|
test_plan_task_notification: '測試計劃任務通知',
|
||||||
test_review_task_notice: '測試評審任務通知',
|
test_review_task_notice: '測試評審任務通知',
|
||||||
create_new_notification: '創建新通知',
|
create_new_notification: '創建新通知',
|
||||||
|
mail_template_example: '郵件範本示例',
|
||||||
|
robot_template: '機器人模版',
|
||||||
select_events: '選擇事件',
|
select_events: '選擇事件',
|
||||||
defect_task_notification: '缺陷任務通知',
|
defect_task_notification: '缺陷任務通知',
|
||||||
select_receiving_method: '選擇接收方式',
|
select_receiving_method: '選擇接收方式',
|
||||||
|
|
Loading…
Reference in New Issue