diff --git a/backend/src/controllers/adminController.js b/backend/src/controllers/adminController.js index 598b69c..c4db1f0 100644 --- a/backend/src/controllers/adminController.js +++ b/backend/src/controllers/adminController.js @@ -525,7 +525,7 @@ function getFeatures(_req, res) { function updateFeatures(req, res) { const allowed = ['crossword', 'hangman', 'pet', 'red_book', 'collection', 'flashcards', 'knowledge_map', 'board', 'biochem', 'live_quiz', 'classroom', - 'gamification', 'assistant']; + 'gamification', 'assistant', 'sim_builder']; const updates = req.body; const stmt = db.prepare("INSERT OR REPLACE INTO app_settings (key, value) VALUES (?, ?)"); const getOld = db.prepare("SELECT value FROM app_settings WHERE key = ?"); diff --git a/backend/src/routes/customSims.js b/backend/src/routes/customSims.js index db1d9e8..13e3a42 100644 --- a/backend/src/routes/customSims.js +++ b/backend/src/routes/customSims.js @@ -6,29 +6,35 @@ const express = require('express'); const router = express.Router(); const { authMiddleware, requireRole } = require('../middleware/auth'); +const { requireFeature } = require('../middleware/features'); const c = require('../controllers/customSimController'); router.use(authMiddleware); +// «Конструктор симуляций» можно отключить в админке (feature_sim_builder_enabled). +// Чтение/проигрывание уже сохранённых симуляций остаётся доступным; гейтим только +// авторинг — создание/правку/удаление/раздачу/клон/связи. +const gate = requireFeature('sim_builder'); + router.get('/', c.list); // @public-by-design: router-level authMiddleware (above) + ownership/published check in handler router.get('/:id', c.get); // @public-by-design: router-level authMiddleware (above) + ownership/published check in handler router.get('/:id/related', c.related); -router.post('/', requireRole('teacher', 'admin'), c.create); +router.post('/', gate, requireRole('teacher', 'admin'), c.create); // @public-by-design: router-level authMiddleware (above) + per-row ownership check in handler -router.put('/:id', requireRole('teacher', 'admin'), c.update); +router.put('/:id', gate, requireRole('teacher', 'admin'), c.update); // @public-by-design: router-level authMiddleware (above) + per-row ownership check in handler -router.delete('/:id', requireRole('teacher', 'admin'), c.remove); +router.delete('/:id', gate, requireRole('teacher', 'admin'), c.remove); // Фаза 6 — раздача классу / клон / курикулумные связи. Мутации — inline // requireRole(teacher,admin) + per-row ownership в хендлере. -router.post('/:id/share', requireRole('teacher', 'admin'), c.share); -router.post('/:id/clone', requireRole('teacher', 'admin'), c.clone); +router.post('/:id/share', gate, requireRole('teacher', 'admin'), c.share); +router.post('/:id/clone', gate, requireRole('teacher', 'admin'), c.clone); // @public-by-design: router-level authMiddleware (above) + per-row ownership check in handler -router.post('/:id/links', requireRole('teacher', 'admin'), c.addLink); +router.post('/:id/links', gate, requireRole('teacher', 'admin'), c.addLink); // @public-by-design: router-level authMiddleware (above) + per-row ownership check in handler -router.delete('/:id/links/:linkId', requireRole('teacher', 'admin'), c.removeLink); +router.delete('/:id/links/:linkId', gate, requireRole('teacher', 'admin'), c.removeLink); module.exports = router; diff --git a/frontend/js/admin/sections/games.js b/frontend/js/admin/sections/games.js index 96c2a10..1e25a16 100644 --- a/frontend/js/admin/sections/games.js +++ b/frontend/js/admin/sections/games.js @@ -17,6 +17,7 @@ { key: 'biochem', label: 'Биохимия', desc: 'Молекулярный редактор, задачи на построение молекул и реакции', icon: 'flask-conical' }, { key: 'live_quiz', label: 'Живая викторина', desc: 'Синхронная викторина в реальном времени для всего класса', icon: 'radio' }, { key: 'classroom', label: 'Онлайн-уроки (classroom)', desc: 'Синхронные онлайн-уроки с доской и видео', icon: 'video' }, + { key: 'sim_builder', label: 'Конструктор симуляций', desc: 'Создание учителем своих интерактивных симуляций (рабочее поле, формулы, физика, графики)', icon: 'pencil-ruler' }, ]; const FS_FEATURES = [ diff --git a/frontend/sim-builder.html b/frontend/sim-builder.html index 2811423..5f62851 100644 --- a/frontend/sim-builder.html +++ b/frontend/sim-builder.html @@ -189,6 +189,13 @@ var ip = LS.initPage() || {}; if (!(ip.isTeacher || ip.isAdmin)) { location.href = '/dashboard'; return; } + // Фича-гейт: «Конструктор симуляций» можно отключить в админке (feature_sim_builder_enabled). + if (LS.loadFeatures) { + LS.loadFeatures().then(function (feats) { + if (feats && feats.sim_builder === false) { LS.toast && LS.toast('Конструктор симуляций отключён', 'warn'); location.href = '/dashboard'; } + }).catch(function () {}); + } + if (!window.SimEngine || !window.SimExpr || !window.SimBuilder) { document.getElementById('sbu-preview').innerHTML = '
Движок симуляций не загрузился. Обновите страницу.
'; diff --git a/frontend/teacher-guide.html b/frontend/teacher-guide.html index dbe0476..f34c371 100644 --- a/frontend/teacher-guide.html +++ b/frontend/teacher-guide.html @@ -416,7 +416,7 @@
Содержание
-
0 из 13 глав прочитано
+
0 из 21 глав прочитано
-
Это вся учительская часть
Дальше — главы для администраторов (видны только под ролью admin).
+
Почти всё
Дальше — мощный «Конструктор симуляций» (создание своих интерактивных сцен), а за ним — главы для администраторов (видны только под ролью admin).
@@ -1595,6 +1595,134 @@
Предыдущая глава
Флэшкарты
+ + + + + +
+
+
+
+
Глава 21
+
Конструктор симуляций
+
+ Открыть конструктор +
+ +
+
21.1 Что это и где
+

Конструктор симуляций — инструмент, в котором вы сами, без программирования, собираете интерактивную 2D-сцену: параметры-ползунки, объекты (точки, отрезки, векторы, фигуры, подписи), привязанные формулами к параметрам и времени, настоящую физику и графики. Готовую симуляцию можно сохранить, опубликовать в лабораторию, раздать классу и открыть на доске онлайн-урока.

+
+
Открыть: в боковом меню пункт «Конструктор симуляций» или адрес /sim-builder. Доступно учителю и администратору.
+
Симуляция — это данные, а не код. Формулы вычисляются безопасным движком (доступны только математические функции), поэтому готовыми сценами безопасно делиться.
+
+
Что реально собрать
Кинематику (брошенное тело, равноускоренное движение), колебания и волны, графики функций, геометрические чертежи, а с включённой физикой — маятники, пружины и упругие столкновения.
+
Если пункта меню нет
Администратор мог отключить конструктор: Админка → Функции → «Конструктор симуляций». При выключенном тумблере страница недоступна, но ранее опубликованные симуляции в лаборатории продолжают работать.
+
+ +
+
21.2 Рабочее поле
+

В центре — живое превью: всё, что вы добавляете и меняете, сразу видно. Слева — панели настроек, сверху — панель инструментов (Тест, Сброс, Сохранить, Опубликовать, Шаблон, Раздать, отмена/повтор).

+
+
Масштаб — колесо мыши (приближает к курсору).
+
Перемещение вида (панорама) — перетаскивание мышью по пустому месту сцены.
+
Кнопки в углу сцены — «Вписать» (показать всю область) и «Сбросить вид».
+
Сетка и оси с числовыми делениями и точкой (0,0) рисуются автоматически; границы области задаются в настройках сцены (xmin/xmax/ymin/ymax).
+
Контролы запущенной симуляции (ползунки, плей/пауза) — плавающая панель в углу, не закрывает сцену; её можно свернуть.
+
+
Кнопка «Тест»
Запускает анимацию (время t идёт), «Сброс» — возвращает в начало. Пока симуляция на паузе, перетаскивание объектов и ползунки служат для настройки сцены.
+
+ +
+
21.3 Параметры (ползунки)
+

Параметр — это переменная со ползунком, которой можно управлять прямо в симуляции. На параметры потом ссылаются формулы объектов.

+
+
1
Откройте панель «Параметры» → «Добавить параметр».
+
2
Задайте: имя (латиницей, например v, theta), минимум, максимум, шаг, начальное значение и (необязательно) единицу.
+
3
В превью появится ползунок — двигайте его, чтобы видеть, как меняется сцена.
+
+
Зарезервированные имена
Нельзя называть параметр t (время), e, pi, w, h — это служебные имена в формулах. Конструктор предупредит и не даст сохранить.
+
+ +
+
21.4 Объекты и формулы
+

Объекты — это то, что рисуется на сцене. Любое числовое поле объекта (координата, радиус, размер) можно задать числом или формулой от параметров и времени t.

+
+
Точка / Отрезок / Вектор
Базовая геометрия со стрелками
+
Круг / Прямоугольник
Фигуры с заливкой
+
Ломаная / Кривая
Набор точек
+
Подпись (LaTeX)
Текст и формулы KaTeX
+
График
Кривая y=f(x), см. 21.7
+
Индикатор (readout)
Живое числовое значение
+
+
+
1
Панель «Объекты» → выберите тип → «Добавить».
+
2
В полях координат пишите формулы: например для броска тела x = v*cos(theta)*t, y = v*sin(theta)*t - 5*t^2.
+
3
Кнопка fx у поля открывает палитру: параметры, время t, функции (sin, cos, sqrt, abs, exp, ln…), константы (pi, e). Клик вставляет имя в формулу.
+
4
Объект можно поставить мышью: нажмите значок «прицел» у объекта и кликните по сцене — координаты подставятся (см. 21.5).
+
5
У объекта можно задать id и затем ссылаться на его координаты в других формулах: id.x, id.y.
+
+
Ошибки в формуле
Если выражение записано неверно, поле подсветится и покажет ошибку — симуляция при этом не ломается. Деление на ноль и неопределённости дают 0.
+
+ +
+
21.5 Стиль, порядок и прямое редактирование
+
+
Стиль объекта: выбор цвета (палитра), прозрачность, толщина и тип линии (сплошная / штрих / пунктир), стиль точки, свечение, градиентная заливка.
+
Порядок и операции: кнопки «вверх/вниз» меняют порядок отрисовки (что поверх чего), есть дублирование и тумблер видимости (глаз), удаление.
+
Перетаскивание на сцене: значок «прицел» включает ручки — тяните точку, концы отрезка/вектора, вершины ломаной прямо на превью (на паузе). Поля с формулами при этом не затираются.
+
Привязка к сетке (тумблер в панели инструментов) — координаты при перетаскивании округляются к узлам сетки.
+
Отмена/повтор: кнопки в панели инструментов и горячие клавиши Ctrl+Z / Ctrl+Y (или Ctrl+Shift+Z).
+
+
+ +
+
21.6 Физика
+

Включите тумблер «Физика» — и часть объектов будет двигаться по законам механики, а не по формуле. Движок сам интегрирует движение.

+
+
Общие силы: гравитация (g по X и Y), трение, упругость столкновений (0…1).
+
Тело: у точки/круга включите «тело» и задайте массу и начальную скорость (vx, vy). Тело падает, сталкивается, отскакивает.
+
Пружины — между двумя телами или телом и точкой-якорем (жёсткость, длина покоя, демпфирование).
+
Стены — границы области (низ/верх/лево/право) или произвольный отрезок: от них тела отражаются.
+
Тело можно тянуть мышью на паузе; при отпускании в запущенной сцене оно полетит.
+
+
Формулы и физика вместе
Физические тела и формульные объекты сосуществуют на одной сцене: например, подпись или вектор скорости можно привязать к координатам тела через id.x, id.y.
+
+ +
+
21.7 Графики и диаграммы
+

Объект «График» рисует кривую функции прямо на сцене в мировых координатах.

+
+
Задайте выражение (например sin(x)), переменную (по умолчанию x), диапазон и число точек.
+
Несколько кривых на одном графике — у каждой свои цвет, подпись, толщина и стиль линии.
+
Заливка под кривой, маркеры точек и легенда (по подписям кривых) включаются переключателями.
+
Режим «след» (trace) — кривая накапливается по времени t (удобно строить график величины в ходе анимации).
+
+
+ +
+
21.8 Сохранение, публикация и раздача
+
+
Сохранить — симуляция сохраняется как черновик (видна только вам).
+
Опубликовать — симуляция появляется в лаборатории для всех; «Снять с публикации» возвращает в черновик.
+
Шаблон — начать не с нуля, а с заготовки (пустая, маятник, график, бросок).
+
Раздать классу — ученики класса получают уведомление со ссылкой на симуляцию (она автоматически публикуется).
+
Клонировать — сделать свою копию чужой опубликованной симуляции и доработать её.
+
+
Где появляются ваши симуляции
В лаборатории есть раздел «Мои симуляции» — там ваши черновики и опубликованные, с кнопками «Редактировать» и «Удалить». Прямая ссылка вида /lab?sim=custom:НОМЕР открывает конкретную симуляцию.
+
На онлайн-уроке
Свою симуляцию можно открыть на доске урока — значения ползунков синхронизируются у учеников, а поверх можно рисовать аннотации.
+
Готово
Это вся учительская часть руководства. Дальше — главы для администраторов (видны только под ролью admin).
+
+ +
+