mirror of
https://github.com/1Panel-dev/MaxKB.git
synced 2025-12-26 01:33:05 +00:00
perf: Knowledge base workflow adjustment
This commit is contained in:
parent
9255089d8b
commit
d39a27f360
|
|
@ -1079,105 +1079,112 @@
|
|||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<slot></slot>
|
||||
</template>
|
||||
<!-- 文本文件 -->
|
||||
<template v-if="data.type === WorkflowType.DataSourceLocalNode">
|
||||
<div class="card-never border-r-6">
|
||||
<h5 class="p-8-12">
|
||||
{{ $t('common.param.outputParam') }}
|
||||
</h5>
|
||||
<!-- 文本文件 -->
|
||||
<template v-if="data.type === WorkflowType.DataSourceLocalNode">
|
||||
<div class="card-never border-r-6">
|
||||
<h5 class="p-8-12">
|
||||
{{ $t('common.param.outputParam') }}
|
||||
</h5>
|
||||
|
||||
<div class="p-8-12 border-t-dashed lighter">
|
||||
<div class="mb-8">
|
||||
{{ data.file_list || '-' }}
|
||||
<div class="p-8-12 border-t-dashed lighter">
|
||||
<div class="mb-8">
|
||||
{{ data.file_list || '-' }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<!-- 文档分段 -->
|
||||
<template v-if="data.type === WorkflowType.DocumentSplitNode">
|
||||
<div class="card-never border-r-6">
|
||||
<h5 class="p-8-12">
|
||||
{{ $t('common.param.inputParam') }}
|
||||
</h5>
|
||||
<div class="p-8-12 border-t-dashed lighter">
|
||||
<div v-for="(f, i) in data.result_list" :key="i" class="mb-8">
|
||||
<span class="color-secondary">{{ f.name }}:</span> {{ f.input_value }}
|
||||
</template>
|
||||
<!-- 文档分段 -->
|
||||
<template v-if="data.type === WorkflowType.DocumentSplitNode">
|
||||
<div class="card-never border-r-6">
|
||||
<h5 class="p-8-12">
|
||||
{{ $t('common.param.inputParam') }}
|
||||
</h5>
|
||||
<div class="p-8-12 border-t-dashed lighter">
|
||||
<div class="mb-8">
|
||||
<span class="color-secondary"
|
||||
>{{ $t('chat.executionDetails.paragraphRules') }}:</span
|
||||
>
|
||||
{{ data.split_strategy }}
|
||||
</div>
|
||||
<div class="mb-8">
|
||||
<span class="color-secondary">{{ $t('common.inputContent') }}:</span>
|
||||
{{ data.document_list }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-never border-r-6 mt-8">
|
||||
<h5 class="p-8-12">
|
||||
{{ $t('common.param.outputParam') }}(每个文档仅能预览前五个分段)
|
||||
</h5>
|
||||
<div class="p-8-12 border-t-dashed lighter">
|
||||
<el-radio-group v-model="currentParagraph" class="app-radio-button-group mb-8">
|
||||
<template
|
||||
v-for="(paragrapg, ParagraphIndex) in data.paragraph_list"
|
||||
:key="ParagraphIndex"
|
||||
>
|
||||
<el-radio-button :label="paragrapg.name" :value="ParagraphIndex" />
|
||||
<div class="card-never border-r-6 mt-8">
|
||||
<h5 class="p-8-12">
|
||||
{{ $t('common.param.outputParam') }}({{ $t('chat.executionDetails.documentSplitTip') }})
|
||||
</h5>
|
||||
<div class="p-8-12 border-t-dashed lighter">
|
||||
<el-radio-group v-model="currentParagraph" class="app-radio-button-group mb-8">
|
||||
<template
|
||||
v-for="(paragrapg, ParagraphIndex) in data.paragraph_list"
|
||||
:key="ParagraphIndex"
|
||||
>
|
||||
<el-radio-button :label="paragrapg.name" :value="ParagraphIndex" />
|
||||
</template>
|
||||
</el-radio-group>
|
||||
<template v-if="data.paragraph_list?.length > 0">
|
||||
<template
|
||||
v-for="(paragraph, pId) in data.paragraph_list?.[currentParagraph]?.paragraphs"
|
||||
:key="pId"
|
||||
>
|
||||
<ParagraphCard :data="paragraph" :content="paragraph.content" :index="pId">
|
||||
<template #footer>
|
||||
<span class="color-secondary">
|
||||
{{ $t('common.character') }}:{{ paragraph.content.length }}</span
|
||||
>
|
||||
</template>
|
||||
</ParagraphCard>
|
||||
</template>
|
||||
</template>
|
||||
</el-radio-group>
|
||||
<template v-if="data.paragraph_list?.length > 0">
|
||||
<template
|
||||
v-for="(paragraph, pId) in data.paragraph_list?.[currentParagraph]?.paragraphs"
|
||||
:key="pId"
|
||||
>
|
||||
<ParagraphCard :data="paragraph" :content="paragraph.content" :index="pId">
|
||||
<template #footer>
|
||||
<span class="color-secondary">
|
||||
{{ $t('common.character') }}:{{ paragraph.content.length }}</span
|
||||
>
|
||||
</template>
|
||||
</ParagraphCard>
|
||||
</template>
|
||||
</template>
|
||||
<template v-else> -</template>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<!-- 知识库写入 -->
|
||||
<template v-if="data.type === WorkflowType.KnowledgeWriteNode">
|
||||
<div class="card-never border-r-6">
|
||||
<h5 class="p-8-12">
|
||||
{{ $t('common.param.inputParam') }}
|
||||
</h5>
|
||||
<div class="p-8-12 border-t-dashed lighter">
|
||||
<div v-for="(f, i) in data.result_list" :key="i" class="mb-8">
|
||||
<span class="color-secondary">{{ f.name }}:</span> {{ f.input_value }}
|
||||
<template v-else> -</template>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-never border-r-6 mt-8">
|
||||
<h5 class="p-8-12">写入内容</h5>
|
||||
<div class="p-8-12 border-t-dashed lighter">
|
||||
<el-radio-group v-model="currentWriteContent" class="app-radio-button-group mb-8">
|
||||
<template
|
||||
v-for="(paragrapg, ParagraphIndex) in data.write_content"
|
||||
:key="ParagraphIndex"
|
||||
>
|
||||
<el-radio-button :label="paragrapg.name" :value="ParagraphIndex" />
|
||||
</template>
|
||||
</el-radio-group>
|
||||
<template v-if="data.write_content?.length > 0">
|
||||
<template
|
||||
v-for="(paragraph, pId) in data.write_content?.[currentWriteContent]?.paragraphs"
|
||||
:key="pId"
|
||||
>
|
||||
<ParagraphCard :data="paragraph" :content="paragraph.content" :index="pId">
|
||||
<template #footer>
|
||||
<span class="color-secondary">
|
||||
{{ $t('common.character') }}:{{ paragraph.content.length }}</span
|
||||
>
|
||||
</template>
|
||||
</ParagraphCard>
|
||||
</template>
|
||||
</template>
|
||||
<template v-else> -</template>
|
||||
</template>
|
||||
<!-- 知识库写入 -->
|
||||
<template v-if="data.type === WorkflowType.KnowledgeWriteNode">
|
||||
<div class="card-never border-r-6">
|
||||
<h5 class="p-8-12">
|
||||
{{ $t('common.param.inputParam') }}
|
||||
</h5>
|
||||
<div class="p-8-12 border-t-dashed lighter">
|
||||
<span class="color-secondary">{{$t('chat.executionDetails.subBlockLength')}}:</span>
|
||||
{{ data.size }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-never border-r-6 mt-8">
|
||||
<h5 class="p-8-12">{{$t('chat.executionDetails.writeContent')}}</h5>
|
||||
<div class="p-8-12 border-t-dashed lighter">
|
||||
<el-radio-group v-model="currentWriteContent" class="app-radio-button-group mb-8">
|
||||
<template
|
||||
v-for="(paragrapg, ParagraphIndex) in data.write_content"
|
||||
:key="ParagraphIndex"
|
||||
>
|
||||
<el-radio-button :label="paragrapg.name" :value="ParagraphIndex" />
|
||||
</template>
|
||||
</el-radio-group>
|
||||
<template v-if="data.write_content?.length > 0">
|
||||
<template
|
||||
v-for="(paragraph, pId) in data.write_content?.[currentWriteContent]
|
||||
?.paragraphs"
|
||||
:key="pId"
|
||||
>
|
||||
<ParagraphCard :data="paragraph" :content="paragraph.content" :index="pId">
|
||||
<template #footer>
|
||||
<span class="color-secondary">
|
||||
{{ $t('common.character') }}:{{ paragraph.content.length }}</span
|
||||
>
|
||||
</template>
|
||||
</ParagraphCard>
|
||||
</template>
|
||||
</template>
|
||||
<template v-else> -</template>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<slot></slot>
|
||||
</template>
|
||||
<template v-else>
|
||||
<div class="card-never border-r-6">
|
||||
|
|
|
|||
|
|
@ -85,7 +85,7 @@ export default {
|
|||
localUpload: 'Local Upload',
|
||||
urlPlaceholder: 'Please enter URL addresses, one per line',
|
||||
urlTitle: 'URL Address',
|
||||
urlErrorMessage: 'File type does not meet requirements'
|
||||
urlErrorMessage: 'File type does not meet requirements',
|
||||
},
|
||||
executionDetails: {
|
||||
title: 'Execution Details',
|
||||
|
|
@ -106,6 +106,10 @@ export default {
|
|||
noSubmit: 'No submission from user',
|
||||
errMessage: 'Error Log',
|
||||
knowedMessage: 'Known Information',
|
||||
documentSplitTip: 'Each document can preview only the first five segments',
|
||||
paragraphRules: 'Segmentation Rules',
|
||||
subBlockLength: 'Sub-block Length',
|
||||
writeContent: 'Content Written',
|
||||
},
|
||||
KnowledgeSource: {
|
||||
title: 'Knowledge Source',
|
||||
|
|
|
|||
|
|
@ -96,6 +96,7 @@ export default {
|
|||
next: 'Next',
|
||||
import: 'Start Import',
|
||||
preview: 'Apply',
|
||||
continueImporting: 'Continue Importing Documents',
|
||||
},
|
||||
tag: {
|
||||
label: 'Tag Management',
|
||||
|
|
|
|||
|
|
@ -83,7 +83,7 @@ export default {
|
|||
localUpload: '本地上传',
|
||||
urlPlaceholder: '请输入 URL 地址,每行一个地址',
|
||||
urlTitle: 'URL 地址',
|
||||
urlErrorMessage: '文件类型不符合要求'
|
||||
urlErrorMessage: '文件类型不符合要求',
|
||||
},
|
||||
executionDetails: {
|
||||
title: '执行详情',
|
||||
|
|
@ -104,6 +104,10 @@ export default {
|
|||
noSubmit: '用户未提交',
|
||||
errMessage: '错误日志',
|
||||
knowedMessage: '已知信息',
|
||||
documentSplitTip: '每个文档仅能预览前五个分段',
|
||||
paragraphRules: '分段规则',
|
||||
subBlockLength: '子分块长度',
|
||||
writeContent: '写入内容',
|
||||
},
|
||||
KnowledgeSource: {
|
||||
title: '知识来源',
|
||||
|
|
|
|||
|
|
@ -92,6 +92,7 @@ export default {
|
|||
next: '下一步',
|
||||
import: '开始导入',
|
||||
preview: '生成预览',
|
||||
continueImporting: '继续导入文档',
|
||||
},
|
||||
tag: {
|
||||
label: '标签管理',
|
||||
|
|
|
|||
|
|
@ -83,7 +83,7 @@ export default {
|
|||
localUpload: '本地上傳',
|
||||
urlPlaceholder: '請輸入 URL 地址,每行一個地址',
|
||||
urlTitle: 'URL 地址',
|
||||
urlErrorMessage: '文件类型不符合要求'
|
||||
urlErrorMessage: '文件类型不符合要求',
|
||||
},
|
||||
executionDetails: {
|
||||
title: '執行詳細',
|
||||
|
|
@ -104,6 +104,10 @@ export default {
|
|||
noSubmit: '用戶未提交',
|
||||
errMessage: '錯誤日誌',
|
||||
knowedMessage: '已知資訊',
|
||||
documentSplitTip: '每個文件僅能預覽前五個段落',
|
||||
paragraphRules: '分段規則',
|
||||
subBlockLength: '子分塊長度',
|
||||
writeContent: '寫入內容',
|
||||
},
|
||||
KnowledgeSource: {
|
||||
title: '知識來源',
|
||||
|
|
|
|||
|
|
@ -94,6 +94,7 @@ export default {
|
|||
next: '下一步',
|
||||
import: '開始導入',
|
||||
preview: '生成預覽',
|
||||
continueImporting: '繼續導入文檔',
|
||||
},
|
||||
tag: {
|
||||
label: '標籤管理',
|
||||
|
|
|
|||
|
|
@ -21,6 +21,9 @@
|
|||
</div>
|
||||
<template #footer>
|
||||
<el-button :loading="loading" @click="close">{{ $t('common.cancel') }}</el-button>
|
||||
<!-- <el-button v-if="active == 'result'" @click="continueImporting" :loading="loading">
|
||||
{{ $t('views.document.buttons.continueImporting') }}
|
||||
</el-button> -->
|
||||
<el-button
|
||||
v-if="base_form_list.length > 0 && active == 'knowledge_base'"
|
||||
:loading="loading"
|
||||
|
|
@ -43,6 +46,16 @@
|
|||
>
|
||||
{{ $t('views.document.buttons.import') }}
|
||||
</el-button>
|
||||
<!-- <el-button
|
||||
v-if="active == 'result'"
|
||||
type="primary"
|
||||
@click="
|
||||
router.push({
|
||||
path: `/knowledge/${id}/${folderId}/4/document`,
|
||||
})
|
||||
"
|
||||
>{{ $t('views.knowledge.ResultSuccess.buttons.toDocument') }}</el-button
|
||||
> -->
|
||||
</template>
|
||||
</el-drawer>
|
||||
</template>
|
||||
|
|
@ -54,13 +67,14 @@ import applicationApi from '@/api/application/application'
|
|||
import KnowledgeBase from '@/views/knowledge-workflow/component/action/KnowledgeBase.vue'
|
||||
import { WorkflowType } from '@/enums/application'
|
||||
import { loadSharedApi } from '@/utils/dynamics-api/shared-api.ts'
|
||||
import { useRoute } from 'vue-router'
|
||||
import { useRoute, useRouter } from 'vue-router'
|
||||
provide('upload', (file: any, loading?: Ref<boolean>) => {
|
||||
return applicationApi.postUploadFile(file, id, 'KNOWLEDGE', loading)
|
||||
})
|
||||
const router = useRouter()
|
||||
const route = useRoute()
|
||||
const {
|
||||
params: { id },
|
||||
params: { id, folderId },
|
||||
/*
|
||||
id 为 knowledge_id
|
||||
*/
|
||||
|
|
@ -125,6 +139,10 @@ const upload = () => {
|
|||
})
|
||||
})
|
||||
}
|
||||
const continueImporting = () => {
|
||||
action_id.value = undefined
|
||||
active.value = 'data_source'
|
||||
}
|
||||
defineExpose({ close, open })
|
||||
</script>
|
||||
<style lang="scss" scoped></style>
|
||||
|
|
|
|||
|
|
@ -48,12 +48,10 @@
|
|||
</el-button>
|
||||
<template #dropdown>
|
||||
<el-dropdown-menu>
|
||||
<a :href="shareUrl" target="_blank">
|
||||
<el-dropdown-item>
|
||||
<AppIcon iconName="app-create-chat" class="color-secondary"></AppIcon>
|
||||
{{ $t('views.workflow.operation.toImportDoc') }}
|
||||
</el-dropdown-item>
|
||||
</a>
|
||||
<el-dropdown-item @click="toImportDoc">
|
||||
<AppIcon iconName="app-create-chat" class="color-secondary"></AppIcon>
|
||||
{{ $t('views.workflow.operation.toImportDoc') }}
|
||||
</el-dropdown-item>
|
||||
|
||||
<el-dropdown-item @click="openHistory">
|
||||
<AppIcon iconName="app-history-outlined" class="color-secondary"></AppIcon>
|
||||
|
|
@ -466,37 +464,47 @@ function saveknowledge(bool?: boolean, back?: boolean) {
|
|||
const go = () => {
|
||||
if (route.path.includes('resource-management')) {
|
||||
return router.push({ path: get_resource_management_route() })
|
||||
} else if (route.path.includes('shared')) {
|
||||
} else if (route.path.includes('shared')) {
|
||||
return router.push({ path: get_shared_route() })
|
||||
} else {
|
||||
return router.push({ path: get_route() })
|
||||
}
|
||||
}
|
||||
|
||||
const get_shared_route = () => {
|
||||
const get_shared_route = () => {
|
||||
if (hasPermission([RoleConst.ADMIN, PermissionConst.SHARED_KNOWLEDGE_DOCUMENT_READ], 'OR')) {
|
||||
return `knowledge/${id}/shared/4/document`
|
||||
} else if (hasPermission([RoleConst.ADMIN, PermissionConst.SHARED_KNOWLEDGE_PROBLEM_READ], 'OR')) {
|
||||
} else if (
|
||||
hasPermission([RoleConst.ADMIN, PermissionConst.SHARED_KNOWLEDGE_PROBLEM_READ], 'OR')
|
||||
) {
|
||||
return `/knowledge/${id}/shared/4/problem`
|
||||
} else if (hasPermission([RoleConst.ADMIN, PermissionConst.SHARED_KNOWLEDGE_HIT_TEST_READ], 'OR')) {
|
||||
} else if (
|
||||
hasPermission([RoleConst.ADMIN, PermissionConst.SHARED_KNOWLEDGE_HIT_TEST_READ], 'OR')
|
||||
) {
|
||||
return `/knowledge/${id}/shared/4/hit-test`
|
||||
} else if (hasPermission([RoleConst.ADMIN, PermissionConst.SHARED_KNOWLEDGE_CHAT_USER_READ], 'OR')) {
|
||||
} else if (
|
||||
hasPermission([RoleConst.ADMIN, PermissionConst.SHARED_KNOWLEDGE_CHAT_USER_READ], 'OR')
|
||||
) {
|
||||
return `/knowledge/${id}/shared/4/chat-user`
|
||||
} else if (hasPermission([RoleConst.ADMIN, PermissionConst.SHARED_KNOWLEDGE_EDIT], 'OR')) {
|
||||
return `/knowledge/${id}/shared/4/setting`
|
||||
} else {
|
||||
return `/system/shared/knowledge`
|
||||
return `/system/shared/knowledge`
|
||||
}
|
||||
}
|
||||
|
||||
const get_resource_management_route = () => {
|
||||
if (hasPermission([RoleConst.ADMIN, PermissionConst.RESOURCE_KNOWLEDGE_DOCUMENT_READ],'OR')) {
|
||||
if (hasPermission([RoleConst.ADMIN, PermissionConst.RESOURCE_KNOWLEDGE_DOCUMENT_READ], 'OR')) {
|
||||
return `/knowledge/${id}/resource-management/4/document`
|
||||
} else if (hasPermission([RoleConst.ADMIN, PermissionConst.RESOURCE_KNOWLEDGE_PROBLEM_READ], 'OR')) {
|
||||
} else if (
|
||||
hasPermission([RoleConst.ADMIN, PermissionConst.RESOURCE_KNOWLEDGE_PROBLEM_READ], 'OR')
|
||||
) {
|
||||
return `/knowledge/${id}/resource-management/4/problem`
|
||||
} else if (hasPermission([RoleConst.ADMIN, PermissionConst.RESOURCE_KNOWLEDGE_HIT_TEST], 'OR')) {
|
||||
return `/knowledge/${id}/resource-management/4/hit-test`
|
||||
} else if (hasPermission([RoleConst.ADMIN, PermissionConst.RESOURCE_KNOWLEDGE_CHAT_USER_READ], 'OR')) {
|
||||
} else if (
|
||||
hasPermission([RoleConst.ADMIN, PermissionConst.RESOURCE_KNOWLEDGE_CHAT_USER_READ], 'OR')
|
||||
) {
|
||||
return `/knowledge/${id}/resource-management/4/chat-user`
|
||||
} else if (hasPermission([RoleConst.ADMIN, PermissionConst.RESOURCE_KNOWLEDGE_EDIT], 'OR')) {
|
||||
return `/knowledge/${id}/resource-management/4/setting`
|
||||
|
|
@ -507,20 +515,22 @@ const get_resource_management_route = () => {
|
|||
|
||||
const get_route = () => {
|
||||
const checkPermission = (permissionConst: Permission) => {
|
||||
return hasPermission([
|
||||
new ComplexPermission(
|
||||
[RoleConst.USER],
|
||||
[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(id)],
|
||||
[],
|
||||
'AND'
|
||||
),
|
||||
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
|
||||
permissionConst.getWorkspacePermissionWorkspaceManageRole,
|
||||
permissionConst.getKnowledgeWorkspaceResourcePermission(id),
|
||||
],'OR'
|
||||
return hasPermission(
|
||||
[
|
||||
new ComplexPermission(
|
||||
[RoleConst.USER],
|
||||
[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(id)],
|
||||
[],
|
||||
'AND',
|
||||
),
|
||||
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
|
||||
permissionConst.getWorkspacePermissionWorkspaceManageRole,
|
||||
permissionConst.getKnowledgeWorkspaceResourcePermission(id),
|
||||
],
|
||||
'OR',
|
||||
)
|
||||
}
|
||||
if (checkPermission(PermissionConst.KNOWLEDGE_DOCUMENT_READ)) {
|
||||
if (checkPermission(PermissionConst.KNOWLEDGE_DOCUMENT_READ)) {
|
||||
return `/knowledge/${id}/${folderId}/4/document`
|
||||
} else if (checkPermission(PermissionConst.KNOWLEDGE_PROBLEM_READ)) {
|
||||
return `/knowledge/${id}/${folderId}/4/problem`
|
||||
|
|
@ -535,6 +545,15 @@ const get_route = () => {
|
|||
}
|
||||
}
|
||||
|
||||
const toImportDoc = () => {
|
||||
router.push({
|
||||
path: `/knowledge/import/workflow/${folderId}`,
|
||||
query: {
|
||||
id: id,
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 定时保存
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -29,11 +29,12 @@
|
|||
'请选择文件格式',
|
||||
)
|
||||
"
|
||||
style="width: 240px"
|
||||
class="w-240"
|
||||
clearable
|
||||
multiple
|
||||
filterable
|
||||
allow-create
|
||||
filterable
|
||||
default-first-option
|
||||
>
|
||||
<template #label="{ label, value }">
|
||||
<span>{{ label }} </span>
|
||||
|
|
@ -60,7 +61,16 @@
|
|||
trigger: 'change',
|
||||
}"
|
||||
>
|
||||
<el-slider v-model="form_data.file_count_limit" show-input />
|
||||
<el-input-number
|
||||
v-model="form_data.file_count_limit"
|
||||
:min="1"
|
||||
:max="1000"
|
||||
:value-on-clear="0"
|
||||
controls-position="right"
|
||||
class="w-full"
|
||||
:step="1"
|
||||
:step-strictly="true"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item
|
||||
:label="
|
||||
|
|
@ -79,7 +89,16 @@
|
|||
trigger: 'change',
|
||||
}"
|
||||
>
|
||||
<el-slider v-model="form_data.file_size_limit" show-input />
|
||||
<el-input-number
|
||||
v-model="form_data.file_size_limit"
|
||||
:min="1"
|
||||
:max="1000"
|
||||
:value-on-clear="0"
|
||||
controls-position="right"
|
||||
class="w-full"
|
||||
:step="1"
|
||||
:step-strictly="true"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-card>
|
||||
|
|
|
|||
Loading…
Reference in New Issue