|
@@ -2,6 +2,8 @@
|
|
|
|
|
|
|
|
namespace App\Filament\Pages;
|
|
namespace App\Filament\Pages;
|
|
|
|
|
|
|
|
|
|
+use App\Models\Student;
|
|
|
|
|
+use App\Models\Teacher;
|
|
|
use App\Services\LearningAnalyticsService;
|
|
use App\Services\LearningAnalyticsService;
|
|
|
use BackedEnum;
|
|
use BackedEnum;
|
|
|
use Filament\Pages\Page;
|
|
use Filament\Pages\Page;
|
|
@@ -13,6 +15,7 @@ use UnitEnum;
|
|
|
use Livewire\Attributes\Layout;
|
|
use Livewire\Attributes\Layout;
|
|
|
use Livewire\Attributes\Title;
|
|
use Livewire\Attributes\Title;
|
|
|
use Livewire\Attributes\On;
|
|
use Livewire\Attributes\On;
|
|
|
|
|
+use Livewire\Attributes\Computed;
|
|
|
|
|
|
|
|
class StudentDashboard extends Page
|
|
class StudentDashboard extends Page
|
|
|
{
|
|
{
|
|
@@ -35,73 +38,45 @@ class StudentDashboard extends Page
|
|
|
public array $dashboardData = [];
|
|
public array $dashboardData = [];
|
|
|
public bool $isLoading = false;
|
|
public bool $isLoading = false;
|
|
|
public string $errorMessage = '';
|
|
public string $errorMessage = '';
|
|
|
- public array $teachers = [];
|
|
|
|
|
- public array $students = [];
|
|
|
|
|
|
|
+ // teachers 和 students 现在是 Computed 属性,不再需要声明
|
|
|
|
|
|
|
|
public function mount(Request $request): void
|
|
public function mount(Request $request): void
|
|
|
{
|
|
{
|
|
|
- // 加载老师列表
|
|
|
|
|
- $this->loadTeachers();
|
|
|
|
|
-
|
|
|
|
|
- // 从请求中获取老师ID或使用默认值
|
|
|
|
|
- $this->teacherId = $request->input('teacher_id', $this->getDefaultTeacherId());
|
|
|
|
|
-
|
|
|
|
|
- // 根据老师ID加载学生列表
|
|
|
|
|
- $this->loadStudentsByTeacher();
|
|
|
|
|
-
|
|
|
|
|
- // 从请求中获取学生ID或使用默认值
|
|
|
|
|
- $this->studentId = $request->input('student_id', $this->getDefaultStudentId());
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- /**
|
|
|
|
|
- * 获取默认老师ID(列表中的第一个老师)
|
|
|
|
|
- */
|
|
|
|
|
- private function getDefaultTeacherId(): string
|
|
|
|
|
- {
|
|
|
|
|
- return !empty($this->teachers) ? $this->teachers[0]->teacher_id : '';
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- /**
|
|
|
|
|
- * 获取默认学生ID(列表中的第一个学生)
|
|
|
|
|
- */
|
|
|
|
|
- private function getDefaultStudentId(): string
|
|
|
|
|
- {
|
|
|
|
|
- return !empty($this->students) ? $this->students[0]->student_id : '';
|
|
|
|
|
|
|
+ // 从请求中获取老师ID
|
|
|
|
|
+ $this->teacherId = $request->input('teacher_id', '');
|
|
|
|
|
+ // 从请求中获取学生ID
|
|
|
|
|
+ $this->studentId = $request->input('student_id', '');
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- /**
|
|
|
|
|
- * 从MySQL加载老师列表
|
|
|
|
|
- */
|
|
|
|
|
- public function loadTeachers(): void
|
|
|
|
|
|
|
+ #[Computed]
|
|
|
|
|
+ public function teachers(): array
|
|
|
{
|
|
{
|
|
|
try {
|
|
try {
|
|
|
- // 首先获取teachers表中的老师
|
|
|
|
|
- $this->teachers = DB::connection('remote_mysql')
|
|
|
|
|
- ->table('teachers as t')
|
|
|
|
|
- ->leftJoin('users as u', 't.teacher_id', '=', 'u.user_id')
|
|
|
|
|
|
|
+ $teachers = Teacher::query()
|
|
|
|
|
+ ->leftJoin('users as u', 'teachers.teacher_id', '=', 'u.user_id')
|
|
|
->select(
|
|
->select(
|
|
|
- 't.teacher_id',
|
|
|
|
|
- 't.name',
|
|
|
|
|
- 't.subject',
|
|
|
|
|
|
|
+ 'teachers.teacher_id',
|
|
|
|
|
+ 'teachers.name',
|
|
|
|
|
+ 'teachers.subject',
|
|
|
'u.username',
|
|
'u.username',
|
|
|
'u.email'
|
|
'u.email'
|
|
|
)
|
|
)
|
|
|
- ->orderBy('t.name')
|
|
|
|
|
- ->get()
|
|
|
|
|
- ->toArray();
|
|
|
|
|
|
|
+ ->orderBy('teachers.name')
|
|
|
|
|
+ ->get();
|
|
|
|
|
|
|
|
- // 如果有学生但没有对应的老师记录,添加一个"未知老师"条目
|
|
|
|
|
- $teacherIds = array_column($this->teachers, 'teacher_id');
|
|
|
|
|
- $missingTeacherIds = DB::connection('remote_mysql')
|
|
|
|
|
- ->table('students as s')
|
|
|
|
|
|
|
+ // 检查是否有学生没有对应的老师记录
|
|
|
|
|
+ $teacherIds = $teachers->pluck('teacher_id')->toArray();
|
|
|
|
|
+ $missingTeacherIds = Student::query()
|
|
|
->distinct()
|
|
->distinct()
|
|
|
- ->whereNotIn('s.teacher_id', $teacherIds)
|
|
|
|
|
|
|
+ ->whereNotIn('teacher_id', $teacherIds)
|
|
|
->pluck('teacher_id')
|
|
->pluck('teacher_id')
|
|
|
->toArray();
|
|
->toArray();
|
|
|
|
|
|
|
|
|
|
+ $teachersArray = $teachers->all();
|
|
|
|
|
+
|
|
|
if (!empty($missingTeacherIds)) {
|
|
if (!empty($missingTeacherIds)) {
|
|
|
foreach ($missingTeacherIds as $missingId) {
|
|
foreach ($missingTeacherIds as $missingId) {
|
|
|
- $this->teachers[] = (object) [
|
|
|
|
|
|
|
+ $teachersArray[] = (object) [
|
|
|
'teacher_id' => $missingId,
|
|
'teacher_id' => $missingId,
|
|
|
'name' => '未知老师 (' . $missingId . ')',
|
|
'name' => '未知老师 (' . $missingId . ')',
|
|
|
'subject' => '未知',
|
|
'subject' => '未知',
|
|
@@ -110,51 +85,50 @@ class StudentDashboard extends Page
|
|
|
];
|
|
];
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // 重新排序
|
|
|
|
|
- usort($this->teachers, function($a, $b) {
|
|
|
|
|
|
|
+ usort($teachersArray, function($a, $b) {
|
|
|
return strcmp($a->name, $b->name);
|
|
return strcmp($a->name, $b->name);
|
|
|
});
|
|
});
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ return $teachersArray;
|
|
|
} catch (\Exception $e) {
|
|
} catch (\Exception $e) {
|
|
|
Log::error('加载老师列表失败', [
|
|
Log::error('加载老师列表失败', [
|
|
|
'error' => $e->getMessage()
|
|
'error' => $e->getMessage()
|
|
|
]);
|
|
]);
|
|
|
- $this->teachers = [];
|
|
|
|
|
|
|
+ return [];
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- /**
|
|
|
|
|
- * 根据老师ID加载学生列表
|
|
|
|
|
- */
|
|
|
|
|
- public function loadStudentsByTeacher(): void
|
|
|
|
|
|
|
+ #[Computed]
|
|
|
|
|
+ public function students(): array
|
|
|
{
|
|
{
|
|
|
- try {
|
|
|
|
|
- if (empty($this->teacherId)) {
|
|
|
|
|
- $this->students = [];
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ if (empty($this->teacherId)) {
|
|
|
|
|
+ return [];
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- $this->students = DB::connection('remote_mysql')
|
|
|
|
|
- ->table('students as s')
|
|
|
|
|
- ->leftJoin('users as u', 's.student_id', '=', 'u.user_id')
|
|
|
|
|
- ->where('s.teacher_id', $this->teacherId)
|
|
|
|
|
|
|
+ try {
|
|
|
|
|
+ return Student::query()
|
|
|
|
|
+ ->leftJoin('users as u', 'students.student_id', '=', 'u.user_id')
|
|
|
|
|
+ ->where('students.teacher_id', $this->teacherId)
|
|
|
->select(
|
|
->select(
|
|
|
- 's.student_id',
|
|
|
|
|
- 's.name',
|
|
|
|
|
- 's.grade',
|
|
|
|
|
- 's.class_name',
|
|
|
|
|
|
|
+ 'students.student_id',
|
|
|
|
|
+ 'students.name',
|
|
|
|
|
+ 'students.grade',
|
|
|
|
|
+ 'students.class_name',
|
|
|
'u.username',
|
|
'u.username',
|
|
|
'u.email'
|
|
'u.email'
|
|
|
)
|
|
)
|
|
|
- ->orderBy('s.name')
|
|
|
|
|
|
|
+ ->orderBy('students.grade')
|
|
|
|
|
+ ->orderBy('students.class_name')
|
|
|
|
|
+ ->orderBy('students.name')
|
|
|
->get()
|
|
->get()
|
|
|
- ->toArray();
|
|
|
|
|
|
|
+ ->all();
|
|
|
} catch (\Exception $e) {
|
|
} catch (\Exception $e) {
|
|
|
Log::error('加载学生列表失败', [
|
|
Log::error('加载学生列表失败', [
|
|
|
'teacher_id' => $this->teacherId,
|
|
'teacher_id' => $this->teacherId,
|
|
|
'error' => $e->getMessage()
|
|
'error' => $e->getMessage()
|
|
|
]);
|
|
]);
|
|
|
- $this->students = [];
|
|
|
|
|
|
|
+ return [];
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -163,11 +137,15 @@ class StudentDashboard extends Page
|
|
|
*/
|
|
*/
|
|
|
public function updatedTeacherId(): void
|
|
public function updatedTeacherId(): void
|
|
|
{
|
|
{
|
|
|
- $this->loadStudentsByTeacher();
|
|
|
|
|
// 清空之前选中的学生ID
|
|
// 清空之前选中的学生ID
|
|
|
$this->studentId = '';
|
|
$this->studentId = '';
|
|
|
- // 自动加载第一个学生的数据
|
|
|
|
|
- $this->studentId = $this->getDefaultStudentId();
|
|
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 学生改变时重新加载数据
|
|
|
|
|
+ */
|
|
|
|
|
+ public function updatedStudentId(): void
|
|
|
|
|
+ {
|
|
|
if (!empty($this->studentId)) {
|
|
if (!empty($this->studentId)) {
|
|
|
$this->loadDashboardData();
|
|
$this->loadDashboardData();
|
|
|
}
|
|
}
|
|
@@ -175,6 +153,13 @@ class StudentDashboard extends Page
|
|
|
|
|
|
|
|
public function loadDashboardData(): void
|
|
public function loadDashboardData(): void
|
|
|
{
|
|
{
|
|
|
|
|
+ // 检查是否选择了学生
|
|
|
|
|
+ if (empty($this->studentId)) {
|
|
|
|
|
+ $this->errorMessage = '请先选择学生';
|
|
|
|
|
+ $this->isLoading = false;
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
$this->isLoading = true;
|
|
$this->isLoading = true;
|
|
|
$this->errorMessage = '';
|
|
$this->errorMessage = '';
|
|
|
|
|
|
|
@@ -245,12 +230,6 @@ class StudentDashboard extends Page
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- public function updatedStudentId(): void
|
|
|
|
|
- {
|
|
|
|
|
- // 学生ID更新后自动刷新数据
|
|
|
|
|
- $this->loadDashboardData();
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
public function recalculateMastery(string $kpCode): void
|
|
public function recalculateMastery(string $kpCode): void
|
|
|
{
|
|
{
|
|
|
try {
|
|
try {
|