changes and new login
This commit is contained in:
1 parent
c44b508689
commit
27c11ba5ff
5 files changed
+218
-27
No files matched your search
+35
-13
@@ -1,4 +1,6 @@
|
||||
<?php
|
||||
error_reporting(E_ALL);
|
||||
ini_set('display_errors', 1);
|
||||
session_start();
|
||||
require_once __DIR__ . '/src/MVC/autoloader.php';
|
||||
$service = $_GET['service'] ?? 'home';
|
||||
@@ -7,35 +9,55 @@ try {
|
||||
$router->add('home', \MVC\Controller\HomeController::class, 'index');
|
||||
$router->add('toggle_theme', \MVC\Controller\HomeController::class, 'toggle_theme');
|
||||
$router->add('abgas', \MVC\Controller\AbgasController::class, 'abgas');
|
||||
$router->add('vorlauf', \MVC\Controller\VorlaufController::class, 'vorlauf');
|
||||
$router->add('puffer', \MVC\Controller\PufferController::class, 'puffer');
|
||||
$router->add('aussentemp', \MVC\Controller\AussentempController::class, 'aussentemp');
|
||||
$router->add('vorlauf', \MVC\Controller\VorlaufController::class, 'vorlauf', ['auth']);
|
||||
$router->add('puffer', \MVC\Controller\PufferController::class, 'puffer', ['auth']);
|
||||
$router->add('aussentemp', \MVC\Controller\AussentempController::class, 'aussentemp', ['auth']);
|
||||
$router->add('login', \MVC\Controller\AuthController::class, 'login');
|
||||
$router->add('logout', \MVC\Controller\AuthController::class, 'logout');
|
||||
|
||||
$layout = new \MVC\Layout\Layout('main');
|
||||
$layout->setBlock('title', 'MVC Starter');
|
||||
$layout->setBlock('header_title', '🚀 MVC Dashboard');
|
||||
$layout->setBlock('header_actions', '<button class="btn-toggle" onclick="toggleTheme()">🌓 Theme umschalten</button>');
|
||||
|
||||
$headerActions = '<button class="btn-toggle" onclick="toggleTheme()">🌓 Theme umschalten</button>';
|
||||
if (isset($_SESSION['user_logged_in'])) {
|
||||
$headerActions = '<span style="margin-right: 15px;">👤 ' . htmlspecialchars($_SESSION['username']) . '</span>' .
|
||||
'<a href="?service=logout" class="btn-toggle" style="text-decoration: none; background: rgba(255,255,255,0.2);">🚪 Logout</a> ' .
|
||||
$headerActions;
|
||||
} else {
|
||||
$headerActions = '<a href="?service=login" class="btn-toggle" style="text-decoration: none; background: var(--accent); color: white; margin-right: 10px;">🔑 Login</a> ' .
|
||||
$headerActions;
|
||||
}
|
||||
$layout->setBlock('header_actions', $headerActions);
|
||||
|
||||
// Sidebar Block
|
||||
ob_start();
|
||||
$navItems = [
|
||||
'home' => '🏠 Home',
|
||||
'abgas' => '🔥 Abgas',
|
||||
'vorlauf' => '🏃♂️➡️ Vorlauf',
|
||||
'puffer' => '♨️ Puffer',
|
||||
'aussentemp' => '🌡️ Außentemperatur',
|
||||
'home' => ['label' => '🏠 Home', 'auth' => false],
|
||||
'abgas' => ['label' => '🔥 Abgas', 'auth' => false],
|
||||
'vorlauf' => ['label' => '🏃♂️➡️ Vorlauf', 'auth' => true],
|
||||
'puffer' => ['label' => '♨️ Puffer', 'auth' => true],
|
||||
'aussentemp' => ['label' => '🌡️ Außentemperatur', 'auth' => true],
|
||||
];
|
||||
?>
|
||||
<nav>
|
||||
<?php foreach ($navItems as $navKey => $navLabel): ?>
|
||||
<a href="?service=<?= $navKey ?>" class="<?= $service === $navKey ? 'active' : '' ?>"><?= $navLabel ?></a>
|
||||
<?php foreach ($navItems as $navKey => $item):
|
||||
if ($item['auth'] && !isset($_SESSION['user_logged_in'])) continue;
|
||||
?>
|
||||
<a href="?service=<?= $navKey ?>" class="<?= $service === $navKey ? 'active' : '' ?>"><?= $item['label'] ?></a>
|
||||
<?php endforeach; ?>
|
||||
|
||||
<?php if (!isset($_SESSION['user_logged_in'])): ?>
|
||||
<div style="margin-top: 20px; padding: 10px; font-size: 0.8rem; opacity: 0.5; border-top: 1px solid var(--border);">
|
||||
🔒 Melden Sie sich an, um alle Funktionen zu sehen.
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</nav>
|
||||
<?php
|
||||
$layout->setBlock('sidebar', ob_get_clean());
|
||||
|
||||
$layout->setBlock('content', $router->dispatch($service));
|
||||
echo $layout->render();
|
||||
} catch (\Exception $e) {
|
||||
http_response_code(404); echo "<h1>404</h1><p>" . $e->getMessage() . "</p>";
|
||||
} catch (\Throwable $e) {
|
||||
http_response_code(500); echo "<h1>Error</h1><p>" . $e->getMessage() . "</p><pre>" . $e->getTraceAsString() . "</pre>";
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
<?php
|
||||
|
||||
namespace MVC\Controller;
|
||||
|
||||
use MVC\Core\Controller;
|
||||
|
||||
class AuthController extends Controller {
|
||||
public function login() {
|
||||
if (isset($_SESSION['user_logged_in'])) {
|
||||
header('Location: ?service=home');
|
||||
exit;
|
||||
}
|
||||
|
||||
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
$username = $_POST['username'] ?? '';
|
||||
$password = $_POST['password'] ?? '';
|
||||
|
||||
// Hardcoded logins
|
||||
$users = [
|
||||
'admin' => 'password123',
|
||||
'user' => 'user123'
|
||||
];
|
||||
|
||||
if (isset($users[$username]) && $users[$username] === $password) {
|
||||
$_SESSION['user_logged_in'] = true;
|
||||
$_SESSION['username'] = $username;
|
||||
header('Location: ?service=home');
|
||||
exit;
|
||||
} else {
|
||||
return $this->render('login', ['error' => 'Ungültige Anmeldedaten']);
|
||||
}
|
||||
}
|
||||
|
||||
return $this->render('login');
|
||||
}
|
||||
|
||||
public function logout() {
|
||||
session_destroy();
|
||||
header('Location: ?service=login');
|
||||
exit;
|
||||
}
|
||||
}
|
||||
@@ -51,7 +51,7 @@ class Router {
|
||||
|
||||
if ($middleware === 'auth') {
|
||||
if (empty($_SESSION['user_logged_in'])) {
|
||||
header('Location: login.php');
|
||||
header('Location: ?service=login');
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,19 +8,86 @@
|
||||
--bg: #ffffff;
|
||||
--text: #333;
|
||||
--sidebar: #f4f4f4;
|
||||
--header: #007bff; --accent: #007bff; --border: #ddd; }
|
||||
.dark-mode { --bg: #1a1a1a; --text: #f4f4f4; --sidebar: #252525; --header: #111; --accent: #3498db; --border: #333; }
|
||||
body { font-family: 'Segoe UI', sans-serif; margin: 0; background: var(--bg); color: var(--text); transition: 0.3s; height: 100vh; overflow: hidden; display: flex; flex-direction: column; }
|
||||
.main-header { height: 60px; background: var(--header); color: white; display: flex; align-items: center; justify-content: space-between; padding: 0 20px; box-shadow: 0 2px 5px rgba(0,0,0,0.1); z-index: 10; }
|
||||
.main-container { flex: 1; display: flex; overflow: hidden; }
|
||||
.sidebar { width: 260px; background: var(--sidebar); padding: 20px; border-right: 1px solid var(--border); overflow-y: auto; }
|
||||
.content { flex: 1; padding: 40px; overflow-y: auto; }
|
||||
.btn-toggle { padding: 8px 15px; border: 1px solid rgba(255,255,255,0.3); border-radius: 5px; cursor: pointer; background: transparent; color: white; font-size: 0.9rem; }
|
||||
.btn-toggle:hover { background: rgba(255,255,255,0.1); }
|
||||
nav a { display: block; padding: 12px; text-decoration: none; color: inherit; border-radius: 5px; margin-bottom: 5px; }
|
||||
nav a:hover { background: rgba(0,0,0,0.05); }
|
||||
nav a.active { background: rgba(0,0,0,0.25); }
|
||||
.logo { font-size: 1.4rem; font-weight: bold; }
|
||||
--header: #007bff;
|
||||
--accent: #007bff;
|
||||
--border: #ddd;
|
||||
}
|
||||
.dark-mode {
|
||||
--bg: #1a1a1a;
|
||||
--text: #f4f4f4;
|
||||
--sidebar: #252525;
|
||||
--header: #111;
|
||||
--accent: #3498db;
|
||||
--border: #333;
|
||||
}
|
||||
body {
|
||||
font-family: 'Segoe UI', sans-serif;
|
||||
margin: 0;
|
||||
background: var(--bg);
|
||||
color: var(--text);
|
||||
transition: 0.3s;
|
||||
height: 100vh;
|
||||
overflow: hidden;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
.main-header {
|
||||
height: 60px;
|
||||
background: var(--header);
|
||||
color: white;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
padding: 0 20px;
|
||||
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
|
||||
z-index: 10;
|
||||
}
|
||||
.main-container {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
overflow: hidden;
|
||||
}
|
||||
.sidebar {
|
||||
width: 260px;
|
||||
background: var(--sidebar);
|
||||
padding: 20px;
|
||||
border-right: 1px solid var(--border);
|
||||
overflow-y: auto;
|
||||
}
|
||||
.content {
|
||||
flex: 1;
|
||||
padding: 40px;
|
||||
overflow-y: auto;
|
||||
}
|
||||
.btn-toggle {
|
||||
padding: 8px 15px;
|
||||
border: 1px solid rgba(255,255,255,0.3);
|
||||
border-radius: 5px;
|
||||
cursor: pointer;
|
||||
background: transparent;
|
||||
color: white;
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
.btn-toggle:hover {
|
||||
background: rgba(255,255,255,0.1);
|
||||
}
|
||||
nav a {
|
||||
display: block;
|
||||
padding: 12px;
|
||||
text-decoration: none;
|
||||
color: inherit;
|
||||
border-radius: 5px;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
nav a:hover {
|
||||
background: rgba(0,0,0,0.05);
|
||||
}
|
||||
nav a.active {
|
||||
background: rgba(0,0,0,0.25);
|
||||
}
|
||||
.logo {
|
||||
font-size: 1.4rem; font-weight: bold;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
<style>
|
||||
.login-container {
|
||||
max-width: 400px;
|
||||
margin: 0 auto;
|
||||
padding: 20px;
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 8px;
|
||||
background: var(--sidebar);
|
||||
}
|
||||
.login-container h2 {
|
||||
text-align: center;
|
||||
margin-top: 0;
|
||||
}
|
||||
.login-container input {
|
||||
width: 100%;
|
||||
padding: 10px;
|
||||
margin: 10px 0;
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 4px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.login-container button {
|
||||
width: 100%;
|
||||
padding: 10px;
|
||||
background: var(--header);
|
||||
color: white;
|
||||
border: none;
|
||||
border-radius: 4px;
|
||||
cursor: pointer;
|
||||
}
|
||||
.login-container button:hover {
|
||||
opacity: 0.9;
|
||||
}
|
||||
.error-msg {
|
||||
color: #e74c3c;
|
||||
background: rgba(231, 76, 60, 0.1);
|
||||
padding: 10px;
|
||||
border-radius: 4px;
|
||||
margin-bottom: 15px;
|
||||
text-align: center;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div class="login-container">
|
||||
<h2>🔑 Login</h2>
|
||||
<?php if (isset($error)): ?>
|
||||
<div class="error-msg"><?= $error ?></div>
|
||||
<?php endif; ?>
|
||||
<form method="POST">
|
||||
<div>
|
||||
<label>Benutzername</label>
|
||||
<input type="text" name="username" required autofocus placeholder="Admin / User">
|
||||
</div>
|
||||
<div>
|
||||
<label>Passwort</label>
|
||||
<input type="password" name="password" required placeholder="********">
|
||||
</div>
|
||||
<button type="submit">Anmelden</button>
|
||||
</form>
|
||||
</div>
|
||||
Reference in new issue
Block a user