edit-student.blade.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. <div>
  2. @php
  3. $student = $this->record;
  4. $currentUser = auth()->user();
  5. $isTeacher = $currentUser?->isTeacher() ?? false;
  6. $teachers = \App\Models\Teacher::with('user')->get()->mapWithKeys(fn($t) => [$t->teacher_id => $t->user?->full_name ?? $t->name]);
  7. @endphp
  8. <div class="grid grid-cols-1 lg:grid-cols-3 gap-6">
  9. {{-- 主表单区域 --}}
  10. <div class="lg:col-span-2">
  11. <div class="card bg-base-100 shadow-xl">
  12. <div class="card-body">
  13. <h2 class="card-title text-xl mb-2">编辑学生信息</h2>
  14. <p class="text-base-content/60 text-sm mb-6">修改学生的基本信息,带 * 的为必填项</p>
  15. <form wire:submit="save">
  16. <div class="grid grid-cols-1 md:grid-cols-2 gap-6">
  17. {{-- 学生ID(只读) --}}
  18. <div class="form-control w-full">
  19. <label class="label">
  20. <span class="label-text font-medium">学生ID</span>
  21. </label>
  22. <input type="text"
  23. value="{{ $student->student_id }}"
  24. class="input input-bordered w-full bg-base-200"
  25. disabled />
  26. </div>
  27. {{-- 姓名 --}}
  28. <div class="form-control w-full">
  29. <label class="label">
  30. <span class="label-text font-medium">姓名 <span class="text-error">*</span></span>
  31. </label>
  32. <input type="text"
  33. wire:model="data.name"
  34. placeholder="请输入学生姓名"
  35. class="input input-bordered w-full focus:input-primary"
  36. required />
  37. @error('data.name')
  38. <label class="label"><span class="label-text-alt text-error">{{ $message }}</span></label>
  39. @enderror
  40. </div>
  41. {{-- 年级 --}}
  42. <div class="form-control w-full">
  43. <label class="label">
  44. <span class="label-text font-medium">年级 <span class="text-error">*</span></span>
  45. </label>
  46. <input type="text"
  47. wire:model="data.grade"
  48. placeholder="例如:高一、高二"
  49. class="input input-bordered w-full focus:input-primary"
  50. required />
  51. @error('data.grade')
  52. <label class="label"><span class="label-text-alt text-error">{{ $message }}</span></label>
  53. @enderror
  54. </div>
  55. {{-- 班级 --}}
  56. <div class="form-control w-full">
  57. <label class="label">
  58. <span class="label-text font-medium">班级</span>
  59. <span class="label-text-alt text-base-content/50">选填</span>
  60. </label>
  61. <input type="text"
  62. wire:model="data.class_name"
  63. placeholder="例如:1班、2班"
  64. class="input input-bordered w-full focus:input-primary" />
  65. </div>
  66. {{-- 指导老师 --}}
  67. @if(!$isTeacher)
  68. <div class="form-control w-full md:col-span-2">
  69. <label class="label">
  70. <span class="label-text font-medium">指导老师 <span class="text-error">*</span></span>
  71. </label>
  72. <select wire:model="data.teacher_id"
  73. class="select select-bordered w-full focus:select-primary"
  74. required>
  75. <option value="">请选择指导老师</option>
  76. @foreach($teachers as $id => $name)
  77. <option value="{{ $id }}">{{ $name }}</option>
  78. @endforeach
  79. </select>
  80. @error('data.teacher_id')
  81. <label class="label"><span class="label-text-alt text-error">{{ $message }}</span></label>
  82. @enderror
  83. </div>
  84. @endif
  85. {{-- 备注 --}}
  86. <div class="form-control w-full md:col-span-2">
  87. <label class="label">
  88. <span class="label-text font-medium">备注</span>
  89. <span class="label-text-alt text-base-content/50">选填</span>
  90. </label>
  91. <textarea wire:model="data.remark"
  92. class="textarea textarea-bordered w-full focus:textarea-primary"
  93. placeholder="可以填写学生的特殊情况、学习偏好等"
  94. rows="3"></textarea>
  95. </div>
  96. </div>
  97. {{-- 操作按钮 --}}
  98. <div class="divider"></div>
  99. <div class="flex justify-between">
  100. <a href="{{ \App\Filament\Resources\StudentResource::getUrl('view', ['record' => $student]) }}"
  101. class="btn btn-ghost gap-2">
  102. <x-heroicon-o-arrow-left class="w-4 h-4" />
  103. 返回详情
  104. </a>
  105. <div class="flex gap-3">
  106. <button type="button" wire:click="$refresh" class="btn btn-ghost">
  107. 重置
  108. </button>
  109. <button type="submit" class="btn btn-primary gap-2">
  110. <span wire:loading.remove wire:target="save">
  111. <x-heroicon-o-check class="w-5 h-5" />
  112. 保存修改
  113. </span>
  114. <span wire:loading wire:target="save" class="flex items-center gap-2">
  115. <span class="loading loading-spinner loading-sm"></span>
  116. 保存中...
  117. </span>
  118. </button>
  119. </div>
  120. </div>
  121. </form>
  122. </div>
  123. </div>
  124. </div>
  125. {{-- 侧边栏 --}}
  126. <div class="lg:col-span-1 space-y-6">
  127. {{-- 学生头像卡片 --}}
  128. <div class="card bg-base-100 shadow-xl">
  129. <div class="card-body items-center text-center">
  130. <div class="avatar placeholder mb-4">
  131. <div class="bg-gradient-to-br from-primary to-secondary text-primary-content rounded-full w-20">
  132. <span class="text-2xl">{{ mb_substr($student->name, 0, 1) }}</span>
  133. </div>
  134. </div>
  135. <h3 class="text-lg font-bold">{{ $student->name }}</h3>
  136. <p class="text-base-content/60 text-sm">{{ $student->grade }} {{ $student->class_name }}</p>
  137. <div class="badge badge-outline badge-sm mt-2">{{ $student->student_id }}</div>
  138. </div>
  139. </div>
  140. {{-- 操作提示 --}}
  141. <div class="card bg-base-100 shadow-xl">
  142. <div class="card-body">
  143. <div class="flex items-center gap-3 mb-4">
  144. <div class="w-10 h-10 rounded-lg bg-warning/20 flex items-center justify-center">
  145. <x-heroicon-o-exclamation-triangle class="w-5 h-5 text-warning" />
  146. </div>
  147. <h3 class="card-title text-base">注意事项</h3>
  148. </div>
  149. <ul class="space-y-2 text-sm text-base-content/70">
  150. <li class="flex items-start gap-2">
  151. <x-heroicon-o-information-circle class="w-4 h-4 flex-shrink-0 mt-0.5" />
  152. <span>学生ID不可修改</span>
  153. </li>
  154. <li class="flex items-start gap-2">
  155. <x-heroicon-o-information-circle class="w-4 h-4 flex-shrink-0 mt-0.5" />
  156. <span>修改后点击保存生效</span>
  157. </li>
  158. </ul>
  159. </div>
  160. </div>
  161. {{-- 危险操作 --}}
  162. <div class="card bg-error/5 border border-error/20 shadow-xl">
  163. <div class="card-body">
  164. <div class="flex items-center gap-3 mb-4">
  165. <div class="w-10 h-10 rounded-lg bg-error/20 flex items-center justify-center">
  166. <x-heroicon-o-trash class="w-5 h-5 text-error" />
  167. </div>
  168. <h3 class="card-title text-base text-error">危险操作</h3>
  169. </div>
  170. <p class="text-sm text-base-content/70 mb-4">删除学生将同时删除所有相关的学习记录,此操作不可恢复。</p>
  171. <button type="button"
  172. wire:click="$dispatch('open-modal', { id: 'delete-confirmation' })"
  173. class="btn btn-error btn-outline btn-sm w-full">
  174. 删除学生
  175. </button>
  176. </div>
  177. </div>
  178. </div>
  179. </div>
  180. {{-- 删除确认模态框 --}}
  181. <x-filament::modal id="delete-confirmation" width="md">
  182. <x-slot name="heading">确认删除</x-slot>
  183. <x-slot name="description">
  184. 确定要删除学生 <strong>{{ $student->name }}</strong> 吗?此操作无法撤销。
  185. </x-slot>
  186. <x-slot name="footerActions">
  187. <x-filament::button color="gray" x-on:click="$dispatch('close-modal', { id: 'delete-confirmation' })">
  188. 取消
  189. </x-filament::button>
  190. <x-filament::button color="danger" wire:click="delete">
  191. 确认删除
  192. </x-filament::button>
  193. </x-slot>
  194. </x-filament::modal>
  195. </div>