Files
tourrism_site/views/layout.ejs
Andrey K. Choi ed871fc4d1 🎨 Добавлен полный редактор стилей и поле image_url для туров
 Новые функции:
- Поле image_url в модели туров для изменения изображений через админ-панель
- Расширенная модель настроек сайта с категориями: colors, typography, images, effects, layout
- Динамический CSS генератор на основе настроек (/dynamic-styles.css)
- API для управления настройками сайта (/api/site-settings)

🎯 Редактор стилей:
- Управление цветами (основные, акцентные, текст, фон)
- Настройка типографики (шрифты, размеры, межстрочный интервал)
- Управление изображениями (фоны, логотипы, фавикон)
- Эффекты (прозрачность, тени, размытие, скругления)
- Макет (высота секций, размеры контейнеров)
- Пользовательский CSS код

🛠️ Техническая реализация:
- SiteSettingsHelper с кешированием для производительности
- CSS переменные для динамического изменения стилей
- Автоматическая миграция базы данных
- Интеграция с AdminJS для удобного управления
- Загрузка настроек в шаблоны для доступности

📊 База данных:
- Расширена таблица site_settings (добавлено поле category)
- Новые типы настроек: color, file
- 27 предустановленных настроек для полного контроля над дизайном
- Автоматическое применение миграций при старте приложения
2025-11-29 22:03:00 +09:00

212 lines
9.9 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><%= title || siteName %></title>
<meta name="description" content="<%= siteDescription %>">
<!-- Favicon -->
<link rel="icon" href="<%= siteSettings.favicon_url || '/images/favicon.ico' %>">
<!-- Google Fonts -->
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@300;400;500;700&family=Playfair+Display:wght@400;600;700&display=swap" rel="stylesheet">
<% if (siteSettings.google_fonts_url && siteSettings.google_fonts_url.trim()) { %>
<link href="<%= siteSettings.google_fonts_url %>" rel="stylesheet">
<% } %>
<!-- Bootstrap CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<!-- Font Awesome -->
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
<!-- AOS Animation -->
<link href="https://cdn.jsdelivr.net/npm/aos@2.3.4/dist/aos.css" rel="stylesheet">
<!-- Swiper CSS -->
<link href="https://cdn.jsdelivr.net/npm/swiper@10/swiper-bundle.min.css" rel="stylesheet">
<!-- Custom CSS -->
<link href="/css/main.css" rel="stylesheet">
<!-- Dynamic Site Settings CSS -->
<link href="/dynamic-styles.css" rel="stylesheet">
<!-- Open Graph Meta Tags -->
<meta property="og:title" content="<%= title || siteName %>">
<meta property="og:description" content="<%= siteDescription %>">
<meta property="og:type" content="website">
<meta property="og:url" content="https://koreatour.ru">
<meta property="og:image" content="/images/korea-tourism-og.jpg">
<!-- Korean Language Tags -->
<meta name="keywords" content="Корея, туры, путешествие, гид, Korea travel, Korean tourism">
</head>
<body>
<!-- Navigation -->
<nav class="navbar navbar-expand-lg navbar-dark bg-primary fixed-top">
<div class="container">
<a class="navbar-brand" href="/">
<% if (siteSettings.site_logo_url && siteSettings.site_logo_url.trim()) { %>
<img src="<%= siteSettings.site_logo_url %>" alt="<%= siteName %>" height="40" class="me-2">
<% } %>
<span class="fw-bold"><%= siteName %></span>
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav ms-auto">
<li class="nav-item">
<a class="nav-link <%= page === 'home' ? 'active' : '' %>" href="/">
<i class="fas fa-home me-1"></i>Главная
</a>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle <%= page === 'routes' ? 'active' : '' %>" href="#" data-bs-toggle="dropdown">
<i class="fas fa-route me-1"></i>Туры
</a>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="/routes?type=city">
<i class="fas fa-city me-2"></i>Городские туры
</a></li>
<li><a class="dropdown-item" href="/routes?type=mountain">
<i class="fas fa-mountain me-2"></i>Горные походы
</a></li>
<li><a class="dropdown-item" href="/routes?type=fishing">
<i class="fas fa-fish me-2"></i>Морская рыбалка
</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="/routes">
<i class="fas fa-list me-2"></i>Все туры
</a></li>
</ul>
</li>
<li class="nav-item">
<a class="nav-link <%= page === 'guides' ? 'active' : '' %>" href="/guides">
<i class="fas fa-user-tie me-1"></i>Гиды
</a>
</li>
<li class="nav-item">
<a class="nav-link <%= page === 'articles' ? 'active' : '' %>" href="/articles">
<i class="fas fa-newspaper me-1"></i>Статьи
</a>
</li>
<li class="nav-item">
<a class="nav-link <%= page === 'about' ? 'active' : '' %>" href="/about">
<i class="fas fa-info-circle me-1"></i>О нас
</a>
</li>
<li class="nav-item">
<a class="nav-link <%= page === 'contact' ? 'active' : '' %>" href="/contact">
<i class="fas fa-envelope me-1"></i>Контакты
</a>
</li>
</ul>
</div>
</div>
</nav>
<!-- Main Content -->
<main>
<%- body %>
</main>
<!-- Footer -->
<footer class="bg-dark text-white pt-5 pb-3">
<div class="container">
<div class="row">
<div class="col-lg-4 mb-4">
<h5 class="fw-bold mb-3">
<img src="/images/korea-logo.png" alt="Korea Tourism" height="30" class="me-2">
<%= siteName %>
</h5>
<p class="text-muted"><%= siteDescription %></p>
<div class="social-links">
<a href="#" class="text-white me-3"><i class="fab fa-facebook-f"></i></a>
<a href="#" class="text-white me-3"><i class="fab fa-instagram"></i></a>
<a href="#" class="text-white me-3"><i class="fab fa-youtube"></i></a>
<a href="#" class="text-white"><i class="fab fa-twitter"></i></a>
</div>
</div>
<div class="col-lg-2 mb-4">
<h6 class="fw-bold mb-3">Туры</h6>
<ul class="list-unstyled">
<li><a href="/routes?type=city" class="text-muted text-decoration-none">Городские туры</a></li>
<li><a href="/routes?type=mountain" class="text-muted text-decoration-none">Горные походы</a></li>
<li><a href="/routes?type=fishing" class="text-muted text-decoration-none">Морская рыбалка</a></li>
</ul>
</div>
<div class="col-lg-2 mb-4">
<h6 class="fw-bold mb-3">Информация</h6>
<ul class="list-unstyled">
<li><a href="/guides" class="text-muted text-decoration-none">Наши гиды</a></li>
<li><a href="/articles" class="text-muted text-decoration-none">Советы путешественникам</a></li>
<li><a href="/about" class="text-muted text-decoration-none">О компании</a></li>
</ul>
</div>
<div class="col-lg-4 mb-4">
<h6 class="fw-bold mb-3">Контакты</h6>
<p class="text-muted mb-2">
<i class="fas fa-map-marker-alt me-2"></i>
Москва, Россия
</p>
<p class="text-muted mb-2">
<i class="fas fa-phone me-2"></i>
+7 (495) 123-45-67
</p>
<p class="text-muted mb-2">
<i class="fas fa-envelope me-2"></i>
info@koreatour.ru
</p>
<div class="mt-3">
<h6 class="fw-bold mb-2">Подписка на новости</h6>
<form class="d-flex">
<input type="email" class="form-control me-2" placeholder="Ваш email">
<button class="btn btn-primary" type="submit">Подписаться</button>
</form>
</div>
</div>
</div>
<hr class="my-4">
<div class="row align-items-center">
<div class="col-md-6">
<p class="mb-0 text-muted">&copy; 2024 <%= siteName %>. Все права защищены.</p>
</div>
<div class="col-md-6 text-md-end">
<small class="text-muted">
Сделано с <i class="fas fa-heart text-danger"></i> для туризма по Корее
</small>
</div>
</div>
</div>
</footer>
<!-- Bootstrap JS -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
<!-- AOS Animation -->
<script src="https://cdn.jsdelivr.net/npm/aos@2.3.4/dist/aos.js"></script>
<!-- Swiper JS -->
<script src="https://cdn.jsdelivr.net/npm/swiper@10/swiper-bundle.min.js"></script>
<!-- Custom JS -->
<script src="/js/main.js"></script>
<!-- Initialize AOS -->
<script>
AOS.init({
duration: 800,
once: true,
offset: 100
});
</script>
<% if (typeof pageScripts !== 'undefined') { %>
<%- pageScripts %>
<% } %>
</body>
</html>