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 глав прочитано
@@ -1587,7 +1587,7 @@
—
Магазин наград — за монеты (начисляются вместе с XP) ученик покупает предметы и награды.
—
Родительские аккаунты (
/parent) — родитель привязывается к ученику и видит его прогресс и уведомления.
-
Это вся учительская часть
Дальше — главы для администраторов (видны только под ролью admin).
+
Почти всё
Дальше — мощный «Конструктор симуляций» (создание своих интерактивных сцен), а за ним — главы для администраторов (видны только под ролью admin).
@@ -1595,6 +1595,134 @@
Предыдущая глава
Флэшкарты
+
+
+
Следующая глава
Конструктор симуляций
+
+
+
+
+
+
+
+
+
+
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.
+
+
+
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).
+
+
+
+
+
+
Предыдущая глава
Ещё модули платформы
+
Вернуться к началу
Быстрый старт
@@ -1928,6 +2056,7 @@
{ id:'ch-18', label:'Квантик-ассистент', icon:'sparkles', sections:['s-18-1','s-18-2','s-18-3'], sLabels:['Что умеет','Спроси Квантика','Подсказки на экзамене'] },
{ id:'ch-19', label:'Флэшкарты', icon:'copy', sections:['s-19-1','s-19-2','s-19-3'], sLabels:['Колоды и карточки','Картинки и формулы','Импорт и генерация ИИ'] },
{ id:'ch-20', label:'Ещё модули платформы', icon:'grid-3x3', sections:['s-20-1','s-20-2','s-20-3','s-20-4'], sLabels:['Карта знаний и Теория','Игры: Кроссворд, Виселица','Красная книга и Коллекция','Материалы, Магазин, Родители'] },
+ { id:'ch-21', label:'Конструктор симуляций', icon:'pencil-ruler', sections:['s-21-1','s-21-2','s-21-3','s-21-4','s-21-5','s-21-6','s-21-7','s-21-8'], sLabels:['Что это и где','Рабочее поле','Параметры','Объекты и формулы','Стиль и порядок','Физика','Графики','Сохранение и раздача'] },
];
const ADMIN_CHAPTERS = [
diff --git a/js/api.js b/js/api.js
index b129340..0f08b0c 100644
--- a/js/api.js
+++ b/js/api.js
@@ -860,6 +860,7 @@ async function hideDisabledFeatures() {
biochem: ['/biochem', '/biochem-library', '/biochem-reactions'],
live_quiz: ['/live-quiz'],
classroom: ['/classroom'],
+ sim_builder: ['/sim-builder', '/sim-builder.html'],
exam9: ['/exam9', '/exam9.html'],
textbooks: ['/textbooks', '/textbooks.html', '/textbook'],
};