Исправление багов авторизации, корзины и админки

- Исправлено выпадающее меню профиля (hover-баг с margin-top)
- Исправлена авторизация: правильные пути к API (api/auth.php)
- Исправлены ссылки на админку (admin/index.php вместо admin_panel.php)
- Исправлены пути API корзины в catalog.php и checkout.php
- Добавлена форма добавления/редактирования товаров в админке
- Исправлены кнопки +/- в корзине (улучшена обработка AJAX)
- Исправлена регистрация: правильные пути и обработка boolean в PostgreSQL
- Добавлена миграция для назначения прав админа пользователю admin@mail.ru
- Удален тестовый блок 'Быстрый вход' для неавторизованных пользователей
- Улучшена обработка ошибок во всех API-эндпоинтах
This commit is contained in:
kirill.khorkov
2025-12-16 02:58:44 +03:00
parent 3f257120fa
commit 29b9aaac50
388 changed files with 15312 additions and 3220 deletions

299
public/login.php Normal file
View File

@@ -0,0 +1,299 @@
<?php
session_start();
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>AETERNA - Вход</title>
<link rel="stylesheet/less" type="text/css" href="style_for_cite.less">
<script src="https://cdn.jsdelivr.net/npm/less"></script>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">
<style>
/* Добавляем стили для статуса пользователя */
.user-status {
position: fixed;
top: 20px;
right: 20px;
z-index: 1000;
background: white;
padding: 10px 15px;
border-radius: 5px;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
display: flex;
align-items: center;
gap: 10px;
}
.user-status.admin {
border-left: 4px solid #617365;
}
.user-status.user {
border-left: 4px solid #28a745;
}
.status-icon {
font-size: 20px;
}
.admin-icon {
color: #617365;
}
.user-icon {
color: #28a745;
}
</style>
<script src="check_auth.js"></script>
<style>
/* Стили для блокировки доступа */
.link-disabled {
cursor: not-allowed !important;
opacity: 0.7 !important;
pointer-events: none !important;
}
.auth-required {
position: relative;
}
.auth-required::after {
content: "🔒";
position: absolute;
top: -5px;
right: -10px;
font-size: 10px;
}
</style>
</head>
<body>
<!-- Статус пользователя -->
<div class="user-status" id="userStatus" style="display: none;">
<i class="fas fa-user status-icon" id="statusIcon"></i>
<div>
<div id="statusText"></div>
<div id="userEmail" style="font-size: 12px; color: #666;"></div>
</div>
<button onclick="logout()" style="background: none; border: none; color: #666; cursor: pointer;">
<i class="fas fa-sign-out-alt"></i>
</button>
</div>
<header class="header">
<div class="header__top">
<div class="container header__top-content">
<div class="logo">AETERNA</div>
<div class="search-catalog">
<div class="catalog-dropdown">
Все категории <span>&#9660;</span>
<div class="catalog-dropdown__menu">
<ul>
<li>Диваны</li>
<li>Кровати</li>
<li>Шкафы</li>
<li>Стулья</li>
<li>Столы</li>
<li>Комоды</li>
<li>Тумбы</li>
<li>Полки</li>
<li>Стенки</li>
<li>Аксессуары</li>
</ul>
</div>
</div>
<div class="search-box">
<input type="text" placeholder="Поиск товаров">
<span class="search-icon"><i class="fas fa-search"></i></span>
</div>
</div>
<div class="header__icons header__icons--top">
<a href="checkout.php" class="icon"><i class="fas fa-shopping-cart"></i></a>
<a href="register.php" class="icon"><i class="far fa-user"></i></a>
</div>
</div>
</div>
<div class="header__bottom">
<div class="container header__bottom-content">
<div class="catalog-menu">
<a href="/catalog.php" class="catalog-link">
<div class="catalog-icon">
<span class="line"></span>
<span class="line"></span>
<span class="line"></span>
</div>
<span class="catalog-lines">☰</span>
Каталог
</a>
</div>
<nav class="nav">
<ul class="nav-list">
<li><a href="cite_mebel.php">Главная</a></li>
<li><a href="services.php">Услуги</a></li>
<li><a href="delivery.php">Доставка и оплата</a></li>
<li><a href="warranty.php">Гарантия</a></li>
<li><a href="#footer">Контакты</a></li>
</ul>
</nav>
<div class="header-phone">+7(912)999-12-23</div>
</div>
</div>
</header>
<main class="profile-page-main">
<div class="profile-container">
<div class="profile-left-col">
<div class="logo">AETERNA</div>
</div>
<div class="profile-right-col">
<div class="profile-form-block">
<h2>ВХОД В АККАУНТ</h2>
<form class="profile-form" action="#" method="POST" id="loginForm">
<div class="input-group">
<label for="login-email">E-mail</label>
<input type="email" id="login-email" name="email" placeholder="Ваш электронный адрес" required>
<div class="error-message" id="email-error">
Введите корректный email адрес
</div>
</div>
<div class="input-group">
<label for="login-password">Пароль</label>
<input type="password" id="login-password" name="password" placeholder="Введите пароль" required>
<div class="error-message" id="password-error">Неверный пароль</div>
</div>
<div class="form-options">
<label class="remember-me">
<input type="checkbox" id="remember" name="remember">
Запомнить меня
</label>
<a href="#" class="forgot-password">Забыли пароль?</a>
</div>
<button type="submit" class="btn primary-btn save-btn">Войти</button>
<div class="auth-actions">
<span class="auth-text">Нет аккаунта?</span>
<a href="register.php" class="login-btn">Зарегистрироваться</a>
</div>
</form>
</div>
</div>
</div>
</main>
<!-- Блок для системных сообщений -->
<div class="page-messages">
<div class="message error" id="errorMessage"></div>
<div class="message success" id="successMessage"></div>
<div class="message warning" id="warningMessage"></div>
</div>
<footer class="footer" id="footer">
<div class="container footer__content">
<div class="footer__col footer__col--logo">
<div class="logo">AETERNA</div>
</div>
<div class="footer__col">
<h5>ПОКУПАТЕЛЮ</h5>
<ul>
<li><a href="/catalog.php">Каталог</a></li>
<li><a href="услуги.html">Услуги</a></li>
</ul>
</div>
<div class="footer__col">
<h5>ПОМОЩЬ</h5>
<ul>
<li><a href="Доставка.html">Доставка и оплата</a></li>
<li><a href="Гарантия.html">Гарантия и возврат</a></li>
<li><a href="cite_mebel.html#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>
<script>
$(document).ready(function() {
// Проверяем редирект после входа
const urlParams = new URLSearchParams(window.location.search);
const redirectUrl = urlParams.get('redirect');
// Если есть редирект - сохраняем его
if (redirectUrl) {
sessionStorage.setItem('redirectAfterLogin', redirectUrl);
}
// Обработка формы входа
$('#loginForm').on('submit', function(e) {
e.preventDefault();
const email = $('#login-email').val();
const password = $('#login-password').val();
// Валидация на клиенте
if (!email || !password) {
alert('Заполните все поля');
return;
}
// Отправляем данные на сервер для PHP сессии
$.ajax({
url: 'api/auth.php',
method: 'POST',
data: {
email: email,
password: password
},
dataType: 'json',
success: function(result) {
if (result.success) {
// Редирект на сохраненный URL или каталог
const savedRedirect = sessionStorage.getItem('redirectAfterLogin') || 'catalog.php';
sessionStorage.removeItem('redirectAfterLogin');
window.location.href = savedRedirect;
} else {
alert(result.message || 'Ошибка авторизации');
}
},
error: function() {
alert('Ошибка сервера. Попробуйте позже.');
}
});
});
});
</script>
</body>
</html>