import React, { useState, useEffect } from 'react' import { motion } from 'framer-motion' // 倒计时组件的属性接口 interface CountdownProps { startDate: string firstPeriodDays: number secondPeriodDays: number extraHours: number } // 文章接口 interface Article { id: number title: string content: string created_at: string type: 'activity' | 'news' } // 倒计时组件 function Countdown({ startDate, firstPeriodDays, secondPeriodDays, extraHours }: CountdownProps) { const [remainingDays, setRemainingDays] = useState(0) const [isFirstPeriod, setIsFirstPeriod] = useState(true) useEffect(() => { const calculateCountdown = () => { const totalDays = firstPeriodDays + secondPeriodDays const currentTime = new Date().getTime() const elapsedDays = Math.floor((currentTime - new Date(startDate).getTime()) / (1000 * 60 * 60 * 24)) const currentPeriod = elapsedDays % totalDays if (currentPeriod < firstPeriodDays) { setIsFirstPeriod(true) setRemainingDays(firstPeriodDays - currentPeriod) } else { setIsFirstPeriod(false) setRemainingDays(totalDays - currentPeriod) } } calculateCountdown() const timer = setInterval(calculateCountdown, 1000 * 60 * 60) // 每小时更新一次 return () => clearInterval(timer) }, [startDate, firstPeriodDays, secondPeriodDays]) return (

{isFirstPeriod ? '距离下一次大休还有' : '距离开学还有'}

{remainingDays}

) } // 文章组件 function Articles() { const [articles, setArticles] = useState([]) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) useEffect(() => { const fetchArticles = async () => { try { const response = await fetch('https://ez-api.mei.lv:55233/public/home') if (!response.ok) { throw new Error('Failed to fetch articles') } const data = await response.json() setArticles(data) setLoading(false) } catch (err) { setError('Failed to load articles. Please try again later.') setLoading(false) } } fetchArticles() }, []) const activities = articles.filter(article => article.type === 'activity') const news = articles.filter(article => article.type === 'news') const renderArticles = (articles: Article[]) => { return articles.map((article, index) => ( {article.title}

{article.content}

发布于: {article.created_at}
)) } if (loading) { return
加载中...
} if (error) { return
{error}
} return (

活动一览

{renderArticles(activities)}

新闻动态

{renderArticles(news)}
) } // 主应用组件 export default function App() { return (

今天油二

) }