import { useState, useEffect } from "react"; import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Alert, AlertDescription } from "@/components/ui/alert"; import { Progress } from "@/components/ui/progress"; import { Database, HardDrive, RefreshCw, Info, CheckCircle2, AlertCircle, FolderOpen, Clock, AlertTriangle, TrendingUp, Package } from "lucide-react"; import { api, dbMode, isLocalMode } from "@/shared/config/database"; import { DatabaseManager } from "@/components/database/DatabaseManager"; import { DatabaseStatusDetail } from "@/components/database/DatabaseStatus"; 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 (
加载数据库信息...
管理和监控本地数据库,查看存储使用情况和数据统计
项目总数
{stats.totalProjects}
活跃: {stats.activeProjects}
审计任务
{stats.totalTasks}
已完成: {stats.completedTasks}
发现问题
{stats.totalIssues}
已解决: {stats.resolvedIssues}
存储使用
{stats.storageUsed}
配额: {stats.storageQuota}
总任务数
{stats.totalTasks}
已完成
{stats.completedTasks}
总问题数
{stats.totalIssues}
已解决
{stats.resolvedIssues}
项目
{stats.totalProjects}
审计任务
{stats.totalTasks}
问题
{stats.totalIssues}
已使用
{stats.storageUsed}
总配额
{stats.storageQuota}
剩余空间
{((storageDetails.quota - storageDetails.usage) / 1024 / 1024).toFixed(2)} MB
定期导出备份
建议定期导出数据为 JSON 文件,防止数据丢失
清理旧数据
删除不再需要的项目和任务可以释放存储空间
监控存储使用
定期检查存储使用情况,避免超出浏览器限制
自动备份
定期自动导出数据备份(开发中)
数据压缩
压缩存储数据以节省空间(开发中)
数据同步
在多个设备间同步数据(开发中)
本地数据库使用浏览器的 IndexedDB 技术存储数据,具有以下特点:
建议:定期导出数据备份,以防意外数据丢失。