Compare commits

...

60 Commits

Author SHA1 Message Date
niklas.ortmann c62ff5b2c0 refactoring 2026-06-01 22:53:28 +02:00
niklas.ortmann ad422a134d refactoring 2026-06-01 22:52:42 +02:00
niklas.ortmann 9fce9ec8dd refactoring 2026-06-01 22:51:46 +02:00
niklas.ortmann a329137de2 refactoring 2026-06-01 22:48:39 +02:00
caroline.slt 21bdb0d66d Weitere Reviewänderungen 2026-05-31 22:53:58 +02:00
caroline.slt 5db4ad3e63 Weitere Reviewänderungen 2026-05-31 22:49:13 +02:00
caroline.slt 2ce13cef72 Weitere Reviewänderungen 2026-05-31 22:42:16 +02:00
caroline.slt 02551049e0 Weitere Reviewänderungen 2026-05-31 22:38:29 +02:00
caroline.slt 55e9fa6a20 Weitere Reviewänderungen 2026-05-31 22:34:11 +02:00
caroline.slt c82378baa8 Weitere Reviewänderungen 2026-05-31 22:26:39 +02:00
caroline.slt 541d5b4c5e Weitere Reviewänderungen 2026-05-31 22:21:50 +02:00
caroline.slt f9ab3f8db2 session start entfernt 2026-05-31 21:53:30 +02:00
caroline.slt 6c5047be30 Review Changes 2026-05-31 21:42:46 +02:00
caroline.slt 25f6d2bf4a Review Changes 2026-05-31 21:35:54 +02:00
caroline.slt 4d8f338649 DAO Pattern angepasst & Passwörter gehashed 2026-05-27 19:25:58 +02:00
caroline.slt 46a307a5b0 First Implementation 2026-05-26 23:14:12 +02:00
caroline.slt 7706c7dfbf First Implementation 2026-05-26 23:06:22 +02:00
caroline.slt a946cee891 First Implementation 2026-05-26 22:59:48 +02:00
caroline.slt 4d4b8aeb99 First Implementation 2026-05-26 00:20:34 +02:00
NOrtmann1 ee7986bef3 Update index.php 2026-05-21 21:03:38 +02:00
NOrtmann1 8de1b1bdb5 Update index.php 2026-05-21 21:02:46 +02:00
NOrtmann1 4a663391ef Update navbar.css 2026-05-21 21:00:20 +02:00
niklas.ortmann 4cd877ea4c Merge pull request 'PHP: Dynamischer Content' (#8) from PHP_DynamischerContent into dev
Reviewed-on: #8
2026-05-21 20:57:26 +02:00
NOrtmann1 0f573d30ae linkanpassungen 2026-05-21 17:36:18 +02:00
NOrtmann1 fdd56c10b8 Update home.php 2026-05-21 17:33:42 +02:00
NOrtmann1 46daf72a14 Update index.php 2026-05-21 17:32:43 +02:00
NOrtmann1 896e6abcd8 login & register -> /content/ 2026-05-21 17:31:45 +02:00
NOrtmann1 95e5cf0908 navbar linkanpassungen 2026-05-21 17:30:07 +02:00
NOrtmann1 be35a00cef Dateien in richtige Ordner + statische HTML vom content entfernt 2026-05-21 17:19:40 +02:00
NOrtmann1 b616251511 dynamic content test
profil wird dynamisch in die index.php integriert (Test)
2026-05-21 17:13:52 +02:00
NOrtmann1 3f5313dd00 Update 404.php 2026-05-19 14:49:06 +02:00
NOrtmann1 f909d0453b Update 404.php 2026-05-13 22:55:47 +02:00
NOrtmann1 d5f4f2b8a5 Update main.css 2026-05-13 22:53:32 +02:00
niklas.ortmann 87a8e9b7d2 Merge pull request 'designcss2 zu dev' (#7) from designcss2 into dev
Reviewed-on: #7
2026-05-13 22:50:24 +02:00
NOrtmann1 729b0f08a1 Update main.css 2026-05-13 22:49:57 +02:00
NOrtmann1 2907bcdd67 Update home.php 2026-05-13 22:44:23 +02:00
NOrtmann1 65935c644b Update profile.php 2026-05-13 22:09:59 +02:00
NOrtmann1 8645900035 Update profile.php 2026-05-13 22:09:25 +02:00
NOrtmann1 49a8d49296 logo aus login und register entfernt 2026-05-13 21:53:59 +02:00
NOrtmann1 bc1051e4a2 Update register.php 2026-05-13 21:50:06 +02:00
NOrtmann1 d8f8fbbdd4 Update login.php 2026-05-13 21:48:35 +02:00
NOrtmann1 baf3f88e1e Update login.php 2026-05-13 21:47:51 +02:00
NOrtmann1 480b6cd4ae Update 404.php 2026-05-13 18:43:35 +02:00
NOrtmann1 29b588babb testing... 2026-05-13 18:41:29 +02:00
NOrtmann1 a29e48efad Update main.css 2026-05-13 18:11:03 +02:00
NOrtmann1 84a9f7063a Merge branch 'navbar' into dev 2026-05-13 18:08:42 +02:00
niklas.ortmann 58f7be9d52 Merge pull request 'Last Implementation' (#6) from designcss into dev
Reviewed-on: #6
2026-05-13 18:00:19 +02:00
caroschulte02-alt d497ea4fc3 First Implementation 2026-05-13 16:29:31 +02:00
caroschulte02-alt 80316e080a First Implementation 2026-05-13 16:18:12 +02:00
viratex bf06df461d Merge pull request 'Home, sowie Login und Register Website haben nun CSS implementiert' (#5) from responsiveCSS into dev
Reviewed-on: #5
2026-05-13 15:14:37 +02:00
viratex 503df76d6b Merge branch 'dev' into responsiveCSS 2026-05-13 15:13:22 +02:00
rirat-0 829d532518 font weight anpassung 2026-05-13 14:31:14 +02:00
rirat-0 33b0283758 update der register seite 2026-05-13 13:27:23 +02:00
rirat-0 6abc244be7 anpassung der login seite und main css fuer accessibility 2026-05-13 12:48:35 +02:00
rirat-0 012e3b8b9b update css fuer login seite 2026-05-13 12:39:11 +02:00
rirat-0 9375ab90b0 update der login seite 2026-05-13 12:04:55 +02:00
niklas.ortmann 6198d7b9ae Merge pull request 'Fehlende CRUD-Operationen' (#3) from Fehlende-CRUD-Operationen into dev
Reviewed-on: #3
2026-05-13 12:04:38 +02:00
NOrtmann1 52bede8277 Update profile.php 2026-05-13 11:27:46 +02:00
rirat-0 b81216cef1 kleine fehler und farbe behoben 2026-05-12 18:03:37 +02:00
rirat-0 43f0c78b3d Napassung von home.php und der main.css fuer responsive design 2026-05-12 14:19:57 +02:00
29 changed files with 788 additions and 520 deletions
View File
Generated
+1
View File
@@ -10,6 +10,7 @@
<option name="highlightLevel" value="WARNING" />
<option name="transferred" value="true" />
</component>
<component name="PhpProjectSharedConfiguration" php_language_level="8.5" />
<component name="PhpStanOptionsConfiguration">
<option name="transferred" value="true" />
</component>
-41
View File
@@ -1,41 +0,0 @@
<!--
Seite: 404 Seite nicht gefunden
Funktion: Wenn eine Seite nicht gefunden wurde oder noch fehlt, dann wird hierauf verwiesen.
-->
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8">
<meta name="description" content="EduForge">
<meta name="author" content="Niklas Ortmann">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/x-icon" href="images/logos/logo_icon.ico">
<link rel="stylesheet" href="css/main.css">
<link rel="stylesheet" href="css/navbar.css">
<link rel="stylesheet" href="css/footer.css">
<title>EduForge</title>
</head>
<body>
<main>
<?php
include_once 'includes/navbar.php';
?>
<h1>404 - Seite nicht vorhanden</h1>
<p>
Später im Projekt sollen über index.php?pfad= ... der Inhalt der index.php dynamisch gesetzt werden.
Alle Content-Links der Navbar führen zunächst hier her. Exemplarisch wurden für die Fächer Informatik, Physik, Mathematik der Content als Seite erstellt und kann über die Navbar ausgekundschaftet werden.
</p>
</main>
<?php
include_once 'includes/footer.php';
?>
</body>
</html>
+12
View File
@@ -0,0 +1,12 @@
<!--
Seite: 404 Seite nicht gefunden
Funktion: Wenn eine Seite nicht gefunden wurde oder noch fehlt, dann wird hierauf verwiesen.
-->
<main>
<h1>404 - Seite nicht vorhanden</h1>
<p>
Später im Projekt sollen über index.php?pfad= ... der Inhalt der index.php dynamisch gesetzt werden.
Alle Content-Links der Navbar führen zunächst hier her. Exemplarisch wurden für die Fächer Informatik, Physik, Mathematik der Content als Seite erstellt und kann über die Navbar ausgekundschaftet werden.
</p>
</main>
@@ -2,28 +2,6 @@
Seite: Datenschutzerklärung
Inhalt: Informationen zur Datenverarbeitung gemäß DSGVO
-->
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8">
<meta name="description" content="EduForge">
<meta name="author" content="Niklas Ortmann">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/x-icon" href="images/logos/logo_icon.ico">
<link rel="stylesheet" href="css/main.css">
<link rel="stylesheet" href="css/navbar.css">
<link rel="stylesheet" href="css/footer.css">
<title>EduForge</title>
</head>
<body>
<?php
include_once 'includes/navbar.php';
?>
<main>
<h1>Datenschutz</h1>
@@ -38,10 +16,3 @@ include_once 'includes/navbar.php';
</p>
</main>
<?php
include_once 'includes/footer.php';
?>
</body>
</html>
+19
View File
@@ -0,0 +1,19 @@
<?php
require_once "php/model/LocalUserDAO.php";
$dao = new LocalUserDAO();
/*
Deregistrierung
Funktion: Entfernt User aus Dummy-Daten und beendet Session
*/
if (isset($_SESSION["user_email"])) {
$dao->deleteUser($_SESSION["user_email"]);
}
$_SESSION = [];
session_destroy();
header("Location: index.php");
exit();
+23 -17
View File
@@ -13,22 +13,28 @@
sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no
sea takimata sanctus est Lorem ipsum dolor sit amet.
</p>
<div>
<a href = "informatik.php" style = "padding: 5px; text-align: center; text-decoration: none; display: inline-block;"><b>Informatik</b></a> <br>
<div>
<a href="datenschutzVSdatensicherheit.php">Datenschutz vs. Datensicherheit</a>
</div>
</div>
<div>
<a href = "mathe.php" style = "padding: 5px; text-align: center; text-decoration: none; display: inline-block;"><b>Mathe</b></a> <br>
<div>
<a href="pythagoras.php">Satz des Pythagoras</a>
</div>
</div>
<div>
<a href = "physik.php" style = "padding: 5px; text-align: center; text-decoration: none; display: inline-block;"><b>Physik</b></a>
<div>
<a href="tunneleffekt.php">Der Tunneleffekt</a>
</div>
<!-- Flexbox -->
<div class="flexbox">
<div class="container">
<a href="index.php?pfad=informatik" class="category-link">Informatik</a>
<div class="article-link">
<a href="datenschutzVSdatensicherheit.php">Datenschutz vs. Datensicherheit</a>
</div>
</div>
<div class="container">
<a href="index.php?pfad=mathe" class="category-link">Mathe</a>
<div class="article-link">
<a href="pythagoras.php">Satz des Pythagoras</a>
</div>
</div>
<div class="container">
<a href="index.php?pfad=physik" class="category-link">Physik</a>
<div class="article-link">
<a href="tunneleffekt.php">Der Tunneleffekt</a>
</div>
</div>
</div>
</main>
-28
View File
@@ -2,27 +2,6 @@
Seite: Impressum
Inhalt: wer wie was auf der Webseite
-->
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8">
<meta name="description" content="EduForge">
<meta name="author" content="Niklas Ortmann">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/x-icon" href="images/logos/logo_icon.ico">
<link rel="stylesheet" href="css/main.css">
<link rel="stylesheet" href="css/navbar.css">
<link rel="stylesheet" href="css/footer.css">
<title>EduForge</title>
</head>
<body>
<?php
include_once 'includes/navbar.php';
?>
<main>
@@ -38,10 +17,3 @@ include_once 'includes/navbar.php';
</p>
</main>
<?php
include_once 'includes/footer.php';
?>
</body>
</html>
-27
View File
@@ -2,26 +2,6 @@
Seite: Informatik
Inhalt: Eine Übersicht über alle Beiträge zum Fach
-->
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8">
<meta name="description" content="EduForge">
<meta name="author" content="Niklas Ortmann">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/x-icon" href="images/logos/logo_icon.ico">
<link rel="stylesheet" href="css/main.css">
<link rel="stylesheet" href="css/navbar.css">
<link rel="stylesheet" href="css/footer.css">
<title>EduForge</title>
</head>
<body>
<?php
include_once 'includes/navbar.php';
?>
<main>
<h1>Informatik</h1>
@@ -39,10 +19,3 @@ include_once 'includes/navbar.php';
<a href="datenschutzVSdatensicherheit.php">Datenschutz vs. Datensicherheit</a>
</div>
</main>
<?php
include_once 'includes/footer.php';
?>
</body>
</html>
+53
View File
@@ -0,0 +1,53 @@
<?php
$error = $error ?? null;
?>
<!--
Form: Login-Bereich
Funktion: Benutzerauthentifizierung und Zugang zum eigenen Profil, Erstellen von Beiträgen, etc.
-->
<main class="login-page">
<div class="login-container">
<h1>Bitte anmelden</h1>
<?php if ($error): ?>
<p style="color:red;">
<?php echo htmlspecialchars($error); ?>
</p>
<?php endif; ?>
<form method="post" action="index.php?pfad=login">
<p class="input-label">Benutzername/E-Mail-Adresse:</p>
<input type="email"
name="email"
class="login-input"
placeholder="E-Mail-Adresse"
required
autofocus>
<p class="input-label">Passwort:</p>
<input type="password"
name="password"
class="login-input"
placeholder="Passwort"
required>
<button type="submit"
value="anmelden"
name="loginSubmit"
class="login-button">
anmelden
</button>
<div class="register-link">
<a href="index.php?pfad=register">
Noch keinen Account? Jetzt hier registrieren!
</a>
</div>
</form>
</div>
</main>
+6
View File
@@ -0,0 +1,6 @@
<?php
$_SESSION = [];
session_destroy();
header("Location: index.php");
exit();
+1 -29
View File
@@ -2,27 +2,6 @@
Seite: Mathe
Inhalt: Eine Übersicht über alle Beiträge zum Fach
-->
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8">
<meta name="description" content="EduForge">
<meta name="author" content="Niklas Ortmann">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/x-icon" href="images/logos/logo_icon.ico">
<link rel="stylesheet" href="css/main.css">
<link rel="stylesheet" href="css/navbar.css">
<link rel="stylesheet" href="css/footer.css">
<title>EduForge</title>
</head>
<body>
<?php
include_once 'includes/navbar.php';
?>
<main>
<h1>Mathe</h1>
@@ -40,11 +19,4 @@ include_once 'includes/navbar.php';
<div>
<a href="pythagoras.php">Satz des Pythagoras</a>
</div>
</main>
<?php
include_once 'includes/footer.php';
?>
</body>
</html>
</main>
+1 -29
View File
@@ -2,27 +2,6 @@
Seite: Physik
Inhalt: Eine Übersicht über alle Beiträge zum Fach
-->
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8">
<meta name="description" content="EduForge">
<meta name="author" content="Niklas Ortmann">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/x-icon" href="images/logos/logo_icon.ico">
<link rel="stylesheet" href="css/main.css">
<link rel="stylesheet" href="css/navbar.css">
<link rel="stylesheet" href="css/footer.css">
<title>EduForge</title>
</head>
<body>
<?php
include_once 'includes/navbar.php';
?>
<main>
<h1>Physik</h1>
@@ -41,11 +20,4 @@ include_once 'includes/navbar.php';
<a href="tunneleffekt.php">Der Tunneleffekt</a>
</div>
</main>
<?php
include_once 'includes/footer.php';
?>
</body>
</html>
</main>
+45
View File
@@ -0,0 +1,45 @@
<?php
include_once 'php/controller/profile-controller.php';
$user = $user ?? null;
?>
<main class="form-page">
<div class="form-container">
<h1>Mein Profil</h1>
<form>
<label class="input-label">Name</label>
<input type="text"
class="login-input"
readonly
value="<?php echo htmlspecialchars($user["username"] ?? ""); ?>">
<label class="input-label">Email-Adresse</label>
<input type="email"
class="login-input"
readonly
value="<?php echo htmlspecialchars($user["email"] ?? ""); ?>">
<label class="input-label">Passwort</label>
<input type="password"
class="login-input"
readonly
value="********">
</form>
<br>
<a href="index.php?pfad=deleteAccount" class="login-button">
Account löschen
</a>
<br><br>
<a href="index.php?pfad=logout" class="login-button">
Abmelden
</a>
</div>
</main>
+62
View File
@@ -0,0 +1,62 @@
<?php
include_once 'php/controller/register-controller.php';
$error = $error ?? null;
?>
<!--
Form: Registrierung
Funktion: Erstellung neuer Benutzerkonten
-->
<main class="login-page">
<div class="login-container">
<h1>Jetzt Registrieren!</h1>
<?php if ($error): ?>
<p style="color:red;">
<?php echo htmlspecialchars($error); ?>
</p>
<?php endif; ?>
<form method="post" action="index.php?pfad=register">
<p class="input-label">Email:</p>
<input type="email"
name="email"
class="login-input"
placeholder="mustermann@web.de"
required>
<p class="input-label">Vorname:</p>
<input type="text"
name="vorname"
class="login-input"
placeholder="Max"
required>
<p class="input-label">Nachname:</p>
<input type="text"
name="nachname"
class="login-input"
placeholder="Mustermann"
required>
<p class="input-label">Passwort:</p>
<input type="password"
name="password"
class="login-input"
placeholder="Passwort"
required>
<button type="submit"
value="register"
name="registerSubmit"
class="login-button">
kostenlos registrieren
</button>
</form>
</div>
</main>
+203 -5
View File
@@ -1,7 +1,205 @@
body {
background-color: coral;
main {
max-width:1200px;
margin: 0 auto;
padding: 20px;
}
a, button, input, select, textarea, label{
font-family: Arial, Helvetica, sans-serif;
}
body {
background-color: #eef2f7;
color: #1f2937;
margin: 0;
}
a, button, input, select, textarea, label, main{
font-family: Arial, Helvetica, sans-serif;
}
.flexbox {
display: flex;
flex-direction: column;
gap: 20px;
margin-top: 30px;
}
.container {
background-color: white;
border-radius: 8px;
padding: 15px;
border: 1px solid #dbe3ec;
box-shadow: 0 4px 12px rgba(0,0,0,0.08);
transition: transform 0.2s, box-shadow 0.2s;
}
.container:hover {
transform: translateY(-3px);
box-shadow: 0 6px 18px rgba(0,0,0,0.12);
}
.category-link {
display: block;
text-align: left;
text-decoration: none;
font-weight: bold;
padding: 12px;
background-color: #2563eb;
color: white;
border-radius: 8px;
margin-bottom: 10px;
transition: background-color 0.2s, transform 0.2s, box-shadow 0.2s;
}
.category-link:hover {
background-color: #1d4ed8;
transform: translateY(-2px);
box-shadow: 0 4px 10px rgba(0,0,0,0.15);
}
.article-link a {
color: #1f2937;
text-decoration: none;
font-weight: bold;
transition: color 0.2s;
}
.article-link a:hover {
color: #2563eb;
text-decoration: underline;
}
@media (min-width: 1024px) {
.container {
padding: 25px;
}
}
/* Seite wird horizontal und vertikal zentriert */
.login-page {
display: flex;
justify-content: center;
align-items: center;
min-height: 80vh;
}
.login-container {
width: 90%;
max-width: 450px;
padding: 30px;
border: 1px solid #dbe3ec;
border-radius: 10px;
background-color: white;
box-shadow: 0 6px 20px rgba(0,0,0,0.1);
}
.logo-wrapper {
text-align: center;
margin-bottom: 20px;
}
.login-logo {
width: 120px;
height: auto;
}
.login-container h1 {
text-align: center;
margin-bottom: 25px;
font-size: 1.7rem;
color: #1e293b;
}
.input-label {
margin-bottom: 5px;
font-weight: bold;
width: 100%;
color: #1f2937;
}
.input-label {
margin-bottom: 5px;
font-weight: bold;
width: 100%;
color: #1f2937;
}
.login-input {
width: 100%;
padding: 12px;
margin-bottom: 20px;
border: 1px solid #d1d5db;
border-radius: 6px;
box-sizing: border-box;
font-size: 1rem;
background-color: white;
}
.login-input:focus {
outline: none;
border-color: #2563eb;
box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.15);
}
.checkbox-wrapper {
margin-bottom: 20px;
color: #1f2937;
}
.login-button {
width: 100%;
padding: 12px;
background-color: #2563eb;
color: white;
border: none;
border-radius: 8px;
font-size: 1rem;
font-weight: bold;
cursor: pointer;
transition: background-color 0.2s, transform 0.2s, box-shadow 0.2s;
}
.login-button:hover {
background-color: #1d4ed8;
transform: translateY(-2px);
box-shadow: 0 4px 10px rgba(0,0,0,0.15);
}
.register-link {
margin-top: 20px;
text-align: center;
font-size: 0.9rem;
color: #1f2937;
}
.register-link a {
color: #2563eb;
text-decoration: none;
font-weight: bold;
transition: color 0.2s;
}
.register-link a:hover {
color: #1d4ed8;
text-decoration: underline;
}
/* Versteckt das doppelte Label fuer Screenreader/Accessibility */
.screenreader-only {
display: none;
}
/* Allgemeine Formularseiten */
.form-page {
display: flex;
justify-content: center;
padding: 40px 20px;
}
.form-container {
width: 90%;
max-width: 600px;
padding: 30px;
background-color: white;
border: 1px solid #dbe3ec;
border-radius: 10px;
box-shadow: 0 6px 20px rgba(0,0,0,0.1);
}
+2 -2
View File
@@ -149,8 +149,8 @@ CSS für die navbar
display: none;
}
/* Responsive Anpassungen unter 660px (für z.B. Smartphones) */
@media (max-width: 660px) {
/* Responsive Anpassungen unter 760px (für z.B. Smartphones) */
@media (max-width: 760px) {
.nav {
flex-direction: row;
flex-wrap: wrap;
+1
View File
@@ -0,0 +1 @@
[]
+106 -66
View File
@@ -1,70 +1,84 @@
<?php
session_start();
?>
<!--
Globales Menü, wird via PHP später in alle Seiten eingebunden
-->
<nav class="nav">
<div class="nav__left">
<a href="index.php" class="nav__logo">
<img src="images/logos/logo_full.png" alt="Logo">
</a>
<img src="images/logos/logo_full.png" alt="Logo">
</a>
</div>
<!-- Mobile navbar mit Burger-Symbol -->
<input type="checkbox" id="nav-toggle" class="nav__checkbox">
<label for="nav-toggle" id="mobile-nav">
<span></span> <!-- Burger Icon Symbol -->
<span>☰</span>
</label>
<ul id="mobile-nav" class="nav__mobile-menu">
<li><a href="profile.php">Profil</a></li>
<li><a href="login.php">Anmelden</a></li>
<li><a href="register.php">Registrieren</a></li>
<?php if (isset($_SESSION['user'])): ?>
<li><a href="index.php?pfad=profile">Profil</a></li>
<li><a href="index.php?pfad=logout">Abmelden</a></li>
<?php else: ?>
<li><a href="index.php?pfad=login">Anmelden</a></li>
<li><a href="index.php?pfad=register">Registrieren</a></li>
<?php endif; ?>
<li>
<label class="nav__mobile-label">Sprachen</label>
<ul class="nav__mobile-submenu">
<li><a href="404.php">Deutsch</a></li>
<li><a href="404.php">Englisch</a></li>
<li><a href="404.php">Französisch</a></li>
<li><a href="404.php">Latein</a></li>
<li><a href="404.php">Literatur</a></li>
<li><a href="index.php?pfad=deutsch">Deutsch</a></li>
<li><a href="index.php?pfad=englisch">Englisch</a></li>
<li><a href="index.php?pfad=franzoesisch">Französisch</a></li>
<li><a href="index.php?pfad=latein">Latein</a></li>
<li><a href="index.php?pfad=literatur">Literatur</a></li>
</ul>
</li>
<li>
<label class="nav__mobile-label">MINT</label>
<ul class="nav__mobile-submenu">
<li><a href="mathe.php">Mathematik</a></li>
<li><a href="404.php">Biologie</a></li>
<li><a href="404.php">Chemie</a></li>
<li><a href="physik.php">Physik</a></li>
<li><a href="informatik.php">Informatik</a></li>
<li><a href="404.php">Astronomie</a></li>
<li><a href="index.php?pfad=mathe">Mathematik</a></li>
<li><a href="index.php?pfad=biologie">Biologie</a></li>
<li><a href="index.php?pfad=chemie">Chemie</a></li>
<li><a href="index.php?pfad=physik">Physik</a></li>
<li><a href="index.php?pfad=informatik">Informatik</a></li>
<li><a href="index.php?pfad=astronomie">Astronomie</a></li>
</ul>
</li>
<li>
<label class="nav__mobile-label">Gesellschaft & Werte</label>
<ul class="nav__mobile-submenu">
<li><a href="404.php">Geschichte</a></li>
<li><a href="404.php">Erdkunde</a></li>
<li><a href="404.php">Sozialkunde</a></li>
<li><a href="404.php">Wirtschaftskunde</a></li>
<li><a href="404.php">Religion</a></li>
<li><a href="404.php">Ethikunterricht</a></li>
<li><a href="404.php">Philosophie</a></li>
<li><a href="404.php">Psychologie</a></li>
<li><a href="404.php">Kunst</a></li>
<li><a href="404.php">Musik</a></li>
<li><a href="404.php">Theater</a></li>
<li><a href="index.php?pfad=geschichte">Geschichte</a></li>
<li><a href="index.php?pfad=erdkunde">Erdkunde</a></li>
<li><a href="index.php?pfad=sozialkunde">Sozialkunde</a></li>
<li><a href="index.php?pfad=wirtschaft">Wirtschaftskunde</a></li>
<li><a href="index.php?pfad=religion">Religion</a></li>
<li><a href="index.php?pfad=ethik">Ethikunterricht</a></li>
<li><a href="index.php?pfad=philosophie">Philosophie</a></li>
<li><a href="index.php?pfad=psychologie">Psychologie</a></li>
<li><a href="index.php?pfad=kunst">Kunst</a></li>
<li><a href="index.php?pfad=musik">Musik</a></li>
<li><a href="index.php?pfad=theater">Theater</a></li>
</ul>
</li>
<li>
<label class="nav__mobile-label">Technik & Praxis</label>
<ul class="nav__mobile-submenu">
<li><a href="404.php">Technik</a></li>
<li><a href="404.php">Werken</a></li>
<li><a href="404.php">Hauswirtschaft</a></li>
<li><a href="404.php">Sport</a></li>
<li><a href="index.php?pfad=technik">Technik</a></li>
<li><a href="index.php?pfad=werken">Werken</a></li>
<li><a href="index.php?pfad=hauswirtschaft">Hauswirtschaft</a></li>
<li><a href="index.php?pfad=sport">Sport</a></li>
</ul>
</li>
</ul>
@@ -74,59 +88,85 @@ Globales Menü, wird via PHP später in alle Seiten eingebunden
<div class="nav__item nav__dropdown">
<button class="nav__dropdown-toggle">Sprachen</button>
<div class="nav__dropdown-menu">
<a href="404.php">Deutsch</a>
<a href="404.php">Englisch</a>
<a href="404.php">Französisch</a>
<a href="404.php">Latein</a>
<a href="404.php">Literatur</a>
<a href="index.php?pfad=deutsch">Deutsch</a>
<a href="index.php?pfad=englisch">Englisch</a>
<a href="index.php?pfad=franzoesisch">Französisch</a>
<a href="index.php?pfad=latein">Latein</a>
<a href="index.php?pfad=literatur">Literatur</a>
</div>
</div>
<div class="nav__item nav__dropdown">
<button class="nav__dropdown-toggle">MINT</button>
<div class="nav__dropdown-menu">
<a href="mathe.php">Mathematik</a>
<a href="404.php">Biologie</a>
<a href="404.php">Chemie</a>
<a href="physik.php">Physik</a>
<a href="informatik.php">Informatik</a>
<a href="404.php">Astronomie</a>
<a href="index.php?pfad=mathe">Mathematik</a>
<a href="index.php?pfad=biologie">Biologie</a>
<a href="index.php?pfad=chemie">Chemie</a>
<a href="index.php?pfad=physik">Physik</a>
<a href="index.php?pfad=informatik">Informatik</a>
<a href="index.php?pfad=astronomie">Astronomie</a>
</div>
</div>
<div class="nav__item nav__dropdown">
<button class="nav__dropdown-toggle">Gesellschaft & Werte</button>
<div class="nav__dropdown-menu">
<a href="404.php">Geschichte</a>
<a href="404.php">Erdkunde</a>
<a href="404.php">Sozialkunde</a>
<a href="404.php">Wirtschaftskunde</a>
<a href="404.php">Religion</a>
<a href="404.php">Ethikunterricht</a>
<a href="404.php">Philosophie</a>
<a href="404.php">Psychologie</a>
<a href="404.php">Kunst</a>
<a href="404.php">Musik</a>
<a href="404.php">Theater</a>
<a href="index.php?pfad=geschichte">Geschichte</a>
<a href="index.php?pfad=erdkunde">Erdkunde</a>
<a href="index.php?pfad=sozialkunde">Sozialkunde</a>
<a href="index.php?pfad=wirtschaft">Wirtschaftskunde</a>
<a href="index.php?pfad=religion">Religion</a>
<a href="index.php?pfad=ethik">Ethikunterricht</a>
<a href="index.php?pfad=philosophie">Philosophie</a>
<a href="index.php?pfad=psychologie">Psychologie</a>
<a href="index.php?pfad=kunst">Kunst</a>
<a href="index.php?pfad=musik">Musik</a>
<a href="index.php?pfad=theater">Theater</a>
</div>
</div>
<div class="nav__item nav__dropdown">
<button class="nav__dropdown-toggle">Technik & Praxis</button>
<div class="nav__dropdown-menu">
<a href="404.php">Technik</a>
<a href="404.php">Werken</a>
<a href="404.php">Hauswirtschaft</a>
<a href="404.php">Sport</a>
<a href="index.php?pfad=technik">Technik</a>
<a href="index.php?pfad=werken">Werken</a>
<a href="index.php?pfad=hauswirtschaft">Hauswirtschaft</a>
<a href="index.php?pfad=sport">Sport</a>
</div>
</div>
</div>
<div class="nav__right">
<a href = "profile.php" class="nav_item nav__link">Profil</a>
<div class="nav__search">
<?php
include_once 'search.php';
?>
</div>
<a href = "login.php" class="nav__item nav__button">Anmelden</a>
<a href = "register.php" class="nav__item nav__button">Registrieren</a>
<?php if (isset($_SESSION['user'])): ?>
<a href="index.php?pfad=profile" class="nav__item nav__link">
Profil
</a>
<div class="nav__search">
<?php include_once 'search.php'; ?>
</div>
<a href="index.php?pfad=logout" class="nav__item nav__button">
Abmelden
</a>
<?php else: ?>
<div class="nav__search">
<?php include_once 'search.php'; ?>
</div>
<a href="index.php?pfad=login" class="nav__item nav__button">
Anmelden
</a>
<a href="index.php?pfad=register" class="nav__item nav__button">
Registrieren
</a>
<?php endif; ?>
</div>
</nav>
+63 -25
View File
@@ -1,34 +1,72 @@
<!--
Seite: Hompage der Lernplattform
Funktion: Webseitengerüst, Anzeigen von Beiträgen, Suchfunktion etc.
-->
<!DOCTYPE html>
<html lang="de">
<?php
session_start();
ob_start();
<head>
<meta charset="utf-8">
<meta name="description" content="EduForge">
<meta name="author" content="Niklas Ortmann">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/x-icon" href="images/logos/logo_icon.ico">
<link rel="stylesheet" href="css/main.css">
<link rel="stylesheet" href="css/navbar.css">
<link rel="stylesheet" href="css/footer.css">
<title>EduForge</title>
</head>
$pfad = $_GET["pfad"] ?? "home";
/*
Controller für Aktionen werden vor der HTML-Ausgabe geladen,
damit Weiterleitungen mit header() funktionieren.
*/
if ($pfad === "login") {
include_once "php/controller/login-controller.php";
}
<body>
if ($pfad === "register") {
include_once "php/controller/register-controller.php";
}
if ($pfad === "logout") {
include_once "content/logout.php";
exit();
}
if ($pfad === "deleteAccount") {
include_once "content/deleteAccount.php";
exit();
}
?>
<!--
Seite: Index der Lernplattform
Funktion: Webseitengerüst, Anzeigen von Content
-->
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8">
<meta name="description" content="EduForge">
<meta name="author" content="Niklas Ortmann">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/x-icon" href="images/logos/logo_icon.ico">
<link rel="stylesheet" href="css/main.css">
<link rel="stylesheet" href="css/navbar.css">
<link rel="stylesheet" href="css/footer.css">
<title>EduForge</title>
</head>
<body>
<?php
include_once 'includes/navbar.php';
//Dynamischer Inhalt (später mit php...):
include_once 'content/home.php';
?>
include_once 'includes/navbar.php';
/*
Dynamischer Inhalt:
Je nach pfad-Parameter wird die passende Datei aus content geladen.
*/
if (file_exists('content/' . $pfad . '.php')) {
include_once 'content/' . $pfad . '.php';
} else {
include_once 'content/404.php';
}
<?php
include_once 'includes/footer.php';
?>
</body>
</html>
</body>
</html>
<?php
ob_end_flush();
?>
-51
View File
@@ -1,51 +0,0 @@
<!--
Form: Login-Bereich
Funktion: Benutzerauthentifizierung und Zugang zum eigenen Profil, Erstellen von Beiträgen, etc.
-->
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8">
<meta name="description" content="EduForge">
<meta name="author" content="Niklas Ortmann">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/x-icon" href="images/logos/logo_icon.ico">
<link rel="stylesheet" href="css/main.css">
<link rel="stylesheet" href="css/navbar.css">
<link rel="stylesheet" href="css/footer.css">
<title>EduForge</title>
</head>
<body>
<?php
include_once 'includes/navbar.php';
?>
<main>
<div style="width: 50%">
<h1 style="width: 60%; text-align: center">Bitte anmelden</h1><br>
<label id="inputEmail" >E-Mail-Adresse / </label>
<p style="width: 80%;">Benutzername/E-Mail-Adresse:</p>
<input type="email" name="email" style="width: 80%;" placeholder="E-Mail-Adresse" required autofocus>
<p style="width: 80%;">Passwort:</p>
<input type="password" name="password" style="width: 80%;" placeholder="Passwort" required>
<div style="width: 80%;">
<label>
<input type="checkbox" name="remember-me" value="1"> angemeldet bleiben
</label>
</div>
<button type="submit" value="anmelden" name="loginSubmit" style="width: 80%;">anmelden</button><br>
<div style="width: 70%; text-align: center">
<a href="register.php" style="text-align: center;"> Noch keinen Account? Jetzt hier registrieren! </a>
</div>
</div>
</main>
<?php
include_once 'includes/footer.php';
?>
</body>
</html>
+30
View File
@@ -0,0 +1,30 @@
<?php
require_once "php/model/LocalUserDAO.php";
$dao = new LocalUserDAO();
$error = null;
/*
Verarbeitung des Login-Formulars
Funktion: Prüft Benutzerdaten und erstellt Session für eingeloggten Nutzer
*/
if ($_SERVER["REQUEST_METHOD"] === "POST") {
$email = $_POST["email"] ?? "";
$password = $_POST["password"] ?? "";
$user = $dao->findUser($email);
if ($user && password_verify($password, $user["password"])) {
$_SESSION["user"] = $user["username"];
$_SESSION["user_email"] = $user["email"];
header("Location: index.php");
exit();
} else {
$error = "Login fehlgeschlagen. Bitte überprüfe deine Eingaben.";
}
}
+20
View File
@@ -0,0 +1,20 @@
<?php
require_once "php/model/LocalUserDAO.php";
$dao = new LocalUserDAO();
if (!isset($_SESSION["user"])) {
header("Location: index.php?pfad=login");
exit();
}
$user = $dao->findUser($_SESSION["user_email"] ?? "");
if (!$user) {
$_SESSION = [];
session_destroy();
header("Location: index.php?pfad=login");
exit();
}
+40
View File
@@ -0,0 +1,40 @@
<?php
require_once "php/model/LocalUserDAO.php";
$dao = new LocalUserDAO();
$error = null;
/*
Verarbeitung des Registrierungs-Formulars
Funktion: Erstellt neuen Benutzer und speichert ihn im DAO + Session
*/
if ($_SERVER["REQUEST_METHOD"] === "POST") {
$email = $_POST["email"] ?? "";
$vorname = $_POST["vorname"] ?? "";
$nachname = $_POST["nachname"] ?? "";
$password = password_hash(
$_POST["password"] ?? "",
PASSWORD_DEFAULT
);
if ($dao->findUser($email)) {
$error = "Diese E-Mail-Adresse ist bereits registriert.";
} else {
$dao->addUser(
$email,
$vorname . " " . $nachname,
$password
);
$_SESSION["user"] = $vorname . " " . $nachname;
$_SESSION["user_email"] = $email;
header("Location: index.php");
exit();
}
}
+64
View File
@@ -0,0 +1,64 @@
<?php
require_once "UserDAOInterface.php";
class LocalUserDAO implements UserDAOInterface {
private string $file = "data/users.json";
private function loadUsers() {
if (!file_exists($this->file)) {
return [];
}
$json = file_get_contents($this->file);
$users = json_decode($json, true);
return is_array($users) ? $users : [];
}
private function saveUsers($users) {
file_put_contents(
$this->file,
json_encode($users, JSON_PRETTY_PRINT)
);
}
public function findUser($email) {
$users = $this->loadUsers();
foreach ($users as $user) {
if ($user["email"] === $email) {
return $user;
}
}
return null;
}
public function addUser($email, $username, $password) {
$users = $this->loadUsers();
$users[] = [
"email" => $email,
"username" => $username,
"password" => $password
];
$this->saveUsers($users);
}
public function deleteUser($email) {
$users = $this->loadUsers();
foreach ($users as $i => $user) {
if ($user["email"] === $email) {
unset($users[$i]);
$users = array_values($users);
$this->saveUsers($users);
return true;
}
}
return false;
}
}
+36
View File
@@ -0,0 +1,36 @@
<?php
/**
* Interface für den Zugriff auf Benutzerdaten.
*
* Definiert die Methoden, die jede UserDAO-Implementierung
* bereitstellen muss.
*/
interface UserDAOInterface {
/**
* Sucht einen Benutzer anhand seiner E-Mail-Adresse.
*
* @param string $email E-Mail-Adresse des gesuchten Benutzers
* @return array|null Benutzerdaten als Array oder null
*/
public function findUser($email);
/**
* Fügt einen neuen Benutzer hinzu.
*
* @param string $email E-Mail-Adresse des Benutzers
* @param string $username Benutzername des Benutzers
* @param string $password Passwort des Benutzers
* @return void
*/
public function addUser($email, $username, $password);
/**
* Löscht einen Benutzer anhand seiner E-Mail-Adresse.
*
* @param string $email E-Mail-Adresse des zu löschenden Benutzers
* @return bool true, wenn der Benutzer gelöscht wurde, sonst false
*/
public function deleteUser($email);
}
-63
View File
@@ -1,63 +0,0 @@
<!--
Seite: Profil
Inhalt: Das eigene Profil, wenn man angemeldet ist. Dort hat man die Möglichkeit seine Angaben zu ändern.
-->
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8">
<meta name="description" content="EduForge">
<meta name="author" content="Niklas Ortmann">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/x-icon" href="images/logos/logo_icon.ico">
<link rel="stylesheet" href="css/main.css">
<link rel="stylesheet" href="css/navbar.css">
<link rel="stylesheet" href="css/footer.css">
<title>EduForge</title>
</head>
<body>
<?php
include_once 'includes/navbar.php';
?>
<main>
<hr>
<div>
<div>
<h1>Benutzerdaten ändern</h1>
</div>
<div>
<div>
<label id="Vorname">Vorname</label>
<input type="text" name="Vorname" required placeholder="Vorname" value="<?php //DB-Daten ?>">
</div>
<div>
<label id="Nachname">Nachname</label>
<input type="text" name="Nachname" required placeholder="Nachname" value="<?php //DB-Daten ?>">
</div>
<div>
<label id="Email">Email-Adresse</label>
<input type="email" name="Email" required placeholder="mustermann@web.de" value="<?php //DB-Daten ?>">
</div>
<div>
<label id="Passwort">Passwort</label>
<input type="password" name="Passwort" required placeholder="Passwort">
</div>
<div>
<br>
<button type="submit" name="submit"><i></i> Speichern</button>
</div>
</div>
</div>
</main>
<?php
include_once 'includes/footer.php';
?>
</body>
</html>
-52
View File
@@ -1,52 +0,0 @@
<!--
Form: Registrierung
Funktion: Erstellung neuer Benutzerkonten
-->
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8">
<meta name="description" content="EduForge">
<meta name="author" content="Niklas Ortmann">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/x-icon" href="images/logos/logo_icon.ico">
<link rel="stylesheet" href="css/main.css">
<link rel="stylesheet" href="css/navbar.css">
<link rel="stylesheet" href="css/footer.css">
<title>EduForge</title>
</head>
<body>
<?php
include_once 'includes/navbar.php';
?>
<main>
<div style="width: 50%">
<h1 style="width: 50%; text-align: center">Jetzt Registrieren!</h1><br>
<p style="width: 80%;"> Email:</p>
<input type="email" name="email" style="width: 80%;" placeholder="mustermann@web.de" required>
<p style="width: 80%;"> Vorname:</p>
<input type="text" name="vorname" style="width: 80%;" placeholder="Max" required>
<p style="width: 80%;"> Nachname:</p>
<input type="text" name="nachname" style="width: 80%;" placeholder="Mustermann" required>
<p style="width: 80%;"> Passwort:</p>
<input type="password" name="password" style="width: 80%;" placeholder="Passwort" required>
<div style="width: 80%;">
<label>
<input type="checkbox" value="remember-me"> angemeldet bleiben
</label>
</div>
<button type="submit" value="anmelden" name="loginSubmit" style="width: 80%;">kostenlos registrieren</button>
</div>
</main>
<?php
include_once 'includes/footer.php';
?>
</body>
</html>
-56
View File
@@ -1,56 +0,0 @@
<?php
// Webhook: erfasst einen push auf dem dev (und aktualisiert das Webverzeichnis des Servers)
// Quelle: https://docs.gitea.com/usage/webhooks
ini_set('error_log', __DIR__ . '/tmp.log');
$secret_key = '763489347';
// check for POST request
if ($_SERVER['REQUEST_METHOD'] != 'POST') {
error_log('FAILED - not POST - '. $_SERVER['REQUEST_METHOD']);
exit();
}
// get content type
$content_type = isset($_SERVER['CONTENT_TYPE']) ? strtolower(trim($_SERVER['CONTENT_TYPE'])) : '';
if ($content_type != 'application/json') {
error_log('FAILED - not application/json - '. $content_type);
exit();
}
// get payload
$payload = trim(file_get_contents("php://input"));
if (empty($payload)) {
error_log('FAILED - no payload');
exit();
}
// get header signature
$header_signature = isset($_SERVER['HTTP_X_GITEA_SIGNATURE']) ? $_SERVER['HTTP_X_GITEA_SIGNATURE'] : '';
if (empty($header_signature)) {
error_log('FAILED - header signature missing');
exit();
}
// calculate payload signature
$payload_signature = hash_hmac('sha256', $payload, $secret_key, false);
// check payload signature against header signature
if ($header_signature !== $payload_signature) {
error_log('FAILED - payload signature');
exit();
}
// convert json to array
$decoded = json_decode($payload, true);
// check for json decode errors
if (json_last_error() !== JSON_ERROR_NONE) {
error_log('FAILED - json decode - '. json_last_error());
exit();
}
// success, do something
error_log('SUCCESS - Webhook hat funktioniert');