Files
LMS/deploy/IMPORT.md
Vladislav Kopnin 65ed08f5c2 feat(web): перевести браузерные URL курсов на courseNo
- teacher/admin course pages, content, gradebook, profile, downloads
- courseNo -> UUID только на границе REST API
- обновлены e2e, шаблоны, тесты и docs
- LDD-UI-002; baseline 59 claims / 385 тестов
2026-10-29 19:51:03 +03:00

123 lines
8.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Порядок наполнения 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-пароли содержат персональные сведения — храните их во
временном каталоге и не коммитьте в репозиторий.
* Пароли студентов выдаются автоматически; временный пароль нужно менять при
первом входе (до смены другие страницы недоступны).