Phase 2+5: lab submissions and student lab flow
- progress: submissions table+V4; SubmissionService (deadline-gated submit,
unlimited resubmits, per-student history, zip download); files on disk
data/submissions/{student}/{lab}/{seq}/
- student API: POST submit (multipart), GET me submissions, download; admin
GET lab submissions + admin download (zip pack)
- progress enrich(): labId in MeAssignment; web DTO aligned
- web: /student dashboard (avg/best/worst cards), /student/labs cards,
/student/labs/{id}: condition md, variant block, submit form, history;
'Лабораторные' link in nav for students
- admin: submissions column on lab assignment table + download link
- fixed long-standing template bug: broken @{} expression (missing }) in
admin/lab and student/lab
This commit is contained in:
@@ -4,27 +4,44 @@
|
||||
<body>
|
||||
<div id="content">
|
||||
<h1 class="page-title">Здравствуйте, <span th:text="${currentUser.name}">студент</span></h1>
|
||||
<p class="text-sm text-muted mb-6">Ваши лабораторные работы</p>
|
||||
|
||||
<div th:if="${#lists.isEmpty(assignments)}" class="card card-body text-muted">
|
||||
Пока нет назначенных лабораторных. Ожидайте, пока преподаватель распределит варианты.
|
||||
<div class="grid grid-stats">
|
||||
<div class="card card-body"><p class="stat-title">Сдано работ</p>
|
||||
<p class="stat-value" th:text="${submittedCount}">0</p></div>
|
||||
<div class="card card-body"><p class="stat-title">Средний балл</p>
|
||||
<p class="stat-value" th:if="${average != null}" th:text="${average}">—</p>
|
||||
<p class="stat-value text-muted" th:if="${average == null}">—</p></div>
|
||||
<div class="card card-body"><p class="stat-title">Лучшая оценка</p>
|
||||
<p class="stat-value" th:if="${best != null}" th:text="${best.toPlainString()}">—</p>
|
||||
<p class="stat-value text-muted" th:if="${best == null}">—</p></div>
|
||||
<div class="card card-body"><p class="stat-title">Слабое место</p>
|
||||
<p class="stat-value" th:if="${worst != null}" th:text="${worst.toPlainString()}">—</p>
|
||||
<p class="stat-value text-muted" th:if="${worst == null}">—</p></div>
|
||||
</div>
|
||||
|
||||
<div th:each="a : ${assignments}" class="card mb-6">
|
||||
<div class="card-body">
|
||||
<div class="flex flex-wrap items-center justify-between gap-4">
|
||||
<h2 class="section-title" th:text="|ЛР ${a.labNumber}. ${a.labTitle}|">ЛР</h2>
|
||||
<div class="flex gap-2 items-center">
|
||||
<span class="badge badge-ok">Вариант <span class="font-mono" th:text="${a.variantNumber}">—</span></span>
|
||||
<span th:if="${a.levelTitle}" class="badge badge-warn" th:text="${a.levelTitle}">—</span>
|
||||
<div class="flex flex-wrap gap-2 mt-8">
|
||||
<a class="btn btn-primary" th:href="@{/student/labs}">Лабораторные</a>
|
||||
<a class="btn btn-secondary" th:href="@{/learn}">Учебные материалы</a>
|
||||
</div>
|
||||
|
||||
<h2 class="section-title mt-8">Мои лабораторные</h2>
|
||||
<div class="grid grid-2">
|
||||
<div th:each="c : ${cards}" class="card">
|
||||
<div class="card-body">
|
||||
<h3 class="section-title">
|
||||
<a th:href="@{/student/labs/{id}(id=${c.id})}" th:text="|Лабораторная работа ${c.number}|">ЛР</a>
|
||||
</h3>
|
||||
<p class="text-sm" th:text="${c.title}">—</p>
|
||||
<div class="flex flex-wrap gap-2 mt-2 text-sm">
|
||||
<span th:if="${c.variantNumber}" class="badge badge-warn">вариант <span class="font-mono" th:text="${c.variantNumber}"></span></span>
|
||||
<span th:if="${c.submissionSeq}" class="badge badge-ok">сдано (попытка <span th:text="${c.submissionSeq}">1</span>)</span>
|
||||
<span th:unless="${c.submissionSeq}" class="badge badge-warn">не сдано</span>
|
||||
<span th:if="${c.grade}" class="badge badge-ok">оценка <span th:text="${c.grade}"></span></span>
|
||||
</div>
|
||||
</div>
|
||||
<p class="text-sm text-muted" th:if="${a.variantTitle}" th:text="${a.variantTitle}">—</p>
|
||||
<p class="text-sm text-muted" th:if="${a.deadlineMsk}" th:text="|Срок сдачи: ${a.deadlineMsk} (МСК)|">—</p>
|
||||
<p class="text-sm text-muted" th:if="${a.defenseMsk}" th:text="|Защита: ${a.defenseMsk} (МСК)|">—</p>
|
||||
<div class="md-body mt-4" th:utext="${a.statementHtml}"></div>
|
||||
</div>
|
||||
<div th:if="${#lists.isEmpty(cards)}" class="card card-body text-muted">Лабораторных пока нет.</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
</html>
|
||||
|
||||
Reference in New Issue
Block a user