// 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 { 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/sys_overview.css?url"; import { getDocuments, type DocumentUI } from "~/api/files/documents"; import { useState, useEffect } from "react"; import { getHomeData } from "~/api/home/home"; import dayjs from 'dayjs'; // import { getUserSession } from "~/root"; // 文件处理状态选项 const fileProcessingStatusOptions = [ { value: "Waiting", label: "上传中", icon: "ri-loader-line", color: "blue" }, { value: "Cutting", label: "切分中", icon: "ri-loader-line", color: "purple" }, { value: "Extractioning", label: "抽取中", icon: "ri-loader-line", color: "cyan" }, { value: "Evaluationing", label: "评查中", icon: "ri-loader-line", color: "teal" }, { value: "Processed", label: "已完成", icon: "ri-check-line", color: "green" }, ]; export const links = () => [ { rel: "stylesheet", href: homeStyles }, ...fileTagLinks() ]; export const meta: MetaFunction = () => { return [ { title: "中国烟草AI合同及卷宗审核系统 - 首页" }, { name: "description", content: "AI审核系统首页" } ]; }; // API 响应的类型定义 // interface StatsData { // totalFiles: number; // reviewedFiles: number; // pendingFiles: number; // passRate: number; // } // 添加认证检查 export async function loader() { // 检查用户登录状态 // const { isAuthenticated } = await getUserSession(request); // if (!isAuthenticated) { // return redirect("/login"); // } 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 homeData = await getHomeData(); // console.log("homeData-------",homeData); return Response.json({ homeData, recentFiles }); } catch (error) { // 错误处理 console.error('Failed to fetch dashboard data:', error); return Response.json( { error: '获取数据失败,请稍后重试' }, { status: 500 } ); } } export default function Home() { const { homeData, recentFiles: initialRecentFiles } = useLoaderData(); // 使用useState存储最近文档数据,初始值为loader加载的数据 const [recentFiles, setRecentFiles] = useState(initialRecentFiles || []); const [currentDateTime, setCurrentDateTime] = useState({ date: '', time: '' }); // 更新当前时间 useEffect(() => { // 使用dayjs格式化日期和时间 const updateDateTime = () => { const now = dayjs(); setCurrentDateTime({ date: now.format('YYYY年MM月DD日'), time: now.format('HH:mm:ss') }); }; // 立即更新一次 updateDateTime(); // 设置计时器,每秒更新一次 const timerID = setInterval(updateDateTime, 1000); // 清理函数,组件卸载时清除计时器 return () => clearInterval(timerID); }, []); // 修改useEffect定时器,每10秒自动获取最近文档数据 // 按照定时器更新最近文档 useEffect(() => { // 定义一个函数用于获取最新的文档数据 const fetchLatestDocuments = async () => { try { const documentSearchParams = { page: 1, pageSize: 10, order: 'updated_at.desc' }; // console.log('定时获取最新文档数据...'); const responseDocuments = await getDocuments(documentSearchParams); if (responseDocuments.error) { console.error('获取最近文档数据失败', responseDocuments.error); return; } // 获取新的文档数据 const newRecentFiles = responseDocuments.data?.documents || []; // 检查数据是否有变化 if (JSON.stringify(newRecentFiles) !== JSON.stringify(recentFiles)) { // console.log('文档数据已更新,直接更新状态'); // 直接更新状态,不需要刷新页面 setRecentFiles(newRecentFiles); } } catch (error) { console.error('自动获取文档数据失败:', error); } }; // 设置10秒的定时器 const timerID = setInterval(fetchLatestDocuments, 10000); // 组件卸载时清除定时器 return () => { // console.log('清除文档数据自动更新定时器'); clearInterval(timerID); }; }, []); // 不再依赖recentFiles,避免循环依赖 return (
{/* 页面头部 */}

系统概览

{currentDateTime.date} | {currentDateTime.time}

系统管理员

超级管理员

{/* 统计卡片区域 */}
{/* 快捷访问区域 */}
{/* */} {/* */}
{/* 最近文档区域 */} 查看全部} className="mt-6" >
{recentFiles.map((file: DocumentUI) => (
{file.name}
{file.typeName} · {file.updatedAt}
{(() => { const fileStatus = file.fileStatus || "-"; const status = fileProcessingStatusOptions.find(s => s.value === fileStatus) || fileProcessingStatusOptions[0]; const isSpinning = fileStatus !== "Processed"; return (
{status.label}
); })()}
))}
); } // 统计卡片组件 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 ( ); }