|
@@ -29,13 +29,20 @@
|
|
|
</el-button>
|
|
</el-button>
|
|
|
</div>
|
|
</div>
|
|
|
<div class="action-bar__right">
|
|
<div class="action-bar__right">
|
|
|
- <el-button v-permission="{ buttonCode: 'upload_doc', menuCode: 'sys_ai_knowledge_base' }" @click="openFileDrawer">
|
|
|
|
|
|
|
+ <el-button
|
|
|
|
|
+ v-permission="{ buttonCode: 'upload_doc', menuCode: 'sys_ai_knowledge_base' }"
|
|
|
|
|
+ @click="openFileDrawer"
|
|
|
|
|
+ >
|
|
|
<el-icon>
|
|
<el-icon>
|
|
|
<Upload />
|
|
<Upload />
|
|
|
</el-icon>
|
|
</el-icon>
|
|
|
{{ t('pages.knowledge.document.uploadFile') }}
|
|
{{ t('pages.knowledge.document.uploadFile') }}
|
|
|
</el-button>
|
|
</el-button>
|
|
|
- <el-button v-permission="{ buttonCode: 'add_md', menuCode: 'sys_ai_knowledge_base' }" type="primary" @click="openManualDrawer">
|
|
|
|
|
|
|
+ <el-button
|
|
|
|
|
+ v-permission="{ buttonCode: 'add_md', menuCode: 'sys_ai_knowledge_base' }"
|
|
|
|
|
+ type="primary"
|
|
|
|
|
+ @click="openManualDrawer"
|
|
|
|
|
+ >
|
|
|
<el-icon>
|
|
<el-icon>
|
|
|
<Plus />
|
|
<Plus />
|
|
|
</el-icon>
|
|
</el-icon>
|
|
@@ -57,24 +64,46 @@
|
|
|
v-loading="loading"
|
|
v-loading="loading"
|
|
|
border
|
|
border
|
|
|
>
|
|
>
|
|
|
- <el-table-column prop="title" :label="t('pages.knowledge.document.title')" min-width="220" />
|
|
|
|
|
|
|
+ <el-table-column
|
|
|
|
|
+ prop="title"
|
|
|
|
|
+ :label="t('pages.knowledge.document.title')"
|
|
|
|
|
+ min-width="220"
|
|
|
|
|
+ />
|
|
|
<el-table-column prop="type" :label="t('pages.knowledge.document.type')" width="100">
|
|
<el-table-column prop="type" :label="t('pages.knowledge.document.type')" width="100">
|
|
|
<template #default="{ row }">
|
|
<template #default="{ row }">
|
|
|
- <el-tag v-if="row.type === 'file'">{{ t('pages.knowledge.document.fileUpload') }}</el-tag>
|
|
|
|
|
|
|
+ <el-tag v-if="row.type === 'file'">{{
|
|
|
|
|
+ t('pages.knowledge.document.fileUpload')
|
|
|
|
|
+ }}</el-tag>
|
|
|
<el-tag v-if="row.type === 'manual'">{{ t('pages.knowledge.document.custom') }}</el-tag>
|
|
<el-tag v-if="row.type === 'manual'">{{ t('pages.knowledge.document.custom') }}</el-tag>
|
|
|
</template>
|
|
</template>
|
|
|
</el-table-column>
|
|
</el-table-column>
|
|
|
- <el-table-column prop="file_name" :label="t('pages.knowledge.document.fileName')" min-width="180" />
|
|
|
|
|
- <el-table-column prop="file_type" :label="t('pages.knowledge.document.fileType')" width="100" />
|
|
|
|
|
|
|
+ <el-table-column
|
|
|
|
|
+ prop="file_name"
|
|
|
|
|
+ :label="t('pages.knowledge.document.fileName')"
|
|
|
|
|
+ min-width="180"
|
|
|
|
|
+ />
|
|
|
|
|
+ <el-table-column
|
|
|
|
|
+ prop="file_type"
|
|
|
|
|
+ :label="t('pages.knowledge.document.fileType')"
|
|
|
|
|
+ width="100"
|
|
|
|
|
+ />
|
|
|
<el-table-column prop="source" :label="t('pages.knowledge.document.source')" width="110" />
|
|
<el-table-column prop="source" :label="t('pages.knowledge.document.source')" width="110" />
|
|
|
- <el-table-column prop="parse_status" :label="t('pages.knowledge.document.parseStatus')" width="120">
|
|
|
|
|
|
|
+ <el-table-column
|
|
|
|
|
+ prop="parse_status"
|
|
|
|
|
+ :label="t('pages.knowledge.document.parseStatus')"
|
|
|
|
|
+ width="120"
|
|
|
|
|
+ >
|
|
|
<template #default="{ row }">
|
|
<template #default="{ row }">
|
|
|
<el-tag :type="getStatusTagType(row.parse_status)">
|
|
<el-tag :type="getStatusTagType(row.parse_status)">
|
|
|
{{ row.parse_status ? stateMap?.[row.parse_status] : '-' }}
|
|
{{ row.parse_status ? stateMap?.[row.parse_status] : '-' }}
|
|
|
</el-tag>
|
|
</el-tag>
|
|
|
</template>
|
|
</template>
|
|
|
</el-table-column>
|
|
</el-table-column>
|
|
|
- <el-table-column prop="summary_status" :label="t('pages.knowledge.document.summaryStatus')" width="120">
|
|
|
|
|
|
|
+ <el-table-column
|
|
|
|
|
+ prop="summary_status"
|
|
|
|
|
+ :label="t('pages.knowledge.document.summaryStatus')"
|
|
|
|
|
+ width="120"
|
|
|
|
|
+ >
|
|
|
<template #default="{ row }">
|
|
<template #default="{ row }">
|
|
|
<el-tag :type="getStatusTagType(row.summary_status)">
|
|
<el-tag :type="getStatusTagType(row.summary_status)">
|
|
|
{{ row.parse_status ? stateMap?.[row.summary_status] : '-' }}
|
|
{{ row.parse_status ? stateMap?.[row.summary_status] : '-' }}
|
|
@@ -86,7 +115,11 @@
|
|
|
<span class="truncate-text">{{ row.error_message || '-' }}</span>
|
|
<span class="truncate-text">{{ row.error_message || '-' }}</span>
|
|
|
</template>
|
|
</template>
|
|
|
</el-table-column>
|
|
</el-table-column>
|
|
|
- <el-table-column prop="creationTime" :label="t('pages.knowledge.document.creationTime')" width="180" />
|
|
|
|
|
|
|
+ <el-table-column
|
|
|
|
|
+ prop="creationTime"
|
|
|
|
|
+ :label="t('pages.knowledge.document.creationTime')"
|
|
|
|
|
+ width="180"
|
|
|
|
|
+ />
|
|
|
<el-table-column :label="t('pages.knowledge.document.actions')" width="220" fixed="right">
|
|
<el-table-column :label="t('pages.knowledge.document.actions')" width="220" fixed="right">
|
|
|
<template #default="{ row }">
|
|
<template #default="{ row }">
|
|
|
<el-button
|
|
<el-button
|
|
@@ -98,8 +131,20 @@
|
|
|
>
|
|
>
|
|
|
{{ t('pages.knowledge.document.update') }}
|
|
{{ t('pages.knowledge.document.update') }}
|
|
|
</el-button>
|
|
</el-button>
|
|
|
- <el-button v-permission="{ buttonCode: 'rebuild_index', menuCode: 'sys_ai_knowledge_base' }" link type="warning" @click="reparseKnowledge(row.id)">{{ t('pages.knowledge.document.reparse') }}</el-button>
|
|
|
|
|
- <el-button v-permission="{ buttonCode: 'del_doc', menuCode: 'sys_ai_knowledge_base' }" link type="danger" @click="removeKnowledge(row.id)">{{ t('common.delete') }}</el-button>
|
|
|
|
|
|
|
+ <el-button
|
|
|
|
|
+ v-permission="{ buttonCode: 'rebuild_index', menuCode: 'sys_ai_knowledge_base' }"
|
|
|
|
|
+ link
|
|
|
|
|
+ type="warning"
|
|
|
|
|
+ @click="reparseKnowledge(row.id)"
|
|
|
|
|
+ >{{ t('pages.knowledge.document.reparse') }}</el-button
|
|
|
|
|
+ >
|
|
|
|
|
+ <el-button
|
|
|
|
|
+ v-permission="{ buttonCode: 'del_doc', menuCode: 'sys_ai_knowledge_base' }"
|
|
|
|
|
+ link
|
|
|
|
|
+ type="danger"
|
|
|
|
|
+ @click="removeKnowledge(row.id)"
|
|
|
|
|
+ >{{ t('common.delete') }}</el-button
|
|
|
|
|
+ >
|
|
|
</template>
|
|
</template>
|
|
|
</el-table-column>
|
|
</el-table-column>
|
|
|
<template #empty>{{ t('pages.knowledge.document.noContent') }}</template>
|
|
<template #empty>{{ t('pages.knowledge.document.noContent') }}</template>
|
|
@@ -107,13 +152,25 @@
|
|
|
<el-empty v-else :description="t('pages.knowledge.document.noContent')" class="page-empty" />
|
|
<el-empty v-else :description="t('pages.knowledge.document.noContent')" class="page-empty" />
|
|
|
</el-card>
|
|
</el-card>
|
|
|
<!-- 新建 -->
|
|
<!-- 新建 -->
|
|
|
- <el-drawer v-model="manualDrawerVisible" :title="t('pages.knowledge.document.createTitle')" direction="rtl" size="640px">
|
|
|
|
|
|
|
+ <el-drawer
|
|
|
|
|
+ v-model="manualDrawerVisible"
|
|
|
|
|
+ :title="t('pages.knowledge.document.createTitle')"
|
|
|
|
|
+ direction="rtl"
|
|
|
|
|
+ size="640px"
|
|
|
|
|
+ >
|
|
|
<el-form ref="manualFormRef" :model="manualForm" :rules="manualRules" label-position="top">
|
|
<el-form ref="manualFormRef" :model="manualForm" :rules="manualRules" label-position="top">
|
|
|
<el-form-item :label="t('pages.knowledge.document.title')" prop="title">
|
|
<el-form-item :label="t('pages.knowledge.document.title')" prop="title">
|
|
|
- <el-input v-model="manualForm.title" :placeholder="t('pages.knowledge.document.titlePlaceholder')" />
|
|
|
|
|
|
|
+ <el-input
|
|
|
|
|
+ v-model="manualForm.title"
|
|
|
|
|
+ :placeholder="t('pages.knowledge.document.titlePlaceholder')"
|
|
|
|
|
+ />
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
<el-form-item :label="t('pages.knowledge.document.contentLabel')" prop="content">
|
|
<el-form-item :label="t('pages.knowledge.document.contentLabel')" prop="content">
|
|
|
- <el-input v-model="manualForm.content" type="textarea" :placeholder="t('pages.knowledge.document.contentPlaceholder')" />
|
|
|
|
|
|
|
+ <el-input
|
|
|
|
|
+ v-model="manualForm.content"
|
|
|
|
|
+ type="textarea"
|
|
|
|
|
+ :placeholder="t('pages.knowledge.document.contentPlaceholder')"
|
|
|
|
|
+ />
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
<el-form-item :label="t('pages.knowledge.document.publish')">
|
|
<el-form-item :label="t('pages.knowledge.document.publish')">
|
|
|
<el-switch v-model="manualForm.publish" />
|
|
<el-switch v-model="manualForm.publish" />
|
|
@@ -129,7 +186,12 @@
|
|
|
</template>
|
|
</template>
|
|
|
</el-drawer>
|
|
</el-drawer>
|
|
|
<!-- 导入模版 -->
|
|
<!-- 导入模版 -->
|
|
|
- <el-drawer v-model="fileDrawerVisible" :title="t('pages.knowledge.document.importTitle')" direction="rtl" size="640px">
|
|
|
|
|
|
|
+ <el-drawer
|
|
|
|
|
+ v-model="fileDrawerVisible"
|
|
|
|
|
+ :title="t('pages.knowledge.document.importTitle')"
|
|
|
|
|
+ direction="rtl"
|
|
|
|
|
+ size="640px"
|
|
|
|
|
+ >
|
|
|
<el-form :model="fileForm" label-position="top">
|
|
<el-form :model="fileForm" label-position="top">
|
|
|
<el-form-item :label="t('pages.knowledge.document.uploadFile')">
|
|
<el-form-item :label="t('pages.knowledge.document.uploadFile')">
|
|
|
<FileUploadInput
|
|
<FileUploadInput
|
|
@@ -158,8 +220,14 @@
|
|
|
:key="`metadata-${index}`"
|
|
:key="`metadata-${index}`"
|
|
|
class="metadata-config__row"
|
|
class="metadata-config__row"
|
|
|
>
|
|
>
|
|
|
- <el-input v-model="item.key" :placeholder="t('pages.knowledge.document.metadataKeyPlaceholder')" />
|
|
|
|
|
- <el-input v-model="item.value" :placeholder="t('pages.knowledge.document.metadataValuePlaceholder')" />
|
|
|
|
|
|
|
+ <el-input
|
|
|
|
|
+ v-model="item.key"
|
|
|
|
|
+ :placeholder="t('pages.knowledge.document.metadataKeyPlaceholder')"
|
|
|
|
|
+ />
|
|
|
|
|
+ <el-input
|
|
|
|
|
+ v-model="item.value"
|
|
|
|
|
+ :placeholder="t('pages.knowledge.document.metadataValuePlaceholder')"
|
|
|
|
|
+ />
|
|
|
<el-button
|
|
<el-button
|
|
|
link
|
|
link
|
|
|
type="danger"
|
|
type="danger"
|
|
@@ -204,7 +272,10 @@
|
|
|
<el-form-item :label="t('pages.knowledge.document.title')" prop="title">
|
|
<el-form-item :label="t('pages.knowledge.document.title')" prop="title">
|
|
|
<el-input v-model="editForm.title" />
|
|
<el-input v-model="editForm.title" />
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
- <el-form-item :label="t('pages.knowledge.document.descriptionLabel')" class="edit-description-item">
|
|
|
|
|
|
|
+ <el-form-item
|
|
|
|
|
+ :label="t('pages.knowledge.document.descriptionLabel')"
|
|
|
|
|
+ class="edit-description-item"
|
|
|
|
|
+ >
|
|
|
<!-- <markdown v-if="!isEdit" :content="editForm.description" @click="isEdit = true" /> -->
|
|
<!-- <markdown v-if="!isEdit" :content="editForm.description" @click="isEdit = true" /> -->
|
|
|
<el-input
|
|
<el-input
|
|
|
v-model="editForm.description"
|
|
v-model="editForm.description"
|
|
@@ -286,8 +357,12 @@ const editForm = reactive<KnowledgeEditForm>({
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
const manualRules = {
|
|
const manualRules = {
|
|
|
- title: [{ required: true, message: t('pages.knowledge.document.titleRequired'), trigger: 'blur' }],
|
|
|
|
|
- content: [{ required: true, message: t('pages.knowledge.document.contentRequired'), trigger: 'blur' }]
|
|
|
|
|
|
|
+ title: [
|
|
|
|
|
+ { required: true, message: t('pages.knowledge.document.titleRequired'), trigger: 'blur' }
|
|
|
|
|
+ ],
|
|
|
|
|
+ content: [
|
|
|
|
|
+ { required: true, message: t('pages.knowledge.document.contentRequired'), trigger: 'blur' }
|
|
|
|
|
+ ]
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
const editRules = {
|
|
const editRules = {
|
|
@@ -472,6 +547,17 @@ async function submitEditKnowledge() {
|
|
|
|
|
|
|
|
async function reparseKnowledge(id?: string) {
|
|
async function reparseKnowledge(id?: string) {
|
|
|
if (!id) return
|
|
if (!id) return
|
|
|
|
|
+ const confirmed = await ElMessageBox.confirm(
|
|
|
|
|
+ t('pages.knowledge.document.confirmReparse'),
|
|
|
|
|
+ t('pages.knowledge.document.reparse'),
|
|
|
|
|
+ {
|
|
|
|
|
+ type: 'warning'
|
|
|
|
|
+ }
|
|
|
|
|
+ )
|
|
|
|
|
+ .then(() => true)
|
|
|
|
|
+ .catch(() => false)
|
|
|
|
|
+ if (!confirmed) return
|
|
|
|
|
+
|
|
|
await knowledge.postAiKnowledgeReparse({ id })
|
|
await knowledge.postAiKnowledgeReparse({ id })
|
|
|
ElMessage.success(t('pages.knowledge.document.reparseSuccess'))
|
|
ElMessage.success(t('pages.knowledge.document.reparseSuccess'))
|
|
|
await fetchKnowledgeList()
|
|
await fetchKnowledgeList()
|
|
@@ -479,9 +565,13 @@ async function reparseKnowledge(id?: string) {
|
|
|
|
|
|
|
|
async function removeKnowledge(id?: string) {
|
|
async function removeKnowledge(id?: string) {
|
|
|
if (!id) return
|
|
if (!id) return
|
|
|
- const confirmed = await ElMessageBox.confirm(t('pages.knowledge.document.confirmDelete'), t('pages.knowledge.document.deleteTitle'), {
|
|
|
|
|
- type: 'warning'
|
|
|
|
|
- })
|
|
|
|
|
|
|
+ const confirmed = await ElMessageBox.confirm(
|
|
|
|
|
+ t('pages.knowledge.document.confirmDelete'),
|
|
|
|
|
+ t('pages.knowledge.document.deleteTitle'),
|
|
|
|
|
+ {
|
|
|
|
|
+ type: 'warning'
|
|
|
|
|
+ }
|
|
|
|
|
+ )
|
|
|
.then(() => true)
|
|
.then(() => true)
|
|
|
.catch(() => false)
|
|
.catch(() => false)
|
|
|
if (!confirmed) return
|
|
if (!confirmed) return
|