Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
MeterSphere
metersphere
提交
3e52d679
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,发现更多精彩内容 >>
提交
3e52d679
编写于
3月 24, 2021
作者:
C
chenjianxing
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix: 新增编辑用例更新脑图
上级
b3675c3a
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
153 addition
and
42 deletion
+153
-42
backend/src/main/java/io/metersphere/track/controller/TestCaseController.java
...a/io/metersphere/track/controller/TestCaseController.java
+2
-2
frontend/src/business/components/track/case/TestCase.vue
frontend/src/business/components/track/case/TestCase.vue
+12
-4
frontend/src/business/components/track/case/components/TestCaseCreate.vue
...iness/components/track/case/components/TestCaseCreate.vue
+1
-0
frontend/src/business/components/track/case/components/TestCaseEdit.vue
...usiness/components/track/case/components/TestCaseEdit.vue
+8
-1
frontend/src/business/components/track/common/TestCaseNodeTree.vue
...src/business/components/track/common/TestCaseNodeTree.vue
+4
-0
frontend/src/business/components/track/common/minder/TestCaseMinder.vue
...usiness/components/track/common/minder/TestCaseMinder.vue
+15
-2
frontend/src/business/components/track/common/minder/minderUtils.js
...rc/business/components/track/common/minder/minderUtils.js
+111
-33
未找到文件。
backend/src/main/java/io/metersphere/track/controller/TestCaseController.java
浏览文件 @
3e52d679
...
...
@@ -120,8 +120,8 @@ public class TestCaseController {
@PostMapping
(
value
=
"/add"
,
consumes
=
{
"multipart/form-data"
})
@RequiresRoles
(
value
=
{
RoleConstants
.
TEST_USER
,
RoleConstants
.
TEST_MANAGER
},
logical
=
Logical
.
OR
)
public
void
addTestCase
(
@RequestPart
(
"request"
)
EditTestCaseRequest
request
,
@RequestPart
(
value
=
"file"
)
List
<
MultipartFile
>
files
)
{
testCaseService
.
save
(
request
,
files
);
public
String
addTestCase
(
@RequestPart
(
"request"
)
EditTestCaseRequest
request
,
@RequestPart
(
value
=
"file"
)
List
<
MultipartFile
>
files
)
{
return
testCaseService
.
save
(
request
,
files
);
}
@PostMapping
(
value
=
"/edit"
,
consumes
=
{
"multipart/form-data"
})
...
...
frontend/src/business/components/track/case/TestCase.vue
浏览文件 @
3e52d679
...
...
@@ -8,6 +8,7 @@
@
setTreeNodes=
"setTreeNodes"
@
exportTestCase=
"exportTestCase"
@
saveAsEdit=
"editTestCase"
@
createCase=
"handleCaseCreateOrEdit($event, 'add')"
@
refreshAll=
"refreshAll"
:type=
"'edit'"
ref=
"nodeTree"
...
...
@@ -44,7 +45,7 @@
:tree-nodes=
"treeNodes"
:project-id=
"projectId"
v-if=
"activeDom === 'right'"
ref=
"
testCaseList
"
/>
ref=
"
minder
"
/>
</ms-tab-button>
</el-tab-pane>
<el-tab-pane
...
...
@@ -58,6 +59,8 @@
:currentTestCaseInfo=
"item.testCaseInfo"
@
refresh=
"refreshTable"
@
setModuleOptions=
"setModuleOptions"
@
caseEdit=
"handleCaseCreateOrEdit($event,'edit')"
@
caseCreate=
"handleCaseCreateOrEdit($event,'add')"
:read-only=
"testCaseReadOnly"
:tree-nodes=
"treeNodes"
:select-node=
"selectNode"
...
...
@@ -282,7 +285,9 @@ export default {
this
.
selectParentNodes
=
pNodes
;
},
refreshTable
()
{
this
.
$refs
.
testCaseList
.
initTableData
();
if
(
this
.
$refs
.
testCaseList
)
{
this
.
$refs
.
testCaseList
.
initTableData
();
}
},
editTestCase
(
testCase
)
{
this
.
type
=
"
edit
"
...
...
@@ -293,11 +298,14 @@ export default {
}
this
.
addTab
({
name
:
'
edit
'
,
testCaseInfo
:
testCase
});
},
handleCaseCreateOrEdit
(
data
,
type
)
{
if
(
this
.
$refs
.
minder
)
{
this
.
$refs
.
minder
.
addCase
(
data
,
type
);
}
},
copyTestCase
(
testCase
)
{
this
.
type
=
"
copy
"
this
.
testCaseReadOnly
=
false
;
let
item
=
{};
testCase
.
isCopy
=
true
;
this
.
addTab
({
name
:
'
edit
'
,
testCaseInfo
:
testCase
});
},
...
...
frontend/src/business/components/track/case/components/TestCaseCreate.vue
浏览文件 @
3e52d679
...
...
@@ -125,6 +125,7 @@ export default {
this
.
$emit
(
'
saveAsEdit
'
,
this
.
testCaseForm
);
}
else
{
this
.
$emit
(
'
refresh
'
);
this
.
$emit
(
'
createCase
'
,
this
.
testCaseForm
);
}
})
}
else
{
...
...
frontend/src/business/components/track/case/components/TestCaseEdit.vue
浏览文件 @
3e52d679
...
...
@@ -659,7 +659,7 @@ export default {
let
param
=
this
.
buildParam
();
if
(
this
.
validate
(
param
))
{
let
option
=
this
.
getOption
(
param
);
this
.
result
=
this
.
$request
(
option
,
()
=>
{
this
.
result
=
this
.
$request
(
option
,
(
response
)
=>
{
this
.
$success
(
this
.
$t
(
'
commons.save_success
'
));
if
(
this
.
operationType
==
'
add
'
&&
this
.
isCreateContinue
)
{
this
.
form
.
name
=
''
;
...
...
@@ -678,6 +678,13 @@ export default {
}
this
.
dialogFormVisible
=
false
;
this
.
$emit
(
"
refresh
"
);
if
(
this
.
type
===
'
add
'
||
this
.
type
===
'
copy
'
)
{
param
.
id
=
response
.
data
;
this
.
$emit
(
"
caseCreate
"
,
param
);
this
.
close
();
}
else
{
this
.
$emit
(
"
caseEdit
"
,
param
);
}
});
}
}
else
{
...
...
frontend/src/business/components/track/common/TestCaseNodeTree.vue
浏览文件 @
3e52d679
...
...
@@ -35,6 +35,7 @@
<test-case-create
:tree-nodes=
"treeNodes"
@
saveAsEdit=
"saveAsEdit"
@
createCase=
"createCase"
@
refresh=
"refresh"
ref=
"testCaseCreate"
></test-case-create>
...
...
@@ -98,6 +99,9 @@ export default {
saveAsEdit
(
data
)
{
this
.
$emit
(
'
saveAsEdit
'
,
data
);
},
createCase
(
data
)
{
this
.
$emit
(
'
createCase
'
,
data
);
},
refresh
()
{
this
.
$emit
(
"
refreshTable
"
);
},
...
...
frontend/src/business/components/track/common/minder/TestCaseMinder.vue
浏览文件 @
3e52d679
...
...
@@ -11,7 +11,12 @@
<
script
>
import
MsModuleMinder
from
"
@/business/components/common/components/MsModuleMinder
"
;
import
{
getTestCaseDataMap
}
from
"
@/business/components/track/common/minder/minderUtils
"
;
import
{
appendChild
,
editNode
,
getTestCaseDataMap
,
parseCase
}
from
"
@/business/components/track/common/minder/minderUtils
"
;
export
default
{
name
:
"
TestCaseMinder
"
,
components
:
{
MsModuleMinder
},
...
...
@@ -48,6 +53,7 @@ name: "TestCaseMinder",
}
},
save
(
data
)
{
console
.
log
(
data
);
let
saveCases
=
[];
let
deleteCases
=
[];
this
.
buildSaveCase
(
data
.
root
,
saveCases
,
deleteCases
,
undefined
);
...
...
@@ -130,7 +136,14 @@ name: "TestCaseMinder",
throw
new
Error
(
tip
);
}
},
addCase
(
data
,
type
)
{
let
nodeData
=
parseCase
(
data
,
new
Map
());
if
(
type
===
'
edit
'
)
{
editNode
(
nodeData
);
}
else
{
appendChild
(
data
.
nodeId
,
nodeData
);
}
}
}
}
</
script
>
...
...
frontend/src/business/components/track/common/minder/minderUtils.js
浏览文件 @
3e52d679
import
{
getUUID
}
from
"
@/common/js/utils
"
;
export
function
getTestCaseDataMap
(
testCase
,
isDisable
,
setParamCallback
)
{
let
dataMap
=
new
Map
();
if
(
testCase
)
{
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
))
+
1
,
resource
:
[
"
用例
"
],
type
:
item
.
type
,
method
:
item
.
method
,
maintainer
:
item
.
maintainer
}
}
if
(
setParamCallback
)
{
setParamCallback
(
nodeItem
.
data
,
item
);
}
if
(
isDisable
)
{
nodeItem
.
data
.
disable
=
true
;
// 用例节点可以打标签
nodeItem
.
data
.
allowDisabledTag
=
true
;
}
parseChildren
(
nodeItem
,
item
,
isDisable
);
if
(
mapItem
)
{
mapItem
.
push
(
nodeItem
);
}
else
{
mapItem
=
[];
mapItem
.
push
(
nodeItem
);
dataMap
.
set
(
item
.
nodeId
,
mapItem
);
}
parseCase
(
item
,
dataMap
,
isDisable
,
setParamCallback
);
})
}
return
dataMap
;
}
export
function
parseCase
(
item
,
dataMap
,
isDisable
,
setParamCallback
)
{
if
(
item
.
steps
)
{
item
.
steps
=
JSON
.
parse
(
item
.
steps
);
}
else
{
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
))
+
1
,
resource
:
[
"
用例
"
],
type
:
item
.
type
,
method
:
item
.
method
,
maintainer
:
item
.
maintainer
}
}
if
(
setParamCallback
)
{
setParamCallback
(
nodeItem
.
data
,
item
);
}
if
(
isDisable
)
{
nodeItem
.
data
.
disable
=
true
;
// 用例节点可以打标签
nodeItem
.
data
.
allowDisabledTag
=
true
;
}
parseChildren
(
nodeItem
,
item
,
isDisable
);
if
(
mapItem
)
{
mapItem
.
push
(
nodeItem
);
}
else
{
mapItem
=
[];
mapItem
.
push
(
nodeItem
);
dataMap
.
set
(
item
.
nodeId
,
mapItem
);
}
return
nodeItem
;
}
function
parseChildren
(
nodeItem
,
item
,
isDisable
)
{
nodeItem
.
children
=
[];
let
children
=
[];
...
...
@@ -63,7 +74,8 @@ function _parseChildren(children, k, v, isDisable) {
data
:
{
text
:
k
,
resource
:
v
?
[
v
]
:
[]
}
},
children
:
[]
}
if
(
isDisable
)
{
node
.
data
.
disable
=
true
;
...
...
@@ -72,3 +84,69 @@ function _parseChildren(children, k, v, isDisable) {
return
node
;
}
}
export
function
appendChild
(
pId
,
appendNode
)
{
if
(
!
pId
)
{
pId
=
'
root
'
;
}
let
minder
=
window
.
minder
;
let
nodes
=
minder
.
getAllNode
();
let
parent
=
undefined
;
for
(
let
index
=
nodes
.
length
-
1
;
index
>=
0
;
index
--
)
{
let
item
=
nodes
[
index
];
if
(
item
.
data
.
id
===
pId
)
{
parent
=
item
;
break
;
}
}
if
(
!
parent
)
{
return
;
}
let
node
=
minder
.
createNode
(
""
,
parent
);
minder
.
select
(
node
,
true
);
node
.
data
=
appendNode
.
data
;
if
(
parent
.
isExpanded
())
{
node
.
render
();
}
else
{
parent
.
expand
();
parent
.
renderTree
();
}
minder
.
layout
(
600
);
// 添加子节点
let
children
=
appendNode
.
children
;
if
(
children
)
{
children
.
forEach
(
child
=>
{
child
.
data
.
id
=
getUUID
();
appendChild
(
node
.
data
.
id
,
child
);
})
}
}
export
function
editNode
(
node
)
{
let
minder
=
window
.
minder
;
let
nodes
=
minder
.
getAllNode
();
let
children
=
[];
let
item
=
undefined
;
for
(
const
index
in
nodes
)
{
item
=
nodes
[
index
];
if
(
item
.
data
.
id
===
node
.
data
.
id
)
{
item
.
data
=
node
.
data
;
children
=
node
.
children
;
if
(
item
.
children
)
{
item
.
children
.
forEach
(
n
=>
{
minder
.
removeNode
(
n
);
})
}
item
.
render
();
break
;
}
}
minder
.
layout
(
600
);
if
(
item
)
{
children
.
forEach
(
child
=>
{
child
.
data
.
id
=
getUUID
();
appendChild
(
item
.
data
.
id
,
child
);
})
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录