- •Курсовая работа по дисциплине
- •1. Введение
- •2. Постановка задачи
- •3. Обоснование выбора технологий
- •4. Разработка структуры клиентской части
- •5. Разработка собственных компонентов
- •5.1. Модель представления
- •5.2. Слой управления состоянием
- •5.3. Компоненты пользовательского интерфейса
- •5.4. Модуль взаимодействия с api
- •6. Сценарии пользователя
- •7. Заключение
- •8. Список литературы
- •9. Приложение
5.2. Слой управления состоянием
5.2.1. Класс MedicalPortal
Назначение: Класс MedicalPortal является центральным управляющим компонентом клиентской части, инкапсулирующим всё состояние приложения, бизнес-логику и методы взаимодействия с пользовательским интерфейсом.
Структура состояния: Класс содержит ключевые свойства для хранения состояния, инициализируемые в конструкторе и обновляемые через различные методы:
· clinics и appointments — заполняются через loadData().
· cart — восстанавливается из localStorage и обновляется методами работы с корзиной.
· selectedAppointmentId — управляется через renderTimeSlots() и updateBookButtonState().
· currentDate — изменяется через обработчики календаря в setupEventListeners().
· myAppointments — загружается через loadMyAppointments().
Методы жизненного цикла:
· constructor() инициализирует состояние и запускает init().
· init() координирует начальную загрузку и настройку приложения, вызывая последовательно loadData(), setupEventListeners() и методы первичного рендеринга.
Принципы управления состоянием: Все изменения состояния происходят через методы класса, которые гарантируют согласованность данных и автоматическое обновление пользовательского интерфейса через соответствующие методы рендеринга.
5.2.2. Управление корзиной услуг (Cart State)
Назначение: Модуль управления корзиной отвечает за хранение, обновление, сохранение и восстановление выбранных пользователем медицинских услуг.
Структура данных корзины: Корзина реализована как объект, где ключами являются уникальные идентификаторы услуг. Состояние корзины сохраняется между сессиями.
Ключевые методы управления:
· addSelectedServiceToCart() — добавляет услугу из выпадающего списка.
· addCustomServiceToCart() — добавляет произвольную услугу через модальное окно, открываемое openAddServiceModal().
· persistCart() — сохраняет корзину в localStorage.
· updateCartDisplay() — перерисовывает интерфейс корзины, вызывается после любых изменений.
Механизм сохранения: для обеспечения сохранности данных между сессиями состояние корзины автоматически сохраняется через persistCart() при каждом изменении и восстанавливается при инициализации приложения в конструкторе класса.
5.2.3. Управление состоянием записи на приём
Назначение: Модуль управления записью отслеживает выбранные пользователем параметры и обеспечивает корректность и согласованность данных в процессе записи.
Логика зависимых выборов: Реализована цепочка обработчиков событий, установленных в setupEventListeners():
1. Выбор клиницы (изменение #clinic-select) запускает updateDoctorSelect() и clearTimeSlots().
2. Выбор врача (изменение #doctor-select) запускает renderTimeSlots().
3. Выбор временного слота (клик на .time-slot) активирует кнопку подтверждения через updateBookButtonState().
Процесс записи: Финальное действие — вызов bookAppointment(), который отправляет данные на сервер и, в случае успеха, обновляет состояние приложения через повторный вызов loadData() и других методов обновления интерфейса.
Удаление записи начинается с обработчиков кликов для всех кнопок с классом .my-appointment-delete внутри указанного контейнера. Для каждой кнопки добавляется асинхронный обработчик события click, который сначала показывает диалоговое окно подтверждения, — если пользователь нажимает "Отмена", выполнение прерывается. Затем формируется JSON для серверного запроса: id берётся из dataset.id кнопки (или null), а clinic_name, doctor и appointment_time — из соответствующих data-атрибутов кнопки. Далее выполняется асинхронный POST-запрос на /api/my_appointments/delete.
