import { useState, useEffect } from 'react' import { Card, Tag, SearchBar, Space, SpinLoading } from 'antd-mobile' import { useApi } from '../App' interface Student { id: number name: string score: number } export function MobileHome(): React.JSX.Element { const { api, config } = useApi() const [students, setStudents] = useState([]) const [loading, setLoading] = useState(false) const [search, setSearch] = useState('') useEffect(() => { if (!config.baseUrl) return loadStudents() }, [config.baseUrl]) const loadStudents = async () => { setLoading(true) try { const res = await api.get('/api/students') if (res.success) { setStudents(res.data || []) } } catch (e) { console.error('Failed to load students:', e) } finally { setLoading(false) } } const filteredStudents = students.filter((s) => s.name.toLowerCase().includes(search.toLowerCase()) ) const getAvatarColor = (name: string) => { const colors = [ '#FF6B6B', '#4ECDC4', '#45B7D1', '#FFA07A', '#98D8C8', '#F7DC6F', '#BB8FCE', '#85C1E2' ] let hash = 0 for (let i = 0; i < name.length; i++) { hash = name.charCodeAt(i) + ((hash << 5) - hash) } return colors[Math.abs(hash) % colors.length] } if (!config.baseUrl) { return (

请先在设置中配置服务器地址

) } return (

学生积分

{loading ? (
) : ( {filteredStudents.map((student) => (
{student.name.slice(-2)}
{student.name}
0 ? 'success' : student.score < 0 ? 'danger' : 'default'} > {student.score > 0 ? `+${student.score}` : student.score}
))}
)} {!loading && filteredStudents.length === 0 && (
{search ? '未找到匹配的学生' : '暂无学生数据'}
)}
) }