Files
Learn_System/backend/src/db/seed-red-book-phase2.js
T
Maxim Dolgolyov be4d43105e LearnSpace: full-stack educational whiteboard platform
Node.js/Express backend + vanilla JS frontend.
Features: real-time collaborative whiteboard (SSE), multi-page support,
LaTeX formulas, shapes/connectors, coordinate systems, number lines,
compass, zoom/pan, Catmull-Rom pencil smoothing, ruler/protractor with
rotation & resize controls, minimap navigation overlay, auto-measurements,
multi-page thumbnails sidebar, PNG export, page templates.
Student/teacher workflows: classes, assignments, library, dashboard.
Mobile responsive. SQLite (better-sqlite3).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-12 10:10:37 +03:00

494 lines
48 KiB
JavaScript

/**
* seed-red-book-phase2.js
* +20 видов: мхи/лишайники, пресноводные, редкие насекомые, птицы болот, ночные хищники
* +10 квестов
* Запуск: node src/db/seed-red-book-phase2.js (из папки backend/)
* Идемпотентен — не дублирует существующее.
*/
require('./migrate');
const db = require('./db');
/* ── helpers ── */
const groupRow = n => db.prepare('SELECT id FROM rb_groups WHERE name_ru = ?').get(n);
const habitatRow = t => db.prepare('SELECT id FROM rb_habitats WHERE type = ?').get(t);
const getId = n => db.prepare('SELECT id FROM rb_species WHERE name_ru = ?').get(n)?.id || null;
const insSp = db.prepare(`
INSERT INTO rb_species
(group_id, habitat_id, name_ru, name_be, name_lat, category, by_category,
description, interesting_fact, threats, conservation, where_to_see,
photo_url, model_type, population_trend, biomass_kg, season_active)
VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
`);
const insReg = db.prepare('INSERT OR IGNORE INTO rb_species_regions (species_id, region_code) VALUES (?,?)');
const insWeb = db.prepare('INSERT OR IGNORE INTO rb_food_web (predator_id, prey_id, strength) VALUES (?,?,?)');
function addSp(d) {
const existing = db.prepare('SELECT id FROM rb_species WHERE name_ru = ?').get(d.name_ru);
if (existing) return existing.id;
const gid = groupRow(d.group)?.id;
const hid = habitatRow(d.habitat)?.id || null;
if (!gid) { console.warn('Group not found:', d.group); return null; }
const id = insSp.run(
gid, hid,
d.name_ru, d.name_be || '', d.name_lat || '',
d.category, d.by_category || 'III',
d.description || '', d.fact || '',
JSON.stringify(d.threats || []),
d.conservation || '', d.where_to_see || '',
d.photo || '', d.model || 'silhouette',
JSON.stringify(d.trend || []),
d.biomass || 0,
JSON.stringify(d.seasons || []),
).lastInsertRowid;
(d.regions || []).forEach(r => insReg.run(id, r));
return id;
}
/* ════════════════════════════════════════════════════════════════════════
БЛОК 1 — ВИДЫ
════════════════════════════════════════════════════════════════════════ */
db.exec('BEGIN');
/* ── ПТИЦЫ (3) ─────────────────────────────────────────────────────── */
const kamyshevka = addSp({
group: 'Птицы', habitat: 'wetland',
name_ru: 'Вертлявая камышевка', name_be: 'Вярцёжная чаротнiца', name_lat: 'Acrocephalus paludicola',
category: 'CR', by_category: 'I',
description: 'Одна из наиболее угрожаемых перелётных птиц Европы. Гнездится исключительно в низинных болотах с осоково-злаковой растительностью. Беларусь — мировой центр гнездования, здесь обитает до 80 % мировой популяции. Зимует в западной Африке.',
fact: 'Беларусь является главным «домом» вертлявой камышевки — здесь гнездится большинство всех особей планеты.',
threats: ['Осушение болот', 'Зарастание гнездовых угодий', 'Пожары в поймах', 'Потеря зимовок в Африке'],
conservation: 'Охрана низинных болот. Восстановление обводнённых пойм. Мониторинг популяции.',
where_to_see: 'Споровское болото (Брестская обл.), Ельня (Витебская обл.), Дикое болото',
biomass: 0.013, seasons: ['5','6','7','8'],
trend: [{year:1990,count_estimate:8000,source:'IUCN'},{year:2000,count_estimate:4500,source:'BirdLife'},{year:2010,count_estimate:2800,source:'BirdLife'},{year:2024,count_estimate:2100,source:'АПБ'}],
regions: ['vitebsk','grodno','brest','minsk'],
});
const dupen = addSp({
group: 'Птицы', habitat: 'wetland',
name_ru: 'Дупель', name_be: 'Дупель', name_lat: 'Gallinago media',
category: 'EN', by_category: 'II',
description: 'Скрытный кулик заливных лугов и болот. Самцы собираются на токах, где демонстрируют оперение и трясутся всем телом. После спаривания самка одна воспитывает птенцов. Ночной образ жизни затрудняет учёт.',
fact: 'Самцы дупеля токуют по ночам на «арене» — постоянном месте сбора, которое используется десятилетиями.',
threats: ['Осушение пойменных лугов', 'Раннее сенокошение', 'Браконьерство на пролёте'],
conservation: 'Запрет сенокошения до августа на ключевых участках. Сохранение влажных лугов.',
where_to_see: 'Ельня, Освейское озеро, пойма р. Припять',
biomass: 0.18, seasons: ['4','5','6','7','8','9'],
trend: [{year:1995,count_estimate:1200,source:'НООО БПО'},{year:2010,count_estimate:650,source:'НООО БПО'},{year:2024,count_estimate:400,source:'НООО БПО'}],
regions: ['vitebsk','minsk','grodno','brest'],
});
const kobchik = addSp({
group: 'Птицы', habitat: 'meadow',
name_ru: 'Кобчик', name_be: 'Кабчык', name_lat: 'Falco vespertinus',
category: 'VU', by_category: 'III',
description: 'Изящный сокол размером с галку. Самцы — шиферно-серые с рыжей «штанишками», самки рябые. Охотится на крупных насекомых — прямокрылых, стрекоз, жуков. Гнездится колониями в чужих гнёздах — грачей и сорок. Перелётный, зимует в Африке.',
fact: 'Кобчик охотится как ласточка — хватает насекомых прямо в воздухе на бреющем полёте над лугами.',
threats: ['Деградация пойменных лугов', 'Применение пестицидов (уменьшение насекомых)', 'Уничтожение колоний грачей'],
conservation: 'Сохранение лугов. Запрет уничтожения грачиных колоний.',
where_to_see: 'Припятский НП, луга Брестской и Гомельской областей',
biomass: 0.16, seasons: ['5','6','7','8','9'],
trend: [{year:1990,count_estimate:900,source:'БО'},{year:2005,count_estimate:550,source:'БО'},{year:2024,count_estimate:320,source:'АПБ'}],
regions: ['brest','gomel','minsk','vitebsk'],
});
/* ── МЛЕКОПИТАЮЩИЕ (2) ──────────────────────────────────────────────── */
const vyhuhol = addSp({
group: 'Млекопитающие', habitat: 'river',
name_ru: 'Выхухоль русская', name_be: 'Расамаха расійская', name_lat: 'Desmana moschata',
category: 'CR', by_category: 'I',
description: 'Один из древнейших зверьков Земли — живой ископаемый. Обитает в старицах, заводях и медленных протоках рек Припятского бассейна. Почти слепа, ориентируется по обонянию и осязанию через вибриссы на хоботке. Выделяет мускусный секрет. Под угрозой исчезновения в Беларуси.',
fact: 'Выхухоль существует без изменений более 30 миллионов лет — её предки жили рядом с носорогами и мамонтами.',
threats: ['Загрязнение рек', 'Осушение пойм', 'Рыболовные сети', 'Хищники (норка американская)'],
conservation: 'Охрана пойменных угодий р. Припять. Борьба с инвазивной норкой американской. Заповедники.',
where_to_see: 'Пойма р. Припять (Гомельская и Брестская обл.), Припятский НП',
biomass: 0.42, seasons: ['1','2','3','4','5','6','7','8','9','10','11','12'],
trend: [{year:1990,count_estimate:1500,source:'НАН'},{year:2000,count_estimate:700,source:'НАН'},{year:2010,count_estimate:280,source:'НАН'},{year:2024,count_estimate:80,source:'IUCN'}],
regions: ['gomel','brest'],
});
const nochnitza = addSp({
group: 'Млекопитающие', habitat: 'river',
name_ru: 'Ночница прудовая', name_be: 'Начніца сажалкавая', name_lat: 'Myotis dasycneme',
category: 'EN', by_category: 'II',
description: 'Крупная летучая мышь, охотящаяся над открытой водой. Подхватывает насекомых с поверхности прудов и рек с помощью крыльев или хвостовой перепонки. Зимует в подземельях. Образует небольшие колонии в постройках. Чувствительна к беспокойству зимовок.',
fact: 'Ночница прудовая — настоящий рыбак: она «читает» рябь воды ушами, определяя местонахождение добычи под поверхностью.',
threats: ['Уничтожение зимовок', 'Загрязнение водоёмов', 'Ветроэнергетика', 'Применение пестицидов'],
conservation: 'Охрана зимовок (подземелья, форты). Мониторинг колоний. Сохранение прибрежных водоёмов.',
where_to_see: 'Гродненские подземелья, водохранилища Минской обл., Беловежская пуща',
biomass: 0.016, seasons: ['5','6','7','8','9'],
trend: [{year:2000,count_estimate:600,source:'Bat Conservation'},{year:2015,count_estimate:350,source:'БО'},{year:2024,count_estimate:220,source:'БО'}],
regions: ['minsk','grodno','brest','vitebsk'],
});
/* ── РАСТЕНИЯ (2) ───────────────────────────────────────────────────── */
const yatrish = addSp({
group: 'Растения', habitat: 'meadow',
name_ru: 'Ятрышник шлемоносный', name_be: 'Ятрышнік шлемавідны', name_lat: 'Orchis militaris',
category: 'VU', by_category: 'III',
description: 'Редкая наземная орхидея с необычными лилово-розовыми соцветиями, лепестки которых складываются в форму человечка с «руками» и «ногами». Растёт на известняковых лугах и в светлых лесах. Требует симбиоза с почвенными грибами для прорастания семян.',
fact: 'Семена ятрышника невесомы — в 1 грамме до 50 000 штук. Но без почвенного гриба-симбионта ни одно не прорастёт.',
threats: ['Распашка и застройка лугов', 'Выпас скота', 'Сбор растений'],
conservation: 'Охрана мест обитания. Запрет сбора. Создание питомников.',
where_to_see: 'Мозырские гряды, Новогрудская возвышенность, меловые склоны р. Сож',
biomass: 0.04, seasons: ['5','6'],
trend: [{year:1990,count_estimate:3200,source:'НАН'},{year:2010,count_estimate:1800,source:'НАН'},{year:2024,count_estimate:950,source:'НАН'}],
regions: ['brest','grodno','minsk','gomel'],
});
const rosynka = addSp({
group: 'Растения', habitat: 'wetland',
name_ru: 'Росянка английская', name_be: 'Расіца англійская', name_lat: 'Drosera anglica',
category: 'EN', by_category: 'II',
description: 'Насекомоядное растение сфагновых болот. Длинные листья-ловушки с липкими железистыми ворсинками ловят и переваривают мух и комаров. Получает азот и фосфор из добычи, компенсируя бедность болотной почвы. Крупнейшая из белорусских росянок.',
fact: 'Росянка английская переваривает насекомых за 24–48 часов, выделяя ферменты, аналогичные желудочному соку животных.',
threats: ['Осушение верховых болот', 'Торфоразработка', 'Изменение гидрологии'],
conservation: 'Сохранение верховых сфагновых болот. Контроль торфоразработок.',
where_to_see: 'Ельня, Обстерно, Мох Великий (Витебская обл.)',
biomass: 0.008, seasons: ['6','7','8'],
trend: [{year:1990,count_estimate:18000,source:'НАН'},{year:2010,count_estimate:9000,source:'НАН'},{year:2024,count_estimate:5200,source:'НАН'}],
regions: ['vitebsk','grodno','minsk'],
});
/* ── НАСЕКОМЫЕ (4) ──────────────────────────────────────────────────── */
const zhuk_olen = addSp({
group: 'Насекомые', habitat: 'forest',
name_ru: 'Жук-олень', name_be: 'Жук-алень', name_lat: 'Lucanus cervus',
category: 'EN', by_category: 'II',
description: 'Крупнейший жук Европы: самцы достигают 8 см. «Рога» — гипертрофированные верхние челюсти-мандибулы. Используются в турнирах за самку. Личинка живёт 5–8 лет в гнилой древесине дуба, питаясь разложившейся древесиной. Взрослый жук живёт всего 3–4 недели.',
fact: 'Самец жука-оленя в рыцарском поединке захватывает соперника рогами и сбрасывает с ветки — как настоящий турнир средневековых рыцарей.',
threats: ['Вырубка старых дубрав', 'Удаление пней и гниющей древесины', 'Уличное освещение (дезориентирует)'],
conservation: 'Сохранение старых дубрав и пней. Создание «мёртвой древесины» в парках.',
where_to_see: 'Беловежская пуща, Налибокская пуща, Гродненская пуща',
biomass: 0.006, seasons: ['6','7','8'],
trend: [{year:1990,count_estimate:12000,source:'НАН'},{year:2010,count_estimate:5500,source:'НАН'},{year:2024,count_estimate:2800,source:'НАН'}],
regions: ['brest','grodno','minsk'],
});
const dozorshik = addSp({
group: 'Насекомые', habitat: 'wetland',
name_ru: 'Дозорщик-повелитель', name_be: 'Дазорца-ўладар', name_lat: 'Anax imperator',
category: 'VU', by_category: 'III',
description: 'Крупнейшая стрекоза Беларуси с размахом крыльев до 10 см. Самцы патрулируют водоёмы, агрессивно охраняя территорию. Охотится на других стрекоз, бабочек и даже небольших рыб. Личинка — активный хищник, живущий в воде 2–3 года.',
fact: 'Дозорщик-повелитель преследует и ловит добычу с точностью до 97% — лучший результат среди всех хищников Земли.',
threats: ['Эвтрофикация водоёмов', 'Осушение болот', 'Применение пестицидов'],
conservation: 'Охрана водно-болотных угодий. Ограничение применения инсектицидов.',
where_to_see: 'Нарочанский НП, Споровское болото, пруды Брестской обл.',
biomass: 0.0009, seasons: ['6','7','8','9'],
trend: [{year:2000,count_estimate:5000,source:'ЭО'},{year:2015,count_estimate:2800,source:'ЭО'},{year:2024,count_estimate:1600,source:'ЭО'}],
regions: ['brest','gomel','grodno','minsk'],
});
const shmel = addSp({
group: 'Насекомые', habitat: 'meadow',
name_ru: 'Шмель моховой', name_be: 'Шмель імшысты', name_lat: 'Bombus muscorum',
category: 'EN', by_category: 'II',
description: 'Рыжевато-жёлтый шмель сырых лугов и болот. Один из немногих видов шмелей, гнездящихся на поверхности — в старых птичьих гнёздах или кустах мха. Важнейший опылитель растений заболоченных угодий. Страдает от потери местообитаний сильнее других шмелей.',
fact: 'Шмель моховой — «горячая машина»: перед полётом в холодный день он вибрирует мышцами, разогревая тело до +35°C при температуре воздуха около 0°C.',
threats: ['Интенсификация сельского хозяйства', 'Осушение лугов', 'Применение пестицидов', 'Болезни (Nosema)'],
conservation: 'Сохранение разнотравных сырых лугов. Запрет инсектицидов на природных территориях.',
where_to_see: 'Пойменные луга Полесья, заказник «Ельня», Витебские озёра',
biomass: 0.0004, seasons: ['4','5','6','7','8','9'],
trend: [{year:1990,count_estimate:50000,source:'ЭО'},{year:2010,count_estimate:18000,source:'ЭО'},{year:2024,count_estimate:7000,source:'ЭО'}],
regions: ['vitebsk','minsk','grodno','brest'],
});
const krasotEl = addSp({
group: 'Насекомые', habitat: 'forest',
name_ru: 'Красотел пахучий', name_be: 'Прыгажун духмяны', name_lat: 'Calosoma sycophanta',
category: 'VU', by_category: 'III',
description: 'Охотник за гусеницами: жук поднимается на деревья в погоне за добычей и может съесть до 400 гусениц за сезон. Окраска переливается всеми цветами радуги — синим, зелёным, золотистым. При угрозе выбрызгивает едкую жидкость с резким запахом.',
fact: 'Красотел пахучий — сознательный лесник: он специально охотится на видах-вредителях (шелкопряд, непарный шелкопряд), защищая лес от объедания.',
threats: ['Применение инсектицидов', 'Вырубка широколиственных лесов', 'Сбор коллекционерами'],
conservation: 'Отказ от химических методов борьбы с вредителями. Охрана широколиственных лесов.',
where_to_see: 'Беловежская пуща, Налибокская пуща, широколиственные леса Гродненщины',
biomass: 0.003, seasons: ['5','6','7','8'],
trend: [{year:1990,count_estimate:8000,source:'НАН'},{year:2010,count_estimate:3500,source:'НАН'},{year:2024,count_estimate:1800,source:'НАН'}],
regions: ['brest','grodno','minsk','vitebsk'],
});
/* ── РЫБЫ (3) ───────────────────────────────────────────────────────── */
const forel = addSp({
group: 'Рыбы', habitat: 'river',
name_ru: 'Форель ручьевая', name_be: 'Стронга ручайная', name_lat: 'Salmo trutta fario',
category: 'VU', by_category: 'III',
description: 'Пёстрая хищная рыба холодных прозрачных ручьёв и малых рек. Индикатор чистоты воды: погибает при малейшем загрязнении. Требует хорошую аэрацию и чистый гравийный субстрат для нереста. В Беларуси — на южной границе ареала, обитает только в реках Нарочанского бассейна.',
fact: 'Форель настолько требовательна к кислороду, что может жить только там, где вода кристально чистая. Там, где есть форель — вода питьевого качества.',
threats: ['Загрязнение рек', 'Нагрев воды', 'Браконьерство', 'Мелиорация'],
conservation: 'Охрана малых рек. Контроль качества воды. Ограничение рыбалки. Искусственное разведение.',
where_to_see: 'Реки Нарочь, Страча, Сервечь (Минская обл.), р. Щара (Гродненская обл.)',
biomass: 0.35, seasons: ['1','2','3','4','5','6','7','8','9','10','11','12'],
trend: [{year:1990,count_estimate:4200,source:'ВТ'},{year:2005,count_estimate:2100,source:'ВТ'},{year:2024,count_estimate:900,source:'ВТ'}],
regions: ['vitebsk','grodno','minsk'],
});
const bystryanka = addSp({
group: 'Рыбы', habitat: 'river',
name_ru: 'Быстрянка обыкновенная', name_be: 'Быстранка звычайная', name_lat: 'Alburnoides bipunctatus',
category: 'EN', by_category: 'II',
description: 'Маленькая серебристая рыбка быстрых чистых рек с выраженным течением. Держится у поверхности стайками, питаясь насекомыми. Чувствительна к загрязнению воды. Один из исчезающих видов пресноводных рыб Беларуси, встречается единично в реках западной части страны.',
fact: 'Быстрянка — «наземная» рыба: до 80% её рациона составляют упавшие в воду насекомые — комары, мухи, падёнки.',
threats: ['Загрязнение рек', 'Зарегулирование стока', 'Конкуренция с инвазивными видами'],
conservation: 'Охрана малых рек с быстрым течением. Мониторинг популяции.',
where_to_see: 'Реки Зельвянка, Россь, Нёман (Гродненская обл.)',
biomass: 0.018, seasons: ['4','5','6','7','8','9','10'],
trend: [{year:1990,count_estimate:15000,source:'НАН'},{year:2010,count_estimate:5000,source:'НАН'},{year:2024,count_estimate:1200,source:'НАН'}],
regions: ['grodno','brest','minsk'],
});
const umbra = addSp({
group: 'Рыбы', habitat: 'wetland',
name_ru: 'Умбра европейская', name_be: 'Умбра еўрапейская', name_lat: 'Umbra krameri',
category: 'CR', by_category: 'I',
description: 'Реликтовая рыбка — живой свидетель ледникового периода. Обитает только в медленно текущих водотоках и болотных канавах Полесья. Может переносить высыхание, зарываясь в ил. Дышит атмосферным воздухом при нехватке кислорода. Крупнейшая популяция в Европе — в Припятском полесье.',
fact: 'Умбра — одна из немногих рыб, которая пережила все ледниковые периоды, прячась в рефугиях болот. Ей более 5 миллионов лет.',
threats: ['Осушение болот', 'Углубление канав', 'Загрязнение воды', 'Вселение хищных рыб'],
conservation: 'Охрана болотных водотоков Полесья. Мониторинг популяции. Разведение в неволе.',
where_to_see: 'Припятский НП, болота Столинского района (Брестская обл.), пойма Ствиги',
biomass: 0.025, seasons: ['1','2','3','4','5','6','7','8','9','10','11','12'],
trend: [{year:1990,count_estimate:3500,source:'НАН'},{year:2005,count_estimate:1200,source:'НАН'},{year:2024,count_estimate:300,source:'IUCN'}],
regions: ['brest','gomel'],
});
/* ── ГРИБЫ (2) ──────────────────────────────────────────────────────── */
const felhodon = addSp({
group: 'Грибы', habitat: 'conifer',
name_ru: 'Феллодон слитый', name_be: 'Фелодон злiты', name_lat: 'Phellodon confluens',
category: 'EN', by_category: 'II',
description: 'Редкий коралловидный гриб хвойных и смешанных лесов. Несколько плодовых тел часто сливаются в одну неправильную форму, откуда и название. Серовато-белый, с тонкими иглами на нижней поверхности шляпки. Индикатор старых ненарушенных лесов. Занесён в Красные книги 12 стран.',
fact: 'Феллодон слитый растёт только в лесах, которым не менее 150 лет — он служит биологическим маркером древних экосистем.',
threats: ['Рубки главного пользования', 'Нарушение лесной подстилки', 'Рекреационная нагрузка'],
conservation: 'Сохранение старовозрастных лесов. Организация микозаповедников.',
where_to_see: 'Беловежская пуща, Налибокская пуща, хвойные леса Витебской обл.',
biomass: 0.06, seasons: ['8','9','10'],
trend: [{year:1990,count_estimate:200,source:'НАН'},{year:2010,count_estimate:85,source:'НАН'},{year:2024,count_estimate:40,source:'НАН'}],
regions: ['vitebsk','minsk','grodno','brest'],
});
const gidnellum = addSp({
group: 'Грибы', habitat: 'forest',
name_ru: 'Гиднеллум синеющий', name_be: 'Гiднелум сiнеючы', name_lat: 'Hydnellum caeruleum',
category: 'VU', by_category: 'III',
description: 'Необычный ежовый гриб с сине-фиолетовым или голубовато-серым молодым плодовым телом, темнеющим до тёмно-коричневого. Растёт в мшистых хвойных лесах, образуя микоризу с соснами и елями. Очень горький на вкус, несъедобен. Исчезает при нарушении лесной экосистемы.',
fact: 'Гиднеллум синеющий настолько редок, что находка даже одного плодового тела считается значимым событием для микологов всей Европы.',
threats: ['Лесозаготовки', 'Удаление мохового покрова', 'Загрязнение атмосферного воздуха'],
conservation: 'Выявление и охрана местонахождений. Сохранение мшистых ельников.',
where_to_see: 'Налибокская пуща, Борисовско-Березинский резерват',
biomass: 0.04, seasons: ['8','9','10'],
trend: [{year:2000,count_estimate:60,source:'НАН'},{year:2015,count_estimate:28,source:'НАН'},{year:2024,count_estimate:15,source:'НАН'}],
regions: ['vitebsk','minsk','grodno'],
});
/* ── МХИ И ЛИШАЙНИКИ (4) ────────────────────────────────────────────── */
const buksbaumiya = addSp({
group: 'Мхи и лишайники', habitat: 'conifer',
name_ru: 'Буксбаумия безлистная', name_be: 'Буксбаумiя бязлістая', name_lat: 'Buxbaumia aphylla',
category: 'EN', by_category: 'II',
description: 'Один из самых необычных мхов: почти без листьев, с единственным крупным непропорциональным спорангием на тонкой ножке. Споровая коробочка напоминает панцирь черепахи. Растёт на гниющих пнях хвойных деревьев. Исчезает вместе с исчезновением гниющей древесины в заготовительных лесах.',
fact: 'Буксбаумия безлистная проводит почти всю жизнь как невидимая нить микоризы — листовая часть появляется лишь на несколько недель для спороношения.',
threats: ['Уборка гнилой древесины', 'Интенсивные рубки', 'Нарушение лесной подстилки'],
conservation: 'Сохранение пней и гниющей древесины в лесах. Организация «мёртвого дерева» в заказниках.',
where_to_see: 'Ельники Витебской и Минской обл., Беловежская пуща',
biomass: 0.001, seasons: ['9','10','11','3','4'],
trend: [{year:1990,count_estimate:800,source:'НАН'},{year:2010,count_estimate:320,source:'НАН'},{year:2024,count_estimate:150,source:'НАН'}],
regions: ['vitebsk','minsk','grodno','brest'],
});
const meesiya = addSp({
group: 'Мхи и лишайники', habitat: 'wetland',
name_ru: 'Меезия трёхгранная', name_be: 'Меезiя трохгранная', name_lat: 'Meesia triquetra',
category: 'VU', by_category: 'III',
description: 'Болотный мох с характерными трёхгранными листьями, образующий плотные дернины в основаниях сфагновых кочек. Вид-индикатор ненарушенных верховых болот, чувствителен к изменению гидрологического режима. В Беларуси находится на южной границе ареала и встречается крайне редко.',
fact: 'Меезия трёхгранная может фиксировать свидетельства климата за последние тысячи лет — учёные читают историю болота по слоям этого мха как по книге.',
threats: ['Осушение болот', 'Добыча торфа', 'Изменение уровня грунтовых вод'],
conservation: 'Охрана верховых болот. Поддержание высокого уровня воды в болотных комплексах.',
where_to_see: 'Ельня (Витебская обл.), Мох Великий, Освейское болото',
biomass: 0.002, seasons: ['1','2','3','4','5','6','7','8','9','10','11','12'],
trend: [{year:1990,count_estimate:500,source:'НАН'},{year:2010,count_estimate:200,source:'НАН'},{year:2024,count_estimate:90,source:'НАН'}],
regions: ['vitebsk','minsk'],
});
const usnea = addSp({
group: 'Мхи и лишайники', habitat: 'conifer',
name_ru: 'Уснея длиннейшая', name_be: 'Уснея найдаўжэйшая', name_lat: 'Usnea longissima',
category: 'CR', by_category: 'I',
description: 'Бородатый лишайник, свисающий с ветвей хвойных деревьев нитями длиной до 3 метров. Требует исключительно чистого воздуха и высокой влажности. Был широко распространён в старых лесах Беларуси, но исчез почти повсеместно из-за загрязнения воздуха и вырубок. Сегодня — в единичных местонахождениях.',
fact: 'Уснея длиннейшая растёт со скоростью 1–2 мм в год, а её трёхметровые нити означают столетие жизни. Найти её — значит найти вековой нетронутый лес.',
threats: ['Загрязнение воздуха', 'Вырубка старых хвойных лесов', 'Изменение климата'],
conservation: 'Строгая охрана мест произрастания. Мониторинг качества воздуха. Охрана старолесий.',
where_to_see: 'Налибокская пуща, отдельные участки Витебской обл.',
biomass: 0.012, seasons: ['1','2','3','4','5','6','7','8','9','10','11','12'],
trend: [{year:1990,count_estimate:120,source:'НАН'},{year:2005,count_estimate:35,source:'НАН'},{year:2024,count_estimate:8,source:'НАН'}],
regions: ['vitebsk','grodno'],
});
const peltigera = addSp({
group: 'Мхи и лишайники', habitat: 'forest',
name_ru: 'Пельтигера горизонтальная', name_be: 'Пельцiгера гарызантальная', name_lat: 'Peltigera horizontalis',
category: 'VU', by_category: 'III',
description: 'Крупный листоватый лишайник с горизонтально распластанным слоевищем, вырастающим до 20 см в диаметре. Серо-голубой сверху, с заметными нитями гиф и цианобактерий на нижней поверхности. Растёт на замшелых стволах и основаниях деревьев в старых широколиственных лесах. Фиксирует атмосферный азот.',
fact: 'Пельтигера — симбиоз гриба, водорослей и цианобактерий в одном организме. Она единственная из лишайников способна удобрять почву, фиксируя воздушный азот.',
threats: ['Вырубка широколиственных лесов', 'Рекреационное вытаптывание', 'Загрязнение воздуха'],
conservation: 'Сохранение старых широколиственных лесов. Ограничение рекреационной нагрузки.',
where_to_see: 'Беловежская пуща, Налибокская пуща, старые широколиственные леса Гродненщины',
biomass: 0.006, seasons: ['1','2','3','4','5','6','7','8','9','10','11','12'],
trend: [{year:1990,count_estimate:350,source:'НАН'},{year:2010,count_estimate:140,source:'НАН'},{year:2024,count_estimate:70,source:'НАН'}],
regions: ['vitebsk','minsk','grodno','brest'],
});
db.exec('COMMIT');
console.log('✓ Виды добавлены');
console.log(` Всего видов: ${db.prepare('SELECT COUNT(*) as n FROM rb_species').get().n}`);
/* ════════════════════════════════════════════════════════════════════════
БЛОК 2 — ПИЩЕВЫЕ СВЯЗИ
════════════════════════════════════════════════════════════════════════ */
db.exec('BEGIN');
const links = [
// Орлан охотится на лебедей (более активно)
[getId('Орлан-белохвост'), getId('Лебедь-шипун'), 0.25],
[getId('Орлан-белохвост'), getId('Лебедь-кликун'), 0.20],
// Кобчик ест насекомых
[kobchik, getId('Аполлон'), 0.50],
[kobchik, getId('Богомол обыкновенный'), 0.30],
[kobchik, shmel, 0.50],
[kobchik, dozorshik, 0.40],
// Вертлявая камышевка ест насекомых болот
[kamyshevka, shmel, 0.20],
[kamyshevka, dozorshik, 0.15],
// Красотел ест бабочек/жуков
[krasotEl, getId('Аполлон'), 0.60],
[krasotEl, getId('Махаон'), 0.50],
[krasotEl, zhuk_olen, 0.30],
// Форель ест быстрянку и другую рыбу
[forel, bystryanka, 0.80],
[forel, getId('Хариус европейский'), 0.40],
[forel, getId('Ручьевая минога'), 0.30],
// Умбра — мелкий хищник
[umbra, bystryanka, 0.30],
// Крупные рыбы едят форель
[getId('Сом обыкновенный'), forel, 0.40],
[getId('Выдра речная'), forel, 0.60],
[getId('Выдра речная'), bystryanka, 0.30],
// Норка и выдра охотятся на выхухоль
[getId('Европейская норка'), vyhuhol, 0.60],
[getId('Выдра речная'), vyhuhol, 0.20],
// Ночница ест насекомых над водой
[nochnitza, shmel, 0.30],
[nochnitza, dozorshik, 0.40],
// Жук-олень поедает соки деревьев (связь через растения если есть)
// Дупель и камышевка — косвенные связи через экосистему
].filter(([p, q]) => p && q);
links.forEach(([p, q, s]) => {
try { insWeb.run(p, q, s); } catch {}
});
db.exec('COMMIT');
console.log(` Пищевых связей добавлено: ${links.length}`);
console.log(` Всего пищевых связей: ${db.prepare('SELECT COUNT(*) as n FROM rb_food_web').get().n}`);
/* ════════════════════════════════════════════════════════════════════════
БЛОК 3 — КВЕСТЫ (10 новых)
════════════════════════════════════════════════════════════════════════ */
db.exec('BEGIN');
function addQuest(title, description, speciesNames, xp, badge) {
const existing = db.prepare('SELECT id FROM rb_quests WHERE title = ?').get(title);
if (existing) { console.log(` Квест уже существует: ${title}`); return; }
const ids = speciesNames.map(n => getId(n)).filter(Boolean);
if (ids.length < speciesNames.length) {
console.warn(` Квест "${title}": не найдены виды!`, speciesNames.filter(n => !getId(n)));
}
db.prepare('INSERT INTO rb_quests (title, description, species_ids, xp_reward, badge_slug) VALUES (?,?,?,?,?)').run(
title, description, JSON.stringify(ids), xp, badge
);
}
addQuest(
'Птицы болот',
'Болота Беларуси — дом для редчайших птиц Европы. Найдите серого журавля, большого подорлика, большого кроншнепа, вертлявую камышевку и дупеля. Узнайте, почему без болот эти виды исчезнут с планеты.',
['Серый журавль', 'Большой подорлик', 'Большой кроншнеп', 'Вертлявая камышевка', 'Дупель'],
220, 'quest_bog_birds'
);
addQuest(
'Ночные хищники',
'Пока мы спим, лес живёт своей жизнью. Исследуйте тайных обитателей ночи: воробьиного и домового сычей, широкоушку и прудовую ночницу. Узнайте, как эхолокация превращает темноту в охотничьи угодья.',
['Воробьиный сыч', 'Сыч домовый', 'Широкоушка европейская', 'Ночница прудовая'],
180, 'quest_night_hunters'
);
addQuest(
'Диковинки Витебщины',
'Витебская область — северный форпост Беларуси со своими уникальными видами. Откройте краснозобую казарку, лобелию Дортмана, вертлявую камышевку, форель ручьевую и уснею длиннейшую — виды, которых больше нигде не встретить.',
['Краснозобая казарка', 'Лобелия Дортмана', 'Вертлявая камышевка', 'Форель ручьевая', 'Уснея длиннейшая'],
230, 'quest_vitebsk'
);
addQuest(
'Царство грибов',
'Мир грибов гораздо больше того, что мы видим. Трюфель, решёточник, спарасис, ёж гриб, феллодон и гиднеллум — это не еда, это живая история леса. Найдите всех шестерых и узнайте, почему грибы — хранители экосистемы.',
['Трюфель летний', 'Решёточник красный', 'Спарасис курчавый (грибная капуста)', 'Ёж гриб (герций)', 'Феллодон слитый', 'Гиднеллум синеющий'],
300, 'quest_fungi'
);
addQuest(
'Мир мхов и лишайников',
'Мхи и лишайники — первооткрыватели суши, они появились раньше динозавров. Найдите лобарию, кладонию, буксбаумию, меезию, уснею и пельтигеру — шесть хранителей нетронутых лесов и болот Беларуси.',
['Лобария лёгочная', 'Кладония звёздчатая', 'Буксбаумия безлистная', 'Меезия трёхгранная', 'Уснея длиннейшая', 'Пельтигера горизонтальная'],
280, 'quest_mosses'
);
addQuest(
'Легенды Полесья',
'Полесье — болотный рай, один из последних в Европе. Его населяют легендарные жители: европейская норка, болотная черепаха, альдрованда, выхухоль русская и умбра европейская — реликты, пережившие ледниковые периоды.',
['Европейская норка', 'Черепаха болотная', 'Альдрованда пузырчатая', 'Выхухоль русская', 'Умбра европейская'],
350, 'quest_polesye'
);
addQuest(
'Хранители леса',
'Лес держится на хищниках. Рысь, бурый медведь, жук-олень, усач альпийский и красотел пахучий — звенья одной цепи. Когда исчезает один хищник, лес начинает умирать. Узнайте, как они связаны между собой.',
['Рысь евразийская', 'Бурый медведь', 'Жук-олень', 'Усач альпийский', 'Красотел пахучий'],
250, 'quest_forest_guard'
);
addQuest(
'Тайны реки',
'Белорусские реки скрывают живых ископаемых. Выдра, стерлядь, форель, быстрянка и умбра европейская — каждый вид-индикатор показывает, здорова ли река. Найдите их всех и прочтите историю наших вод.',
['Речная выдра', 'Стерлядь', 'Форель ручьевая', 'Быстрянка обыкновенная', 'Умбра европейская'],
220, 'quest_river2'
);
addQuest(
'Летающие над водой',
'Вода с небесами — место встречи орлана-белохвоста, скопы, двух видов лебедей и дозорщика-повелителя. Все они связаны с водой и исчезнут вместе с ней. Откройте пятёрку хозяев белорусских озёр.',
['Орлан-белохвост', 'Скопа', 'Лебедь-шипун', 'Лебедь-кликун', 'Дозорщик-повелитель'],
200, 'quest_water_fliers'
);
addQuest(
'Краса болот',
'Болотные растения — хищники, ловушки и редкие орхидеи. Пальчатокоренник, шейхцерия, альдрованда, вертлявая камышевка и росянка английская живут в мире, где каждая капля воды на счету. Исследуйте болото изнутри.',
['Пальчатокоренник мясокрасный', 'Шейхцерия болотная', 'Альдрованда пузырчатая', 'Вертлявая камышевка', 'Росянка английская'],
230, 'quest_bog_beauty'
);
db.exec('COMMIT');
console.log('✓ Квесты добавлены');
console.log(` Всего квестов: ${db.prepare('SELECT COUNT(*) as n FROM rb_quests').get().n}`);
console.log('\n✅ seed-red-book-phase2.js завершён!');
console.log(` Видов: ${db.prepare('SELECT COUNT(*) as n FROM rb_species').get().n}`);
console.log(` Квестов: ${db.prepare('SELECT COUNT(*) as n FROM rb_quests').get().n}`);
console.log(` Пищевых связей: ${db.prepare('SELECT COUNT(*) as n FROM rb_food_web').get().n}`);