'use client'; import React, { useState, useEffect } from 'react'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { Alert, AlertDescription } from '@/components/ui/alert'; import { Loader2, Database, CheckCircle, AlertTriangle, RefreshCw, Trash2, BarChart3 } from 'lucide-react'; interface ConnectionStats { total: number; user: number; infrastructure: number; other: number; details: Array<{ id: number; host: string; time: number; state: string; type: 'user' | 'infrastructure' | 'other'; }>; } interface CleanupResult { success: boolean; message: string; data: { killedCount: number; details: { userRealIP?: string; infrastructureIPs?: string[]; cleanedConnections: Array<{ id: number; host: string; time: number; state: string; }>; }; }; } export default function SmartCleanupTestPage() { const [stats, setStats] = useState(null); const [loading, setLoading] = useState(false); const [message, setMessage] = useState(''); const [error, setError] = useState(''); // 獲取連線統計 const fetchStats = async () => { try { setLoading(true); const response = await fetch('/api/smart-cleanup'); const data = await response.json(); if (data.success) { setStats(data.data.stats); setMessage('連線統計更新成功'); setError(''); } else { setError(data.error || '獲取連線統計失敗'); } } catch (err) { setError('網路錯誤: ' + (err instanceof Error ? err.message : '未知錯誤')); } finally { setLoading(false); } }; // 執行智能清理 const performSmartCleanup = async () => { try { setLoading(true); const response = await fetch('/api/smart-cleanup', { method: 'POST', headers: { 'Content-Type': 'application/json', }, }); const data: CleanupResult = await response.json(); if (data.success) { setMessage(`智能清理完成: ${data.message}`); setError(''); // 重新獲取統計 await fetchStats(); } else { setError(data.error || '智能清理失敗'); } } catch (err) { setError('清理錯誤: ' + (err instanceof Error ? err.message : '未知錯誤')); } finally { setLoading(false); } }; // 組件載入時獲取統計 useEffect(() => { fetchStats(); }, []); // 獲取類型顏色 const getTypeColor = (type: 'user' | 'infrastructure' | 'other') => { switch (type) { case 'user': return 'default'; case 'infrastructure': return 'destructive'; case 'other': return 'secondary'; default: return 'outline'; } }; // 獲取類型標籤 const getTypeLabel = (type: 'user' | 'infrastructure' | 'other') => { switch (type) { case 'user': return '用戶連線'; case 'infrastructure': return '基礎設施'; case 'other': return '其他'; default: return '未知'; } }; return (

智能連線清理測試

智能識別和清理用戶真實 IP 及基礎設施連線

{/* 連線統計概覽 */} {stats && ( 連線統計概覽 當前資料庫連線的分類統計
{stats.total}
總連線數
{stats.user}
用戶連線
{stats.infrastructure}
基礎設施
{stats.other}
其他
)} {/* 連線詳情 */} {stats && stats.details.length > 0 && ( 連線詳情 所有連線的詳細信息
{stats.details.map((conn, index) => (
{getTypeLabel(conn.type)} ID: {conn.id} {conn.host}
時間: {conn.time}s 狀態: {conn.state}
))}
)} {/* 功能說明 */} 智能清理功能

用戶連線清理

  • • 自動識別你的真實 IP (61-227-253-171)
  • • 清理所有來自你 IP 的連線
  • • 不影響其他用戶的連線
  • • 關閉網站時自動觸發

基礎設施連線清理

  • • 識別 AWS EC2 實例連線
  • • 識別 Vercel 服務器連線
  • • 可選清理基礎設施連線
  • • 保護網站正常運行
{/* 使用說明 */} 使用說明

刷新統計: 查看當前所有連線的分類統計

智能清理: 自動識別並清理你的真實 IP 連線

用戶連線: 來自你真實 IP 的連線,會被優先清理

基礎設施連線: Vercel/AWS 服務器連線,通常不清理

自動觸發: 關閉網站時會自動執行智能清理

{/* 訊息顯示 */} {message && ( {message} )} {error && ( {error} )}
); }