"use client" import { useState, useEffect, useRef } from "react" import { useParams, useRouter } from "next/navigation" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { Button } from "@/components/ui/button" import { Badge } from "@/components/ui/badge" import { Input } from "@/components/ui/input" import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" import { ArrowLeft, Database, Send, Loader2, Brain, RefreshCw, Settings, Table, BarChart3, Zap, Clock, HardDrive, FolderTree, } from "lucide-react" interface DataSource { id: string name: string nameCn: string description: string type: string status: string database?: string host?: string recordCount: number collections?: number latency?: number dataCategory?: string } interface Collection { name: string count: number indexes: number size: string } interface ChatMessage { role: "user" | "assistant" content: string timestamp: string } export default function DataSourceDetailPage() { const params = useParams() const router = useRouter() const sourceId = params.id as string const [loading, setLoading] = useState(true) const [source, setSource] = useState(null) const [collections, setCollections] = useState([]) const [activeTab, setActiveTab] = useState("overview") // AI查询 const [query, setQuery] = useState("") const [querying, setQuerying] = useState(false) const [messages, setMessages] = useState([]) const messagesEndRef = useRef(null) useEffect(() => { loadDataSource() }, [sourceId]) useEffect(() => { messagesEndRef.current?.scrollIntoView({ behavior: "smooth" }) }, [messages]) const loadDataSource = async () => { setLoading(true) try { const res = await fetch('/api/data-sources') const data = await res.json() if (data.success) { const found = data.sources.find((s: DataSource) => s.id === sourceId) if (found) { setSource(found) // 加载集合信息 if (found.database) { loadCollections(found.database) } } } } catch (error) { console.error('加载失败:', error) } finally { setLoading(false) } } const loadCollections = async (dbName: string) => { try { const res = await fetch(`/api/data-sources?action=collections&db=${dbName}`) const data = await res.json() if (data.success) { setCollections(data.collections || []) } } catch (error) { console.error('加载集合失败:', error) } } // AI查询 const handleQuery = async () => { if (!query.trim() || querying) return const userMsg: ChatMessage = { role: "user", content: query, timestamp: new Date().toLocaleTimeString("zh-CN", { hour: "2-digit", minute: "2-digit" }), } setMessages(prev => [...prev, userMsg]) setQuery("") setQuerying(true) try { // 构造针对特定数据库的查询 const enhancedQuery = source?.database ? `在 ${source.database} 数据库中查询: ${query}` : query const response = await fetch("/api/ai-chat", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ message: enhancedQuery }) }) const data = await response.json() setMessages(prev => [...prev, { role: "assistant", content: data.success ? data.response.content : `查询失败: ${data.error}`, timestamp: new Date().toLocaleTimeString("zh-CN", { hour: "2-digit", minute: "2-digit" }) }]) } catch (error: any) { setMessages(prev => [...prev, { role: "assistant", content: `错误: ${error.message}`, timestamp: new Date().toLocaleTimeString("zh-CN", { hour: "2-digit", minute: "2-digit" }) }]) } finally { setQuerying(false) } } const formatNumber = (num: number): string => { if (num >= 1000000000) return `${(num / 1000000000).toFixed(2)}B` if (num >= 1000000) return `${(num / 1000000).toFixed(1)}M` if (num >= 1000) return `${(num / 1000).toFixed(0)}K` return num.toLocaleString() } if (loading) { return (
) } if (!source) { return (
数据源不存在
) } return (
{/* 顶部导航 */}

{source.nameCn || source.name}

{source.database || source.name}

{source.status === 'connected' ? '已连接' : '待配置'}
{/* 统计卡片 */}
{formatNumber(source.recordCount)}
总记录数
{source.collections || 0}
集合数
{source.latency || 0}ms
延迟
实时
同步状态
{/* 标签页 */} 概览 AI查询 集合 统计 {/* 概览 */}

数据源信息

类型
{source.type.toUpperCase()}
分类
{source.dataCategory || '其他'}
主机
{source.host || 'localhost'}
数据库
{source.database || '-'}
功能描述
{source.description}
{/* AI查询 */} AI 查询 - {source.nameCn || source.name} {/* 消息区域 */}
{messages.length === 0 && (

输入查询命令,AI将在此数据库中搜索

例如: "查询前10条数据" 或 "统计用户分布"

)} {messages.map((msg, i) => (
{msg.content}
{msg.timestamp}
))} {querying && (
查询中...
)}
{/* 输入框 */}
setQuery(e.target.value)} onKeyPress={(e) => e.key === "Enter" && handleQuery()} placeholder={`在 ${source.database || source.name} 中查询...`} className="flex-1 bg-gray-50 border-0" />
{/* 集合列表 */}
{collections.length === 0 ? (

暂无集合数据

) : ( collections.map((coll, i) => (
{coll.name}
{formatNumber(coll.count)} 条 {coll.indexes} 索引 {coll.size}
)) )} {/* 统计 */}

统计图表开发中

) }