Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
N
nse-ui
概览
Overview
Details
Activity
Cycle Analytics
版本库
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
问题
0
Issues
0
列表
Board
标记
里程碑
合并请求
0
Merge Requests
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
Snippets
成员
Members
Collapse sidebar
Close sidebar
活动
图像
聊天
创建新问题
作业
提交
Issue Boards
Open sidebar
吴超
nse-ui
Commits
8f28908e
Commit
8f28908e
authored
Sep 01, 2025
by
ningjihai
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
项目管理新增第二步bug
(发现梳理新增组件变成页面组件)
parent
10ff4b11
显示空白字符变更
内嵌
并排
正在显示
6 个修改的文件
包含
352 行增加
和
61 行删除
+352
-61
src/api/discover/index.js
+199
-0
src/views/discover/Discover/QueryForm.vue
+3
-3
src/views/discover/Discover/addEditDiscovery.vue
+78
-26
src/views/discover/Discover/index.vue
+2
-0
src/views/discover/Discover/list.vue
+69
-32
src/views/project/Project/list.vue
+1
-0
没有找到文件。
src/api/discover/index.js
0 → 100644
View file @
8f28908e
import
request
from
'@/utils/request'
/**
* 发现梳理列表
* @param {*} query
* @returns
*/
export
function
queryDiscoverList
(
data
)
{
return
request
({
url
:
'/core/tdatadiscovery/query'
,
method
:
'post'
,
data
:
data
})
}
export
function
querybyprojectid
(
data
)
{
return
request
({
url
:
'/core/searchregex/querybyprojectid'
,
method
:
'post'
,
data
:
data
})
}
export
function
querydatasystem
(
data
)
{
return
request
({
url
:
'/core/searchsensitivedata/querydatasystem'
,
method
:
'post'
,
data
:
data
})
}
// export function checkProjectNum(data) {
// return request({
// url: '/core/tdataproject/checkProjectNum',
// method: 'post',
// data: data
// })
// }
// export function getdatascopeprojectlist(data) {
// return request({
// url: '/core/datascopeproject/getdatascopeprojectlist',
// method: 'post',
// data: data
// })
// }
// export function checkDatasystemName(data) {
// return request({
// url: '/core/tdataproject/checkDatasystemName',
// method: 'post',
// data: data
// })
// }
// export function checkDatasystem(data) {
// return request({
// url: '/core/tdataproject/checkDatasystem',
// method: 'post',
// data: data
// })
// }
// export function queryByEditSort(data) {
// return request({
// url: '/core/tdatasource/queryByEditSort',
// method: 'post',
// data: data
// })
// }
// export function selectProDataSource(data) {
// return request({
// url: '/core/tdatasource/selectProDataSource',
// method: 'post',
// data: data
// })
// }
// export function queryShemas(data) {
// return request({
// url: '/core/searchsensitivedata/queryShemas',
// method: 'post',
// data: data
// })
// }
// export function getAllDataAreaAndRule(data) {
// return request({
// url: '/core/tdataarea/getAllDataAreaAndRule',
// method: 'post',
// data: data
// })
// }
// export function addDataProject(data) {
// return request({
// url: '/core/tdataproject/addDataProject',
// method: 'post',
// data: data
// })
// }
// export function deleteDataProject(data) {
// return request({
// url: '/core/tdataproject/deleteDataProject',
// method: 'post',
// data: data
// })
// }
// export function getDataProjectDetail(data) {
// return request({
// url: '/core/tdataproject/getDataProjectDetail',
// method: 'post',
// data: data
// })
// }
// export function updateDataProject(data) {
// return request({
// url: '/core/tdataproject/updateDataProject',
// method: 'post',
// data: data
// })
// }
// export function showProxyInfo(data) {
// return request({
// url: '/core/encryptionconfig/showProxyInfo',
// method: 'post',
// data: data
// })
// }
// export function saveProxyJarInfo(data) {
// return request({
// url: '/core/encryptionconfig/saveProxyJarInfo',
// method: 'post',
// data: data
// })
// }
// export function getProjectTree(data) {
// return request({
// url: '/core/encryptionconfig/getProjectTree',
// method: 'post',
// data: data
// })
// }
// export function getEncryptExcel(data) {
// return request({
// url: '/core/encryptionconfig/getEncryptExcel',
// method: 'post',
// data: data,
// responseType: 'blob' //
// })
// }
// export function checkEncryptExcel(data) {
// return request({
// url: '/core/encryptionconfig/checkEncryptExcel',
// method: 'post',
// data: data
// })
// }
// export function exportToExcel(data) {
// return request({
// url: '/core/encryptionconfig/exportToExcel',
// method: 'post',
// data: data,
// responseType: 'blob' //
// })
// }
// export function tdatasourceQuery(data) {
// return request({
// url: '/core/tdatasource/query',
// method: 'post',
// data: data
// })
// }
// export function queryShemasmodifysubsettask(data) {
// return request({
// url: '/core/modifysubsettask/queryShemas',
// method: 'post',
// data: data
// })
// }
// export function rowsensitivelevelType(type,data) {
// return request({
// url: '/core/rowsensitivelevel/' + type,
// method: 'post',
// data: data
// })
// }
src/views/discover/Discover/QueryForm.vue
View file @
8f28908e
...
@@ -34,7 +34,7 @@ function onSearch() {
...
@@ -34,7 +34,7 @@ function onSearch() {
// 重置
// 重置
function
onReset
(
formRef
:
FormInstance
)
{
function
onReset
(
formRef
:
FormInstance
)
{
queryForm
.
value
.
t
itl
e
=
''
queryForm
.
value
.
t
asknam
e
=
''
emit
(
'reset'
,
formRef
)
emit
(
'reset'
,
formRef
)
}
}
...
@@ -48,9 +48,9 @@ function onReset(formRef: FormInstance) {
...
@@ -48,9 +48,9 @@ function onReset(formRef: FormInstance) {
:model=
"queryForm"
:model=
"queryForm"
@
search=
"onSearch"
@
search=
"onSearch"
@
reset=
"onReset"
>
@
reset=
"onReset"
>
<el-form-item
label=
"发现任务名称"
prop=
"t
itl
e"
>
<el-form-item
label=
"发现任务名称"
prop=
"t
asknam
e"
>
<el-input
<el-input
v-model=
"queryForm.t
itl
e"
v-model=
"queryForm.t
asknam
e"
placeholder=
"请输入发现任务名称"
placeholder=
"请输入发现任务名称"
clearable
clearable
/>
/>
...
...
src/views/discover/Discover/
modules/AddDiscoveryDialog
.vue
→
src/views/discover/Discover/
addEditDiscovery
.vue
View file @
8f28908e
<
template
>
<
template
>
<el-dialog
<div
class=
"app-container scroller"
>
v-model=
"dialogVisible"
<PageTitle
:back=
"true"
@
back=
"backListPage"
>
:title=
"dialogTitle"
<template
#
title
>
width=
"800px"
新增发现任务
:before-close=
"handleClose"
</
template
>
>
<!-- 步骤导航 - 按照图片样式重新设计 -->
</PageTitle>
<div
class=
"app-container__body"
>
<div
class=
"steps-navigation"
>
<div
class=
"steps-navigation"
>
<div
class=
"steps-container"
>
<div
class=
"steps-container"
>
<div
class=
"step-item"
:class=
"{ 'step-active': currentStep === 1, 'step-completed': currentStep > 1 }"
>
<div
class=
"step-item"
:class=
"{ 'step-active': currentStep === 1, 'step-completed': currentStep > 1 }"
>
...
@@ -31,9 +34,9 @@
...
@@ -31,9 +34,9 @@
<!-- 步骤1:新建任务 -->
<!-- 步骤1:新建任务 -->
<div
v-if=
"currentStep === 1"
class=
"step-content"
>
<div
v-if=
"currentStep === 1"
class=
"step-content"
>
<el-form
:model=
"formData"
:rules=
"rules"
ref=
"step1Form"
label-width=
"120px"
>
<el-form
:model=
"formData"
:rules=
"rules"
ref=
"step1Form"
label-width=
"120px"
>
<el-form-item
label=
"发现任务名称"
prop=
"t
name"
required
>
<el-form-item
label=
"发现任务名称"
prop=
"task
name"
required
>
<el-input
<el-input
v-model=
"formData.t
name"
v-model=
"formData.task
name"
placeholder=
"请输入发现任务名称"
placeholder=
"请输入发现任务名称"
clearable
clearable
maxlength=
"50"
maxlength=
"50"
...
@@ -183,7 +186,7 @@
...
@@ -183,7 +186,7 @@
</div>
</div>
<!-- 底部按钮 -->
<!-- 底部按钮 -->
<template
#
footer
>
<!-- <template #footer> --
>
<div
class=
"dialog-footer"
>
<div
class=
"dialog-footer"
>
<el-button
@
click=
"handleCancel"
>
取消
</el-button>
<el-button
@
click=
"handleCancel"
>
取消
</el-button>
...
@@ -210,29 +213,56 @@
...
@@ -210,29 +213,56 @@
确定
确定
</el-button>
</el-button>
</div>
</div>
</
template
>
<!-- </template> --
>
<!-- 敏感类型选择弹窗 -->
<!-- <SensitiveTypeDialog
v-model="sensitiveTypeDialogVisible"
@confirm="handleSensitiveTypeConfirm"
/> -->
<SensitiveTypeDialog
<SensitiveTypeDialog
ref=
"sensitiveDialogRef"
ref=
"sensitiveDialogRef"
v-model=
"sensitiveTypeDialogVisible"
v-model=
"sensitiveTypeDialogVisible"
:selected-types=
"selectedRuleIds"
:selected-types=
"selectedRuleIds"
@
confirm=
"handleRuleConfirm"
@
confirm=
"handleRuleConfirm"
/>
/>
</el-dialog>
</div>
</div>
</template>
</template>
<
script
setup
>
<
script
setup
>
import
{
ref
,
reactive
,
computed
}
from
'vue'
import
{
ref
,
reactive
,
computed
,
onMounted
}
from
'vue'
import
{
ElMessage
}
from
'element-plus'
import
{
ElMessage
}
from
'element-plus'
import
SensitiveTypeDialog
from
'./SensitiveTypeDialog.vue'
import
useAppStore
from
'@/store/modules/app'
import
SensitiveTypeDialog
from
'./modules/SensitiveTypeDialog.vue'
import
{
querybyprojectid
,
querydatasystem
}
from
'@/api/discover/index'
const
emit
=
defineEmits
([
'confirm'
])
const
appStore
=
useAppStore
()
const
props
=
defineProps
({
listItem
:
{
type
:
Object
,
default
:
()
=>
({})
},
addEditType
:{
type
:
String
,
default
:
''
}
})
const
emit
=
defineEmits
([
'page'
,
'confirm'
])
const
backListPage
=
()
=>
{
emit
(
'page'
,
'list'
)
}
const
loginUser
=
{
tsysUser
:
{
id
:
appStore
.
userInfo
.
user
.
id
,
username
:
appStore
.
userInfo
.
user
.
username
}
}
const
dialogVisible
=
ref
(
false
)
const
dialogVisible
=
ref
(
false
)
const
currentStep
=
ref
(
1
)
const
currentStep
=
ref
(
1
)
...
@@ -251,12 +281,12 @@ const selectedRules = ref([
...
@@ -251,12 +281,12 @@ const selectedRules = ref([
const
sensitiveTypes
=
ref
([
'电子邮件'
,
'混合证件号'
])
const
sensitiveTypes
=
ref
([
'电子邮件'
,
'混合证件号'
])
// 步骤1数据
// 步骤1数据
const
formData
=
reactive
({
const
formData
=
reactive
({
t
name
:
'123
'
,
t
askname
:
'
'
,
remark
:
''
remark
:
''
})
})
const
rules
=
{
const
rules
=
{
tname
:
[
t
ask
name
:
[
{
required
:
true
,
message
:
'请填写发现任务名称'
,
trigger
:
'blur'
}
{
required
:
true
,
message
:
'请填写发现任务名称'
,
trigger
:
'blur'
}
]
]
}
}
...
@@ -337,6 +367,28 @@ const filteredTableList = computed(() => {
...
@@ -337,6 +367,28 @@ const filteredTableList = computed(() => {
)
)
})
})
onMounted
(()
=>
{
querybyprojectid
({
dataarea
:
""
,
projectid
:
sessionStorage
.
getItem
(
'projectId'
),
rulename
:
""
}).
then
(
res
=>
{
})
querydatasystem
({
discoverytype
:
1
,
projectid
:
sessionStorage
.
getItem
(
'projectId'
),
loginUser
:
loginUser
}).
then
(
res
=>
{
})
})
// 修改openDialog方法
// 修改openDialog方法
const
openDialog
=
(
row
=
null
)
=>
{
const
openDialog
=
(
row
=
null
)
=>
{
dialogVisible
.
value
=
true
dialogVisible
.
value
=
true
...
@@ -347,7 +399,7 @@ const openDialog = (row = null) => {
...
@@ -347,7 +399,7 @@ const openDialog = (row = null) => {
// 编辑模式
// 编辑模式
currentEditId
.
value
=
row
.
id
currentEditId
.
value
=
row
.
id
// 填充步骤1数据
// 填充步骤1数据
formData
.
t
name
=
row
.
t
name
formData
.
t
askname
=
row
.
task
name
formData
.
remark
=
row
.
remark
formData
.
remark
=
row
.
remark
// 填充步骤2数据(根据实际业务数据调整)
// 填充步骤2数据(根据实际业务数据调整)
...
@@ -371,7 +423,7 @@ const openDialog = (row = null) => {
...
@@ -371,7 +423,7 @@ const openDialog = (row = null) => {
}
}
const
resetForm
=
()
=>
{
const
resetForm
=
()
=>
{
formData
.
t
name
=
'123
'
formData
.
t
askname
=
'
'
formData
.
remark
=
''
formData
.
remark
=
''
selectedDataSource
.
value
=
'system1'
selectedDataSource
.
value
=
'system1'
selectedSchema
.
value
=
'ry'
selectedSchema
.
value
=
'ry'
...
@@ -392,7 +444,7 @@ const handleCancel = () => {
...
@@ -392,7 +444,7 @@ const handleCancel = () => {
const
handleNextStep
=
async
()
=>
{
const
handleNextStep
=
async
()
=>
{
if
(
currentStep
.
value
===
1
)
{
if
(
currentStep
.
value
===
1
)
{
if
(
!
formData
.
tname
.
trim
())
{
if
(
!
formData
.
t
ask
name
.
trim
())
{
ElMessage
.
error
(
'请填写发现任务名称'
)
ElMessage
.
error
(
'请填写发现任务名称'
)
return
return
}
}
...
@@ -500,7 +552,7 @@ defineExpose({
...
@@ -500,7 +552,7 @@ defineExpose({
display
:
flex
;
display
:
flex
;
flex-direction
:
column
;
flex-direction
:
column
;
align-items
:
center
;
align-items
:
center
;
min-width
:
1
00px
;
min-width
:
2
00px
;
&.step-active
{
&.step-active
{
.step-number
{
.step-number
{
...
...
src/views/discover/Discover/index.vue
View file @
8f28908e
<
script
setup
lang=
"ts"
name=
"projectManageIndex"
>
<
script
setup
lang=
"ts"
name=
"projectManageIndex"
>
import
{
ref
}
from
'vue'
import
{
ref
}
from
'vue'
import
list
from
'./list.vue'
import
list
from
'./list.vue'
import
addEditDiscovery
from
'./addEditDiscovery.vue'
import
discoverProcess
from
'./discoverProcess.vue'
import
discoverProcess
from
'./discoverProcess.vue'
import
discoverResult
from
'./discoverResult.vue'
import
discoverResult
from
'./discoverResult.vue'
import
discoverHistory
from
'./discoverHistory.vue'
import
discoverHistory
from
'./discoverHistory.vue'
const
widget
=
{
const
widget
=
{
list
:
list
,
list
:
list
,
addEditDiscovery
:
addEditDiscovery
,
discoverProcess
:
discoverProcess
,
discoverProcess
:
discoverProcess
,
discoverResult
:
discoverResult
,
discoverResult
:
discoverResult
,
discoverHistory
:
discoverHistory
discoverHistory
:
discoverHistory
...
...
src/views/discover/Discover/list.vue
View file @
8f28908e
<
script
setup
name=
"ProjectManageList"
>
<
script
setup
name=
"ProjectManageList"
>
import
{
getCurrentInstance
,
reactive
,
ref
,
toRefs
}
from
'vue'
import
{
getCurrentInstance
,
reactive
,
ref
,
toRefs
,
onMounted
}
from
'vue'
import
{
ElMessage
,
ElMessageBox
}
from
'element-plus'
import
{
ElMessage
,
ElMessageBox
}
from
'element-plus'
import
{
useRouter
}
from
'vue-router'
import
{
useRouter
}
from
'vue-router'
...
@@ -8,9 +8,16 @@ import usePermissionStore from '@/store/modules/permission'
...
@@ -8,9 +8,16 @@ import usePermissionStore from '@/store/modules/permission'
import
{
changeRoute
}
from
'@/utils/switchRoute'
import
{
changeRoute
}
from
'@/utils/switchRoute'
import
QueryForm
from
'./QueryForm.vue'
import
QueryForm
from
'./QueryForm.vue'
import
AddDiscoveryDialog
from
'./modules/AddDiscoveryDialog.vue'
// 引入新增发现任务弹窗
//
import AddDiscoveryDialog from './modules/AddDiscoveryDialog.vue' // 引入新增发现任务弹窗
import
SmartDiscoveryDialog
from
'./modules/SmartDiscoveryDialog.vue'
import
SmartDiscoveryDialog
from
'./modules/SmartDiscoveryDialog.vue'
import
{
queryDiscoverList
}
from
'@/api/discover/index'
const
appStore
=
useAppStore
()
const
appStore
=
useAppStore
()
const
permissionStore
=
usePermissionStore
()
const
permissionStore
=
usePermissionStore
()
const
router
=
useRouter
()
const
router
=
useRouter
()
...
@@ -20,6 +27,10 @@ const { proxy } = getCurrentInstance()
...
@@ -20,6 +27,10 @@ const { proxy } = getCurrentInstance()
// 新增发现任务弹窗引用
// 新增发现任务弹窗引用
const
addDiscoveryDialogRef
=
ref
()
const
addDiscoveryDialogRef
=
ref
()
onMounted
(()
=>
{
handleQuery
()
})
function
onReset
(
formQuery
)
{
function
onReset
(
formQuery
)
{
console
.
log
(
'onReset'
)
console
.
log
(
'onReset'
)
formQuery
.
resetFields
()
formQuery
.
resetFields
()
...
@@ -38,48 +49,73 @@ function handleQuery() {
...
@@ -38,48 +49,73 @@ function handleQuery() {
}
}
// 表格数据
// 表格数据
const
tableData
=
ref
([
const
tableData
=
ref
([
{
//
{
id
:
1
,
//
id: 1,
taskName
:
'22'
,
//
taskName: '22',
result
:
'0/225'
,
//
result: '0/225',
dbType
:
'MYSQL'
,
//
dbType: 'MYSQL',
operator
:
'admin'
,
//
operator: 'admin',
createTime
:
'2025-08-21 16:55:30'
,
//
createTime: '2025-08-21 16:55:30',
updateTime
:
'2025-08-21 16:55:30'
,
//
updateTime: '2025-08-21 16:55:30',
remark
:
''
,
//
remark: '',
projectid
:
"ec132fb8-04f0-4c0f-8460-c2a0ac4015d5"
,
//
projectid: "ec132fb8-04f0-4c0f-8460-c2a0ac4015d5",
resultid
:
"R_1755845361051"
,
//
resultid: "R_1755845361051",
datasystemid
:
"ff80818198986db40198c5933e5902e7"
,
//
datasystemid: "ff80818198986db40198c5933e5902e7",
},
//
},
{
//
{
id
:
2
,
//
id: 2,
taskName
:
'小王'
,
//
taskName: '小王',
result
:
'2/225'
,
//
result: '2/225',
dbType
:
'MYSQL'
,
//
dbType: 'MYSQL',
operator
:
'admin'
,
//
operator: 'admin',
createTime
:
'2025-08-21 16:55:30'
,
//
createTime: '2025-08-21 16:55:30',
updateTime
:
'2025-08-21 16:55:30'
,
//
updateTime: '2025-08-21 16:55:30',
remark
:
''
//
remark: ''
}
//
}
])
])
const
data
=
reactive
({
const
data
=
reactive
({
queryParams
:
{
queryParams
:
{
pageNum
:
1
,
pageno
:
1
,
pageSize
:
8
pagesize
:
10
,
project
:
sessionStorage
.
getItem
(
'projectName'
)
||
''
,
projectid
:
sessionStorage
.
getItem
(
'projectId'
)
||
''
}
}
})
})
// 表格数据
// 表格数据
const
{
queryParams
}
=
toRefs
(
data
)
const
{
queryParams
}
=
toRefs
(
data
)
const
total
=
ref
(
3
)
const
total
=
ref
(
0
)
const
loading
=
ref
(
false
)
const
loading
=
ref
(
false
)
// 查询列表
// 查询列表
function
getList
()
{
function
getList
()
{
loading
.
value
=
true
loading
.
value
=
true
setTimeout
(()
=>
{
queryDiscoverList
(
queryParams
.
value
).
then
(
res
=>
{
console
.
log
(
res
)
if
(
res
.
flag
){
tableData
.
value
=
res
.
data
.
list
.
map
(
item
=>
({
...
item
,
id
:
item
.
id
,
taskName
:
item
.
tname
,
result
:
item
.
countResult
,
dbType
:
item
.
dbtype
,
operator
:
item
.
username
,
createTime
:
item
.
createtime
,
updateTime
:
item
.
updatetime
,
remark
:
item
.
note
}))
loading
.
value
=
false
}
else
{
tableData
.
value
=
[]
loading
.
value
=
false
loading
.
value
=
false
},
3000
)
ElMessage
.
error
(
res
.
msg
)
}
}).
catch
((
err
)
=>
{
tableData
.
value
=
[]
loading
.
value
=
false
console
.
log
(
err
)
ElMessage
.
error
(
res
.
msg
)
})
}
}
function
pageProjectManage
()
{
function
pageProjectManage
()
{
...
@@ -95,7 +131,8 @@ function pageProjectManage() {
...
@@ -95,7 +131,8 @@ function pageProjectManage() {
*/
*/
function
handleAdd
(){
function
handleAdd
(){
console
.
log
(
'新增发现任务'
)
console
.
log
(
'新增发现任务'
)
addDiscoveryDialogRef
.
value
.
openDialog
()
// addDiscoveryDialogRef.value.openDialog()
emit
(
'page'
,
'addEditDiscovery'
,
{
listItem
:
null
,
addEditType
:
'add'
})
}
}
// 操作处理函数
// 操作处理函数
const
handleEdit
=
(
row
)
=>
{
const
handleEdit
=
(
row
)
=>
{
...
@@ -381,7 +418,7 @@ const handleAddEditConfirm = (submitData, isEditMode) =>{
...
@@ -381,7 +418,7 @@ const handleAddEditConfirm = (submitData, isEditMode) =>{
</div>
</div>
<!-- 新增/编辑发现任务弹窗 -->
<!-- 新增/编辑发现任务弹窗 -->
<
AddDiscoveryDialog
ref=
"addDiscoveryDialogRef"
@
confirm=
"handleAddEditConfirm"
/
>
<
!-- <AddDiscoveryDialog ref="addDiscoveryDialogRef" @confirm="handleAddEditConfirm" /> --
>
<SmartDiscoveryDialog
<SmartDiscoveryDialog
v-model=
"smartDiscoveryDialogVisible"
v-model=
"smartDiscoveryDialogVisible"
ref=
"smartDiscoveryDialogRef"
ref=
"smartDiscoveryDialogRef"
...
...
src/views/project/Project/list.vue
View file @
8f28908e
...
@@ -208,6 +208,7 @@ const handleEnterProject = (project) => {
...
@@ -208,6 +208,7 @@ const handleEnterProject = (project) => {
console
.
log
(
'进入项目:'
,
project
)
console
.
log
(
'进入项目:'
,
project
)
changeRoute
()
changeRoute
()
sessionStorage
.
setItem
(
'projectId'
,
project
.
id
)
sessionStorage
.
setItem
(
'projectId'
,
project
.
id
)
sessionStorage
.
setItem
(
'projectName'
,
project
.
project
)
router
.
push
({
path
:
'/indexManage/ItemManage'
,
query
:
{
projectId
:
project
.
id
}
})
router
.
push
({
path
:
'/indexManage/ItemManage'
,
query
:
{
projectId
:
project
.
id
}
})
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论