Initial commit — Умный Байт landing

This commit is contained in:
2026-05-13 09:32:45 +03:00
commit 9e21350def
37 changed files with 1950 additions and 0 deletions
+59
View File
@@ -0,0 +1,59 @@
-- =====================================================
-- 001_initial.sql — начальная схема БД для лендинга
-- =====================================================
CREATE TABLE IF NOT EXISTS admin_users (
id SERIAL PRIMARY KEY,
login VARCHAR(64) UNIQUE NOT NULL,
password_hash TEXT NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
last_login TIMESTAMPTZ
);
CREATE TABLE IF NOT EXISTS sections (
id SERIAL PRIMARY KEY,
key VARCHAR(64) UNIQUE NOT NULL,
title TEXT NOT NULL,
content_json JSONB NOT NULL DEFAULT '{}'::jsonb,
is_active BOOLEAN NOT NULL DEFAULT true,
sort_order INTEGER NOT NULL DEFAULT 0,
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE TABLE IF NOT EXISTS products (
id SERIAL PRIMARY KEY,
slug VARCHAR(64) UNIQUE NOT NULL,
title VARCHAR(128) NOT NULL,
subtitle VARCHAR(256),
description TEXT NOT NULL,
status VARCHAR(32) NOT NULL DEFAULT 'production',
audience VARCHAR(32),
icon_key VARCHAR(64),
tags JSONB NOT NULL DEFAULT '[]'::jsonb,
is_published BOOLEAN NOT NULL DEFAULT true,
sort_order INTEGER NOT NULL DEFAULT 0,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE TABLE IF NOT EXISTS approach_items (
id SERIAL PRIMARY KEY,
title VARCHAR(128) NOT NULL,
description TEXT NOT NULL,
icon_key VARCHAR(64),
sort_order INTEGER NOT NULL DEFAULT 0,
is_active BOOLEAN NOT NULL DEFAULT true
);
CREATE TABLE IF NOT EXISTS settings (
key VARCHAR(64) PRIMARY KEY,
value TEXT NOT NULL,
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE INDEX IF NOT EXISTS idx_products_published_sorted
ON products(is_published, sort_order) WHERE is_published = true;
CREATE INDEX IF NOT EXISTS idx_sections_active_sorted
ON sections(is_active, sort_order) WHERE is_active = true;
CREATE INDEX IF NOT EXISTS idx_approach_active_sorted
ON approach_items(is_active, sort_order) WHERE is_active = true;
+70
View File
@@ -0,0 +1,70 @@
-- =====================================================
-- 002_seed.sql — начальный контент лендинга
-- =====================================================
INSERT INTO sections (key, title, content_json, sort_order) VALUES
('hero', 'Hero', '{
"badge": "Принимаем проекты на 2026 год",
"title_line_1": "Технологии,",
"title_line_2": "которые решают",
"title_accent": "реальные задачи",
"description": "Разрабатываем цифровые продукты с AI для сельского хозяйства, частных домовладельцев, бизнеса и предпринимателей. От идеи до production.",
"cta_primary": "Посмотреть продукты",
"cta_secondary": "Обсудить проект",
"stats": [
{"value": "2", "label": "ФЛАГМАНСКИХ ПРОДУКТА"},
{"value": "AI", "label": "В КАЖДОМ ПРОДУКТЕ"},
{"value": "B2B", "label": "И B2C НАПРАВЛЕНИЯ"},
{"value": "24/7", "label": "AI-АССИСТЕНТ"}
]
}'::jsonb, 1),
('products_intro', 'Заголовок секции продуктов', '{
"eyebrow": "НАШИ ПРОДУКТЫ",
"title_line_1": "Решения, которые",
"title_line_2": "уже работают",
"description": "Каждый продукт — это ответ на реальный запрос рынка, проверенный нами в боевых условиях."
}'::jsonb, 2),
('approach_intro', 'Заголовок секции подхода', '{
"eyebrow": "НАШ ПОДХОД",
"title_line_1": "Не делаем «как у всех».",
"title_line_2": "Делаем как надо."
}'::jsonb, 3),
('cta', 'CTA блок', '{
"title": "Есть проект или идея?",
"description": "Расскажите о задаче — обсудим как её решить и сколько это займёт.",
"cta_primary": "Написать в Telegram",
"cta_secondary": "hi@umbyte.ru"
}'::jsonb, 4)
ON CONFLICT (key) DO NOTHING;
INSERT INTO products (slug, title, subtitle, description, status, audience, icon_key, tags, sort_order) VALUES
('agroto', 'АгроТО', 'CMMS для агропромышленности',
'Учёт оборудования, регламентов ТО и истории обслуживания на агропредприятии. AI-ассистент «Тоша» помогает агроинженерам и автоматизирует заявки на закупку.',
'production', 'B2B', 'agroto',
'["Web SPA", "PostgreSQL", "AI Tools"]'::jsonb, 1),
('smart-home', 'Умный Дом', 'ТО оборудования для частных лиц',
'Мобильное приложение: сфотографировал наклейку — AI распознал модель, нашёл регламент и настроил напоминания. Котёл, фильтры, скважина, септик — всё в одном месте.',
'development', 'B2C', 'smart-home',
'["iOS", "Android", "AI Vision", "PWA"]'::jsonb, 2)
ON CONFLICT (slug) DO NOTHING;
INSERT INTO approach_items (title, description, icon_key, sort_order) VALUES
('От идеи до production',
'Берём проект целиком: исследование, дизайн, разработка, инфраструктура, поддержка.',
'clock', 1),
('AI везде где нужно',
'Не AI ради AI. Используем там, где он реально упрощает жизнь пользователю.',
'sparkle', 2),
('Реальный сектор',
'Знаем как устроены сельское хозяйство, производство, частный быт — и решаем настоящие боли.',
'grid', 3)
ON CONFLICT DO NOTHING;
INSERT INTO settings (key, value) VALUES
('contact_email', 'hi@umbyte.ru'),
('contact_telegram', 'https://t.me/umbyte_bot'),
('company_name_short', 'Умный Байт'),
('company_name_full', 'ООО «Умный Байт»'),
('domain', 'umbyte.ru'),
('region', 'Россия')
ON CONFLICT (key) DO NOTHING;