Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
MeterSphere
metersphere
提交
cf0f35eb
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,发现更多精彩内容 >>
提交
cf0f35eb
编写于
5月 25, 2020
作者:
C
chenjianxing
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'dev' of
https://github.com/fit2cloudrd/metersphere-server
into dev
上级
b7b33ad2
a16c0be4
变更
16
隐藏空白更改
内联
并排
Showing
16 changed file
with
75 addition
and
65 deletion
+75
-65
backend/src/main/java/io/metersphere/api/jmeter/APIBackendListenerClient.java
...a/io/metersphere/api/jmeter/APIBackendListenerClient.java
+7
-7
backend/src/main/java/io/metersphere/api/jmeter/JMeterService.java
...rc/main/java/io/metersphere/api/jmeter/JMeterService.java
+14
-1
backend/src/main/java/io/metersphere/api/service/APITestService.java
.../main/java/io/metersphere/api/service/APITestService.java
+1
-1
backend/src/main/java/io/metersphere/performance/service/PerformanceTestService.java
...tersphere/performance/service/PerformanceTestService.java
+3
-0
frontend/src/business/components/api/test/model/ScenarioModel.js
...d/src/business/components/api/test/model/ScenarioModel.js
+0
-7
frontend/src/business/components/settings/organization/OrganizationMember.vue
...s/components/settings/organization/OrganizationMember.vue
+1
-1
frontend/src/business/components/settings/organization/OrganizationWorkspace.vue
...omponents/settings/organization/OrganizationWorkspace.vue
+1
-1
frontend/src/business/components/settings/personal/PersonSetting.vue
...c/business/components/settings/personal/PersonSetting.vue
+1
-1
frontend/src/business/components/settings/system/Organization.vue
.../src/business/components/settings/system/Organization.vue
+1
-1
frontend/src/business/components/settings/system/SystemWorkspace.vue
...c/business/components/settings/system/SystemWorkspace.vue
+1
-1
frontend/src/business/components/settings/system/TestResourcePool.vue
.../business/components/settings/system/TestResourcePool.vue
+1
-1
frontend/src/business/components/settings/system/User.vue
frontend/src/business/components/settings/system/User.vue
+38
-38
frontend/src/business/components/settings/workspace/WorkspaceMember.vue
...usiness/components/settings/workspace/WorkspaceMember.vue
+1
-1
frontend/src/i18n/en-US.js
frontend/src/i18n/en-US.js
+1
-1
frontend/src/i18n/zh-CN.js
frontend/src/i18n/zh-CN.js
+2
-2
frontend/src/i18n/zh-TW.js
frontend/src/i18n/zh-TW.js
+2
-1
未找到文件。
backend/src/main/java/io/metersphere/api/jmeter/APIBackendListenerClient.java
浏览文件 @
cf0f35eb
...
...
@@ -13,19 +13,18 @@ import org.apache.jmeter.visualizers.backend.BackendListenerContext;
import
java.io.Serializable
;
import
java.util.*
;
import
java.util.concurrent.ConcurrentHashMap
;
/**
* JMeter BackendListener扩展, jmx脚本中使用
*/
public
class
APIBackendListenerClient
extends
AbstractBackendListenerClient
implements
Serializable
{
public
final
static
String
TEST_ID
=
"ms.test.id"
;
private
final
static
String
THREAD_SPLIT
=
" "
;
private
final
static
String
ID_SPLIT
=
"-"
;
private
final
static
String
TEST_ID
=
"id"
;
private
final
List
<
SampleResult
>
queue
=
new
ArrayList
<>();
private
APITestService
apiTestService
;
...
...
@@ -33,11 +32,11 @@ public class APIBackendListenerClient extends AbstractBackendListenerClient impl
private
APIReportService
apiReportService
;
// 测试ID
private
String
i
d
;
private
String
testI
d
;
@Override
public
void
setupTest
(
BackendListenerContext
context
)
throws
Exception
{
this
.
i
d
=
context
.
getParameter
(
TEST_ID
);
this
.
testI
d
=
context
.
getParameter
(
TEST_ID
);
apiTestService
=
CommonBeanFactory
.
getBean
(
APITestService
.
class
);
if
(
apiTestService
==
null
)
{
LogUtil
.
error
(
"apiTestService is required"
);
...
...
@@ -47,6 +46,7 @@ public class APIBackendListenerClient extends AbstractBackendListenerClient impl
if
(
apiReportService
==
null
)
{
LogUtil
.
error
(
"apiReportService is required"
);
}
super
.
setupTest
(
context
);
}
@Override
...
...
@@ -57,7 +57,7 @@ public class APIBackendListenerClient extends AbstractBackendListenerClient impl
@Override
public
void
teardownTest
(
BackendListenerContext
context
)
throws
Exception
{
TestResult
testResult
=
new
TestResult
();
testResult
.
setTestId
(
i
d
);
testResult
.
setTestId
(
testI
d
);
testResult
.
setTotal
(
queue
.
size
());
// 一个脚本里可能包含多个场景(ThreadGroup),所以要区分开,key: 场景Id
...
...
@@ -99,7 +99,7 @@ public class APIBackendListenerClient extends AbstractBackendListenerClient impl
testResult
.
getScenarios
().
addAll
(
scenarios
.
values
());
testResult
.
getScenarios
().
sort
(
Comparator
.
comparing
(
ScenarioResult:
:
getId
));
apiTestService
.
changeStatus
(
i
d
,
APITestStatus
.
Completed
);
apiTestService
.
changeStatus
(
testI
d
,
APITestStatus
.
Completed
);
apiReportService
.
complete
(
testResult
);
queue
.
clear
();
...
...
backend/src/main/java/io/metersphere/api/jmeter/JMeterService.java
浏览文件 @
cf0f35eb
...
...
@@ -3,8 +3,10 @@ package io.metersphere.api.jmeter;
import
io.metersphere.commons.exception.MSException
;
import
io.metersphere.config.JmeterProperties
;
import
io.metersphere.i18n.Translator
;
import
org.apache.jmeter.config.Arguments
;
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.springframework.stereotype.Service
;
...
...
@@ -19,7 +21,7 @@ public class JMeterService {
@Resource
private
JmeterProperties
jmeterProperties
;
public
void
run
(
InputStream
is
)
{
public
void
run
(
String
testId
,
InputStream
is
)
{
String
JMETER_HOME
=
jmeterProperties
.
getHome
();
String
JMETER_PROPERTIES
=
JMETER_HOME
+
"/bin/jmeter.properties"
;
JMeterUtils
.
loadJMeterProperties
(
JMETER_PROPERTIES
);
...
...
@@ -27,6 +29,7 @@ public class JMeterService {
try
{
Object
scriptWrapper
=
SaveService
.
loadElement
(
is
);
HashTree
testPlan
=
getHashTree
(
scriptWrapper
);
addBackendListener
(
testId
,
testPlan
);
LocalRunner
runner
=
new
LocalRunner
(
testPlan
);
runner
.
run
();
...
...
@@ -40,4 +43,14 @@ public class JMeterService {
field
.
setAccessible
(
true
);
return
(
HashTree
)
field
.
get
(
scriptWrapper
);
}
private
void
addBackendListener
(
String
testId
,
HashTree
testPlan
)
{
BackendListener
backendListener
=
new
BackendListener
();
backendListener
.
setName
(
testId
);
Arguments
arguments
=
new
Arguments
();
arguments
.
addArgument
(
APIBackendListenerClient
.
TEST_ID
,
testId
);
backendListener
.
setArguments
(
arguments
);
backendListener
.
setClassname
(
APIBackendListenerClient
.
class
.
getCanonicalName
());
testPlan
.
add
(
testPlan
.
getArray
()[
0
],
backendListener
);
}
}
backend/src/main/java/io/metersphere/api/service/APITestService.java
浏览文件 @
cf0f35eb
...
...
@@ -90,7 +90,7 @@ public class APITestService {
String
reportId
=
apiReportService
.
create
(
get
(
request
.
getId
()));
changeStatus
(
request
.
getId
(),
APITestStatus
.
Running
);
jMeterService
.
run
(
is
);
jMeterService
.
run
(
request
.
getId
(),
is
);
return
reportId
;
}
...
...
backend/src/main/java/io/metersphere/performance/service/PerformanceTestService.java
浏览文件 @
cf0f35eb
...
...
@@ -8,6 +8,7 @@ import io.metersphere.base.mapper.ext.ExtLoadTestReportMapper;
import
io.metersphere.commons.constants.PerformanceTestStatus
;
import
io.metersphere.commons.exception.MSException
;
import
io.metersphere.commons.utils.LogUtil
;
import
io.metersphere.commons.utils.SessionUtils
;
import
io.metersphere.dto.DashboardTestDTO
;
import
io.metersphere.dto.LoadTestDTO
;
import
io.metersphere.i18n.Translator
;
...
...
@@ -130,6 +131,7 @@ public class PerformanceTestService {
}
final
LoadTestWithBLOBs
loadTest
=
new
LoadTestWithBLOBs
();
loadTest
.
setUserId
(
SessionUtils
.
getUser
().
getId
());
loadTest
.
setId
(
UUID
.
randomUUID
().
toString
());
loadTest
.
setName
(
request
.
getName
());
loadTest
.
setProjectId
(
request
.
getProjectId
());
...
...
@@ -213,6 +215,7 @@ public class PerformanceTestService {
testReport
.
setUpdateTime
(
engine
.
getStartTime
());
testReport
.
setTestId
(
loadTest
.
getId
());
testReport
.
setName
(
loadTest
.
getName
());
testReport
.
setUserId
(
SessionUtils
.
getUser
().
getId
());
// 启动测试
try
{
...
...
frontend/src/business/components/api/test/model/ScenarioModel.js
浏览文件 @
cf0f35eb
...
...
@@ -386,7 +386,6 @@ class JMXGenerator {
let
testPlan
=
new
TestPlan
(
test
.
name
);
this
.
addScenarios
(
testPlan
,
test
.
scenarioDefinition
);
this
.
addBackendListener
(
testPlan
,
test
.
id
);
this
.
jmeterTestPlan
=
new
JMeterTestPlan
();
this
.
jmeterTestPlan
.
put
(
testPlan
);
...
...
@@ -424,12 +423,6 @@ class JMXGenerator {
})
}
addBackendListener
(
testPlan
,
testId
)
{
let
className
=
'
io.metersphere.api.jmeter.APIBackendListenerClient
'
;
let
args
=
[
new
KeyValue
(
"
id
"
,
testId
)];
testPlan
.
put
(
new
BackendListener
(
testId
,
className
,
args
));
}
addScenarioVariables
(
threadGroup
,
scenario
)
{
let
args
=
this
.
replaceKV
(
scenario
.
variables
);
if
(
args
.
length
>
0
)
{
...
...
frontend/src/business/components/settings/organization/OrganizationMember.vue
浏览文件 @
cf0f35eb
...
...
@@ -105,7 +105,7 @@
export
default
{
name
:
"
MsOrganizationMember
"
,
components
:
{
MsCreateBox
,
MsTablePagination
,
MsTableHeader
,
MsRolesTag
,
MsTableOperator
,
MsDialogFooter
},
cre
ated
()
{
activ
ated
()
{
this
.
initTableData
();
},
data
()
{
...
...
frontend/src/business/components/settings/organization/OrganizationWorkspace.vue
浏览文件 @
cf0f35eb
...
...
@@ -156,7 +156,7 @@
export
default
{
name
:
"
MsOrganizationWorkspace
"
,
components
:
{
MsCreateBox
,
MsTablePagination
,
MsTableHeader
,
MsRolesTag
,
MsTableOperator
,
MsDialogFooter
},
moun
ted
()
{
activa
ted
()
{
this
.
list
();
},
computed
:
{
...
...
frontend/src/business/components/settings/personal/PersonSetting.vue
浏览文件 @
cf0f35eb
...
...
@@ -148,7 +148,7 @@
}
},
cre
ated
()
{
activ
ated
()
{
this
.
initTableData
();
},
methods
:
{
...
...
frontend/src/business/components/settings/system/Organization.vue
浏览文件 @
cf0f35eb
...
...
@@ -231,7 +231,7 @@
}
}
},
cre
ated
()
{
activ
ated
()
{
this
.
initTableData
();
},
methods
:
{
...
...
frontend/src/business/components/settings/system/SystemWorkspace.vue
浏览文件 @
cf0f35eb
...
...
@@ -201,7 +201,7 @@
export
default
{
name
:
"
MsSystemWorkspace
"
,
components
:
{
MsCreateBox
,
MsTablePagination
,
MsTableHeader
,
MsRolesTag
,
MsTableOperator
,
MsDialogFooter
},
moun
ted
()
{
activa
ted
()
{
this
.
list
();
},
methods
:
{
...
...
frontend/src/business/components/settings/system/TestResourcePool.vue
浏览文件 @
cf0f35eb
...
...
@@ -256,7 +256,7 @@
}
}
},
cre
ated
()
{
activ
ated
()
{
this
.
initTableData
();
},
methods
:
{
...
...
frontend/src/business/components/settings/system/User.vue
浏览文件 @
cf0f35eb
...
...
@@ -68,29 +68,29 @@
<el-input
v-model=
"form.password"
autocomplete=
"off"
show-password
/>
</el-form-item>
<div
v-for=
"(role, index) in form.roles"
:key=
"index"
>
<el-form-item
:label=
"
'角色'
+index"
<el-form-item
:label=
"
$t('commons.role')
+index"
:prop=
"'roles.' + index + '.id'"
:rules=
"{required: true, message:
'请选择角色'
, trigger: 'change'}"
:rules=
"{required: true, message:
$t('role.please_choose_role')
, trigger: 'change'}"
>
<el-select
v-model=
"role.id"
placeholder=
"选择角色类型
"
>
<el-select
v-model=
"role.id"
:placeholder=
"$t('role.please_choose_role')
"
>
<el-option
v-for=
"item in activeRole(role)"
:key=
"item.id"
:label=
"
item.name
"
:label=
"
$t('role.' + item.id)
"
:value=
"item.id"
>
{{
item.name
}}
{{
$t('role.' + item.id)
}}
</el-option>
</el-select>
<el-button
@
click.prevent=
"removeRole(role)"
style=
"margin-left: 20px;"
v-if=
"form.roles.length > 1"
>
删除
<el-button
@
click.prevent=
"removeRole(role)"
style=
"margin-left: 20px;"
v-if=
"form.roles.length > 1"
>
{{$t('commons.delete')}}
</el-button>
</el-form-item>
<div
v-if=
"role.id === 'org_admin'"
>
<el-form-item
label=
"选择组织
"
<el-form-item
:label=
"$t('organization.select_organization')
"
:prop=
"'roles.' + index + '.ids'"
:rules=
"{required: true, message:
'请选择组织'
, trigger: 'change'}"
:rules=
"{required: true, message:
$t('organization.select_organization')
, trigger: 'change'}"
>
<el-select
v-model=
"role.ids"
placeholder=
"选择组织
"
multiple
>
<el-select
v-model=
"role.ids"
:placeholder=
"$t('organization.select_organization')
"
multiple
>
<el-option
v-for=
"item in form.orgList"
:key=
"item.id"
...
...
@@ -101,11 +101,11 @@
</el-form-item>
</div>
<div
v-if=
"role.id === 'test_manager'"
>
<el-form-item
label=
"选择工作空间
"
<el-form-item
:label=
"$t('workspace.select')
"
:prop=
"'roles.' + index + '.ids'"
:rules=
"{required: true, message:
'请选择工作空间'
, trigger: 'change'}"
:rules=
"{required: true, message:
$t('workspace.select')
, trigger: 'change'}"
>
<el-select
v-model=
"role.ids"
placeholder=
"选择工作空间
"
multiple
>
<el-select
v-model=
"role.ids"
:placeholder=
"$t('workspace.select')
"
multiple
>
<el-option
v-for=
"item in form.wsList"
:key=
"item.id"
...
...
@@ -116,11 +116,11 @@
</el-form-item>
</div>
<div
v-if=
"role.id ==='test_user'"
>
<el-form-item
label=
"选择工作空间
"
<el-form-item
:label=
"$t('workspace.select')
"
:prop=
"'roles.' + index + '.ids'"
:rules=
"{required: true, message:
'请选择工作空间'
, trigger: 'change'}"
:rules=
"{required: true, message:
$t('workspace.select')
, trigger: 'change'}"
>
<el-select
v-model=
"role.ids"
placeholder=
"选择工作空间
"
multiple
>
<el-select
v-model=
"role.ids"
:placeholder=
"$t('workspace.select')
"
multiple
>
<el-option
v-for=
"item in form.wsList"
:key=
"item.id"
...
...
@@ -131,11 +131,11 @@
</el-form-item>
</div>
<div
v-if=
"role.id ==='test_viewer'"
>
<el-form-item
label=
"选择工作空间
"
<el-form-item
:label=
"$t('workspace.select')
"
:prop=
"'roles.' + index + '.ids'"
:rules=
"{required: true, message:
'请选择工作空间'
, trigger: 'change'}"
:rules=
"{required: true, message:
$t('workspace.select')
, trigger: 'change'}"
>
<el-select
v-model=
"role.ids"
placeholder=
"选择工作空间
"
multiple
>
<el-select
v-model=
"role.ids"
:placeholder=
"$t('workspace.select')
"
multiple
>
<el-option
v-for=
"item in form.wsList"
:key=
"item.id"
...
...
@@ -149,7 +149,7 @@
<el-form-item>
<
template
>
<el-button
type=
"success"
style=
"width: 100%;"
@
click=
"addRole('createUserForm')"
:disabled=
"btnAddRole"
>
添加角色
</el-button>
<el-button
type=
"success"
style=
"width: 100%;"
@
click=
"addRole('createUserForm')"
:disabled=
"btnAddRole"
>
{{
$t
(
'
role.add
'
)
}}
</el-button>
</
template
>
</el-form-item>
</el-form>
...
...
@@ -177,27 +177,27 @@
<el-input
v-model=
"form.phone"
autocomplete=
"off"
/>
</el-form-item>
<div
v-for=
"(role, index) in form.roles"
:key=
"index"
>
<el-form-item
:label=
"
'角色'
+index"
<el-form-item
:label=
"
$t('commons.role')
+index"
:prop=
"'roles.' + index + '.id'"
:rules=
"{required: true, message:
'请选择角色'
, trigger: 'change'}"
:rules=
"{required: true, message:
$t('role.please_choose_role')
, trigger: 'change'}"
>
<el-select
v-model=
"role.id"
placeholder=
"选择角色类型
"
:disabled=
"!!role.id"
>
<el-select
v-model=
"role.id"
:placeholder=
"$t('role.please_choose_role')
"
:disabled=
"!!role.id"
>
<el-option
v-for=
"item in activeRole(role)"
:key=
"item.id"
:label=
"
item.name
"
:label=
"
$t('role.' + item.id)
"
:value=
"item.id"
>
</el-option>
</el-select>
<el-button
@
click.prevent=
"removeRole(role)"
style=
"margin-left: 20px;"
v-if=
"form.roles.length > 1"
>
删除
<el-button
@
click.prevent=
"removeRole(role)"
style=
"margin-left: 20px;"
v-if=
"form.roles.length > 1"
>
{{$t('commons.delete')}}
</el-button>
</el-form-item>
<div
v-if=
"role.id === 'org_admin'"
>
<el-form-item
label=
"选择组织
"
<el-form-item
:label=
"$t('organization.select_organization')
"
:prop=
"'roles.' + index + '.ids'"
:rules=
"{required: true, message:
'请选择组织'
, trigger: 'change'}"
:rules=
"{required: true, message:
$t('organization.select_organization')
, trigger: 'change'}"
>
<el-select
v-model=
"role.ids"
placeholder=
"选择组织
"
multiple
>
<el-select
v-model=
"role.ids"
:placeholder=
"$t('organization.select_organization')
"
multiple
>
<el-option
v-for=
"item in form.orgList"
:key=
"item.id"
...
...
@@ -208,11 +208,11 @@
</el-form-item>
</div>
<div
v-if=
"role.id === 'test_manager'"
>
<el-form-item
label=
"选择工作空间
"
<el-form-item
:label=
"$t('workspace.select')
"
:prop=
"'roles.' + index + '.ids'"
:rules=
"{required: true, message:
'请选择工作空间'
, trigger: 'change'}"
:rules=
"{required: true, message:
$t('workspace.select')
, trigger: 'change'}"
>
<el-select
v-model=
"role.ids"
placeholder=
"选择工作空间
"
multiple
>
<el-select
v-model=
"role.ids"
:placeholder=
"$t('workspace.select')
"
multiple
>
<el-option
v-for=
"item in form.wsList"
:key=
"item.id"
...
...
@@ -223,11 +223,11 @@
</el-form-item>
</div>
<div
v-if=
"role.id ==='test_user'"
>
<el-form-item
label=
"选择工作空间
"
<el-form-item
:label=
"$t('workspace.select')
"
:prop=
"'roles.' + index + '.ids'"
:rules=
"{required: true, message:
'请选择工作空间'
, trigger: 'change'}"
:rules=
"{required: true, message:
$t('workspace.select')
, trigger: 'change'}"
>
<el-select
v-model=
"role.ids"
placeholder=
"选择工作空间
"
multiple
>
<el-select
v-model=
"role.ids"
:placeholder=
"$t('workspace.select')
"
multiple
>
<el-option
v-for=
"item in form.wsList"
:key=
"item.id"
...
...
@@ -238,11 +238,11 @@
</el-form-item>
</div>
<div
v-if=
"role.id ==='test_viewer'"
>
<el-form-item
label=
"选择工作空间
"
<el-form-item
:label=
"$t('workspace.select')
"
:prop=
"'roles.' + index + '.ids'"
:rules=
"{required: true, message:
'请选择工作空间'
, trigger: 'change'}"
:rules=
"{required: true, message:
$t('workspace.select')
, trigger: 'change'}"
>
<el-select
v-model=
"role.ids"
placeholder=
"选择工作空间
"
multiple
>
<el-select
v-model=
"role.ids"
:placeholder=
"$t('workspace.select')
"
multiple
>
<el-option
v-for=
"item in form.wsList"
:key=
"item.id"
...
...
@@ -255,7 +255,7 @@
</div>
<el-form-item>
<
template
>
<el-button
type=
"success"
style=
"width: 100%;"
@
click=
"addRole('updateUserForm')"
:disabled=
"btnAddRole"
>
添加角色
</el-button>
<el-button
type=
"success"
style=
"width: 100%;"
@
click=
"addRole('updateUserForm')"
:disabled=
"btnAddRole"
>
{{
$t
(
'
role.add
'
)
}}
</el-button>
</
template
>
</el-form-item>
</el-form>
...
...
@@ -386,7 +386,7 @@
}
}
},
cre
ated
()
{
activ
ated
()
{
this
.
search
();
this
.
getAllRole
();
},
...
...
frontend/src/business/components/settings/workspace/WorkspaceMember.vue
浏览文件 @
cf0f35eb
...
...
@@ -130,7 +130,7 @@
total
:
0
,
}
},
cre
ated
:
function
()
{
activ
ated
:
function
()
{
this
.
initTableData
();
},
methods
:
{
...
...
frontend/src/i18n/en-US.js
浏览文件 @
cf0f35eb
...
...
@@ -56,7 +56,6 @@ export default {
'
personal_information
'
:
'
Personal Information
'
,
'
exit_system
'
:
'
Exit System
'
,
'
verification
'
:
'
Verification
'
,
'
set_admin
'
:
'
Set Admin
'
,
'
system_parameter_setting
'
:
'
System Parameter Setting
'
,
'
connection_successful
'
:
'
Connection successful
'
,
'
connection_failed
'
:
'
Connection failed
'
,
...
...
@@ -164,6 +163,7 @@ export default {
'
test_manager
'
:
'
Test Manager
'
,
'
test_user
'
:
'
Test User
'
,
'
test_viewer
'
:
'
Test Viewer
'
,
'
add
'
:
'
Add Role
'
,
},
report
:
{
'
recent
'
:
'
Recent Report
'
,
...
...
frontend/src/i18n/zh-CN.js
浏览文件 @
cf0f35eb
...
...
@@ -80,7 +80,6 @@ export default {
'
weeks_5
'
:
'
周五
'
,
'
weeks_6
'
:
'
周六
'
,
'
test_unit
'
:
'
测试
'
,
'
set_admin
'
:
'
设置为管理员
'
,
'
system_parameter_setting
'
:
'
系统参数设置
'
,
'
connection_successful
'
:
'
连接成功
'
,
'
connection_failed
'
:
'
连接失败
'
,
...
...
@@ -161,7 +160,8 @@ export default {
'
org_admin
'
:
'
组织管理员
'
,
'
test_manager
'
:
'
测试经理
'
,
'
test_user
'
:
'
测试人员
'
,
'
test_viewer
'
:
'
Viewer
'
'
test_viewer
'
:
'
Viewer
'
,
'
add
'
:
'
添加角色
'
,
},
report
:
{
'
recent
'
:
'
最近的报告
'
,
...
...
frontend/src/i18n/zh-TW.js
浏览文件 @
cf0f35eb
...
...
@@ -153,7 +153,8 @@ export default {
'
org_admin
'
:
'
組織管理員
'
,
'
test_manager
'
:
'
測試經理
'
,
'
test_user
'
:
'
測試人員
'
,
'
test_viewer
'
:
'
Viewer
'
'
test_viewer
'
:
'
Viewer
'
,
'
add
'
:
'
添加角色
'
,
},
report
:
{
'
name
'
:
'
項目名稱
'
,
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录