Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
MeterSphere
metersphere
提交
0e23dbd5
M
metersphere
项目概览
MeterSphere
/
metersphere
上一次同步 3 年多
通知
25
Star
1
Fork
1
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
M
metersphere
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
0e23dbd5
编写于
10月 13, 2020
作者:
C
Captain.B
浏览文件
操作
浏览文件
下载
差异文件
Merge remote-tracking branch 'origin/master' into master
上级
a262c03e
f6af7c9d
变更
11
隐藏空白更改
内联
并排
Showing
11 changed file
with
99 addition
and
63 deletion
+99
-63
backend/pom.xml
backend/pom.xml
+9
-0
backend/src/main/java/io/metersphere/api/jmeter/JMeterService.java
...rc/main/java/io/metersphere/api/jmeter/JMeterService.java
+2
-6
backend/src/main/java/io/metersphere/listener/AppStartListener.java
...c/main/java/io/metersphere/listener/AppStartListener.java
+26
-0
frontend/src/business/components/api/test/ApiTestConfig.vue
frontend/src/business/components/api/test/ApiTestConfig.vue
+1
-1
frontend/src/business/components/performance/test/EditPerformanceTestPlan.vue
...s/components/performance/test/EditPerformanceTestPlan.vue
+1
-1
frontend/src/business/components/settings/system/Organization.vue
.../src/business/components/settings/system/Organization.vue
+3
-3
frontend/src/business/components/settings/system/SystemWorkspace.vue
...c/business/components/settings/system/SystemWorkspace.vue
+5
-5
frontend/src/business/components/settings/system/User.vue
frontend/src/business/components/settings/system/User.vue
+10
-10
frontend/src/business/components/track/common/SelectMenu.vue
frontend/src/business/components/track/common/SelectMenu.vue
+39
-36
frontend/src/business/components/track/plan/view/comonents/TestPlanTestCaseEdit.vue
...onents/track/plan/view/comonents/TestPlanTestCaseEdit.vue
+2
-0
frontend/src/common/js/ajax.js
frontend/src/common/js/ajax.js
+1
-1
未找到文件。
backend/pom.xml
浏览文件 @
0e23dbd5
...
...
@@ -497,6 +497,15 @@
<outputDirectory>
src/main/resources/jmeter/lib/ext
</outputDirectory>
<destFileName>
ApacheJMeter_functions.jar
</destFileName>
</artifactItem>
<artifactItem>
<groupId>
org.python
</groupId>
<artifactId>
jython-standalone
</artifactId>
<version>
2.7.0
</version>
<type>
jar
</type>
<overWrite>
true
</overWrite>
<outputDirectory>
src/main/resources/jmeter/lib/ext
</outputDirectory>
<destFileName>
jython-standalone.jar
</destFileName>
</artifactItem>
</artifactItems>
<outputDirectory>
${project.build.directory}/wars
</outputDirectory>
<overWriteReleases>
false
</overWriteReleases>
...
...
backend/src/main/java/io/metersphere/api/jmeter/JMeterService.java
浏览文件 @
0e23dbd5
...
...
@@ -11,7 +11,7 @@ import org.apache.jmeter.save.SaveService;
import
org.apache.jmeter.util.JMeterUtils
;
import
org.apache.jmeter.visualizers.backend.BackendListener
;
import
org.apache.jorphan.collections.HashTree
;
import
org.python.core.Options
;
import
org.springframework.context.i18n.LocaleContextHolder
;
import
org.springframework.stereotype.Service
;
...
...
@@ -34,10 +34,6 @@ public class JMeterService {
JMeterUtils
.
setJMeterHome
(
JMETER_HOME
);
JMeterUtils
.
setLocale
(
LocaleContextHolder
.
getLocale
());
//解决无法加载 PyScriptEngineFactory
Options
.
importSite
=
false
;
try
{
Object
scriptWrapper
=
SaveService
.
loadElement
(
is
);
HashTree
testPlan
=
getHashTree
(
scriptWrapper
);
...
...
@@ -51,7 +47,7 @@ public class JMeterService {
}
}
p
rivate
String
getJmeterHome
()
{
p
ublic
String
getJmeterHome
()
{
String
home
=
getClass
().
getResource
(
"/"
).
getPath
()
+
"jmeter"
;
try
{
File
file
=
new
File
(
home
);
...
...
backend/src/main/java/io/metersphere/listener/AppStartListener.java
浏览文件 @
0e23dbd5
package
io.metersphere.listener
;
import
io.metersphere.api.jmeter.JMeterService
;
import
io.metersphere.commons.utils.LogUtil
;
import
io.metersphere.service.ScheduleService
;
import
org.python.core.Options
;
import
org.python.util.PythonInterpreter
;
import
org.springframework.boot.context.event.ApplicationReadyEvent
;
import
org.springframework.context.ApplicationListener
;
import
org.springframework.stereotype.Component
;
...
...
@@ -12,12 +16,16 @@ public class AppStartListener implements ApplicationListener<ApplicationReadyEve
@Resource
private
ScheduleService
scheduleService
;
@Resource
private
JMeterService
jMeterService
;
@Override
public
void
onApplicationEvent
(
ApplicationReadyEvent
applicationReadyEvent
)
{
System
.
out
.
println
(
"================= 应用启动 ================="
);
initPythonEnv
();
try
{
Thread
.
sleep
(
3
*
60
*
1000
);
}
catch
(
InterruptedException
e
)
{
...
...
@@ -25,6 +33,24 @@ public class AppStartListener implements ApplicationListener<ApplicationReadyEve
}
scheduleService
.
startEnableSchedules
();
}
/**
* 解决接口测试-无法导入内置python包
*/
private
void
initPythonEnv
()
{
//解决无法加载 PyScriptEngineFactory
Options
.
importSite
=
false
;
try
{
PythonInterpreter
interp
=
new
PythonInterpreter
();
String
path
=
jMeterService
.
getJmeterHome
();
System
.
out
.
println
(
"sys.path: "
+
path
);
path
+=
"/lib/ext/jython-standalone.jar/Lib"
;
interp
.
exec
(
"import sys"
);
interp
.
exec
(
"sys.path.append(\""
+
path
+
"\")"
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
LogUtil
.
error
(
e
.
getMessage
(),
e
);
}
}
}
frontend/src/business/components/api/test/ApiTestConfig.vue
浏览文件 @
0e23dbd5
...
...
@@ -8,7 +8,7 @@
<el-input
:disabled=
"isReadOnly"
class=
"test-name"
v-model=
"test.name"
maxlength=
"60"
:placeholder=
"$t('api_test.input_name')"
show-word-limit
>
<el-select
:disabled=
"isReadOnly"
class=
"test-project"
v-model=
"test.projectId"
slot=
"prepend"
<el-select
filterable
class=
"test-project"
v-model=
"test.projectId"
slot=
"prepend"
:placeholder=
"$t('api_test.select_project')"
>
<el-option
v-for=
"project in projects"
:key=
"project.id"
:label=
"project.name"
:value=
"project.id"
/>
</el-select>
...
...
frontend/src/business/components/performance/test/EditPerformanceTestPlan.vue
浏览文件 @
0e23dbd5
...
...
@@ -9,7 +9,7 @@
maxlength=
"30"
show-word-limit
>
<template
v-slot:prepend
>
<el-select
:disabled=
"isReadOnly"
v-model=
"testPlan.projectId"
<el-select
filterable
v-model=
"testPlan.projectId"
:placeholder=
"$t('load_test.select_project')"
>
<el-option
v-for=
"item in projects"
...
...
frontend/src/business/components/settings/system/Organization.vue
浏览文件 @
0e23dbd5
...
...
@@ -101,7 +101,7 @@
<el-form
:model=
"memberForm"
ref=
"form"
:rules=
"orgMemberRule"
label-position=
"right"
label-width=
"100px"
size=
"small"
>
<el-form-item
:label=
"$t('commons.member')"
prop=
"userIds"
>
<el-select
v-model=
"memberForm.userIds"
multiple
:placeholder=
"$t('member.please_choose_member')"
<el-select
filterable
v-model=
"memberForm.userIds"
multiple
:placeholder=
"$t('member.please_choose_member')"
class=
"select-width"
>
<el-option
v-for=
"item in memberForm.userList"
...
...
@@ -114,7 +114,7 @@
</el-select>
</el-form-item>
<el-form-item
:label=
"$t('commons.role')"
prop=
"roleIds"
>
<el-select
v-model=
"memberForm.roleIds"
multiple
:placeholder=
"$t('role.please_choose_role')"
<el-select
filterable
v-model=
"memberForm.roleIds"
multiple
:placeholder=
"$t('role.please_choose_role')"
class=
"select-width"
>
<el-option
v-for=
"item in memberForm.roles"
...
...
@@ -151,7 +151,7 @@
</el-form-item>
<el-form-item
:label=
"$t('commons.role')"
prop=
"roleIds"
:rules=
"{required: true, message: $t('role.please_choose_role'), trigger: 'change'}"
>
<el-select
v-model=
"memberForm.roleIds"
multiple
:placeholder=
"$t('role.please_choose_role')"
<el-select
filterable
v-model=
"memberForm.roleIds"
multiple
:placeholder=
"$t('role.please_choose_role')"
class=
"select-width"
>
<el-option
v-for=
"item in memberForm.allroles"
...
...
frontend/src/business/components/settings/system/SystemWorkspace.vue
浏览文件 @
0e23dbd5
...
...
@@ -37,7 +37,7 @@
<el-input
type=
"textarea"
v-model=
"form.description"
></el-input>
</el-form-item>
<el-form-item
:label=
"$t('workspace.organization_name')"
prop=
"organizationId"
>
<el-select
v-model=
"form.organizationId"
:placeholder=
"$t('organization.select_organization')"
<el-select
filterable
v-model=
"form.organizationId"
:placeholder=
"$t('organization.select_organization')"
class=
"select-width"
>
<el-option
v-for=
"item in form.orgList"
...
...
@@ -65,7 +65,7 @@
<el-input
type=
"textarea"
v-model=
"form.description"
></el-input>
</el-form-item>
<el-form-item
:label=
"$t('workspace.organization_name')"
prop=
"organizationId"
>
<el-select
v-model=
"form.organizationId"
:placeholder=
"$t('organization.select_organization')"
<el-select
filterable
v-model=
"form.organizationId"
:placeholder=
"$t('organization.select_organization')"
class=
"select-width"
>
<el-option
v-for=
"item in form.orgList1"
...
...
@@ -117,7 +117,7 @@
<el-form
:model=
"memberForm"
ref=
"form"
:rules=
"wsMemberRule"
label-position=
"right"
label-width=
"100px"
size=
"small"
>
<el-form-item
:label=
"$t('commons.member')"
prop=
"userIds"
>
<el-select
v-model=
"memberForm.userIds"
multiple
:placeholder=
"$t('member.please_choose_member')"
<el-select
filterable
v-model=
"memberForm.userIds"
multiple
:placeholder=
"$t('member.please_choose_member')"
class=
"select-width"
>
<el-option
v-for=
"item in memberForm.userList"
...
...
@@ -130,7 +130,7 @@
</el-select>
</el-form-item>
<el-form-item
:label=
"$t('commons.role')"
prop=
"roleIds"
>
<el-select
v-model=
"memberForm.roleIds"
multiple
:placeholder=
"$t('role.please_choose_role')"
<el-select
filterable
v-model=
"memberForm.roleIds"
multiple
:placeholder=
"$t('role.please_choose_role')"
class=
"select-width"
>
<el-option
v-for=
"item in memberForm.roles"
...
...
@@ -166,7 +166,7 @@
<el-input
v-model=
"memberForm.phone"
autocomplete=
"off"
:disabled=
"true"
/>
</el-form-item>
<el-form-item
:label=
"$t('commons.role')"
prop=
"roleIds"
:rules=
"{required: true, message: $t('role.please_choose_role'), trigger: 'change'}"
>
<el-select
v-model=
"memberForm.roleIds"
multiple
:placeholder=
"$t('role.please_choose_role')"
<el-select
filterable
v-model=
"memberForm.roleIds"
multiple
:placeholder=
"$t('role.please_choose_role')"
class=
"select-width"
>
<el-option
v-for=
"item in memberForm.allroles"
...
...
frontend/src/business/components/settings/system/User.vue
浏览文件 @
0e23dbd5
...
...
@@ -74,7 +74,7 @@
:prop=
"'roles.' + index + '.id'"
:rules=
"{required: true, message: $t('role.please_choose_role'), trigger: 'change'}"
>
<el-select
v-model=
"role.id"
:placeholder=
"$t('role.please_choose_role')"
>
<el-select
filterable
v-model=
"role.id"
:placeholder=
"$t('role.please_choose_role')"
>
<el-option
v-for=
"item in activeRole(role)"
:key=
"item.id"
...
...
@@ -93,7 +93,7 @@
:prop=
"'roles.' + index + '.ids'"
:rules=
"{required: true, message: $t('organization.select_organization'), trigger: 'change'}"
>
<el-select
v-model=
"role.ids"
:placeholder=
"$t('organization.select_organization')"
multiple
>
<el-select
filterable
v-model=
"role.ids"
:placeholder=
"$t('organization.select_organization')"
multiple
>
<el-option
v-for=
"item in form.orgList"
:key=
"item.id"
...
...
@@ -108,7 +108,7 @@
:prop=
"'roles.' + index + '.ids'"
:rules=
"{required: true, message: $t('workspace.select'), trigger: 'change'}"
>
<el-select
v-model=
"role.ids"
:placeholder=
"$t('workspace.select')"
multiple
>
<el-select
filterable
v-model=
"role.ids"
:placeholder=
"$t('workspace.select')"
multiple
>
<el-option
v-for=
"item in form.wsList"
:key=
"item.id"
...
...
@@ -123,7 +123,7 @@
:prop=
"'roles.' + index + '.ids'"
:rules=
"{required: true, message: $t('workspace.select'), trigger: 'change'}"
>
<el-select
v-model=
"role.ids"
:placeholder=
"$t('workspace.select')"
multiple
>
<el-select
filterable
v-model=
"role.ids"
:placeholder=
"$t('workspace.select')"
multiple
>
<el-option
v-for=
"item in form.wsList"
:key=
"item.id"
...
...
@@ -138,7 +138,7 @@
:prop=
"'roles.' + index + '.ids'"
:rules=
"{required: true, message: $t('workspace.select'), trigger: 'change'}"
>
<el-select
v-model=
"role.ids"
:placeholder=
"$t('workspace.select')"
multiple
>
<el-select
filterable
v-model=
"role.ids"
:placeholder=
"$t('workspace.select')"
multiple
>
<el-option
v-for=
"item in form.wsList"
:key=
"item.id"
...
...
@@ -187,7 +187,7 @@
:prop=
"'roles.' + index + '.id'"
:rules=
"{required: true, message: $t('role.please_choose_role'), trigger: 'change'}"
>
<el-select
v-model=
"role.id"
:placeholder=
"$t('role.please_choose_role')"
:disabled=
"!!role.id"
>
<el-select
filterable
v-model=
"role.id"
:placeholder=
"$t('role.please_choose_role')"
:disabled=
"!!role.id"
>
<el-option
v-for=
"item in activeRole(role)"
:key=
"item.id"
...
...
@@ -204,7 +204,7 @@
:prop=
"'roles.' + index + '.ids'"
:rules=
"{required: true, message: $t('organization.select_organization'), trigger: 'change'}"
>
<el-select
v-model=
"role.ids"
:placeholder=
"$t('organization.select_organization')"
multiple
>
<el-select
filterable
v-model=
"role.ids"
:placeholder=
"$t('organization.select_organization')"
multiple
>
<el-option
v-for=
"item in form.orgList"
:key=
"item.id"
...
...
@@ -219,7 +219,7 @@
:prop=
"'roles.' + index + '.ids'"
:rules=
"{required: true, message: $t('workspace.select'), trigger: 'change'}"
>
<el-select
v-model=
"role.ids"
:placeholder=
"$t('workspace.select')"
multiple
>
<el-select
filterable
v-model=
"role.ids"
:placeholder=
"$t('workspace.select')"
multiple
>
<el-option
v-for=
"item in form.wsList"
:key=
"item.id"
...
...
@@ -234,7 +234,7 @@
:prop=
"'roles.' + index + '.ids'"
:rules=
"{required: true, message: $t('workspace.select'), trigger: 'change'}"
>
<el-select
v-model=
"role.ids"
:placeholder=
"$t('workspace.select')"
multiple
>
<el-select
filterable
v-model=
"role.ids"
:placeholder=
"$t('workspace.select')"
multiple
>
<el-option
v-for=
"item in form.wsList"
:key=
"item.id"
...
...
@@ -249,7 +249,7 @@
:prop=
"'roles.' + index + '.ids'"
:rules=
"{required: true, message: $t('workspace.select'), trigger: 'change'}"
>
<el-select
v-model=
"role.ids"
:placeholder=
"$t('workspace.select')"
multiple
>
<el-select
filterable
v-model=
"role.ids"
:placeholder=
"$t('workspace.select')"
multiple
>
<el-option
v-for=
"item in form.wsList"
:key=
"item.id"
...
...
frontend/src/business/components/track/common/SelectMenu.vue
浏览文件 @
0e23dbd5
<
template
>
<el-menu
:unique-opened=
"true"
mode=
"horizontal"
active-text-color=
"write"
class=
"project_menu"
>
<el-submenu
index=
"1"
popper-class=
"submenu"
>
<template
v-slot:title
>
<span
class=
"menu-title"
>
{{
'
[
'
+
title
+
'
]
'
}}
</span>
<span>
{{
currentData
==
null
?
''
:
currentData
.
name
}}
</span>
</
template
>
<
template
v-slot:default
>
<div
style=
"height:400px;"
>
<el-scrollbar
style=
"height:100%"
>
<label
v-for=
"(item,index) in data"
:key=
"index"
>
<el-menu-item
@
click=
"changeData(item)"
>
{{
item
.
name
}}
<i
class=
"el-icon-check"
v-if=
"currentData && item.id === currentData.id"
></i>
</el-menu-item>
</label>
</el-scrollbar>
</div>
</
template
>
</el-submenu>
</el-menu>
<div>
<span
class=
"menu-title"
>
{{
'
[
'
+
title
+
'
]
'
}}
</span>
<el-select
filterable
slot=
"prepend"
v-model=
"value"
@
change=
"changeData"
class=
"project_menu"
size=
"small"
>
<el-option
v-for=
"(item,index) in data"
:key=
"index"
:label=
"item.name"
:value=
"index"
/>
</el-select>
</div>
</
template
>
<
script
>
export
default
{
name
:
"
SelectMenu
"
,
props
:
{
data
:
{
type
:
Array
},
currentData
:
{
type
:
Object
},
title
:
{
type
:
String
}
export
default
{
name
:
"
SelectMenu
"
,
props
:
{
data
:
{
type
:
Array
},
currentData
:
{
type
:
Object
},
methods
:
{
changeData
(
data
)
{
this
.
$emit
(
"
dataChange
"
,
data
);
title
:
{
type
:
String
}
},
data
()
{
return
{
value
:
''
}
},
watch
:
{
currentData
(
data
)
{
if
(
data
!=
undefined
&&
data
!=
null
)
{
this
.
value
=
data
.
name
;
}
}
},
methods
:
{
changeData
(
index
)
{
this
.
$emit
(
"
dataChange
"
,
this
.
data
[
index
]);
}
}
}
</
script
>
<
style
scoped
>
.project_menu
{
width
:
214px
;
}
.menu-title
{
color
:
darkgrey
;
margin-left
:
10px
;
margin-right
:
10px
;
}
</
style
>
frontend/src/business/components/track/plan/view/comonents/TestPlanTestCaseEdit.vue
浏览文件 @
0e23dbd5
...
...
@@ -180,6 +180,7 @@
:disabled=
"isReadOnly"
v-model=
"scope.row.executeResult"
@
change=
"stepResultChange()"
filterable
size=
"mini"
>
<el-option
:label=
"$t('test_track.plan_view.pass')"
value=
"Pass"
style=
"color: #7ebf50;"
></el-option>
...
...
@@ -227,6 +228,7 @@
{{ $t('test_track.issue.please_choose_current_owner') }}
<el-select
v-model=
"testCase.tapdUsers"
multiple
filterable
style=
"width: 20%"
:placeholder=
"$t('test_track.issue.please_choose_current_owner')"
collapse-tags
>
...
...
frontend/src/common/js/ajax.js
浏览文件 @
0e23dbd5
...
...
@@ -61,7 +61,7 @@ export default {
window
.
console
.
error
(
error
.
response
||
error
.
message
);
if
(
error
.
response
&&
error
.
response
.
data
)
{
if
(
error
.
response
.
headers
[
"
authentication-status
"
]
!==
"
invalid
"
)
{
Message
.
error
({
message
:
error
.
response
.
data
.
message
,
showClose
:
true
});
Message
.
error
({
message
:
error
.
response
.
data
.
message
||
error
.
response
.
data
,
showClose
:
true
});
}
}
else
{
Message
.
error
({
message
:
error
.
message
,
showClose
:
true
});
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录