// import React from 'react'; import { type MetaFunction } from "@remix-run/node"; import { useLoaderData } from "@remix-run/react"; import { Card } from "~/components/ui/Card"; import { Button } from "~/components/ui/Button"; import { StatusBadge, links as statusBadgeLinks } from "~/components/ui/StatusBadge"; import { FileTag, links as fileTagLinks } from "~/components/ui/FileTag"; // import { FileTypeTag, links as fileTypeTagLinks } from "~/components/ui/FileTypeTag"; import { Tag } from "~/components/ui/Tag"; import homeStyles from "~/styles/pages/home.css?url"; import { getDocuments, type DocumentUI } from "~/api/files/documents"; export const links = () => [ { rel: "stylesheet", href: homeStyles }, ...statusBadgeLinks(), ...fileTagLinks() ]; export const meta: MetaFunction = () => { return [ { title: "中国烟草AI合同及卷宗审核系统 - 首页" }, { name: "description", content: "AI审核系统首页" } ]; }; // API 响应的类型定义 interface StatsData { totalFiles: number; reviewedFiles: number; pendingFiles: number; passRate: number; } // interface LoaderData { // stats: StatsData; // recentFiles: RecentFile[]; // } // 模拟数据,实际项目中应该从API获取 export async function loader() { try { const documentSearchParams = { page: 1, pageSize: 10, order: 'updated_at.desc' }; // 获取最近文档数据 const responseDocuments = await getDocuments(documentSearchParams); if (responseDocuments.error) { console.error('获取最近文档数据失败', responseDocuments.error); return Response.json({ error: responseDocuments.error }, { status: responseDocuments.status || 500 }); } const recentFiles = responseDocuments.data?.documents || []; console.log("recentFiles-------",recentFiles); // 模拟数据 const stats = { totalFiles: 156, reviewedFiles: 124, pendingFiles: 32, passRate: 92.5 } as StatsData; return Response.json({ stats, recentFiles }); } catch (error) { // 错误处理 console.error('Failed to fetch dashboard data:', error); return Response.json( { error: '获取数据失败,请稍后重试' }, { status: 500 } ); } } export default function Index() { const { stats, recentFiles } = useLoaderData(); return (
{/* 页面标识 */} {/* 统计卡片区域 */}
{/* 快捷访问区域 */}
{/* */}
{/* 最近文档区域 */} 查看全部} className="mt-6" >
{recentFiles.map((file: DocumentUI) => (
{file.name}
{file.typeName} · {file.updatedAt}
))}
); } // 统计卡片组件 interface StatCardProps { title: string; value: number | string; icon: string; trend?: { value: number; isUp: boolean; }; } function StatCard({ title, value, icon, trend }: StatCardProps) { return (
{title}
{value}
{trend && (
{trend.value}% 较上月
)}
); } // 快捷方式组件 interface ShortcutItemProps { icon: string; label: string; to: string; } function ShortcutItem({ icon, label, to }: ShortcutItemProps) { return ( ); }