From e73e6cb672edb90e076bdcb8ee851c2034452d74 Mon Sep 17 00:00:00 2001 From: Egor Deev Date: Thu, 20 Nov 2025 15:44:53 +0300 Subject: [PATCH] LAB-09 --- labs/lab-09/img/main.jpg | Bin 0 -> 91387 bytes labs/lab-09/index.html | 103 +++ labs/lab-09/js/menu.js | 314 ++++++++++ labs/lab-09/js/order.js | 448 ++++++++++++++ labs/lab-09/js/orders.js | 584 ++++++++++++++++++ ...отовки к защите ЛР №9.txt | 16 + ...Лабораторная работа 9.md | 75 +++ labs/lab-09/styles/menu.css | 298 +++++++++ labs/lab-09/styles/order.css | 266 ++++++++ labs/lab-09/styles/orders.css | 414 +++++++++++++ labs/lab-09/styles/styles.css | 180 ++++++ labs/lab-09/templates/about.html | 43 ++ labs/lab-09/templates/delivery.html | 43 ++ labs/lab-09/templates/menu.html | 199 ++++++ labs/lab-09/templates/order.html | 109 ++++ labs/lab-09/templates/orders.html | 178 ++++++ 16 files changed, 3270 insertions(+) create mode 100644 labs/lab-09/img/main.jpg create mode 100644 labs/lab-09/index.html create mode 100644 labs/lab-09/js/menu.js create mode 100644 labs/lab-09/js/order.js create mode 100644 labs/lab-09/js/orders.js create mode 100644 labs/lab-09/other/Вопросы для подготовки к защите ЛР №9.txt create mode 100644 labs/lab-09/other/Задание - Лабораторная работа 9.md create mode 100644 labs/lab-09/styles/menu.css create mode 100644 labs/lab-09/styles/order.css create mode 100644 labs/lab-09/styles/orders.css create mode 100644 labs/lab-09/styles/styles.css create mode 100644 labs/lab-09/templates/about.html create mode 100644 labs/lab-09/templates/delivery.html create mode 100644 labs/lab-09/templates/menu.html create mode 100644 labs/lab-09/templates/order.html create mode 100644 labs/lab-09/templates/orders.html diff --git a/labs/lab-09/img/main.jpg b/labs/lab-09/img/main.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f9f65584208595ae6dbca921b7600d90d36ef0a7 GIT binary patch literal 91387 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%0A{0jY4yavZH>yM7rMS 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 NuUT(EMV9G@i zp+mTUwTHk;N9vFz(Dtf27j~U_ZCJU=@RybU01yvQ(Up<bp^-VVLhXjiB}!0zF~w;5{8^Q|8nq0MbB@F73+IWG`M~5v9z;b$Ee5>p!wfckeIXtdtJ3E}^c;eO{ zb28Ig0-Wj#lDr1*Vc3R{N-!4ztMS7D=W7bAaqbWes4I%el+~x8Vp7df)m$}BjYc}x zv2!nb{l;&s17j)D(fs92s|a8wId;|V6OMu?u9C*48L!sAxl+!W zNI{A@zLrs_dz5WvAx8$y9n2gL!E(*I4{vfWlY}7*6;UcI;dMuK6%%fUNxr3K0RgdQ zHv>kSZak*AMb5t$<|)Tyl6!9~t<^&WAd zZ2-bN*>PNAYe2##vtS1A;i%j+5+$!`a_Z@WfbdnGpF1lJ&7Gc@eDi@|?cz~rh&Pa@ z4eF2={{Yl})>N;;NQu-L(f5k(@lxL3_7E8?6^(8AsXzy+uxPHSG0 z)DEqZ4@D|nFgmsiaWm~Kj>A4(>o^1(Z*ur?FO@Uz|=`wWyYruwB-z8LXd4gM+W#Du~uvGzh zJ(&t-C_B2N6iP@?S)VA9rqCmj3DkQE1A=>on`Wgd@p6iLyFlbU#*IdTz>SSpb*I!w zP=f8Ytd04T*KeTq%Qz+290c6NDUBfdFwuGl$&0Z0?%xDhbT9#YXuvN)y0aQ;pbg=$ zVy@-4;E&!T@^cgF!UTT-^c7sI_Dd-=yU_-o%TKeYbgUXzFfkOB9+m!dL_FciO(Pld z0AYOOrMF#lmpIYB)BNC)>lZJ@?6O^IMSkIR!DtH!Bg^7gH?#|ti*F1rQ0Z$qgQ40V z(T3P*$x{k{lS}{_DIgwOb4TOl{)FeBPPm#Fi3l)Z68`EJN#8^+mUGs(mK{6G-t&IBO~uiuIXTyIfio zti{8W#k=%Mg=o)2gx#x`K8!WN;L08v%UgE9S=DwX6A)j*g~^4l+dKh)s>CsTgliyy)zN9Xfh~Ee4zhIee=yGnE0#Q5 zI@YpS2H0RVt~hNT*^I=quF5i+fn}gW_$5{v{hmkaIVs-hdHEJP2K~UMiAC#^)K>SY z!cH8S@{pu1ysO7-V$kJB()>d$;v}b#U=Dsq_%WZ7YF4XKvGF{xyL{Xl`*tum3_|m^ zJ4%5Ip(^+XrU7jY?Zda+&j<*k5Y%@!x86X;My~##d4a9q7k?CZwW zlcwzt@SW~3@N`B$a?ZaI-=qU%IO62fM1t0;l!0n3V7X>Y%>(#(umB*7Zy+F}Y0^V2vIuB_t>#Z%PgXCQA z*M>M16dSSfROPv%?3_U(94eVshQm9_$Yi^UwiI3;ar&;O?Kg)K7*sWweomofSy2NA zHp+W^d5axJYPzQM7#aQUz-Srbh+^;nHYsQaP*$yOH$zD4ajVPY=>7xm7(YRm=JG%G zDNz7l*Rl>U;L49i1X;3ez7t&2Rxd!t+^#NO{%a zjb4bMEk901QQvSQBL4u?(#9UMe5AlZ#WUB$s$JqTs_@`lARr^=C(6+{+ zB@V)`O=AM8fh-+iq8l$C2s^?6a0DPyuU2E-X5e5Z$*NHO63`&3E_kt+wQYWn{vwNx zOSDsAp0Uxt>46x*RD1w|c!&-cv7uhtau0AyOj<#&L>ca?ZS~9vn`$+OwlX+){$(7( z=pay8USXgpky_TONr4-1@Qm$_zKD%*FOW(TY;bsxwJx-ZlU96T;8xSfMo71r6B%o< zKV)P9f}BG6U?3BaDncT)iVnAUe8z`1uJ>c<${YdoME!Ha^;8^#>ivu(^bg)c=zRtr z`5X{peUFAzEiidq3*XFH0YnDETviki7SvSLM!ErPY%KinS=Zq3_e=ii_h? z(Kp!}?}h&W6)2cFZ}~{0;x^LDxN#YRn13y7^z|+k-Bumn8c@C1Q_)|875M6{fQK~l v!+b9jo=3U^J1U38700oLxlJ_Vex=>oD__JwNk#tv1(0z1zheS2zMucux?%1p literal 0 HcmV?d00001 diff --git a/labs/lab-09/index.html b/labs/lab-09/index.html new file mode 100644 index 0000000..5e173cb --- /dev/null +++ b/labs/lab-09/index.html @@ -0,0 +1,103 @@ + + + + + + + ЭкоЛанч - Доставка здоровых бизнес-ланчей в Москве + + + + + + +
+

ЭкоЛанч

+ +
+ +
+
+

О компании ЭкоЛанч

+ Здоровая еда в контейнерах +

ЭкоЛанч - это современная компания по доставке здоровых бизнес-ланчей в офисы Москвы. Наша миссия - сделать правильное питание доступным для занятых людей, которые ценят свое время и здоровье.

+

Мы используем только свежие продукты от проверенных поставщиков, а наши повара готовят блюда каждое утро. Все ланчи упакованы в экологичную биоразлагаемую упаковку, потому что мы заботимся не только о вашем здоровье, но и о здоровье нашей планеты.

+
+ +
+

Наши преимущества

+
    +
  • Быстрая доставка в течение 60 минут по всей Москве в пределах МКАД
  • +
  • Свежие блюда, приготовленные утром из качественных продуктов
  • +
  • Сбалансированное меню, разработанное профессиональными диетологами
  • +
  • Экологичная упаковка, безопасная для окружающей среды
  • +
  • Гибкая система скидок для корпоративных клиентов и постоянных заказчиков
  • +
+
+ + +
+ +
+

Контактная информация

+

Телефон: +7 (999) 373-77-37

+

Email: egor@deev.space

+

Адрес: г. Москва, ул. Михалковская, д. 7, к. 1, офис 813А

+

Режим работы: Пн-Пт с 7:00 до 23:00

+
+ + \ No newline at end of file diff --git a/labs/lab-09/js/menu.js b/labs/lab-09/js/menu.js new file mode 100644 index 0000000..e0611a4 --- /dev/null +++ b/labs/lab-09/js/menu.js @@ -0,0 +1,314 @@ +let dishes = []; + +const selectedDishes = { + soup: null, + 'main-course': null, + salad: null, + drink: null, + dessert: null +}; + +let activeFilters = { + soup: null, + 'main-course': null, + salad: null, + drink: null, + dessert: null +}; + +function loadDishes() { + const apiUrl = 'https://edu.std-900.ist.mospolytech.ru/labs/api/dishes'; + + console.log('Загрузка блюд из API...'); + + fetch(apiUrl) + .then(function(response) { + console.log('Ответ получен:', response.status); + if (!response.ok) { + throw new Error('Ошибка загрузки данных: ' + response.status); + } + return response.json(); + }) + .then(function(data) { + console.log('Данные загружены:', data.length, 'блюд'); + dishes = data; + sortDishes(); + loadOrderFromLocalStorage(); + displayDishes(); + updateOrderPanel(); + }) + .catch(function(error) { + console.error('Ошибка при загрузке блюд:', error); + alert('Не удалось загрузить меню. Проверьте подключение к интернету.'); + }); +} + +function sortDishes() { + dishes.sort(function(a, b) { + return a.name.localeCompare(b.name, 'ru'); + }); +} + +function displayDishes() { + const soupSection = document.getElementById('soup-section'); + const mainCourseSection = document.getElementById('main-course-section'); + const saladSection = document.getElementById('salad-section'); + const drinkSection = document.getElementById('drink-section'); + const dessertSection = document.getElementById('dessert-section'); + + if (!soupSection || !mainCourseSection || !saladSection || + !drinkSection || !dessertSection) { + console.error('Не найдены секции для отображения блюд'); + return; + } + + soupSection.innerHTML = ''; + mainCourseSection.innerHTML = ''; + saladSection.innerHTML = ''; + drinkSection.innerHTML = ''; + dessertSection.innerHTML = ''; + + console.log('Отображение блюд. Всего:', dishes.length); + + dishes.forEach(function(dish) { + const dishCard = createDishCard(dish); + + if (dish.category === 'soup') { + if (!activeFilters.soup || dish.kind === activeFilters.soup) { + soupSection.insertAdjacentHTML('beforeend', dishCard); + } + } else if (dish.category === 'main-course') { + if (!activeFilters['main-course'] || + dish.kind === activeFilters['main-course']) { + mainCourseSection.insertAdjacentHTML('beforeend', dishCard); + } + } else if (dish.category === 'salad') { + if (!activeFilters.salad || dish.kind === activeFilters.salad) { + saladSection.insertAdjacentHTML('beforeend', dishCard); + } + } else if (dish.category === 'drink') { + if (!activeFilters.drink || dish.kind === activeFilters.drink) { + drinkSection.insertAdjacentHTML('beforeend', dishCard); + } + } else if (dish.category === 'dessert') { + if (!activeFilters.dessert || + dish.kind === activeFilters.dessert) { + dessertSection.insertAdjacentHTML('beforeend', dishCard); + } + } + }); + + addDishClickHandlers(); + restoreSelection(); +} + +function createDishCard(dish) { + return ` +
+ ${dish.name} +

${dish.price} руб.

+

${dish.name}

+

${dish.count}

+ +
+ `; +} + +function addDishClickHandlers() { + const dishCards = document.querySelectorAll('.dish-card'); + + dishCards.forEach(function(card) { + card.addEventListener('click', function() { + const keyword = this.dataset.dish; + const dish = dishes.find(function(d) { + return d.keyword === keyword; + }); + + if (dish) { + selectDish(dish); + } + }); + }); +} + +function selectDish(dish) { + const previousDish = selectedDishes[dish.category]; + + if (previousDish) { + const previousCard = document.querySelector( + `.dish-card[data-dish="${previousDish.keyword}"]` + ); + if (previousCard) { + previousCard.classList.remove('selected'); + } + } + + selectedDishes[dish.category] = dish; + + const currentCard = document.querySelector( + `.dish-card[data-dish="${dish.keyword}"]` + ); + if (currentCard) { + currentCard.classList.add('selected'); + } + + saveOrderToLocalStorage(); + updateOrderPanel(); +} + +function saveOrderToLocalStorage() { + const order = {}; + + Object.keys(selectedDishes).forEach(function(category) { + if (selectedDishes[category]) { + order[category] = selectedDishes[category].id; + } + }); + + localStorage.setItem('selectedDishes', JSON.stringify(order)); + console.log('Заказ сохранен в localStorage:', order); +} + +function loadOrderFromLocalStorage() { + const savedOrder = localStorage.getItem('selectedDishes'); + + if (!savedOrder) { + console.log('Сохраненный заказ не найден'); + return; + } + + try { + const order = JSON.parse(savedOrder); + console.log('Загружен заказ из localStorage:', order); + + Object.keys(order).forEach(function(category) { + const dishId = order[category]; + const dish = dishes.find(function(d) { + return d.id === dishId; + }); + + if (dish) { + selectedDishes[category] = dish; + } + }); + } catch (error) { + console.error('Ошибка при загрузке заказа:', error); + } +} + +function updateOrderPanel() { + const orderPanel = document.getElementById('order-panel'); + const orderPanelPrice = document.getElementById('order-panel-price'); + const orderPanelLink = document.getElementById('order-panel-link'); + + if (!orderPanel || !orderPanelPrice || !orderPanelLink) { + console.error('Не найдены элементы панели заказа'); + return; + } + + const hasSelection = selectedDishes.soup || + selectedDishes['main-course'] || + selectedDishes.salad || + selectedDishes.drink || + selectedDishes.dessert; + + if (!hasSelection) { + orderPanel.classList.add('hidden'); + return; + } + + orderPanel.classList.remove('hidden'); + + let totalPrice = 0; + + Object.keys(selectedDishes).forEach(function(category) { + if (selectedDishes[category]) { + totalPrice += selectedDishes[category].price; + } + }); + + orderPanelPrice.textContent = totalPrice + ' руб.'; + + if (isValidCombo()) { + orderPanelLink.classList.remove('disabled'); + } else { + orderPanelLink.classList.add('disabled'); + } +} + +function setupFilters() { + const filterButtons = document.querySelectorAll('.filter-btn'); + + filterButtons.forEach(function(button) { + button.addEventListener('click', function() { + const kind = this.dataset.kind; + const section = this.closest('section'); + const category = section.querySelector('.dishes-grid').id + .replace('-section', ''); + + if (this.classList.contains('active')) { + this.classList.remove('active'); + activeFilters[category] = null; + } else { + const sectionButtons = section + .querySelectorAll('.filter-btn'); + sectionButtons.forEach(function(btn) { + btn.classList.remove('active'); + }); + this.classList.add('active'); + activeFilters[category] = kind; + } + + displayDishes(); + }); + }); +} + +function isValidCombo() { + const hasSoup = selectedDishes.soup !== null; + const hasMainCourse = selectedDishes['main-course'] !== null; + const hasSalad = selectedDishes.salad !== null; + const hasDrink = selectedDishes.drink !== null; + + if (hasSoup && hasMainCourse && hasSalad && hasDrink) { + return true; + } + + if (hasSoup && hasMainCourse && hasDrink) { + return true; + } + + if (hasSoup && hasSalad && hasDrink) { + return true; + } + + if (hasMainCourse && hasSalad && hasDrink) { + return true; + } + + if (hasMainCourse && hasDrink) { + return true; + } + + return false; +} + +function restoreSelection() { + Object.keys(selectedDishes).forEach(function(category) { + const dish = selectedDishes[category]; + if (dish) { + const card = document.querySelector( + `.dish-card[data-dish="${dish.keyword}"]` + ); + if (card) { + card.classList.add('selected'); + } + } + }); +} + +document.addEventListener('DOMContentLoaded', function() { + console.log('DOM загружен, начинаем инициализацию'); + loadDishes(); + setupFilters(); +}); \ No newline at end of file diff --git a/labs/lab-09/js/order.js b/labs/lab-09/js/order.js new file mode 100644 index 0000000..b1ac0c4 --- /dev/null +++ b/labs/lab-09/js/order.js @@ -0,0 +1,448 @@ +const API_URL = 'https://edu.std-900.ist.mospolytech.ru/labs/api'; +const API_KEY = '358a63a5-52ae-4ab0-800b-90f75ce5a5c2'; + +let dishes = []; +let orderDishes = { + soup: null, + 'main-course': null, + salad: null, + drink: null, + dessert: null +}; + +function loadDishes() { + console.log('Загрузка блюд для страницы заказа...'); + + fetch(API_URL + '/dishes') + .then(function(response) { + console.log('Ответ получен:', response.status); + if (!response.ok) { + throw new Error('Ошибка загрузки данных: ' + response.status); + } + return response.json(); + }) + .then(function(data) { + console.log('Данные загружены:', data.length, 'блюд'); + dishes = data; + loadOrderFromLocalStorage(); + displayOrderDishes(); + updateOrderSummary(); + }) + .catch(function(error) { + console.error('Ошибка при загрузке блюд:', error); + alert('Не удалось загрузить данные о блюдах. Проверьте подключение.'); + }); +} + +function loadOrderFromLocalStorage() { + const savedOrder = localStorage.getItem('selectedDishes'); + + if (!savedOrder) { + console.log('Сохраненный заказ не найден'); + return; + } + + try { + const order = JSON.parse(savedOrder); + console.log('Загружен заказ из localStorage:', order); + + Object.keys(order).forEach(function(category) { + const dishId = order[category]; + const dish = dishes.find(function(d) { + return d.id === dishId; + }); + + if (dish) { + orderDishes[category] = dish; + console.log('Найдено блюдо:', dish.name, 'для категории:', category); + } else { + console.warn('Блюдо с ID', dishId, 'не найдено для категории:', category); + } + }); + } catch (error) { + console.error('Ошибка при загрузке заказа:', error); + } +} + +function displayOrderDishes() { + const orderDishesContainer = document.getElementById('order-dishes'); + const emptyOrderMessage = document.getElementById('empty-order'); + + if (!orderDishesContainer || !emptyOrderMessage) { + console.error('Не найдены контейнеры для отображения заказа'); + return; + } + + const hasAnyDish = Object.values(orderDishes).some(function(dish) { + return dish !== null; + }); + + console.log('Есть блюда для отображения:', hasAnyDish); + + if (!hasAnyDish) { + orderDishesContainer.innerHTML = ''; + emptyOrderMessage.classList.remove('hidden'); + return; + } + + emptyOrderMessage.classList.add('hidden'); + orderDishesContainer.innerHTML = ''; + + Object.keys(orderDishes).forEach(function(category) { + const dish = orderDishes[category]; + if (dish) { + const dishCard = createOrderDishCard(dish); + orderDishesContainer.insertAdjacentHTML('beforeend', dishCard); + } + }); + + addRemoveHandlers(); +} + +function createOrderDishCard(dish) { + return ` +
+ ${dish.name} +

${dish.price} руб.

+

${dish.name}

+

${dish.count}

+ +
+ `; +} + +function addRemoveHandlers() { + const removeButtons = document.querySelectorAll('.remove-dish-btn'); + + removeButtons.forEach(function(button) { + button.addEventListener('click', function(event) { + event.stopPropagation(); + const card = this.closest('.dish-card'); + const dishId = parseInt(card.dataset.dishId); + removeDishFromOrder(dishId); + }); + }); +} + +function removeDishFromOrder(dishId) { + console.log('Удаление блюда с ID:', dishId); + + Object.keys(orderDishes).forEach(function(category) { + if (orderDishes[category] && orderDishes[category].id === dishId) { + orderDishes[category] = null; + } + }); + + saveOrderToLocalStorage(); + displayOrderDishes(); + updateOrderSummary(); +} + +function saveOrderToLocalStorage() { + const order = {}; + + Object.keys(orderDishes).forEach(function(category) { + if (orderDishes[category]) { + order[category] = orderDishes[category].id; + } + }); + + localStorage.setItem('selectedDishes', JSON.stringify(order)); + console.log('Заказ сохранен в localStorage:', order); +} + +function updateOrderSummary() { + const orderSummary = document.getElementById('order-summary'); + + if (!orderSummary) { + console.error('Не найден контейнер для сводки заказа'); + return; + } + + const hasSelection = Object.values(orderDishes).some(function(dish) { + return dish !== null; + }); + + if (!hasSelection) { + orderSummary.innerHTML = + '

Ничего не выбрано

'; + return; + } + + let summaryHTML = ''; + let totalPrice = 0; + + if (orderDishes.soup) { + summaryHTML += ` +
+

Суп

+
+ ${orderDishes.soup.name} + ${orderDishes.soup.price} руб. +
+
+ `; + totalPrice += orderDishes.soup.price; + } else { + summaryHTML += ` +
+

Суп

+

Блюдо не выбрано

+
+ `; + } + + if (orderDishes['main-course']) { + summaryHTML += ` +
+

Главное блюдо

+
+ ${orderDishes['main-course'].name} + ${orderDishes['main-course'].price} руб. +
+
+ `; + totalPrice += orderDishes['main-course'].price; + } else { + summaryHTML += ` +
+

Главное блюдо

+

Блюдо не выбрано

+
+ `; + } + + if (orderDishes.salad) { + summaryHTML += ` +
+

Салат

+
+ ${orderDishes.salad.name} + ${orderDishes.salad.price} руб. +
+
+ `; + totalPrice += orderDishes.salad.price; + } else { + summaryHTML += ` +
+

Салат

+

Блюдо не выбрано

+
+ `; + } + + if (orderDishes.drink) { + summaryHTML += ` +
+

Напиток

+
+ ${orderDishes.drink.name} + ${orderDishes.drink.price} руб. +
+
+ `; + totalPrice += orderDishes.drink.price; + } else { + summaryHTML += ` +
+

Напиток

+

Напиток не выбран

+
+ `; + } + + if (orderDishes.dessert) { + summaryHTML += ` +
+

Десерт

+
+ ${orderDishes.dessert.name} + ${orderDishes.dessert.price} руб. +
+
+ `; + totalPrice += orderDishes.dessert.price; + } else { + summaryHTML += ` +
+

Десерт

+

Десерт не выбран

+
+ `; + } + + summaryHTML += ` +
+

Стоимость заказа

+

${totalPrice} руб.

+
+ `; + + orderSummary.innerHTML = summaryHTML; +} + +function isValidCombo() { + const hasSoup = orderDishes.soup !== null; + const hasMainCourse = orderDishes['main-course'] !== null; + const hasSalad = orderDishes.salad !== null; + const hasDrink = orderDishes.drink !== null; + + if (hasSoup && hasMainCourse && hasSalad && hasDrink) { + return true; + } + + if (hasSoup && hasMainCourse && hasDrink) { + return true; + } + + if (hasSoup && hasSalad && hasDrink) { + return true; + } + + if (hasMainCourse && hasSalad && hasDrink) { + return true; + } + + if (hasMainCourse && hasDrink) { + return true; + } + + return false; +} + +function getValidationMessage() { + const hasSoup = orderDishes.soup !== null; + const hasMainCourse = orderDishes['main-course'] !== null; + const hasSalad = orderDishes.salad !== null; + const hasDrink = orderDishes.drink !== null; + + if (!hasSoup && !hasMainCourse && !hasSalad && !hasDrink) { + return 'Ничего не выбрано. Выберите блюда для заказа'; + } + + if (!hasDrink) { + return 'Выберите напиток'; + } + + if (hasSoup && !hasMainCourse && !hasSalad) { + return 'Выберите главное блюдо/салат/стартер'; + } + + if (hasSalad && !hasSoup && !hasMainCourse) { + return 'Выберите суп или главное блюдо'; + } + + if (!hasMainCourse && !hasSoup && (hasDrink || orderDishes.dessert)) { + return 'Выберите главное блюдо'; + } + + return ''; +} + +function setupFormSubmission() { + const form = document.getElementById('order-form'); + + if (!form) { + console.error('Форма заказа не найдена'); + return; + } + + form.addEventListener('submit', function(event) { + event.preventDefault(); + + console.log('Отправка формы заказа'); + + if (!isValidCombo()) { + const message = getValidationMessage(); + alert(message); + return; + } + + const formData = new FormData(form); + const orderData = { + full_name: formData.get('full_name'), + email: formData.get('email'), + subscribe: formData.get('subscribe') === '1' ? 1 : 0, + phone: formData.get('phone'), + delivery_address: formData.get('delivery_address'), + delivery_type: formData.get('delivery_type'), + delivery_time: formData.get('delivery_time') || '', + comment: formData.get('comment') || '' + }; + + if (orderDishes.soup) { + orderData.soup_id = orderDishes.soup.id; + } + if (orderDishes['main-course']) { + orderData.main_course_id = orderDishes['main-course'].id; + } + if (orderDishes.salad) { + orderData.salad_id = orderDishes.salad.id; + } + if (orderDishes.drink) { + orderData.drink_id = orderDishes.drink.id; + } + if (orderDishes.dessert) { + orderData.dessert_id = orderDishes.dessert.id; + } + + console.log('Данные заказа:', orderData); + sendOrder(orderData); + }); +} + +function sendOrder(orderData) { + const url = API_URL + '/orders?api_key=' + API_KEY; + + console.log('Отправка заказа на сервер:', url); + + fetch(url, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(orderData) + }) + .then(function(response) { + console.log('Ответ от сервера:', response.status); + if (!response.ok) { + return response.json().then(function(errorData) { + throw new Error(errorData.error || + 'Ошибка при оформлении заказа'); + }); + } + return response.json(); + }) + .then(function(data) { + console.log('Заказ успешно создан:', data); + alert('Заказ успешно оформлен! Номер заказа: ' + data.id); + localStorage.removeItem('selectedDishes'); + window.location.href = '../templates/orders.html'; + }) + .catch(function(error) { + console.error('Ошибка при отправке заказа:', error); + alert('Не удалось оформить заказ: ' + error.message); + }); +} + +function setupResetButton() { + const resetButton = document.getElementById('reset-button'); + + if (!resetButton) { + console.error('Кнопка сброса не найдена'); + return; + } + + resetButton.addEventListener('click', function() { + const form = document.getElementById('order-form'); + form.reset(); + }); +} + +document.addEventListener('DOMContentLoaded', function() { + console.log('DOM загружен для страницы заказа'); + loadDishes(); + setupFormSubmission(); + setupResetButton(); +}); \ No newline at end of file diff --git a/labs/lab-09/js/orders.js b/labs/lab-09/js/orders.js new file mode 100644 index 0000000..242e40e --- /dev/null +++ b/labs/lab-09/js/orders.js @@ -0,0 +1,584 @@ +const API_URL = 'https://edu.std-900.ist.mospolytech.ru/labs/api'; +const API_KEY = '358a63a5-52ae-4ab0-800b-90f75ce5a5c2'; + +let orders = []; +let dishes = []; +let currentOrderId = null; + +function loadOrders() { + console.log('Загрузка заказов...'); + + const url = API_URL + '/orders?api_key=' + API_KEY; + + fetch(url) + .then(function(response) { + console.log('Ответ получен:', response.status); + if (!response.ok) { + throw new Error('Ошибка загрузки заказов: ' + response.status); + } + return response.json(); + }) + .then(function(data) { + console.log('Заказы загружены:', data.length); + orders = data; + sortOrders(); + return loadDishes(); + }) + .then(function() { + displayOrders(); + }) + .catch(function(error) { + console.error('Ошибка при загрузке заказов:', error); + showNotification('Не удалось загрузить заказы: ' + error.message, + 'error'); + }); +} + +function loadDishes() { + console.log('Загрузка блюд...'); + + return fetch(API_URL + '/dishes') + .then(function(response) { + if (!response.ok) { + throw new Error('Ошибка загрузки блюд'); + } + return response.json(); + }) + .then(function(data) { + console.log('Блюда загружены:', data.length); + dishes = data; + }); +} + +function sortOrders() { + orders.sort(function(a, b) { + const dateA = new Date(a.created_at); + const dateB = new Date(b.created_at); + return dateB - dateA; + }); +} + +function displayOrders() { + const ordersList = document.getElementById('orders-list'); + const emptyOrders = document.getElementById('empty-orders'); + + if (!ordersList || !emptyOrders) { + console.error('Не найдены контейнеры для отображения заказов'); + return; + } + + if (orders.length === 0) { + ordersList.innerHTML = ''; + emptyOrders.classList.remove('hidden'); + return; + } + + emptyOrders.classList.add('hidden'); + ordersList.innerHTML = ''; + + orders.forEach(function(order, index) { + const orderCard = createOrderCard(order, index + 1); + ordersList.insertAdjacentHTML('beforeend', orderCard); + }); + + addOrderActionHandlers(); +} + +function createOrderCard(order, number) { + const date = formatDate(order.created_at); + const composition = getOrderComposition(order); + const price = calculateOrderPrice(order); + const deliveryTime = getDeliveryTime(order); + + return ` +
+
+ Заказ №${number} + ${date} +
+
+
+

Состав: ${composition}

+

Стоимость: ${price} руб.

+

Доставка: ${deliveryTime}

+
+
+ +
+ `; +} + +function formatDate(dateString) { + const date = new Date(dateString); + const day = String(date.getDate()).padStart(2, '0'); + const month = String(date.getMonth() + 1).padStart(2, '0'); + const year = date.getFullYear(); + return day + '.' + month + '.' + year; +} + +function formatDateTime(dateString) { + const date = new Date(dateString); + const day = String(date.getDate()).padStart(2, '0'); + const month = String(date.getMonth() + 1).padStart(2, '0'); + const year = date.getFullYear(); + const hours = String(date.getHours()).padStart(2, '0'); + const minutes = String(date.getMinutes()).padStart(2, '0'); + return day + '.' + month + '.' + year + ' ' + hours + ':' + minutes; +} + +function getOrderComposition(order) { + const dishNames = []; + + if (order.soup_id) { + const dish = dishes.find(function(d) { + return d.id === order.soup_id; + }); + if (dish) { + dishNames.push(dish.name); + } + } + + if (order.main_course_id) { + const dish = dishes.find(function(d) { + return d.id === order.main_course_id; + }); + if (dish) { + dishNames.push(dish.name); + } + } + + if (order.salad_id) { + const dish = dishes.find(function(d) { + return d.id === order.salad_id; + }); + if (dish) { + dishNames.push(dish.name); + } + } + + if (order.drink_id) { + const dish = dishes.find(function(d) { + return d.id === order.drink_id; + }); + if (dish) { + dishNames.push(dish.name); + } + } + + if (order.dessert_id) { + const dish = dishes.find(function(d) { + return d.id === order.dessert_id; + }); + if (dish) { + dishNames.push(dish.name); + } + } + + return dishNames.join(', '); +} + +function calculateOrderPrice(order) { + let total = 0; + + if (order.soup_id) { + const dish = dishes.find(function(d) { + return d.id === order.soup_id; + }); + if (dish) { + total += dish.price; + } + } + + if (order.main_course_id) { + const dish = dishes.find(function(d) { + return d.id === order.main_course_id; + }); + if (dish) { + total += dish.price; + } + } + + if (order.salad_id) { + const dish = dishes.find(function(d) { + return d.id === order.salad_id; + }); + if (dish) { + total += dish.price; + } + } + + if (order.drink_id) { + const dish = dishes.find(function(d) { + return d.id === order.drink_id; + }); + if (dish) { + total += dish.price; + } + } + + if (order.dessert_id) { + const dish = dishes.find(function(d) { + return d.id === order.dessert_id; + }); + if (dish) { + total += dish.price; + } + } + + return total; +} + +function getDeliveryTime(order) { + if (order.delivery_type === 'by_time') { + return order.delivery_time; + } + return 'Как можно скорее (с 7:00 до 23:00)'; +} + +function addOrderActionHandlers() { + const buttons = document.querySelectorAll('.order-btn'); + + buttons.forEach(function(button) { + button.addEventListener('click', function() { + const action = this.dataset.action; + const card = this.closest('.order-card'); + const orderId = parseInt(card.dataset.orderId); + + const order = orders.find(function(o) { + return o.id === orderId; + }); + + if (!order) { + console.error('Заказ не найден'); + return; + } + + if (action === 'view') { + showViewModal(order); + } else if (action === 'edit') { + showEditModal(order); + } else if (action === 'delete') { + showDeleteModal(order); + } + }); + }); +} + +function showViewModal(order) { + const modal = document.getElementById('view-modal'); + + if (!modal) { + return; + } + + const dateTime = formatDateTime(order.created_at); + const deliveryTime = getDeliveryTime(order); + + document.getElementById('view-date').textContent = dateTime; + document.getElementById('view-name').textContent = order.full_name; + document.getElementById('view-address').textContent = + order.delivery_address; + document.getElementById('view-time').textContent = deliveryTime; + document.getElementById('view-phone').textContent = order.phone; + document.getElementById('view-email').textContent = order.email; + + const commentSection = document.getElementById('view-comment-section'); + const commentElement = document.getElementById('view-comment'); + if (order.comment && order.comment.trim() !== '') { + commentSection.style.display = 'block'; + commentElement.textContent = order.comment; + } else { + commentSection.style.display = 'none'; + } + + const itemsContainer = document.getElementById('view-items'); + itemsContainer.innerHTML = ''; + + const orderItems = getOrderItems(order); + orderItems.forEach(function(item) { + const itemHTML = ` + + `; + itemsContainer.insertAdjacentHTML('beforeend', itemHTML); + }); + + const total = calculateOrderPrice(order); + document.getElementById('view-total').textContent = total + 'Р'; + + modal.classList.remove('hidden'); +} + +function showEditModal(order) { + const modal = document.getElementById('edit-modal'); + + if (!modal) { + return; + } + + currentOrderId = order.id; + + const dateTime = formatDateTime(order.created_at); + document.getElementById('edit-created-date').textContent = dateTime; + + document.getElementById('edit-name').value = order.full_name; + document.getElementById('edit-email').value = order.email; + document.getElementById('edit-phone').value = order.phone; + document.getElementById('edit-address').value = order.delivery_address; + document.getElementById('edit-time').value = order.delivery_time || ''; + document.getElementById('edit-comment').value = order.comment || ''; + + const itemsContainer = document.getElementById('edit-items'); + itemsContainer.innerHTML = ''; + + const orderItems = getOrderItems(order); + orderItems.forEach(function(item) { + const itemHTML = ` + + `; + itemsContainer.insertAdjacentHTML('beforeend', itemHTML); + }); + + const total = calculateOrderPrice(order); + document.getElementById('edit-total').textContent = total + 'Р'; + + modal.classList.remove('hidden'); +} + +function showDeleteModal(order) { + const modal = document.getElementById('delete-modal'); + + if (!modal) { + return; + } + + currentOrderId = order.id; + modal.classList.remove('hidden'); +} + +function getOrderItems(order) { + const items = []; + + if (order.main_course_id) { + const dish = dishes.find(function(d) { + return d.id === order.main_course_id; + }); + if (dish) { + items.push({ + label: 'Основное блюдо', + name: dish.name, + price: dish.price + }); + } + } + + if (order.drink_id) { + const dish = dishes.find(function(d) { + return d.id === order.drink_id; + }); + if (dish) { + items.push({ + label: 'Напиток', + name: dish.name, + price: dish.price + }); + } + } + + if (order.dessert_id) { + const dish = dishes.find(function(d) { + return d.id === order.dessert_id; + }); + if (dish) { + items.push({ + label: 'Десерт', + name: dish.name, + price: dish.price + }); + } + } + + return items; +} + +function closeModal(modalId) { + const modal = document.getElementById(modalId); + if (modal) { + modal.classList.add('hidden'); + } + currentOrderId = null; +} + +function setupModalHandlers() { + const closeButtons = document.querySelectorAll('.modal-close'); + closeButtons.forEach(function(button) { + button.addEventListener('click', function() { + const modal = this.closest('.modal'); + if (modal) { + modal.classList.add('hidden'); + } + currentOrderId = null; + }); + }); + + const viewOkButton = document.getElementById('view-modal-ok'); + if (viewOkButton) { + viewOkButton.addEventListener('click', function() { + closeModal('view-modal'); + }); + } + + const editCancelButton = document.getElementById('edit-modal-cancel'); + if (editCancelButton) { + editCancelButton.addEventListener('click', function() { + closeModal('edit-modal'); + }); + } + + const editSaveButton = document.getElementById('edit-modal-save'); + if (editSaveButton) { + editSaveButton.addEventListener('click', function() { + saveOrderEdit(); + }); + } + + const deleteCancelButton = document.getElementById('delete-modal-cancel'); + if (deleteCancelButton) { + deleteCancelButton.addEventListener('click', function() { + closeModal('delete-modal'); + }); + } + + const deleteConfirmButton = + document.getElementById('delete-modal-confirm'); + if (deleteConfirmButton) { + deleteConfirmButton.addEventListener('click', function() { + deleteOrder(); + }); + } + + const modals = document.querySelectorAll('.modal'); + modals.forEach(function(modal) { + modal.addEventListener('click', function(event) { + if (event.target === modal) { + modal.classList.add('hidden'); + currentOrderId = null; + } + }); + }); +} + +function saveOrderEdit() { + const form = document.getElementById('edit-form'); + + if (!form.checkValidity()) { + form.reportValidity(); + return; + } + + const formData = new FormData(form); + const updateData = { + full_name: formData.get('full_name'), + email: formData.get('email'), + phone: formData.get('phone'), + delivery_address: formData.get('delivery_address'), + delivery_type: formData.get('delivery_time') ? 'by_time' : 'now', + delivery_time: formData.get('delivery_time') || '', + comment: formData.get('comment') || '' + }; + + const url = API_URL + '/orders/' + currentOrderId + '?api_key=' + API_KEY; + + console.log('Отправка изменений заказа:', updateData); + + fetch(url, { + method: 'PUT', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(updateData) + }) + .then(function(response) { + console.log('Ответ от сервера:', response.status); + if (!response.ok) { + return response.json().then(function(errorData) { + throw new Error(errorData.error || + 'Ошибка при редактировании заказа'); + }); + } + return response.json(); + }) + .then(function(data) { + console.log('Заказ успешно изменен:', data); + closeModal('edit-modal'); + showNotification('Заказ успешно изменён', 'success'); + loadOrders(); + }) + .catch(function(error) { + console.error('Ошибка при редактировании заказа:', error); + showNotification('Не удалось изменить заказ: ' + error.message, + 'error'); + }); +} + +function deleteOrder() { + const url = API_URL + '/orders/' + currentOrderId + '?api_key=' + API_KEY; + + console.log('Удаление заказа:', currentOrderId); + + fetch(url, { + method: 'DELETE' + }) + .then(function(response) { + console.log('Ответ от сервера:', response.status); + if (!response.ok) { + return response.json().then(function(errorData) { + throw new Error(errorData.error || + 'Ошибка при удалении заказа'); + }); + } + return response.json(); + }) + .then(function(data) { + console.log('Заказ успешно удален:', data); + closeModal('delete-modal'); + showNotification('Заказ успешно удалён', 'success'); + loadOrders(); + }) + .catch(function(error) { + console.error('Ошибка при удалении заказа:', error); + showNotification('Не удалось удалить заказ: ' + error.message, + 'error'); + }); +} + +function showNotification(message, type) { + const notification = document.getElementById('notification'); + + if (!notification) { + return; + } + + notification.textContent = message; + notification.className = 'notification notification-' + type; + notification.classList.remove('hidden'); + + setTimeout(function() { + notification.classList.add('hidden'); + }, 3000); +} + +document.addEventListener('DOMContentLoaded', function() { + console.log('DOM загружен для страницы заказов'); + setupModalHandlers(); + loadOrders(); +}); \ No newline at end of file diff --git a/labs/lab-09/other/Вопросы для подготовки к защите ЛР №9.txt b/labs/lab-09/other/Вопросы для подготовки к защите ЛР №9.txt new file mode 100644 index 0000000..48399f8 --- /dev/null +++ b/labs/lab-09/other/Вопросы для подготовки к защите ЛР №9.txt @@ -0,0 +1,16 @@ +Модальные окна +1. Что такое модальное окно? В каких случаях оно используется? +2. Какие способы создания модальных окон вы знаете? Приведите примеры. +3. Каковы преимущества использования модального окна перед другими элементами интерфейса? +4. Назовите основные элементы структуры HTML-кода для реализации модального окна. +5. Как реализовать закрытие модального окна при нажатии на кнопку или за пределами самого окна? +6. Как сделать так, чтобы при открытии модального окна основной контент страницы затемнялся? +7. Какие стили CSS используются для позиционирования модального окна на странице? +8. Как предотвратить скроллинг основного контента страницы при открытом модальном окне? + +Взаимодействие клиента и сервера +1. Опишите процесс обработки ошибок на сервере и отправку сообщений об ошибках клиенту. Какие коды состояния HTTP обычно используются для различных типов ошибок? +2. Что такое CORS (Cross-Origin Resource Sharing)? Для чего нужен этот механизм и как он реализуется на практике? +3. Почему важно учитывать производительность и оптимизацию запросов при взаимодействии клиента с сервером? Приведите примеры способов повышения эффективности взаимодействия. +4. Как можно организовать кэширование данных на стороне клиента и сервера? В чем преимущество использования кэширования и какие инструменты можно применять для этого? +5. Чем отличается статическое содержимое от динамически генерируемого содержимого на сервере? Приведите примеры задач, требующих генерации динамических страниц. \ No newline at end of file diff --git a/labs/lab-09/other/Задание - Лабораторная работа 9.md b/labs/lab-09/other/Задание - Лабораторная работа 9.md new file mode 100644 index 0000000..1d31797 --- /dev/null +++ b/labs/lab-09/other/Задание - Лабораторная работа 9.md @@ -0,0 +1,75 @@ +# Лабораторная работа № 9. Реализация страницы просмотра и управления оформленными заказами +--- + +Добавьте страницу просмотра истории заказов и реализуйте функции редактирования и удаления заказов. + +## Порядок выполнения + +1. Добавьте страницу "Заказы", разместите ссылку на неё в навигационном меню. Примерный макет страницы приведён ниже. + - На странице должен располагаться список заказов, оформленных ранее текущим пользователем. Сортировка списка – по убыванию даты оформления (т. е. сначала новые заказы). + - Для каждого заказа должны отображаться: порядковый номер в списке, дата оформления заказа, состав заказа (названия блюд, перечисленные через запятую), стоимость заказа, время доставки (для заказов ко времени, для остальных – подпись "Как можно скорее (с 7:00 до 23:00)"), кнопки "Подробнее", "Редактирование", "Удаление". + - Вместо кнопок можно использовать иконки (например, [Bootstrap Icons](https://icons.getbootstrap.com/)). + +2. Реализуйте функциональность кнопок "Подробнее", "Редактирование", "Удаление". + - По нажатию на кнопку "Подробнее" должно открываться модальное окно с полной информацией о заказе (см. макет ниже). + - По нажатию на кнопку "Редактирование" должно открываться модальное окно с формой редактирования заказа (см. макет ниже). Значения полей формы должны быть установлены значениями соответствующих полей редактируемого заказа. Для редактирования доступны поля full_name, email, phone, delivery_address, delivery_type, delivery_time, comment. + - По нажатию на кнопку "Удаление" должно открываться модальное окно подтверждения удаления (см. макет ниже). + - В правом верхнем углу каждого модального окна должен быть "крестик", по нажатию на который модальное окно закрывается. Внизу модального окна должны располагаться кнопки действий: для просмотра – "Ок" (закрытие окна), для редактирования – "Сохранить" (отправка данных на сервер) и "Отмена" (закрытие окна), для удаления – "Да" (отправка запроса на сервер) и "Отмена" (закрытие окна). + - При возникновении ошибок при отправке запроса или его обработке на стороне сервера пользователю должно быть отображено уведомление об ошибке. В случае успешного выполнения операции (редактирования, удаления), модальное окно должно быть скрыто, и пользователю должно быть отображено уведомление об успешном завершении операции (например, "Заказ успешно изменён"). Формат отображения уведомлений на усмотрение студента. + - При успешном изменении или удалении заказа список заказов должен быть обновлён (т. е. удалённый заказ должен быть убран из списка, а информация об изменившемся заказе должна быть обновлена). + +## Инструкция по работе с API + +Для получения доступа к API необходимо пройти процедуру авторизации. Для авторизации нужно указать в качестве параметра запроса api_key значение уникального ключа, который выдаётся каждому пользователю. Ключ представляет собой идентификатор UUIDv4, который является случайным 16-байтным номером (например, 123e4567-e89b-12d3-a456-426655440000). + +**Обратите внимание, что параметр api_key всегда передаётся в строке запроса.** + +Пользователь может просматривать, редактировать и удалять только свои заказы. В один момент времени в базе данных может быть не более 10 заказов, созданных одним и тем же пользователем. + +Если пользователь попробует совершить действие, не пройдя авторизацию, в качестве ответа на его запрос придёт сообщение: + +{"error": "Для получения доступа к API необходимо пройти процедуру авторизации. Для этого нужно передать в запросе персональный API Key."} + +При передаче параметров в POST- и PUT-запросах данные должны передаваться в теле запроса в формате application/json (нужно вручную сериализовать данные и установить значение заголовка Content-Type) или multipart/form-data (достаточно при отправке данных формы воспользоваться объектом FormData). + +При оформлении заказа в запросе к серверу должны быть указаны значения обязательных полей: + +|Название|Тип|Обязательное|Только для чтения|Примечание| +|---|---|---|---|---| +|id|Integer||Да|Устанавливается сервером.| +|full_name|String|Да||| +|email|String|Да|| +|subscribe|Boolean|Нет||Допустимы значения 0 и 1.| +|phone|String|Да||| +|delivery_address|String|Да||| +|delivery_type|String|Да||Допустимы значения "now" и "by_time".| +|delivery_time|Time|Нет||Значение передаётся в формате HH:MM.
Доступное время доставки: с 7:00 до 23:00 с шагом 5 минут.
Не должно быть пустым, если delivery_type=by_time.
Не должно быть раньше текущего времени.| +|comment|String|Нет||| +|soup_id|Integer|Нет||Обязательность поля зависит от состава комбо.| +|main_course_id|Integer|Нет||Обязательность поля зависит от состава комбо.| +|salad_id|Integer|Нет||Обязательность поля зависит от состава комбо.| +|drink_id|Integer|Да||| +|dessert_id|Integer|Нет||| +|created_at|DateTime||Да|Устанавливается сервером.| +|updated_at|DateTime||Да|Устанавливается сервером.| +|student_id|Integer||Да|Устанавливается сервером.| + +Доступные пользователю действия представлены в таблице: + +|Действие|Метод и путь|Формат ответа|Примечание| +|---|---|---|---| +|Получить данные всех блюд|GET /labs/api/dishes|JSON [{item1},{item2},...{itemN}]|| +|Получить данные конкретного блюда|GET /labs/api/dishes/{int:dish_id}|JSON {Item}|Вместо {int:dish_id} нужно подставить целое число – идентификатор блюда.| +|Получить данные всех заказов|GET /labs/api/orders|JSON [{item1},{item2},...{itemN}]|| +|Получить данные конкретного заказа|GET /labs/api/orders/{int:order_id}|JSON {Item}|Вместо {int:order_id} нужно подставить целое число – идентификатор заказа.| +|Создать новый заказ|POST /labs/api/orders|JSON {newItem}|Нужно передать значения всех обязательных полей.| +|Изменить заказ|PUT /labs/api/orders/{int:order_id}|JSON {updateItem}|Вместо {int:order_id} нужно подставить целое число – идентификатор заказа.
Достаточно передать только значения изменившихся полей.| +|Удалить заказ|DELETE /labs/api/orders/{int:order_id}|JSON {Item}|Вместо {int:order_id} нужно подставить целое число – идентификатор заказа.| + +### Материалы для изучения +[Что такое модальные окна [SkillBox]](https://skillbox.ru/media/code/chto-takoe-modalnye-okna-i-kak-ikh-effektivno-ispolzovat/) +[Попап [Doka]](https://doka.guide/recipes/popup/) +[Fetch [Learn JS]](https://learn.javascript.ru/fetch) +[Fetch API [MDN]](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) +[fetch() [Doka]](https://doka.guide/js/fetch/) +[Cross-Origin Resource Sharing (CORS) [MDN]](https://developer.mozilla.org/ru/docs/Web/HTTP/CORS) \ No newline at end of file diff --git a/labs/lab-09/styles/menu.css b/labs/lab-09/styles/menu.css new file mode 100644 index 0000000..8e05438 --- /dev/null +++ b/labs/lab-09/styles/menu.css @@ -0,0 +1,298 @@ +.combo-section { + margin-bottom: 50px; +} + +.combo-grid { + display: grid; + grid-template-columns: 1fr 1fr 1fr; + gap: 20px; + margin-bottom: 20px; +} + +.combo-card { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + gap: 20px; + background-color: white; + padding: 20px; + border-radius: 15px; +} + +.combo-dessert { + flex-direction: column; + gap: 10px; +} + +.combo-item { + display: flex; + flex-direction: column; + align-items: center; +} + +.combo-icon { + font-size: 50px; + display: block; + margin: 0 0 8px 0; + transition: transform 0.3s; +} + +.combo-item:hover .combo-icon { + transform: translateY(-5px) scale(1.1); +} + +.combo-item p { + margin: 0; + font-size: 14px; + text-align: center; +} + +.combo-note-inline { + font-size: 12px; + text-align: center; + color: #666; + margin: 0; + font-style: italic; +} + +.combo-note { + font-size: 14px; + color: #666; + font-style: italic; + text-align: center; + margin: 10px 0 0 0; +} + +.section-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 20px; + flex-wrap: wrap; + gap: 15px; +} + +.section-header h2 { + margin: 0; +} + +.filter-buttons { + display: flex; + gap: 10px; + flex-wrap: wrap; +} + +.filter-btn { + background-color: white; + border: 2px solid #2d5016; + color: #2d5016; + padding: 10px 20px; + border-radius: 10px; + cursor: pointer; + font-family: 'Montserrat', sans-serif; + font-size: 16px; + font-weight: 600; + transition: all 0.3s; +} + +.filter-btn:hover { + background-color: #f1eee9; +} + +.filter-btn.active { + background-color: #2d5016; + color: white; +} + +.dishes-grid { + display: grid; + grid-template-columns: 1fr 1fr 1fr; + gap: 10px; +} + +.dish-card { + display: flex; + flex-direction: column; + padding: 30px 40px; + border-radius: 35px; + cursor: pointer; + filter: drop-shadow(17px 19px 24px rgba(0, 0, 0, 0.13)); + background-color: white; +} + +.dish-card.selected { + border: 3px solid #2d5016; + background-color: #f0f7ec; +} + +.dish-card.selected button { + background-color: #2d5016; + color: white; +} + +.dish-card:hover { + border: 2px solid tomato; +} + +.dish-card:hover button { + background-color: tomato; + color: white; +} + +.dish-card img { + width: 100%; + height: auto; + aspect-ratio: 12 / 9; + object-fit: cover; + border-radius: 35px; + margin: 0 0 15px 0; +} + +.dish-price { + font-size: 20px; + font-weight: 600; + margin: 0 0 10px 0; +} + +.dish-name { + font-size: 18px; + font-weight: 600; + margin: 0 0 10px 0; +} + +.dish-weight { + color: #888; + margin: 0 0 10px 0; + margin-top: auto; +} + +.dish-card button { + background-color: #f1eee9; + border: none; + padding: 10px 30px; + border-radius: 10px; + cursor: pointer; + font-family: 'Montserrat', sans-serif; + font-size: 16px; + margin-top: 10px; +} + +.remove-dish-btn { + background-color: tomato; + color: white; +} + +.remove-dish-btn:hover { + background-color: #ff4500; +} + +.order-panel { + position: sticky; + bottom: 20px; + background-color: white; + padding: 20px 40px; + margin: 0 auto; + max-width: 1200px; + border-radius: 15px; + box-shadow: 0 5px 20px rgba(0, 0, 0, 0.2); + z-index: 100; +} + +.order-panel.hidden { + display: none; +} + +.order-panel-content { + display: flex; + justify-content: space-between; + align-items: center; + gap: 20px; +} + +.order-panel-info { + display: flex; + align-items: center; + gap: 15px; +} + +.order-panel-label { + font-size: 18px; + font-weight: 600; + margin: 0; +} + +.order-panel-price { + font-size: 24px; + font-weight: 700; + color: #2d5016; + margin: 0; +} + +.order-panel-button { + background-color: #2d5016; + color: white; + text-decoration: none; + padding: 15px 40px; + border-radius: 10px; + font-family: 'Montserrat', sans-serif; + font-size: 16px; + font-weight: 600; + transition: all 0.3s; +} + +.order-panel-button:hover { + background-color: #3d6020; +} + +.order-panel-button.disabled { + background-color: #ccc; + color: #888; + cursor: not-allowed; + pointer-events: none; +} + +@media (max-width: 800px) { + .combo-grid { + grid-template-columns: 1fr 1fr; + } + + .dishes-grid { + grid-template-columns: 1fr 1fr; + } + + nav { + justify-content: space-between; + } + + .about-company img { + width: 500px; + } + + .order-panel-content { + flex-direction: column; + } +} + +@media (max-width: 600px) { + .combo-grid { + grid-template-columns: 1fr; + } + + .dishes-grid { + grid-template-columns: 1fr; + } + + .order-panel { + padding: 15px 20px; + } + + .order-panel-content { + flex-direction: column; + align-items: stretch; + } + + .order-panel-button { + text-align: center; + } +} \ No newline at end of file diff --git a/labs/lab-09/styles/order.css b/labs/lab-09/styles/order.css new file mode 100644 index 0000000..aed29b7 --- /dev/null +++ b/labs/lab-09/styles/order.css @@ -0,0 +1,266 @@ +.empty-order-message { + text-align: center; + padding: 40px 20px; +} + +.empty-order-message.hidden { + display: none; +} + +.empty-order-message p { + font-size: 18px; + color: #666; +} + +.empty-order-message a { + color: #2d5016; + text-decoration: underline; +} + +.order-form { + margin: 0 auto; + padding: 40px 60px; + max-width: 1200px; + background-color: white; +} + +.order-form h2 { + text-align: center; + margin-bottom: 30px; +} + +#order-summary { + background-color: #f9f9f9; + padding: 30px; + border-radius: 10px; + margin-bottom: 20px; +} + +.empty-order { + text-align: center; + color: #888; + font-size: 18px; +} + +.order-category { + margin-bottom: 25px; +} + +.order-category h3 { + font-size: 20px; + color: #2d5016; + margin: 0 0 10px 0; +} + +.order-item { + display: flex; + justify-content: space-between; + padding: 10px 0; + font-size: 16px; +} + +.order-item span:first-child { + font-weight: 600; + word-wrap: break-word; + overflow-wrap: break-word; + max-width: 70%; +} + +.order-item span:last-child { + color: #2d5016; + font-weight: 600; + white-space: nowrap; +} + +.not-selected { + color: #888; + font-style: italic; + margin: 5px 0; +} + +.order-total { + margin-top: 30px; + padding-top: 20px; + border-top: 2px solid #2d5016; +} + +.order-total h3 { + font-size: 22px; + color: #2d5016; + margin: 0 0 10px 0; +} + +.total-price { + font-size: 24px; + font-weight: 700; + color: #2d5016; + margin: 0; +} + +.form-container { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 40px; +} + +.order-section { + display: flex; + flex-direction: column; +} + +.order-section h3 { + font-size: 22px; + color: #2d5016; + margin: 0 0 20px 0; +} + +.customer-section { + display: flex; + flex-direction: column; +} + +.customer-section h3 { + font-size: 22px; + color: #2d5016; + margin: 0 0 20px 0; +} + +.order-form label { + font-size: 16px; + color: #333; + margin: 0 0 8px 0; + font-weight: 600; +} + +.order-form select, +.order-form input[type="text"], +.order-form input[type="email"], +.order-form input[type="tel"], +.order-form input[type="time"], +.order-form textarea { + width: 100%; + padding: 12px 15px; + margin: 0 0 20px 0; + border: 1px solid #ddd; + border-radius: 8px; + font-family: 'Montserrat', sans-serif; + font-size: 15px; +} + +.order-form select { + cursor: pointer; + background-color: white; +} + +.order-form textarea { + height: 100px; + resize: vertical; +} + +.checkbox-group { + display: flex; + align-items: center; + margin: 0 0 20px 0; +} + +.checkbox-group input[type="checkbox"] { + width: 18px; + height: 18px; + margin: 0 10px 0 0; + cursor: pointer; +} + +.checkbox-group label { + margin: 0; + font-weight: 400; + cursor: pointer; +} + +.radio-group { + margin: 0 0 20px 0; +} + +.radio-group > label { + display: block; + margin-bottom: 10px; +} + +.radio-group > div { + display: flex; + align-items: center; + margin: 0 0 8px 0; +} + +.radio-group input[type="radio"] { + width: 18px; + height: 18px; + margin: 0 10px 0 0; + cursor: pointer; +} + +.radio-group input[type="radio"] + label { + margin: 0; + font-weight: 400; + cursor: pointer; +} + +.form-buttons { + display: flex; + gap: 15px; + margin-top: 10px; +} + +.form-buttons button { + flex: 1; + padding: 15px 30px; + border: none; + border-radius: 10px; + font-family: 'Montserrat', sans-serif; + font-size: 16px; + font-weight: 600; + cursor: pointer; + transition: background-color 0.3s; +} + +.form-buttons button[type="button"] { + background-color: #f1eee9; + color: #333; +} + +.form-buttons button[type="button"]:hover { + background-color: #e0ddd8; +} + +.form-buttons button[type="submit"] { + background-color: #2d5016; + color: white; +} + +.form-buttons button[type="submit"]:hover { + background-color: #3d6020; +} + +.form-hint { + display: block; + font-size: 13px; + color: #666; + margin: -15px 0 20px 0; + line-height: 1.4; +} + +@media (max-width: 800px) { + .form-container { + grid-template-columns: 1fr; + gap: 20px; + } +} + +@media (max-width: 600px) { + .form-container { + grid-template-columns: 1fr; + } + + .form-buttons { + flex-direction: column; + } +} \ No newline at end of file diff --git a/labs/lab-09/styles/orders.css b/labs/lab-09/styles/orders.css new file mode 100644 index 0000000..6e88dbc --- /dev/null +++ b/labs/lab-09/styles/orders.css @@ -0,0 +1,414 @@ +.orders-list { + display: flex; + flex-direction: column; + gap: 20px; +} + +.empty-orders-message { + text-align: center; + padding: 60px 20px; +} + +.empty-orders-message.hidden { + display: none; +} + +.empty-orders-message p { + font-size: 18px; + color: #666; + line-height: 1.6; +} + +.empty-orders-message a { + color: #2d5016; + text-decoration: underline; + font-weight: 600; +} + +.order-card { + background-color: white; + border-radius: 15px; + padding: 25px 30px; + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); + transition: box-shadow 0.3s; +} + +.order-card:hover { + box-shadow: 0 4px 15px rgba(0, 0, 0, 0.15); +} + +.order-card-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 15px; + padding-bottom: 15px; + border-bottom: 2px solid #f0f0f0; +} + +.order-number { + font-size: 20px; + font-weight: 700; + color: #2d5016; +} + +.order-date { + font-size: 16px; + color: #666; +} + +.order-card-body { + margin-bottom: 20px; +} + +.order-info p { + margin: 10px 0; + font-size: 16px; + line-height: 1.6; +} + +.order-info strong { + color: #2d5016; +} + +.order-card-footer { + display: flex; + gap: 10px; + flex-wrap: wrap; +} + +.order-btn { + padding: 10px 20px; + border: none; + border-radius: 8px; + font-family: 'Montserrat', sans-serif; + font-size: 14px; + font-weight: 600; + cursor: pointer; + transition: all 0.3s; +} + +.order-btn-view { + background-color: #2d5016; + color: white; +} + +.order-btn-view:hover { + background-color: #3d6020; +} + +.order-btn-edit { + background-color: #f1eee9; + color: #333; +} + +.order-btn-edit:hover { + background-color: #e0ddd8; +} + +.order-btn-delete { + background-color: tomato; + color: white; +} + +.order-btn-delete:hover { + background-color: #ff4500; +} + +.modal { + display: flex; + position: fixed; + z-index: 1000; + left: 0; + top: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.5); + justify-content: center; + align-items: center; +} + +.modal.hidden { + display: none; +} + +.modal-content { + background-color: white; + border-radius: 15px; + max-width: 600px; + width: 90%; + max-height: 90vh; + overflow-y: auto; + box-shadow: 0 5px 30px rgba(0, 0, 0, 0.3); +} + +.modal-content-small { + max-width: 400px; +} + +.modal-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 20px 30px; + border-bottom: 1px solid #e0e0e0; +} + +.modal-header h3 { + margin: 0; + font-size: 20px; + font-weight: 700; + color: #000; +} + +.modal-close { + font-size: 28px; + font-weight: 400; + color: #999; + cursor: pointer; + line-height: 1; + transition: color 0.3s; +} + +.modal-close:hover { + color: #333; +} + +.modal-body { + padding: 20px 30px; +} + +.modal-section { + margin-bottom: 25px; +} + +.modal-section:last-child { + margin-bottom: 0; +} + +.modal-section-title { + font-size: 16px; + font-weight: 700; + color: #000; + margin: 0 0 15px 0; +} + +.modal-label { + font-size: 14px; + color: #666; + display: block; + margin-bottom: 5px; +} + +.modal-value { + font-size: 16px; + color: #000; + display: block; +} + +.modal-info-grid { + display: grid; + grid-template-columns: 1fr; + gap: 12px; +} + +.modal-info-item { + display: flex; + flex-direction: column; + gap: 5px; +} + +.modal-order-items { + display: flex; + flex-direction: column; + gap: 8px; + margin-bottom: 15px; +} + +.modal-order-item { + display: flex; + justify-content: space-between; + font-size: 16px; + color: #000; +} + +.modal-order-item span:first-child { + color: #666; +} + +.modal-total { + display: flex; + justify-content: space-between; + font-size: 16px; + font-weight: 700; + color: #000; + padding-top: 15px; + border-top: 1px solid #e0e0e0; +} + +.modal-delete-text { + font-size: 16px; + color: #000; + text-align: center; + margin: 0; +} + +.modal-body form label { + display: block; + font-size: 14px; + color: #000; + margin: 0 0 8px 0; + font-weight: 400; +} + +.modal-body form input[type="text"], +.modal-body form input[type="email"], +.modal-body form input[type="tel"], +.modal-body form input[type="time"], +.modal-body form textarea { + width: 100%; + padding: 10px 12px; + margin: 0 0 15px 0; + border: 1px solid #ddd; + border-radius: 5px; + font-family: 'Montserrat', sans-serif; + font-size: 15px; +} + +.modal-body form textarea { + resize: vertical; +} + +.modal-footer { + display: flex; + justify-content: flex-end; + gap: 10px; + padding: 20px 30px; + border-top: 1px solid #e0e0e0; +} + +.modal-btn { + padding: 10px 30px; + border: none; + border-radius: 5px; + font-family: 'Montserrat', sans-serif; + font-size: 14px; + font-weight: 600; + cursor: pointer; + transition: all 0.3s; + min-width: 100px; +} + +.modal-btn-ok { + background-color: #e8e8e8; + color: #000; +} + +.modal-btn-ok:hover { + background-color: #d0d0d0; +} + +.modal-btn-cancel { + background-color: #e8e8e8; + color: #000; +} + +.modal-btn-cancel:hover { + background-color: #d0d0d0; +} + +.modal-btn-save { + background-color: #4caf50; + color: white; +} + +.modal-btn-save:hover { + background-color: #45a049; +} + +.modal-btn-delete { + background-color: #c62828; + color: white; +} + +.modal-btn-delete:hover { + background-color: #b71c1c; +} + +.notification { + position: fixed; + top: 20px; + right: 20px; + padding: 15px 25px; + border-radius: 10px; + font-family: 'Montserrat', sans-serif; + font-size: 16px; + font-weight: 600; + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.2); + z-index: 2000; + animation: slideIn 0.3s ease-out; +} + +.notification.hidden { + display: none; +} + +.notification-success { + background-color: #4caf50; + color: white; +} + +.notification-error { + background-color: #c62828; + color: white; +} + +@keyframes slideIn { + from { + transform: translateX(400px); + opacity: 0; + } + to { + transform: translateX(0); + opacity: 1; + } +} + +@media (max-width: 800px) { + .modal-content { + width: 95%; + } + + .order-card-footer { + flex-direction: column; + } + + .order-btn { + width: 100%; + } +} + +@media (max-width: 600px) { + .modal-header { + padding: 15px 20px; + } + + .modal-body { + padding: 15px 20px; + } + + .modal-footer { + padding: 15px 20px; + flex-direction: column; + } + + .modal-btn { + width: 100%; + } + + .notification { + right: 10px; + left: 10px; + text-align: center; + } +} \ No newline at end of file diff --git a/labs/lab-09/styles/styles.css b/labs/lab-09/styles/styles.css new file mode 100644 index 0000000..158c58c --- /dev/null +++ b/labs/lab-09/styles/styles.css @@ -0,0 +1,180 @@ +* { + box-sizing: border-box; +} + +body { + margin: 0; + padding: 0; + font-family: 'Montserrat', sans-serif; + display: flex; + flex-direction: column; + min-height: 100vh; +} + +header { + background-color: #2d5016; + color: white; + padding: 20px 40px; + margin: 0; +} + +h1 { + margin: 0 0 15px 0; + font-size: 36px; + color: white; +} + +h2 { + font-size: 28px; + color: #2d5016; + margin: 0 0 20px 0; +} + +nav { + margin: 0; + padding: 10px 0; + display: flex; + flex-wrap: wrap; + gap: 15px; +} + +nav a { + text-decoration: none; + color: white; + font-family: 'Montserrat', sans-serif; + font-size: 16px; +} + +nav a:hover { + color: #a8d08d; +} + +nav a#active { + color: tomato; +} + +main { + margin: 0 auto; + padding: 40px 60px; + max-width: 1200px; + flex: 1; +} + +section { + margin: 0 0 50px 0; + padding: 30px; + background-color: #f9f9f9; +} + +p { + font-family: 'Montserrat', sans-serif; + font-size: 16px; + color: #333; + line-height: 1.6; + margin: 0 0 15px 0; +} + +img { + width: 100%; + height: 400px; + object-fit: cover; + margin: 0 0 20px 0; +} + +ul { + margin: 20px 0; + padding: 0 0 0 25px; +} + +ul li { + font-family: 'Montserrat', sans-serif; + font-size: 16px; + color: #333; + margin: 0 0 12px 0; + line-height: 1.5; +} + +table { + width: 100%; + border-collapse: collapse; + margin: 20px 0; +} + +table th { + background-color: #2d5016; + color: white; + padding: 15px; + text-align: left; + border: 1px solid #2d5016; + font-size: 16px; +} + +table td { + padding: 12px 15px; + border: 1px solid #ddd; + text-align: left; + font-size: 15px; + color: #333; +} + +table tr:nth-child(even) { + background-color: #f2f2f2; +} + +footer { + background-color: black; + color: white; + padding: 30px 60px; + margin: 0; +} + +footer p { + color: white; + margin: 0 0 10px 0; +} + +footer a { + text-decoration: none; + color: white; + font-family: 'Montserrat', sans-serif; + font-size: 16px; +} + +footer a:hover { + color: #a8d08d; +} + +@media (max-width: 600px) { + h1 { + text-align: center; + } + + nav { + flex-direction: column; + align-items: center; + } + + nav a { + font-size: 20px; + } + + section h2 { + text-align: center; + } + + .about-company img { + width: 100%; + } + + table th, + table td { + font-size: 14px; + } +} + +@media (max-width: 400px) { + table th, + table td { + font-size: 12px; + } +} \ No newline at end of file diff --git a/labs/lab-09/templates/about.html b/labs/lab-09/templates/about.html new file mode 100644 index 0000000..f09e109 --- /dev/null +++ b/labs/lab-09/templates/about.html @@ -0,0 +1,43 @@ + + + + + + + О нас - ЭкоЛанч + + + + + + +
+

ЭкоЛанч

+ +
+ +
+
+

О нашей компании

+

ЭкоЛанч - это команда профессионалов, которые заботятся о вашем здоровье и комфорте. Мы готовим вкусные и полезные блюда из свежих продуктов и доставляем их прямо в ваш офис.

+

Наша миссия - сделать здоровое питание доступным и удобным для каждого занятого человека в Москве.

+
+
+ +
+

Контактная информация

+

Телефон: +7 (999) 373-77-37

+

Email: egor@deev.space

+

Адрес: г. Москва, ул. Михалковская, д. 7, к. 1, офис 813А

+

Режим работы: Пн-Пт с 7:00 до 23:00

+
+ + \ No newline at end of file diff --git a/labs/lab-09/templates/delivery.html b/labs/lab-09/templates/delivery.html new file mode 100644 index 0000000..2b510f8 --- /dev/null +++ b/labs/lab-09/templates/delivery.html @@ -0,0 +1,43 @@ + + + + + + + Доставка - ЭкоЛанч + + + + + + +
+

ЭкоЛанч

+ +
+ +
+
+

Условия доставки

+

Мы осуществляем доставку здоровых бизнес-ланчей по всей Москве. Доставка производится с понедельника по пятницу с 7:00 до 23:00.

+

Доставка по всей Москве в пределах МКАД осуществляется бесплатно!

+
+
+ +
+

Контактная информация

+

Телефон: +7 (999) 373-77-37

+

Email: egor@deev.space

+

Адрес: г. Москва, ул. Михалковская, д. 7, к. 1, офис 813А

+

Режим работы: Пн-Пт с 7:00 до 23:00

+
+ + \ No newline at end of file diff --git a/labs/lab-09/templates/menu.html b/labs/lab-09/templates/menu.html new file mode 100644 index 0000000..ecaf51a --- /dev/null +++ b/labs/lab-09/templates/menu.html @@ -0,0 +1,199 @@ + + + + + + + Собрать ланч - ЭкоЛанч + + + + + + + +
+

ЭкоЛанч

+ +
+
+
+

Доступные для заказа варианты ланча

+
+
+
+ 🍲 +

Суп

+
+
+ 🍽️ +

Главное блюдо

+
+
+ 🥗 +

Салат

+
+
+ 🥤 +

Напиток

+
+
+ +
+
+ 🍲 +

Суп

+
+
+ 🍽️ +

Главное блюдо

+
+
+ 🥤 +

Напиток

+
+
+ +
+
+ 🍲 +

Суп

+
+
+ 🥗 +

Салат

+
+
+ 🥤 +

Напиток

+
+
+ +
+
+ 🍽️ +

Главное блюдо

+
+
+ 🥗 +

Салат

+
+
+ 🥤 +

Напиток

+
+
+ +
+
+ 🍽️ +

Главное блюдо

+
+
+ 🥤 +

Напиток

+
+
+ +
+
+ 🍰 +

Десерт

+
+

(Можно добавить к любому заказу)

+
+
+

Десерты можно добавить к любому варианту ланча

+
+ +
+
+

Супы

+
+ + + +
+
+
+
+ +
+
+

Главные блюда

+
+ + + +
+
+
+
+ +
+
+

Салаты и стартеры

+
+ + + +
+
+
+
+ +
+
+

Напитки

+
+ + +
+
+
+
+ +
+
+

Десерты

+
+ + + +
+
+
+
+
+ + + +
+

Контактная информация

+

Телефон: +7 (999) 373-77-37

+

Email: egor@deev.space

+

Адрес: г. Москва, ул. Михалковская, д. 7, к. 1, офис 813А

+

Режим работы: Пн-Пт с 7:00 до 23:00

+
+ + + + \ No newline at end of file diff --git a/labs/lab-09/templates/order.html b/labs/lab-09/templates/order.html new file mode 100644 index 0000000..b6e25de --- /dev/null +++ b/labs/lab-09/templates/order.html @@ -0,0 +1,109 @@ + + + + + + + Оформить заказ - ЭкоЛанч + + + + + + + + +
+

ЭкоЛанч

+ +
+ +
+
+

Состав заказа

+
+ +
+ +
+

Оформление заказа

+
+
+
+

Ваш заказ

+
+

Ничего не выбрано

+
+
+ +
+

Данные для доставки

+ + + + + + + +
+ + +
+ + + + + + + Доставка осуществляется только по Москве + +
+ +
+ + +
+
+ + +
+
+ + + + Доступное время доставки с 7:00 до 23:00 + + + + +
+ + +
+
+
+
+
+
+ +
+

Контактная информация

+

Телефон: +7 (999) 373-77-37

+

Email: egor@deev.space

+

Адрес: г. Москва, ул. Михалковская, д. 7, к. 1, офис 813А

+

Режим работы: Пн-Пт с 7:00 до 23:00

+
+ + + + \ No newline at end of file diff --git a/labs/lab-09/templates/orders.html b/labs/lab-09/templates/orders.html new file mode 100644 index 0000000..1fb7ea2 --- /dev/null +++ b/labs/lab-09/templates/orders.html @@ -0,0 +1,178 @@ + + + + + + + Мои заказы - ЭкоЛанч + + + + + + + +
+

ЭкоЛанч

+ +
+ +
+
+

Мои заказы

+
+ +
+
+ + + + + + + + + +
+

Контактная информация

+

Телефон: +7 (999) 373-77-37

+

Email: egor@deev.space

+

Адрес: г. Москва, ул. Михалковская, д. 7, к. 1, офис 813А

+

Режим работы: Пн-Пт с 7:00 до 23:00

+
+ + + + \ No newline at end of file