| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 |
- <div class="space-y-6">
- {{-- Stats Cards --}}
- <div class="grid grid-cols-1 md:grid-cols-4 gap-6">
- <div class="bg-white rounded-lg shadow-sm border border-gray-200 p-6">
- <div class="flex items-center">
- <div class="p-3 rounded-full bg-indigo-100 text-indigo-600">
- <svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 4.354a4 4 0 110 5.292M15 21H3v-1a6 6 0 0112 0v1zm0 0h6v-1a6 6 0 00-9-5.197M13 7a4 4 0 11-8 0 4 4 0 018 0z"></path>
- </svg>
- </div>
- <div class="ml-4">
- <p class="text-sm text-gray-500">学生总数</p>
- <p class="text-2xl font-bold text-gray-900">{{ $stats['total_students'] ?? 0 }}</p>
- </div>
- </div>
- </div>
- <div class="bg-white rounded-lg shadow-sm border border-gray-200 p-6">
- <div class="flex items-center">
- <div class="p-3 rounded-full bg-green-100 text-green-600">
- <svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"></path>
- </svg>
- </div>
- <div class="ml-4">
- <p class="text-sm text-gray-500">已掌握知识点</p>
- <p class="text-2xl font-bold text-gray-900">{{ $stats['total_mastered_points'] ?? 0 }}</p>
- </div>
- </div>
- </div>
- <div class="bg-white rounded-lg shadow-sm border border-gray-200 p-6">
- <div class="flex items-center">
- <div class="p-3 rounded-full bg-blue-100 text-blue-600">
- <svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7h8m0 0v8m0-8l-8 8-4-4-6 6"></path>
- </svg>
- </div>
- <div class="ml-4">
- <p class="text-sm text-gray-500">平均掌握度</p>
- <p class="text-2xl font-bold text-gray-900">{{ $stats['avg_mastery'] ?? 0 }}%</p>
- </div>
- </div>
- </div>
- <div class="bg-white rounded-lg shadow-sm border border-gray-200 p-6">
- <div class="flex items-center">
- <div class="p-3 rounded-full bg-yellow-100 text-yellow-600">
- <svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path>
- </svg>
- </div>
- <div class="ml-4">
- <p class="text-sm text-gray-500">总答题数</p>
- <p class="text-2xl font-bold text-gray-900">{{ $stats['total_attempts'] ?? 0 }}</p>
- </div>
- </div>
- </div>
- </div>
- {{-- Loading State --}}
- @if($loading)
- <div class="bg-white rounded-lg shadow-sm border border-gray-200 p-12 text-center">
- <div class="animate-spin rounded-full h-12 w-12 border-b-2 border-indigo-600 mx-auto"></div>
- <p class="mt-4 text-gray-500">加载学生数据中...</p>
- </div>
- {{-- Error State --}}
- @elseif($error)
- <div class="bg-red-50 border border-red-200 rounded-lg p-6">
- <div class="flex">
- <svg class="h-5 w-5 text-red-400" fill="currentColor" viewBox="0 0 20 20">
- <path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z" clip-rule="evenodd"></path>
- </svg>
- <div class="ml-3">
- <h3 class="text-sm font-medium text-red-800">加载失败</h3>
- <p class="mt-2 text-sm text-red-700">{{ $error }}</p>
- </div>
- </div>
- </div>
- {{-- Students Table --}}
- @else
- <div class="bg-white rounded-lg shadow-sm border border-gray-200">
- <div class="px-6 py-4 border-b border-gray-200">
- <h3 class="text-lg font-semibold text-gray-900">学生列表</h3>
- </div>
- @if(empty($students))
- <div class="text-center py-12 text-gray-500">
- <svg class="mx-auto h-12 w-12 text-gray-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z"></path>
- </svg>
- <p class="mt-2">暂无学生数据</p>
- </div>
- @else
- <div class="overflow-x-auto">
- <table class="min-w-full divide-y divide-gray-200">
- <thead class="bg-gray-50">
- <tr>
- <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">学生</th>
- <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">班级</th>
- <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">平均掌握度</th>
- <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">已掌握</th>
- <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">答题数</th>
- <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">操作</th>
- </tr>
- </thead>
- <tbody class="bg-white divide-y divide-gray-200">
- @foreach($students as $student)
- <tr class="hover:bg-gray-50">
- <td class="px-6 py-4 whitespace-nowrap">
- <div class="flex items-center">
- <div class="flex-shrink-0 h-10 w-10">
- <div class="h-10 w-10 rounded-full bg-indigo-100 flex items-center justify-center">
- <span class="text-sm font-medium text-indigo-600">
- {{ substr($student['name'], 0, 1) }}
- </span>
- </div>
- </div>
- <div class="ml-4">
- <div class="text-sm font-medium text-gray-900">{{ $student['name'] }}</div>
- <div class="text-sm text-gray-500">{{ $student['student_id'] }}</div>
- </div>
- </div>
- </td>
- <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
- {{ $student['grade'] }} {{ $student['class'] }}
- </td>
- <td class="px-6 py-4 whitespace-nowrap">
- <div class="flex items-center">
- <div class="flex-1">
- <div class="w-full bg-gray-200 rounded-full h-2">
- @php
- $mastery = $student['avg_mastery'];
- if ($mastery >= 80) {
- $barClass = 'bg-green-500';
- } elseif ($mastery >= 60) {
- $barClass = 'bg-blue-500';
- } elseif ($mastery >= 40) {
- $barClass = 'bg-yellow-500';
- } else {
- $barClass = 'bg-red-500';
- }
- @endphp
- <div class="{{ $barClass }} h-2 rounded-full" style="width: {{ $mastery }}%"></div>
- </div>
- </div>
- <span class="ml-3 text-sm font-medium text-gray-900">{{ $student['avg_mastery'] }}%</span>
- </div>
- </td>
- <td class="px-6 py-4 whitespace-nowrap">
- <span class="text-sm text-gray-900">{{ $student['mastered_points'] }} / {{ $student['total_knowledge_points'] }}</span>
- </td>
- <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
- {{ $student['total_attempts'] }}
- </td>
- <td class="px-6 py-4 whitespace-nowrap text-sm font-medium">
- <button
- class="text-indigo-600 hover:text-indigo-900 mr-4"
- onclick="window.location.href='{{ route('filament.admin.auth.login') }}'"
- >
- 查看详情
- </button>
- </td>
- </tr>
- @endforeach
- </tbody>
- </table>
- </div>
- @endif
- </div>
- @endif
- </div>
|