feat: 增加知识库新类型FAQ知识库

This commit is contained in:
2026-02-24 13:07:14 +08:00
parent e27ba8d457
commit a9060ed2b9
27 changed files with 1701 additions and 58 deletions

View File

@@ -1,19 +1,21 @@
<script setup lang="ts">
import { onMounted, ref } from 'vue';
import { useRoute, useRouter } from 'vue-router';
import {computed, onMounted, ref} from 'vue';
import {useRoute, useRouter} from 'vue-router';
import { $t } from '@easyflow/locales';
import {$t} from '@easyflow/locales';
import { ArrowLeft, Plus } from '@element-plus/icons-vue';
import { ElIcon, ElImage } from 'element-plus';
import {ArrowLeft, Plus} from '@element-plus/icons-vue';
import {ElIcon, ElImage} from 'element-plus';
import { api } from '#/api/request';
import {api} from '#/api/request';
import bookIcon from '#/assets/ai/knowledge/book.svg';
import HeaderSearch from '#/components/headerSearch/HeaderSearch.vue';
import PageSide from '#/components/page/PageSide.vue';
import ChunkDocumentTable from '#/views/ai/documentCollection/ChunkDocumentTable.vue';
import DocumentCollectionDataConfig from '#/views/ai/documentCollection/DocumentCollectionDataConfig.vue';
import DocumentCollectionDataConfig
from '#/views/ai/documentCollection/DocumentCollectionDataConfig.vue';
import DocumentTable from '#/views/ai/documentCollection/DocumentTable.vue';
import FaqTable from '#/views/ai/documentCollection/FaqTable.vue';
import ImportKnowledgeDocFile from '#/views/ai/documentCollection/ImportKnowledgeDocFile.vue';
import KnowledgeSearch from '#/views/ai/documentCollection/KnowledgeSearch.vue';
import KnowledgeSearchConfig from '#/views/ai/documentCollection/KnowledgeSearchConfig.vue';
@@ -24,6 +26,21 @@ const router = useRouter();
const knowledgeId = ref<string>((route.query.id as string) || '');
const activeMenu = ref<string>((route.query.activeMenu as string) || '');
const knowledgeInfo = ref<any>({});
const selectedCategory = ref('');
const defaultSelectedMenu = ref('');
const resolveDefaultMenu = (collectionType: string, menuKey: string) => {
const faqMenus = new Set(['faqList', 'knowledgeSearch', 'config']);
const documentMenus = new Set(['documentList', 'knowledgeSearch', 'config']);
const fallbackMenu = collectionType === 'FAQ' ? 'faqList' : 'documentList';
if (!menuKey) {
return fallbackMenu;
}
const validMenuSet = collectionType === 'FAQ' ? faqMenus : documentMenus;
return validMenuSet.has(menuKey) ? menuKey : fallbackMenu;
};
const getKnowledge = () => {
api
.get('/api/v1/documentCollection/detail', {
@@ -32,23 +49,36 @@ const getKnowledge = () => {
.then((res) => {
if (res.errorCode === 0) {
knowledgeInfo.value = res.data;
const initialMenu = resolveDefaultMenu(
res.data.collectionType || 'DOCUMENT',
activeMenu.value,
);
defaultSelectedMenu.value = initialMenu;
selectedCategory.value = initialMenu;
}
});
};
onMounted(() => {
if (activeMenu.value) {
defaultSelectedMenu.value = activeMenu.value;
}
getKnowledge();
});
const back = () => {
router.push({ path: '/ai/documentCollection' });
};
const categoryData = [
{ key: 'documentList', name: $t('documentCollection.documentList') },
{ key: 'knowledgeSearch', name: $t('documentCollection.knowledgeRetrieval') },
{ key: 'config', name: $t('documentCollection.config') },
];
const isFaqCollection = computed(() => knowledgeInfo.value.collectionType === 'FAQ');
const categoryData = computed(() => {
if (isFaqCollection.value) {
return [
{ key: 'faqList', name: $t('documentCollection.faq.faqList') },
{ key: 'knowledgeSearch', name: $t('documentCollection.knowledgeRetrieval') },
{ key: 'config', name: $t('documentCollection.config') },
];
}
return [
{ key: 'documentList', name: $t('documentCollection.documentList') },
{ key: 'knowledgeSearch', name: $t('documentCollection.knowledgeRetrieval') },
{ key: 'config', name: $t('documentCollection.config') },
];
});
const headerButtons = [
{
key: 'importFile',
@@ -59,7 +89,6 @@ const headerButtons = [
},
];
const isImportFileVisible = ref(false);
const selectedCategory = ref('documentList');
const documentTableRef = ref();
const handleSearch = (searchParams: string) => {
documentTableRef.value.search(searchParams);
@@ -91,7 +120,6 @@ const viewDoc = (docId: string) => {
const backDoc = () => {
isImportFileVisible.value = false;
};
const defaultSelectedMenu = ref('documentList');
</script>
<template>
@@ -127,6 +155,7 @@ const defaultSelectedMenu = ref('documentList');
<div v-if="selectedCategory === 'documentList'" class="doc-table">
<div class="doc-header" v-if="!viewDocVisible">
<HeaderSearch
v-if="!isFaqCollection"
:buttons="headerButtons"
@search="handleSearch"
@button-click="handleButtonClick"
@@ -145,6 +174,9 @@ const defaultSelectedMenu = ref('documentList');
:default-summary-prompt="knowledgeInfo.summaryPrompt"
/>
</div>
<div v-if="selectedCategory === 'faqList'" class="doc-table">
<FaqTable :knowledge-id="knowledgeId" />
</div>
<!--知识检索-->
<div
v-if="selectedCategory === 'knowledgeSearch'"