Скачиваний:
0
Добавлен:
29.12.2025
Размер:
280.25 Кб
Скачать

Рисунок 1. Страница с Клиниками

Рисунок 2. Страница с Календарем

Рисунок 3. Страница с Корзиной

Работа функции корзины:

// Корзина

        function addToCart(clinicId, serviceId) {

            const clinic = clinicsData.find(c => c.id === clinicId);

            const service = clinic.services.find(s => s.id === serviceId);

           

            cart.push({

                clinicId: clinicId,

                clinicName: clinic.name,

                serviceId: service.id,

                serviceName: service.name,

                price: service.price

            });

           

            renderCart();

            alert(`Услуга "${service.name}" добавлена в корзину`);

        }

       

        function removeFromCart(clinicId, serviceId) {

            const index = cart.findIndex(item => item.clinicId === clinicId && item.serviceId === serviceId);

            if (index !== -1) {

                cart.splice(index, 1);

                renderCart();

            }

        }

       

        function renderCart() {

            const cartEmpty = document.getElementById('cartEmpty');

            const cartContent = document.getElementById('cartContent');

            const cartItems = document.getElementById('cartItems');

            const cartTotalPrice = document.getElementById('cartTotalPrice');

           

            if (cart.length === 0) {

                cartEmpty.style.display = 'block';

                cartContent.style.display = 'none';

                return;

            }

           

            cartEmpty.style.display = 'none';

            cartContent.style.display = 'block';

            cartItems.innerHTML = '';

           

            const clinicsInCart = {};

            cart.forEach(item => {

                if (!clinicsInCart[item.clinicId]) {

                    clinicsInCart[item.clinicId] = {

                        clinicName: item.clinicName,

                        services: [],

                        total: 0

                    };

                }

               

                clinicsInCart[item.clinicId].services.push(item);

                clinicsInCart[item.clinicId].total += item.price;

            });

           

            Object.keys(clinicsInCart).forEach(clinicId => {

                const clinicData = clinicsInCart[clinicId];

               

                const clinicGroup = document.createElement('div');

                clinicGroup.className = 'cart-clinic-group';

                clinicGroup.innerHTML = `<div class="cart-clinic-name">${clinicData.clinicName}</div>`;

               

                clinicData.services.forEach(item => {

                    const cartItem = document.createElement('div');

                    cartItem.className = 'cart-item';

                    cartItem.innerHTML = `

                        <div>

                            <div class="service-name">${item.serviceName}</div>

                        </div>

                        <div>

                            <span class="service-price">${item.price} ₽</span>

                            <button class="btn" onclick="removeFromCart(${item.clinicId}, ${item.serviceId})" style="margin-left: 10px;">Удалить</button>

                        </div>

                    `;

                    clinicGroup.appendChild(cartItem);

                });

               

                const clinicTotal = document.createElement('div');

                clinicTotal.className = 'cart-clinic-total';

                clinicTotal.textContent = `Итого по клинике: ${clinicData.total} ₽`;

                clinicGroup.appendChild(clinicTotal);

               

                cartItems.appendChild(clinicGroup);

            });

           

            const totalPrice = cart.reduce((sum, item) => sum + item.price, 0);

            cartTotalPrice.textContent = totalPrice;

        }

1. Функция addToCart(clinicId, serviceId)

function addToCart(clinicId, serviceId) {

// 1. Поиск клиника по ID

const clinic = clinicsData.find(c => c.id === clinicId);

// 2. Поиск услуги в найденной клинике по ID услуги

const service = clinic.services.find(s => s.id === serviceId);

// 3. Добавление услуги в корзину

cart.push({

clinicId: clinicId, // ID клиники для группировки

clinicName: clinic.name, // Название клиники для отображения

serviceId: service.id, // ID услуги для идентификации

serviceName: service.name, // Название услуги для отображения

price: service.price // Цена услуги для подсчета суммы

});

// 4. Обновление отображения корзины

renderCart();

// 5. Уведомление пользователя

alert(Услуга "${service.name}" добавлена в корзину);

}

Пояснение:

· clinicsData.find() - ищет клиник в массиве по ID

· clinic.services.find() - ищет услугу в массиве услуг клиника

· cart.push() - добавляет объект с данными услуги в массив корзины

· Каждая услуга хранит всю необходимую информацию для отображения и группировки

2. Функция removeFromCart(clinicId, serviceId)

function removeFromCart(clinicId, serviceId) {

// 1. Поиск индекса услуги в корзине

const index = cart.findIndex(item =>

item.clinicId === clinicId && item.serviceId === serviceId

);

// 2. Если услуга найдена, удаляем ее

if (index !== -1) {

cart.splice(index, 1); // Удаляем 1 элемент по найденному индексу

renderCart(); // Обновляем отображение

}

}

Пояснение:

· findIndex() - ищет индекс элемента в массиве по условию

· Условие проверяет совпадение и clinicId, и serviceId для точной идентификации

· splice(index, 1) - удаляет один элемент из массива по указанному индексу

· index !== -1 проверяет, что элемент был найден (-1 означает "не найдено")

3. Функция renderCart() - основная логика отображения

function renderCart() {

// 1. Получение DOM-элементов

const cartEmpty = document.getElementById('cartEmpty');

const cartContent = document.getElementById('cartContent');

const cartItems = document.getElementById('cartItems');

const cartTotalPrice = document.getElementById('cartTotalPrice');

// 2. Проверка на пустую корзину

if (cart.length === 0) {

cartEmpty.style.display = 'block'; // Показываем сообщение "Корзина пуста"

cartContent.style.display = 'none'; // Скрываем содержимое корзины

return; // Выходим из функции

}

// 3. Если корзина не пустая

cartEmpty.style.display = 'none'; // Скрываем сообщение о пустой корзине

cartContent.style.display = 'block'; // Показываем содержимое корзины

cartItems.innerHTML = ''; // Очищаем контейнер для перерисовки

// 4. Группировка услуг по клиникам

const clinicsInCart = {};

cart.forEach(item => {

// Если клиник еще нет в объекте группировки - создаем

if (!clinicsInCart[item.clinicId]) {

clinicsInCart[item.clinicId] = {

clinicName: item.clinicName, // Название клиники

services: [], // Массив услуг этой клиники

total: 0 // Общая сумма услуг клиники

};

}

// Добавляем услугу в массив услуг клиники

clinicsInCart[item.clinicId].services.push(item);

// Увеличиваем общую сумму клиники на цену услуги

clinicsInCart[item.clinicId].total += item.price;

});

Пояснение группировки:

· Создается объект clinicsInCart, где ключи - это ID клиник

· Для каждой услуги в корзине проверяется, есть ли уже запись для ее клиника

· Если нет - создается новая группа с начальными значениями

· Услуга добавляется в массив services соответствующей групп

· Сумма цены услуги добавляется к total группы

4. Функция отображения сгруппированных услуг

Object.keys(clinicsInCart).forEach(clinicId => {

const clinicData = clinicsInCart[clinicId];

// Создаем контейнер для группы услуг одной клиники

const clinicGroup = document.createElement('div');

clinicGroup.className = 'cart-clinic-group';

// Добавляем заголовок с названием клиники

clinicGroup.innerHTML = <div class="cart-clinic-name">${clinicData.clinicName}</div>;

// Добавляем каждую услугу клиники

clinicData.services.forEach(item => {

const cartItem = document.createElement('div');

cartItem.className = 'cart-item';

cartItem.innerHTML =

<div>

<div class="service-name">${item.serviceName}</div>

</div>

<div>

<span class="service-price">${item.price} ₽</span>

<button class="btn" onclick="removeFromCart(${item.clinicId}, ${item.serviceId})" style="margin-left: 10px;">Удалить</button>

</div>

;

clinicGroup.appendChild(cartItem);

});

// Добавляем итоговую сумму по клинике

const clinicTotal = document.createElement('div');

clinicTotal.className = 'cart-clinic-total';

clinicTotal.textContent = Итого по клинике: ${clinicData.total} ₽;

clinicGroup.appendChild(clinicTotal);

// Добавляем готовую группу в общий контейнер

cartItems.appendChild(clinicGroup);

});

Пояснение отображения:

· Object.keys(clinicsInCart) - получает массив ID клиник из объекта группировки

· Для каждого клиника создается отдельный блок с классом cart-clinic-group

· Внутри блока отображаются все услуги этого клиника с кнопками удаления

· Под списком услуг выводится суммарная стоимость всех услуг данной клиники

5. Функция расчета и отображения общей суммы всех услуг

const totalPrice = cart.reduce((sum, item) => sum + item.price, 0);

cartTotalPrice.textContent = totalPrice;

}

Пояснение расчета общей суммы:

· reduce() - метод массива, который последовательно обрабатывает каждый элемент

· Начальное значение аккумулятора sum = 0

· Для каждого элемента item к сумме добавляется item.price

· Результат - общая стоимость всех услуг в корзине

Соседние файлы в папке Пример проекта. Петрова