From c4662c2a63905f2b0ec11895c33a94c17444d5e7 Mon Sep 17 00:00:00 2001 From: kalugin66 Date: Thu, 23 Jul 2026 12:45:27 +0500 Subject: [PATCH] =?UTF-8?q?=D1=80=D0=B5=D0=BA=D1=83=D0=BB=D1=8C=D1=82?= =?UTF-8?q?=D0=B8=D0=B2=D0=B0=D1=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modules/database/index.js | 32 ++++++++++++++------------------ modules/equipment/index.js | 2 +- public/admin.html | 3 +-- public/index.html | 14 -------------- 4 files changed, 16 insertions(+), 35 deletions(-) diff --git a/modules/database/index.js b/modules/database/index.js index 22e1667..e4893e0 100644 --- a/modules/database/index.js +++ b/modules/database/index.js @@ -80,7 +80,6 @@ function initDatabase() { image_path TEXT, qty TEXT, specs TEXT DEFAULT '[]', - age_badge TEXT DEFAULT '', sort_order INTEGER DEFAULT 0, is_active INTEGER DEFAULT 1 )`); @@ -185,7 +184,6 @@ async function seedAll() { ]); await runEach('INSERT INTO about_features (svg_icon, title, description, sort_order) VALUES (?, ?, ?, ?)', [ - ['', 'Парк техники не старше 5 лет', 'Более 80 единиц современной спецтехники', 0], ['', 'Без субподрядчиков', 'Все работы силами компании', 1], ['', 'Сложные условия', 'Болота, Крайний Север, труднодоступные районы', 2], ['', 'Гибкая оплата', 'Включая расчёт трубой (бартер)', 3] @@ -193,7 +191,6 @@ async function seedAll() { const svcIcon = { demolish: '', - recult: '', clear: '', lezh: '', scheme1: '', @@ -202,7 +199,6 @@ async function seedAll() { await runEach('INSERT INTO services (svg_icon, title, description, items, is_large, sort_order) VALUES (?, ?, ?, ?, ?, ?)', [ [svcIcon.demolish, 'Демонтаж нефтегазопроводов, утилизация отходов', 'Выполняем полный цикл работ по демонтажу магистральных и промысловых трубопроводов любого типа и диаметра, а также утилизацию отходов.', '["Нефтепроводы, газопроводы, водоводы — все типы магистральных и промысловых сетей","Полный цикл: от вскрытия и вырезки дефектных участков до вывоза и сдачи металлолома","Работа с трубопроводами любого диаметра в любых климатических условиях","Разделка ж/д транспорта, переработка и утилизация для предприятий"]', 1, 0], - [svcIcon.recult, 'Техническая рекультивация земель', 'Восстановление нарушенных земель после проведения строительных и ремонтных работ.', '["Засыпка траншей, планировка, восстановление плодородного слоя","Работа с нефтезагрязнёнными, засоленными землями","Сдача по актам под контролем экологов"]', 0, 1], [svcIcon.clear, 'Расчистка территории от мелколесья и ДКР', 'Подготовка полосы отвода: расчистка от древесно-кустарниковой растительности.', '["Валка, корчёвка, дробление пней","Планировка полосы отвода","Мульчеры и кусторезы на гусеничном ходу"]', 0, 2], [svcIcon.lezh, 'Устройство лежневого настила', 'Обеспечение проходимости для тяжёлой техники по болотам и слабым грунтам.', '["Изготовление секций из бревен и бруса","Укладка перекрытий на слабых грунтах","Обеспечение проходимости для тяжёлой гусеничной техники"]', 0, 3] ]); @@ -215,22 +211,22 @@ async function seedAll() { await runEach('INSERT INTO process_steps (step_number, title, description, sort_order) VALUES (?, ?, ?, ?)', [ [1, 'Заявка', 'Вы оставляете заявку на сайте, по электронной почте или звоните нам. Наши специалисты оперативно свяжутся с вами для обсуждения деталей проекта, объёма работ и сроков.', 0], [2, 'Выезд специалиста и оценка', 'Наш инженер выезжает на объект для проведения осмотра, оценки объёма работ, определения необходимых ресурсов и техники. По результатам составляется техническое задание и подписывается договор.', 1], - [3, 'Выполнение работ', 'Мобилизуем технику и персонал на объект. Выполняем демонтаж, утилизацию отходов и рекультивацию в соответствии с проектной документацией. Ежедневные отчёты о ходе работ.', 2], + [3, 'Выполнение работ', 'Мобилизуем технику и персонал на объект. Выполняем демонтаж и утилизацию отходов в соответствии с проектной документацией. Ежедневные отчёты о ходе работ.', 2], [4, 'Сдача объекта', 'По завершении всех работ подписывается акт выполненных работ, передаётся полный комплект закрывающей документации. При необходимости — сопровождение сдачи объекта экспертизе.', 3] ]); - await runEach('INSERT INTO equipment (name, brand, image_path, qty, specs, age_badge, sort_order) VALUES (?, ?, ?, ?, ?, ?, ?)', [ - ['Автокран КАМАЗ КС-55717К-3', 'КАМАЗ', 'ks-45721.webp', '10 единиц', '[{"label":"Грузоподъёмность","value":"25 тонн"},{"label":"Вылет стрелы","value":"до 28 м"},{"label":"Шасси","value":"Полноприводное 6×6"}]', 'Не старше 5 лет', 0], - ['Автокран Zoomlion ZTC300', 'Zoomlion', 'zoomlion-ztc300.webp', '2 единицы', '[{"label":"Грузоподъёмность","value":"30 тонн"},{"label":"Вылет стрелы","value":"до 32 м"},{"label":"Стрела","value":"Телескопическая"}]', 'Не старше 5 лет', 1], - ['Экскаватор гусеничный Komatsu PC210-10M0', 'Komatsu', 'komatsu-pc210.webp', '20 единиц', '[{"label":"Масса","value":"21 тонна"},{"label":"Объём ковша","value":"1.0–1.2 м³"},{"label":"Глубина копания","value":"до 6.5 м"}]', 'Не старше 5 лет', 2], - ['Экскаватор гусеничный Zoomlion ZE215E', 'Zoomlion', 'zoomlion-ze215e.webp', '2 единицы', '[{"label":"Масса","value":"21.5 тонны"},{"label":"Объём ковша","value":"1.1 м³"},{"label":"Аналог","value":"Komatsu PC210"}]', 'Не старше 5 лет', 3], - ['Погрузчик колёсный SDLG LG933L', 'SDLG', 'sdlg-lg933l.webp', '2 единицы', '[{"label":"Грузоподъёмность","value":"3 тонны"},{"label":"Объём ковша","value":"1.7 м³"},{"label":"Тип","value":"Колёсный"}]', 'Не старше 5 лет', 4], - ['Соболь 4×4 грузо-пассажирский', 'Соболь', 'sobol-4x4.webp', '13 единиц', '[{"label":"Грузоподъёмность","value":"до 1 т"},{"label":"Привод","value":"Полный 4×4"},{"label":"Назначение","value":"Доставка персонала и запчастей"}]', 'Не старше 5 лет', 5], - ['Ломовоз с КМУ (кран-манипулятор)', 'Ломовоз', 'lomovoz-kmu.webp', '3 единицы', '[{"label":"Грузоподъёмность КМУ","value":"до 8 т"},{"label":"Объём платформы","value":"до 20 м³"},{"label":"Назначение","value":"Вывоз металлолома"}]', 'Не старше 5 лет', 6], - ['Седельный тягач Камаз 53504-50', 'КамАЗ', 'kamaz-53504.webp', '6 единиц', '[{"label":"Тяговый класс","value":"до 50 т"},{"label":"Привод","value":"Полный привод"},{"label":"Назначение","value":"Перевозка негабарита и тралов"}]', 'Не старше 5 лет', 7], - ['Экскаватор-амфибия на понтонной платформе', 'Амфибия', 'amfibia.webp', '4 единицы', '[{"label":"Тип","value":"Гусеничный, плавающий"},{"label":"Работает","value":"На болотах и водных преградах"},{"label":"Особенность","value":"Там, где не видно дна"}]', 'Не старше 5 лет', 8], - ['УАЗ Пикап (полный привод)', 'УАЗ', 'uaz-pickup.webp', 'Несколько единиц', '[{"label":"Привод","value":"Полный привод"},{"label":"Назначение","value":"Доставка запчастей на месторождения"}]', 'Не старше 5 лет', 9], - ['Тралы тяжеловозы для доставки спецтехники', 'Тралы', 'tral-1.webp', '3 единицы', '[{"label":"Тяговый класс","value":"до 50 т"},{"label":"Назначение","value":"Доставка спецтехники на объекты"}]', 'Не старше 5 лет', 10] + await runEach('INSERT INTO equipment (name, brand, image_path, qty, specs, sort_order) VALUES (?, ?, ?, ?, ?, ?)', [ + ['Автокран КАМАЗ КС-55717К-3', 'КАМАЗ', 'ks-45721.webp', '10 единиц', '[{"label":"Грузоподъёмность","value":"25 тонн"},{"label":"Вылет стрелы","value":"до 28 м"},{"label":"Шасси","value":"Полноприводное 6×6"}]', 0], + ['Автокран Zoomlion ZTC300', 'Zoomlion', 'zoomlion-ztc300.webp', '2 единицы', '[{"label":"Грузоподъёмность","value":"30 тонн"},{"label":"Вылет стрелы","value":"до 32 м"},{"label":"Стрела","value":"Телескопическая"}]', 1], + ['Экскаватор гусеничный Komatsu PC210-10M0', 'Komatsu', 'komatsu-pc210.webp', '20 единиц', '[{"label":"Масса","value":"21 тонна"},{"label":"Объём ковша","value":"1.0–1.2 м³"},{"label":"Глубина копания","value":"до 6.5 м"}]', 2], + ['Экскаватор гусеничный Zoomlion ZE215E', 'Zoomlion', 'zoomlion-ze215e.webp', '2 единицы', '[{"label":"Масса","value":"21.5 тонны"},{"label":"Объём ковша","value":"1.1 м³"},{"label":"Аналог","value":"Komatsu PC210"}]', 3], + ['Погрузчик колёсный SDLG LG933L', 'SDLG', 'sdlg-lg933l.webp', '2 единицы', '[{"label":"Грузоподъёмность","value":"3 тонны"},{"label":"Объём ковша","value":"1.7 м³"},{"label":"Тип","value":"Колёсный"}]', 4], + ['Соболь 4×4 грузо-пассажирский', 'Соболь', 'sobol-4x4.webp', '13 единиц', '[{"label":"Грузоподъёмность","value":"до 1 т"},{"label":"Привод","value":"Полный 4×4"},{"label":"Назначение","value":"Доставка персонала и запчастей"}]', 5], + ['Ломовоз с КМУ (кран-манипулятор)', 'Ломовоз', 'lomovoz-kmu.webp', '3 единицы', '[{"label":"Грузоподъёмность КМУ","value":"до 8 т"},{"label":"Объём платформы","value":"до 20 м³"},{"label":"Назначение","value":"Вывоз металлолома"}]', 6], + ['Седельный тягач Камаз 53504-50', 'КамАЗ', 'kamaz-53504.webp', '6 единиц', '[{"label":"Тяговый класс","value":"до 50 т"},{"label":"Привод","value":"Полный привод"},{"label":"Назначение","value":"Перевозка негабарита и тралов"}]', 7], + ['Экскаватор-амфибия на понтонной платформе', 'Амфибия', 'amfibia.webp', '4 единицы', '[{"label":"Тип","value":"Гусеничный, плавающий"},{"label":"Работает","value":"На болотах и водных преградах"},{"label":"Особенность","value":"Там, где не видно дна"}]', 8], + ['УАЗ Пикап (полный привод)', 'УАЗ', 'uaz-pickup.webp', 'Несколько единиц', '[{"label":"Привод","value":"Полный привод"},{"label":"Назначение","value":"Доставка запчастей на месторождения"}]', 9], + ['Тралы тяжеловозы для доставки спецтехники', 'Тралы', 'tral-1.webp', '3 единицы', '[{"label":"Тяговый класс","value":"до 50 т"},{"label":"Назначение","value":"Доставка спецтехники на объекты"}]', 10] ]); await runEach('INSERT INTO geo_regions (name, sort_order) VALUES (?, ?)', [ @@ -286,7 +282,7 @@ async function seedAll() { ['section_services_subtitle', 'Полный спектр работ по демонтажу и утилизации трубопроводной инфраструктуры. Работаем на опасных производственных объектах с собственным парком спецтехники.'], ['section_schemes_subtitle', 'Мы разработали гибкие схемы работы, позволяющие выбрать оптимальное решение с учётом ваших целей и бюджета.'], ['section_process_subtitle', 'Прозрачный и отлаженный процесс от первого обращения до сдачи объекта. Каждый этап контролируется инженерами компании.'], - ['section_equipment_subtitle', 'Собственный парк из более чем 80 единиц современной спецтехники ведущих мировых производителей. Возраст всей техники — не старше 5 лет.'], + ['section_equipment_subtitle', 'Собственный парк из более чем 80 единиц современной спецтехники ведущих мировых производителей.'], ['section_licenses_subtitle', 'Все необходимые допуски и сертификаты для выполнения работ на опасных производственных объектах. Полная прозрачность и соответствие требованиям законодательства РФ.'], ['section_activity_subtitle', 'Компания «СТС-Авто» активно участвует в социальной и общественной жизни регионов присутствия.'], ['section_partners_subtitle', 'Сотрудничаем с ведущими компаниями нефтегазового сектора.'], diff --git a/modules/equipment/index.js b/modules/equipment/index.js index a566927..6447bf0 100644 --- a/modules/equipment/index.js +++ b/modules/equipment/index.js @@ -109,7 +109,7 @@ function setupRoutes(app, auth) { }); createCrudRoutes(app, auth, 'equipment', { - fields: ['name', 'brand', 'image_path', 'qty', 'specs', 'age_badge', 'sort_order', 'is_active'] + fields: ['name', 'brand', 'image_path', 'qty', 'specs', 'sort_order', 'is_active'] }); } diff --git a/public/admin.html b/public/admin.html index 4247665..a6c9a50 100644 --- a/public/admin.html +++ b/public/admin.html @@ -472,14 +472,13 @@ window.tab_equipment = function(tabId) { {field:'name',label:'Название'}, {field:'brand',label:'Бренд'}, {field:'qty',label:'Кол-во'}, - {field:'age_badge',label:'Возраст'}, {field:'is_active',label:'Акт.',render:function(v){return v==1?'Да':'Нет'}} ]; _fields = [ {name:'name',label:'Название'},{name:'brand',label:'Бренд'}, {name:'image_path',label:'Главное изображение',type:'image'}, {name:'qty',label:'Количество'},{name:'specs',label:'Характеристики',type:'json'}, - {name:'age_badge',label:'Бейдж возраста'},{name:'sort_order',label:'Порядок',type:'number',default:'0'}, +{name:'sort_order',label:'Порядок',type:'number',default:'0'}, {name:'is_active',label:'Активна',type:'number',default:'1'} ]; _uploadPrefix = 'equipment'; diff --git a/public/index.html b/public/index.html index 835ad07..37be2d0 100644 --- a/public/index.html +++ b/public/index.html @@ -301,19 +301,6 @@ img { max-width: 100%; display: block; } } .equipment-card-body { padding: clamp(14px, 2.5vw, 22px); } .equipment-card-body h3 { font-size: 1.05rem; margin-bottom: clamp(10px, 1.5vw, 14px); color: var(--text-dark); } -.equipment-age-badge { - display: inline-flex; align-items: center; gap: clamp(4px, 0.8vw, 6px); - background: rgba(39,174,96,0.1); border: 1px solid rgba(39,174,96,0.3); - border-radius: 50px; padding: clamp(3px, 0.5vw, 4px) clamp(8px, 1.4vw, 12px); margin-bottom: clamp(8px, 1.4vw, 12px); - font-size: clamp(10px, 1.2vw, 12px); font-weight: 700; color: #27AE60; - font-family: 'Montserrat', sans-serif; text-transform: uppercase; letter-spacing: 0.5px; -} -.equipment-age-badge::before { - content: '\2713'; - display: inline-flex; align-items: center; justify-content: center; - width: 16px; height: 16px; background: #27AE60; color: #fff; - border-radius: 50%; font-size: 10px; -} .equipment-qty { font-size: clamp(12px, 1.5vw, 14px); font-weight: 700; color: var(--orange); margin-bottom: clamp(5px, 1vw, 8px); font-family: 'Montserrat', sans-serif; @@ -974,7 +961,6 @@ img { max-width: 100%; display: block; } '
' + esc(e.brand || '') + '
' + arrows + dots + '

' + esc(e.name) + '

' + - (e.age_badge ? '
' + esc(e.age_badge) + '
' : '') + (e.qty ? '
' + esc(e.qty) + '
' : '') + (specs.length ? '
' + specs.map(function(sp) { return '
' + esc(sp.label) + '' + esc(sp.value) + '
'; }).join('') + '
' : '') + '
';