import { useState, useEffect } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import { ArrowLeft, Database, Table2, Users, Cpu, Play } from 'lucide-react'; import { instanceDetailApi } from '@/api/instanceDetail'; import { instanceApi } from '@/api/instance'; import { queryApi } from '@/api/query'; import { ConfirmDialog } from '@/components/ConfirmDialog'; import DataDictionaryPanel from '@/components/DataDictionaryPanel'; interface InstanceInfo { id: number; name: string; db_type: string; host: string; port: number; status: string; version: string | null; env: string; } type TabKey = 'overview' | 'tables' | 'query' | 'users' | 'process'; export default function InstanceDetailPage() { var params = useParams<{ id: string }>(); var navigate = useNavigate(); var instanceId = Number(params.id); var [instance, setInstance] = useState(null); var [activeTab, setActiveTab] = useState('overview'); var [databases, setDatabases] = useState([]); var [selectedDb, setSelectedDb] = useState(''); var [users, setUsers] = useState([]); var [processes, setProcesses] = useState([]); var [sqlText, setSqlText] = useState(''); var [queryResult, setQueryResult] = useState(null); var [loading, setLoading] = useState(false); const [deleteConfirm, setDeleteConfirm] = useState<{msg: string; onConfirm: () => void} | null>(null); var tabs: { key: TabKey; label: string; icon: React.ElementType }[] = [ { key: 'overview', label: '概览', icon: Database }, { key: 'tables', label: '表结构', icon: Table2 }, { key: 'query', label: 'SQL查询', icon: Play }, { key: 'users', label: '用户权限', icon: Users }, { key: 'process', label: '进程列表', icon: Cpu }, ]; useEffect(function () { instanceApi.get(instanceId).then(function (res: any) { setInstance(res); }).catch(function () {}); }, [instanceId]); useEffect(function () { if (activeTab === 'overview' || activeTab === 'tables' || activeTab === 'query') { instanceDetailApi.listDatabases(instanceId).then(function (res: any) { var dbs = res.databases || res || []; setDatabases(Array.isArray(dbs) ? dbs : []); if (dbs.length > 0 && !selectedDb) setSelectedDb(dbs[0]); }).catch(function () { setDatabases([]); }); } if (activeTab === 'users') { instanceDetailApi.listUsers(instanceId).then(function (res: any) { setUsers(res.users || res || []); }).catch(function () { setUsers([]); }); } if (activeTab === 'process') { instanceDetailApi.getProcesslist(instanceId).then(function (res: any) { setProcesses(res.processes || res || []); }).catch(function () { setProcesses([]); }); } }, [activeTab, selectedDb, instanceId]); var handleQuery = function () { if (!sqlText.trim()) return; setLoading(true); queryApi.execute({ instance_id: instanceId, database: selectedDb, sql: sqlText }).then(function (res: any) { setQueryResult(res); }).catch(function (e: any) { setQueryResult({ error: e?.response?.data?.detail || '查询失败' }); }).finally(function () { setLoading(false); }); }; var handleKill = function (pid: number) { setDeleteConfirm({ msg: '确定 Kill 进程 ' + pid + '?', onConfirm: () => { instanceDetailApi.killProcess(instanceId, pid).then(() => { instanceDetailApi.getProcesslist(instanceId).then((res: any) => { setProcesses(res.processes || res || []); }); }); } }); return; }; if (!instance) return
加载中...
; return (
{/* 头部 */}

{instance.name}

{instance.host}:{instance.port} · {instance.version || '-'} · {instance.env}

{instance.status === 'connected' || instance.status === 'online' ? '在线' : '离线'}
{/* Tab 导航 */}
{tabs.map(function (tab) { var Icon = tab.icon; return ( ); })}
{/* 概览 */} {activeTab === 'overview' && (
{databases.length}
数据库
{instance.status === 'connected' ? '在线' : '离线'}
状态
{instance.version || '-'}
版本

数据库列表

{databases.map(function (db) { return
{db}
; })}
)} {/* 表管理 */} {activeTab === 'tables' && ( )} {/* SQL查询 */} {activeTab === 'query' && (