diff --git a/web/pages/KnowledgeBase.tsx b/web/pages/KnowledgeBase.tsx index c02fbf5..c2c2902 100644 --- a/web/pages/KnowledgeBase.tsx +++ b/web/pages/KnowledgeBase.tsx @@ -2,7 +2,7 @@ import React, { useEffect, useState, useRef } from 'react'; import { Search, Plus, FileText, Upload, ArrowLeft, CloudUpload, File as FileIcon, X, Pencil, Trash2, Settings2, MoreHorizontal } from 'lucide-react'; import { Button, Input, TableHeader, TableRow, TableHead, TableCell, Card, Dialog, Badge } from '../components/UI'; import { KnowledgeBase } from '../types'; -import { createKnowledgeBase, deleteKnowledgeBase, deleteKnowledgeDocument, fetchKnowledgeBases, fetchLLMModels, updateKnowledgeBase, uploadKnowledgeDocument } from '../services/backendApi'; +import { createKnowledgeBase, deleteKnowledgeBase, deleteKnowledgeDocument, fetchKnowledgeBaseById, fetchKnowledgeBases, fetchLLMModels, updateKnowledgeBase, uploadKnowledgeDocument } from '../services/backendApi'; const EMBEDDING_OPTIONS = [ 'text-embedding-3-small', @@ -19,6 +19,7 @@ export const KnowledgeBasePage: React.FC = () => { const [isKbModalOpen, setIsKbModalOpen] = useState(false); const [editingKb, setEditingKb] = useState(null); const [isLoading, setIsLoading] = useState(true); + const [isDetailLoading, setIsDetailLoading] = useState(false); const [embeddingOptions, setEmbeddingOptions] = useState(EMBEDDING_OPTIONS); const [hasDbEmbeddingModels, setHasDbEmbeddingModels] = useState(false); const [openMenuKbId, setOpenMenuKbId] = useState(null); @@ -79,9 +80,19 @@ export const KnowledgeBasePage: React.FC = () => { return () => document.removeEventListener('click', onDocClick); }, []); - const handleSelect = (kb: KnowledgeBase) => { + const handleSelect = async (kb: KnowledgeBase) => { setSelectedKb(kb); setView('detail'); + setIsDetailLoading(true); + try { + const fullKb = await fetchKnowledgeBaseById(kb.id); + setSelectedKb(fullKb); + } catch (error: any) { + console.error(error); + alert(error?.message || '加载知识库详情失败。'); + } finally { + setIsDetailLoading(false); + } }; const openCreateKb = () => { @@ -169,22 +180,26 @@ export const KnowledgeBasePage: React.FC = () => { if (view === 'detail' && selectedKb) { return (
- setView('list')} - onImport={() => setIsUploadOpen(true)} - onEdit={() => openEditKb(selectedKb)} - onDelete={() => handleDeleteKb(selectedKb)} - onDeleteDocument={async (docId) => { - try { - await deleteKnowledgeDocument(selectedKb.id, docId); - await refreshKnowledgeBases(); - } catch (error: any) { - console.error(error); - alert(error?.message || '删除文档失败。'); - } - }} - /> + {isDetailLoading ? ( +
知识库详情加载中...
+ ) : ( + setView('list')} + onImport={() => setIsUploadOpen(true)} + onEdit={() => openEditKb(selectedKb)} + onDelete={() => handleDeleteKb(selectedKb)} + onDeleteDocument={async (docId) => { + try { + await deleteKnowledgeDocument(selectedKb.id, docId); + await refreshKnowledgeBases(); + } catch (error: any) { + console.error(error); + alert(error?.message || '删除文档失败。'); + } + }} + /> + )} { setKbChunkSize={setKbChunkSize} kbChunkOverlap={kbChunkOverlap} setKbChunkOverlap={setKbChunkOverlap} + embeddingOptions={embeddingOptions} + hasDbEmbeddingModels={hasDbEmbeddingModels} />
); diff --git a/web/services/backendApi.ts b/web/services/backendApi.ts index 6515322..82625d5 100644 --- a/web/services/backendApi.ts +++ b/web/services/backendApi.ts @@ -527,6 +527,11 @@ export const fetchKnowledgeBases = async (): Promise => { return list.map((item) => mapKnowledgeBase(item)); }; +export const fetchKnowledgeBaseById = async (kbId: string): Promise => { + const response = await apiRequest(`/knowledge/bases/${kbId}`); + return mapKnowledgeBase(response); +}; + export const createKnowledgeBase = async (data: { name: string; description?: string;