TeacherResource.php 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  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.username')
  38. ->label('手机号(登录用户名)')
  39. ->required()
  40. ->regex('/^1[3-9]\d{9}$/')
  41. ->placeholder('请输入11位手机号(将作为登录用户名)')
  42. ->helperText('请输入11位手机号码,将作为登录用户名')
  43. ->maxLength(11)
  44. ->minLength(11),
  45. TextInput::make('user.email')
  46. ->label('邮箱地址(可选)')
  47. ->email()
  48. ->nullable()
  49. ->placeholder('请输入邮箱地址(可选)'),
  50. TextInput::make('user.password_hash')
  51. ->label('密码')
  52. ->required()
  53. ->password()
  54. ->revealable()
  55. ->dehydrateStateUsing(fn ($state) => Hash::make($state))
  56. ->placeholder('请输入密码'),
  57. Textarea::make('remark')
  58. ->label('备注')
  59. ->rows(3)
  60. ->placeholder('请输入备注信息(可选)')
  61. ->columnSpanFull(),
  62. ])->columns(2);
  63. }
  64. public static function table(Table $table): Table
  65. {
  66. return $table
  67. ->columns([
  68. Tables\Columns\TextColumn::make('teacher_id')
  69. ->label('教师ID')
  70. ->badge()
  71. ->color('primary')
  72. ->copyable()
  73. ->copyMessage('教师ID已复制')
  74. ->copyMessageDuration(1500)
  75. ->sortable()
  76. ->searchable(),
  77. Tables\Columns\TextColumn::make('name')
  78. ->label('姓名')
  79. ->weight('bold')
  80. ->searchable()
  81. ->sortable(),
  82. Tables\Columns\TextColumn::make('subject')
  83. ->label('教授科目')
  84. ->badge()
  85. ->color('info')
  86. ->sortable(),
  87. Tables\Columns\TextColumn::make('user.username')
  88. ->label('手机号(登录名)')
  89. ->badge()
  90. ->color('primary')
  91. ->copyable()
  92. ->sortable(),
  93. Tables\Columns\TextColumn::make('user.phone')
  94. ->label('备用手机号')
  95. ->copyable()
  96. ->sortable(),
  97. Tables\Columns\TextColumn::make('user.email')
  98. ->label('邮箱')
  99. ->copyable()
  100. ->sortable()
  101. ->toggleable(isToggledHiddenByDefault: true),
  102. Tables\Columns\TextColumn::make('students_count')
  103. ->label('学生数量')
  104. ->counts('students')
  105. ->sortable()
  106. ->alignCenter()
  107. ->badge()
  108. ->color('success'),
  109. Tables\Columns\TextColumn::make('created_at')
  110. ->label('创建时间')
  111. ->dateTime('Y-m-d H:i')
  112. ->sortable()
  113. ->toggleable(isToggledHiddenByDefault: true),
  114. ])
  115. ->filters([
  116. Tables\Filters\SelectFilter::make('subject')
  117. ->label('教授科目')
  118. ->options(fn () => self::subjectOptions())
  119. ->placeholder('全部科目'),
  120. ])
  121. ->actions([])
  122. ->bulkActions([])
  123. ->emptyStateHeading('暂无教师记录')
  124. ->emptyStateDescription('开始添加第一位教师吧')
  125. ->emptyStateActions([]);
  126. }
  127. public static function getPages(): array
  128. {
  129. return [
  130. 'index' => Pages\ListTeachers::route('/'),
  131. 'create' => Pages\CreateTeacher::route('/create'),
  132. 'view' => Pages\ViewTeacher::route('/{record}'),
  133. 'edit' => Pages\EditTeacher::route('/{record}/edit'),
  134. ];
  135. }
  136. protected static function subjectOptions(): array
  137. {
  138. return [
  139. 'math' => '数学',
  140. 'chinese' => '语文',
  141. 'english' => '英语',
  142. 'physics' => '物理',
  143. 'chemistry' => '化学',
  144. 'biology' => '生物',
  145. 'history' => '历史',
  146. 'geography' => '地理',
  147. 'politics' => '政治',
  148. 'other' => '其他',
  149. ];
  150. }
  151. }