Complete distribution flow and student UI

- progress-service: Distribute variants (round-robin per lab per level),
  student level assignment, API for levels/assignments
- progress-service: Inter-service clients (academic, identity) via RestClient
- web: Admin lab detail page with distribute/level buttons
- web: Student dashboard shows assigned labs from progress-service
- web: ApiClient methods for labs detail, distribute, levels, me/assignments
- academic-service: Add id to LabLevelDetail DTO for progress-service
- Fix: CSS-only layout, footer at bottom via flex column
This commit is contained in:
2026-09-10 22:18:47 +03:00
parent b4c801853a
commit 84532adbff
18 changed files with 753 additions and 26 deletions

View File

@@ -4,15 +4,24 @@
<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 class="card card-body">
<p>Разделы в разработке:</p>
<ul class="text-sm text-muted mt-2 list-pad">
<li>список лабораторных и сроки сдачи;</li>
<li>условие закреплённого за вами варианта;</li>
<li>статьи и материалы занятий;</li>
<li>отправка решений.</li>
</ul>
<p class="text-sm text-muted mb-6">Ваши лабораторные работы</p>
<div th:if="${#lists.isEmpty(assignments)}" class="card card-body text-muted">
Пока нет назначенных лабораторных. Ожидайте, пока преподаватель распределит варианты.
</div>
<div class="card card-flush" th:unless="${#lists.isEmpty(assignments)}">
<table>
<thead><tr><th>№</th><th>Название</th><th>Вариант</th><th>Срок сдачи</th><th>Дата защиты</th><th>Статус</th></tr></thead>
<tbody>
<tr th:each="a : ${assignments}">
<td th:text="${a.labNumber}">1</td>
<td th:text="${a.labTitle}">—</td>
<td th:text="${a.variantNumber}">—</td>
<td class="text-sm text-muted" th:text="${a.deadlineAt}">—</td>
<td class="text-sm text-muted" th:text="${a.defenseAt}">—</td>
<td><span class="badge badge-warn">назначено</span></td>
</tr>
</tbody>
</table>
</div>
</div>
</body>