diff --git a/frontend/src/business/components/api/automation/ApiAutomation.vue b/frontend/src/business/components/api/automation/ApiAutomation.vue
index f4e322c62a..097ceb5346 100644
--- a/frontend/src/business/components/api/automation/ApiAutomation.vue
+++ b/frontend/src/business/components/api/automation/ApiAutomation.vue
@@ -35,7 +35,7 @@
closable>
+ :moduleOptions="moduleOptions" ref="autoScenarioConfig"/>
@@ -111,6 +111,16 @@
// 在 DOM 中添加 my-component 组件
this.renderComponent = true;
});
+ },
+ '$route'(to, from) { // 路由改变时,把接口定义界面中的 ctrl s 保存快捷键监听移除
+ if (to.path.indexOf('/api/automation') == -1) {
+ if (this.$refs && this.$refs.autoScenarioConfig) {
+ console.log(this.$refs.autoScenarioConfig);
+ this.$refs.autoScenarioConfig.forEach(item => {
+ item.removeListener();
+ });
+ }
+ }
}
},
methods: {
@@ -158,6 +168,20 @@
label = tab.currentScenario.name;
this.tabs.push({label: label, name: name, currentScenario: tab.currentScenario});
}
+ if (this.$refs && this.$refs.autoScenarioConfig) {
+ this.$refs.autoScenarioConfig.forEach(item => {
+ item.removeListener();
+ }); // 删除所有tab的 ctrl + s 监听
+ this.addListener();
+ }
+ },
+ addListener() {
+ let index = this.tabs.findIndex(item => item.name === this.activeName); // 找到当前选中tab的index
+ if(index != -1) { // 为当前选中的tab添加监听
+ this.$nextTick(()=>{
+ this.$refs.autoScenarioConfig[index].addListener();
+ });
+ }
},
handleTabClose() {
this.tabs = [];
@@ -181,6 +205,7 @@
this.tabs = this.tabs.filter(tab => tab.name !== targetName);
if (this.tabs.length > 0) {
this.activeName = this.tabs[this.tabs.length - 1].name;
+ this.addListener(); // 自动切换当前标签时,也添加监听
} else {
this.activeName = "default"
}
diff --git a/frontend/src/business/components/api/automation/scenario/EditApiScenario.vue b/frontend/src/business/components/api/automation/scenario/EditApiScenario.vue
index e80461184f..257b9335ef 100644
--- a/frontend/src/business/components/api/automation/scenario/EditApiScenario.vue
+++ b/frontend/src/business/components/api/automation/scenario/EditApiScenario.vue
@@ -5,7 +5,7 @@
- {{$t('commons.save')}}
+ {{$t('commons.save')}}
{{$t('test_track.plan_view.base_info')}}
@@ -222,6 +222,7 @@
import ScenarioApiRelevance from "./api/ApiRelevance";
import ScenarioRelevance from "./api/ScenarioRelevance";
import MsComponentConfig from "./component/ComponentConfig";
+ import {handleCtrlSEvent} from "../../../../../common/js/utils";
export default {
name: "EditApiScenario",
@@ -295,6 +296,7 @@
this.operatingElements = ELEMENTS.get("ALL");
this.getMaintainerOptions();
this.getApiScenario();
+ this.addListener(); // 添加 ctrl s 监听
},
directives: {OutsideClick},
computed: {
@@ -413,6 +415,17 @@
}
},
methods: {
+ addListener() {
+ document.addEventListener("keydown", this.createCtrlSHandle);
+ // document.addEventListener("keydown", (even => handleCtrlSEvent(even, this.$refs.httpApi.saveApi)));
+ },
+ removeListener() {
+ document.removeEventListener("keydown", this.createCtrlSHandle);
+ },
+ createCtrlSHandle(event) {
+ console.log("create ctrl + s");
+ handleCtrlSEvent(event, this.editScenario);
+ },
getIdx(index) {
return index - 0.33
},
@@ -822,15 +835,13 @@
}
return bodyUploadFiles;
},
- editScenario(showMessage) {
+ editScenario() {
this.$refs['currentScenario'].validate((valid) => {
if (valid) {
this.setParameter();
let bodyFiles = this.getBodyUploadFiles(this.currentScenario);
this.$fileUpload(this.path, null, bodyFiles, this.currentScenario, response => {
- if (showMessage) {
- this.$success(this.$t('commons.save_success'));
- }
+ this.$success(this.$t('commons.save_success'));
this.path = "/api/automation/update";
if (response.data) {
this.currentScenario.id = response.data.id;
diff --git a/frontend/src/business/components/api/definition/ApiDefinition.vue b/frontend/src/business/components/api/definition/ApiDefinition.vue
index 0421b518eb..9b47c97278 100644
--- a/frontend/src/business/components/api/definition/ApiDefinition.vue
+++ b/frontend/src/business/components/api/definition/ApiDefinition.vue
@@ -198,6 +198,15 @@
// 在 DOM 中添加 my-component 组件
this.renderComponent = true;
});
+ },
+ '$route'(to, from) { // 路由改变时,把接口定义界面中的 ctrl s 保存快捷键监听移除
+ if (to.path.indexOf('/api/definition') == -1) {
+ if (this.$refs && this.$refs.apiConfig) {
+ this.$refs.apiConfig.forEach(item => {
+ item.removeListener();
+ });
+ }
+ }
}
},
methods: {
@@ -211,6 +220,17 @@
if (tab.name === 'add') {
this.handleTabsEdit(this.$t('api_test.definition.request.fast_debug'), "debug");
}
+ if(this.$refs.apiConfig) {
+ this.$refs.apiConfig.forEach(item => {
+ console.log(item);
+ item.removeListener();
+ }); // 删除所有tab的 ctrl + s 监听
+ let tabs = this.apiTabs;
+ let index = tabs.findIndex(item => item.name === tab.name); // 找到当前选中tab的index
+ if(index != -1) {
+ this.$refs.apiConfig[index - 1].addListener(); // 为选中tab添加 ctrl + s 监听(index-1的原因是要除去第一个固有tab)
+ }
+ }
},
handleCommand(e) {
switch (e) {
diff --git a/frontend/src/business/components/api/definition/components/ApiConfig.vue b/frontend/src/business/components/api/definition/components/ApiConfig.vue
index 1cf299f8a2..bbd76219c8 100644
--- a/frontend/src/business/components/api/definition/components/ApiConfig.vue
+++ b/frontend/src/business/components/api/definition/components/ApiConfig.vue
@@ -3,16 +3,16 @@
+ :basisData="currentApi" :moduleOptions="moduleOptions" :syncTabs="syncTabs" v-if="currentProtocol === 'HTTP'" ref="httpApi"/>
+ :moduleOptions="moduleOptions" :syncTabs="syncTabs" v-if="currentProtocol === 'TCP'" ref="tcpApi"/>
+ :moduleOptions="moduleOptions" :syncTabs="syncTabs" v-if="currentProtocol === 'DUBBO'" ref="dubboApi"/>
+ :moduleOptions="moduleOptions" :syncTabs="syncTabs" v-if="currentProtocol === 'SQL'" ref="sqlApi"/>
@@ -27,6 +27,7 @@
import {createComponent, Request} from "./jmeter/components";
import Sampler from "./jmeter/components/sampler/sampler";
import {WORKSPACE_ID} from '@/common/js/constants';
+ import {handleCtrlSEvent} from "../../../../../common/js/utils";
export default {
name: "ApiConfig",
@@ -65,8 +66,30 @@
break;
}
this.formatApi();
+ this.addListener();
},
methods: {
+ addListener() {
+ document.addEventListener("keydown", this.createCtrlSHandle);
+ // document.addEventListener("keydown", (even => handleCtrlSEvent(even, this.$refs.httpApi.saveApi)));
+ },
+ removeListener() {
+ document.removeEventListener("keydown", this.createCtrlSHandle);
+ },
+ createCtrlSHandle(event) {
+ if(this.$refs.httpApi) {
+ handleCtrlSEvent(event, this.$refs.httpApi.saveApi);
+ }
+ else if(this.$refs.tcpApi) {
+ handleCtrlSEvent(event, this.$refs.tcpApi.saveApi);
+ }
+ else if(this.$refs.dubboApi) {
+ handleCtrlSEvent(event, this.$refs.dubboApi.saveApi);
+ }
+ else if(this.$refs.sqlApi) {
+ handleCtrlSEvent(event, this.$refs.sqlApi.saveApi);
+ }
+ },
runTest(data) {
this.setParameters(data);
let bodyFiles = this.getBodyUploadFiles(data);
diff --git a/frontend/src/business/components/api/definition/components/complete/EditCompleteDubboApi.vue b/frontend/src/business/components/api/definition/components/complete/EditCompleteDubboApi.vue
index ffecc7cd01..90769131cb 100644
--- a/frontend/src/business/components/api/definition/components/complete/EditCompleteDubboApi.vue
+++ b/frontend/src/business/components/api/definition/components/complete/EditCompleteDubboApi.vue
@@ -6,7 +6,7 @@
- {{ $t('commons.save') }}
+ {{ $t('commons.save') }}
{{ $t('commons.test') }}
diff --git a/frontend/src/business/components/api/definition/components/complete/EditCompleteHTTPApi.vue b/frontend/src/business/components/api/definition/components/complete/EditCompleteHTTPApi.vue
index 6f4415ee65..7cb015595a 100644
--- a/frontend/src/business/components/api/definition/components/complete/EditCompleteHTTPApi.vue
+++ b/frontend/src/business/components/api/definition/components/complete/EditCompleteHTTPApi.vue
@@ -6,7 +6,7 @@
- {{ $t('commons.save') }}
+ {{ $t('commons.save') }}
{{ $t('commons.test') }}
diff --git a/frontend/src/business/components/api/definition/components/complete/EditCompleteSQLApi.vue b/frontend/src/business/components/api/definition/components/complete/EditCompleteSQLApi.vue
index 0b0bb5699e..14df6b2c0e 100644
--- a/frontend/src/business/components/api/definition/components/complete/EditCompleteSQLApi.vue
+++ b/frontend/src/business/components/api/definition/components/complete/EditCompleteSQLApi.vue
@@ -5,7 +5,7 @@
- {{ $t('commons.save') }}
+ {{ $t('commons.save') }}
{{ $t('commons.test') }}
diff --git a/frontend/src/business/components/api/definition/components/complete/EditCompleteTCPApi.vue b/frontend/src/business/components/api/definition/components/complete/EditCompleteTCPApi.vue
index 3253522333..682ea8817c 100644
--- a/frontend/src/business/components/api/definition/components/complete/EditCompleteTCPApi.vue
+++ b/frontend/src/business/components/api/definition/components/complete/EditCompleteTCPApi.vue
@@ -5,7 +5,7 @@
- {{ $t('commons.save') }}
+ {{ $t('commons.save') }}
{{ $t('commons.test') }}
diff --git a/frontend/src/common/js/utils.js b/frontend/src/common/js/utils.js
index 38de23f333..30602936cc 100644
--- a/frontend/src/common/js/utils.js
+++ b/frontend/src/common/js/utils.js
@@ -356,3 +356,12 @@ export function _getBodyUploadFiles(request, bodyUploadFiles, obj) {
}
}
}
+export function handleCtrlSEvent(event, func) {
+ if (event.keyCode === 83 && event.ctrlKey) {
+ // console.log('拦截到 ctrl + s');//ctrl+s
+ func();
+ event.preventDefault();
+ event.returnValue = false;
+ return false;
+ }
+}