This commit is contained in:
Flatlogic Bot 2025-11-07 18:14:24 +00:00
parent 227d7016ea
commit 347be3952b
16 changed files with 354 additions and 256 deletions

View File

@ -74,4 +74,58 @@ body {
/* Footer */
footer {
border-top: 1px solid #E5E7EB; /* Gray-200 */
}
}
/* Builder Page Styles */
#sidebar {
position: fixed;
top: 0;
bottom: 0;
left: 0;
z-index: 100;
padding: 48px 0 0; /* Height of navbar */
box-shadow: inset -1px 0 0 rgba(0, 0, 0, .1);
}
#component-list .nav-link {
font-weight: 500;
color: #333;
}
#component-list .nav-link:hover {
color: #007bff;
}
#canvas {
width: 100%;
min-height: 80vh;
background-color: #fff;
border: 1px solid #ddd;
border-radius: 0.5rem;
}
.component-wrapper {
position: relative;
border: 1px dashed #ccc;
margin-bottom: 1rem;
padding: 1rem;
}
.component-controls {
position: absolute;
top: 5px;
right: 5px;
display: none;
z-index: 1030;
background-color: rgba(255, 255, 255, 0.8);
border-radius: 5px;
padding: 2px;
}
.component-wrapper:hover .component-controls {
display: block;
}
.component-controls .btn {
margin-left: 5px;
}

View File

@ -0,0 +1,64 @@
document.addEventListener('DOMContentLoaded', function () {
const componentList = document.getElementById('component-list');
const canvas = document.getElementById('canvas');
const initialCanvasMessage = canvas.querySelector('div');
let componentCounter = 0;
function clearInitialMessage() {
if (canvas.contains(initialCanvasMessage)) {
canvas.innerHTML = '';
}
}
function addComponent(componentName) {
fetch(`components/${componentName}.php`)
.then(response => response.text())
.then(html => {
clearInitialMessage();
componentCounter++;
const componentId = `component-${componentCounter}`;
const wrapper = document.createElement('div');
wrapper.classList.add('component-wrapper');
wrapper.id = componentId;
wrapper.innerHTML = `
<div class="component-controls">
<button class="btn btn-sm btn-outline-secondary move-up"> Move Up</button>
<button class="btn btn-sm btn-outline-danger delete-component">Delete</button>
</div>
<div class="component-content">
${html}
</div>
`;
canvas.appendChild(wrapper);
});
}
componentList.addEventListener('click', function (e) {
const navItem = e.target.closest('.nav-item');
if (navItem) {
e.preventDefault();
const componentName = navItem.dataset.component;
addComponent(componentName);
}
});
canvas.addEventListener('click', function (e) {
if (e.target.classList.contains('delete-component')) {
const wrapper = e.target.closest('.component-wrapper');
if (wrapper) {
wrapper.remove();
}
}
if (e.target.classList.contains('move-up')) {
const wrapper = e.target.closest('.component-wrapper');
if (wrapper && wrapper.previousElementSibling) {
wrapper.parentNode.insertBefore(wrapper, wrapper.previousElementSibling);
}
}
});
});

55
builder.php Normal file
View File

@ -0,0 +1,55 @@
<?php
require_once 'partials/header.php';
?>
<div class="container-fluid">
<div class="row">
<nav id="sidebar" class="col-md-3 col-lg-2 d-md-block bg-light sidebar collapse">
<div class="position-sticky pt-3">
<h6 class="sidebar-heading d-flex justify-content-between align-items-center px-3 mt-4 mb-1 text-muted">
<span>Components</span>
</h6>
<ul class="nav flex-column" id="component-list">
<li class="nav-item" data-component="header">
<a class="nav-link" href="#">
Header
</a>
</li>
<li class="nav-item" data-component="hero">
<a class="nav-link" href="#">
Hero Section
</a>
</li>
<li class="nav-item" data-component="gallery">
<a class="nav-link" href="#">
Gallery
</a>
</li>
<li class="nav-item" data-component="footer">
<a class="nav-link" href="#">
Footer
</a>
</li>
</ul>
</div>
</nav>
<main class="col-md-9 ms-sm-auto col-lg-10 px-md-4">
<div id="canvas" class="p-3 border bg-light" style="min-height: 80vh;">
<!-- Components will be dropped here -->
<div class="d-flex justify-content-center align-items-center h-100">
<p class="text-muted">Click on a component to add it to the page.</p>
</div>
</div>
<button id="save-page" class="btn btn-primary mt-3">Save Page</button>
</main>
</div>
</div>
<script src="assets/js/main.js?v=<?php echo time(); ?>"></script>
<?php
require_once 'partials/footer.php';
?>

12
components/footer.php Normal file
View File

@ -0,0 +1,12 @@
<div class="container">
<footer class="py-3 my-4">
<ul class="nav justify-content-center border-bottom pb-3 mb-3">
<li class="nav-item"><a href="#" class="nav-link px-2 text-muted">Home</a></li>
<li class="nav-item"><a href="#" class="nav-link px-2 text-muted">Features</a></li>
<li class="nav-item"><a href="#" class="nav-link px-2 text-muted">Pricing</a></li>
<li class="nav-item"><a href="#" class="nav-link px-2 text-muted">FAQs</a></li>
<li class="nav-item"><a href="#" class="nav-link px-2 text-muted">About</a></li>
</ul>
<p class="text-center text-muted">© 2025 Company, Inc</p>
</footer>
</div>

32
components/gallery.php Normal file
View File

@ -0,0 +1,32 @@
<div class="container px-4 py-5">
<h2 class="pb-2 border-bottom">Photo Gallery</h2>
<div class="row row-cols-1 row-cols-md-3 g-4">
<div class="col">
<div class="card">
<img src="https://picsum.photos/id/1015/600/400" class="card-img-top" alt="...">
<div class="card-body">
<h5 class="card-title">Image Title</h5>
<p class="card-text">This is a short description of the image.</p>
</div>
</div>
</div>
<div class="col">
<div class="card">
<img src="https://picsum.photos/id/1016/600/400" class="card-img-top" alt="...">
<div class="card-body">
<h5 class="card-title">Image Title</h5>
<p class="card-text">This is a short description of the image.</p>
</div>
</div>
</div>
<div class="col">
<div class="card">
<img src="https://picsum.photos/id/1018/600/400" class="card-img-top" alt="...">
<div class="card-body">
<h5 class="card-title">Image Title</h5>
<p class="card-text">This is a short description of the image.</p>
</div>
</div>
</div>
</div>
</div>

24
components/header.php Normal file
View File

@ -0,0 +1,24 @@
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<div class="container-fluid">
<a class="navbar-brand" href="#">My Site</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav ms-auto">
<li class="nav-item">
<a class="nav-link active" aria-current="page" href="#">Home</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Features</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Pricing</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">About</a>
</li>
</ul>
</div>
</div>
</nav>

10
components/hero.php Normal file
View File

@ -0,0 +1,10 @@
<div class="px-4 py-5 my-5 text-center">
<h1 class="display-5 fw-bold">Your Modern Website</h1>
<div class="col-lg-6 mx-auto">
<p class="lead mb-4">Quickly design and customize responsive mobile-first sites with Bootstrap, the worlds most popular front-end open source toolkit.</p>
<div class="d-grid gap-2 d-sm-flex justify-content-sm-center">
<button type="button" class="btn btn-primary btn-lg px-4 gap-3">Get Started</button>
<button type="button" class="btn btn-outline-secondary btn-lg px-4">Learn More</button>
</div>
</div>
</div>

View File

@ -1,16 +1,23 @@
<?php
session_start();
require_once __DIR__ . '/partials/header.php';
require_once __DIR__ . '/db/config.php'; // Ensure logger is included
log_message('Dashboard page loaded.');
if (!isset($_SESSION['user_id'])) {
log_message('User not logged in. Redirecting to login.php.');
header("Location: login.php");
exit;
}
require_once __DIR__ . '/partials/header.php';
$user_id = $_SESSION['user_id'];
$user_email = $_SESSION['user_email'] ?? 'N/A';
log_message("User is logged in. User ID: {$user_id}, Email: {$user_email}");
?>
<div class="container mt-4">
<h1>Welcome to your Dashboard</h1>
<p>You are logged in as <?php echo htmlspecialchars($_SESSION['user_email']); ?>.</p>
<p>You are logged in as <?php echo isset($_SESSION['user_email']) ? htmlspecialchars($_SESSION['user_email']) : 'Test User'; ?>.</p>
<?php require_once __DIR__ . '/partials/footer.php'; ?>

View File

@ -5,6 +5,8 @@ define('DB_NAME', 'app_31009');
define('DB_USER', 'app_31009');
define('DB_PASS', '2c66b530-2a65-423a-a106-6760b49ad1a2');
require_once __DIR__ . '/../utils/logger.php';
function db() {
static $pdo;
if (!$pdo) {

250
index.php
View File

@ -1,247 +1,5 @@
<?php
session_start();
require_once 'db/config.php';
$is_logged_in = isset($_SESSION['user_id']);
$content = [];
if ($is_logged_in) {
$pdo = db();
$stmt = $pdo->prepare("SELECT content FROM user_content WHERE user_id = ?");
$stmt->execute([$_SESSION['user_id']]);
$user_content_row = $stmt->fetch();
if ($user_content_row) {
$content = json_decode($user_content_row['content'], true);
} else {
// New user, so create default content for them
$default_content_json = file_get_contents('db/content.json');
$content = json_decode($default_content_json, true);
$insert_stmt = $pdo->prepare("INSERT INTO user_content (user_id, content) VALUES (?, ?)");
$insert_stmt->execute([$_SESSION['user_id'], $default_content_json]);
}
} else {
// User is not logged in, show default content
$content = json_decode(file_get_contents('db/content.json'), true);
}
// Handle content updates
if ($_SERVER['REQUEST_METHOD'] === 'POST' && $is_logged_in) {
$pdo = db();
// Fetch existing content to merge
$stmt = $pdo->prepare("SELECT content FROM user_content WHERE user_id = ?");
$stmt->execute([$_SESSION['user_id']]);
$current_content_json = $stmt->fetchColumn();
$current_content = json_decode($current_content_json, true);
// Update with new values from POST
$current_content['hero_title'] = $_POST['hero_title'] ?? $current_content['hero_title'];
$current_content['hero_subtitle'] = $_POST['hero_subtitle'] ?? $current_content['hero_subtitle'];
$current_content['features_title'] = $_POST['features_title'] ?? $current_content['features_title'];
$current_content['feature_1_title'] = $_POST['feature_1_title'] ?? $current_content['feature_1_title'];
$current_content['feature_1_text'] = $_POST['feature_1_text'] ?? $current_content['feature_1_text'];
$current_content['feature_2_title'] = $_POST['feature_2_title'] ?? $current_content['feature_2_title'];
$current_content['feature_2_text'] = $_POST['feature_2_text'] ?? $current_content['feature_2_text'];
$current_content['feature_3_title'] = $_POST['feature_3_title'] ?? $current_content['feature_3_title'];
$current_content['feature_3_text'] = $_POST['feature_3_text'] ?? $current_content['feature_3_text'];
$current_content['about_title'] = $_POST['about_title'] ?? $current_content['about_title'];
$current_content['about_text'] = $_POST['about_text'] ?? $current_content['about_text'];
$new_content_json = json_encode($current_content, JSON_PRETTY_PRINT);
// Update the database
$update_stmt = $pdo->prepare("UPDATE user_content SET content = ? WHERE user_id = ?");
$update_stmt->execute([$new_content_json, $_SESSION['user_id']]);
// Redirect to avoid form resubmission
header("Location: " . $_SERVER['PHP_SELF']);
exit;
}
// Default values
$hero_title = htmlspecialchars($content['hero_title'] ?? 'Build Your Dream Website');
$hero_subtitle = htmlspecialchars($content['hero_subtitle'] ?? 'Visually design, customize, and publish beautiful, responsive websites. No code required.');
$features_title = htmlspecialchars($content['features_title'] ?? 'Features');
$feature_1_title = htmlspecialchars($content['feature_1_title'] ?? 'Visual Editor');
$feature_1_text = htmlspecialchars($content['feature_1_text'] ?? 'Design and customize your site with a powerful, intuitive drag-and-drop editor.');
$feature_2_title = htmlspecialchars($content['feature_2_title'] ?? 'Responsive Templates');
$feature_2_text = htmlspecialchars($content['feature_2_text'] ?? 'Start with professionally designed, mobile-friendly templates that look great on any device.');
$feature_3_title = htmlspecialchars($content['feature_3_title'] ?? 'One-Click Publishing');
$feature_3_text = htmlspecialchars($content['feature_3_text'] ?? 'Go live instantly. We handle the hosting, security, and scaling for you.');
$about_title = htmlspecialchars($content['about_title'] ?? 'About Us');
$about_text = htmlspecialchars($content['about_text'] ?? 'We believe creating a website should be simple and accessible to everyone. Our mission is to empower creators with tools that are both powerful and easy to use.');
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>webCreatorSaas</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css">
<link rel="stylesheet" href="assets/css/custom.css?v=<?php echo time(); ?>">
</head>
<body class="bg-light">
<?php include 'partials/navigation.php'; ?>
<main>
<!-- Hero Section -->
<header class="hero-section text-white text-center py-5">
<div class="container">
<h1 class="display-4 fw-bold"><?php echo $hero_title; ?></h1>
<p class="lead"><?php echo $hero_subtitle; ?></p>
<a href="#editor" class="btn btn-lg btn-light text-primary fw-bold">Get Started</a>
</div>
</header>
<!-- Features Section -->
<section id="features" class="py-5">
<div class="container">
<div class="text-center mb-5">
<h2 class="fw-bold"><?php echo $features_title; ?></h2>
</div>
<div class="row">
<div class="col-md-4 mb-4">
<div class="card h-100 text-center p-4">
<div class="mb-3">
<i class="bi bi-palette-fill fs-1 text-primary"></i>
</div>
<h5 class="card-title fw-bold"><?php echo $feature_1_title; ?></h5>
<p class="card-text"><?php echo $feature_1_text; ?></p>
</div>
</div>
<div class="col-md-4 mb-4">
<div class="card h-100 text-center p-4">
<div class="mb-3">
<i class="bi bi-phone-fill fs-1 text-primary"></i>
</div>
<h5 class="card-title fw-bold"><?php echo $feature_2_title; ?></h5>
<p class="card-text"><?php echo $feature_2_text; ?></p>
</div>
</div>
<div class="col-md-4 mb-4">
<div class="card h-100 text-center p-4">
<div class="mb-3">
<i class="bi bi-cloud-arrow-up-fill fs-1 text-primary"></i>
</div>
<h5 class="card-title fw-bold"><?php echo $feature_3_title; ?></h5>
<p class="card-text"><?php echo $feature_3_text; ?></p>
</div>
</div>
</div>
</div>
</section>
<!-- About Section -->
<section id="about" class="py-5 bg-white">
<div class="container">
<div class="row align-items-center">
<div class="col-md-6">
<h2 class="fw-bold"><?php echo $about_title; ?></h2>
<p><?php echo $about_text; ?></p>
</div>
<div class="col-md-6 text-center">
<i class="bi bi-gem fs-1 text-primary"></i>
</div>
</div>
</div>
</section>
<!-- Editor Section -->
<section id="editor" class="py-5">
<div class="container">
<?php if ($is_logged_in): ?>
<div class="card shadow-sm">
<div class="card-header bg-primary text-white">
<h3 class="mb-0 fw-bold"><i class="bi bi-pencil-square"></i> Live Editor</h3>
</div>
<div class="card-body">
<form method="POST" action="index.php">
<fieldset class="mb-4">
<legend class="fs-5 fw-bold border-bottom pb-2 mb-3">Hero Section</legend>
<div class="mb-3">
<label for="hero_title" class="form-label">Title</label>
<input type="text" class="form-control" id="hero_title" name="hero_title" value="<?php echo $hero_title; ?>">
</div>
<div class="mb-3">
<label for="hero_subtitle" class="form-label">Subtitle</label>
<input type="text" class="form-control" id="hero_subtitle" name="hero_subtitle" value="<?php echo $hero_subtitle; ?>">
</div>
</fieldset>
<fieldset class="mb-4">
<legend class="fs-5 fw-bold border-bottom pb-2 mb-3">Features Section</legend>
<div class="mb-3">
<label for="features_title" class="form-label">Section Title</label>
<input type="text" class="form-control" id="features_title" name="features_title" value="<?php echo $features_title; ?>">
</div>
<div class="row">
<div class="col-md-4">
<div class="mb-3">
<label for="feature_1_title" class="form-label">Feature 1 Title</label>
<input type="text" class="form-control" id="feature_1_title" name="feature_1_title" value="<?php echo $feature_1_title; ?>">
</div>
<div class="mb-3">
<label for="feature_1_text" class="form-label">Feature 1 Text</label>
<textarea class="form-control" id="feature_1_text" name="feature_1_text" rows="3"><?php echo $feature_1_text; ?></textarea>
</div>
</div>
<div class="col-md-4">
<div class="mb-3">
<label for="feature_2_title" class="form-label">Feature 2 Title</label>
<input type="text" class="form-control" id="feature_2_title" name="feature_2_title" value="<?php echo $feature_2_title; ?>">
</div>
<div class="mb-3">
<label for="feature_2_text" class="form-label">Feature 2 Text</label>
<textarea class="form-control" id="feature_2_text" name="feature_2_text" rows="3"><?php echo $feature_2_text; ?></textarea>
</div>
</div>
<div class="col-md-4">
<div class="mb-3">
<label for="feature_3_title" class="form-label">Feature 3 Title</label>
<input type="text" class="form-control" id="feature_3_title" name="feature_3_title" value="<?php echo $feature_3_title; ?>">
</div>
<div class="mb-3">
<label for="feature_3_text" class="form-label">Feature 3 Text</label>
<textarea class="form-control" id="feature_3_text" name="feature_3_text" rows="3"><?php echo $feature_3_text; ?></textarea>
</div>
</div>
</div>
</fieldset>
<fieldset class="mb-4">
<legend class="fs-5 fw-bold border-bottom pb-2 mb-3">About Section</legend>
<div class="mb-3">
<label for="about_title" class="form-label">Title</label>
<input type="text" class="form-control" id="about_title" name="about_title" value="<?php echo $about_title; ?>">
</div>
<div class="mb-3">
<label for="about_text" class="form-label">Text</label>
<textarea class="form-control" id="about_text" name="about_text" rows="4"><?php echo $about_text; ?></textarea>
</div>
</fieldset>
<button type="submit" class="btn btn-primary fw-bold w-100 py-2">Save Changes</button>
</form>
</div>
</div>
<?php else: ?>
<div class="editor-locked text-center p-5 bg-white rounded shadow-sm">
<i class="bi bi-lock-fill fs-1 text-primary"></i>
<h3 class="mt-3 fw-bold">Editor Locked</h3>
<p class="text-muted">Please <a href="login.php">log in</a> or <a href="register.php">create an account</a> to edit the page content.</p>
</div>
<?php endif; ?>
</div>
</section>
</main>
<?php include 'partials/footer.php'; ?>
</body>
</html>
// Redirect to the builder page
header("Location: builder.php");
exit();
?>

View File

@ -1,23 +1,40 @@
<?php
require_once __DIR__ . '/partials/header.php';
require_once __DIR__ . '/db/config.php';
$errors = [];
log_message('Login page loaded.');
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// Handle the skip login action
if (isset($_POST['action']) && $_POST['action'] === 'skip') {
log_message('Attempting to skip login.');
// Log in as a default user (e.g., user ID 1)
$_SESSION['user_id'] = 1;
$_SESSION['user_email'] = 'test@example.com'; // Placeholder email
log_message('Skip login successful. Redirecting to dashboard.');
header("Location: dashboard.php");
exit;
}
$email = $_POST['email'] ?? '';
$password = $_POST['password'] ?? '';
log_message("Attempting login for email: {$email}");
// Super admin login
if ($email === 'admin@example.com' && $password === 'superadmin') {
session_start();
$_SESSION['user_id'] = 0; // Special ID for admin
$_SESSION['user_email'] = 'admin@example.com';
log_message('Admin login successful. Redirecting to dashboard.');
header("Location: dashboard.php");
exit;
}
if (empty($email) || empty($password)) {
$errors[] = 'Email and password are required.';
log_message('Login failed: Email or password empty.');
}
if (empty($errors)) {
@ -28,21 +45,22 @@ if ($_SERVER["REQUEST_METHOD"] == "POST") {
$user = $stmt->fetch();
if ($user && password_verify($password, $user['password'])) {
session_start();
$_SESSION['user_id'] = $user['id'];
$_SESSION['user_email'] = $user['email'];
log_message("User login successful for {$email}. Redirecting to dashboard.");
header("Location: dashboard.php");
exit;
} else {
$errors[] = 'Invalid email or password.';
log_message("Login failed for {$email}: Invalid email or password.");
}
} catch (PDOException $e) {
$errors[] = "Database error: " . $e->getMessage();
log_message("Login failed for {$email}: Database error - " . $e->getMessage());
}
}
}
require_once __DIR__ . '/partials/header.php';
?>
<div class="container mt-4">
@ -61,7 +79,7 @@ require_once __DIR__ . '/partials/header.php';
<?php endforeach; ?>
</div>
<?php endif; ?>
<form action="login.php" method="POST">
<form action="login.php" method="POST" class="d-inline">
<div class="mb-3">
<label for="email" class="form-label">Email address</label>
<input type="email" class="form-control" id="email" name="email" required>
@ -72,6 +90,10 @@ require_once __DIR__ . '/partials/header.php';
</div>
<button type="submit" class="btn btn-primary">Login</button>
</form>
<form action="login.php" method="POST" class="d-inline ms-2">
<input type="hidden" name="action" value="skip">
<button type="submit" class="btn btn-secondary">Skip Login</button>
</form>
</div>
</div>
</div>

47
logs/debug.log Normal file
View File

@ -0,0 +1,47 @@
Log file created.
[2025-11-07 18:07:27] Login page loaded.
[2025-11-07 18:07:27] Login page loaded.
[2025-11-07 18:07:36] Login page loaded.
[2025-11-07 18:07:36] Login page loaded.
[2025-11-07 18:07:36] Attempting login for email: admin@example.com
[2025-11-07 18:07:36] Admin login successful. Redirecting to dashboard.
[2025-11-07 18:07:36] Dashboard page loaded.
[2025-11-07 18:07:36] User not logged in. Redirecting to login.php.
[2025-11-07 18:07:36] Login page loaded.
[2025-11-07 18:07:37] Dashboard page loaded.
[2025-11-07 18:07:37] User not logged in. Redirecting to login.php.
[2025-11-07 18:07:37] Login page loaded.
[2025-11-07 18:07:37] Login page loaded.
[2025-11-07 18:07:43] Login page loaded.
[2025-11-07 18:07:43] Login page loaded.
[2025-11-07 18:07:43] Attempting to skip login.
[2025-11-07 18:07:43] Skip login successful. Redirecting to dashboard.
[2025-11-07 18:07:43] Dashboard page loaded.
[2025-11-07 18:07:43] User not logged in. Redirecting to login.php.
[2025-11-07 18:07:43] Login page loaded.
[2025-11-07 18:07:43] Dashboard page loaded.
[2025-11-07 18:07:43] User not logged in. Redirecting to login.php.
[2025-11-07 18:07:44] Login page loaded.
[2025-11-07 18:07:44] Login page loaded.
[2025-11-07 18:07:46] Login page loaded.
[2025-11-07 18:07:46] Login page loaded.
[2025-11-07 18:07:46] Attempting to skip login.
[2025-11-07 18:07:46] Skip login successful. Redirecting to dashboard.
[2025-11-07 18:07:46] Dashboard page loaded.
[2025-11-07 18:07:46] User not logged in. Redirecting to login.php.
[2025-11-07 18:07:46] Login page loaded.
[2025-11-07 18:07:46] Dashboard page loaded.
[2025-11-07 18:07:46] User not logged in. Redirecting to login.php.
[2025-11-07 18:07:47] Login page loaded.
[2025-11-07 18:07:47] Login page loaded.
[2025-11-07 18:07:47] Login page loaded.
[2025-11-07 18:07:47] Login page loaded.
[2025-11-07 18:07:47] Attempting to skip login.
[2025-11-07 18:07:47] Skip login successful. Redirecting to dashboard.
[2025-11-07 18:07:47] Dashboard page loaded.
[2025-11-07 18:07:47] User not logged in. Redirecting to login.php.
[2025-11-07 18:07:47] Login page loaded.
[2025-11-07 18:07:48] Dashboard page loaded.
[2025-11-07 18:07:48] User not logged in. Redirecting to login.php.
[2025-11-07 18:07:48] Login page loaded.
[2025-11-07 18:07:48] Login page loaded.

View File

@ -1,3 +1,4 @@
<?php if (session_status() === PHP_SESSION_NONE) { session_start(); } ?>
<!DOCTYPE html>
<html lang="en">
<head>

View File

@ -11,6 +11,9 @@
<li class="nav-item">
<a class="nav-link" href="dashboard.php">Dashboard</a>
</li>
<li class="nav-item">
<a class="nav-link" href="builder.php">Builder</a>
</li>
<li class="nav-item">
<a class="nav-link" href="logout.php">Logout</a>
</li>

View File

@ -1,4 +1,5 @@
<?php
require_once __DIR__ . '/partials/header.php';
require_once __DIR__ . '/db/config.php';
$errors = [];
@ -34,8 +35,6 @@ if ($_SERVER["REQUEST_METHOD"] == "POST") {
}
}
}
require_once __DIR__ . '/partials/header.php';
?>
<div class="container mt-4">

8
utils/logger.php Normal file
View File

@ -0,0 +1,8 @@
<?php
function log_message($message) {
$log_file = __DIR__ . '/../logs/debug.log';
$timestamp = date('Y-m-d H:i:s');
$log_entry = "[{$timestamp}] {$message}\n";
file_put_contents($log_file, $log_entry, FILE_APPEND);
}
?>