From 11f007066d173daf3c0af5b97b3ff63470d30fb8 Mon Sep 17 00:00:00 2001 From: gitfreeking Date: Tue, 29 Apr 2025 23:31:44 +0200 Subject: [PATCH 01/13] Link im Header --- public/Warenkorb/warenkorb.html | 206 ++++++-------- public/bestellung/bestellung.html | 4 +- public/header_footer/header.html | 2 +- static/Styles/Warenkorb/warenkorb.css | 164 ----------- .../bestellformular/bestellformular.css | 63 ----- static/Styles/bestellung/bestellung.css | 49 ---- static/Styles/styles-main.css | 256 +++++++++++++++++- 7 files changed, 340 insertions(+), 404 deletions(-) delete mode 100644 static/Styles/Warenkorb/warenkorb.css delete mode 100644 static/Styles/bestellung/bestellung.css diff --git a/public/Warenkorb/warenkorb.html b/public/Warenkorb/warenkorb.html index 011faa7..0162c29 100644 --- a/public/Warenkorb/warenkorb.html +++ b/public/Warenkorb/warenkorb.html @@ -1,91 +1,57 @@ - - Warenkorb - - - + + Warenkorb + + + + -
+ +
-
-

Dein Warenkorb

-
-
- -
+
+

Dein Warenkorb

+
+
+ +
- + + + tbody.appendChild(row); + }); + + container.appendChild(table); + + gesamtContainer.innerHTML = `

Gesamtsumme: ${gesamtpreis.toFixed(2)} €

`; + + if (window.zeigeWarenkorbAnzahl) { + window.zeigeWarenkorbAnzahl(); + } + } + + function entferneAusWarenkorb(index) { + let warenkorb = JSON.parse(localStorage.getItem('warenkorb')) || []; + + warenkorb.splice(index, 1); + localStorage.setItem('warenkorb', JSON.stringify(warenkorb)); + + ladeWarenkorb(); + } + + function aendereMenge(index, aenderung) { + let warenkorb = JSON.parse(localStorage.getItem('warenkorb')) || []; + + warenkorb[index].quantity += aenderung; + + if (warenkorb[index].quantity <= 0) { + warenkorb.splice(index, 1); // Produkt löschen, wenn Menge 0 oder kleiner + } + + localStorage.setItem('warenkorb', JSON.stringify(warenkorb)); + ladeWarenkorb(); + } + diff --git a/public/bestellung/bestellung.html b/public/bestellung/bestellung.html index 0827942..379e6ec 100644 --- a/public/bestellung/bestellung.html +++ b/public/bestellung/bestellung.html @@ -6,11 +6,12 @@ Ihre Bestellung + -
+

Ihre Bestellung:

@@ -79,6 +80,7 @@ bestellCard.innerHTML = `

Bestellnummer: ${orderId}

${produkteHTML} +

Gesamtsumme: ${bestellung.total.toFixed(2)} €

`; diff --git a/public/header_footer/header.html b/public/header_footer/header.html index dd4c9c6..b83a6a1 100644 --- a/public/header_footer/header.html +++ b/public/header_footer/header.html @@ -54,7 +54,7 @@ diff --git a/static/Styles/Warenkorb/warenkorb.css b/static/Styles/Warenkorb/warenkorb.css deleted file mode 100644 index 43ae701..0000000 --- a/static/Styles/Warenkorb/warenkorb.css +++ /dev/null @@ -1,164 +0,0 @@ -body { - font-family: Arial, sans-serif; - background-color: #f3f3f3; - margin: 0; - padding: 130px; -} - -.warenkorb { - max-width: 700px; - margin: 0 auto; - background: white; - padding: 120px; - border-radius: 12px; - box-shadow: 0 4px 12px rgba(0,0,0,0.1); -} - -.warenkorb h2 { - font-size: 30px; - text-align: center; - margin-bottom: 60px; -} - -.item { - display: flex; - justify-content: space-between; - align-items: center; - border-bottom: 1px solid #ddd; - padding: 10px 0; - margin-bottom: 35px; -} - -.item .info { - display: flex; - flex-direction: column; -} - -.item .name { - font-weight: bold; -} - -.item .price { - color: #555; -} - -.remove { - background-color: #ff6600; - border: none; - color: white; - padding: 6px 12px; - border-radius: 6px; - cursor: pointer; -} - -.remove:hover { - background-color: #ff6600; -} - -.summary { - text-align: right; - font-size: 1.1em; - margin: 20px 0; -} - -.checkout { - display: block; - width: 100%; - padding: 12px; - background-color: #ff6600; - border: none; - color: white; - font-size: 16px; - border-radius: 8px; - cursor: pointer; - margin-top: 90px; -} - -.checkout:hover { - background-color: #ff6600; -} - -.checkout { - display: inline-block; - background-color: #ff6600; - color: white; - padding: 10px 20px; - margin-top: 20px; - text-align: center; - text-decoration: none; - font-size: 16px; - border-radius: 5px; - transition: background-color 0.3s; -} - -body { - font-family: Arial, sans-serif; - background-color: #f2f2f2; - padding: 20px; -} - -.form-container { - max-width: 600px; - margin: auto; - background-color: #ffffff; - padding: 25px; - border-radius: 8px; - box-shadow: 0 0 10px rgba(0,0,0,0.1); -} - -form h2 { - text-align: center; - margin-bottom: 20px; -} - -label { - display: block; - margin-top: 15px; - font-weight: bold; -} - -input[type="text"], -input[type="tel"], -textarea { - width: 100%; - padding: 10px; - margin-top: 5px; - border: 1px solid #ccc; - border-radius: 4px; - box-sizing: border-box; -} - -input[type="submit"] { - margin-top: 20px; - background-color: #ff6600; - color: white; - border: none; - padding: 12px; - border-radius: 5px; - font-size: 16px; - cursor: pointer; - width: 100%; -} - -input[type="submit"]:hover { - background-color: #ff6600; -} - -.zurKasse { - display: block; - margin: 20px auto; - background-color: #ff6600; - color: white; - border: none; - padding: 12px 24px; - font-size: 16px; - border-radius: 8px; - cursor: pointer; - box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); -} - -.zurKasse:hover { - background-color: #ff6600; -} - - diff --git a/static/Styles/bestellformular/bestellformular.css b/static/Styles/bestellformular/bestellformular.css index c320ca7..e69de29 100644 --- a/static/Styles/bestellformular/bestellformular.css +++ b/static/Styles/bestellformular/bestellformular.css @@ -1,63 +0,0 @@ -body { - font-family: Arial, sans-serif; - background-color: #f2f2f2; - margin: 0; - display: flex; - flex-direction: column; - min-height: 100vh; -} - -.wrapper { - flex: 1; /* Der Hauptinhalt nimmt den verfügbaren Platz ein */ -} - -.form-container { - max-width: 600px; - margin: 20px auto; - background-color: #f5f5f5; - padding: 25px; - border-radius: 8px; - box-shadow: 0 0 10px rgba(0,0,0,0.1); -} - -form h2 { - text-align: center; - margin-bottom: 20px; -} - -label { - display: block; - margin-top: 15px; - font-weight: bold; -} - -input[type="text"], -input[type="tel"], -textarea { - width: 100%; - padding: 10px; - margin-top: 5px; - border: 1px solid #ccc; - border-radius: 4px; - box-sizing: border-box; -} - -/* NEU: Styling für den Absende-Link */ -.button-submit { - display: inline-block; - margin-top: 20px; - background-color: #ff6600; - color: white; - text-decoration: none; - padding: 12px; - border-radius: 5px; - font-size: 16px; - cursor: pointer; - width: 100%; - text-align: center; - box-sizing: border-box; /* Damit Breite + Padding sauber passen */ -} - -.button-submit:hover { - background-color: #ff6600; -} diff --git a/static/Styles/bestellung/bestellung.css b/static/Styles/bestellung/bestellung.css deleted file mode 100644 index 849719f..0000000 --- a/static/Styles/bestellung/bestellung.css +++ /dev/null @@ -1,49 +0,0 @@ -/* Allgemeine Layout-Stile */ -body { - font-family: Arial, sans-serif; - background-color: #f2f2f2; - padding: 20px; - margin: 0; - display: flex; - flex-direction: column; - min-height: 100vh; -} - -/* Container für die Bestellinformationen */ -#bestellung { - background-color: #fff; - padding: 20px; - border-radius: 8px; - box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); - margin-top: 20px; -} - -/* Titel */ -h2 { - text-align: center; - margin-bottom: 30px; - margin-top: 20px; -} - -/* Karte für Bestellinformationen */ -.bestell-info-card { - background-color: #fafafa; - padding: 15px; - border-radius: 8px; - margin-bottom: 15px; - box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); -} - -/* Bestellinformationen formatieren */ -.bestell-info-card p { - font-size: 16px; - margin: 10px 0; -} - -/* Stile für die Label und Platzhalter */ -.bestell-info-card span { - font-weight: bold; - color: #333; -} - - diff --git a/static/Styles/styles-main.css b/static/Styles/styles-main.css index a739343..89d4b5e 100644 --- a/static/Styles/styles-main.css +++ b/static/Styles/styles-main.css @@ -271,7 +271,6 @@ header h1 { color: #fff; padding: 30px 20px; text-align: center; - margin-top: 40px; margin-top: auto; } @@ -288,6 +287,255 @@ main { text-decoration: underline; } +/* ========== Bestellinformationen ========== */ +#bestellung { + display: flex; + flex-direction: column; + gap: 20px; + padding: 30px 20px; + max-width: 800px; + margin: 0 auto; +} + +.bestell-info-card { + background: #ffffff; + border-radius: 15px; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08); + padding: 25px; + transition: transform 0.3s ease; +} + +.bestell-info-card:hover { + transform: translateY(-5px); +} + +.bestell-info-card h3 { + font-size: 20px; + color: #333; + margin-bottom: 15px; +} + +.bestell-info-card p { + font-size: 16px; + color: #555; + margin-bottom: 8px; +} + +.bestell-info-card strong { + color: #333; +} + +.warenkorb { + max-width: 1000px; + margin: 40px auto; + padding: 20px; + background-color: #fff; + border-radius: 16px; + box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1); +} + +main > h2 { + text-align: center; + font-size: 2rem; + margin-bottom: 30px; + color: #333; +} + +.warenkorb-tabelle { + width: 100%; + border-collapse: collapse; + font-size: 1rem; +} + +.warenkorb-tabelle th, .warenkorb-tabelle td { + padding: 12px 15px; + text-align: center; + border-bottom: 1px solid #ddd; +} + +.warenkorb-tabelle th { + background-color: #f4f4f4; + color: #444; +} + +.warenkorb-tabelle tr:nth-child(even) { + background-color: #fafafa; +} + +.menge-button, .loeschen-button { + background-color: #4a90e2; + border: none; + color: white; + padding: 6px 10px; + border-radius: 8px; + font-size: 16px; + cursor: pointer; + transition: background-color 0.2s ease; +} + +.menge-button:hover, .loeschen-button:hover { + background-color: #357ab8; +} + +.loeschen-button { + background-color: #e74c3c; +} + +.loeschen-button:hover { + background-color: #c0392b; +} + +.produkt-anzahl { + margin: 0 8px; + display: inline-block; + min-width: 24px; + text-align: center; + font-weight: bold; +} + +#gesamtpreis-container { + margin-top: 20px; + text-align: right; + font-size: 1.2rem; + font-weight: bold; + color: #222; +} + +#zurKasseGehen { + margin-top: 30px; + background-color: #27ae60; + color: white; + padding: 12px 25px; + border: none; + border-radius: 12px; + font-size: 18px; + cursor: pointer; + transition: background-color 0.3s ease; + display: block; + margin-left: auto; +} + +#zurKasseGehen:hover { + background-color: #219150; +} + +/* ========== Bestellformular Styling ========== */ +.form-container { + background: #ffffff; + border-radius: 12px; + box-shadow: 0 8px 16px rgba(0, 0, 0, 0.1); + padding: 30px; + max-width: 600px; + margin: 40px auto; +} + +h2 { + font-size: 24px; + margin-bottom: 20px; + text-align: center; + color: #333; +} + +label { + font-size: 16px; + margin-bottom: 8px; + color: #555; + display: block; +} + +input[type="text"], input[type="number"] { + width: 100%; + padding: 12px; + font-size: 16px; + margin-bottom: 15px; + border: 1px solid #ddd; + border-radius: 8px; + background-color: #f5f5f5; + transition: border 0.3s ease, box-shadow 0.3s ease; +} + +input[type="text"]:focus, input[type="number"]:focus { + border-color: #ff6600; + box-shadow: 0 0 8px rgba(255, 102, 0, 0.3); +} + +.Artikel { + display: flex; + flex-wrap: wrap; + gap: 10px; + align-items: center; + margin-bottom: 20px; +} + +.ArtikelNrText, .StueckzahlText { + width: calc(50% - 5px); + padding: 10px; + font-size: 16px; + border-radius: 8px; + border: 1px solid #ddd; + margin-right: 10px; + background-color: #f5f5f5; +} + +.ArtikelNrText:focus, .StueckzahlText:focus { + border-color: #ff6600; + box-shadow: 0 0 8px rgba(255, 102, 0, 0.3); +} + +.loeschen-button { + background-color: #e74c3c; + color: white; + border: none; + padding: 8px 16px; + font-size: 16px; + border-radius: 8px; + cursor: pointer; + transition: background-color 0.3s ease; +} + +.loeschen-button:hover { + background-color: #c0392b; +} + +.verfuegbarkeit { + font-size: 14px; + color: #888; + flex-grow: 1; + text-align: right; + padding-left: 10px; +} + +#sendOrder { + display: block; + width: 100%; + padding: 15px; + background-color: #ff6600; + color: white; + text-align: center; + font-size: 18px; + border-radius: 8px; + cursor: pointer; + transition: background-color 0.3s ease; + margin-top: 20px; + border: none; +} + +#sendOrder:hover { + background-color: #e95b00; +} + +#KundenNr, #Vorname, #Nachname { + background-color: #f5f5f5; + border: none; + cursor: not-allowed; +} + +@media (max-width: 768px) { + .ArtikelNrText, .StueckzahlText { + width: 100%; + } +} + /* ========== Formulare und Buttons allgemein ========== */ .input-box { position: relative; @@ -422,8 +670,4 @@ h1 { opacity: 1; transform: translateY(0); } -} - - - - +} \ No newline at end of file From 6f8f4f65ba6e835d3f6ef2bf3f486d0ef46378c9 Mon Sep 17 00:00:00 2001 From: florianspengler Date: Wed, 30 Apr 2025 08:36:48 +0200 Subject: [PATCH 02/13] Bestellformular gefixxed --- public/Warenkorb/warenkorb.html | 278 ++++++++++---------- public/bestellformular/bestellformular.html | 7 + 2 files changed, 146 insertions(+), 139 deletions(-) diff --git a/public/Warenkorb/warenkorb.html b/public/Warenkorb/warenkorb.html index 011faa7..7558a0c 100644 --- a/public/Warenkorb/warenkorb.html +++ b/public/Warenkorb/warenkorb.html @@ -1,154 +1,154 @@ - - Warenkorb - - - + + Warenkorb + + +
-
-

Dein Warenkorb

-
-
- -
+
+

Dein Warenkorb

+
+
+ +
+ .warenkorb-tabelle { + width: 100%; + border-collapse: collapse; + margin-top: 20px; + } + + .warenkorb-tabelle th, .warenkorb-tabelle td { + padding: 10px; + text-align: center; + border-bottom: 1px solid #ccc; + } + + .warenkorb-tabelle th { + background-color: #f8f8f8; + } + + .loeschen-button, .menge-button { + background-color: #ff4d4d; + border: none; + color: white; + padding: 5px 8px; + margin: 0 2px; + cursor: pointer; + border-radius: 5px; + font-size: 16px; + } + + .loeschen-button:hover, .menge-button:hover { + background-color: #e60000; + } + + .produkt-anzahl { + display: inline-block; + width: 30px; + text-align: center; + } + + document.addEventListener('DOMContentLoaded', function () { + ladeWarenkorb(); + + document.getElementById('zurKasseGehen').addEventListener('click', function() { + window.location.href = '/bestellformular'; // Deine Bestellformular-Seite + }); + }); + + function ladeWarenkorb() { + const warenkorb = JSON.parse(localStorage.getItem('warenkorb')) || []; + const container = document.getElementById('warenkorb'); + const gesamtContainer = document.getElementById('gesamtpreis-container'); + + container.innerHTML = ''; + gesamtContainer.innerHTML = ''; + + if (warenkorb.length === 0) { + container.innerHTML = '

Dein Warenkorb ist leer.

'; + document.getElementById('zurKasseGehen').style.display = 'none'; + return; + } + + let gesamtpreis = 0; + + const table = document.createElement('table'); + table.className = 'warenkorb-tabelle'; + table.innerHTML = ` + + + Produkt + Preis (Stück) + Anzahl + Zwischensumme + Aktion + + + + `; + + const tbody = table.querySelector('tbody'); + + warenkorb.forEach((produkt, index) => { + const zwischensumme = produkt.price * produkt.quantity; + gesamtpreis += zwischensumme; + + const row = document.createElement('tr'); + row.innerHTML = ` + ${produkt.product_name} + ${produkt.price.toFixed(2)} € + + + ${produkt.quantity} + + + ${zwischensumme.toFixed(2)} € + + `; + tbody.appendChild(row); + }); + + container.appendChild(table); + + gesamtContainer.innerHTML = `

Gesamtsumme: ${gesamtpreis.toFixed(2)} €

`; + + if (window.zeigeWarenkorbAnzahl) { + window.zeigeWarenkorbAnzahl(); + } + } + + function entferneAusWarenkorb(index) { + let warenkorb = JSON.parse(localStorage.getItem('warenkorb')) || []; + + warenkorb.splice(index, 1); + localStorage.setItem('warenkorb', JSON.stringify(warenkorb)); + + ladeWarenkorb(); + } + + function aendereMenge(index, aenderung) { + let warenkorb = JSON.parse(localStorage.getItem('warenkorb')) || []; + + warenkorb[index].quantity += aenderung; + + if (warenkorb[index].quantity <= 0) { + warenkorb.splice(index, 1); // Produkt löschen, wenn Menge 0 oder kleiner + } + + localStorage.setItem('warenkorb', JSON.stringify(warenkorb)); + ladeWarenkorb(); + } + diff --git a/public/bestellformular/bestellformular.html b/public/bestellformular/bestellformular.html index ccff5aa..2c0904e 100644 --- a/public/bestellformular/bestellformular.html +++ b/public/bestellformular/bestellformular.html @@ -164,6 +164,7 @@ if (response.ok) { // Bestellung erfolgreich -> Weiterleitung + warenkorbLeeren(); window.location.href = "/bestellung"; } else { alert('Fehler: ' + result.message); @@ -297,6 +298,12 @@ }); } + function warenkorbLeeren() { + localStorage.removeItem('warenkorb'); // Oder: localStorage.setItem('warenkorb', '[]'); + ladeWarenkorb(); // Aktualisiert die Ansicht + if (window.zeigeWarenkorbAnzahl) zeigeWarenkorbAnzahl(); // Optional: Warenkorb-Zähler im Header aktualisieren + } + From 4113f06da302c1737bdaff0730ed847aba817db4 Mon Sep 17 00:00:00 2001 From: florianspengler Date: Wed, 30 Apr 2025 08:37:41 +0200 Subject: [PATCH 03/13] Bestellformular gefixxed --- public/bestellformular/bestellformular.html | 2 -- 1 file changed, 2 deletions(-) diff --git a/public/bestellformular/bestellformular.html b/public/bestellformular/bestellformular.html index 2c0904e..4dc09a4 100644 --- a/public/bestellformular/bestellformular.html +++ b/public/bestellformular/bestellformular.html @@ -256,7 +256,6 @@ const neueArtikelDiv = document.createElement('div'); neueArtikelDiv.className = 'Artikel'; neueArtikelDiv.innerHTML = ` -
@@ -289,7 +288,6 @@ const artikelDiv = document.createElement('div'); artikelDiv.className = 'Artikel'; artikelDiv.innerHTML = ` -
From c586ce8b9da5b2703d0cff260381e529d85f3f33 Mon Sep 17 00:00:00 2001 From: florianspengler Date: Wed, 30 Apr 2025 10:09:34 +0200 Subject: [PATCH 04/13] fixxed localstorage behaviour by logout --- process.env | 2 +- public/bestellformular/bestellformular.html | 2 +- public/inputHandler/verifyPassword.js | 0 public/session_storage/login-toggle.js | 0 scripts/einfügenHeaderFooter.js | 2 ++ 5 files changed, 4 insertions(+), 2 deletions(-) delete mode 100644 public/inputHandler/verifyPassword.js delete mode 100644 public/session_storage/login-toggle.js diff --git a/process.env b/process.env index 237aa94..7b07edb 100644 --- a/process.env +++ b/process.env @@ -5,4 +5,4 @@ APP_PORT=3000 DB_HOST=localhost DB_USER=root DB_PASSWORD= -DB_DATABASE=webshop +DB_DATABASE=webshop \ No newline at end of file diff --git a/public/bestellformular/bestellformular.html b/public/bestellformular/bestellformular.html index 7ff990b..640911a 100644 --- a/public/bestellformular/bestellformular.html +++ b/public/bestellformular/bestellformular.html @@ -302,7 +302,7 @@ }); } - function warenkorbLeeren() { + window.warenkorbLeeren = function (){ localStorage.removeItem('warenkorb'); // Oder: localStorage.setItem('warenkorb', '[]'); ladeWarenkorb(); // Aktualisiert die Ansicht if (window.zeigeWarenkorbAnzahl) zeigeWarenkorbAnzahl(); // Optional: Warenkorb-Zähler im Header aktualisieren diff --git a/public/inputHandler/verifyPassword.js b/public/inputHandler/verifyPassword.js deleted file mode 100644 index e69de29..0000000 diff --git a/public/session_storage/login-toggle.js b/public/session_storage/login-toggle.js deleted file mode 100644 index e69de29..0000000 diff --git a/scripts/einfügenHeaderFooter.js b/scripts/einfügenHeaderFooter.js index 6bf84a1..4d008e7 100644 --- a/scripts/einfügenHeaderFooter.js +++ b/scripts/einfügenHeaderFooter.js @@ -87,8 +87,10 @@ document.addEventListener("DOMContentLoaded", () => { loginBtn.addEventListener('click', (e) => { e.preventDefault() sessionStorage.clear() + localStorage.clear() alert('Sie wurden ausgeloggt.') location.reload() + }) } else { loginBtn.textContent = 'Login' From 693d87954c2cc8afebba31579f845bd20b72029b Mon Sep 17 00:00:00 2001 From: gitfreeking Date: Wed, 30 Apr 2025 11:04:59 +0200 Subject: [PATCH 05/13] Css angepasst. --- public/Warenkorb/warenkorb.html | 22 ++++++++++++---------- static/Styles/styles-main.css | 4 ++-- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/public/Warenkorb/warenkorb.html b/public/Warenkorb/warenkorb.html index 0162c29..2e5f9e5 100644 --- a/public/Warenkorb/warenkorb.html +++ b/public/Warenkorb/warenkorb.html @@ -9,20 +9,22 @@ - - +
+ + -
-

Dein Warenkorb

-
-
- +
+

Dein Warenkorb

+
+
+ +
-
- - + + +
diff --git a/public/bestellformular/bestellformular.html b/public/bestellformular/bestellformular.html index 640911a..f45469d 100644 --- a/public/bestellformular/bestellformular.html +++ b/public/bestellformular/bestellformular.html @@ -4,7 +4,6 @@ Bestellformular - @@ -37,53 +36,14 @@ - -
- - - -
-
+ - Bestellung absenden + +
@@ -182,101 +142,8 @@ } }); - // Artikelnummer prüfen bei Eingabe - formular.addEventListener('input', async function (event) { - if (event.target.classList.contains('ArtikelNrText')) { - if (event.target.value.trim() !== '') { - await pruefeVerfuegbarkeit(event.target); - fuegeNeuesArtikelFeldHinzu(); - } - } - }); }); - // Funktion: Verfügbarkeit prüfen - async function pruefeVerfuegbarkeit(inputFeld) { - const artikelnummer = inputFeld.value.trim(); - const verfuegbarkeitDiv = inputFeld.parentElement.querySelector('.verfuegbarkeit'); - const sendButton = document.getElementById('sendOrder'); - - if (artikelnummer.length === 0) { - verfuegbarkeitDiv.textContent = ""; - return; - } - - try { - const response = await fetch(`/api/pruefe-artikel?nummer=${encodeURIComponent(artikelnummer)}`); - const data = await response.json(); - - const artikelDivs = document.querySelectorAll('.Artikel'); - let artikelVerfuegbarkeiten = []; - - artikelDivs.forEach(div => { - const artikelNrInput = div.querySelector('.ArtikelNrText'); - const verfDiv = div.querySelector('.verfuegbarkeit'); - - if (artikelNrInput.value.trim() !== '') { - if (artikelNrInput === inputFeld) { - if (data.verfuegbar) { - verfDiv.textContent = "Artikel verfügbar."; - verfDiv.style.color = "green"; - artikelVerfuegbarkeiten.push(true); - } else { - verfDiv.textContent = "Artikel nicht verfügbar!"; - verfDiv.style.color = "red"; - artikelVerfuegbarkeiten.push(false); - } - } else { - // Für andere Felder bisherige Anzeige berücksichtigen - if (verfDiv.textContent.includes("nicht verfügbar")) { - artikelVerfuegbarkeiten.push(false); - } else { - artikelVerfuegbarkeiten.push(true); - } - } - } - }); - - // Button sperren/freigeben - if (artikelVerfuegbarkeiten.every(status => status === true)) { - sendButton.disabled = false; - } else { - sendButton.disabled = true; - } - - } catch (error) { - console.error('Fehler bei der Artikelsuche:', error); - verfuegbarkeitDiv.textContent = "Fehler bei der Prüfung."; - verfuegbarkeitDiv.style.color = "orange"; - sendButton.disabled = true; - } - } - - // Funktion: Neues Artikelfeld hinzufügen - function fuegeNeuesArtikelFeldHinzu() { - const formular = document.getElementById('bestellform'); - const artikelnummerFelder = formular.querySelectorAll('.ArtikelNrText'); - const letztesFeld = artikelnummerFelder[artikelnummerFelder.length - 1]; - - if (letztesFeld && letztesFeld.value.trim() !== '') { - const neueArtikelDiv = document.createElement('div'); - neueArtikelDiv.className = 'Artikel'; - neueArtikelDiv.innerHTML = ` - - -
- `; - - const sendButton = document.getElementById('sendOrder'); - formular.insertBefore(neueArtikelDiv, sendButton); - } - } - - // Funktion: Artikel löschen - function loescheArtikel(button) { - const artikelDiv = button.parentElement; - artikelDiv.remove(); - } function ladeWarenkorb() { // RICHTIG lesen: aus localStorage (nicht sessionStorage!) @@ -294,18 +161,19 @@ const artikelDiv = document.createElement('div'); artikelDiv.className = 'Artikel'; artikelDiv.innerHTML = ` - - -
+ + +
`; + formular.insertBefore(artikelDiv, sendButton); }); } - window.warenkorbLeeren = function (){ + window.warenkorbLeeren = function () { localStorage.removeItem('warenkorb'); // Oder: localStorage.setItem('warenkorb', '[]'); ladeWarenkorb(); // Aktualisiert die Ansicht - if (window.zeigeWarenkorbAnzahl) zeigeWarenkorbAnzahl(); // Optional: Warenkorb-Zähler im Header aktualisieren + if (window.zeigeWarenkorbAnzahl) zeigeWarenkorbAnzahl(); // Warenkorb-Zähler im Header aktualisieren } diff --git a/public/bestellung/bestellung.html b/public/bestellung/bestellung.html index 379e6ec..12a5b23 100644 --- a/public/bestellung/bestellung.html +++ b/public/bestellung/bestellung.html @@ -4,7 +4,6 @@ Ihre Bestellung - diff --git a/static/Styles/bestellformular/bestellformular.css b/static/Styles/bestellformular/bestellformular.css deleted file mode 100644 index e69de29..0000000 diff --git a/static/Styles/registrieren/registrieren.css b/static/Styles/registrieren/registrieren.css index de4ccbb..e38bcfb 100644 --- a/static/Styles/registrieren/registrieren.css +++ b/static/Styles/registrieren/registrieren.css @@ -53,7 +53,7 @@ .register-link { text-align: center; font-size: 14px; - margin-top: 15px; + margin-top: 5px; } .register-link a { diff --git a/static/Styles/styles-main.css b/static/Styles/styles-main.css index 05abb1f..5ac7c35 100644 --- a/static/Styles/styles-main.css +++ b/static/Styles/styles-main.css @@ -421,12 +421,43 @@ main > h2 { /* ========== Bestellformular Styling ========== */ .form-container { - background: #ffffff; - border-radius: 12px; - box-shadow: 0 8px 16px rgba(0, 0, 0, 0.1); - padding: 30px; - max-width: 600px; + background: #fff; + max-width: 700px; margin: 40px auto; + padding: 30px; + border-radius: 20px; + box-shadow: 0 8px 16px rgba(0,0,0,0.1); +} + +#bestellform { + display: flex; + flex-direction: column; + gap: 15px; +} + +#bestellform h2 { + text-align: center; + margin-bottom: 10px; + font-size: 26px; + color: #ff6600; +} + +#bestellform label { + font-weight: 500; + font-weight: bold; +} + +#bestellform input[type="text"] { + padding: 12px; + border-radius: 10px; + border: 1px solid #ccc; + font-size: 16px; + transition: border-color 0.3s; +} + +#bestellform input[type="text"]:focus { + border-color: #ff6600; + outline: none; } h2 { @@ -461,19 +492,27 @@ input[type="text"]:focus, input[type="number"]:focus { .Artikel { display: flex; - flex-wrap: wrap; - gap: 10px; + gap: 5px; align-items: center; - margin-bottom: 20px; + flex-wrap: wrap; +} + +.Artikel input { + flex: 1 1 120px; + margin-bottom: 5px; +} + +.Artikel .verfuegbarkeit { + font-size: 14px; + flex-basis: 100%; + margin-top: 5px; } .ArtikelNrText, .StueckzahlText { width: calc(50% - 5px); - padding: 10px; font-size: 16px; border-radius: 8px; border: 1px solid #ddd; - margin-right: 10px; background-color: #f5f5f5; } @@ -497,6 +536,24 @@ input[type="text"]:focus, input[type="number"]:focus { background-color: #c0392b; } +.button-submit { + margin-top: 20px; + padding: 14px; + background: #ff6600; + color: white; + font-weight: bold; + border-radius: 25px; + text-align: center; + display: inline-block; + cursor: pointer; + transition: background 0.3s ease; + text-decoration: none; +} + +.button-submit:hover { + background: #e95b00; +} + .verfuegbarkeit { font-size: 14px; color: #888; @@ -536,6 +593,35 @@ input[type="text"]:focus, input[type="number"]:focus { } } +.link-text-formular { + text-align: center; + font-size: 17px; + color: #555; +} + +.link-text-formular a { + color: #ff6600; + text-decoration: none; + font-weight: 500; +} + +.link-text-formular a:hover { + text-decoration: underline; +} + +input[readonly] { + background-color: #f0f0f0; + color: #666; + border: 1px dashed #999; + cursor: not-allowed; +} + +input:not([readonly]) { + background-color: #ffffff; + color: #000; + border: 1px solid #333; +} + /* ========== Formulare und Buttons allgemein ========== */ .input-box { position: relative; From 52d30233fc5abbad4e97a29881041c8f91c52ea9 Mon Sep 17 00:00:00 2001 From: vex Date: Wed, 30 Apr 2025 21:36:41 +0200 Subject: [PATCH 07/13] - cleaned up unnecessary files - preparation for encryption --- package-lock.json | 609 ++++++++++++++++++++++++++++++++++ package.json | 1 + scripts/modules/db-connect.js | 17 - scripts/modules/login.js | 12 - scripts/script-main.js | 0 5 files changed, 610 insertions(+), 29 deletions(-) delete mode 100644 scripts/modules/db-connect.js delete mode 100644 scripts/modules/login.js delete mode 100644 scripts/script-main.js diff --git a/package-lock.json b/package-lock.json index b3c988d..e870f9c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "license": "ISC", "dependencies": { "app-root-path": "^3.1.0", + "bcrypt": "^5.1.1", "dotenv": "^16.4.7", "express": "^4.21.2", "express-session": "^1.18.1", @@ -20,6 +21,32 @@ "server.js": "^1.0.0" } }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "license": "BSD-3-Clause", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "license": "ISC" + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -32,6 +59,50 @@ "node": ">= 0.6" } }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/agent-base/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/app-root-path": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.1.0.tgz", @@ -41,6 +112,40 @@ "node": ">= 6.0.0" } }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "license": "ISC" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/are-we-there-yet/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -55,6 +160,26 @@ "node": ">= 6.0.0" } }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/bcrypt": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz", + "integrity": "sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.11", + "node-addon-api": "^5.0.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/bignumber.js": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", @@ -86,6 +211,16 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -112,6 +247,36 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "license": "ISC" + }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -173,6 +338,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "license": "MIT" + }, "node_modules/denque": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", @@ -199,6 +370,15 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/detect-libc": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, "node_modules/dotenv": { "version": "16.4.7", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", @@ -216,6 +396,12 @@ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, "node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", @@ -366,6 +552,36 @@ "node": ">= 0.6" } }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -374,6 +590,27 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/generate-function": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", @@ -401,6 +638,27 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", @@ -445,6 +703,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "license": "ISC" + }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -471,6 +735,42 @@ "node": ">= 0.8" } }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -482,6 +782,17 @@ "node": ">=0.10.0" } }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -495,6 +806,15 @@ "node": ">= 0.10" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/is-property": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", @@ -536,6 +856,30 @@ "url": "https://github.com/sponsors/wellwelwel" } }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -590,6 +934,64 @@ "node": ">= 0.6" } }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -692,12 +1094,75 @@ "npm": ">=5.0.0" } }, + "node_modules/node-addon-api": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==", + "license": "MIT" + }, "node_modules/node-bin-setup": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/node-bin-setup/-/node-bin-setup-1.1.3.tgz", "integrity": "sha512-opgw9iSCAzT2+6wJOETCpeRYAQxSopqQ2z+N6BXwIMsQQ7Zj5M8MaafQY8JMlolRR6R1UXg2WmhKp0p9lSOivg==", "license": "ISC" }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "license": "ISC", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-inspect": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", @@ -728,6 +1193,15 @@ "node": ">= 0.8" } }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -745,6 +1219,15 @@ "util": "^0.10.3" } }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/path-to-regexp": { "version": "0.1.12", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", @@ -839,6 +1322,22 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -863,6 +1362,18 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/send": { "version": "0.19.0", "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", @@ -924,6 +1435,12 @@ "integrity": "sha512-fO4IvzkZ09bBB++XU/gWGuzxJs0OpghSd/34mlW8coMoakLzj/+W5d1pHX+I+7H52GkBKu96UQU0K5vptNjaqg==", "license": "ISC" }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "license": "ISC" + }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -962,6 +1479,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, "node_modules/sqlstring": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", @@ -991,6 +1514,49 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -999,6 +1565,12 @@ "node": ">=0.6" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -1063,6 +1635,43 @@ "engines": { "node": ">= 0.8" } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" } } } diff --git a/package.json b/package.json index f34f8f5..a241901 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "description": "Webshop Autohändler", "dependencies": { "app-root-path": "^3.1.0", + "bcrypt": "^5.1.1", "dotenv": "^16.4.7", "express": "^4.21.2", "express-session": "^1.18.1", diff --git a/scripts/modules/db-connect.js b/scripts/modules/db-connect.js deleted file mode 100644 index 97419f7..0000000 --- a/scripts/modules/db-connect.js +++ /dev/null @@ -1,17 +0,0 @@ -const mysql = require('mysql2'); -require('dotenv').config({path: 'C:/Daten/Webshop/process.env'}); -//to-do: '.env' Dateien aus anderen Directories aufrufen ohne absoluten Pfad -// require("dotenv").config({path:'C:/Daten/Webshop/process.env'}) - -const connection = mysql.createConnection({ - host : process.env.DB_HOST, - user : process.env.DB_USER, - password : process.env.DB_PASSWORD, - database : process.env.DB_DATABASE -}); - -connection.connect(function(err) { - if (err) throw err; -}); - -module.exports = connection; \ No newline at end of file diff --git a/scripts/modules/login.js b/scripts/modules/login.js deleted file mode 100644 index 454dccc..0000000 --- a/scripts/modules/login.js +++ /dev/null @@ -1,12 +0,0 @@ -require('mysql2') - -let userInput = "test1" - -let appRoot = require('app-root-path') -let dbConnect = require(appRoot + '/scripts/modules/db-connect.js') - -dbConnect.query("SELECT * FROM webshop.user WHERE email = " + "'" + userInput + "'", function (err, result) { - if (err) throw err - console.log(result) -}) -dbConnect.end() \ No newline at end of file diff --git a/scripts/script-main.js b/scripts/script-main.js deleted file mode 100644 index e69de29..0000000 From b01a2fee0ad53c774583ea8987cf3dee36789ec3 Mon Sep 17 00:00:00 2001 From: gitfreeking Date: Thu, 1 May 2025 00:29:00 +0200 Subject: [PATCH 08/13] =?UTF-8?q?Css=20angepasst.=20Login/Ausloggen=20funk?= =?UTF-8?q?tionen=20hinzugef=C3=BCgt.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/bestellformular/bestellformular.html | 21 +++++++++++++++++---- static/Styles/styles-main.css | 6 ------ 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/public/bestellformular/bestellformular.html b/public/bestellformular/bestellformular.html index f45469d..1608d2b 100644 --- a/public/bestellformular/bestellformular.html +++ b/public/bestellformular/bestellformular.html @@ -19,13 +19,13 @@

Bestellformular

- + - + - + @@ -60,10 +60,23 @@ const kundenNrInput = document.getElementById('KundenNr'); const VornameInput = document.getElementById('Vorname'); const NachnameInput = document.getElementById('Nachname'); - if (kundenNrInput, VornameInput, NachnameInput) { + + const isLoggedIn = user_id && vorname && nachname; + + if (isLoggedIn) { kundenNrInput.value = user_id; VornameInput.value = vorname; NachnameInput.value = nachname; + + // Felder sperren, damit sie nicht bearbeitet werden können + kundenNrInput.readOnly = true; + VornameInput.readOnly = true; + NachnameInput.readOnly = true; + } else { + // Felder leer lassen & bearbeitbar + kundenNrInput.readOnly = false; + VornameInput.readOnly = false; + NachnameInput.readOnly = false; } console.log("User ID from sessionStorage:", user_id); diff --git a/static/Styles/styles-main.css b/static/Styles/styles-main.css index 5ac7c35..1f12e2b 100644 --- a/static/Styles/styles-main.css +++ b/static/Styles/styles-main.css @@ -581,12 +581,6 @@ input[type="text"]:focus, input[type="number"]:focus { background-color: #e95b00; } -#KundenNr, #Vorname, #Nachname { - background-color: #f5f5f5; - border: none; - cursor: not-allowed; -} - @media (max-width: 768px) { .ArtikelNrText, .StueckzahlText { width: 100%; From bef2da62d4c7d37149c232e3e924319ec40ba324 Mon Sep 17 00:00:00 2001 From: gitfreeking Date: Thu, 1 May 2025 09:00:43 +0200 Subject: [PATCH 09/13] =?UTF-8?q?Route=20Kommentare=20hinzugef=C3=BCgt.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/bestellformular/bestellformular.html | 1 + scripts/routes/other/route-index.js | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/public/bestellformular/bestellformular.html b/public/bestellformular/bestellformular.html index 1608d2b..1e990b5 100644 --- a/public/bestellformular/bestellformular.html +++ b/public/bestellformular/bestellformular.html @@ -190,6 +190,7 @@ } + diff --git a/scripts/routes/other/route-index.js b/scripts/routes/other/route-index.js index 6ba00d0..a059c66 100644 --- a/scripts/routes/other/route-index.js +++ b/scripts/routes/other/route-index.js @@ -16,7 +16,7 @@ router.get('/registrieren', (req, res) => { res.sendFile(path.join(__dirname, '../../../public/registrieren/registrieren.html')); }) -// Route - HeaderFooter +// Route - HeaderFooter Skript router.get('/header_footer', (req, res) => { res.sendFile(path.join(__dirname, '../../../scripts/einfügenHeaderFooter.js')); }) @@ -66,13 +66,14 @@ router.get('/bestellformular', (req, res) => { res.sendFile(path.join(__dirname, '../../../public/bestellformular/bestellformular.html')); }) +// Route - Bestellungen router.get('/bestellung', (req, res) => { res.sendFile(path.join(__dirname, '../../../public/bestellung/bestellung.html')); }) +// Route - Kontaktformular router.get('/kontaktformular', (req, res) => { res.sendFile(path.join(__dirname, '../../../public/kontaktformular/kontaktformular.html')); }) - module.exports = router; \ No newline at end of file From 286ffda45779addfa5abdb515cddd99891a49d6d Mon Sep 17 00:00:00 2001 From: vextv Date: Thu, 1 May 2025 12:10:41 +0200 Subject: [PATCH 10/13] Merge remote-tracking branch 'origin/develop' into login_function # Conflicts: # public/registrieren/registrieren.html - Cleaned up code - Passwords are now encrypted in the database. Passwords of all pregenerated useres is "changeme" --- database/db_scripts/webshop_test-data.sql | 40 +++---- server.js | 125 ++++++++++++---------- 2 files changed, 90 insertions(+), 75 deletions(-) diff --git a/database/db_scripts/webshop_test-data.sql b/database/db_scripts/webshop_test-data.sql index d94c6b2..7a6c973 100644 --- a/database/db_scripts/webshop_test-data.sql +++ b/database/db_scripts/webshop_test-data.sql @@ -26,45 +26,45 @@ VALUES (5, 'Holiday Deal', 'Description for Holiday Deal', 20, TRUE); -- Users INSERT INTO user (id, name, lower_name, email, passwd, passwd_hash_algo, is_admin) -VALUES (1, 'User1', LOWER('User1'), 'user1@example.com', 'password123', 'bcrypt', FALSE); +VALUES (1, 'User1', LOWER('User1'), 'user1@example.com', '$2b$10$EUsWCS278AwwfZ9K7G4fkellUSPGAOs0hhXkIDbakVGJYE72mNMAC', 'bcrypt', FALSE); INSERT INTO user (id, name, lower_name, email, passwd, passwd_hash_algo, is_admin) -VALUES (2, 'User2', LOWER('User2'), 'user2@example.com', 'password123', 'bcrypt', FALSE); +VALUES (2, 'User2', LOWER('User2'), 'user2@example.com', '$2b$10$EUsWCS278AwwfZ9K7G4fkellUSPGAOs0hhXkIDbakVGJYE72mNMAC', 'bcrypt', FALSE); INSERT INTO user (id, name, lower_name, email, passwd, passwd_hash_algo, is_admin) -VALUES (3, 'User3', LOWER('User3'), 'user3@example.com', 'password123', 'bcrypt', FALSE); +VALUES (3, 'User3', LOWER('User3'), 'user3@example.com', '$2b$10$EUsWCS278AwwfZ9K7G4fkellUSPGAOs0hhXkIDbakVGJYE72mNMAC', 'bcrypt', FALSE); INSERT INTO user (id, name, lower_name, email, passwd, passwd_hash_algo, is_admin) -VALUES (4, 'User4', LOWER('User4'), 'user4@example.com', 'password123', 'bcrypt', FALSE); +VALUES (4, 'User4', LOWER('User4'), 'user4@example.com', '$2b$10$EUsWCS278AwwfZ9K7G4fkellUSPGAOs0hhXkIDbakVGJYE72mNMAC', 'bcrypt', FALSE); INSERT INTO user (id, name, lower_name, email, passwd, passwd_hash_algo, is_admin) -VALUES (5, 'User5', LOWER('User5'), 'user5@example.com', 'password123', 'bcrypt', FALSE); +VALUES (5, 'User5', LOWER('User5'), 'user5@example.com', '$2b$10$EUsWCS278AwwfZ9K7G4fkellUSPGAOs0hhXkIDbakVGJYE72mNMAC', 'bcrypt', FALSE); INSERT INTO user (id, name, lower_name, email, passwd, passwd_hash_algo, is_admin) -VALUES (6, 'User6', LOWER('User6'), 'user6@example.com', 'password123', 'bcrypt', FALSE); +VALUES (6, 'User6', LOWER('User6'), 'user6@example.com', '$2b$10$EUsWCS278AwwfZ9K7G4fkellUSPGAOs0hhXkIDbakVGJYE72mNMAC', 'bcrypt', FALSE); INSERT INTO user (id, name, lower_name, email, passwd, passwd_hash_algo, is_admin) -VALUES (7, 'User7', LOWER('User7'), 'user7@example.com', 'password123', 'bcrypt', FALSE); +VALUES (7, 'User7', LOWER('User7'), 'user7@example.com', '$2b$10$EUsWCS278AwwfZ9K7G4fkellUSPGAOs0hhXkIDbakVGJYE72mNMAC', 'bcrypt', FALSE); INSERT INTO user (id, name, lower_name, email, passwd, passwd_hash_algo, is_admin) -VALUES (8, 'User8', LOWER('User8'), 'user8@example.com', 'password123', 'bcrypt', FALSE); +VALUES (8, 'User8', LOWER('User8'), 'user8@example.com', '$2b$10$EUsWCS278AwwfZ9K7G4fkellUSPGAOs0hhXkIDbakVGJYE72mNMAC', 'bcrypt', FALSE); INSERT INTO user (id, name, lower_name, email, passwd, passwd_hash_algo, is_admin) -VALUES (9, 'User9', LOWER('User9'), 'user9@example.com', 'password123', 'bcrypt', FALSE); +VALUES (9, 'User9', LOWER('User9'), 'user9@example.com', '$2b$10$EUsWCS278AwwfZ9K7G4fkellUSPGAOs0hhXkIDbakVGJYE72mNMAC', 'bcrypt', FALSE); INSERT INTO user (id, name, lower_name, email, passwd, passwd_hash_algo, is_admin) -VALUES (10, 'User10', LOWER('User10'), 'user10@example.com', 'password123', 'bcrypt', FALSE); +VALUES (10, 'User10', LOWER('User10'), 'user10@example.com', '$2b$10$EUsWCS278AwwfZ9K7G4fkellUSPGAOs0hhXkIDbakVGJYE72mNMAC', 'bcrypt', FALSE); INSERT INTO user (id, name, lower_name, email, passwd, passwd_hash_algo, is_admin) -VALUES (11, 'User11', LOWER('User11'), 'user11@example.com', 'password123', 'bcrypt', FALSE); +VALUES (11, 'User11', LOWER('User11'), 'user11@example.com', '$2b$10$EUsWCS278AwwfZ9K7G4fkellUSPGAOs0hhXkIDbakVGJYE72mNMAC', 'bcrypt', FALSE); INSERT INTO user (id, name, lower_name, email, passwd, passwd_hash_algo, is_admin) -VALUES (12, 'User12', LOWER('User12'), 'user12@example.com', 'password123', 'bcrypt', FALSE); +VALUES (12, 'User12', LOWER('User12'), 'user12@example.com', '$2b$10$EUsWCS278AwwfZ9K7G4fkellUSPGAOs0hhXkIDbakVGJYE72mNMAC', 'bcrypt', FALSE); INSERT INTO user (id, name, lower_name, email, passwd, passwd_hash_algo, is_admin) -VALUES (13, 'User13', LOWER('User13'), 'user13@example.com', 'password123', 'bcrypt', FALSE); +VALUES (13, 'User13', LOWER('User13'), 'user13@example.com', '$2b$10$EUsWCS278AwwfZ9K7G4fkellUSPGAOs0hhXkIDbakVGJYE72mNMAC', 'bcrypt', FALSE); INSERT INTO user (id, name, lower_name, email, passwd, passwd_hash_algo, is_admin) -VALUES (14, 'User14', LOWER('User14'), 'user14@example.com', 'password123', 'bcrypt', FALSE); +VALUES (14, 'User14', LOWER('User14'), 'user14@example.com', '$2b$10$EUsWCS278AwwfZ9K7G4fkellUSPGAOs0hhXkIDbakVGJYE72mNMAC', 'bcrypt', FALSE); INSERT INTO user (id, name, lower_name, email, passwd, passwd_hash_algo, is_admin) -VALUES (15, 'User15', LOWER('User15'), 'user15@example.com', 'password123', 'bcrypt', FALSE); +VALUES (15, 'User15', LOWER('User15'), 'user15@example.com', '$2b$10$EUsWCS278AwwfZ9K7G4fkellUSPGAOs0hhXkIDbakVGJYE72mNMAC', 'bcrypt', FALSE); INSERT INTO user (id, name, lower_name, email, passwd, passwd_hash_algo, is_admin) -VALUES (16, 'User16', LOWER('User16'), 'user16@example.com', 'password123', 'bcrypt', FALSE); +VALUES (16, 'User16', LOWER('User16'), 'user16@example.com', '$2b$10$EUsWCS278AwwfZ9K7G4fkellUSPGAOs0hhXkIDbakVGJYE72mNMAC', 'bcrypt', FALSE); INSERT INTO user (id, name, lower_name, email, passwd, passwd_hash_algo, is_admin) -VALUES (17, 'User17', LOWER('User17'), 'user17@example.com', 'password123', 'bcrypt', FALSE); +VALUES (17, 'User17', LOWER('User17'), 'user17@example.com', '$2b$10$EUsWCS278AwwfZ9K7G4fkellUSPGAOs0hhXkIDbakVGJYE72mNMAC', 'bcrypt', FALSE); INSERT INTO user (id, name, lower_name, email, passwd, passwd_hash_algo, is_admin) -VALUES (18, 'User18', LOWER('User18'), 'user18@example.com', 'password123', 'bcrypt', FALSE); +VALUES (18, 'User18', LOWER('User18'), 'user18@example.com', '$2b$10$EUsWCS278AwwfZ9K7G4fkellUSPGAOs0hhXkIDbakVGJYE72mNMAC', 'bcrypt', FALSE); INSERT INTO user (id, name, lower_name, email, passwd, passwd_hash_algo, is_admin) -VALUES (19, 'User19', LOWER('User19'), 'user19@example.com', 'password123', 'bcrypt',FALSE); +VALUES (19, 'User19', LOWER('User19'), 'user19@example.com', '$2b$10$EUsWCS278AwwfZ9K7G4fkellUSPGAOs0hhXkIDbakVGJYE72mNMAC', 'bcrypt',FALSE); INSERT INTO user (id, name, lower_name, email, passwd, passwd_hash_algo, is_admin) -VALUES (20, 'User20', LOWER('User20'), 'user20@example.com', 'password123', 'bcrypt', FALSE); +VALUES (20, 'User20', LOWER('User20'), 'user20@example.com', '$2b$10$EUsWCS278AwwfZ9K7G4fkellUSPGAOs0hhXkIDbakVGJYE72mNMAC', 'bcrypt', FALSE); -- User Addresses INSERT INTO user_address (user_id, address_line1, address_line2, city, postal_code, country, telephone) diff --git a/server.js b/server.js index 5ef778c..1aee010 100644 --- a/server.js +++ b/server.js @@ -2,6 +2,7 @@ const express = require('express'); const session = require('express-session'); const router = require('express').Router(); const path = require('path'); +const bcrypt = require('bcrypt') require('dotenv').config({path: 'process.env'}); @@ -132,59 +133,77 @@ app.get('/api/products/sportwagen', async (req, res) => { }); }); -app.post('/api/user/registration', (req, res) => { +app.post('/api/user/registration', async (req, res) => { // SQL-Query für Nutzerregistration const {name, lower_name, email, passwd} = req.body; - const sql = "INSERT INTO webshop.user (name, lower_name, email, passwd, passwd_hash_algo) VALUES (?, ?, ?, ?, 'none')" + try { + const hashedPassword = await bcrypt.hash(passwd, 10) - // Query abschicken - db.query(sql, [name, lower_name, email, passwd], (err, results) => { - if (err) { - if (err.code === 'ER_DUP_ENTRY'){ - res.status(409).json({message: 'Diese E-Mail Adresse ist bereits registriert.'}) + const sql = "INSERT INTO webshop.user (name, lower_name, email, passwd, passwd_hash_algo) VALUES (?, ?, ?, ?, 'bcrypt')" + + // Query abschicken + db.query(sql, [name, lower_name, email, hashedPassword], (err, results) => { + if (err) { + if (err.code === 'ER_DUP_ENTRY') { + res.status(409).json({message: 'Diese E-Mail Adresse ist bereits registriert.'}) + } + console.error('Fehler beim Schreiben in die Datenbank: ', err); + res.status(500).send('Fehler beim Schreiben in die Datenbank'); + return; } - console.error('Fehler beim Schreiben in die Datenbank: ', err); - res.status(500).send('Fehler beim Schreiben in die Datenbank'); - return; - } - res.status(201).json({message: 'Nutzer erfolgreich hinzugefügt', id: results.insertId}) - }) + res.status(201).json({message: 'Nutzer erfolgreich hinzugefügt', id: results.insertId}) + }) + } catch (error) { + console.error('Hashing-Fehler: ', error) + res.status(500).json({message: 'Fehler bei der Verarbeitung'}) + } }) app.post('/api/user/login', (req, res) => { const {email, password} = req.body - const sql = 'SELECT * FROM webshop.user WHERE email = ?' + const sql = 'SELECT id, email, name, lower_name, passwd FROM webshop.user WHERE email = ?' - db.query(sql, [email], (err, results) => { + db.query(sql, [email], async (err, results) => { if (err) { console.error('Fehler beim Abrufen des Nutzers: ', err) return res.status(500).json({message: 'Serverfehler'}) } if (results.length === 0) { - return res.status(401).json({message: 'E-Mail nicht gefunden'}) + return res.status(401).json({message: 'E-Mail oder Passwort ist ungültig.'}) } + const user = results[0] - if (user.passwd !== password) { - return res.status(401).json({message: 'Falsches Passwort'}) + try { + // Vergleiche gegebenes Passwort mit gespeichertem verschlüsseltem Passwort + const passwordMatch = await bcrypt.compare(password, user.passwd) + + if (!passwordMatch) { + return res.status(401).json({message: 'E-Mail oder Passwort ist ungültig.'}) + } + + req.session.userId = user.id; + req.session.email = user.email; + req.session.vorname = user.name; + req.session.nachname = user.lower_name; + + // bei erfolgreichem Login Daten ans Frontend geben + res.json({message: 'Login erfolgreich', id: user.id, name: user.name, lower_name: user.lower_name}) + + } catch (compareError) { + console.error('Fehler beim Verarbeiten der Anfrage: ', compareError) + return res.status(500).json({message: 'Serverfehler bei der Anmeldung'}) } - - req.session.userId = user.id; - req.session.email = user.email; - req.session.vorname = user.name; - req.session.nachname = user.lower_name; - - res.json({message: 'Login erfolgreich', id: user.id, name: user.name, lower_name: user.lower_name}) }) }) app.post('/api/bestellung', (req, res) => { - const { user_id, produkte } = req.body; + const {user_id, produkte} = req.body; // produkte erwartet als Array: [{product_id: 1, quantity: 2}, {product_id: 5, quantity: 1}, ...] if (!user_id || !Array.isArray(produkte) || produkte.length === 0) { - return res.status(400).json({ message: 'Ungültige Anfrage: user_id oder Produkte fehlen.' }); + return res.status(400).json({message: 'Ungültige Anfrage: user_id oder Produkte fehlen.'}); } // Preise der Produkte abrufen @@ -194,11 +213,11 @@ app.post('/api/bestellung', (req, res) => { db.query(priceQuery, [productIds], (err, priceResults) => { if (err) { console.error('Fehler beim Abrufen der Produktpreise:', err); - return res.status(500).json({ message: 'Serverfehler beim Abrufen der Produktpreise.' }); + return res.status(500).json({message: 'Serverfehler beim Abrufen der Produktpreise.'}); } if (priceResults.length !== productIds.length) { - return res.status(400).json({ message: 'Eines oder mehrere Produkte existieren nicht.' }); + return res.status(400).json({message: 'Eines oder mehrere Produkte existieren nicht.'}); } // Total berechnen @@ -216,7 +235,7 @@ app.post('/api/bestellung', (req, res) => { db.query(sqlOrder, [user_id, payment_id, total], (err1, result1) => { if (err1) { console.error('Fehler beim Erstellen der Bestellung:', err1); - return res.status(500).json({ message: 'Fehler beim Erstellen der Bestellung.' }); + return res.status(500).json({message: 'Fehler beim Erstellen der Bestellung.'}); } const orderId = result1.insertId; @@ -227,46 +246,42 @@ app.post('/api/bestellung', (req, res) => { db.query(sqlItems, [values], (err2, result2) => { if (err2) { console.error('Fehler beim Einfügen der Order-Items:', err2); - return res.status(500).json({ message: 'Fehler beim Hinzufügen der Produkte zur Bestellung.' }); + return res.status(500).json({message: 'Fehler beim Hinzufügen der Produkte zur Bestellung.'}); } - res.status(201).json({ message: 'Bestellung erfolgreich!', order_id: orderId, total: total.toFixed(2) }); + res.status(201).json({message: 'Bestellung erfolgreich!', order_id: orderId, total: total.toFixed(2)}); }); }); }); }); app.post('/api/bestellung/daten', (req, res) => { - const { user_id } = req.body; + const {user_id} = req.body; const sql = ` - SELECT - od.id AS order_id, - od.total AS order_total, - oi.product_id, - oi.quantity, - p.name AS product_name, - p.price AS product_price - FROM - webshop.order_details od - INNER JOIN - webshop.order_items oi ON od.id = oi.order_id - INNER JOIN - webshop.product p ON oi.product_id = p.id - WHERE - od.user_id = ? - ORDER BY - od.id DESC + SELECT od.id AS order_id, + od.total AS order_total, + oi.product_id, + oi.quantity, + p.name AS product_name, + p.price AS product_price + FROM webshop.order_details od + INNER JOIN + webshop.order_items oi ON od.id = oi.order_id + INNER JOIN + webshop.product p ON oi.product_id = p.id + WHERE od.user_id = ? + ORDER BY od.id DESC `; db.query(sql, [user_id], (err, results) => { if (err) { console.error('Fehler beim Abrufen der Bestellungen: ', err); - return res.status(500).json({ message: 'Fehler beim Abrufen der Bestellungen' }); + return res.status(500).json({message: 'Fehler beim Abrufen der Bestellungen'}); } if (results.length === 0) { - return res.status(404).json({ message: 'Keine Bestellungen gefunden.' }); + return res.status(404).json({message: 'Keine Bestellungen gefunden.'}); } res.json(results); @@ -277,7 +292,7 @@ app.get('/api/pruefe-artikel', (req, res) => { const artikelnummer = req.query.nummer; if (!artikelnummer) { - return res.status(400).json({ error: 'Keine Artikelnummer angegeben.' }); + return res.status(400).json({error: 'Keine Artikelnummer angegeben.'}); } const query = 'SELECT id FROM webshop.product WHERE id = ?'; @@ -285,11 +300,11 @@ app.get('/api/pruefe-artikel', (req, res) => { db.query(query, [artikelnummer], (err, results) => { if (err) { console.error('Fehler bei der Artikelsuche:', err); - return res.status(500).json({ error: 'Serverfehler bei der Artikelsuche.' }); + return res.status(500).json({error: 'Serverfehler bei der Artikelsuche.'}); } const verfuegbar = results.length > 0; - res.json({ verfuegbar }); + res.json({verfuegbar}); }); }); From 535d6e0737072f1c4cef6ca965a41982a44002f0 Mon Sep 17 00:00:00 2001 From: vextv Date: Thu, 1 May 2025 14:55:53 +0200 Subject: [PATCH 11/13] - cleaned up and formatted code --- scripts/einfügenHeaderFooter.js | 12 ++++++------ server.js | 20 ++++++-------------- 2 files changed, 12 insertions(+), 20 deletions(-) diff --git a/scripts/einfügenHeaderFooter.js b/scripts/einfügenHeaderFooter.js index 4d008e7..c2690bc 100644 --- a/scripts/einfügenHeaderFooter.js +++ b/scripts/einfügenHeaderFooter.js @@ -24,6 +24,7 @@ document.addEventListener("DOMContentLoaded", () => { // WICHTIG: Jetzt den Warenkorb zählen, nachdem der Header geladen ist! zeigeWarenkorbAnzahl(); + // Login Status im UI anzeigen zeigeLoginStatus(); }) .catch(error => { @@ -60,14 +61,14 @@ document.addEventListener("DOMContentLoaded", () => { }); } - window.zeigeWarenkorbAnzahl = function() { + window.zeigeWarenkorbAnzahl = function () { const warenkorb = JSON.parse(localStorage.getItem('warenkorb')) || []; let anzahl = 0; - + warenkorb.forEach(produkt => { anzahl += produkt.quantity; }); - + const anzahlElement = document.getElementById('cart-count'); if (anzahlElement) { anzahlElement.textContent = anzahl; @@ -75,7 +76,7 @@ document.addEventListener("DOMContentLoaded", () => { console.log('Warenkorb-Anzahl:', anzahl); } - window.zeigeLoginStatus= function (){ + window.zeigeLoginStatus = function () { const userId = sessionStorage.getItem('user_id') const loginBtn = document.querySelector('.login-btn') @@ -90,11 +91,10 @@ document.addEventListener("DOMContentLoaded", () => { localStorage.clear() alert('Sie wurden ausgeloggt.') location.reload() - }) } else { loginBtn.textContent = 'Login' - loginBtn.href= '/login' + loginBtn.href = '/login' } } }); \ No newline at end of file diff --git a/server.js b/server.js index 1aee010..ac7c1b5 100644 --- a/server.js +++ b/server.js @@ -1,20 +1,15 @@ const express = require('express'); const session = require('express-session'); -const router = require('express').Router(); const path = require('path'); const bcrypt = require('bcrypt') +const mysql = require('mysql'); +const app = express(); require('dotenv').config({path: 'process.env'}); -const app = express(); -const mysql = require('mysql'); - // Datenbankverbindung const db = mysql.createConnection({ - host: 'localhost', - user: 'root', - password: '', - database: 'webshop' + host: 'localhost', user: 'root', password: '', database: 'webshop' }); // Verbindung zur MySQL-Datenbank herstellen @@ -27,9 +22,7 @@ db.connect(err => { }); app.use(session({ - secret: 'secret', - resave: true, - saveUninitialized: true + secret: 'secret', resave: true, saveUninitialized: true })); app.use(express.json()); @@ -243,7 +236,7 @@ app.post('/api/bestellung', (req, res) => { const values = produkte.map(p => [user_id, p.product_id, p.quantity, orderId]); const sqlItems = 'INSERT INTO webshop.order_items (user_id, product_id, quantity, order_id) VALUES ?'; - db.query(sqlItems, [values], (err2, result2) => { + db.query(sqlItems, [values], (err2) => { if (err2) { console.error('Fehler beim Einfügen der Order-Items:', err2); return res.status(500).json({message: 'Fehler beim Hinzufügen der Produkte zur Bestellung.'}); @@ -311,8 +304,7 @@ app.get('/api/pruefe-artikel', (req, res) => { const getIndexRoute = require('./scripts/routes/other/route-index'); app.use('/', getIndexRoute); -// Hier werden alle anderen Seiten abgefangen, die keine definierten Routen haben (404 Fehler) -// und gibt die 404.html aus. +// Hier werden alle anderen Seiten abgefangen, die keine definierten Routen haben (404 Fehler) und gibt die 404.html aus app.use((req, res) => { // Setzt den Statuscode auf 404 und sendet die '404.html'-Datei res.status(404).sendFile(path.join(__dirname, 'public', '404.html')); From 373d655baec6f7b788d4d505bde9f77740161036 Mon Sep 17 00:00:00 2001 From: vextv Date: Thu, 1 May 2025 15:07:23 +0200 Subject: [PATCH 12/13] - cleaned up and formatted code --- public/Warenkorb/warenkorb.html | 4 +- public/bestellformular/bestellformular.html | 7 +- public/bestellung/bestellung.html | 22 +++--- public/header_footer/header.html | 15 ++-- public/kontaktformular/kontaktformular.html | 81 +++++++++++---------- public/shop/shop.html | 6 +- public/shop/shop_lkw.html | 2 +- public/shop/shop_motorrad.html | 4 +- public/shop/shop_oldtimer.html | 6 +- public/shop/shop_sportwagen.html | 2 +- 10 files changed, 75 insertions(+), 74 deletions(-) diff --git a/public/Warenkorb/warenkorb.html b/public/Warenkorb/warenkorb.html index 9b36e08..13331ff 100644 --- a/public/Warenkorb/warenkorb.html +++ b/public/Warenkorb/warenkorb.html @@ -29,7 +29,7 @@ document.addEventListener('DOMContentLoaded', function () { ladeWarenkorb(); - document.getElementById('zurKasseGehen').addEventListener('click', function() { + document.getElementById('zurKasseGehen').addEventListener('click', function () { window.location.href = '/bestellformular'; // Deine Bestellformular-Seite }); }); @@ -116,6 +116,6 @@ localStorage.setItem('warenkorb', JSON.stringify(warenkorb)); ladeWarenkorb(); } - + diff --git a/public/bestellformular/bestellformular.html b/public/bestellformular/bestellformular.html index 1e990b5..d218cb3 100644 --- a/public/bestellformular/bestellformular.html +++ b/public/bestellformular/bestellformular.html @@ -24,7 +24,7 @@ - + @@ -36,7 +36,7 @@ - + Bestellung absenden @@ -56,7 +56,6 @@ document.addEventListener('DOMContentLoaded', function () { - const formular = document.getElementById('bestellform'); const kundenNrInput = document.getElementById('KundenNr'); const VornameInput = document.getElementById('Vorname'); const NachnameInput = document.getElementById('Nachname'); @@ -142,7 +141,7 @@ const result = await response.json(); if (response.ok) { - // Bestellung erfolgreich -> Weiterleitung + // Bestellung erfolgreich → Weiterleitung warenkorbLeeren(); window.location.href = "/bestellung"; } else { diff --git a/public/bestellung/bestellung.html b/public/bestellung/bestellung.html index 12a5b23..118b2ce 100644 --- a/public/bestellung/bestellung.html +++ b/public/bestellung/bestellung.html @@ -33,23 +33,23 @@ window.location.href = '/login'; return; } - + try { const response = await fetch('/api/bestellung/daten', { method: 'POST', headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ user_id: user_id }) + body: JSON.stringify({user_id: user_id}) }); - + if (response.ok) { const daten = await response.json(); const bestellungContainer = document.getElementById('bestellung'); bestellungContainer.innerHTML = ''; const bestellungen = {}; - + daten.forEach(item => { if (!bestellungen[item.order_id]) { bestellungen[item.order_id] = { @@ -68,24 +68,24 @@ const bestellung = bestellungen[orderId]; const bestellCard = document.createElement('div'); bestellCard.className = 'bestell-info-card'; - + let produkteHTML = ''; bestellung.produkte.forEach(produkt => { produkteHTML += `

• ${produkt.name} — ${produkt.quantity} Stück — Preis: ${produkt.preis.toFixed(2)} €

`; }); - + bestellCard.innerHTML = `

Bestellnummer: ${orderId}

${produkteHTML}

Gesamtsumme: ${bestellung.total.toFixed(2)} €

`; - + bestellungContainer.appendChild(bestellCard); } - + } else if (response.status === 404) { document.getElementById('bestellung').innerHTML = '

Keine Bestellungen gefunden.

'; } else { @@ -95,10 +95,10 @@ console.error('Fehler: ', error); } } - + window.addEventListener('DOMContentLoaded', ladeBestellung); - - + + diff --git a/public/header_footer/header.html b/public/header_footer/header.html index b83a6a1..06dddf7 100644 --- a/public/header_footer/header.html +++ b/public/header_footer/header.html @@ -1,6 +1,6 @@
@@ -24,7 +24,6 @@ 0 -
@@ -38,17 +37,17 @@ - + - + diff --git a/public/kontaktformular/kontaktformular.html b/public/kontaktformular/kontaktformular.html index c6481ff..be7748d 100644 --- a/public/kontaktformular/kontaktformular.html +++ b/public/kontaktformular/kontaktformular.html @@ -1,55 +1,58 @@ - - - Kontaktformular - - - + + + Kontaktformular + + +
- - + + -
-
-

Kontaktieren Sie uns

-

Sie haben Fragen oder Anregungen? Schreiben Sie uns – wir melden uns schnellstmöglich!

+
+
+

Kontaktieren Sie uns

+

Sie haben Fragen oder Anregungen? Schreiben Sie uns – wir melden uns + schnellstmöglich!

-
-
- - -
-
- - -
-
- - -
-
- -
- -
-
-
+
+
+ + +
+
+ + +
+
+ + +
+
+ +
+ +
+
+
- - + +
diff --git a/public/shop/shop.html b/public/shop/shop.html index 2d81b71..2cfcc38 100644 --- a/public/shop/shop.html +++ b/public/shop/shop.html @@ -33,12 +33,12 @@ - +