# Порядок наполнения LMS данными (через интерфейс) Всё делается в админке, порядок: администратор → курс (bootstrap) → группы и студенты → лабораторная → раздача вариантов → защита → материалы. ## Шаг 1. Деплой См. [`DEPLOY.md`](DEPLOY.md): Docker + nginx + HTTPS. После старта сервисов откройте домен — попадёте на `/setup`, создайте администратора (логин и пароль храните в секрете, в репозиторий их не писать). ## Шаг 2. Курс Откройте **Курсы** (`/admin/courses`). Все лабораторные принадлежат курсу, поэтому курс должен существовать до импорта лабораторных. * **Существующая база:** если курсов ещё нет, нажмите «Создать курс и перенести данные». Bootstrap создаст курс «Промышленное программирование на языке C», привяжет к нему все активные группы и перенесёт существующие лабораторные и главы. Повторный запуск безопасен и не создаёт дублей. * **Новая база:** создайте курс кнопкой «+ Новый курс» (номер присвоится автоматически) либо тем же bootstrap. * После импорта групп (шаг 3) привяжите их к курсу на странице курса, если их не было в момент bootstrap: блок «Привязать группу». Там же назначаются преподаватели — по UUID аккаунта со страницы «Пользователи». Архивированный курс нельзя выбрать для новой лабораторной или копирования. Без курса создание и импорт лабораторной недоступны: в форме нужно выбрать курс. ## Шаг 3. Группы и студенты **Группы → Импорт** — загрузите `.xls`/`.xlsx`/`.csv` со списком группы. Обязательные столбцы: ```text поток | курс | номер | степень | год набора | ФИО | № | база ``` Все строки файла должны относиться к одной группе. Группа создаётся по полям (имя собирается автоматически, например `ПИ-11БО`). Логином студента становится номер (`№`), пароль генерируется (временный, с обязательной сменой при первом входе). Ключ слияния — `student_no`: повторный импорт обновляет студента, а не дублирует. Импорт атомарный: при ошибке в любой строке данные не меняются, а в интерфейсе показывается отчёт с номерами строк. Дальше по каждому студенту при необходимости: * **«Сбросить пароль»** — выдать новый временный пароль; * **«Добавить существующего»** — перевести студента из другой группы; * **«Отчислить из группы»** — убрать из группы, студент получает статус «отчислен»; аккаунт, сдачи и оценки сохраняются. Выгрузить логины: **«Логины XLSX» / «CSV»**. ## Шаг 4. Лабораторная **Лабораторные → Импорт** — сначала выберите **курс** (обязательно), затем загрузите ZIP со структурой: ```text lab.yaml # номер, название, points_max, уровни (code/title), сроки, статус README.md # общее условие (markdown) variants/01.md # вариант: front-matter (level, number, title) + текст задания ``` Примеры — в личном рабочем каталоге (не в репозитории). После импорта на странице лабораторной: * «Настроить» — срок сдачи, дата защиты, максимум баллов, статус; * уровни/варианты можно править и добавлять прямо там же; * «Копировать в курс» — создать копию лабораторной (с уровнями и вариантами) в другом курсе; номер и название можно изменить. Прогресс студентов не копируется, копия создаётся черновиком. ## Шаг 5. Раздача вариантов На странице лабораторной — **«Распределить»**: выбрать группы, при необходимости «пересоздать заново». Логика: случайная очередь по всем вариантам выбранного уровня; без повторов, пока в уровне есть невыданные варианты; закрепленные вручную не трогаются. Частично/точно — в списке назначений (уровень и вариант по каждому студенту) или массово чекбоксами. ## Шаг 6. Оценки и защита На странице группы (матрица): * **«опубликовать оценки»** — показать/скрыть оценки и комментарии студентам; * **«поставить оценку»** — балл + комментарии (позитивный/негативный/нейтральный); * раздел «Индивидуальные задания (защита)»: «Назначить задание» или импорт CSV (`студент;ЛР;задание` или `студент;задание` при выбранной ЛР), «выдать код», «изменить», «текст», после готовности — «доп. задание: начать заново». ## Шаг 7. Учебные материалы **Лабораторные → материалы (`/learn`)** доступны гостям. Для наполнения: создание глав/разделов/статей в админке или **импорт ZIP** со структурой: ```text chapters/01-глава/01-раздел/01-статья.md # front-matter: title, slug assets/ # картинки для md ``` Материалы видны всем; глобальные материалы редактирует только администратор («Материалы»). Преподаватель редактирует материалы своего курса на `/teacher/courses/{courseNo}/content`. Импорт бывает в двух режимах: с галочкой «Удалять разделы и статьи, которых нет в архиве» (синхронизация — архив считается источником истины) и без неё (merge — только добавить и обновить, правки в приложении сохраняются). Для догрузки отдельных статей используйте merge. Медиа в материалах: картинки и видео кладутся в `assets/` архива и вставляются директивами `:::figure assets/имя.png | Подпись` и `:::video assets/имя.mp4 | Подпись`. Лимиты: картинки — до 10 МБ (`png/jpg/jpeg/gif/svg/webp`), видео — до 100 МБ (`mp4/webm/ogg`). Nginx и сервисы настроены на загрузку до 200 МБ; подробности — в [`docs/06-authoring.md`](../docs/06-authoring.md). ## Замечания * Данные в `*.xls`/PDF/PDF-пароли содержат персональные сведения — храните их во временном каталоге и не коммитьте в репозиторий. * Пароли студентов выдаются автоматически; временный пароль нужно менять при первом входе (до смены другие страницы недоступны).