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 (

加载数据库信息...

); } return (
{/* Decorative Background */}
{/* 页面标题 */}

系统管理

管理系统配置、LLM设置、数据库和存储使用情况

{/* 主要内容标签页 */} 系统配置 数据概览 存储管理 数据操作 高级设置 {/* 系统配置 */} {/* 数据概览 */}
{/* 任务完成率 */}

任务完成率

审计任务的完成情况统计

已完成 {stats.totalTasks > 0 ? Math.round((stats.completedTasks / stats.totalTasks) * 100) : 0}%
0 ? (stats.completedTasks / stats.totalTasks) * 100 : 0 } className="h-4 border-2 border-black rounded-none bg-gray-200 [&>div]:bg-green-600" />

总任务数

{stats.totalTasks}

已完成

{stats.completedTasks}

{/* 问题解决率 */}

问题解决率

代码问题的解决情况统计

已解决 {stats.totalIssues > 0 ? Math.round((stats.resolvedIssues / stats.totalIssues) * 100) : 0}%
0 ? (stats.resolvedIssues / stats.totalIssues) * 100 : 0 } className="h-4 border-2 border-black rounded-none bg-gray-200 [&>div]:bg-orange-500" />

总问题数

{stats.totalIssues}

已解决

{stats.resolvedIssues}

{/* 数据库表统计 */}

数据库表统计

各数据表的记录数量

项目

{stats.totalProjects}

审计任务

{stats.totalTasks}

问题

{stats.totalIssues}

{/* 存储管理 */}

存储空间使用情况

浏览器 IndexedDB 存储空间的使用详情

{storageDetails ? ( <>
已使用空间 {storageDetails.percentage}%
{stats.storageUsed} 已使用 {stats.storageQuota} 总配额

已使用

{stats.storageUsed}

总配额

{stats.storageQuota}

剩余空间

{((storageDetails.quota - storageDetails.usage) / 1024 / 1024).toFixed(2)} MB

{storageDetails.percentage > 80 && (

警告

存储空间使用率已超过 80%,建议清理不需要的数据或导出备份后清空数据库。

)} ) : (

提示

无法获取存储空间信息。您的浏览器可能不支持 Storage API。

)}

存储优化建议

定期导出备份

建议定期导出数据为 JSON 文件,防止数据丢失

清理旧数据

删除不再需要的项目和任务可以释放存储空间

监控存储使用

定期检查存储使用情况,避免超出浏览器限制

{/* 数据操作 */} {/* 设置 */}

数据库设置

配置数据库行为和性能选项

当前数据库模式

{ dbMode === 'api' ? '后端 PostgreSQL 数据库' : dbMode === 'local' ? '本地 IndexedDB' : dbMode === 'supabase' ? 'Supabase 云端(已废弃)' : '演示模式' }

自动备份

定期自动导出数据备份(开发中)

即将推出

数据压缩

压缩存储数据以节省空间(开发中)

即将推出

数据同步

在多个设备间同步数据(开发中)

即将推出

关于本地数据库

本地数据库使用浏览器的 IndexedDB 技术存储数据,具有以下特点:

  • 数据完全存储在本地,不会上传到服务器
  • 支持离线访问,无需网络连接
  • 存储容量取决于浏览器和设备
  • 清除浏览器数据会删除所有本地数据
  • 不同浏览器的数据相互独立

建议:定期导出数据备份,以防意外数据丢失。

); }