view.blade.php 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. <div class="ui-page">
  2. <div class="mx-auto flex max-w-7xl flex-col gap-6 px-4 py-8">
  3. @include('filament.partials.page-header', [
  4. 'kicker' => '教材详情',
  5. 'title' => $this->record->official_title ?? '教材详情',
  6. 'subtitle' => '查看教材信息、目录结构与关联卷子',
  7. 'actions' => new \Illuminate\Support\HtmlString(
  8. ($this->record?->id
  9. ? '<a class="btn btn-primary" href="' . route('filament.admin.resources.textbooks.edit', ['record' => $this->record->id]) . '">编辑教材</a>'
  10. . '<a class="btn btn-outline" href="' . route('filament.admin.resources.textbooks.edit', ['record' => $this->record->id]) . '#cover">上传封面</a>'
  11. : ''
  12. )
  13. . '<a class="btn btn-secondary" href="' . route('filament.admin.pages.textbook-excel-import-page') . '?type=textbook_catalog">导入目录</a>'
  14. ),
  15. ])
  16. <div class="grid grid-cols-1 gap-6 lg:grid-cols-3">
  17. <div class="space-y-6">
  18. <div class="ui-card">
  19. <div class="ui-card-header">
  20. <div class="ui-section-title">教材信息</div>
  21. </div>
  22. <div class="ui-card-body space-y-4">
  23. <div class="flex items-start gap-4">
  24. @php
  25. $cover = $this->record->cover_path ?? null;
  26. $coverUrl = null;
  27. if ($cover) {
  28. $coverUrl = \Illuminate\Support\Str::startsWith($cover, ['http://', 'https://', '/'])
  29. ? $cover
  30. : \Illuminate\Support\Facades\Storage::disk('public')->url($cover);
  31. }
  32. @endphp
  33. @if($coverUrl)
  34. <img src="{{ $coverUrl }}" alt="封面" class="h-28 w-20 rounded-lg border border-slate-200 object-cover" />
  35. @else
  36. <div class="flex h-28 w-20 items-center justify-center rounded-lg border border-dashed border-slate-200 bg-slate-50 text-xs text-slate-400">暂无封面</div>
  37. @endif
  38. <div class="space-y-2">
  39. <div class="text-lg font-semibold text-slate-900">{{ $this->record->official_title ?? '未命名教材' }}</div>
  40. <div class="text-sm text-slate-500">系列:{{ $this->record->series_name ?? '未归类系列' }}</div>
  41. <div class="flex flex-wrap gap-2">
  42. <span class="ui-tag">学段:{{ $this->record->stage ?? '未标注' }}</span>
  43. <span class="ui-tag">年级:{{ $this->record->grade ? $this->record->grade . '年级' : '未标注' }}</span>
  44. <span class="ui-tag">学期:{{ $this->record->semester == 1 ? '上学期' : ($this->record->semester == 2 ? '下学期' : '未标注') }}</span>
  45. </div>
  46. </div>
  47. </div>
  48. <div class="grid grid-cols-2 gap-3 text-sm text-slate-600">
  49. <div class="ui-badge-muted">ISBN:{{ $this->record->isbn ?? '未填写' }}</div>
  50. <div class="ui-badge-muted">状态:{{ $this->record->status ?? '未知' }}</div>
  51. <div class="ui-badge-muted">ID:{{ $this->record->id }}</div>
  52. </div>
  53. </div>
  54. </div>
  55. <div class="ui-card">
  56. <div class="ui-card-header">
  57. <div>
  58. <div class="ui-section-title">绑定卷子</div>
  59. <div class="ui-subtitle">基于教材系列匹配的最近卷子</div>
  60. </div>
  61. </div>
  62. <div class="ui-card-body">
  63. @if(empty($this->linkedPapers))
  64. @include('filament.partials.empty-state', [
  65. 'title' => '暂无关联卷子',
  66. 'description' => '当前教材系列尚未关联到源卷子。',
  67. ])
  68. @else
  69. <div class="mb-3 text-xs text-slate-500">
  70. 目录未绑定卷子:{{ $this->unlinkedPaperCount }} 套
  71. </div>
  72. <div class="space-y-3">
  73. @foreach($this->linkedPapers as $paper)
  74. <div class="rounded-xl border border-slate-200 px-4 py-3">
  75. <div class="text-sm font-semibold text-slate-900">{{ $paper['title'] }}</div>
  76. <div class="mt-1 flex flex-wrap gap-2 text-xs text-slate-500">
  77. <span class="ui-tag">章节:{{ $paper['chapter'] ?? '未标注' }}</span>
  78. <span class="ui-tag">年级:{{ $paper['grade'] ?? '未标注' }}</span>
  79. <span class="ui-tag">学期:{{ $paper['term'] ?? '未标注' }}</span>
  80. <span class="ui-tag">来源:{{ $paper['source_type'] ?? '未知' }}</span>
  81. </div>
  82. </div>
  83. @endforeach
  84. </div>
  85. @endif
  86. </div>
  87. </div>
  88. </div>
  89. <div class="lg:col-span-2">
  90. <div class="ui-card">
  91. <div class="ui-card-header">
  92. <div>
  93. <div class="ui-section-title">目录结构</div>
  94. <div class="ui-subtitle">教材章节目录树</div>
  95. </div>
  96. <a class="btn btn-outline btn-sm" href="{{ route('filament.admin.resources.textbook-catalogs.index', ['tableFilters[textbook_id][value]' => $this->record->id]) }}">管理目录</a>
  97. </div>
  98. <div class="ui-card-body">
  99. @if(empty($this->catalogTree))
  100. @include('filament.partials.empty-state', [
  101. 'title' => '暂无目录',
  102. 'description' => '请先导入或维护教材目录结构。',
  103. 'action' => new \Illuminate\Support\HtmlString('<a class="btn btn-primary btn-sm" href="' . route('filament.admin.pages.textbook-excel-import-page') . '?type=textbook_catalog">导入目录</a>'),
  104. ])
  105. @else
  106. @include('filament.partials.catalog-tree', ['nodes' => $this->catalogTree, 'coverage' => $this->catalogCoverage])
  107. @endif
  108. </div>
  109. </div>
  110. </div>
  111. </div>
  112. </div>
  113. @include('filament.partials.loading-overlay')
  114. </div>