"use client"; import { useEffect, useState } from "react"; import { useRouter } from "next/navigation"; import { useAuthStore } from "@/store/auth"; import { Button } from "@/components/ui/button"; import MobileNav from "@/components/layout/mobile-nav"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Alert, AlertDescription } from "@/components/ui/alert"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger } from "@/components/ui/dialog"; import { Upload, FileText, Search, Plus, Trash2, Eye, CheckCircle, Clock, Loader2, BookOpen, Settings, FolderOpen } from "lucide-react"; import { formatFileSize, formatDate } from "@/lib/utils"; import { knowledgeBaseAPI } from "@/lib/api"; import { KnowledgeBase } from "@/types"; export default function KnowledgePage() { const router = useRouter(); const { isAuthenticated, isLoading: authLoading } = useAuthStore(); const [knowledgeBases, setKnowledgeBases] = useState([]); const [isLoading, setIsLoading] = useState(true); const [searchQuery, setSearchQuery] = useState(""); const [error, setError] = useState(null); // 创建知识库对话框状态 const [isCreateDialogOpen, setIsCreateDialogOpen] = useState(false); const [createName, setCreateName] = useState(""); const [createDescription, setCreateDescription] = useState(""); const [isCreating, setIsCreating] = useState(false); useEffect(() => { if (!authLoading && !isAuthenticated) { router.push("/login"); return; } if (isAuthenticated) { loadKnowledgeBases(); } }, [isAuthenticated, authLoading, router]); const loadKnowledgeBases = async () => { try { setIsLoading(true); setError(null); const bases = await knowledgeBaseAPI.getKnowledgeBases(); // 过滤掉系统知识库,只显示用户创建的知识库 const userBases = bases.filter(kb => !kb.is_system); setKnowledgeBases(userBases); } catch (err) { console.error("加载知识库失败:", err); setError("加载知识库失败"); } finally { setIsLoading(false); } }; const handleCreateKnowledgeBase = async () => { if (!createName.trim()) return; try { setIsCreating(true); setError(null); await knowledgeBaseAPI.createKnowledgeBase({ name: createName.trim(), description: createDescription.trim() || undefined, }); // 重新加载知识库列表 await loadKnowledgeBases(); // 重置表单并关闭对话框 setCreateName(""); setCreateDescription(""); setIsCreateDialogOpen(false); } catch (err) { console.error("创建知识库失败:", err); setError("创建知识库失败"); } finally { setIsCreating(false); } }; const handleDeleteKnowledgeBase = async (knowledgeBaseId: number) => { if (!confirm("确定要删除这个知识库吗?这将删除其中的所有文档。")) return; try { await knowledgeBaseAPI.deleteKnowledgeBase(knowledgeBaseId.toString()); await loadKnowledgeBases(); } catch (err) { console.error("删除知识库失败:", err); setError("删除知识库失败"); } }; const filteredKnowledgeBases = knowledgeBases.filter(kb => kb.name.toLowerCase().includes(searchQuery.toLowerCase()) || (kb.description && kb.description.toLowerCase().includes(searchQuery.toLowerCase())) ); if (authLoading || isLoading) { return (
); } if (!isAuthenticated) { return null; } return (
{/* 页面头部 */}

知识库管理

创建和管理您的知识库,组织文档内容

{/* 错误提示 */} {error && ( {error} )} {/* 操作栏 */}
{/* 创建知识库按钮 */} 创建新知识库 创建一个新的知识库来组织您的文档
setCreateName(e.target.value)} placeholder="请输入知识库名称" disabled={isCreating} />
setCreateDescription(e.target.value)} placeholder="请输入知识库描述" disabled={isCreating} />
setSearchQuery(e.target.value)} className="pl-10 w-64" />
共 {filteredKnowledgeBases.length} 个知识库
{/* 知识库列表 */} {filteredKnowledgeBases.length === 0 ? (

{searchQuery ? "没有找到匹配的知识库" : "还没有创建知识库"}

{searchQuery ? "尝试使用其他关键词搜索" : "创建您的第一个知识库来组织文档"}

{!searchQuery && ( )}
) : (
{filteredKnowledgeBases.map((kb) => (
{kb.name} {kb.description || "暂无描述"}
{kb.document_count > 0 ? ( ) : ( )}
文档数量 {kb.document_count} 个文档
创建时间 {formatDate(kb.created_at)}
状态 0 ? "text-green-600" : "text-gray-500"}> {kb.document_count > 0 ? "已就绪" : "空知识库"}
))}
)}
{/* 移动端导航 */}
); }