Merge remote-tracking branch 'origin/master'

This commit is contained in:
Captain.B 2020-08-10 18:07:55 +08:00
commit ece541e80e
10 changed files with 179 additions and 24 deletions

View File

@ -158,6 +158,12 @@
</exclusions> </exclusions>
</dependency> </dependency>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_functions</artifactId>
<version>${jmeter.version}</version>
</dependency>
<!-- Zookeeper --> <!-- Zookeeper -->
<dependency> <dependency>
<groupId>org.apache.dubbo</groupId> <groupId>org.apache.dubbo</groupId>

View File

@ -275,29 +275,23 @@ export class DubboSample extends DefaultTestElement {
} }
export class HTTPSamplerProxy extends DefaultTestElement { export class HTTPSamplerProxy extends DefaultTestElement {
constructor(testName, request) { constructor(testName, options = {}) {
super('HTTPSamplerProxy', 'HttpTestSampleGui', 'HTTPSamplerProxy', testName); super('HTTPSamplerProxy', 'HttpTestSampleGui', 'HTTPSamplerProxy', testName);
this.request = request || {};
if (request.useEnvironment) { this.stringProp("HTTPSampler.domain", options.domain);
this.stringProp("HTTPSampler.domain", request.domain); this.stringProp("HTTPSampler.protocol", options.protocol);
this.stringProp("HTTPSampler.protocol", request.protocol); this.stringProp("HTTPSampler.path", options.path);
this.stringProp("HTTPSampler.path", this.request.path);
} else { this.stringProp("HTTPSampler.method", options.method);
this.stringProp("HTTPSampler.domain", this.request.hostname); this.stringProp("HTTPSampler.contentEncoding", options.encoding, "UTF-8");
this.stringProp("HTTPSampler.protocol", this.request.protocol.split(":")[0]); if (!options.port) {
this.stringProp("HTTPSampler.path", this.request.pathname);
}
this.stringProp("HTTPSampler.method", this.request.method);
this.stringProp("HTTPSampler.contentEncoding", this.request.encoding, "UTF-8");
if (!this.request.port) {
this.stringProp("HTTPSampler.port", ""); this.stringProp("HTTPSampler.port", "");
} else { } else {
this.stringProp("HTTPSampler.port", this.request.port); this.stringProp("HTTPSampler.port", options.port);
} }
this.boolProp("HTTPSampler.follow_redirects", this.request.follow, true); this.boolProp("HTTPSampler.follow_redirects", options.follow, true);
this.boolProp("HTTPSampler.use_keepalive", this.request.keepalive, true); this.boolProp("HTTPSampler.use_keepalive", options.keepalive, true);
} }
} }

View File

@ -695,14 +695,14 @@ class JMXHttpRequest {
request.url = 'http://' + request.url; request.url = 'http://' + request.url;
} }
let url = new URL(request.url); let url = new URL(request.url);
this.hostname = decodeURIComponent(url.hostname); this.domain = decodeURIComponent(url.hostname);
this.port = url.port; this.port = url.port;
this.protocol = url.protocol.split(":")[0]; this.protocol = url.protocol.split(":")[0];
this.pathname = this.getPostQueryParameters(request, decodeURIComponent(url.pathname)); this.path = this.getPostQueryParameters(request, decodeURIComponent(url.pathname));
} else { } else {
this.domain = environment.domain;
this.port = environment.port; this.port = environment.port;
this.protocol = environment.protocol; this.protocol = environment.protocol;
this.domain = environment.domain;
let url = new URL(environment.protocol + "://" + environment.socket); let url = new URL(environment.protocol + "://" + environment.socket);
this.path = this.getPostQueryParameters(request, decodeURIComponent(url.pathname + (request.path ? request.path : ''))); this.path = this.getPostQueryParameters(request, decodeURIComponent(url.pathname + (request.path ? request.path : '')));
} }
@ -721,7 +721,7 @@ class JMXHttpRequest {
for (let i = 0; i < parameters.length; i++) { for (let i = 0; i < parameters.length; i++) {
let parameter = parameters[i]; let parameter = parameters[i];
path += (parameter.name + '=' + parameter.value); path += (parameter.name + '=' + parameter.value);
if (i != parameters.length - 1) { if (i !== parameters.length - 1) {
path += '&'; path += '&';
} }
} }

View File

@ -33,6 +33,7 @@ import TestTrack from "../../track/TestTrack";
import ApiReportList from "../../api/report/ApiReportList"; import ApiReportList from "../../api/report/ApiReportList";
import axios from "axios"; import axios from "axios";
import ApiKeys from "../../settings/personal/ApiKeys"; import ApiKeys from "../../settings/personal/ApiKeys";
import ServiceIntegration from "../../settings/organization/ServiceIntegration";
const requireContext = require.context('@/business/components/xpack/', true, /router\.js$/) const requireContext = require.context('@/business/components/xpack/', true, /router\.js$/)
@ -70,6 +71,10 @@ const router = new VueRouter({
path: 'organizationworkspace', path: 'organizationworkspace',
component: OrganizationWorkspace, component: OrganizationWorkspace,
}, },
{
path: 'serviceintegration',
component: ServiceIntegration,
},
{ {
path: 'personsetting', path: 'personsetting',
component: PersonSetting component: PersonSetting

View File

@ -21,6 +21,8 @@
</el-menu-item> </el-menu-item>
<el-menu-item index="/setting/organizationworkspace" v-permission="['org_admin']">{{$t('commons.workspace')}} <el-menu-item index="/setting/organizationworkspace" v-permission="['org_admin']">{{$t('commons.workspace')}}
</el-menu-item> </el-menu-item>
<el-menu-item index="/setting/serviceintegration" v-permission="['org_admin']">{{$t('organization.service_integration')}}
</el-menu-item>
</el-submenu> </el-submenu>
<el-submenu index="3" v-permission="['test_manager']" v-if="isCurrentWorkspaceUser"> <el-submenu index="3" v-permission="['test_manager']" v-if="isCurrentWorkspaceUser">

View File

@ -0,0 +1,85 @@
<template>
<el-card class="header-title">
<div>
<div>{{$t('organization.select_defect_platform')}}</div>
<el-radio-group v-model="platform" style="margin-top: 10px">
<el-radio v-for="(item, index) in platforms" :key="index" :label="item.value" size="small">
{{item.name}}
</el-radio>
</el-radio-group>
</div>
<div style="width: 500px">
<div style="margin-top: 20px;margin-bottom: 10px">{{$t('organization.basic_auth_info')}}</div>
<el-form :model="form" ref="form" label-width="100px" size="small">
<el-form-item :label="$t('organization.api_account')" prop="account">
<el-input v-model="form.account" :placeholder="$t('organization.input_api_account')"/>
</el-form-item>
<el-form-item :label="$t('organization.api_password')" prop="password">
<el-input v-model="form.password" auto-complete="new-password" :placeholder="$t('organization.input_api_password')" show-password/>
</el-form-item>
<el-form-item>
<el-button type="primary" size="small" @click="submit('form')" style="width: 400px">
{{$t('commons.save')}}
</el-button>
</el-form-item>
</el-form>
</div>
<div class="defect-tip">
<div>{{$t('organization.use_tip')}}</div>
<div>
1. {{$t('organization.use_tip_one')}}
</div>
<div>
2. {{$t('organization.use_tip_two')}}
<router-link to="/track/project/all" style="margin-left: 5px">{{$t('organization.link_the_project_now')}}</router-link>
</div>
</div>
</el-card>
</template>
<script>
export default {
name: "DefectManagement",
data() {
return {
form: {},
platform: '',
platforms: [
{
name: 'TAPD',
value: 'tapd',
},
{
name: 'JIRA',
value: 'jira',
}
],
rules: {
account: {required: true, message: this.$t('organization.input_api_account'), trigger: ['change', 'blur']},
password: {required: true, message: this.$t('organization.input_api_password'), trigger: ['change', 'blur']}
},
}
},
methods: {
submit(form) {
}
}
}
</script>
<style scoped>
.header-title {
padding: 10px 30px;
}
.defect-tip {
background: #EDEDED;
border: solid #E1E1E1 1px;
margin: 10px 0;
padding: 10px;
border-radius: 3px;
}
</style>

View File

@ -0,0 +1,30 @@
<template>
<div>
<el-tabs class="system-setting" v-model="activeName">
<el-tab-pane :label="$t('organization.defect_manage')" name="defect">
<defect-management/>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
import DefectManagement from "./DefectManagement";
export default {
name: "ServiceIntegration",
components: {
DefectManagement
},
data() {
return {
activeName: 'defect'
}
}
}
</script>
<style scoped>
</style>

View File

@ -173,8 +173,18 @@ export default {
special_characters_are_not_supported: 'Incorrect format (special characters are not supported and cannot end with \'-\')', special_characters_are_not_supported: 'Incorrect format (special characters are not supported and cannot end with \'-\')',
none: 'None Organization', none: 'None Organization',
select: 'Select Organization', select: 'Select Organization',
service_integration: 'Service integration',
defect_manage: 'Defect management platform',
select_defect_platform: 'Please select the defect management platform to be integrated:',
basic_auth_info: 'Basic Auth account information:',
api_account: 'API account',
api_password: 'API password',
input_api_account: 'please enter account',
input_api_password: 'Please enter password',
use_tip: 'Usage guidelines:',
use_tip_one: 'Basic Auth account information is queried in "Company Management-Security and Integration-Open Platform"',
use_tip_two: 'After saving the Basic Auth account information, you need to manually associate the ID/key in the Metersphere project',
link_the_project_now: 'Link the project now',
}, },
project: { project: {
name: 'Project name', name: 'Project name',

View File

@ -174,6 +174,18 @@ export default {
none: '无组织', none: '无组织',
select: '选择组织', select: '选择组织',
delete_warning: '删除该组织将同步删除该组织下所有相关工作空间和相关工作空间下的所有项目,以及项目中的所有用例、接口测试、性能测试等,确定要删除吗?', delete_warning: '删除该组织将同步删除该组织下所有相关工作空间和相关工作空间下的所有项目,以及项目中的所有用例、接口测试、性能测试等,确定要删除吗?',
service_integration: '服务集成',
defect_manage: '缺陷管理平台',
select_defect_platform: '请选择要集成的缺陷管理平台:',
basic_auth_info: 'Basic Auth 账号信息:',
api_account: 'API 账号',
api_password: 'API 口令',
input_api_account: '请输入账号',
input_api_password: '请输入口令',
use_tip: '使用指引:',
use_tip_one: 'Basic Auth 账号信息在"公司管理-安全与集成-开放平台"中查询',
use_tip_two: '保存 Basic Auth 账号信息后,需要在 Metersphere 项目中手动关联 ID/key',
link_the_project_now: '马上关联项目',
}, },
project: { project: {
recent: '最近的项目', recent: '最近的项目',

View File

@ -172,7 +172,18 @@ export default {
none: '無組織', none: '無組織',
select: '選擇組織', select: '選擇組織',
delete_warning: '删除该组织将同步删除该组织下所有相关工作空间和相关工作空间下的所有项目,以及项目中的所有用例、接口测试、性能测试等,确定要删除吗?', delete_warning: '删除该组织将同步删除该组织下所有相关工作空间和相关工作空间下的所有项目,以及项目中的所有用例、接口测试、性能测试等,确定要删除吗?',
service_integration: '服務集成',
defect_manage: '缺陷管理平台',
select_defect_platform: '請選擇要集成的缺陷管理平台:',
basic_auth_info: 'Basic Auth 賬號信息:',
api_account: 'API 賬號',
api_password: 'API 口令',
input_api_account: '請輸入賬號',
input_api_password: '請輸入口令',
use_tip: '使用指引:',
use_tip_one: 'Basic Auth 賬號信息在"公司管理-安全與集成-開放平台"中查詢',
use_tip_two: '保存 Basic Auth 賬號信息後,需要在 Metersphere 項目中手動關聯 ID/key',
link_the_project_now: '馬上關聯項目',
}, },
project: { project: {
recent: '最近的項目', recent: '最近的項目',