QuestionResource.php 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. <?php
  2. namespace App\Filament\Resources;
  3. use App\Filament\Resources\QuestionResource\Pages;
  4. use App\Jobs\GenerateSolutionJob;
  5. use App\Jobs\GenerateSvgJob;
  6. use App\Jobs\MatchKnowledgeJob;
  7. use App\Models\Question;
  8. use BackedEnum;
  9. use Filament\Actions\BulkAction;
  10. use Filament\Actions\BulkActionGroup;
  11. use Filament\Actions\EditAction;
  12. use Filament\Actions\ViewAction;
  13. use Filament\Schemas\Components\Section;
  14. use Filament\Forms\Components\Select;
  15. use Filament\Forms\Components\Textarea;
  16. use Filament\Forms\Components\TextInput;
  17. use Filament\Resources\Resource;
  18. use Filament\Schemas\Schema;
  19. use Filament\Tables;
  20. use Filament\Tables\Columns\TextColumn;
  21. use Filament\Tables\Filters\SelectFilter;
  22. use Filament\Tables\Filters\Filter;
  23. use Illuminate\Database\Eloquent\Builder;
  24. use UnitEnum;
  25. class QuestionResource extends Resource
  26. {
  27. protected static bool $shouldRegisterNavigation = false;
  28. protected static ?string $model = Question::class;
  29. protected static ?string $navigationLabel = '正式题库';
  30. protected static ?string $modelLabel = '题目';
  31. protected static ?string $pluralModelLabel = '题目';
  32. protected static BackedEnum|string|null $navigationIcon = 'heroicon-o-rectangle-stack';
  33. protected static UnitEnum|string|null $navigationGroup = '题库管理';
  34. protected static ?int $navigationSort = 1;
  35. public static function form(Schema $schema): Schema
  36. {
  37. return $schema
  38. ->schema([
  39. Section::make('题目内容')
  40. ->schema([
  41. TextInput::make('question_code')->required()->maxLength(128),
  42. Select::make('question_type')
  43. ->options([
  44. 'choice' => '选择题',
  45. 'fill' => '填空题',
  46. 'answer' => '解答题',
  47. ])
  48. ->required(),
  49. Textarea::make('stem')->required()->rows(6),
  50. Textarea::make('answer')->rows(3),
  51. Textarea::make('solution')->rows(6),
  52. TextInput::make('difficulty')->numeric()->minValue(1)->maxValue(5),
  53. ])
  54. ->columns(2),
  55. ]);
  56. }
  57. public static function table(Tables\Table $table): Tables\Table
  58. {
  59. return $table
  60. ->columns([
  61. TextColumn::make('question_code')->label('编码')->searchable(),
  62. TextColumn::make('question_type')->label('题型')->sortable(),
  63. TextColumn::make('stem')->label('题干')->limit(60)->wrap()->searchable(),
  64. TextColumn::make('difficulty')->label('难度')->sortable(),
  65. TextColumn::make('updated_at')->label('更新')->dateTime(),
  66. ])
  67. ->filters([
  68. SelectFilter::make('question_type')
  69. ->options([
  70. 'choice' => '选择题',
  71. 'fill' => '填空题',
  72. 'answer' => '解答题',
  73. ]),
  74. Filter::make('difficulty_range')
  75. ->form([
  76. TextInput::make('min')->numeric(),
  77. TextInput::make('max')->numeric(),
  78. ])
  79. ->query(function (Builder $query, array $data) {
  80. if ($data['min'] !== null && $data['max'] !== null) {
  81. $query->whereBetween('difficulty', [$data['min'], $data['max']]);
  82. }
  83. }),
  84. ])
  85. ->actions([
  86. ViewAction::make(),
  87. EditAction::make(),
  88. ])
  89. ->bulkActions([
  90. BulkActionGroup::make([
  91. BulkAction::make('queue_solution')
  92. ->label('生成解析')
  93. ->action(fn ($records) => $records->each(fn ($record) => GenerateSolutionJob::dispatch($record->id))),
  94. BulkAction::make('match_knowledge')
  95. ->label('匹配知识点')
  96. ->action(fn ($records) => $records->each(fn ($record) => MatchKnowledgeJob::dispatch($record->id))),
  97. BulkAction::make('generate_svg')
  98. ->label('生成SVG')
  99. ->action(fn ($records) => $records->each(fn ($record) => GenerateSvgJob::dispatch($record->id))),
  100. ]),
  101. ]);
  102. }
  103. public static function getPages(): array
  104. {
  105. return [
  106. 'index' => Pages\ListQuestions::route('/'),
  107. 'create' => Pages\CreateQuestion::route('/create'),
  108. 'view' => Pages\ViewQuestion::route('/{record}'),
  109. 'edit' => Pages\EditQuestion::route('/{record}/edit'),
  110. ];
  111. }
  112. }