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 (

加载数据库信息...

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

数据库管理

管理和监控本地数据库,查看存储使用情况和数据统计

{/* 数据库模式提示 */} {!isLocalMode && ( 当前使用 {dbMode === 'supabase' ? 'Supabase 云端' : '演示'} 模式。 数据库管理功能仅在本地数据库模式下完全可用。 {dbMode === 'demo' && ' 请在 .env 文件中配置 VITE_USE_LOCAL_DB=true 启用本地数据库。'} )} {/* 数据库状态卡片 */} {/* 统计概览 */}

项目总数

{stats.totalProjects}

活跃: {stats.activeProjects}

审计任务

{stats.totalTasks}

已完成: {stats.completedTasks}

发现问题

{stats.totalIssues}

已解决: {stats.resolvedIssues}

存储使用

{stats.storageUsed}

配额: {stats.storageQuota}

{/* 主要内容标签页 */} 数据概览 存储管理 数据操作 设置 {/* 数据概览 */}
{/* 任务完成率 */} 任务完成率 审计任务的完成情况统计
已完成 {stats.totalTasks > 0 ? Math.round((stats.completedTasks / stats.totalTasks) * 100) : 0}%
0 ? (stats.completedTasks / stats.totalTasks) * 100 : 0 } />

总任务数

{stats.totalTasks}

已完成

{stats.completedTasks}

{/* 问题解决率 */} 问题解决率 代码问题的解决情况统计
已解决 {stats.totalIssues > 0 ? Math.round((stats.resolvedIssues / stats.totalIssues) * 100) : 0}%
0 ? (stats.resolvedIssues / stats.totalIssues) * 100 : 0 } className="bg-orange-100" />

总问题数

{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 === 'local' ? '本地 IndexedDB' : dbMode === 'supabase' ? 'Supabase 云端' : '演示模式'}

自动备份

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

即将推出

数据压缩

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

即将推出

数据同步

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

即将推出
关于本地数据库

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

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

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

); }