From 5e60cc3819cdf8c0e331d36a98d62156ae2084ad Mon Sep 17 00:00:00 2001 From: Vladislav Kopnin Date: Sat, 12 Sep 2026 02:00:45 +0300 Subject: [PATCH] Phase 6: accordion in /learn; README feature notes; tests green MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - collapse chapters/sections via styled
with chevrons - identity testcontainers smoke passes on JDK 21 - README: student UX, comments, JDK note (logback ThrowableProxy in fat-jars → restart recovery), data dirs --- README.md | 24 ++++++++++++++--- web/src/main/resources/static/css/app.css | 13 +++++++++ .../main/resources/templates/learn/index.html | 27 ++++++++++++------- 3 files changed, 51 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 47eeb5b..6f5dc94 100644 --- a/README.md +++ b/README.md @@ -59,10 +59,28 @@ progress `:8083`, web `:8090`. Интерфейс: `http://localhost:8090`. markdown (код, спойлеры, картинки; санитизация OWASP); импорт ZIP (`chapters/N-глава/N-раздел/N-статья.md` + `assets/`); создание/переименование/ удаление глав, разделов, статей; перенос статей между разделами. -- **Студент**: видит опубликованные лабы, свой вариант с условием (markdown), - сроки сдачи/защиты и оценки. +- **Студент**: дашборд успеваемости (сдано, средний балл, лучшая/слабая оценка), + карточки опубликованных лаб, страница лабы: условие, свой вариант, сдача + файлов (zip/.c, переотправка до дедлайна, история, скачивание последней), + комментарий преподавателя к оценке, защита по одноразовому коду (30 мин). +- **Комментарии к оценкам**: тональность (pos/neu/neg), хранятся в БД, + автоподсказки при вводе ранжируются по частоте использования; видны студенту чипсами. - UI: светлая/тёмная тема (сохраняется в localStorage), модальные окна вместо - отдельных страниц, фавиконка, адаптивная вёрстка без inline-стилей. + отдельных страниц, аккордеоны глав/разделов в `/learn`, фавиконка, + адаптивная вёрстка без inline-стилей. + +## Примечания + +- **JDK 21 обязателен для runtime**. В связке Spring Boot 4.0.x + fat-jar logback + не находит `ThrowableProxy`, и это падает при любом исключении в потоке ответа. + Если после деплоя сервис вдруг «висит» на страницах (а `/actuator/health` даёт 200) — + лечится перезапуском (`./run.sh restart`). +- Даты хранятся в UTC (instant), а в UI конвертируются в Europe/Moscow + (`DateUtils`); формы datetime-local отправляются в московском времени. +- Капча/rate-limit на входе отсутствует — для учебного стендома оставлено; + пароли студентов показываются один раз при выдаче. +- `lms.submissions.dir` (default ./data/submissions) и `lms.content.assets-dir` + держите на постоянном томе при деплое. ## Сборка и тесты diff --git a/web/src/main/resources/static/css/app.css b/web/src/main/resources/static/css/app.css index 0f46167..ca034d1 100644 --- a/web/src/main/resources/static/css/app.css +++ b/web/src/main/resources/static/css/app.css @@ -231,3 +231,16 @@ code.code { padding: 0.125rem 0.5rem; border-radius: 0.25rem; font-family: monos .chip-neg { background: #b3283b; color: #fff; } /* Defense timer */ +/* Accordion (главы/разделы в /learn) */ +details.accordion > summary.acc-head { list-style: none; cursor: pointer; display: flex; align-items: center; justify-content: space-between; } +details.accordion > summary::-webkit-details-marker { display: none; } +details.accordion[open] > .acc-head, details.accordion > summary { margin-bottom: 0; } +.acc-arrow { width: 10px; height: 10px; border-right: 2px solid var(--c-text-muted); border-bottom: 2px solid var(--c-text-muted); transform: rotate(45deg); transition: transform 0.2s; margin-left: .75rem;} +details.accordion[open] > summary > .acc-arrow { transform: rotate(-135deg); } +.acc-title { margin: 0; font-size: 1.0625rem; } +.acc-body { border-top: 1px solid var(--c-border); } +details.sub-acc > summary.sub-head { list-style: none; cursor: pointer; } +details.sub-acc > summary::-webkit-details-marker { display: none; } +.sub-arrow { display: inline-block; width: 8px; height: 8px; border-right: 2px solid var(--c-text-muted); border-bottom: 2px solid var(--c-text-muted); transform: rotate(45deg); transition: transform 0.2s; margin-right: 6px; vertical-align: 2px;} +details.sub-acc[open] > summary .sub-arrow { transform: rotate(-135deg); } +.sub-actions { margin: 0 0 2px 18px; } diff --git a/web/src/main/resources/templates/learn/index.html b/web/src/main/resources/templates/learn/index.html index 1a4fbf1..b5a2400 100644 --- a/web/src/main/resources/templates/learn/index.html +++ b/web/src/main/resources/templates/learn/index.html @@ -18,8 +18,12 @@ Материалы ещё не добавлены. -
-
+
+ +

Глава

+ +
+

Глава

@@ -35,20 +39,24 @@

Разделов пока нет

-
-
-

+
+ +

+ Раздел

+
+
+
-
- +
@@ -105,8 +113,7 @@

-
- +
-
+