Programación Web ITI-07

Práctica: Mini Sistema Web Universitario - 1


Práctica: Mini Sistema Web Universitario - 1

Configuración inicial del proyecto

Configuración inicial del proyecto

config/conexion.php

<?php
$servidor = "localhost";
$usuario = "root";
$contrasena = "";
$base_datos = "sistema_universitario";

$conexion = mysqli_connect($servidor, $usuario, $contrasena, $base_datos);

if (!$conexion) {
    die("Error de conexión: " . mysqli_connect_error());
}

echo "Conexión exitosa a la base de datos.";
?>

index.php

<?php

session_start();

// Esra funcion se va encargar de que si un usuario ya tiene una sesion iniciada lo rediriga al dashboard
/*if (isset($_SESSION["usuario_id"])) {
    header("Location: dashboard.php");
    exit();
}*/

// Esto nos sirve para oncluir la conexion a la Base de Datos
require_once "config/conexion.php";

// Estas variables nos serciran para los mensajes que se mostraran
$error = "";
$mensaje = "";

// Procesar el formulario cuando se envia
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    //Se validara que los campos no esten vacios
    if (empty($_POST["usuario"]) || empty($_POST["password"])) {
        $error = "Por favor, complete todos los campos.";
    } else {
        $usuario = trim($_POST["usuario"]);
        $password = $_POST["password"];

        // Esto nos sirve para preparar la consulta y evitar inyecciones SQL
        $stmt = $conexion->prepare(
            "SELECT id, usuario, password, nombre_completo FROM usuarios WHERE usuario = ?",
        );
        $stmt->bind_param("s", $usuario);
        $stmt->execute();
        $resultado = $stmt->get_result();

        if ($resultado->num_rows === 1) {
            $usuario_db = $resultado->fetch_assoc();

            // Nos sirve para verificar la contraseña con password_verify (Es seduro)
            if (
                password_verify(
                    password: $password,
                    hash: $usuario_db["password"],
                )
            ) {
                // Si las credenciales son correctas - Se inicia la sesion
                $_SESSION["usuario_id"] = $usuario_db["id"];
                $_SESSION["usuario"] = $usuario_db["usuario"];
                $_SESSION["nombre_completo"] = $usuario_db["nombre_completo"];

                // Regenera el ID de la session para prevenir session fixation
                session_regenerate_id(true);

                // Redirige  al dashboard
                header("Location: dashboard.php");
                exit();
            } else {
                $error = "Usuario o Contraseña incorrectos";
            }
        } else {
            $error = "Usuario o Contraseña incorrectos";
        }
        $stmt->close();
    }
}
?>

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Login</title>
    <link rel="stylesheet" href="css/style.css">
</head>

<body class="login-page">
    <div class="login-container">
        <div class="logo">
            <h1>Sistema Universitario - CLA</h1>
            <p>gestion de tareas academicas</p>
        </div>

        <?php if ($error): ?>
            <div class="alert alert-error">
                <?php echo htmlspecialchars($error); ?>
            </div>
        <?php endif; ?>

        <?php if ($mensaje): ?>
            <div class="alert alert-success">
                <?php echo htmlspecialchars($mensaje); ?>
            </div>
        <?php endif; ?>

        <form method="POST" action="">
            <div class="form-group">
                <label for="usuario">Usuario:</label>
                <input type="text" id="usuario" name="usuario" required autocomplete="username">
            </div>
            <div class="form-group">
                <label for="password">Password:</label>
                <input type="password" id="password" name="password" required autocomplete="current-password">
            </div>

            <button type="submit" class="btn-login">Iniciar sesion</button>
        </form>

        <div class="info-box">
            <h3>usuario de prueba</h3>
            <p><strong>Usuario:</strong> alumno1 | <strong>Contraseña:</strong> password123</p>
        </div>
    </div>
</body>

</html>

Base de datos (ejecuten en workbench o sqlyog)

-- Script de creación de base de datos para el Sistema Universitario
-- Ejecutar este script antes de usar el sistema

CREATE DATABASE IF NOT EXISTS sistema_universitario;
USE sistema_universitario;

-- Tabla de usuarios
CREATE TABLE IF NOT EXISTS usuarios (
    id INT AUTO_INCREMENT PRIMARY KEY,
    usuario VARCHAR(50) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    nombre_completo VARCHAR(100),
    fecha_registro DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Tabla de tareas
CREATE TABLE IF NOT EXISTS tareas (
    id INT AUTO_INCREMENT PRIMARY KEY,
    usuario_id INT NOT NULL,
    nombre_archivo VARCHAR(255) NOT NULL,
    nombre_original VARCHAR(255) NOT NULL,
    fecha DATETIME DEFAULT CURRENT_TIMESTAMP,
    tamano_bytes INT,
    FOREIGN KEY (usuario_id) REFERENCES usuarios(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- IMPORTANTE: Después de ejecutar este script, ejecuta crear_usuarios.php
-- para generar usuarios de prueba con contraseñas hasheadas correctamente.

-- O ejecuta estas consultas manualmente después de obtener el hash:
-- INSERT INTO usuarios (usuario, password, nombre_completo) VALUES ('alumno1', 'HASH_AQUI', 'Juan Pérez');

-- Para obtener el hash correcto:
-- Ejecuta: http://localhost/mini-sistema/crear_usuarios.php

crearusuarios.php (generado por IA para tener usuarios de pruebas, por que me equivoque con el que les di antes)

<?php
/**
 * crear_usuarios.php
 * Script de instalación de usuarios de prueba
 * Ejecutar DESPUÉS de importar database.sql
 */

// Incluir conexión
require_once 'config/conexion.php';

// Contraseña que usaremos para todos
$password_texto = "password123";
$password_hash = password_hash($password_texto, PASSWORD_DEFAULT);

?>
<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Crear Usuarios de Prueba</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            max-width: 800px;
            margin: 50px auto;
            padding: 20px;
            background: #f5f5f5;
        }

        .container {
            background: white;
            padding: 30px;
            border-radius: 10px;
            box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
        }

        .success {
            background: #d4edda;
            border: 1px solid #c3e6cb;
            color: #155724;
            padding: 15px;
            border-radius: 5px;
            margin: 10px 0;
        }

        .error {
            background: #f8d7da;
            border: 1px solid #f5c6cb;
            color: #721c24;
            padding: 15px;
            border-radius: 5px;
            margin: 10px 0;
        }

        .info {
            background: #d1ecf1;
            border: 1px solid #bee5eb;
            color: #0c5460;
            padding: 15px;
            border-radius: 5px;
            margin: 10px 0;
        }

        table {
            width: 100%;
            border-collapse: collapse;
            margin: 20px 0;
        }

        th,
        td {
            padding: 12px;
            text-align: left;
            border-bottom: 1px solid #ddd;
        }

        th {
            background: #667eea;
            color: white;
        }

        .btn {
            display: inline-block;
            padding: 12px 30px;
            background: #667eea;
            color: white;
            text-decoration: none;
            border-radius: 5px;
            margin-top: 20px;
        }

        code {
            background: #f4f4f4;
            padding: 2px 6px;
            border-radius: 3px;
            font-family: monospace;
        }
    </style>
</head>

<body>
    <div class="container">
        <h1>🎓 Crear Usuarios de Prueba</h1>

        <?php
        // Verificar conexión
        if ($conexion->connect_error) {
            echo "<div class='error'>❌ Error de conexión: " . $conexion->connect_error . "</div>";
            echo "<p>Verifica la configuración en <code>config/conexion.php</code></p>";
            exit();
        }

        echo "<div class='success'>✅ Conexión a la base de datos exitosa</div>";

        // Usuarios a crear
        $usuarios = array(
            array('alumno1', 'Juan Pérez'),
            array('alumno2', 'María García'),
            array('profesor1', 'Dr. Carlos Rodríguez')
        );

        $usuarios_creados = 0;
        $usuarios_existentes = 0;

        echo "<h2>Creando usuarios...</h2>";

        foreach ($usuarios as $user) {
            $usuario = $user[0];
            $nombre = $user[1];

            // Verificar si el usuario ya existe
            $check = $conexion->prepare("SELECT id FROM usuarios WHERE usuario = ?");
            $check->bind_param("s", $usuario);
            $check->execute();
            $result = $check->get_result();

            if ($result->num_rows > 0) {
                // Usuario existe - actualizar contraseña
                $update = $conexion->prepare("UPDATE usuarios SET password = ?, nombre_completo = ? WHERE usuario = ?");
                $update->bind_param("sss", $password_hash, $nombre, $usuario);

                if ($update->execute()) {
                    echo "<div class='info'>ℹ️ Usuario <strong>$usuario</strong> ya existía - contraseña actualizada</div>";
                    $usuarios_existentes++;
                } else {
                    echo "<div class='error'>❌ Error al actualizar usuario $usuario</div>";
                }
                $update->close();
            } else {
                // Usuario no existe - crear nuevo
                $insert = $conexion->prepare("INSERT INTO usuarios (usuario, password, nombre_completo) VALUES (?, ?, ?)");
                $insert->bind_param("sss", $usuario, $password_hash, $nombre);

                if ($insert->execute()) {
                    echo "<div class='success'>✅ Usuario <strong>$usuario</strong> creado correctamente</div>";
                    $usuarios_creados++;
                } else {
                    echo "<div class='error'>❌ Error al crear usuario $usuario: " . $insert->error . "</div>";
                }
                $insert->close();
            }

            $check->close();
        }

        // Mostrar resumen
        echo "<hr>";
        echo "<h2>📊 Resumen</h2>";
        echo "<p>✅ Usuarios nuevos creados: <strong>$usuarios_creados</strong></p>";
        echo "<p>ℹ️ Usuarios actualizados: <strong>$usuarios_existentes</strong></p>";

        // Mostrar todos los usuarios
        echo "<h2>👥 Usuarios en el sistema</h2>";
        $todos = $conexion->query("SELECT id, usuario, nombre_completo, fecha_registro FROM usuarios ORDER BY id");

        if ($todos && $todos->num_rows > 0) {
            echo "<table>";
            echo "<thead><tr><th>ID</th><th>Usuario</th><th>Nombre Completo</th><th>Fecha Registro</th></tr></thead>";
            echo "<tbody>";

            while ($row = $todos->fetch_assoc()) {
                echo "<tr>";
                echo "<td>" . $row['id'] . "</td>";
                echo "<td><strong>" . htmlspecialchars($row['usuario']) . "</strong></td>";
                echo "<td>" . htmlspecialchars($row['nombre_completo']) . "</td>";
                echo "<td>" . $row['fecha_registro'] . "</td>";
                echo "</tr>";
            }

            echo "</tbody></table>";
        }

        // Información de acceso
        echo "<div class='info'>";
        echo "<h3>🔑 Información de Acceso</h3>";
        echo "<p><strong>Contraseña para todos los usuarios:</strong> <code>password123</code></p>";
        echo "<ul>";
        echo "<li>Usuario: <code>alumno1</code> - Juan Pérez</li>";
        echo "<li>Usuario: <code>alumno2</code> - María García</li>";
        echo "<li>Usuario: <code>profesor1</code> - Dr. Carlos Rodríguez</li>";
        echo "</ul>";
        echo "</div>";

        // Verificar que el hash funciona
        echo "<h2>🔐 Verificación de Hash</h2>";
        if (password_verify($password_texto, $password_hash)) {
            echo "<div class='success'>✅ El hash de contraseña es válido y funciona correctamente</div>";
            echo "<p>Hash generado: <code>$password_hash</code></p>";
        } else {
            echo "<div class='error'>❌ Error: El hash no es válido</div>";
        }

        $conexion->close();
        ?>

        <hr>
        <h2> ¡Listo para usar!</h2>
        <p>Ahora puedes iniciar sesión en el sistema:</p>
        <a href="index.php" class="btn">Ir al Sistema</a>

        <div
            style="margin-top: 30px; padding: 15px; background: #fff3cd; border-left: 4px solid #ffc107; border-radius: 5px;">
            <strong>⚠️ Importante:</strong> Puedes ejecutar este script las veces que necesites.
            Si los usuarios ya existen, simplemente actualizará sus contraseñas a <code>password123</code>
        </div>
    </div>
</body>

</html>