Add .gitignore and project files

This commit is contained in:
kirill.khorkov
2025-12-16 01:28:06 +03:00
parent 0541b0c020
commit 3f257120fa
140 changed files with 13360 additions and 0 deletions

View File

@@ -0,0 +1,484 @@
<?php
// оформлениеаказа.php
session_start();
require_once 'config/database.php';
// Проверка авторизации
if (!isset($_SESSION['isLoggedIn']) || $_SESSION['isLoggedIn'] !== true) {
header('Location: вход.php?error=auth_required');
exit();
}
$user_id = $_SESSION['user_id'] ?? 0;
$db = Database::getInstance()->getConnection();
// Получаем корзину пользователя
$cart_items = [];
$total_amount = 0;
$total_quantity = 0;
try {
$stmt = $db->prepare("
SELECT
c.cart_id,
c.product_id,
c.quantity,
p.name,
p.price,
p.image_url,
p.stock_quantity
FROM cart c
JOIN products p ON c.product_id = p.product_id
WHERE c.user_id = ? AND p.is_available = TRUE
ORDER BY c.created_at DESC
");
$stmt->execute([$user_id]);
$cart_items = $stmt->fetchAll();
// Рассчитываем общую сумму
foreach ($cart_items as $item) {
$total_amount += $item['price'] * $item['quantity'];
$total_quantity += $item['quantity'];
}
} catch (PDOException $e) {
$error = "Ошибка загрузки корзины: " . $e->getMessage();
}
?>
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AETERNA - Оформление заказа</title>
<link rel="stylesheet/less" type="text/css" href="style_for_cite.less">
<script src="https://cdn.jsdelivr.net/npm/less"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<style>
.empty-cart {
text-align: center;
padding: 40px;
font-size: 18px;
color: #666;
}
.cart-error {
background: #f8d7da;
color: #721c24;
padding: 15px;
border-radius: 5px;
margin-bottom: 20px;
}
.continue-shopping {
text-align: center;
margin-top: 30px;
}
.continue-shopping .btn {
background: #453227;
color: white;
padding: 12px 30px;
border-radius: 4px;
text-decoration: none;
display: inline-block;
}
</style>
</head>
<body>
<?php include 'header_common.php'; ?>
<main class="container">
<div class="main__content">
<section class="products">
<div class="breadcrumbs">
<a href="cite_mebel.php">Главная</a> • <span class="current-page">Корзина</span>
</div>
<h2 class="products__title">Товары в корзине</h2>
<?php if (empty($cart_items)): ?>
<div class="empty-cart">
<i class="fas fa-shopping-cart" style="font-size: 48px; color: #ccc; margin-bottom: 20px;"></i>
<p>Ваша корзина пуста</p>
<div class="continue-shopping">
<a href="catalog.php" class="btn">Продолжить покупки</a>
</div>
</div>
<?php else: ?>
<div class="products__list" id="cartItems">
<?php foreach ($cart_items as $item): ?>
<div class="products__item" data-product-id="<?= $item['product_id'] ?>" data-price="<?= $item['price'] ?>">
<div class="products__image">
<img src="<?= htmlspecialchars($item['image_url'] ?? 'img1/default.jpg') ?>"
alt="<?= htmlspecialchars($item['name']) ?>"
class="product-img">
</div>
<div class="products__details">
<div class="products__name"><?= htmlspecialchars($item['name']) ?></div>
<div class="products__price"><?= number_format($item['price'], 0, '', ' ') ?> ₽</div>
<div class="products__controls">
<div class="products__quantity">
<button class="products__qty-btn minus" data-id="<?= $item['product_id'] ?>">-</button>
<span class="products__qty-value"><?= $item['quantity'] ?></span>
<button class="products__qty-btn plus" data-id="<?= $item['product_id'] ?>">+</button>
</div>
<button class="products__cart-icon remove-from-cart" data-id="<?= $item['product_id'] ?>">
<i class="fas fa-trash"></i>
</button>
</div>
</div>
</div>
<?php endforeach; ?>
</div>
<?php endif; ?>
</section>
<?php if (!empty($cart_items)): ?>
<section class="order">
<form method="POST" action="process_order.php" id="orderForm">
<div class="order__header">
<h2 class="order__title">Оформление заказа</h2>
<div class="order__total">Товары, <span class="total-count"><?= $total_quantity ?></span></div>
</div>
<div class="order__section">
<h3 class="order__section-title">СПОСОБ ДОСТАВКИ</h3>
<div class="form__radio-group">
<label class="form__radio-label">
<input type="radio" name="delivery" class="form__radio-input" value="courier" checked>
<span class="form__custom-radio"></span>
Курьерская доставка
</label>
<label class="form__radio-label">
<input type="radio" name="delivery" class="form__radio-input" value="pickup">
<span class="form__custom-radio"></span>
Самовывоз
</label>
</div>
<div class="form__group">
<label for="fullname" class="form__label">КОНТАКТЫ</label>
<input type="text" id="fullname" name="full_name" class="form__input"
placeholder="ФИО..."
value="<?= htmlspecialchars($_SESSION['full_name'] ?? '') ?>"
required>
</div>
<div class="form__group form__row">
<div style="position: relative; width: 48%;">
<input type="tel" id="phone" name="phone" class="form__input form__input--half"
placeholder="Телефон..."
value="<?= htmlspecialchars($_SESSION['user_phone'] ?? '') ?>"
required>
</div>
<div style="position: relative; width: 48%;">
<input type="email" id="email" name="email" class="form__input form__input--half"
placeholder="E-mail..."
value="<?= htmlspecialchars($_SESSION['user_email'] ?? '') ?>"
required>
</div>
</div>
</div>
<div class="order__section">
<h3 class="order__section-title">СПОСОБ ОПЛАТЫ</h3>
<div class="form__radio-group">
<label class="form__radio-label">
<input type="radio" name="payment" class="form__radio-input" value="card" checked>
<span class="form__custom-radio"></span>
Банковская карта
</label>
<label class="form__radio-label">
<input type="radio" name="payment" class="form__radio-input" value="cash">
<span class="form__custom-radio"></span>
Наличные
</label>
</div>
<div class="form__group form__row">
<div style="position: relative; width: 48%;">
<input type="text" id="region" name="region" class="form__input form__input--half"
placeholder="Регион..." required>
</div>
<div style="position: relative; width: 48%;">
<input type="text" id="index" name="postal_code" class="form__input form__input--half"
placeholder="Индекс (необязательно)...">
</div>
</div>
<div class="form__group">
<input type="text" id="address" name="address" class="form__input"
placeholder="Улица, дом, квартира..." required>
</div>
</div>
<div class="divider"></div>
<div class="promo">
<input type="text" id="promo_code" name="promo_code" class="promo__input" placeholder="Промокод">
<button type="button" class="promo__btn" id="applyPromo">ПРИМЕНИТЬ</button>
</div>
<div class="summary">
<div class="summary__item">
<span>Товары, <span class="summary-count"><?= $total_quantity ?></span> шт.</span>
<span class="products-total"><?= number_format($total_amount, 0, '', ' ') ?> ₽</span>
</div>
<div class="summary__item">
<span>Скидка</span>
<span class="discount-total">0 ₽</span>
<input type="hidden" name="discount" value="0">
</div>
<div class="summary__item">
<span>Доставка</span>
<span class="delivery-price">2000 ₽</span>
<input type="hidden" name="delivery_price" value="2000">
</div>
<div class="summary__item total">
<span>ИТОГО:</span>
<span class="final-total"><?= number_format($total_amount + 2000, 0, '', ' ') ?> ₽</span>
</div>
</div>
<button type="submit" class="order-btn" id="submit-order">ОФОРМИТЬ ЗАКАЗ</button>
<label class="privacy">
<input type="checkbox" id="privacy-checkbox" required>
Даю согласие на обработку персональных данных
</label>
<div class="privacy-error" id="privacy-error" style="display: none; color: #dc3545; font-size: 14px; margin-top: 10px;">
Необходимо согласие на обработку персональных данных
</div>
<div class="services">
<h3 class="services__title">УСЛУГИ</h3>
<div class="services__item">
<span>Доставка</span>
<span>2000 ₽</span>
</div>
<div class="services__item">
<span>Сборка</span>
<span>1000 ₽</span>
</div>
</div>
</form>
</section>
<?php endif; ?>
</div>
</main>
<div class="page-messages">
<div class="message error" id="form-error" style="display: none;"></div>
<div class="message success" id="order-success" style="display: none;"></div>
</div>
<?php
// Если файла footer.php нет, используем встроенный футер
if (file_exists('footer.php')) {
include 'footer.php';
} else {
// Встроенный футер
?>
<footer class="footer" id="footer">
<div class="container footer__content">
<div class="footer__col footer--logo">
<div class="logo">AETERNA</div>
</div>
<div class="footer__col">
<h5>ПОКУПАТЕЛЮ</h5>
<ul>
<li><a href="catalog.php">Каталог</a></li>
<li><a href="услуги.php">Услуги</a></li>
</ul>
</div>
<div class="footer__col">
<h5>ПОМОЩЬ</h5>
<ul>
<li><a href="Доставка.php">Доставка и оплата</a></li>
<li><a href="Гарантия.php">Гарантия и возврат</a></li>
<li><a href="cite_mebel.php#faq">Ответы на вопросы</a></li>
<li><a href="#footer">Контакты</a></li>
</ul>
</div>
<div class="footer__col">
<h5>КОНТАКТЫ</h5>
<p>aeterna@mail.ru</p>
<p>+7(912)999-12-23</p>
<div class="social-icons">
<span class="icon"><i class="fab fa-telegram"></i></span>
<span class="icon"><i class="fab fa-instagram"></i></span>
<span class="icon"><i class="fab fa-vk"></i></span>
</div>
</div>
<div class="footer__col">
<h5>ПРИНИМАЕМ К ОПЛАТЕ</h5>
<div class="payment-icons">
<span class="pay-icon"><i class="fab fa-cc-visa"></i></span>
<span class="pay-icon"><i class="fab fa-cc-mastercard"></i></span>
</div>
</div>
</div>
<div class="copyright">
<p>© 2025 AETERNA. Все права защищены.</p>
</div>
</footer>
<?php
}
?>
<script>
$(document).ready(function() {
// Обновление количества товаров
$('.products__qty-btn').click(function() {
const productId = $(this).data('id');
const isPlus = $(this).hasClass('plus');
const $qtyValue = $(this).siblings('.products__qty-value');
let quantity = parseInt($qtyValue.text());
if (isPlus) {
quantity++;
} else if (quantity > 1) {
quantity--;
}
$.ajax({
url: 'update_cart.php',
method: 'POST',
data: {
product_id: productId,
quantity: quantity
},
success: function(response) {
try {
const result = JSON.parse(response);
if (result.success) {
$qtyValue.text(quantity);
updateTotals();
} else {
alert('Ошибка: ' + result.message);
}
} catch(e) {
console.error('Ошибка обновления корзины', e);
}
}
});
});
// Удаление товара
$('.remove-from-cart').click(function() {
const productId = $(this).data('id');
const $item = $(this).closest('.products__item');
$.ajax({
url: 'remove_from_cart.php',
method: 'POST',
data: {
product_id: productId
},
success: function(response) {
try {
const result = JSON.parse(response);
if (result.success) {
$item.fadeOut(300, function() {
$(this).remove();
updateTotals();
// Если корзина пуста, показываем сообщение
if ($('#cartItems .products__item').length === 0) {
$('#cartItems').html('<div class="empty-cart">Ваша корзина пуста</div>');
$('.order').hide();
}
});
}
} catch(e) {
console.error('Ошибка удаления товара', e);
}
}
});
});
// Обновление итогов
function updateTotals() {
let productsTotal = 0;
let totalCount = 0;
$('.products__item').each(function() {
const price = parseInt($(this).data('price'));
const quantity = parseInt($(this).find('.products__qty-value').text());
productsTotal += price * quantity;
totalCount += quantity;
});
const delivery = parseFloat($('input[name="delivery_price"]').val());
const discount = parseFloat($('input[name="discount"]').val());
const finalTotal = productsTotal + delivery - discount;
$('.products-total').text(productsTotal.toLocaleString('ru-RU') + ' ₽');
$('.summary-count').text(totalCount);
$('.total-count').text(totalCount + ' шт.');
$('.final-total').text(finalTotal.toLocaleString('ru-RU') + ' ₽');
}
// Применение промокода
$('#applyPromo').click(function() {
const promoCode = $('#promo_code').val().toUpperCase();
if (promoCode === 'SALE10') {
const productsTotal = parseFloat($('.products-total').text().replace(/[^0-9]/g, ''));
const discount = Math.round(productsTotal * 0.1);
$('input[name="discount"]').val(discount);
$('.discount-total').text(discount.toLocaleString('ru-RU') + ' ₽');
showMessage('Промокод применен! Скидка 10%', 'success');
updateTotals();
} else if (promoCode === 'FREE') {
$('input[name="delivery_price"]').val(0);
$('.delivery-price').text('0 ₽');
showMessage('Промокод применен! Бесплатная доставка', 'success');
updateTotals();
} else if (promoCode) {
showMessage('Промокод недействителен', 'error');
}
});
// Обработка формы заказа
$('#orderForm').submit(function(e) {
e.preventDefault();
if (!$('#privacy-checkbox').is(':checked')) {
$('#privacy-error').show();
return;
}
$('#privacy-error').hide();
$('#submit-order').prop('disabled', true).text('ОБРАБОТКА...');
$.ajax({
url: 'process_order.php',
method: 'POST',
data: $(this).serialize(),
success: function(response) {
try {
const result = JSON.parse(response);
if (result.success) {
window.location.href = 'order_success.php?id=' + result.order_id;
} else {
showMessage('Ошибка: ' + result.message, 'error');
$('#submit-order').prop('disabled', false).text('ОФОРМИТЬ ЗАКАЗ');
}
} catch(e) {
showMessage('Ошибка обработки заказа', 'error');
$('#submit-order').prop('disabled', false).text('ОФОРМИТЬ ЗАКАЗ');
}
}
});
});
function showMessage(message, type) {
const $msg = type === 'success' ? $('#order-success') : $('#form-error');
$msg.text(message).fadeIn(300);
setTimeout(() => $msg.fadeOut(300), 5000);
}
});
</script>
</body>
</html>