kp-detail.blade.php 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. @php
  2. $skills = collect($point['skills'] ?? []);
  3. $parents = collect($point['parents'] ?? []);
  4. $metrics = [
  5. [
  6. 'label' => '重要度',
  7. 'value' => number_format((float) ($point['importance'] ?? 0), 1),
  8. 'subtitle' => '教研侧设定的掌握权重',
  9. ],
  10. [
  11. 'label' => '技能数量',
  12. 'value' => $skills->count(),
  13. 'subtitle' => '拆解后的可练单元',
  14. ],
  15. [
  16. 'label' => '上游节点',
  17. 'value' => $parents->count(),
  18. 'subtitle' => '可追溯的先修知识',
  19. ],
  20. ];
  21. @endphp
  22. <div class="space-y-6">
  23. <div class="rounded-2xl bg-gradient-to-br from-primary-500/90 via-primary-500 to-primary-600 text-white shadow-lg px-6 py-5">
  24. <div class="flex flex-wrap gap-4 items-start justify-between">
  25. <div class="space-y-1">
  26. <p class="text-sm uppercase tracking-[0.2em] text-white/80">Knowledge Node</p>
  27. <h2 class="text-2xl font-semibold">
  28. {{ $point['cn_name'] ?? '未命名知识点' }}
  29. <span class="ml-2 text-sm font-normal text-white/70">({{ $point['kp_code'] ?? '未知编号' }})</span>
  30. </h2>
  31. <div class="flex flex-wrap gap-2 text-sm text-white/90">
  32. <span class="inline-flex items-center gap-1 rounded-full bg-white/15 px-3 py-1">
  33. <x-filament::icon icon="heroicon-m-banknotes" class="h-4 w-4" />
  34. {{ $point['category'] ?? '未分类' }}
  35. </span>
  36. <span class="inline-flex items-center gap-1 rounded-full bg-white/15 px-3 py-1">
  37. <x-filament::icon icon="heroicon-m-academic-cap" class="h-4 w-4" />
  38. {{ $point['phase'] ?? '未知学段' }} @if($point['grade']) · {{ $point['grade'] }} 年级 @endif
  39. </span>
  40. </div>
  41. </div>
  42. <div class="flex gap-4">
  43. @foreach($metrics as $metric)
  44. <div class="text-right">
  45. <p class="text-xs uppercase tracking-widest text-white/70">{{ $metric['label'] }}</p>
  46. <p class="text-2xl font-semibold">{{ $metric['value'] }}</p>
  47. <p class="text-xs text-white/80">{{ $metric['subtitle'] }}</p>
  48. </div>
  49. @endforeach
  50. </div>
  51. </div>
  52. </div>
  53. <x-filament::section>
  54. <div class="grid gap-6 lg:grid-cols-2">
  55. <div class="space-y-4">
  56. <h3 class="text-sm font-semibold text-gray-500 dark:text-gray-400">知识路径</h3>
  57. <div class="rounded-xl border border-gray-200/80 px-4 py-3 dark:border-gray-700/70">
  58. <p class="text-sm text-gray-900 dark:text-gray-100">
  59. {{ $point['group_path'] ?? '尚未设置。' }}
  60. </p>
  61. </div>
  62. <h3 class="text-sm font-semibold text-gray-500 dark:text-gray-400">描述 / 知识意图</h3>
  63. <div class="rounded-xl border border-gray-200/80 bg-gray-50 px-4 py-3 text-sm text-gray-700 dark:border-gray-700/60 dark:bg-gray-800/50 dark:text-gray-200">
  64. {!! nl2br(e($point['description'] ?? '暂无描述,建议补充该知识点的课堂目标或常见错因。')) !!}
  65. </div>
  66. </div>
  67. <div class="space-y-4">
  68. <h3 class="text-sm font-semibold text-gray-500 dark:text-gray-400">先修关系</h3>
  69. <div class="rounded-xl border border-gray-200/80 px-4 py-4 dark:border-gray-700/70">
  70. @if($parents->isEmpty())
  71. <p class="text-sm text-gray-500">无父节点,可能是一级知识点。</p>
  72. @else
  73. <ol class="relative border-l border-dashed border-primary-200 dark:border-primary-500/40 pl-4">
  74. @foreach($parents as $parent)
  75. <li class="mb-4 ml-2">
  76. <span class="absolute -left-1.5 mt-1 h-3 w-3 rounded-full border-2 border-white bg-primary-400 dark:border-gray-900"></span>
  77. <p class="text-sm font-medium text-gray-900 dark:text-gray-100">{{ $parent }}</p>
  78. <p class="text-xs text-gray-500">触发该节点之前需掌握</p>
  79. </li>
  80. @endforeach
  81. </ol>
  82. @endif
  83. </div>
  84. </div>
  85. </div>
  86. </x-filament::section>
  87. <x-filament::section heading="技能拆解">
  88. @if($skills->isEmpty())
  89. <div class="rounded-xl border border-dashed border-gray-300 bg-white px-4 py-6 text-center text-sm text-gray-500 dark:border-gray-700 dark:bg-gray-900/40">
  90. 该知识点尚未配置技能,建议补充规则步骤、策略和应用场景,便于题库筛选。
  91. </div>
  92. @else
  93. <div class="grid gap-4 md:grid-cols-2">
  94. @foreach($skills as $skill)
  95. <div class="rounded-2xl border border-gray-200/70 bg-white/80 px-5 py-4 shadow-sm backdrop-blur-sm dark:border-gray-700/60 dark:bg-gray-900/40">
  96. <div class="flex items-start justify-between">
  97. <div>
  98. <p class="text-sm font-semibold text-gray-900 dark:text-gray-100">
  99. {{ $skill['skill_name'] ?? '未命名技能' }}
  100. </p>
  101. <p class="text-xs text-gray-500">
  102. {{ $skill['skill_type'] ?? '类型未知' }}
  103. </p>
  104. </div>
  105. <span class="inline-flex items-center gap-1 rounded-full bg-primary-50 px-2.5 py-0.5 text-xs font-medium text-primary-700 dark:bg-primary-500/10 dark:text-primary-300">
  106. <x-filament::icon icon="heroicon-m-shield-check" class="h-4 w-4" />
  107. 难度 {{ $skill['difficulty'] ?? '-' }}
  108. </span>
  109. </div>
  110. <p class="mt-3 text-sm text-gray-600 dark:text-gray-300 leading-relaxed">
  111. {{ $skill['description'] ?? '暂无描述' }}
  112. </p>
  113. @if(!empty($skill['examples']))
  114. <div class="mt-3 rounded-lg bg-gray-50 px-3 py-2 text-xs text-gray-500 dark:bg-gray-800/50 dark:text-gray-300">
  115. <p class="font-medium text-gray-600 dark:text-gray-200">例题提示:</p>
  116. {{ $skill['examples'][0]['prompt'] ?? '' }}
  117. </div>
  118. @endif
  119. </div>
  120. @endforeach
  121. </div>
  122. @endif
  123. </x-filament::section>
  124. </div>