mastery-analysis.blade.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. {{-- 学习分析组件 --}}
  2. <div class="space-y-6">
  3. @if(!empty($analysisData) || !empty($paperAnalysisData))
  4. {{-- 本次试卷分析结果 --}}
  5. @if(!empty($paperAnalysisData) && isset($paperAnalysisData['question_results']))
  6. <div class="card bg-base-100 shadow-xl border-2 border-primary">
  7. <div class="card-body">
  8. <h2 class="card-title text-2xl mb-4">
  9. <svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
  10. <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"></path>
  11. </svg>
  12. 本次试卷分析
  13. </h2>
  14. <div class="divider my-2"></div>
  15. {{-- 分析摘要 --}}
  16. @if(isset($paperAnalysisData['summary']))
  17. <div class="stats stats-vertical lg:stats-horizontal shadow w-full mb-6">
  18. <div class="stat">
  19. <div class="stat-title">题目总数</div>
  20. <div class="stat-value text-primary">{{ $paperAnalysisData['summary']['question_count'] ?? 0 }}</div>
  21. </div>
  22. <div class="stat">
  23. <div class="stat-title">分析成功</div>
  24. <div class="stat-value text-success">{{ $paperAnalysisData['summary']['successful_analyses'] ?? 0 }}</div>
  25. </div>
  26. <div class="stat">
  27. <div class="stat-title">掌握度更新</div>
  28. <div class="stat-value text-info">{{ $paperAnalysisData['summary']['mastery_updates'] ?? 0 }}</div>
  29. </div>
  30. </div>
  31. @endif
  32. {{-- 题目分析详情 --}}
  33. <div class="space-y-4">
  34. @foreach($paperAnalysisData['question_results'] as $result)
  35. <div class="card bg-base-200 border {{ $result['correct'] ? 'border-success' : 'border-error' }}">
  36. <div class="card-body">
  37. <div class="flex items-start justify-between">
  38. <div class="flex-1">
  39. <div class="flex items-center gap-2 mb-3">
  40. <span class="badge badge-primary badge-lg">第 {{ $result['question_number'] }} 题</span>
  41. <span class="badge badge-outline">{{ $result['kp_code'] }}</span>
  42. @if($result['correct'])
  43. <div class="badge badge-success gap-1">
  44. <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
  45. <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path>
  46. </svg>
  47. 正确
  48. </div>
  49. @else
  50. <div class="badge badge-error gap-1">
  51. <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
  52. <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path>
  53. </svg>
  54. 错误
  55. </div>
  56. @endif
  57. <span class="ml-auto text-2xl font-bold">{{ $result['score'] }}<span class="text-sm opacity-70">/{{ $result['full_score'] }}</span></span>
  58. </div>
  59. @if(!$result['correct'])
  60. <div class="divider my-2"></div>
  61. {{-- 错误分析 --}}
  62. <div class="grid grid-cols-1 md:grid-cols-2 gap-4">
  63. <div class="alert alert-warning">
  64. <svg class="w-5 h-5 shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
  65. <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"></path>
  66. </svg>
  67. <div>
  68. <div class="font-semibold">错误类型</div>
  69. <div class="text-sm">{{ $result['mistake_type'] ?? '未知' }} - {{ $result['mistake_category'] ?? '' }}</div>
  70. </div>
  71. </div>
  72. <div class="alert alert-info">
  73. <svg class="w-5 h-5 shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
  74. <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path>
  75. </svg>
  76. <div>
  77. <div class="font-semibold">错误原因</div>
  78. <div class="text-sm">{{ $result['reason'] ?? '' }}</div>
  79. </div>
  80. </div>
  81. </div>
  82. {{-- 学习建议 --}}
  83. @if(isset($result['suggestions']) && $result['suggestions'])
  84. <div class="alert alert-success mt-3">
  85. <svg class="w-5 h-5 shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
  86. <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"></path>
  87. </svg>
  88. <div>
  89. <div class="font-semibold">学习建议</div>
  90. <div class="text-sm">{{ $result['suggestions'] }}</div>
  91. </div>
  92. </div>
  93. @endif
  94. {{-- 下一步措施 --}}
  95. @if(isset($result['next_steps']) && is_array($result['next_steps']) && count($result['next_steps']) > 0)
  96. <div class="mt-3">
  97. <div class="font-semibold mb-2">下一步措施:</div>
  98. <ul class="list-disc list-inside space-y-1">
  99. @foreach($result['next_steps'] as $step)
  100. <li class="text-sm">{{ $step }}</li>
  101. @endforeach
  102. </ul>
  103. </div>
  104. @endif
  105. @else
  106. {{-- 正确答案的鼓励 --}}
  107. <div class="alert alert-success">
  108. <svg class="w-5 h-5 shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
  109. <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"></path>
  110. </svg>
  111. <span>{{ $result['suggestions'] ?? '答案完全正确,掌握度很好!' }}</span>
  112. </div>
  113. @endif
  114. </div>
  115. </div>
  116. </div>
  117. </div>
  118. @endforeach
  119. </div>
  120. </div>
  121. </div>
  122. @endif
  123. {{-- 整体掌握度分析 --}}
  124. @if(!empty($analysisData) && $recordData['status'] === 'completed')
  125. {{-- 整体掌握度 --}}
  126. @if(isset($analysisData['overall_mastery']))
  127. <div class="card bg-base-100 shadow-xl">
  128. <div class="card-body">
  129. <h2 class="card-title text-2xl mb-4">整体掌握度评估</h2>
  130. <div class="divider my-2"></div>
  131. <div class="stats stats-vertical lg:stats-horizontal shadow w-full">
  132. <div class="stat">
  133. <div class="stat-title">掌握度评分</div>
  134. <div class="stat-value text-primary">{{ number_format($analysisData['overall_mastery'] * 100, 1) }}%</div>
  135. <div class="stat-desc">
  136. @if($analysisData['overall_mastery'] >= 0.8)
  137. 优秀
  138. @elseif($analysisData['overall_mastery'] >= 0.6)
  139. 良好
  140. @else
  141. 需加强
  142. @endif
  143. </div>
  144. </div>
  145. <div class="stat">
  146. <div class="stat-title">薄弱知识点</div>
  147. <div class="stat-value text-warning">{{ count($analysisData['weak_areas'] ?? []) }} 个</div>
  148. <div class="stat-desc">需要重点关注</div>
  149. </div>
  150. <div class="stat">
  151. <div class="stat-title">知识点总数</div>
  152. <div class="stat-value">{{ $analysisData['total_knowledge_points'] ?? 0 }}</div>
  153. <div class="stat-desc">已评估</div>
  154. </div>
  155. </div>
  156. </div>
  157. </div>
  158. @endif
  159. {{-- 知识点掌握情况 --}}
  160. @if(!empty($analysisData['knowledge_points']))
  161. <div class="card bg-base-100 shadow-xl">
  162. <div class="card-body">
  163. <h2 class="card-title text-xl mb-4">知识点掌握情况</h2>
  164. <div class="divider my-2"></div>
  165. <div class="overflow-x-auto">
  166. <table class="table table-zebra">
  167. <thead>
  168. <tr>
  169. <th>知识点</th>
  170. <th>掌握度</th>
  171. <th>答题次数</th>
  172. <th>正确率</th>
  173. <th>状态</th>
  174. </tr>
  175. </thead>
  176. <tbody>
  177. @foreach($analysisData['knowledge_points'] as $kp)
  178. <tr>
  179. <td>
  180. <div class="font-medium">{{ $kp['name'] ?? $kp['kp_code'] }}</div>
  181. <div class="text-xs opacity-70">{{ $kp['kp_code'] }}</div>
  182. </td>
  183. <td>
  184. <div class="flex items-center gap-2">
  185. <progress
  186. class="progress {{ $kp['mastery'] >= 0.7 ? 'progress-success' : ($kp['mastery'] >= 0.4 ? 'progress-warning' : 'progress-error') }} w-20"
  187. value="{{ $kp['mastery'] * 100 }}"
  188. max="100"
  189. ></progress>
  190. <span class="text-sm">{{ number_format($kp['mastery'] * 100, 1) }}%</span>
  191. </div>
  192. </td>
  193. <td>{{ $kp['total_attempts'] ?? 0 }} 次</td>
  194. <td>{{ number_format(($kp['accuracy_rate'] ?? 0) * 100, 1) }}%</td>
  195. <td>
  196. @if($kp['mastery'] >= 0.7)
  197. <span class="badge badge-success badge-sm">良好</span>
  198. @elseif($kp['mastery'] >= 0.4)
  199. <span class="badge badge-warning badge-sm">一般</span>
  200. @else
  201. <span class="badge badge-error badge-sm">薄弱</span>
  202. @endif
  203. </td>
  204. </tr>
  205. @endforeach
  206. </tbody>
  207. </table>
  208. </div>
  209. </div>
  210. </div>
  211. @endif
  212. {{-- 学习建议 --}}
  213. @if(!empty($analysisData['recommendations']))
  214. <div class="card bg-base-100 shadow-xl">
  215. <div class="card-body">
  216. <h2 class="card-title text-xl mb-4">
  217. <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
  218. <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"></path>
  219. </svg>
  220. 学习建议
  221. </h2>
  222. <div class="divider my-2"></div>
  223. <div class="space-y-3">
  224. @foreach($analysisData['recommendations'] as $recommendation)
  225. <div class="alert alert-info">
  226. <svg class="w-5 h-5 shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
  227. <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path>
  228. </svg>
  229. <span>{{ $recommendation }}</span>
  230. </div>
  231. @endforeach
  232. </div>
  233. </div>
  234. </div>
  235. @endif
  236. @endif
  237. @else
  238. <div class="card bg-base-100 shadow-xl">
  239. <div class="card-body">
  240. <div class="text-center py-12">
  241. <svg class="w-16 h-16 mx-auto mb-4 opacity-30" fill="none" stroke="currentColor" viewBox="0 0 24 24">
  242. <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z"></path>
  243. </svg>
  244. <p class="text-lg font-medium opacity-70">暂无学习分析数据</p>
  245. <p class="text-sm mt-2 opacity-50">完成评分后将生成学习分析报告</p>
  246. </div>
  247. </div>
  248. </div>
  249. @endif
  250. </div>