Files
tourrism_site/views/layout.ejs
Andrey K. Choi b4e513e996 🚀 Korea Tourism Agency - Complete implementation
 Features:
- Modern tourism website with responsive design
- AdminJS admin panel with image editor integration
- PostgreSQL database with comprehensive schema
- Docker containerization
- Image upload and gallery management

🛠 Tech Stack:
- Backend: Node.js + Express.js
- Database: PostgreSQL 13+
- Frontend: HTML/CSS/JS with responsive design
- Admin: AdminJS with custom components
- Deployment: Docker + Docker Compose
- Image Processing: Sharp with optimization

📱 Admin Features:
- Routes/Tours management (city, mountain, fishing)
- Guides profiles with specializations
- Articles and blog system
- Image editor with upload/gallery/URL options
- User management and authentication
- Responsive admin interface

🎨 Design:
- Korean tourism focused branding
- Mobile-first responsive design
- Custom CSS with modern aesthetics
- Image optimization and gallery
- SEO-friendly structure

🔒 Security:
- Helmet.js security headers
- bcrypt password hashing
- Input validation and sanitization
- CORS protection
- Environment variables
2025-11-30 00:53:15 +09:00

213 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>
<script src="/js/image-editor.js"></script>
<!-- Initialize AOS -->
<script>
AOS.init({
duration: 800,
once: true,
offset: 100
});
</script>
<% if (typeof pageScripts !== 'undefined') { %>
<%- pageScripts %>
<% } %>
</body>
</html>