Files
web_work/assets/js/profile.js
kirill.khorkov 29b9aaac50 Исправление багов авторизации, корзины и админки
- Исправлено выпадающее меню профиля (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-эндпоинтах
2025-12-16 02:58:44 +03:00

384 lines
14 KiB
JavaScript
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.
$(document).ready(function() {
// Функции для отображения сообщений
function showMessage(type, text) {
const messageId = type + 'Message';
const $message = $('#' + messageId);
$message.text(text).fadeIn(300);
setTimeout(() => {
$message.fadeOut(300);
}, 5000);
}
// Проверка, является ли email администратора
function isAdminEmail(email) {
const adminEmails = ['admin@aeterna.ru', 'administrator@aeterna.ru', 'aeterna@mail.ru'];
return adminEmails.includes(email.toLowerCase());
}
// Валидация ФИО (без цифр)
function validateFIO(fio) {
const words = fio.trim().split(/\s+/);
// Проверяем, что минимум 2 слова и нет цифр
const hasNoDigits = !/\d/.test(fio);
return words.length >= 2 && words.every(word => word.length >= 2) && hasNoDigits;
}
// Валидация города
function validateCity(city) {
return city.trim().length >= 2 && /^[а-яА-ЯёЁ\s-]+$/.test(city);
}
// Валидация email
function validateEmail(email) {
const localPart = email.split('@')[0];
// Проверка на кириллические символы перед @
if (/[а-яА-ЯёЁ]/.test(localPart)) {
showError('email', 'В тексте перед знаком "@" не должно быть кириллических символов');
return false;
}
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
if (!emailRegex.test(email)) {
showError('email', 'Введите корректный email адрес');
return false;
}
hideError('email');
return true;
}
// Валидация телефона
function validatePhone(phone) {
const phoneRegex = /^(\+7|8)[\s-]?\(?\d{3}\)?[\s-]?\d{3}[\s-]?\d{2}[\s-]?\d{2}$/;
return phoneRegex.test(phone.replace(/\s/g, ''));
}
// Валидация пароля
function validatePassword(password) {
return password.length >= 6;
}
// Показать/скрыть ошибку
function showError(fieldId, message) {
$('#' + fieldId).addClass('error');
$('#' + fieldId + '-error').text(message).show();
}
function hideError(fieldId) {
$('#' + fieldId).removeClass('error');
$('#' + fieldId + '-error').hide();
}
// Валидация формы
function validateForm() {
let isValid = true;
// Валидация ФИО
const fio = $('#fio').val();
if (!validateFIO(fio)) {
if (/\d/.test(fio)) {
showError('fio', 'ФИО не должно содержать цифры');
} else {
showError('fio', 'ФИО должно содержать минимум 2 слова (каждое от 2 символов)');
}
isValid = false;
} else {
hideError('fio');
}
// Валидация города
const city = $('#city').val();
if (!validateCity(city)) {
showError('city', 'Укажите корректное название города (только русские буквы)');
isValid = false;
} else {
hideError('city');
}
// Валидация email
const email = $('#email').val();
if (!validateEmail(email)) {
showError('email', 'Введите корректный email адрес');
isValid = false;
} else {
hideError('email');
}
// Валидация телефона
const phone = $('#phone').val();
if (!validatePhone(phone)) {
showError('phone', 'Введите номер в формате: +7(912)999-12-23');
isValid = false;
} else {
hideError('phone');
}
// Валидация пароля
const password = $('#password').val();
if (!validatePassword(password)) {
showError('password', 'Пароль должен содержать минимум 6 символов');
isValid = false;
} else {
hideError('password');
}
// Проверка совпадения паролей
const confirmPassword = $('#confirm-password').val();
if (password !== confirmPassword) {
showError('confirm-password', 'Пароли не совпадают');
isValid = false;
} else {
hideError('confirm-password');
}
// Проверка согласия с условиями
if (!$('#privacy').is(':checked')) {
$('#privacy-error').show();
isValid = false;
} else {
$('#privacy-error').hide();
}
return isValid;
}
// Реальная валидация при вводе
$('input').on('blur', function() {
const fieldId = $(this).attr('id');
const value = $(this).val();
switch(fieldId) {
case 'fio':
if (!validateFIO(value)) {
if (/\d/.test(value)) {
showError(fieldId, 'ФИО не должно содержать цифры');
} else {
showError(fieldId, 'ФИО должно содержать минимум 2 слова');
}
} else {
hideError(fieldId);
}
break;
case 'city':
if (!validateCity(value)) {
showError(fieldId, 'Укажите корректное название города');
} else {
hideError(fieldId);
}
break;
case 'email':
if (!validateEmail(value)) {
showError(fieldId, 'Введите корректный email адрес');
} else {
hideError(fieldId);
}
break;
case 'phone':
if (!validatePhone(value)) {
showError(fieldId, 'Введите номер в формате: +7(912)999-12-23');
} else {
hideError(fieldId);
}
break;
case 'password':
if (!validatePassword(value)) {
showError(fieldId, 'Пароль должен содержать минимум 6 символов');
} else {
hideError(fieldId);
}
break;
case 'confirm-password':
const password = $('#password').val();
if (value !== password) {
showError(fieldId, 'Пароли не совпадают');
} else {
hideError(fieldId);
}
break;
}
});
// Обработка отправки формы
$('#registrationForm').on('submit', function(e) {
e.preventDefault();
if (validateForm()) {
const email = $('#email').val();
const isAdmin = isAdminEmail(email);
// Сохраняем данные пользователя в localStorage
const userData = {
email: email,
fio: $('#fio').val(),
phone: $('#phone').val(),
isAdmin: isAdmin,
registered: new Date().toISOString()
};
localStorage.setItem('userData', JSON.stringify(userData));
localStorage.setItem('isLoggedIn', 'true');
localStorage.setItem('isAdmin', isAdmin.toString());
// Эмуляция успешной регистрации
showMessage('success', 'Регистрация прошла успешно! ' +
(isAdmin ? 'Вы зарегистрированы как администратор.' : 'Добро пожаловать в AETERNA!'));
setTimeout(() => {
// Перенаправление на главную страницу
window.location.href = 'cite_mebel.php';
}, 2000);
} else {
showMessage('error', 'Пожалуйста, исправьте ошибки в форме');
}
});
// Плавная прокрутка к якорям
$('a[href^="#"]').on('click', function(event) {
var target = $(this.getAttribute('href'));
if (target.length) {
event.preventDefault();
$('html, body').stop().animate({
scrollTop: target.offset().top
}, 1000);
}
});
// Переключение между регистрацией и входом
$('.login-btn').on('click', function() {
showMessage('warning', 'Переход к форме входа...');
setTimeout(() => {
window.location.href = 'вход.php';
}, 1000);
});
// Обработка ссылки "Сменить пароль"
$('.password-link').on('click', function(e) {
e.preventDefault();
showMessage('warning', 'Функция смены пароля будет доступна после регистрации');
});
// Маска для телефона
$('#phone').on('input', function() {
let value = $(this).val().replace(/\D/g, '');
if (value.startsWith('7') || value.startsWith('8')) {
value = value.substring(1);
}
if (value.length > 0) {
value = '+7(' + value;
if (value.length > 6) value = value.substring(0, 6) + ')' + value.substring(6);
if (value.length > 10) value = value.substring(0, 10) + '-' + value.substring(10);
if (value.length > 13) value = value.substring(0, 13) + '-' + value.substring(13);
if (value.length > 16) value = value.substring(0, 16);
}
$(this).val(value);
});
// Запрет ввода цифр в поле ФИО
$('#fio').on('input', function() {
let value = $(this).val();
// Удаляем цифры из значения
value = value.replace(/\d/g, '');
$(this).val(value);
});
});
// Для входа (файл вход.html)
$(document).ready(function() {
// Проверяем, если пользователь уже вошел
if (localStorage.getItem('isLoggedIn') === 'true') {
const userData = JSON.parse(localStorage.getItem('userData') || '{}');
if (userData.email) {
$('#login-email').val(userData.email);
}
}
// Функция проверки пароля администратора
function checkAdminPassword(email, password) {
// Административные аккаунты
const adminAccounts = {
'admin@aeterna.ru': 'admin123',
'administrator@aeterna.ru': 'admin123',
'aeterna@mail.ru': 'admin123'
};
return adminAccounts[email.toLowerCase()] === password;
}
// Валидация формы входа
$('#loginForm').on('submit', function(e) {
e.preventDefault();
let isValid = true;
const email = $('#login-email').val();
const password = $('#login-password').val();
// Валидация email
if (!isValidEmail(email)) {
$('#email-error').show();
isValid = false;
} else {
$('#email-error').hide();
}
// Валидация пароля
if (password.length < 6) {
$('#password-error').show();
isValid = false;
} else {
$('#password-error').hide();
}
if (isValid) {
// Здесь обычно отправка данных на сервер
showMessage('success', 'Вы успешно вошли в систему!');
// Перенаправление на главную страницу через 1.5 секунды
setTimeout(function() {
window.location.href = 'cite_mebel.php';
}, 1500);
}
});
// Функция показа сообщений
function showMessage(type, text) {
const messageId = type + 'Message';
const $message = $('#' + messageId);
$message.text(text).show();
setTimeout(function() {
$message.fadeOut();
}, 3000);
}
// Скрываем сообщения об ошибках при фокусе на полях
$('input').on('focus', function() {
$(this).next('.error-message').hide();
});
// Обработка чекбокса "Запомнить меня"
$('#remember').on('change', function() {
if ($(this).is(':checked')) {
const email = $('#login-email').val();
if (email) {
localStorage.setItem('rememberedEmail', email);
}
} else {
localStorage.removeItem('rememberedEmail');
}
});
// Автозаполнение email, если пользователь выбрал "Запомнить меня"
const rememberedEmail = localStorage.getItem('rememberedEmail');
if (rememberedEmail) {
$('#login-email').val(rememberedEmail);
$('#remember').prop('checked', true);
}
// Обработка ссылки "Забыли пароль?"
$('.forgot-password').on('click', function(e) {
e.preventDefault();
showMessage('info', 'Для восстановления пароля обратитесь к администратору');
});
});