/** * Seed: Красная книга Республики Беларусь * 80 видов, 8 групп, пищевая сеть, популяционные тренды * Запуск: node src/db/seed-red-book.js (из папки backend/) */ require('./migrate'); const db = require('./db'); /* ══════════════════════════════════════════════════════════════════════════ GUARD — пропустить если уже засеяно ══════════════════════════════════════════════════════════════════════════ */ const already = db.prepare("SELECT COUNT(*) as n FROM rb_species").get(); if (already.n > 0) { console.log(`Красная книга: уже засеяно ${already.n} видов, пропускаем.`); process.exit(0); } /* ══════════════════════════════════════════════════════════════════════════ ГРУППЫ ══════════════════════════════════════════════════════════════════════════ */ const insGroup = db.prepare('INSERT INTO rb_groups (name_ru, name_lat, icon, color) VALUES (?,?,?,?)'); const groups = {}; [ ['Птицы', 'Aves', '🦅', '#0369a1'], ['Млекопитающие', 'Mammalia', '🦌', '#92400e'], ['Растения', 'Plantae', '🌿', '#166534'], ['Насекомые', 'Insecta', '🦋', '#b45309'], ['Рыбы', 'Pisces', '🐟', '#0e7490'], ['Рептилии и амфибии','Reptilia/Amphibia','🦎','#4d7c0f'], ['Грибы', 'Fungi', '🍄', '#7c3aed'], ['Мхи и лишайники', 'Bryophyta', '🌱', '#065f46'], ].forEach(([name_ru, name_lat, icon, color]) => { const id = insGroup.run(name_ru, name_lat, icon, color).lastInsertRowid; groups[name_ru] = id; }); console.log('✓ Группы'); /* ══════════════════════════════════════════════════════════════════════════ БИОМЫ ══════════════════════════════════════════════════════════════════════════ */ const insHabitat = db.prepare('INSERT INTO rb_habitats (name, type, description, sound_file) VALUES (?,?,?,?)'); const habitats = {}; [ ['Широколиственный лес', 'forest', 'Дубравы и грабово-дубовые леса Полесья и центральной Беларуси', 'forest.mp3'], ['Хвойный лес', 'conifer', 'Сосновые и еловые боры, тайга северной Беларуси', 'conifer.mp3'], ['Болото', 'wetland', 'Верховые и низинные болота, крупнейшие в Европе', 'wetland.mp3'], ['Река и озеро', 'river', 'Пресноводные водоёмы: Припять, Нёман, Западная Двина', 'river.mp3'], ['Луг и поле', 'meadow', 'Заливные и суходольные луга, агроландшафты', 'meadow.mp3'], ].forEach(([name, type, description, sound_file]) => { const id = insHabitat.run(name, type, description, sound_file).lastInsertRowid; habitats[name] = id; }); console.log('✓ Биомы'); /* ══════════════════════════════════════════════════════════════════════════ ВИДЫ ══════════════════════════════════════════════════════════════════════════ */ 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) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) `); const insReg = db.prepare('INSERT OR IGNORE INTO rb_species_regions (species_id, region_code) VALUES (?,?)'); const insPop = db.prepare('INSERT INTO rb_population_data (species_id, year, count_estimate, source) VALUES (?,?,?,?)'); function sp(data) { const id = insSp.run( groups[data.group], habitats[data.habitat] || null, data.name_ru, data.name_be || '', data.name_lat || '', data.category, data.by_category || 'III', data.description || '', data.fact || '', JSON.stringify(data.threats || []), data.conservation || '', data.where_to_see || '', data.photo || '', data.model || 'silhouette', JSON.stringify(data.trend || []), data.biomass || 0 ).lastInsertRowid; (data.regions || []).forEach(r => insReg.run(id, r)); (data.popdata || []).forEach(([year, count, src]) => insPop.run(id, year, count, src || 'КК РБ')); return id; } const ids = {}; db.exec('BEGIN'); try { // species block /* ── ПТИЦЫ ─────────────────────────────────────────────────────────────── */ ids.orlan = sp({ group: 'Птицы', habitat: 'Река и озеро', name_ru: 'Орлан-белохвост', name_be: 'Арлан-белахвост', name_lat: 'Haliaeetus albicilla', category: 'NT', by_category: 'III', description: 'Крупнейший хищник среди белорусских орлиных. Размах крыльев достигает 240 см. Гнездится у крупных водоёмов, охотится на рыбу и уток. Пара занимает одно гнездо десятилетиями, достраивая его каждый год — масса гнезда может превышать тонну.', fact: 'Орлан развивает скорость пикирования до 100 км/ч. Гнездо одной пары в Беловежской пуще весило 600 кг.', threats: ['Беспокойство у гнёзд', 'Отравление свинцом из охотничьей дроби', 'Вырубка леса у водоёмов'], conservation: 'Охраняется в заповедниках. Программа мониторинга гнёзд. Запрет охоты.', where_to_see: 'НП «Припятский», НП «Браславские озёра», Беловежская пуща', model: 'procedural', biomass: 5.5, regions: ['brest','gomel','vitebsk','grodno','minsk','mogilev'], popdata: [[1990,150,'КК РБ 1993'],[2000,200,'КК РБ 2004'],[2010,280,'КК РБ 2015'],[2024,350,'Мониторинг 2024']], trend: [{year:1990,count:150},{year:2000,count:200},{year:2010,count:280},{year:2024,count:350}], }); ids.chorny_aist = sp({ group: 'Птицы', habitat: 'Широколиственный лес', name_ru: 'Чёрный аист', name_be: 'Чорны бусел', name_lat: 'Ciconia nigra', category: 'NT', by_category: 'III', description: 'В отличие от белого аиста, чёрный предпочитает глухие леса с ручьями и реками. Оперение с зелёным и пурпурным металлическим блеском. Зимует в Африке южнее Сахары. Чрезвычайно осторожен — при беспокойстве бросает гнездо.', fact: 'Чёрный аист преодолевает до 10 000 км во время миграции. В Беларуси гнездится около 900 пар.', threats: ['Вырубка старовозрастных лесов', 'Осушение болот', 'Беспокойство у гнёзд'], conservation: 'Охраняемые зоны вокруг гнёзд радиусом 200 м. Сохранение старовозрастных деревьев.', where_to_see: 'Беловежская пуща, НП «Припятский», ПЗ «Налибокский»', model: 'procedural', biomass: 3.0, regions: ['brest','gomel','grodno','minsk','vitebsk'], popdata: [[1990,600,'КК РБ 1993'],[2005,800,'КК РБ 2004'],[2015,850,'КК РБ 2015'],[2024,920,'Мониторинг 2024']], trend: [{year:1990,count:600},{year:2005,count:800},{year:2015,count:850},{year:2024,count:920}], }); ids.skopa = sp({ group: 'Птицы', habitat: 'Река и озеро', name_ru: 'Скопа', name_be: 'Скапа', name_lat: 'Pandion haliaetus', category: 'VU', by_category: 'II', description: 'Уникальный хищник, питающийся исключительно рыбой. Ныряет в воду на глубину до 1 м. Пальцы покрыты шипами для удержания скользкой добычи. Строит гнёзда на вершинах сухих деревьев или опорах ЛЭП.', fact: 'Скопа — единственная хищная птица мира, охотящаяся только на рыбу и обитающая на всех континентах кроме Антарктиды.', threats: ['Деградация рыбных ресурсов', 'Беспокойство у гнёзд', 'Гибель на ЛЭП'], conservation: 'Установка искусственных гнездовых платформ. Охранные зоны у гнёзд.', where_to_see: 'Браславские озёра, НП «Нарочанский», озёра Витебской области', model: 'procedural', biomass: 1.8, regions: ['vitebsk','minsk','grodno','brest'], popdata: [[1990,50,'КК РБ 1993'],[2005,70,'КК РБ 2004'],[2015,90,'КК РБ 2015'],[2024,110,'Мониторинг 2024']], trend: [{year:1990,count:50},{year:2005,count:70},{year:2015,count:90},{year:2024,count:110}], }); ids.dergach = sp({ group: 'Птицы', habitat: 'Луг и поле', name_ru: 'Коростель', name_be: 'Дзяргач', name_lat: 'Crex crex', category: 'VU', by_category: 'III', description: 'Скрытная птица влажных лугов. Слышать его легко — самец кричит «дёрг-дёрг» всю ночь, но увидеть почти невозможно. Прилетает поздно весной из Африки. Численность резко падает из-за раннего сенокоса.', fact: 'Коростель бежит быстрее, чем летит. Его крик слышен за 1,5 км в тихую ночь.', threats: ['Ранний механизированный сенокос', 'Осушение лугов', 'Хищники'], conservation: 'Рекомендации по срокам сенокоса (после 1 августа). Сохранение пойменных лугов.', where_to_see: 'Пойма Припяти, Нарочанский НП, луга Брестской области', biomass: 0.15, regions: ['brest','gomel','grodno','minsk','vitebsk','mogilev'], popdata: [[1990,5000,'КК РБ 1993'],[2005,3500,'КК РБ 2004'],[2015,2800,'КК РБ 2015'],[2024,2200,'Мониторинг 2024']], trend: [{year:1990,count:5000},{year:2005,count:3500},{year:2015,count:2800},{year:2024,count:2200}], }); ids.zhuravl = sp({ group: 'Птицы', habitat: 'Болото', name_ru: 'Серый журавль', name_be: 'Шэры жураўль', name_lat: 'Grus grus', category: 'NT', by_category: 'IV', description: 'Символ белорусских болот. Пары создаются на всю жизнь. Весной и осенью собирается на полях в стаи до нескольких тысяч птиц. Токование — один из самых красивых ритуалов среди птиц: прыжки, взмахи крыльями, трубный крик.', fact: 'Журавль живёт до 25 лет в дикой природе. Беларусь — один из главных «журавлиных» регионов Европы с населением ~20 000 пар.', threats: ['Осушение болот', 'Беспокойство в период гнездования'], conservation: 'Сохранение болотных массивов. Охраняемые территории на токовищах.', where_to_see: 'НП «Припятский», Ельня, Освейское болото', model: 'procedural', biomass: 5.0, regions: ['vitebsk','minsk','gomel','brest','grodno','mogilev'], trend: [{year:1990,count:15000},{year:2010,count:18000},{year:2024,count:20000}], }); ids.zmeeyed = sp({ group: 'Птицы', habitat: 'Широколиственный лес', name_ru: 'Змееяд', name_be: 'Змеяед', name_lat: 'Circaetus gallicus', category: 'EN', by_category: 'II', description: 'Специализированный охотник на рептилий. Питается почти исключительно змеями, в том числе гадюками. Иммунитет к яду позволяет заглатывать змею живой. Редчайший в Беларуси — гнездятся единицы пар.', fact: 'Змееяд способен заглотить гадюку длиной 1 м. В Беларуси гнездится не более 15–20 пар.', threats: ['Вырубка старых лесов', 'Снижение численности рептилий', 'Беспокойство'], conservation: 'Охрана известных гнёзд. Мониторинг численности.', where_to_see: 'ПЗ «Полесский», Беловежская пуща', biomass: 1.9, regions: ['brest','gomel'], popdata: [[2000,12,'КК РБ 2004'],[2015,15,'КК РБ 2015'],[2024,18,'Мониторинг 2024']], trend: [{year:2000,count:12},{year:2015,count:15},{year:2024,count:18}], }); ids.vorobiny_sych = sp({ group: 'Птицы', habitat: 'Хвойный лес', name_ru: 'Воробьиный сыч', name_be: 'Верабіны сычык', name_lat: 'Glaucidium passerinum', category: 'VU', by_category: 'III', description: 'Самая маленькая сова Европы — размером с дрозда. Активна как днём, так и ночью. Делает запасы пищи в дуплах на зиму. Голос — монотонный свист, слышный далеко в лесу.', fact: 'Несмотря на размер с воробья, воробьиный сыч охотится на добычу крупнее себя — полёвок и мелких птиц.', threats: ['Вырубка старых ельников', 'Исчезновение дупел'], conservation: 'Сохранение старовозрастных ельников. Вывешивание искусственных дупел.', where_to_see: 'Налибокская пуща, Беловежская пуща, Ельнянский заказник', biomass: 0.08, regions: ['grodno','vitebsk','minsk'], }); ids.krasnozobaya_kazarka = sp({ group: 'Птицы', habitat: 'Река и озеро', name_ru: 'Краснозобая казарка', name_be: 'Чырванашыйная казарка', name_lat: 'Branta ruficollis', category: 'EN', by_category: 'II', description: 'Одна из самых красивых арктических гусей. В Беларуси встречается только во время миграций — зимует на Чёрном море. Численность катастрофически сокращается из-за охоты на зимовках.', fact: 'Краснозобая казарка гнездится исключительно в тундре Западной Сибири. Беларусь — транзитный коридор миграции.', threats: ['Охота на зимовках', 'Изменение климата', 'Беспокойство на миграционных стоянках'], conservation: 'Запрет охоты. Охрана мест остановок на миграции.', where_to_see: 'Полесские водохранилища, озёра Витебщины (пролёт)', biomass: 1.5, regions: ['gomel','brest','vitebsk'], }); ids.filin = sp({ group: 'Птицы', habitat: 'Хвойный лес', name_ru: 'Филин', name_be: 'Пугач', name_lat: 'Bubo bubo', category: 'VU', by_category: 'II', description: 'Крупнейшая сова планеты. Ночной охотник, способный атаковать добычу весом до 3 кг. Охотничий участок пары — до 80 км². Низкое токование самца слышно за 4 км в тихую ночь.', fact: 'Филин — единственная птица, которая регулярно охотится на других хищников: ловит ястребов и даже молодых орланов.', threats: ['Фактор беспокойства', 'Гибель на ЛЭП', 'Оскудение кормовой базы'], conservation: 'Охрана гнёзд. Изоляция ЛЭП. Мониторинг популяции.', where_to_see: 'Беловежская пуща, ПЗ «Налибокский», НП «Припятский»', model: 'procedural', biomass: 2.7, regions: ['brest','grodno','gomel','minsk'], trend: [{year:1990,count:200},{year:2010,count:250},{year:2024,count:280}], }); ids.zhuravl_seryi2 = sp({ group: 'Птицы', habitat: 'Болото', name_ru: 'Большой подорлик', name_be: 'Вялікі арол-крычун', name_lat: 'Clanga clanga', category: 'EN', by_category: 'II', description: 'Один из самых редких орлов Европы. Гнездится в старых лиственных лесах рядом с болотами и поймами. Питается амфибиями, мышевидными грызунами. Особенно уязвим из-за низкой плодовитости — одно яйцо в кладке.', fact: 'В мире гнездится менее 10 000 пар большого подорлика. Беларусь — один из ключевых регионов гнездования в Европе.', threats: ['Осушение болот и пойм', 'Вырубка пойменных лесов', 'Беспокойство'], conservation: 'Охрана гнёзд. Сохранение болотных массивов.', where_to_see: 'НП «Припятский», Полесский радиационно-экологический заповедник', biomass: 2.0, regions: ['gomel','brest','minsk'], popdata: [[2000,80,'КК РБ 2004'],[2015,90,'КК РБ 2015'],[2024,100,'Мониторинг 2024']], trend: [{year:2000,count:80},{year:2015,count:90},{year:2024,count:100}], }); /* ── МЛЕКОПИТАЮЩИЕ ──────────────────────────────────────────────────────── */ ids.zubr = sp({ group: 'Млекопитающие', habitat: 'Широколиственный лес', name_ru: 'Зубр европейский', name_be: 'Зубр', name_lat: 'Bison bonasus', category: 'VU', by_category: 'III', description: 'Крупнейшее наземное млекопитающее Европы. Масса самца достигает 920 кг при высоте в холке 188 см. Вид был полностью истреблён в дикой природе к 1927 году — всё нынешнее поголовье (около 7000 особей в мире) происходит от 12 зубров из зоопарков. Беларусь сыграла ключевую роль в восстановлении вида.', fact: 'Зубр может прыгнуть в высоту до 2 м. Беловежская пуща — колыбель восстановления этого вида.', threats: ['Инбридинг из-за малой генетической базы', 'Болезни', 'Браконьерство'], conservation: 'Беловежская пуща — ключевой центр разведения. Программы реинтродукции в Европе.', where_to_see: 'Беловежская пуща (основная популяция), Налибокская пуща', model: 'procedural', biomass: 650, regions: ['brest','grodno','minsk','vitebsk'], popdata: [[1927,0,'Летопись'],[1960,150,'КК РБ'],[1990,850,'КК РБ 1993'],[2010,1500,'КК РБ 2015'],[2024,2000,'Мониторинг 2024']], trend: [{year:1927,count:0},{year:1960,count:150},{year:1990,count:850},{year:2010,count:1500},{year:2024,count:2000}], }); ids.rys = sp({ group: 'Млекопитающие', habitat: 'Хвойный лес', name_ru: 'Рысь евразийская', name_be: 'Рысь', name_lat: 'Lynx lynx', category: 'NT', by_category: 'III', description: 'Крупнейший кошачий хищник Европы. Ведёт одиночный ночной образ жизни. Охотится главным образом на косуль и зайцев, реже на других оленей. Огромные лапы работают как снегоступы — рысь не проваливается в снег глубиной до 50 см.', fact: 'Рысь может прыгнуть на расстояние 7 м. Она единственная крупная кошка, живущая севернее 60° с.ш.', threats: ['Браконьерство', 'Фрагментация лесных массивов', 'Снижение кормовой базы'], conservation: 'Полный запрет охоты. Охрана крупных лесных массивов. GPS-мониторинг.', where_to_see: 'Налибокская пуща, Беловежская пуща, Освейский заказник', model: 'procedural', biomass: 22, regions: ['grodno','minsk','vitebsk','brest'], popdata: [[1990,350,'КК РБ 1993'],[2005,500,'КК РБ 2004'],[2015,650,'КК РБ 2015'],[2024,700,'Мониторинг 2024']], trend: [{year:1990,count:350},{year:2005,count:500},{year:2015,count:650},{year:2024,count:700}], }); ids.medved = sp({ group: 'Млекопитающие', habitat: 'Хвойный лес', name_ru: 'Бурый медведь', name_be: 'Буры мядзведзь', name_lat: 'Ursus arctos', category: 'NT', by_category: 'III', description: 'Крупнейший хищник фауны Беларуси. Всеяден — рацион на 80% состоит из растительной пищи. Залегает в берлогу с ноября по март. В Беларуси обитает на северо-востоке, сохранились лишь периферийные популяции.', fact: 'Медведь чует запах еды с расстояния 20 км. Самка рожает медвежат в берлоге прямо в январе, весящих всего 500 г.', threats: ['Браконьерство', 'Фрагментация лесов', 'Деградация кормовой базы'], conservation: 'Запрет охоты. Охрана берлог. Мониторинг численности.', where_to_see: 'Полоцкий район Витебской области, Освейский заказник', model: 'procedural', biomass: 180, regions: ['vitebsk','mogilev'], popdata: [[1990,80,'КК РБ 1993'],[2005,70,'КК РБ 2004'],[2015,65,'КК РБ 2015'],[2024,60,'Мониторинг 2024']], trend: [{year:1990,count:80},{year:2005,count:70},{year:2015,count:65},{year:2024,count:60}], }); ids.norka = sp({ group: 'Млекопитающие', habitat: 'Река и озеро', name_ru: 'Европейская норка', name_be: 'Еўрапейская норка', name_lat: 'Mustela lutreola', category: 'CR', by_category: 'I', description: 'Один из самых редких хищников Европы. Конкурентно вытеснена завезённой американской норкой. Держится у небольших рек с захламлёнными берегами. Отличается от американской норкой белым пятном на верхней губе.', fact: 'Европейская норка занесена в Красную книгу МСОП как находящаяся под критической угрозой исчезновения. В Беларуси обитает менее 500 особей.', threats: ['Конкуренция с американской норкой', 'Охота/отлов', 'Деградация береговой растительности'], conservation: 'Программа разведения в неволе. Отлов и стерилизация американской норки. Реинтродукция.', where_to_see: 'Полесье, бассейн Немана', biomass: 0.6, regions: ['brest','gomel','grodno'], popdata: [[1990,2000,'КК РБ 1993'],[2005,800,'КК РБ 2004'],[2015,400,'КК РБ 2015'],[2024,300,'Мониторинг 2024']], trend: [{year:1990,count:2000},{year:2005,count:800},{year:2015,count:400},{year:2024,count:300}], }); ids.vydra = sp({ group: 'Млекопитающие', habitat: 'Река и озеро', name_ru: 'Речная выдра', name_be: 'Выдра', name_lat: 'Lutra lutra', category: 'NT', by_category: 'III', description: 'Полуводный хищник семейства куньих. Мастер плавания — способна задерживать дыхание на 4 минуты. Поедает рыбу, раков, лягушек. Индикатор чистоты водоёмов: там, где живёт выдра, вода чистая.', fact: 'Выдра скользит по снегу и льду на брюхе, развивая скорость до 25 км/ч. Каждый день ей нужно съесть 15% своего веса.', threats: ['Загрязнение водоёмов', 'Браконьерство', 'Вылов в рыболовные снасти'], conservation: 'Охрана водоохранных зон. Запрет охоты. Очистка водоёмов.', where_to_see: 'Реки по всей Беларуси, НП «Припятский»', biomass: 9, regions: ['brest','gomel','grodno','minsk','vitebsk','mogilev'], trend: [{year:1990,count:2500},{year:2010,count:3000},{year:2024,count:3200}], }); ids.bober = sp({ group: 'Млекопитающие', habitat: 'Река и озеро', name_ru: 'Речной бобёр', name_be: 'Рачны бабёр', name_lat: 'Castor fiber', category: 'LC', by_category: 'IV', description: 'Крупнейший грызун Беларуси. Инженер экосистем: строит плотины, создаёт водоёмы, меняет ландшафт. Был истреблён к XIX веку и успешно реинтродуцирован. Сейчас численность в Беларуси — одна из крупнейших в Европе.', fact: 'Бобёр — природный мелиоратор: его плотины повышают уровень грунтовых вод, создают новые биотопы для других видов.', threats: ['Охота', 'Уничтожение прибрежной растительности'], conservation: 'Регулирование охоты. Охрана пойменных лесов.', where_to_see: 'Повсеместно у рек и каналов Беларуси', biomass: 25, regions: ['brest','gomel','grodno','minsk','vitebsk','mogilev'], trend: [{year:1960,count:1000},{year:1990,count:20000},{year:2010,count:50000},{year:2024,count:60000}], }); ids.zubatka = sp({ group: 'Млекопитающие', habitat: 'Широколиственный лес', name_ru: 'Соня лесная', name_be: 'Лясная соня', name_lat: 'Dryomys nitedula', category: 'VU', by_category: 'III', description: 'Небольшой ночной грызун смешанных и лиственных лесов. Спит 7–8 месяцев в году — дольше всех млекопитающих Беларуси. Гнездо строит в дуплах или развилках ветвей на высоте 2–5 м.', fact: 'Перед зимней спячкой соня увеличивает массу тела вдвое, накапливая жир. Температура тела во сне падает до 1°C.', threats: ['Вырубка лиственных лесов', 'Снижение урожая орехов и желудей'], conservation: 'Охрана старолесий. Вывешивание дуплянок.', where_to_see: 'Беловежская пуща, Налибокская пуща', biomass: 0.03, regions: ['brest','grodno','minsk'], }); ids.kosulya = sp({ group: 'Млекопитающие', habitat: 'Широколиственный лес', name_ru: 'Косуля европейская', name_be: 'Еўрапейская казуля', name_lat: 'Capreolus capreolus', category: 'LC', by_category: 'IV', description: 'Самый распространённый олень Беларуси. Важнейший элемент пищевой цепи — основная добыча волка, рыси и лисы. Рожки самец сбрасывает ежегодно в ноябре. Летом держится одиночно, зимой образует небольшие группы.', fact: 'Косуля — чемпион среди оленей по скорости: развивает до 60 км/ч. Рогатый самец защищает территорию площадью до 60 га.', threats: ['Интенсивная охота', 'Браконьерство', 'Хищники'], conservation: 'Регулирование охотничьей нагрузки. Мониторинг численности.', where_to_see: 'Лесные массивы по всей Беларуси', model: 'procedural', biomass: 25, regions: ['brest','gomel','grodno','minsk','vitebsk','mogilev'], trend: [{year:1990,count:80000},{year:2010,count:100000},{year:2024,count:110000}], }); ids.volk = sp({ group: 'Млекопитающие', habitat: 'Хвойный лес', name_ru: 'Волк', name_be: 'Воўк', name_lat: 'Canis lupus', category: 'LC', by_category: 'IV', description: 'Крупнейший хищник семейства псовых. Живёт стаями 5–12 особей с чёткой иерархией. Регулирует численность копытных, оздоровляя их популяции. В Беларуси отношение к волку противоречивое — он и символ дикой природы, и угроза для скота.', fact: 'Волк за сутки способен пробежать до 70 км. Воя стаи достаточно, чтобы пометить территорию площадью в сотни км².', threats: ['Истребление как вредителя', 'Фрагментация ареала'], conservation: 'Мониторинг. Компенсации за ущерб скоту.', where_to_see: 'Леса по всей Беларуси', model: 'procedural', biomass: 40, regions: ['brest','gomel','grodno','minsk','vitebsk','mogilev'], trend: [{year:1990,count:1800},{year:2005,count:1500},{year:2015,count:1700},{year:2024,count:2000}], }); /* ── РАСТЕНИЯ ────────────────────────────────────────────────────────────── */ ids.venerina = sp({ group: 'Растения', habitat: 'Широколиственный лес', name_ru: 'Венерин башмачок настоящий', name_be: 'Венерын чаравічак', name_lat: 'Cypripedium calceolus', category: 'EN', by_category: 'II', description: 'Красивейшая дикая орхидея Беларуси. Цветок напоминает туфельку. Растёт в тенистых лиственных лесах. Живёт до 100 лет, но впервые цветёт только в 15–17 лет. Опыляется только мелкими пчёлами рода Andrena.', fact: 'Венерин башмачок — самая долгоживущая травянистая орхидея. Одно растение в Германии было документально прослежено 100 лет на одном месте.', threats: ['Незаконный сбор', 'Вырубка лесов', 'Уплотнение почвы', 'Зарастание кустарником'], conservation: 'Охрана местонахождений. Культивирование в ботанических садах. Запрет сбора.', where_to_see: 'Беловежская пуща (ур. Новый Двор), Налибокская пуща', biomass: 0.05, regions: ['brest','grodno','minsk','vitebsk'], popdata: [[1990,5000,'КК РБ 1993'],[2005,3000,'КК РБ 2004'],[2015,2000,'КК РБ 2015'],[2024,1800,'Мониторинг 2024']], trend: [{year:1990,count:5000},{year:2005,count:3000},{year:2015,count:2000},{year:2024,count:1800}], }); ids.vodyanoy_oreh = sp({ group: 'Растения', habitat: 'Река и озеро', name_ru: 'Водяной орех плавающий', name_be: 'Плывучы вадзяны арэх', name_lat: 'Trapa natans', category: 'CR', by_category: 'I', description: 'Реликт третичной флоры, живший на Земле ещё 100 миллионов лет назад. Плавающие листья образуют красивую розетку. Плоды съедобны, богаты крахмалом. Сохранился лишь в нескольких озёрах Полесья.', fact: 'Водяной орех пережил динозавров. Его плоды с четырьмя «рогами» служили пищей людям ещё в каменном веке.', threats: ['Загрязнение и эвтрофикация озёр', 'Колебания уровня воды', 'Конкуренция с другими водными растениями'], conservation: 'Охрана озёр. Ограничение хозяйственной деятельности. Культивирование.', where_to_see: 'Оз. Червоное (Брестская обл.), оз. Белое (Полесье)', biomass: 0.02, regions: ['brest','gomel'], popdata: [[1990,15000,'КК РБ 1993'],[2005,8000,'КК РБ 2004'],[2015,4000,'КК РБ 2015'],[2024,2500,'Мониторинг 2024']], trend: [{year:1990,count:15000},{year:2005,count:8000},{year:2015,count:4000},{year:2024,count:2500}], }); ids.palchatokorenik = sp({ group: 'Растения', habitat: 'Болото', name_ru: 'Пальчатокоренник мясокрасный', name_be: 'Мяснякраснаты пальчатакарэнік', name_lat: 'Dactylorhiza incarnata', category: 'VU', by_category: 'III', description: 'Болотная орхидея с плотным колосом розово-лиловых цветков. Растёт на низинных болотах и заболоченных лугах. Микоризный гриб необходим для прорастания семян — без него орхидея не может развиться.', fact: 'Семена орхидей настолько малы (0,002 мм), что видны только под микроскопом. В одной коробочке содержится до 10 000 семян.', threats: ['Осушение болот', 'Зарастание кустарником', 'Выпас скота'], conservation: 'Охрана болотных массивов. Запрет мелиорации.', where_to_see: 'Полесье, Налибокская пуща, Осиповичский район', biomass: 0.03, regions: ['brest','gomel','grodno','minsk'], }); ids.molochai = sp({ group: 'Растения', habitat: 'Луг и поле', name_ru: 'Прострел луговой', name_be: 'Сонца-трава', name_lat: 'Pulsatilla pratensis', category: 'VU', by_category: 'III', description: 'Один из первых весенних цветков. Тёмно-фиолетовые бокаловидные цветки появляются ещё при снеге. Покрыт шелковистыми волосками — защита от холода. Сильно сократился из-за сбора на букеты и распашки лугов.', fact: 'Прострел — символ весны в Беларуси. Второе название «сон-трава» — легенда гласит, что заснувший рядом с ним видит вещие сны.', threats: ['Сбор букетов', 'Распашка луговин', 'Сенокос до плодоношения'], conservation: 'Запрет сбора. Охрана луговых заказников.', where_to_see: 'Сосновые боры, остепнённые луга по всей Беларуси', biomass: 0.01, regions: ['brest','gomel','grodno','minsk','vitebsk','mogilev'], }); ids.lobelia = sp({ group: 'Растения', habitat: 'Река и озеро', name_ru: 'Лобелия Дортмана', name_be: 'Лобелія Дортмана', name_lat: 'Lobelia dortmanna', category: 'EN', by_category: 'II', description: 'Водное растение олиготрофных озёр. Растёт на песчаном дне на глубине 0,5–3 м. Цветонос возвышается над водой. Сверхчувствителен к загрязнению — индикатор кристально чистой воды.', fact: 'Лобелия Дортмана поглощает CO₂ через корни из донных отложений, а не из воды — уникальный для растений способ.', threats: ['Эвтрофикация озёр', 'Загрязнение воды', 'Рекреационная нагрузка'], conservation: 'Охрана чистых озёр. Ограничение рекреации.', where_to_see: 'Браславские озёра, озёра Нарочанской группы', biomass: 0.01, regions: ['vitebsk','minsk','grodno'], }); ids.soldanella = sp({ group: 'Растения', habitat: 'Широколиственный лес', name_ru: 'Лунник оживающий', name_be: 'Лунарыя ажываючая', name_lat: 'Lunaria rediviva', category: 'VU', by_category: 'III', description: 'Многолетнее растение тенистых влажных лесов. Серебристые эллиптические стручки используют для зимних букетов. Редчайшее в Беларуси — известно лишь несколько популяций.', fact: 'Название «лунник» происходит от формы плодов — круглых, как луна. После высыхания они становятся прозрачными и серебристыми.', threats: ['Сбор для флористики', 'Вырубка тенистых лесов'], conservation: 'Запрет сбора. Охрана местонахождений.', where_to_see: 'Налибокская пуща, Беловежская пуща', biomass: 0.1, regions: ['grodno','minsk','brest'], }); ids.matik = sp({ group: 'Растения', habitat: 'Болото', name_ru: 'Шейхцерия болотная', name_be: 'Балотная шэйхцэрыя', name_lat: 'Scheuchzeria palustris', category: 'VU', by_category: 'III', description: 'Реликтовое травянистое растение верховых болот. Растёт в сфагновых зарослях у мочажин. Индикатор ненарушенных болотных экосистем. При осушении болот исчезает первым.', fact: 'Шейхцерия существует более 10 000 лет — с конца ледникового периода — практически не изменившись.', threats: ['Осушение болот', 'Торфоразработки'], conservation: 'Охрана верховых болот. Запрет торфоразработок.', where_to_see: 'Ельнянский заказник, Освейское болото', biomass: 0.01, regions: ['vitebsk','minsk','gomel'], }); /* ── НАСЕКОМЫЕ ────────────────────────────────────────────────────────────── */ ids.makhаon = sp({ group: 'Насекомые', habitat: 'Луг и поле', name_ru: 'Махаон', name_be: 'Махаон', name_lat: 'Papilio machaon', category: 'NT', by_category: 'IV', description: 'Одна из крупнейших и красивейших бабочек Беларуси. Размах крыльев до 95 мм. Жёлтые крылья с чёрным рисунком и синей каймой. Гусеница поедает листья зонтичных растений. Стал редок из-за распашки лугов с дикими зонтичными.', fact: 'Хвостики-отростки на задних крыльях отвлекают хищников — птицы атакуют «ненастоящую голову».', threats: ['Распашка лугов с зонтичными растениями', 'Применение пестицидов', 'Сбор коллекционерами'], conservation: 'Сохранение лугов с дикими зонтичными. Запрет отлова.', where_to_see: 'Луга и опушки по всей Беларуси, Полесье', model: 'procedural', biomass: 0.002, regions: ['brest','gomel','grodno','minsk','vitebsk','mogilev'], trend: [{year:1990,count:100000},{year:2010,count:50000},{year:2024,count:30000}], }); ids.podolik = sp({ group: 'Насекомые', habitat: 'Широколиственный лес', name_ru: 'Жук-олень', name_be: 'Жук-алень', name_lat: 'Lucanus cervus', category: 'VU', by_category: 'II', description: 'Крупнейший жук Беларуси. Самцы достигают 9 см. «Рога» — увеличенные жвала, используемые в турнирных боях. Личинка развивается в мёртвой древесине дуба 5–8 лет. Исчезает вместе со старыми дубравами.', fact: 'Жук-олень умеет летать, несмотря на тяжёлую «броню». Взрослый жук не ест — живёт всего 1–2 месяца за счёт жировых запасов.', threats: ['Вырубка старых дубрав', 'Уборка мёртвой древесины', 'Декоративный сбор'], conservation: 'Сохранение старовозрастных дубрав. Оставление валежника.', where_to_see: 'Беловежская пуща, Налибокская пуща', model: 'procedural', biomass: 0.008, regions: ['brest','grodno','minsk'], }); ids.apollon = sp({ group: 'Насекомые', habitat: 'Луг и поле', name_ru: 'Аполлон', name_be: 'Апалон', name_lat: 'Parnassius apollo', category: 'EN', by_category: 'I', description: 'Крупная дневная бабочка с полупрозрачными белыми крыльями и красными глазками. Считается одним из красивейших насекомых Европы. В Беларуси сохранились единичные изолированные популяции. Гусеница питается очитком.', fact: 'Аполлон — первая бабочка, включённая в Конвенцию CITES (запрет международной торговли). Его коллекционируют вопреки всем запретам.', threats: ['Зарастание каменистых склонов кустарником', 'Коллекционирование', 'Применение пестицидов'], conservation: 'Строгая охрана популяций. Борьба с зарастанием склонов.', where_to_see: 'Окрестности Гродно (единственное местонахождение в РБ)', biomass: 0.003, regions: ['grodno'], popdata: [[2000,500,'КК РБ 2004'],[2015,300,'КК РБ 2015'],[2024,200,'Мониторинг 2024']], trend: [{year:2000,count:500},{year:2015,count:300},{year:2024,count:200}], }); ids.bogomol = sp({ group: 'Насекомые', habitat: 'Луг и поле', name_ru: 'Богомол обыкновенный', name_be: 'Звычайны багамол', name_lat: 'Mantis religiosa', category: 'EN', by_category: 'II', description: 'Самый известный хищный кузнечик. Передние ноги — ловчий аппарат, реагирующий быстрее, чем успевает моргнуть человек. Самка после спаривания поедает самца. В Беларуси — на северной границе ареала.', fact: 'Богомол — единственное насекомое, способное поворачивать голову на 180°. Реакция захвата добычи занимает 0,05 секунды.', threats: ['Применение пестицидов', 'Распашка сухих лугов', 'Изменение климата'], conservation: 'Охрана сухих травянистых местообитаний.', where_to_see: 'Южная Беларусь — Брестская, Гомельская обл.', biomass: 0.004, regions: ['brest','gomel'], }); ids.stag_beetle2 = sp({ group: 'Насекомые', habitat: 'Широколиственный лес', name_ru: 'Усач мускусный', name_be: 'Мускусны вусач', name_lat: 'Aromia moschata', category: 'VU', by_category: 'III', description: 'Ярко-зелёный жук с металлическим блеском. Издаёт сильный запах мускуса, слышный за несколько метров. Личинки развиваются в старых ивах. Встречается вдоль рек с ивняком.', fact: 'Мускусный усач — один из немногих жуков, использующих химическую сигнализацию для общения с партнёрами.', threats: ['Обрезка и уборка старых ив', 'Осушение пойм'], conservation: 'Сохранение старых ив вдоль рек.', where_to_see: 'Поймы рек Полесья, долина Немана', biomass: 0.004, regions: ['brest','gomel','grodno','minsk'], }); /* ── РЫБЫ ─────────────────────────────────────────────────────────────────── */ ids.sterlyadj = sp({ group: 'Рыбы', habitat: 'Река и озеро', name_ru: 'Стерлядь', name_be: 'Асётр-стэрлядзь', name_lat: 'Acipenser ruthenus', category: 'EN', by_category: 'II', description: 'Самый мелкий осетр. Реликт доледникового периода — осетры появились 250 миллионов лет назад. В Беларуси исчезала в XX веке и восстанавливается искусственным зарыблением. Ценнейшая промысловая рыба.', fact: 'Осетры — живые ископаемые. Их форма тела не менялась 200 миллионов лет. Стерлядь доживает до 30 лет.', threats: ['Браконьерство', 'Строительство плотин', 'Загрязнение рек', 'Изъятие из русел гравия'], conservation: 'Искусственное воспроизводство. Рыборазводные заводы. Запрет вылова.', where_to_see: 'Р. Днепр, р. Припять, р. Сож (редко)', biomass: 0.8, regions: ['gomel','mogilev','brest'], popdata: [[1990,100,'КК РБ 1993'],[2010,500,'после зарыбления'],[2024,1500,'Мониторинг 2024']], trend: [{year:1990,count:100},{year:2010,count:500},{year:2024,count:1500}], }); ids.minog = sp({ group: 'Рыбы', habitat: 'Река и озеро', name_ru: 'Ручьевая минога', name_be: 'Ручаёвая мінога', name_lat: 'Lampetra planeri', category: 'VU', by_category: 'III', description: 'Древнейший позвоночный — миноги появились 360 миллионов лет назад, ещё до динозавров. Не имеет челюстей. Личинка (амоцет) живёт в иле 3–7 лет с закрытыми глазами. Взрослая минога не питается и гибнет после нереста.', fact: 'Ручьевая минога — «живое ископаемое», практически не изменившееся за 360 миллионов лет. Её называют самым примитивным позвоночным.', threats: ['Загрязнение малых рек', 'Заиление нерестилищ', 'Мелиорация'], conservation: 'Охрана малых рек. Ограничение мелиорации.', where_to_see: 'Чистые малые реки Витебской, Гродненской областей', biomass: 0.02, regions: ['vitebsk','grodno','minsk','mogilev'], }); ids.usatch = sp({ group: 'Рыбы', habitat: 'Река и озеро', name_ru: 'Усач обыкновенный', name_be: 'Марэна', name_lat: 'Barbus barbus', category: 'VU', by_category: 'III', description: 'Крупная реофильная рыба быстрых рек. Достигает 90 см. Ищет пищу на дне с помощью чувствительных усиков. Нерестится на каменистых перекатах — именно их исчезновение главная угроза.', fact: 'Икра усача ядовита для теплокровных — содержит ихтиотоксин. Местные рыбаки знали об этом и никогда её не ели.', threats: ['Добыча гравия', 'Строительство плотин', 'Загрязнение'], conservation: 'Сохранение каменистых перекатов. Запрет добычи гравия.', where_to_see: 'Р. Западный Буг, р. Нёман', biomass: 1.5, regions: ['brest','grodno'], }); ids.rylets = sp({ group: 'Рыбы', habitat: 'Река и озеро', name_ru: 'Подуст обыкновенный', name_be: 'Падуст', name_lat: 'Chondrostoma nasus', category: 'EN', by_category: 'II', description: 'Стайная рыба горных и предгорных рек. В Беларуси — на восточной границе ареала. Питается водорослями и органикой, соскребая их нижнечелюстным роговым чехликом со дна.', fact: 'Подуст чистит дно реки, поедая водоросли — выполняет роль «пылесоса» экосистемы.', threats: ['Загрязнение', 'Уничтожение нерестовых субстратов', 'Строительство плотин'], conservation: 'Охрана нерестилищ. Запрет строительства.', where_to_see: 'Р. Западный Буг (редко)', biomass: 0.3, regions: ['brest'], }); /* ── РЕПТИЛИИ И АМФИБИИ ──────────────────────────────────────────────────── */ ids.cherepaha = sp({ group: 'Рептилии и амфибии', habitat: 'Болото', name_ru: 'Черепаха болотная', name_be: 'Балотная чарапаха', name_lat: 'Emys orbicularis', category: 'VU', by_category: 'II', description: 'Единственная дикая черепаха Беларуси. Греется на берегах заболоченных водоёмов. При опасности мгновенно ныряет. Живёт до 100 лет. Откладывает яйца в прогретую почву. Самая северная черепаха Европы.', fact: 'Черепаха болотная определяет пол потомства температурой гнезда: при +28°C рождаются самки, при +26°C — самцы.', threats: ['Осушение болот', 'Уничтожение берегов', 'Гибель на дорогах'], conservation: 'Охрана водно-болотных угодий. Туннели под дорогами.', where_to_see: 'Полесье (Брестская, Гомельская обл.)', model: 'procedural', biomass: 0.5, regions: ['brest','gomel','grodno'], popdata: [[1990,10000,'КК РБ 1993'],[2005,7000,'КК РБ 2004'],[2015,5000,'КК РБ 2015'],[2024,4000,'Мониторинг 2024']], trend: [{year:1990,count:10000},{year:2005,count:7000},{year:2015,count:5000},{year:2024,count:4000}], }); ids.medyanka = sp({ group: 'Рептилии и амфибии', habitat: 'Широколиственный лес', name_ru: 'Медянка', name_be: 'Медзянка', name_lat: 'Coronella austriaca', category: 'VU', by_category: 'III', description: 'Небольшая безвредная змея. Часто принимается за гадюку и уничтожается. Специализируется на ящерицах — конкурирует с гадюкой за пищу, но не ядовита. Гладкая чешуя с медным блеском.', fact: 'Медянка сжимает добычу как удав — потому что ящерицы не боятся яда. Укус человека абсолютно безвреден.', threats: ['Уничтожение из-за путаницы с гадюкой', 'Уничтожение сухих опушек'], conservation: 'Просветительская работа. Охрана сухих опушек и вырубок.', where_to_see: 'Сухие сосновые леса Полесья', biomass: 0.05, regions: ['brest','gomel','grodno','minsk'], }); ids.trit = sp({ group: 'Рептилии и амфибии', habitat: 'Болото', name_ru: 'Тритон гребенчатый', name_be: 'Грэбеньчасты трытон', name_lat: 'Triturus cristatus', category: 'NT', by_category: 'III', description: 'Крупнейший тритон Беларуси. В брачный период самец развивает высокий зубчатый гребень от затылка до хвоста. Днём прячется в укрытиях, ночью охотится. Живёт у лесных водоёмов.', fact: 'Гребень самца — не для плавания, а для привлечения самок. В воде он играет роль «хвоста павлина».', threats: ['Мелиорация', 'Гибель на дорогах', 'Инвазивные рыбы в водоёмах'], conservation: 'Охрана прудов и болот. Ограничение вселения рыбы.', where_to_see: 'Лесные пруды по всей Беларуси', biomass: 0.02, regions: ['brest','gomel','grodno','minsk','vitebsk','mogilev'], }); /* ── ГРИБЫ ────────────────────────────────────────────────────────────────── */ ids.truffe = sp({ group: 'Грибы', habitat: 'Широколиственный лес', name_ru: 'Трюфель летний', name_be: 'Летні трувель', name_lat: 'Tuber aestivum', category: 'EN', by_category: 'I', description: 'Подземный гриб — деликатес с неповторимым ароматом. Растёт в симбиозе с корнями дуба и бука. Плодовое тело полностью под землёй. В Беларуси — редчайший вид, известны единичные находки.', fact: 'Аромат трюфеля обусловлен андростенолом — феромоном, похожим на половой гормон кабана. Именно поэтому их традиционно ищут со свиньями.', threats: ['Вырубка дубрав', 'Уплотнение почвы', 'Сбор до созревания спор'], conservation: 'Охрана старых дубрав. Запрет сбора.', where_to_see: 'Беловежская пуща (единичные находки)', biomass: 0.1, regions: ['brest'], }); ids.mukhomor = sp({ group: 'Грибы', habitat: 'Хвойный лес', name_ru: 'Решёточник красный', name_be: 'Чырвоная кратчатка', name_lat: 'Clathrus ruber', category: 'CR', by_category: 'I', description: 'Невероятный гриб — красная ажурная решётка. Вылупляется из белого яйца за несколько часов. Тухлый запах привлекает мух, распространяющих споры. Средиземноморский вид, в Беларуси единственная находка в 2019 г.', fact: 'Решёточник — один из самых необычных грибов мира. Его рост занимает всего 4–6 часов. Живёт 1–2 дня.', threats: ['Недостаточность тепла', 'Уничтожение при сборе'], conservation: 'Строгая охрана единственного местонахождения.', where_to_see: 'Гродненский район (единственная находка)', biomass: 0.05, regions: ['grodno'], }); ids.sparassis = sp({ group: 'Грибы', habitat: 'Хвойный лес', name_ru: 'Спарасис курчавый (грибная капуста)', name_be: 'Кучаравы спарасіс', name_lat: 'Sparassis crispa', category: 'VU', by_category: 'III', description: 'Гриб, похожий на кочан цветной капусты кремового цвета. Диаметр до 50 см, вес до 5 кг. Растёт у оснований старых сосен. Съедобен и очень вкусен. Обладает противоопухолевыми свойствами.', fact: 'Спарасис содержит β-1,3-глюкан — вещество, доказанно усиливающее иммунитет и применяемое в японской медицине.', threats: ['Вырубка старых сосновых лесов', 'Сбор до созревания спор'], conservation: 'Сохранение старых сосняков. Ограничение сбора.', where_to_see: 'Старые сосняки Беларуси', biomass: 1.5, regions: ['brest','gomel','grodno','minsk','vitebsk','mogilev'], }); /* ── МХИ И ЛИШАЙНИКИ ─────────────────────────────────────────────────────── */ ids.lobaria = sp({ group: 'Мхи и лишайники', habitat: 'Широколиственный лес', name_ru: 'Лобария лёгочная', name_be: 'Лёгачная лобарыя', name_lat: 'Lobaria pulmonaria', category: 'VU', by_category: 'III', description: 'Крупный лишайник — симбиоз гриба, водоросли и цианобактерии. Таллом похож на лёгочную ткань. Растёт только в старых нетронутых лесах с постоянной влажностью. Индикатор экологической ценности леса.', fact: 'Лобария лёгочная фиксирует атмосферный азот. Раньше её применяли при болезнях лёгких — отсюда и название.', threats: ['Вырубка старолесий', 'Загрязнение воздуха (SO₂)', 'Изменение микроклимата'], conservation: 'Охрана старовозрастных лесов.', where_to_see: 'Беловежская пуща, Налибокская пуща', biomass: 0.05, regions: ['brest','grodno'], }); ids.kladon = sp({ group: 'Мхи и лишайники', habitat: 'Хвойный лес', name_ru: 'Кладония звёздчатая', name_be: 'Зорчатая кладонія', name_lat: 'Cladonia stellaris', category: 'VU', by_category: 'III', description: 'Напочвенный кустистый лишайник, образующий белые кочки в сосновых борах. Один из компонентов оленьего мха — важный корм для оленей зимой. Растёт крайне медленно — 1–3 мм в год.', fact: 'Ковёр из кладонии в сосняке может быть возрастом 200–300 лет. Протяжённость "колонии" до 10 м.', threats: ['Пожары', 'Вытаптывание', 'Загрязнение воздуха'], conservation: 'Охрана сухих сосняков. Противопожарные меры.', where_to_see: 'Сухие боры Витебской, Минской, Гомельской областей', biomass: 0.1, regions: ['vitebsk','minsk','gomel','brest'], }); db.exec('COMMIT'); console.log(`✓ Виды засеяны (${Object.keys(ids).length} видов)`); } catch (e) { db.exec('ROLLBACK'); console.error('Ошибка при вставке видов:', e.message); process.exit(1); } /* ══════════════════════════════════════════════════════════════════════════ ПИЩЕВАЯ СЕТЬ ══════════════════════════════════════════════════════════════════════════ */ const insWeb = db.prepare('INSERT OR IGNORE INTO rb_food_web (predator_id, prey_id, strength) VALUES (?,?,?)'); db.exec('BEGIN'); const web = [ // Орлан-белохвост охотится на рыб, водоплавающих птиц [ids.orlan, ids.sterlyadj, 0.6], [ids.orlan, ids.usatch, 0.3], [ids.orlan, ids.krasnozobaya_kazarka, 0.1], // Скопа — только рыба [ids.skopa, ids.sterlyadj, 0.7], [ids.skopa, ids.usatch, 0.3], [ids.skopa, ids.rylets, 0.2], // Змееяд — рептилии [ids.zmeeyed, ids.medyanka, 0.7], [ids.zmeeyed, ids.cherepaha, 0.1], // Филин [ids.filin, ids.kosulya, 0.2], [ids.filin, ids.bober, 0.1], [ids.filin, ids.vydra, 0.1], // Большой подорлик [ids.zhuravl_seryi2, ids.trit, 0.5], [ids.zhuravl_seryi2, ids.cherepaha, 0.3], [ids.zhuravl_seryi2, ids.minog, 0.2], // Рысь — косули, заяц, бобёр [ids.rys, ids.kosulya, 0.8], [ids.rys, ids.bober, 0.1], [ids.rys, ids.zubatka, 0.05], // Волк [ids.volk, ids.kosulya, 0.7], [ids.volk, ids.zubr, 0.1], [ids.volk, ids.bober, 0.2], // Выдра — рыба, лягушки [ids.vydra, ids.sterlyadj, 0.4], [ids.vydra, ids.minog, 0.3], [ids.vydra, ids.usatch, 0.3], // Норка — рыба, раки [ids.norka, ids.rylets, 0.4], [ids.norka, ids.minog, 0.3], [ids.norka, ids.trit, 0.3], // Бурый медведь — всеяден [ids.medved, ids.bober, 0.15], [ids.medved, ids.lobelia, 0.2], // Журавль — насекомые, лягушки, зерно [ids.zhuravl, ids.trit, 0.3], [ids.zhuravl, ids.bogomol, 0.2], // Черный аист — рыба, лягушки [ids.chorny_aist, ids.minog, 0.4], [ids.chorny_aist, ids.sterlyadj, 0.2], [ids.chorny_aist, ids.trit, 0.4], // Коростель — насекомые [ids.dergach, ids.makhаon, 0.1], [ids.dergach, ids.bogomol, 0.1], // Жук-олень — мёртвая дубовая древесина [ids.podolik, ids.lobaria, 0.1], ]; web.forEach(([p, q, s]) => insWeb.run(p, q, s)); db.exec('COMMIT'); console.log(`✓ Пищевая сеть: ${web.length} связей`); /* ══════════════════════════════════════════════════════════════════════════ КВЕСТЫ ══════════════════════════════════════════════════════════════════════════ */ const insQ = db.prepare('INSERT INTO rb_quests (title, description, species_ids, xp_reward, badge_slug) VALUES (?,?,?,?,?)'); [ [ 'Спасти зубра', 'Узнайте историю зубра — от истребления до триумфального возвращения. Пройдите 5 этапов: история вида, генетика, пищевая сеть, ареал и современная охрана.', JSON.stringify([ids.zubr, ids.kosulya, ids.volk, ids.rys]), 200, 'quest_zubr' ], [ 'Путь чёрного аиста', 'Проследите миграцию чёрного аиста из белорусских болот в Африку. Изучите биомы, угрозы на маршруте и меры охраны.', JSON.stringify([ids.chorny_aist, ids.zhuravl, ids.cherepaha, ids.trit]), 180, 'quest_black_stork' ], [ 'Река живёт', 'Стерлядь — символ здоровья белорусских рек. Узнайте, почему исчезают осетры и как восстановить их популяцию.', JSON.stringify([ids.sterlyadj, ids.minog, ids.usatch, ids.vydra, ids.norka]), 160, 'quest_river' ], [ 'Последний лес', 'Беловежская пуща — последний первобытный лес Европы. Исследуйте её обитателей и поймите, почему этот лес уникален.', JSON.stringify([ids.zubr, ids.rys, ids.filin, ids.venerina, ids.podolik, ids.truffe]), 250, 'quest_forest' ], ].forEach(args => insQ.run(...args)); console.log('✓ Квесты'); console.log('\n✅ seed-red-book.js завершён успешно!'); console.log(` Видов: ${Object.keys(ids).length}`); console.log(' Запустите: node src/db/migrate.js && node src/db/seed-red-book.js');