TeacherResource.php 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. <?php
  2. namespace App\Filament\Resources;
  3. use App\Filament\Resources\TeacherResource\Pages;
  4. use App\Models\Teacher;
  5. use App\Models\User;
  6. use Filament\Forms\Components\TextInput;
  7. use Filament\Forms\Components\Select;
  8. use Filament\Forms\Components\Textarea;
  9. use Filament\Resources\Resource;
  10. use Filament\Schemas\Schema;
  11. use Filament\Tables;
  12. use Filament\Tables\Table;
  13. use Illuminate\Support\Facades\DB;
  14. use Illuminate\Support\Facades\Hash;
  15. class TeacherResource extends Resource
  16. {
  17. protected static ?string $model = Teacher::class;
  18. protected static bool $shouldRegisterNavigation = false;
  19. public static function form(Schema $schema): Schema
  20. {
  21. return $schema->schema([
  22. TextInput::make('teacher_id')
  23. ->label('教师ID')
  24. ->disabled()
  25. ->hidden(fn (?Teacher $record) => blank($record))
  26. ->formatStateUsing(fn (?Teacher $record): string => $record?->teacher_id ?? ''),
  27. TextInput::make('name')
  28. ->label('教师姓名')
  29. ->required()
  30. ->maxLength(128)
  31. ->placeholder('请输入教师姓名'),
  32. TextInput::make('subject')
  33. ->label('教授科目')
  34. ->required()
  35. ->maxLength(64)
  36. ->placeholder('例如:数学、语文、英语等'),
  37. TextInput::make('user.email')
  38. ->label('邮箱地址(可选)')
  39. ->email()
  40. ->placeholder('请输入邮箱地址')
  41. ->reactive()
  42. ->afterStateUpdated(fn ($state, callable $set) => $state ? $set('user.username', explode('@', $state)[0] ?? '') : null),
  43. TextInput::make('user.username')
  44. ->label('用户名')
  45. ->required()
  46. ->maxLength(64)
  47. ->placeholder('登录用户名'),
  48. TextInput::make('user.password_hash')
  49. ->label('密码')
  50. ->required()
  51. ->password()
  52. ->revealable()
  53. ->dehydrateStateUsing(fn ($state) => Hash::make($state))
  54. ->placeholder('请输入密码'),
  55. Textarea::make('remark')
  56. ->label('备注')
  57. ->rows(3)
  58. ->placeholder('请输入备注信息(可选)')
  59. ->columnSpanFull(),
  60. ])->columns(2);
  61. }
  62. public static function table(Table $table): Table
  63. {
  64. return $table
  65. ->columns([
  66. Tables\Columns\TextColumn::make('teacher_id')
  67. ->label('教师ID')
  68. ->badge()
  69. ->color('primary')
  70. ->copyable()
  71. ->copyMessage('教师ID已复制')
  72. ->copyMessageDuration(1500)
  73. ->sortable()
  74. ->searchable(),
  75. Tables\Columns\TextColumn::make('name')
  76. ->label('姓名')
  77. ->weight('bold')
  78. ->searchable()
  79. ->sortable(),
  80. Tables\Columns\TextColumn::make('subject')
  81. ->label('教授科目')
  82. ->badge()
  83. ->color('info')
  84. ->sortable(),
  85. Tables\Columns\TextColumn::make('user.email')
  86. ->label('邮箱')
  87. ->copyable()
  88. ->sortable(),
  89. Tables\Columns\TextColumn::make('user.username')
  90. ->label('用户名')
  91. ->sortable(),
  92. Tables\Columns\TextColumn::make('students_count')
  93. ->label('学生数量')
  94. ->counts('students')
  95. ->sortable()
  96. ->alignCenter()
  97. ->badge()
  98. ->color('success'),
  99. Tables\Columns\TextColumn::make('created_at')
  100. ->label('创建时间')
  101. ->dateTime('Y-m-d H:i')
  102. ->sortable()
  103. ->toggleable(isToggledHiddenByDefault: true),
  104. ])
  105. ->filters([
  106. Tables\Filters\SelectFilter::make('subject')
  107. ->label('教授科目')
  108. ->options(fn () => self::subjectOptions())
  109. ->placeholder('全部科目'),
  110. ])
  111. ->actions([])
  112. ->bulkActions([])
  113. ->emptyStateHeading('暂无教师记录')
  114. ->emptyStateDescription('开始添加第一位教师吧')
  115. ->emptyStateActions([]);
  116. }
  117. public static function getPages(): array
  118. {
  119. return [
  120. 'index' => Pages\ListTeachers::route('/'),
  121. 'create' => Pages\CreateTeacher::route('/create'),
  122. 'view' => Pages\ViewTeacher::route('/{record}'),
  123. 'edit' => Pages\EditTeacher::route('/{record}/edit'),
  124. ];
  125. }
  126. protected static function subjectOptions(): array
  127. {
  128. return [
  129. 'math' => '数学',
  130. 'chinese' => '语文',
  131. 'english' => '英语',
  132. 'physics' => '物理',
  133. 'chemistry' => '化学',
  134. 'biology' => '生物',
  135. 'history' => '历史',
  136. 'geography' => '地理',
  137. 'politics' => '政治',
  138. 'other' => '其他',
  139. ];
  140. }
  141. }