From 4243cfdf7bed3797baa44c9a3a2fbbae58b652c6 Mon Sep 17 00:00:00 2001 From: shiziyuan9527 Date: Mon, 15 Mar 2021 11:34:51 +0800 Subject: [PATCH 01/15] =?UTF-8?q?fix:=20=E4=B8=BB=E9=A2=98=E8=89=B2?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/business/App.vue | 1 + .../components/common/head/HeaderLabelOperate.vue | 7 +++++-- .../src/business/components/track/home/TrackHome.vue | 4 ++-- frontend/src/business/store.js | 12 ++++++++++++ 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/frontend/src/business/App.vue b/frontend/src/business/App.vue index a03bda8a6d..b2efe68a1b 100644 --- a/frontend/src/business/App.vue +++ b/frontend/src/business/App.vue @@ -62,6 +62,7 @@ export default { this.$get('/system/theme', res => { this.color = res.data ? res.data : ORIGIN_COLOR; setColor(this.color, this.color, this.color, this.color); + this.$store.commit('setTheme', res.data); }) } if (localStorage.getItem("store")) { diff --git a/frontend/src/business/components/common/head/HeaderLabelOperate.vue b/frontend/src/business/components/common/head/HeaderLabelOperate.vue index 66c9f275fd..b5764b6ea6 100644 --- a/frontend/src/business/components/common/head/HeaderLabelOperate.vue +++ b/frontend/src/business/components/common/head/HeaderLabelOperate.vue @@ -2,7 +2,7 @@
@@ -21,5 +21,8 @@ export default { diff --git a/frontend/src/business/components/track/home/TrackHome.vue b/frontend/src/business/components/track/home/TrackHome.vue index 1f0b14b7e8..084aff62dd 100644 --- a/frontend/src/business/components/track/home/TrackHome.vue +++ b/frontend/src/business/components/track/home/TrackHome.vue @@ -169,7 +169,7 @@ export default { type: 'bar', itemStyle: { normal: { - color: COUNT_NUMBER + color: this.$store.state.theme.theme ? this.$store.state.theme.theme : COUNT_NUMBER } } }, @@ -179,7 +179,7 @@ export default { type: 'bar', itemStyle: { normal: { - color: COUNT_NUMBER_SHALLOW + color: this.$store.state.theme.theme ? this.$store.state.theme.theme : COUNT_NUMBER_SHALLOW } } }] diff --git a/frontend/src/business/store.js b/frontend/src/business/store.js index c536ea0d38..4fbb5d7f17 100644 --- a/frontend/src/business/store.js +++ b/frontend/src/business/store.js @@ -50,11 +50,23 @@ const IsReadOnly = { } } +const Theme = { + state: { + theme: undefined + }, + mutations: { + setTheme(state, value) { + state.theme = value; + } + } +} + export default new Vuex.Store({ modules: { api: API, common: Common, switch: Switch, isReadOnly: IsReadOnly, + theme: Theme } }) From 82d7be618c1d3377988615dc7b6b644b9aeb46ac Mon Sep 17 00:00:00 2001 From: shiziyuan9527 Date: Mon, 15 Mar 2021 15:26:56 +0800 Subject: [PATCH 02/15] =?UTF-8?q?fix:=20=E4=B8=BB=E9=A2=98=E8=89=B2?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/pom.xml | 5 +++ .../metersphere/commons/utils/ShiroUtils.java | 2 + frontend/src/business/App.vue | 6 +-- frontend/src/business/components/xpack | 2 +- frontend/src/common/css/main.css | 1 + frontend/src/common/js/constants.js | 1 + frontend/src/common/js/utils.js | 40 +++++++++---------- frontend/src/login/Login.vue | 30 ++++++++------ 8 files changed, 50 insertions(+), 37 deletions(-) diff --git a/backend/pom.xml b/backend/pom.xml index edd70316fa..e3a2c2754e 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -541,6 +541,11 @@ + + + + + diff --git a/backend/src/main/java/io/metersphere/commons/utils/ShiroUtils.java b/backend/src/main/java/io/metersphere/commons/utils/ShiroUtils.java index 90c4e26e92..61f73dd9ad 100644 --- a/backend/src/main/java/io/metersphere/commons/utils/ShiroUtils.java +++ b/backend/src/main/java/io/metersphere/commons/utils/ShiroUtils.java @@ -42,6 +42,8 @@ public class ShiroUtils { //api-对外文档页面提供的查询接口 filterChainDefinitionMap.put("/api/document/**", "anon"); // filterChainDefinitionMap.put("/document/**", "anon"); + filterChainDefinitionMap.put("/system/theme", "anon"); + } public static void ignoreCsrfFilter(Map filterChainDefinitionMap) { diff --git a/frontend/src/business/App.vue b/frontend/src/business/App.vue index b2efe68a1b..f279581ae6 100644 --- a/frontend/src/business/App.vue +++ b/frontend/src/business/App.vue @@ -31,7 +31,7 @@ import MsView from "./components/common/router/View"; import MsUser from "./components/common/head/HeaderUser"; import MsHeaderOrgWs from "./components/common/head/HeaderOrgWs"; import MsLanguageSwitch from "./components/common/head/LanguageSwitch"; -import {hasLicense, saveLocalStorage, setColor, setOriginColor} from "@/common/js/utils"; +import {hasLicense, saveLocalStorage, setColor, setDefaultTheme} from "@/common/js/utils"; import {registerRequestHeaders} from "@/common/js/ajax"; import {ORIGIN_COLOR} from "@/common/js/constants"; @@ -55,13 +55,13 @@ export default { created() { registerRequestHeaders(); if (!hasLicense()) { - setOriginColor() + setDefaultTheme(); this.color = ORIGIN_COLOR; } else { // this.$get('/system/theme', res => { this.color = res.data ? res.data : ORIGIN_COLOR; - setColor(this.color, this.color, this.color, this.color); + setColor(this.color, this.color, this.color, this.color, this.color); this.$store.commit('setTheme', res.data); }) } diff --git a/frontend/src/business/components/xpack b/frontend/src/business/components/xpack index 4c33b9c3b1..b2571e06e8 160000 --- a/frontend/src/business/components/xpack +++ b/frontend/src/business/components/xpack @@ -1 +1 @@ -Subproject commit 4c33b9c3b12a83da6d9bd2740262c6c8baaab819 +Subproject commit b2571e06e8b211821409115cc2c4a7c52cbac1db diff --git a/frontend/src/common/css/main.css b/frontend/src/common/css/main.css index 34a336f689..2595486214 100644 --- a/frontend/src/common/css/main.css +++ b/frontend/src/common/css/main.css @@ -17,6 +17,7 @@ body { /*--color: #2c2a48;*/ /*--color_shallow: #595591;*/ --color: ''; + --primary_color: ''; --color_shallow: ''; --count_number: ''; --count_number_shallow: ''; diff --git a/frontend/src/common/js/constants.js b/frontend/src/common/js/constants.js index cbaf36f974..e8c6de79f3 100644 --- a/frontend/src/common/js/constants.js +++ b/frontend/src/common/js/constants.js @@ -173,3 +173,4 @@ export const ORIGIN_COLOR = '#2c2a48'; export const ORIGIN_COLOR_SHALLOW = '#595591'; export const COUNT_NUMBER = '#6C317C'; export const COUNT_NUMBER_SHALLOW = '#CDB9D2'; +export const PRIMARY_COLOR = '#783887'; diff --git a/frontend/src/common/js/utils.js b/frontend/src/common/js/utils.js index 02822ea8e6..2463cec636 100644 --- a/frontend/src/common/js/utils.js +++ b/frontend/src/common/js/utils.js @@ -1,17 +1,17 @@ import { - COUNT_NUMBER, - COUNT_NUMBER_SHALLOW, - LicenseKey, - ORIGIN_COLOR, - ORIGIN_COLOR_SHALLOW, - PROJECT_ID, - REFRESH_SESSION_USER_URL, - ROLE_ADMIN, - ROLE_ORG_ADMIN, - ROLE_TEST_MANAGER, - ROLE_TEST_USER, - ROLE_TEST_VIEWER, - TokenKey + COUNT_NUMBER, + COUNT_NUMBER_SHALLOW, + LicenseKey, + ORIGIN_COLOR, + ORIGIN_COLOR_SHALLOW, PRIMARY_COLOR, + PROJECT_ID, + REFRESH_SESSION_USER_URL, + ROLE_ADMIN, + ROLE_ORG_ADMIN, + ROLE_TEST_MANAGER, + ROLE_TEST_USER, + ROLE_TEST_VIEWER, + TokenKey } from "./constants"; import axios from "axios"; import {jsPDF} from "jspdf"; @@ -354,19 +354,19 @@ export function objToStrMap(obj) { return strMap; } -export function getColor() { - return localStorage.getItem('color'); -} - -export function setColor(a, b, c, d) { +export function setColor(a, b, c, d, e) { + // 顶部菜单背景色 document.body.style.setProperty('--color', a); document.body.style.setProperty('--color_shallow', b); + // 首页颜色 document.body.style.setProperty('--count_number', c); document.body.style.setProperty('--count_number_shallow', d); + // 主颜色 + document.body.style.setProperty('--primary_color', e); } -export function setOriginColor() { - setColor(ORIGIN_COLOR, ORIGIN_COLOR_SHALLOW, COUNT_NUMBER, COUNT_NUMBER_SHALLOW); +export function setDefaultTheme() { + setColor(ORIGIN_COLOR, ORIGIN_COLOR_SHALLOW, COUNT_NUMBER, COUNT_NUMBER_SHALLOW, PRIMARY_COLOR); } export function publicKeyEncrypt(input, publicKey) { diff --git a/frontend/src/login/Login.vue b/frontend/src/login/Login.vue index 8ca8bc7da5..4ef3406a7b 100644 --- a/frontend/src/login/Login.vue +++ b/frontend/src/login/Login.vue @@ -56,7 +56,7 @@ diff --git a/frontend/src/business/components/track/case/TestCase.vue b/frontend/src/business/components/track/case/TestCase.vue index 97ac158146..890abb27f3 100644 --- a/frontend/src/business/components/track/case/TestCase.vue +++ b/frontend/src/business/components/track/case/TestCase.vue @@ -39,8 +39,9 @@ @setCondition="setCondition" ref="testCaseList"> - @@ -97,17 +98,17 @@ import SelectMenu from "../common/SelectMenu"; import MsContainer from "../../common/components/MsContainer"; import MsAsideContainer from "../../common/components/MsAsideContainer"; import MsMainContainer from "../../common/components/MsMainContainer"; -import {checkoutTestManagerOrTestUser, getCurrentProjectID, getUUID, hasRoles} from "../../../../common/js/utils"; +import {checkoutTestManagerOrTestUser, getCurrentProjectID, getUUID} from "../../../../common/js/utils"; import TestCaseNodeTree from "../common/TestCaseNodeTree"; -import {TrackEvent,LIST_CHANGE} from "@/business/components/common/head/ListEvent"; -import TestcaseMinder from "@/business/components/common/components/MsModuleMinder"; + import MsTabButton from "@/business/components/common/components/MsTabButton"; +import TestCaseMinder from "@/business/components/track/case/components/minder/TestCaseMinder"; export default { name: "TestCase", components: { + TestCaseMinder, MsTabButton, - TestcaseMinder, TestCaseNodeTree, MsMainContainer, MsAsideContainer, MsContainer, TestCaseList, NodeTree, TestCaseEdit, SelectMenu @@ -129,11 +130,13 @@ export default { renderComponent:true, loading: false, type:'', - activeDom: 'left' + activeDom: 'left', + projectId: "" } }, mounted() { this.init(this.$route); + this.projectId = getCurrentProjectID(); }, watch: { redirectID() { @@ -193,7 +196,7 @@ export default { } }, addTab(tab) { - if (!getCurrentProjectID()) { + if (!this.projectId) { this.$warning(this.$t('commons.check_project_tip')); return; } @@ -253,7 +256,7 @@ export default { this.testCaseReadOnly = true; } let caseId = this.$route.params.caseId; - if (!getCurrentProjectID()) { + if (!this.projectId) { this.$warning(this.$t('commons.check_project_tip')); return; } diff --git a/frontend/src/business/components/track/case/components/TestCaseEdit.vue b/frontend/src/business/components/track/case/components/TestCaseEdit.vue index f9a18890b6..c1800b8268 100644 --- a/frontend/src/business/components/track/case/components/TestCaseEdit.vue +++ b/frontend/src/business/components/track/case/components/TestCaseEdit.vue @@ -472,7 +472,6 @@ export default { reload() { this.isStepTableAlive = false; this.$nextTick(() => (this.isStepTableAlive = true)); - console.log(this.form) }, open(testCase) { this.projectId = getCurrentProjectID(); @@ -552,9 +551,7 @@ export default { let tmp = {}; Object.assign(tmp, testCase); tmp.steps = JSON.parse(testCase.steps); - console.log(tmp) Object.assign(this.form, tmp); - console.log(this.form) this.form.module = testCase.nodeId; this.getFileMetaData(testCase); }, @@ -631,7 +628,6 @@ export default { let param = this.buildParam(); if (this.validate(param)) { let option = this.getOption(param); - console.log(option) this.result = this.$request(option, () => { this.$success(this.$t('commons.save_success')); if (this.operationType == 'add' && this.isCreateContinue) { diff --git a/frontend/src/business/components/track/case/components/minder/TestCaseMinder.vue b/frontend/src/business/components/track/case/components/minder/TestCaseMinder.vue index 6f275d8b30..70950fd491 100644 --- a/frontend/src/business/components/track/case/components/minder/TestCaseMinder.vue +++ b/frontend/src/business/components/track/case/components/minder/TestCaseMinder.vue @@ -1,6 +1,10 @@ From c426bb2064d85b475ef1ec06c1916ee7bc8c8afa Mon Sep 17 00:00:00 2001 From: "Captain.B" Date: Mon, 15 Mar 2021 16:55:33 +0800 Subject: [PATCH 04/15] =?UTF-8?q?feat(=E6=80=A7=E8=83=BD=E6=B5=8B=E8=AF=95?= =?UTF-8?q?):=20=E9=85=8D=E7=BD=AE=E5=8E=8B=E6=B5=8B=E6=97=B6=E9=95=BF?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=8D=95=E4=BD=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xml/reader/jmx/JmeterDocumentParser.java | 44 +++++++++++++++++-- .../components/PerformancePressureConfig.vue | 35 +++++++++++---- .../components/PerformanceAdvancedConfig.vue | 2 +- .../components/PerformancePressureConfig.vue | 41 ++++++++++++----- .../performance/test/model/ThreadGroup.js | 1 + frontend/src/i18n/en-US.js | 2 +- frontend/src/i18n/zh-CN.js | 6 +-- frontend/src/i18n/zh-TW.js | 2 +- 8 files changed, 105 insertions(+), 28 deletions(-) diff --git a/backend/src/main/java/io/metersphere/performance/parse/xml/reader/jmx/JmeterDocumentParser.java b/backend/src/main/java/io/metersphere/performance/parse/xml/reader/jmx/JmeterDocumentParser.java index 13ffc9a34e..09fbda18a5 100644 --- a/backend/src/main/java/io/metersphere/performance/parse/xml/reader/jmx/JmeterDocumentParser.java +++ b/backend/src/main/java/io/metersphere/performance/parse/xml/reader/jmx/JmeterDocumentParser.java @@ -676,6 +676,13 @@ public class JmeterDocumentParser implements DocumentParser { ((List) durations).remove(0); duration = o.toString(); } + Object units = context.getProperty("unit"); + String unit = "S"; + if (units instanceof List) { + Object o = ((List) units).get(0); + ((List) units).remove(0); + unit = o.toString(); + } Object deleteds = context.getProperty("deleted"); String deleted = "false"; if (deleteds instanceof List) { @@ -691,6 +698,17 @@ public class JmeterDocumentParser implements DocumentParser { enabled = o.toString(); } + switch (unit) { + case "M": + duration = String.valueOf(Long.parseLong(duration) * 60); + break; + case "H": + duration = String.valueOf(Long.parseLong(duration) * 60 * 60); + break; + default: + break; + } + threadGroup.setAttribute("enabled", enabled); if (BooleanUtils.toBoolean(deleted)) { threadGroup.setAttribute("enabled", "false"); @@ -761,6 +779,13 @@ public class JmeterDocumentParser implements DocumentParser { ((List) holds).remove(0); hold = o.toString(); } + Object units = context.getProperty("unit"); + String unit = "S"; + if (units instanceof List) { + Object o = ((List) units).get(0); + ((List) units).remove(0); + unit = o.toString(); + } Object deleteds = context.getProperty("deleted"); String deleted = "false"; if (deleteds instanceof List) { @@ -776,6 +801,17 @@ public class JmeterDocumentParser implements DocumentParser { enabled = o.toString(); } + switch (unit) { + case "M": + hold = String.valueOf(Long.parseLong(hold) * 60); + break; + case "H": + hold = String.valueOf(Long.parseLong(hold) * 60 * 60); + break; + default: + break; + } + threadGroup.setAttribute("enabled", enabled); if (BooleanUtils.toBoolean(deleted)) { threadGroup.setAttribute("enabled", "false"); @@ -928,10 +964,10 @@ public class JmeterDocumentParser implements DocumentParser { } private Element createStringProp(Document document, String name, String value) { - Element unit = document.createElement(STRING_PROP); - unit.setAttribute("name", name); - unit.appendChild(document.createTextNode(value)); - return unit; + Element element = document.createElement(STRING_PROP); + element.setAttribute("name", name); + element.appendChild(document.createTextNode(value)); + return element; } private void processThreadGroupName(Element threadGroup) { diff --git a/frontend/src/business/components/performance/report/components/PerformancePressureConfig.vue b/frontend/src/business/components/performance/report/components/PerformancePressureConfig.vue index 2157353b8d..633b28f122 100644 --- a/frontend/src/business/components/performance/report/components/PerformancePressureConfig.vue +++ b/frontend/src/business/components/performance/report/components/PerformancePressureConfig.vue @@ -37,6 +37,13 @@ @change="calculateChart(threadGroup)" size="mini"/> + + + {{ $t('schedule.cron.seconds') }} + {{ $t('schedule.cron.minutes') }} + {{ $t('schedule.cron.hours') }} + +
@@ -59,7 +66,7 @@ @change="calculateChart(threadGroup)" size="mini"/> - + - + @@ -112,7 +119,7 @@ @change="calculateChart(threadGroup)" size="mini"/> - + @@ -137,6 +144,7 @@ const TARGET_LEVEL = "TargetLevel"; const RAMP_UP = "RampUp"; const STEPS = "Steps"; const DURATION = "duration"; +const UNIT = "unit"; const RPS_LIMIT = "rpsLimit"; const RPS_LIMIT_ENABLE = "rpsLimitEnable"; const THREAD_TYPE = "threadType"; @@ -196,11 +204,10 @@ export default { this.threadGroups[i].iterateRampUp = item.value; break; case DURATION: - if (item.unit) { - this.threadGroups[i].duration = item.value; - } else { - this.threadGroups[i].duration = item.value * 60; - } + this.threadGroups[i].duration = item.value; + break; + case UNIT: + this.threadGroups[i].unit = item.value; break; case STEPS: this.threadGroups[i].step = item.value; @@ -506,6 +513,18 @@ export default { } this.calculateTotalChart(); }, + getUnitLabel(tg) { + if (tg.unit === 'S') { + return this.$t('schedule.cron.seconds'); + } + if (tg.unit === 'M') { + return this.$t('schedule.cron.minutes'); + } + if (tg.unit === 'H') { + return this.$t('schedule.cron.hours'); + } + return this.$t('schedule.cron.seconds'); + }, }, watch: { report: { diff --git a/frontend/src/business/components/performance/test/components/PerformanceAdvancedConfig.vue b/frontend/src/business/components/performance/test/components/PerformanceAdvancedConfig.vue index 5a835228bd..fcacb7434e 100644 --- a/frontend/src/business/components/performance/test/components/PerformanceAdvancedConfig.vue +++ b/frontend/src/business/components/performance/test/components/PerformanceAdvancedConfig.vue @@ -130,7 +130,7 @@ diff --git a/frontend/src/business/components/performance/test/components/PerformancePressureConfig.vue b/frontend/src/business/components/performance/test/components/PerformancePressureConfig.vue index c800972a24..29df9f4e18 100644 --- a/frontend/src/business/components/performance/test/components/PerformancePressureConfig.vue +++ b/frontend/src/business/components/performance/test/components/PerformancePressureConfig.vue @@ -47,10 +47,17 @@ :disabled="isReadOnly" v-model="threadGroup.duration" :min="1" - :max="172800" + :max="99999" @change="calculateChart(threadGroup)" size="mini"/> + + + {{ $t('schedule.cron.seconds') }} + {{ $t('schedule.cron.minutes') }} + {{ $t('schedule.cron.hours') }} + +
@@ -74,7 +81,7 @@ @change="calculateChart(threadGroup)" size="mini"/> - + - + @@ -128,7 +135,7 @@ v-model="threadGroup.iterateRampUp" size="mini"/> - + @@ -154,6 +161,7 @@ const RAMP_UP = "RampUp"; const ITERATE_RAMP_UP = "iterateRampUpTime"; const STEPS = "Steps"; const DURATION = "duration"; +const UNIT = "unit"; const RPS_LIMIT = "rpsLimit"; const RPS_LIMIT_ENABLE = "rpsLimitEnable"; const HOLD = "Hold"; @@ -253,11 +261,10 @@ export default { this.threadGroups[i].iterateRampUp = item.value; break; case DURATION: - if (item.unit) { - this.threadGroups[i].duration = item.value; - } else { - this.threadGroups[i].duration = item.value * 60; - } + this.threadGroups[i].duration = item.value; + break; + case UNIT: + this.threadGroups[i].unit = item.value; break; case STEPS: this.threadGroups[i].step = item.value; @@ -290,6 +297,7 @@ export default { break; } // + this.$set(this.threadGroups[i], "unit", this.threadGroups[i].unit || 'S'); this.$set(this.threadGroups[i], "threadType", this.threadGroups[i].threadType || 'DURATION'); this.$set(this.threadGroups[i], "iterateNum", this.threadGroups[i].iterateNum || 1); this.$set(this.threadGroups[i], "iterateRampUp", this.threadGroups[i].iterateRampUp || 10); @@ -576,6 +584,18 @@ export default { return true; }, + getUnitLabel(tg) { + if (tg.unit === 'S') { + return this.$t('schedule.cron.seconds'); + } + if (tg.unit === 'M') { + return this.$t('schedule.cron.minutes'); + } + if (tg.unit === 'H') { + return this.$t('schedule.cron.hours'); + } + return this.$t('schedule.cron.seconds'); + }, convertProperty() { /// todo:下面4个属性是jmeter ConcurrencyThreadGroup plugin的属性,这种硬编码不太好吧,在哪能转换这种属性? let result = []; @@ -585,7 +605,8 @@ export default { {key: TARGET_LEVEL, value: this.threadGroups[i].threadNumber}, {key: RAMP_UP, value: this.threadGroups[i].rampUpTime}, {key: STEPS, value: this.threadGroups[i].step}, - {key: DURATION, value: this.threadGroups[i].duration, unit: 'S'}, + {key: DURATION, value: this.threadGroups[i].duration, unit: this.threadGroups[i].unit}, + {key: UNIT, value: this.threadGroups[i].unit}, {key: RPS_LIMIT, value: this.threadGroups[i].rpsLimit}, {key: RPS_LIMIT_ENABLE, value: this.threadGroups[i].rpsLimitEnable}, {key: HOLD, value: this.threadGroups[i].duration - this.threadGroups[i].rampUpTime}, diff --git a/frontend/src/business/components/performance/test/model/ThreadGroup.js b/frontend/src/business/components/performance/test/model/ThreadGroup.js index b4656c8af5..2d44f13c5a 100644 --- a/frontend/src/business/components/performance/test/model/ThreadGroup.js +++ b/frontend/src/business/components/performance/test/model/ThreadGroup.js @@ -31,6 +31,7 @@ export function findThreadGroup(jmxContent, handler) { tg.enabled = tg.attributes.enabled; tg.tgType = tg.name; tg.threadType = 'DURATION'; + tg.unit = 'S'; }) return threadGroups; } diff --git a/frontend/src/i18n/en-US.js b/frontend/src/i18n/en-US.js index 91e69c74ce..2e69834217 100644 --- a/frontend/src/i18n/en-US.js +++ b/frontend/src/i18n/en-US.js @@ -481,7 +481,7 @@ export default { delete_file: "The file already exists, please delete the file with the same name first!", thread_num: 'Concurrent users:', input_thread_num: 'Please enter the number of threads', - duration: 'Duration time (seconds)', + duration: 'Duration time', granularity: 'Aggregation time (seconds)', input_duration: 'Please enter a duration', rps_limit: 'RPS Limit:', diff --git a/frontend/src/i18n/zh-CN.js b/frontend/src/i18n/zh-CN.js index db08f19989..232b611f71 100644 --- a/frontend/src/i18n/zh-CN.js +++ b/frontend/src/i18n/zh-CN.js @@ -478,14 +478,14 @@ export default { delete_file: "文件已存在,请先删除同名文件!", thread_num: '并发用户数:', input_thread_num: '请输入线程数', - duration: '压测时长(秒)', + duration: '压测时长', granularity: '聚合时间(秒)', input_duration: '请输入时长', rps_limit: 'RPS上限:', input_rps_limit: '请输入限制', ramp_up_time_within: '在', - ramp_up_time_minutes: '秒内,分', - ramp_up_time_seconds: '秒内增加并发用户', + ramp_up_time_minutes: '{0}内,分', + ramp_up_time_seconds: '{0}内增加并发用户', iterate_num: '迭代次数 (次): ', by_iteration: '按迭代次数', by_duration: '按持续时间', diff --git a/frontend/src/i18n/zh-TW.js b/frontend/src/i18n/zh-TW.js index ccbc5805d6..17cd3fb05e 100644 --- a/frontend/src/i18n/zh-TW.js +++ b/frontend/src/i18n/zh-TW.js @@ -478,7 +478,7 @@ export default { delete_file: "文件已存在,請先刪除同名文件!", thread_num: '並發用戶數:', input_thread_num: '請輸入線程數', - duration: '壓測時長(秒)', + duration: '壓測時長', granularity: '聚合時間(秒)', input_duration: '請輸入時長', rps_limit: 'RPS上限:', From 45c98ebf5d68adab5c0e0a908b100924777e8335 Mon Sep 17 00:00:00 2001 From: Tester_Z <54057702+EasilyTest@users.noreply.github.com> Date: Mon, 15 Mar 2021 17:18:53 +0800 Subject: [PATCH 05/15] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=99=BB?= =?UTF-8?q?=E5=BD=95csrf=20token=E4=B8=8D=E4=B8=BA=E7=A9=BA=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/io/metersphere/commons/utils/ShiroUtils.java | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/src/main/java/io/metersphere/commons/utils/ShiroUtils.java b/backend/src/main/java/io/metersphere/commons/utils/ShiroUtils.java index 61f73dd9ad..79ad0b6f70 100644 --- a/backend/src/main/java/io/metersphere/commons/utils/ShiroUtils.java +++ b/backend/src/main/java/io/metersphere/commons/utils/ShiroUtils.java @@ -48,6 +48,7 @@ public class ShiroUtils { public static void ignoreCsrfFilter(Map filterChainDefinitionMap) { filterChainDefinitionMap.put("/", "apikey, authc"); // 跳转到 / 不用校验 csrf + filterChainDefinitionMap.put("/language", "apikey, authc");// 跳转到 /language 不用校验 csrf filterChainDefinitionMap.put("/document", "apikey, authc"); // 跳转到 /document 不用校验 csrf } From 19d284a399b4754481d37677a1b8f2b3b2e0df68 Mon Sep 17 00:00:00 2001 From: shiziyuan9527 Date: Mon, 15 Mar 2021 17:24:14 +0800 Subject: [PATCH 06/15] =?UTF-8?q?fix(=E6=B5=8B=E8=AF=95=E8=B7=9F=E8=B8=AA)?= =?UTF-8?q?:=20=E9=A6=96=E9=A1=B5=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/mapper/ext/ExtTestCaseMapper.java | 5 ++ .../base/mapper/ext/ExtTestCaseMapper.xml | 49 +++++++++++++++- .../track/controller/TrackController.java | 4 +- .../track/response/TestPlanBugCount.java | 2 +- .../track/response/TrackStatisticsDTO.java | 6 +- .../track/service/TrackService.java | 58 +++++++++---------- .../track/home/components/BugCountCard.vue | 18 ++++-- 7 files changed, 101 insertions(+), 41 deletions(-) diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestCaseMapper.java b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestCaseMapper.java index 5ed9e3a7fa..17ae2078b3 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestCaseMapper.java +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestCaseMapper.java @@ -71,5 +71,10 @@ public interface ExtTestCaseMapper { List countRelevanceMaintainer(@Param("projectId") String projectId); + int getTestPlanBug(@Param("planId") String planId); + int getTestPlanCase(@Param("planId") String planId); + int getTestPlanPassCase(@Param("planId") String planId); + + } diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestCaseMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestCaseMapper.xml index 17d5c37a6e..72d3a06e38 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestCaseMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestCaseMapper.xml @@ -342,8 +342,9 @@ + + + \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/track/controller/TrackController.java b/backend/src/main/java/io/metersphere/track/controller/TrackController.java index 2b0d66bfb0..c010d94bc2 100644 --- a/backend/src/main/java/io/metersphere/track/controller/TrackController.java +++ b/backend/src/main/java/io/metersphere/track/controller/TrackController.java @@ -87,7 +87,7 @@ public class TrackController { } @GetMapping("/bug/count/{projectId}") - public BugStatustics getBugStatustics(@PathVariable String projectId) { - return trackService.getBugStatustics(projectId); + public BugStatustics getBugStatistics(@PathVariable String projectId) { + return trackService.getBugStatistics(projectId); } } diff --git a/backend/src/main/java/io/metersphere/track/response/TestPlanBugCount.java b/backend/src/main/java/io/metersphere/track/response/TestPlanBugCount.java index 4c8a75b272..6802673d16 100644 --- a/backend/src/main/java/io/metersphere/track/response/TestPlanBugCount.java +++ b/backend/src/main/java/io/metersphere/track/response/TestPlanBugCount.java @@ -8,7 +8,7 @@ import lombok.Setter; public class TestPlanBugCount { private int index; private String planName; - private long creatTime; + private long createTime; private String status; private int caseSize; private int bugSize; diff --git a/backend/src/main/java/io/metersphere/track/response/TrackStatisticsDTO.java b/backend/src/main/java/io/metersphere/track/response/TrackStatisticsDTO.java index cb3aeffc88..264e0cf9cb 100644 --- a/backend/src/main/java/io/metersphere/track/response/TrackStatisticsDTO.java +++ b/backend/src/main/java/io/metersphere/track/response/TrackStatisticsDTO.java @@ -144,20 +144,22 @@ public class TrackStatisticsDTO { public void countRelevance(List relevanceResults) { for (TrackCountResult countResult : relevanceResults) { - switch (countResult.getGroupField().toUpperCase()){ + switch (countResult.getGroupField()){ case TrackCount.API: this.apiCaseCount += countResult.getCountNumber(); + this.allRelevanceCaseCount += countResult.getCountNumber(); break; case TrackCount.PERFORMANCE: this.performanceCaseCount += countResult.getCountNumber(); + this.allRelevanceCaseCount += countResult.getCountNumber(); break; case TrackCount.AUTOMATION: this.scenarioCaseCount += countResult.getCountNumber(); + this.allRelevanceCaseCount += countResult.getCountNumber(); break; default: break; } - this.allRelevanceCaseCount += countResult.getCountNumber(); } } diff --git a/backend/src/main/java/io/metersphere/track/service/TrackService.java b/backend/src/main/java/io/metersphere/track/service/TrackService.java index b2a01371bd..3bcdf1cf79 100644 --- a/backend/src/main/java/io/metersphere/track/service/TrackService.java +++ b/backend/src/main/java/io/metersphere/track/service/TrackService.java @@ -12,6 +12,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.math.BigDecimal; +import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -110,59 +111,58 @@ public class TrackService { return charts; } - public BugStatustics getBugStatustics(String projectId) { + public BugStatustics getBugStatistics(String projectId) { TestPlanExample example = new TestPlanExample(); example.createCriteria().andProjectIdEqualTo(projectId); List plans = testPlanMapper.selectByExample(example); List list = new ArrayList<>(); BugStatustics bugStatustics = new BugStatustics(); int index = 1; + int totalBugSize = 0; + int totalCaseSize = 0; for (TestPlan plan : plans) { TestPlanBugCount testPlanBug = new TestPlanBugCount(); testPlanBug.setIndex(index++); testPlanBug.setPlanName(plan.getName()); - testPlanBug.setCreatTime(plan.getCreateTime()); + testPlanBug.setCreateTime(plan.getCreateTime()); testPlanBug.setStatus(plan.getStatus()); - testPlanBug.setCaseSize(getPlanCaseSize(plan.getId())); - testPlanBug.setBugSize(getPlanBugSize(plan.getId())); - testPlanBug.setPassRage(getPlanPassRage(plan.getId())); + + int planCaseSize = getPlanCaseSize(plan.getId()); + testPlanBug.setCaseSize(planCaseSize); + + int planBugSize = getPlanBugSize(plan.getId()); + testPlanBug.setBugSize(planBugSize); + testPlanBug.setPassRage(getPlanPassRage(plan.getId(), planCaseSize)); list.add(testPlanBug); + + totalBugSize += planBugSize; + totalCaseSize += planCaseSize; } - // todo bugStatustics.setList(list); - bugStatustics.setRage("1"); - bugStatustics.setBugTotalSize(2); + float rage =totalCaseSize == 0 ? 0 : (float) totalBugSize * 100 / totalCaseSize; + DecimalFormat df = new DecimalFormat("0.0"); + bugStatustics.setRage(df.format(rage) + "%"); + bugStatustics.setBugTotalSize(totalBugSize); return bugStatustics; } private int getPlanCaseSize(String planId) { - TestPlanTestCaseExample testPlanTestCaseExample = new TestPlanTestCaseExample(); - testPlanTestCaseExample.createCriteria().andPlanIdEqualTo(planId); - List testPlanTestCases = testPlanTestCaseMapper.selectByExample(testPlanTestCaseExample); - - TestPlanApiCaseExample testPlanApiCaseExample = new TestPlanApiCaseExample(); - testPlanApiCaseExample.createCriteria().andTestPlanIdEqualTo(planId); - List testPlanApiCases = testPlanApiCaseMapper.selectByExample(testPlanApiCaseExample); - - TestPlanLoadCaseExample example = new TestPlanLoadCaseExample(); - example.createCriteria().andTestPlanIdEqualTo(planId); - List testPlanLoadCases = testPlanLoadCaseMapper.selectByExample(example); - - TestPlanApiScenarioExample testPlanApiScenarioExample = new TestPlanApiScenarioExample(); - testPlanApiCaseExample.createCriteria().andTestPlanIdEqualTo(planId); - List testPlanApiScenarios = testPlanApiScenarioMapper.selectByExample(testPlanApiScenarioExample); - - - return testPlanTestCases.size() + testPlanApiCases.size() + testPlanLoadCases.size() + testPlanApiScenarios.size(); + return extTestCaseMapper.getTestPlanCase(planId); } private int getPlanBugSize(String planId) { - return 1; + return extTestCaseMapper.getTestPlanBug(planId); } - private String getPlanPassRage(String planId) { - return "10%"; + private String getPlanPassRage(String planId, int totalSize) { + if (totalSize == 0) { + return "-"; + } + int passSize = extTestCaseMapper.getTestPlanPassCase(planId); + float rage = (float) passSize * 100 / totalSize; + DecimalFormat df = new DecimalFormat("0.0"); + return df.format(rage) + "%"; } } diff --git a/frontend/src/business/components/track/home/components/BugCountCard.vue b/frontend/src/business/components/track/home/components/BugCountCard.vue index 6f5efb8dd1..d0e09fcbe4 100644 --- a/frontend/src/business/components/track/home/components/BugCountCard.vue +++ b/frontend/src/business/components/track/home/components/BugCountCard.vue @@ -15,18 +15,19 @@ {{ $t('api_test.home_page.unit_of_measurement') }}
- 占比: - {{ rage }} - + 占比 + + {{rage}} +
+ width="60" show-overflow-tooltip/> - + @@ -35,6 +36,7 @@ prop="status" column-key="status" :label="$t('test_track.plan.plan_status')" + width="100" show-overflow-tooltip> @@ -224,6 +236,9 @@ import MsComponentConfig from "./component/ComponentConfig"; import {handleCtrlSEvent} from "../../../../../common/js/utils"; import EnvPopover from "@/business/components/api/automation/scenario/EnvPopover"; + import MaximizeScenario from "./maximize/MaximizeScenario"; + import ScenarioHeader from "./maximize/ScenarioHeader"; + import MsDrawer from "../../../common/components/MsDrawer"; let jsonPath = require('jsonpath'); export default { @@ -243,7 +258,10 @@ MsApiCustomize, ApiImport, MsComponentConfig, - EnvPopover + EnvPopover, + MaximizeScenario, + ScenarioHeader, + MsDrawer }, data() { return { @@ -293,6 +311,7 @@ projectEnvMap: new Map, projectList: [], debugResult: new Map, + drawer: false, } }, created() { @@ -423,6 +442,9 @@ } }, methods: { + showAllBtn() { + this.$refs.maximizeScenario.showAll(); + }, addListener() { document.addEventListener("keydown", this.createCtrlSHandle); // document.addEventListener("keydown", (even => handleCtrlSEvent(even, this.$refs.httpApi.saveApi))); @@ -443,6 +465,7 @@ // 直接更新场景防止编辑内容丢失 this.editScenario(); } + this.$refs.maximizeHeader.getVariableSize(); this.reload(); }, showButton(...names) { @@ -697,8 +720,7 @@ } this.sort(); this.reload(); - } - , + }, reload() { this.loading = true this.$nextTick(() => { @@ -1046,7 +1068,14 @@ // 把执行结果分发给各个请求 this.debugResult = result; this.sort() + }, + fullScreen() { + this.drawer = true; + }, + close() { + this.drawer = false; } + } } @@ -1112,7 +1141,7 @@ } /deep/ .el-card__body { - padding: 15px; + padding: 10px; } /deep/ .el-drawer__body { @@ -1182,4 +1211,17 @@ .ms-sc-variable-header >>> .el-dialog__body { padding: 0px 20px; } + + .alt-ico { + font-size: 15px; + margin: 0px 10px 0px; + color: #8c939d; + } + + .alt-ico:hover { + color: black; + cursor: pointer; + font-size: 18px; + } + diff --git a/frontend/src/business/components/api/automation/scenario/Setting.js b/frontend/src/business/components/api/automation/scenario/Setting.js index 9ddffe168a..28d54980b6 100644 --- a/frontend/src/business/components/api/automation/scenario/Setting.js +++ b/frontend/src/business/components/api/automation/scenario/Setting.js @@ -16,6 +16,9 @@ export const ELEMENTS = new Map([ ['Extract', []], ['JmeterElement', []], ['CustomizeReq', ["ConstantTimer", "JSR223PreProcessor", "JSR223PostProcessor", "Assertions", "Extract"]], + ['MaxSamplerProxy', ["JSR223PreProcessor", "JSR223PostProcessor", "Assertions", "Extract"]], + ['AllSamplerProxy', ["HTTPSamplerProxy", "DubboSampler", "JDBCSampler", "TCPSampler"]], + ]) export const ELEMENT_TYPE = { diff --git a/frontend/src/business/components/api/automation/scenario/common/ApiBaseComponent.vue b/frontend/src/business/components/api/automation/scenario/common/ApiBaseComponent.vue index 1090ac3b5b..dbd1d4102b 100644 --- a/frontend/src/business/components/api/automation/scenario/common/ApiBaseComponent.vue +++ b/frontend/src/business/components/api/automation/scenario/common/ApiBaseComponent.vue @@ -1,47 +1,46 @@ + + diff --git a/frontend/src/business/components/api/automation/scenario/maximize/MaximizeScenario.vue b/frontend/src/business/components/api/automation/scenario/maximize/MaximizeScenario.vue new file mode 100644 index 0000000000..ea3127afe3 --- /dev/null +++ b/frontend/src/business/components/api/automation/scenario/maximize/MaximizeScenario.vue @@ -0,0 +1,1050 @@ + + + + + diff --git a/frontend/src/business/components/api/automation/scenario/maximize/ScenarioHeader.vue b/frontend/src/business/components/api/automation/scenario/maximize/ScenarioHeader.vue new file mode 100644 index 0000000000..d957231385 --- /dev/null +++ b/frontend/src/business/components/api/automation/scenario/maximize/ScenarioHeader.vue @@ -0,0 +1,146 @@ + + + + + diff --git a/frontend/src/business/components/api/definition/components/assertion/ApiAssertions.vue b/frontend/src/business/components/api/definition/components/assertion/ApiAssertions.vue index 17a7d5d5a2..190d4bdc9e 100644 --- a/frontend/src/business/components/api/definition/components/assertion/ApiAssertions.vue +++ b/frontend/src/business/components/api/definition/components/assertion/ApiAssertions.vue @@ -6,6 +6,8 @@ @active="active" :data="assertions" :draggable="draggable" + :is-max="isMax" + :show-btn="showBtn" color="#A30014" background-color="#F7E6E9" :title="$t('api_test.definition.request.assertions_rule')"> @@ -87,6 +89,14 @@ type: Boolean, default: false, }, + isMax: { + type: Boolean, + default: false, + }, + showBtn: { + type: Boolean, + default: true, + }, assertions: {}, node: {}, request: {}, diff --git a/frontend/src/business/components/api/definition/components/extract/ApiExtract.vue b/frontend/src/business/components/api/definition/components/extract/ApiExtract.vue index edd56731f9..3b8fab00a6 100644 --- a/frontend/src/business/components/api/definition/components/extract/ApiExtract.vue +++ b/frontend/src/business/components/api/definition/components/extract/ApiExtract.vue @@ -5,6 +5,8 @@ @active="active" :data="extract" :draggable="draggable" + :is-max="isMax" + :show-btn="showBtn" color="#015478" background-color="#E6EEF2" :title="$t('api_test.definition.request.extract_param')"> @@ -41,26 +43,26 @@ diff --git a/frontend/src/business/components/track/common/minder/TestReviewMinder.vue b/frontend/src/business/components/track/common/minder/TestReviewMinder.vue new file mode 100644 index 0000000000..d85d5c1309 --- /dev/null +++ b/frontend/src/business/components/track/common/minder/TestReviewMinder.vue @@ -0,0 +1,128 @@ + + + + + diff --git a/frontend/src/business/components/track/common/minder/minderUtils.js b/frontend/src/business/components/track/common/minder/minderUtils.js new file mode 100644 index 0000000000..e5f171d903 --- /dev/null +++ b/frontend/src/business/components/track/common/minder/minderUtils.js @@ -0,0 +1,59 @@ +export function getTestCaseDataMap(testCase) { + let dataMap = new Map(); + testCase.forEach(item => { + item.steps = JSON.parse(item.steps); + // if (item.tags && item.tags.length > 0) { + // item.tags = JSON.parse(item.tags); + // } + let mapItem = dataMap.get(item.nodeId); + let nodeItem = { + data: { + id: item.id, + text: item.name, + priority: Number.parseInt(item.priority.substring(item.priority.length - 1 )), + resource: ["用例"], + type: item.type, + method: item.method, + maintainer: item.maintainer + } + } + parseChildren(nodeItem, item); + if (mapItem) { + mapItem.push(nodeItem); + } else { + mapItem = []; + mapItem.push(nodeItem); + dataMap.set(item.nodeId, mapItem); + } + }) + return dataMap; +} + +function parseChildren(nodeItem, item) { + nodeItem.children = []; + let children = []; + _parseChildren(children, item.prerequisite, "前置条件"); + item.steps.forEach((step) => { + let descNode = _parseChildren(children, step.desc, "测试步骤"); + if (descNode) { + descNode.data.num = step.num; + descNode.children = []; + _parseChildren(descNode.children, step.result, "预期结果"); + } + }); + _parseChildren(children, item.remark, "备注"); + nodeItem.children = children; +} + +function _parseChildren(children, k, v) { + if (k) { + let node = { + data: { + text: k, + resource: [v] + } + } + children.push(node); + return node; + } +} diff --git a/frontend/src/business/components/track/review/components/TestCaseReviewList.vue b/frontend/src/business/components/track/review/components/TestCaseReviewList.vue index 4824621c36..8341430029 100644 --- a/frontend/src/business/components/track/review/components/TestCaseReviewList.vue +++ b/frontend/src/business/components/track/review/components/TestCaseReviewList.vue @@ -1,12 +1,9 @@ diff --git a/frontend/src/business/components/track/review/view/components/TestReviewTestCaseList.vue b/frontend/src/business/components/track/review/view/components/TestReviewTestCaseList.vue index 213b447120..33432539b0 100644 --- a/frontend/src/business/components/track/review/view/components/TestReviewTestCaseList.vue +++ b/frontend/src/business/components/track/review/view/components/TestReviewTestCaseList.vue @@ -1,7 +1,5 @@