import React, { useEffect, useState } from 'react'; import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@/components/ui/card'; import { Link } from 'react-router-dom'; import { Button } from '@/components/ui/button'; import { FileText, TableProperties, MessageSquareCode, TrendingUp, Clock, CheckCircle2, ArrowRight, UploadCloud, Layers, Sparkles, Database, FileSpreadsheet, RefreshCcw, Trash2 } from 'lucide-react'; import { backendApi } from '@/db/backend-api'; import { formatDistanceToNow } from 'date-fns'; import { zhCN } from 'date-fns/locale'; import { cn } from '@/lib/utils'; import { toast } from 'sonner'; type DocumentItem = { doc_id: string; filename: string; original_filename: string; doc_type: string; file_size: number; created_at: string; metadata?: { row_count?: number; column_count?: number; columns?: string[]; }; }; type TaskItem = { task_id: string; status: string; created_at: string; message?: string; }; const Dashboard: React.FC = () => { const [stats, setStats] = useState({ docs: 0, excelFiles: 0, tasks: 0 }); const [recentDocs, setRecentDocs] = useState([]); const [recentTasks, setRecentTasks] = useState([]); const [loading, setLoading] = useState(true); const loadData = async () => { setLoading(true); try { // 获取文档列表 const docsResult = await backendApi.getDocuments(undefined, 50); if (docsResult.success && docsResult.documents) { setRecentDocs(docsResult.documents.slice(0, 5)); // 分类统计 const docxMdTxt = docsResult.documents.filter((d: DocumentItem) => ['docx', 'md', 'txt'].includes(d.doc_type) ).length; const xlsx = docsResult.documents.filter((d: DocumentItem) => d.doc_type === 'xlsx' ).length; setStats({ docs: docxMdTxt, excelFiles: xlsx, tasks: 0 // TODO: 后端任务接口 }); } } catch (err) { console.error('加载数据失败:', err); } finally { setLoading(false); } }; useEffect(() => { loadData(); }, []); return (

欢迎使用 智联文档 系统 👋

基于大语言模型的文档理解与多源数据融合系统

{/* Stats Grid */}
{[ { label: '已上传文档', value: stats.docs, icon: FileText, color: 'bg-blue-500', trend: '非结构化文档', link: '/documents' }, { label: 'Excel 文件', value: stats.excelFiles, icon: FileSpreadsheet, color: 'bg-emerald-500', trend: '结构化数据', link: '/documents' }, { label: '填表任务', value: stats.tasks, icon: TableProperties, color: 'bg-indigo-500', trend: '待实现', link: '/form-fill' } ].map((stat, i) => (

{stat.label}

{stat.value}

{stat.trend}
))}
{/* Recent Documents */}
最近上传 您最近上传的文档文件
{loading ? (
{[1, 2, 3].map(i =>
)}
) : recentDocs.length > 0 ? (
{recentDocs.map(doc => (

{doc.original_filename}

{doc.doc_type.toUpperCase()} • {formatDistanceToNow(new Date(doc.created_at), { addSuffix: true, locale: zhCN })}

{doc.doc_type}
))}
) : (

暂无文档,立即上传开始体验

)} {/* Quick Actions */}
快速开始 选择您需要的服务开始使用
{[ { title: '上传文档', desc: '支持 docx/md/txt', icon: FileText, link: '/documents', color: 'bg-blue-500' }, { title: '解析 Excel', desc: '上传并分析数据', icon: FileSpreadsheet, link: '/documents', color: 'bg-emerald-500' }, { title: '智能填表', desc: '自动填写表格模板', icon: TableProperties, link: '/form-fill', color: 'bg-indigo-500' }, { title: 'AI 助手', desc: '自然语言交互', icon: MessageSquareCode, link: '/assistant', color: 'bg-amber-500' } ].map((item, i) => (

{item.title}

{item.desc}

))}
{/* System Status */} 系统状态

MySQL

结构化数据存储

MongoDB

非结构化数据存储

Faiss + RAG

向量检索索引

); }; export default Dashboard;