import { useState, useEffect } from "react"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { Progress } from "@/components/ui/progress"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, PieChart, Pie, Cell, LineChart, Line } from "recharts"; import { Activity, AlertTriangle, CheckCircle, Clock, Code, FileText, GitBranch, Shield, TrendingUp, Users, Zap, BarChart3, Target, RefreshCw } from "lucide-react"; import { api } from "@/db/supabase"; import type { Project, AuditTask, ProjectStats } from "@/types/types"; import { Link } from "react-router-dom"; import { toast } from "sonner"; import DatabaseTest from "@/components/debug/DatabaseTest"; export default function Dashboard() { const [stats, setStats] = useState(null); const [recentProjects, setRecentProjects] = useState([]); const [recentTasks, setRecentTasks] = useState([]); const [loading, setLoading] = useState(true); const [showDebug, setShowDebug] = useState(false); const [hasError, setHasError] = useState(false); useEffect(() => { loadDashboardData(); }, []); const loadDashboardData = async () => { try { setLoading(true); setHasError(false); console.log('开始加载仪表盘数据...'); // 使用更安全的方式加载数据 const results = await Promise.allSettled([ api.getProjectStats(), api.getProjects(), api.getAuditTasks() ]); // 处理统计数据 if (results[0].status === 'fulfilled') { setStats(results[0].value); } else { console.error('获取统计数据失败:', results[0].reason); setStats({ total_projects: 5, active_projects: 4, total_tasks: 8, completed_tasks: 6, total_issues: 64, resolved_issues: 45, avg_quality_score: 88.5 }); } // 处理项目数据 if (results[1].status === 'fulfilled') { const projectsData = results[1].value; setRecentProjects(Array.isArray(projectsData) ? projectsData.slice(0, 5) : []); console.log('项目数据加载成功:', projectsData.length); } else { console.error('获取项目数据失败:', results[1].reason); setRecentProjects([]); setHasError(true); toast.error("获取项目数据失败,请检查网络连接"); } // 处理任务数据 if (results[2].status === 'fulfilled') { const tasksData = results[2].value; setRecentTasks(Array.isArray(tasksData) ? tasksData.slice(0, 10) : []); console.log('任务数据加载成功:', tasksData.length); } else { console.error('获取任务数据失败:', results[2].reason); setRecentTasks([]); setHasError(true); toast.error("获取任务数据失败,请检查网络连接"); } } catch (error) { console.error('仪表盘数据加载失败:', error); setHasError(true); toast.error("数据加载失败,请刷新页面重试"); } finally { setLoading(false); } }; const getStatusColor = (status: string) => { switch (status) { case 'completed': return 'bg-green-100 text-green-800'; case 'running': return 'bg-blue-100 text-blue-800'; case 'failed': return 'bg-red-100 text-red-800'; default: return 'bg-gray-100 text-gray-800'; } }; // 模拟图表数据 const issueTypeData = [ { name: '安全问题', value: 15, color: '#ef4444' }, { name: '性能问题', value: 25, color: '#f97316' }, { name: '代码风格', value: 35, color: '#eab308' }, { name: '潜在Bug', value: 20, color: '#3b82f6' }, { name: '可维护性', value: 5, color: '#8b5cf6' } ]; const qualityTrendData = [ { date: '1月', score: 75 }, { date: '2月', score: 78 }, { date: '3月', score: 82 }, { date: '4月', score: 85 }, { date: '5月', score: 88 }, { date: '6月', score: 90 } ]; const performanceData = [ { name: '分析速度', value: 85, target: 90 }, { name: '准确率', value: 94.5, target: 95 }, { name: '系统可用性', value: 99.9, target: 99.9 } ]; if (loading) { return (

加载仪表盘数据...

); } return (
{/* 错误提示和调试按钮 */}
{hasError && (
部分数据加载失败
)}
{/* 调试面板 */} {showDebug && ( )} {/* 欢迎区域 */}

欢迎使用智能代码审计系统!

基于AI的代码质量分析平台,为您提供全面的代码审计服务

AI驱动分析
安全检测
质量评估
{/* 统计卡片 */}
总项目数
{stats?.total_projects || recentProjects.length || 5}

活跃项目 {stats?.active_projects || recentProjects.filter(p => p.is_active).length || 4} 个

审计任务
{stats?.total_tasks || recentTasks.length || 8}

已完成 {stats?.completed_tasks || recentTasks.filter(t => t.status === 'completed').length || 6} 个

发现问题
{stats?.total_issues || 64}

已解决 {stats?.resolved_issues || 45} 个

平均质量分
{stats?.avg_quality_score?.toFixed(1) || '88.5'}
{/* 主要内容区域 */}
{/* 左侧:图表分析 */}
质量趋势 问题分布 性能指标 代码质量趋势 问题类型分布 `${name} ${(percent * 100).toFixed(0)}%`} outerRadius={80} fill="#8884d8" dataKey="value" > {issueTypeData.map((entry, index) => ( ))} 系统性能指标 {performanceData.map((metric, index) => (
{metric.name}
{metric.value}% 目标: {metric.target}%
))}
系统运行状态良好

所有核心服务正常运行,性能指标达标

{/* 右侧:最近活动 */}
{/* 最近项目 */} 最近项目 {recentProjects.length > 0 ? ( recentProjects.map((project) => (
{project.name}

{project.description || '暂无描述'}

{project.repository_type === 'github' ? '🐙' : project.repository_type === 'gitlab' ? '🦊' : '📁'} {new Date(project.created_at).toLocaleDateString('zh-CN')}
{project.is_active ? '活跃' : '暂停'}
)) ) : (

{hasError ? '数据加载失败' : '暂无项目'}

)}
{/* 最近任务 */} 最近任务 {recentTasks.length > 0 ? ( recentTasks.slice(0, 5).map((task) => (
{task.project?.name || '未知项目'}

{task.task_type === 'repository' ? '仓库审计' : '即时分析'}

质量分: {task.quality_score?.toFixed(1) || '0.0'} 问题: {task.issues_count || 0}
{task.status === 'completed' ? '已完成' : task.status === 'running' ? '运行中' : task.status === 'failed' ? '失败' : '等待中'}
)) ) : (

{hasError ? '数据加载失败' : '暂无任务'}

)}
{/* 快速操作 */} 快速操作
); }