import { useState, useEffect } from "react"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Progress } from "@/components/ui/progress"; import { HardDrive, RefreshCw, Info, CheckCircle2, AlertCircle, FolderOpen, Clock, AlertTriangle, TrendingUp, Package, Settings } from "lucide-react"; import { api, dbMode } from "@/shared/config/database"; import { DatabaseManager } from "@/components/database/DatabaseManager"; import { SystemConfig } from "@/components/system/SystemConfig"; import { toast } from "sonner"; export default function AdminDashboard() { const [stats, setStats] = useState({ totalProjects: 0, activeProjects: 0, totalTasks: 0, completedTasks: 0, totalIssues: 0, resolvedIssues: 0, storageUsed: '计算中...', storageQuota: '未知' }); const [loading, setLoading] = useState(true); const [storageDetails, setStorageDetails] = useState<{ usage: number; quota: number; percentage: number; } | null>(null); useEffect(() => { loadStats(); }, []); const loadStats = async () => { try { setLoading(true); const projectStats = await api.getProjectStats(); // 获取存储使用量(IndexedDB) let storageUsed = '未知'; let storageQuota = '未知'; let details = null; if ('storage' in navigator && 'estimate' in navigator.storage) { try { const estimate = await navigator.storage.estimate(); const usedMB = ((estimate.usage || 0) / 1024 / 1024).toFixed(2); const quotaMB = ((estimate.quota || 0) / 1024 / 1024).toFixed(2); const percentage = estimate.quota ? ((estimate.usage || 0) / estimate.quota * 100) : 0; storageUsed = `${usedMB} MB`; storageQuota = `${quotaMB} MB`; details = { usage: estimate.usage || 0, quota: estimate.quota || 0, percentage: Math.round(percentage) }; } catch (e) { console.error('Failed to estimate storage:', e); } } setStats({ totalProjects: projectStats.total_projects || 0, activeProjects: projectStats.active_projects || 0, totalTasks: projectStats.total_tasks || 0, completedTasks: projectStats.completed_tasks || 0, totalIssues: projectStats.total_issues || 0, resolvedIssues: projectStats.resolved_issues || 0, storageUsed, storageQuota }); setStorageDetails(details); } catch (error) { console.error('Failed to load stats:', error); toast.error("加载统计数据失败"); } finally { setLoading(false); } }; if (loading) { return (
加载数据库信息...
管理系统配置、LLM设置、数据库和存储使用情况
审计任务的完成情况统计
总任务数
{stats.totalTasks}
已完成
{stats.completedTasks}
代码问题的解决情况统计
总问题数
{stats.totalIssues}
已解决
{stats.resolvedIssues}
各数据表的记录数量
项目
{stats.totalProjects}
审计任务
{stats.totalTasks}
问题
{stats.totalIssues}
浏览器 IndexedDB 存储空间的使用详情
已使用
{stats.storageUsed}
总配额
{stats.storageQuota}
剩余空间
{((storageDetails.quota - storageDetails.usage) / 1024 / 1024).toFixed(2)} MB
警告
存储空间使用率已超过 80%,建议清理不需要的数据或导出备份后清空数据库。
提示
无法获取存储空间信息。您的浏览器可能不支持 Storage API。
定期导出备份
建议定期导出数据为 JSON 文件,防止数据丢失
清理旧数据
删除不再需要的项目和任务可以释放存储空间
监控存储使用
定期检查存储使用情况,避免超出浏览器限制
配置数据库行为和性能选项
当前数据库模式
{ dbMode === 'api' ? '后端 PostgreSQL 数据库' : dbMode === 'local' ? '本地 IndexedDB' : dbMode === 'supabase' ? 'Supabase 云端(已废弃)' : '演示模式' }
自动备份
定期自动导出数据备份(开发中)
数据压缩
压缩存储数据以节省空间(开发中)
数据同步
在多个设备间同步数据(开发中)
本地数据库使用浏览器的 IndexedDB 技术存储数据,具有以下特点:
建议:定期导出数据备份,以防意外数据丢失。