Resuelve conflictos después de git pull

This commit is contained in:
Luis.Aguilar 2025-05-16 22:41:29 -06:00
parent 29e8458d42
commit ee46d9fcf9
13 changed files with 2502 additions and 993 deletions

115
api/alumnos-cursos.php Normal file
View File

@ -0,0 +1,115 @@
<?php
header('Content-Type: application/json');
require '../includes/config.php';
if (!is_logged_in()) {
http_response_code(401);
echo json_encode(['success' => false, 'error' => 'No autenticado']);
exit;
}
$method = $_SERVER['REQUEST_METHOD'];
$profesorId = $_SESSION['profesor']['id'] ?? null;
try {
switch ($method) {
case 'GET':
$alumnoId = $_GET['alumno_id'] ?? null;
if ($alumnoId) {
// Obtener cursos de un alumno específico
$query = "SELECT c.* FROM cursos c
JOIN alumnos_cursos ac ON c.id = ac.curso_id
WHERE ac.alumno_id = ? AND c.profesor_id = ?";
$stmt = $pdo->prepare($query);
$stmt->execute([$alumnoId, $profesorId]);
} else {
// Obtener todos los alumnos
$query = "SELECT * FROM alumnos";
$stmt = $pdo->prepare($query);
$stmt->execute();
}
echo json_encode([
'success' => true,
'data' => $stmt->fetchAll(PDO::FETCH_ASSOC)
]);
break;
case 'POST':
$data = json_decode(file_get_contents('php://input'), true);
$cursoId = $data['curso_id'] ?? null;
$alumnos = $data['alumnos'] ?? [];
if (empty($cursoId) || empty($alumnos)) {
http_response_code(400);
echo json_encode(['success' => false, 'error' => 'Datos incompletos']);
exit;
}
// Verificar que el curso pertenece al profesor
$stmt = $pdo->prepare("SELECT id FROM cursos WHERE id = ? AND profesor_id = ?");
$stmt->execute([$cursoId, $profesorId]);
if (!$stmt->fetch()) {
http_response_code(403);
echo json_encode(['success' => false, 'error' => 'No autorizado']);
exit;
}
foreach ($alumnos as $alumnoId) {
$stmt = $pdo->prepare("
INSERT INTO alumnos_cursos (alumno_id, curso_id, estado)
VALUES (?, ?, 'cursando')
ON DUPLICATE KEY UPDATE estado = 'cursando'
");
$stmt->execute([$alumnoId, $cursoId]);
}
echo json_encode([
'success' => true,
'message' => 'Alumnos asignados correctamente'
]);
break;
case 'DELETE':
$alumnoId = $_GET['alumno_id'] ?? null;
$cursoId = $_GET['curso_id'] ?? null;
if (!$alumnoId || !$cursoId) {
http_response_code(400);
echo json_encode(['success' => false, 'error' => 'IDs requeridos']);
exit;
}
// Verificar que el curso pertenece al profesor
$stmt = $pdo->prepare("SELECT id FROM cursos WHERE id = ? AND profesor_id = ?");
$stmt->execute([$cursoId, $profesorId]);
if (!$stmt->fetch()) {
http_response_code(403);
echo json_encode(['success' => false, 'error' => 'No autorizado']);
exit;
}
// Eliminar asignación
$stmt = $pdo->prepare("DELETE FROM alumnos_cursos WHERE alumno_id = ? AND curso_id = ?");
$stmt->execute([$alumnoId, $cursoId]);
echo json_encode([
'success' => true,
'message' => 'Alumno desvinculado del curso correctamente'
]);
break;
default:
http_response_code(405);
echo json_encode(['success' => false, 'error' => 'Método no permitido']);
}
} catch (PDOException $e) {
http_response_code(500);
echo json_encode(['success' => false, 'error' => 'Error en la base de datos: ' . $e->getMessage()]);
}
?>

121
api/alumnos.php Normal file
View File

@ -0,0 +1,121 @@
<?php
header('Content-Type: application/json');
require '../includes/config.php';
if (!is_logged_in()) {
http_response_code(401);
echo json_encode(['success' => false, 'error' => 'No autenticado']);
exit;
}
$method = $_SERVER['REQUEST_METHOD'];
try {
switch ($method) {
case 'GET':
// Obtener todos los alumnos
$query = "SELECT * FROM alumnos ORDER BY nombre ASC";
$stmt = $pdo->prepare($query);
$stmt->execute();
$alumnos = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo json_encode([
'success' => true,
'data' => $alumnos,
'count' => count($alumnos)
]);
break;
case 'POST':
$data = json_decode(file_get_contents('php://input'), true);
if (empty($data['nombre']) || empty($data['email'])) {
http_response_code(400);
echo json_encode(['success' => false, 'error' => 'Nombre y email son requeridos']);
exit;
}
$stmt = $pdo->prepare("
INSERT INTO alumnos (nombre, email, telefono)
VALUES (?, ?, ?)
");
$stmt->execute([
$data['nombre'],
$data['email'],
$data['telefono'] ?? null
]);
echo json_encode([
'success' => true,
'id' => $pdo->lastInsertId(),
'message' => 'Alumno creado exitosamente'
]);
break;
case 'PUT':
$data = json_decode(file_get_contents('php://input'), true);
if (empty($data['id']) || empty($data['nombre']) || empty($data['email'])) {
http_response_code(400);
echo json_encode(['success' => false, 'error' => 'Datos incompletos']);
exit;
}
$stmt = $pdo->prepare("
UPDATE alumnos SET
nombre = ?,
email = ?,
telefono = ?
WHERE id = ?
");
$stmt->execute([
$data['nombre'],
$data['email'],
$data['telefono'] ?? null,
$data['id']
]);
echo json_encode([
'success' => true,
'message' => 'Alumno actualizado exitosamente'
]);
break;
case 'DELETE':
$id = $_GET['id'] ?? null;
if (!$id) {
http_response_code(400);
echo json_encode(['success' => false, 'error' => 'ID de alumno no proporcionado']);
exit;
}
// Verificar si el alumno está asignado a algún curso primero
$stmt = $pdo->prepare("SELECT COUNT(*) FROM alumnos_cursos WHERE alumno_id = ?");
$stmt->execute([$id]);
$tieneCursos = $stmt->fetchColumn();
if ($tieneCursos > 0) {
http_response_code(400);
echo json_encode(['success' => false, 'error' => 'No se puede eliminar, el alumno está asignado a cursos']);
exit;
}
$stmt = $pdo->prepare("DELETE FROM alumnos WHERE id = ?");
$stmt->execute([$id]);
echo json_encode([
'success' => true,
'message' => 'Alumno eliminado exitosamente'
]);
break;
default:
http_response_code(405);
echo json_encode(['success' => false, 'error' => 'Método no permitido']);
}
} catch (PDOException $e) {
http_response_code(500);
echo json_encode(['success' => false, 'error' => 'Error en la base de datos: ' . $e->getMessage()]);
}
?>

View File

@ -9,30 +9,123 @@ if (!is_logged_in()) {
}
$method = $_SERVER['REQUEST_METHOD'];
$profesorId = $_SESSION['profesor']['id'];
switch ($method) {
case 'GET':
$stmt = $pdo->query("SELECT * FROM cursos");
echo json_encode($stmt->fetchAll());
try {
$query = "SELECT * FROM cursos WHERE profesor_id = ?";
$stmt = $pdo->prepare($query);
$stmt->execute([$profesorId]);
echo json_encode($stmt->fetchAll());
} catch (PDOException $e) {
http_response_code(500);
echo json_encode(['error' => 'Error al cargar cursos']);
}
break;
case 'POST':
$data = json_decode(file_get_contents('php://input'), true);
$stmt = $pdo->prepare("
INSERT INTO cursos (nombre, tipo, competencias)
VALUES (?, ?, ?)
");
$stmt->execute([
$data['nombre'],
$data['tipo'],
$data['competencias'] ?? null
]);
if (empty($data['nombre']) || empty($data['tipo'])) {
http_response_code(400);
echo json_encode(['error' => 'Nombre y tipo son requeridos']);
exit;
}
echo json_encode(['success' => true, 'id' => $pdo->lastInsertId()]);
try {
$stmt = $pdo->prepare("
INSERT INTO cursos (nombre, descripcion, tipo, estado, profesor_id)
VALUES (?, ?, ?, 'activo', ?)
");
$stmt->execute([
$data['nombre'],
$data['descripcion'] ?? null,
$data['tipo'],
$profesorId
]);
echo json_encode(['success' => true, 'id' => $pdo->lastInsertId()]);
} catch (PDOException $e) {
http_response_code(500);
echo json_encode(['error' => 'Error al crear curso']);
}
break;
case 'PUT':
$data = json_decode(file_get_contents('php://input'), true);
if (empty($data['id']) || empty($data['nombre']) || empty($data['tipo'])) {
http_response_code(400);
echo json_encode(['error' => 'Datos incompletos']);
exit;
}
try {
// Verificar que el curso pertenece al profesor
$stmt = $pdo->prepare("SELECT id FROM cursos WHERE id = ? AND profesor_id = ?");
$stmt->execute([$data['id'], $profesorId]);
if (!$stmt->fetch()) {
http_response_code(403);
echo json_encode(['error' => 'No autorizado']);
exit;
}
$stmt = $pdo->prepare("
UPDATE cursos SET
nombre = ?,
descripcion = ?,
tipo = ?,
estado = ?
WHERE id = ?
");
$stmt->execute([
$data['nombre'],
$data['descripcion'] ?? null,
$data['tipo'],
$data['estado'] ?? 'activo',
$data['id']
]);
echo json_encode(['success' => true]);
} catch (PDOException $e) {
http_response_code(500);
echo json_encode(['error' => 'Error al actualizar curso']);
}
break;
case 'DELETE':
$id = $_GET['id'] ?? null;
if (!$id) {
http_response_code(400);
echo json_encode(['error' => 'ID de curso no proporcionado']);
exit;
}
try {
// Verificar que el curso pertenece al profesor
$stmt = $pdo->prepare("SELECT id FROM cursos WHERE id = ? AND profesor_id = ?");
$stmt->execute([$id, $profesorId]);
if (!$stmt->fetch()) {
http_response_code(403);
echo json_encode(['error' => 'No autorizado']);
exit;
}
$stmt = $pdo->prepare("DELETE FROM cursos WHERE id = ?");
$stmt->execute([$id]);
echo json_encode(['success' => true]);
} catch (PDOException $e) {
http_response_code(500);
echo json_encode(['error' => 'Error al eliminar curso']);
}
break;
default:
http_response_code(405);
echo json_encode(['error' => 'Método no permitido']);
}
}
?>

44
api/diploma.php Normal file
View File

@ -0,0 +1,44 @@
<?php
header('Content-Type: application/json');
require '../includes/config.php';
if (!is_logged_in()) {
http_response_code(401);
echo json_encode(['error' => 'No autenticado']);
exit;
}
try {
$profesorId = $_GET['profesor_id'] ?? null;
$query = "
SELECT d.*, a.nombre AS alumno_nombre, c.nombre AS curso_nombre
FROM diplomas d
JOIN alumnos_cursos ac ON d.alumno_curso_id = ac.id
JOIN alumnos a ON ac.alumno_id = a.id
JOIN cursos c ON ac.curso_id = c.id
";
$params = [];
if ($profesorId) {
$query .= " WHERE c.profesor_id = ?";
$params[] = $profesorId;
}
$query .= " ORDER BY d.fecha_emision DESC";
$stmt = $pdo->prepare($query);
$stmt->execute($params);
$diplomas = $stmt->fetchAll();
echo json_encode([
'success' => true,
'data' => $diplomas,
'count' => count($diplomas)
]);
} catch (Exception $e) {
http_response_code(500);
echo json_encode(['success' => false, 'error' => $e->getMessage()]);
}
?>

View File

@ -2,80 +2,55 @@
header('Content-Type: application/json');
require '../includes/config.php';
// Habilitar reporte de errores para depuración (quitar en producción)
error_reporting(E_ALL);
ini_set('display_errors', 1);
// Verificar si la solicitud es POST
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
http_response_code(405);
echo json_encode(['success' => false, 'message' => 'Método no permitido']);
exit;
}
// Obtener datos del formulario
$username = trim($_POST['username'] ?? '');
$email = trim($_POST['email'] ?? '');
$password = $_POST['password'] ?? '';
// Validaciones básicas
if (empty($username) || empty($password)) {
echo json_encode(['success' => false, 'message' => 'Usuario y contraseña son requeridos']);
if (empty($email) || empty($password)) {
echo json_encode(['success' => false, 'message' => 'Email y contraseña son requeridos']);
exit;
}
try {
// Buscar usuario en la base de datos
$stmt = $pdo->prepare("SELECT * FROM usuarios WHERE username = ?");
$stmt->execute([$username]);
$user = $stmt->fetch();
// Buscar profesor en la base de datos
$stmt = $pdo->prepare("SELECT * FROM usuarios WHERE email = ? AND aprobado = 1");
$stmt->execute([$email]);
$profesor = $stmt->fetch();
if (!$user) {
echo json_encode(['success' => false, 'message' => 'Usuario no encontrado']);
if (!$profesor) {
echo json_encode(['success' => false, 'message' => 'Profesor no encontrado o no aprobado']);
exit;
}
// Verificar contraseña
if (!password_verify($password, $user['password'])) {
if (!password_verify($password, $profesor['password'])) {
echo json_encode(['success' => false, 'message' => 'Contraseña incorrecta']);
exit;
}
// Obtener cursos del usuario
$stmt = $pdo->prepare("
SELECT c.*, uc.estado, uc.fecha_inicio, uc.fecha_fin, uc.profesor
FROM usuario_cursos uc
JOIN cursos c ON uc.curso_id = c.id
WHERE uc.usuario_id = ?
");
$stmt->execute([$user['id']]);
$cursos = $stmt->fetchAll();
// Configurar sesión de usuario
$_SESSION['user'] = [
'id' => $user['id'],
'username' => $user['username'],
'nombre' => $user['nombre'],
'email' => $user['email'],
'rol' => $user['rol'],
'cursos' => $cursos
// Configurar sesión de profesor
$_SESSION['profesor'] = [
'id' => $profesor['id'],
'nombre' => $profesor['nombre'],
'email' => $profesor['email']
];
// Respuesta exitosa
echo json_encode([
'success' => true,
'redirect' => 'dashboard.php',
'user' => [
'id' => $user['id'],
'nombre' => $user['nombre'],
'rol' => $user['rol']
]
]);
'success' => true,
'redirect' => 'dashboard.php',
'profesor_id' => $profesor['id']
]);
} catch (PDOException $e) {
// Registrar error en archivo de log
error_log('Error en login.php: ' . $e->getMessage());
// Respuesta de error genérico (no mostrar detalles internos al usuario)
echo json_encode([
'success' => false,
'message' => 'Error en el servidor. Por favor, intente más tarde.'

View File

@ -0,0 +1,77 @@
/* Badges de cursos */
.course-badges {
display: flex;
flex-wrap: wrap;
gap: 0.5rem;
}
.course-badge {
display: inline-flex;
align-items: center;
background-color: #e0e7ff;
color: #2563eb;
padding: 0.25rem 0.5rem;
border-radius: 12px;
font-size: 0.85rem;
}
.badge-remove {
background: none;
border: none;
color: #2563eb;
margin-left: 0.25rem;
cursor: pointer;
font-size: 1rem;
line-height: 1;
padding: 0 0.25rem;
}
.badge-remove:hover {
color: #1e40af;
}
/* Loader pequeño */
.loader-sm {
display: inline-block;
width: 16px;
height: 16px;
border: 2px solid #e2e8f0;
border-radius: 50%;
border-top-color: #2563eb;
animation: spin 1s linear infinite;
}
@keyframes spin {
to {
transform: rotate(360deg);
}
}
/* Modal de asignación */
.form-select {
width: 100%;
padding: 0.75rem;
border: 1px solid #e2e8f0;
border-radius: 6px;
margin-bottom: 1rem;
font-family: "Inter", sans-serif;
}
/* Header acciones */
.header-actions {
display: flex;
gap: 1rem;
align-items: center;
}
@media (max-width: 768px) {
.header-actions {
flex-direction: column;
align-items: flex-start;
width: 100%;
}
.search-box {
width: 100%;
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -2,7 +2,36 @@
include 'includes/config.php';
redirect_if_not_logged_in();
$user = $_SESSION['user'];
$profesor = $_SESSION['profesor'];
// Obtener estadísticas directamente desde PHP
$stmt = $pdo->prepare("
SELECT COUNT(*) as total FROM cursos
WHERE profesor_id = ? AND estado = 'activo'
");
$stmt->execute([$profesor['id']]);
$cursos_activos = $stmt->fetch()['total'];
$stmt = $pdo->prepare("
SELECT COUNT(DISTINCT a.id) as total
FROM alumnos a
JOIN alumnos_cursos ac ON a.id = ac.alumno_id
JOIN cursos c ON ac.curso_id = c.id
WHERE c.profesor_id = ?
");
$stmt->execute([$profesor['id']]);
$alumnos_registrados = $stmt->fetch()['total'];
$stmt = $pdo->prepare("
SELECT COUNT(*) as total
FROM diplomas d
JOIN alumnos_cursos ac ON d.alumno_curso_id = ac.id
JOIN cursos c ON ac.curso_id = c.id
WHERE c.profesor_id = ?
");
$stmt->execute([$profesor['id']]);
$diplomas_emitidos = $stmt->fetch()['total'];
?>
<!DOCTYPE html>
<html lang="es">
@ -11,24 +40,25 @@ $user = $_SESSION['user'];
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>DiploMaster - Panel</title>
<link rel="stylesheet" href="assets/css/styles.css">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap" rel="stylesheet">
</head>
<body>
<body class="admin">
<div id="app-content">
<header>
<h1>DiploMaster</h1>
<div id="user-info">
<span id="current-user"><?= htmlspecialchars($user['nombre']) ?></span>
</div>
<div id="profesor-info">
<div id="current-profesor" data-id="<?= $profesor['id'] ?>"></div>
<span><?= htmlspecialchars($profesor['nombre']) ?></span>
</div>
</header>
<div class="main-container">
<div class="sidebar" id="sidebar">
<ul class="sidebar-menu">
<li class="active" data-section="dashboard"><span>Inicio</span></li>
<li data-section="courses"><span>Gestión de Cursos</span></li>
<li data-section="students"><span>Gestión de Estudiantes</span></li>
<li data-section="diplomas"><span>Diplomas</span></li>
<li class="active" data-section="dashboard"><span>🏠 Inicio</span></li>
<li data-section="courses"><span>📚 Mis Cursos</span></li>
<li data-section="students"><span>👨‍🎓 Gestión de Alumnos</span></li>
<li data-section="diplomas"><span>🎓 Diplomas Emitidos</span></li>
<li><a href="api/logout.php" class="logout-link">Cerrar sesión</a></li>
</ul>
</div>
@ -36,13 +66,13 @@ $user = $_SESSION['user'];
<div class="content" id="main-content">
<div id="dashboard-content" class="content-section active">
<div class="card">
<h2>Panel de Administración</h2>
<p>Bienvenido al sistema de gestión de DiploMaster</p>
<h2>Bienvenido <?= htmlspecialchars($profesor['nombre']) ?></h2>
<p>Este es tu panel de gestión de DiploMaster</p>
<div class="stats">
<p><strong>Estadísticas:</strong></p>
<p> <span id="active-courses-count">0</span> cursos activos</p>
<p> <span id="students-count">0</span> estudiantes registrados</p>
<p> <span id="diplomas-count">0</span> diplomas emitidos</p>
<p><strong>Resumen:</strong></p>
<p> <span id="active-courses-count"><?= $cursos_activos ?></span> cursos activos</p>
<p> <span id="students-count"><?= $alumnos_registrados ?></span> alumnos registrados</p>
<p> <span id="diplomas-count"><?= $diplomas_emitidos ?></span> diplomas emitidos</p>
</div>
</div>
</div>

14
hash.php Normal file
View File

@ -0,0 +1,14 @@
<?php
$contraseña = "1234";
$hash = password_hash($contraseña, PASSWORD_DEFAULT);
echo "Contraseña original: " . $contraseña . "<br>";
echo "Hash generado: " . $hash . "<br>";
// Verificación
if (password_verify($contraseña, $hash)) {
echo "✅ La contraseña coincide con el hash!";
} else {
echo "❌ La contraseña NO coincide";
}
?>

View File

@ -21,7 +21,7 @@ try {
}
function is_logged_in() {
return isset($_SESSION['user']);
return isset($_SESSION['profesor']);
}
function redirect_if_not_logged_in() {
@ -29,5 +29,4 @@ function redirect_if_not_logged_in() {
header('Location: index.php');
exit;
}
}
?>
}

View File

@ -17,14 +17,14 @@
</svg>
<h1>DiploMaster</h1>
</div>
<p class="welcome-text">Bienvenido al sistema de diplomas</p>
<p class="welcome-text">Sistema de gestión de diplomas para profesores</p>
<form id="loginForm" action="api/login.php" method="POST">
<div class="input-group">
<svg class="input-icon" viewBox="0 0 24 24">
<path fill="currentColor" d="M12,4A4,4 0 0,1 16,8A4,4 0 0,1 12,12A4,4 0 0,1 8,8A4,4 0 0,1 12,4M12,14C16.42,14 20,15.79 20,18V20H4V18C4,15.79 7.58,14 12,14Z"/>
</svg>
<input type="text" id="username" name="username" placeholder="Usuario" required>
<input type="email" id="email" name="email" placeholder="Email" required>
</div>
<div class="input-group">
@ -40,11 +40,6 @@
<path fill="currentColor" d="M4,11V13H16L10.5,18.5L11.92,19.92L19.84,12L11.92,4.08L10.5,5.5L16,11H4Z"/>
</svg>
</button>
<div class="footer-links">
<a href="#">¿Olvidaste tu contraseña?</a>
<a href="#">Registrarse</a>
</div>
</form>
</div>
</div>

View File

@ -1,94 +1,75 @@
-- Crear la base de datos
CREATE DATABASE IF NOT EXISTS diplomaster;
USE diplomaster;
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
START TRANSACTION;
SET time_zone = "+00:00";
CREATE database diplomaster;
use diplomaster;
CREATE TABLE `cursos` (
`id` int(11) NOT NULL,
`nombre` varchar(100) NOT NULL,
`tipo` enum('pildora','inyeccion','tratamiento') NOT NULL,
`competencias` text DEFAULT NULL,
`fecha_creacion` timestamp NOT NULL DEFAULT current_timestamp()
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
INSERT INTO `cursos` (`id`, `nombre`, `tipo`, `competencias`, `fecha_creacion`) VALUES
(1, 'Seguridad Informática', 'tratamiento', 'Análisis de datos, Comunicación efectiva', '2025-05-05 01:27:58'),
(2, 'Introducción a Python', 'pildora', NULL, '2025-05-05 01:27:58'),
(3, 'Machine Learning Avanzado', 'tratamiento', 'Modelado predictivo, Python', '2025-05-05 01:27:58');
-- Tabla de usuarios (profesores)
CREATE TABLE `usuarios` (
`id` int(11) NOT NULL,
`username` varchar(50) NOT NULL,
`password` varchar(255) NOT NULL,
`nombre` varchar(100) NOT NULL,
`email` varchar(100) NOT NULL,
`rol` enum('admin','user') NOT NULL DEFAULT 'user',
`fecha_registro` timestamp NOT NULL DEFAULT current_timestamp()
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
`id` INT(11) NOT NULL AUTO_INCREMENT,
`nombre` VARCHAR(100) NOT NULL,
`email` VARCHAR(100) UNIQUE NOT NULL,
`password` VARCHAR(255) NOT NULL,
`aprobado` BOOLEAN NOT NULL DEFAULT 1,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Tabla de cursos
CREATE TABLE `cursos` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`nombre` VARCHAR(100) NOT NULL,
`descripcion` VARCHAR(250) DEFAULT NULL,
`estado` ENUM('activo', 'completado', 'archivado') NOT NULL DEFAULT 'activo',
`tipo` ENUM('inyeccion', 'pildora', 'tratamiento') NOT NULL,
`profesor_id` INT(11) NOT NULL,
PRIMARY KEY (`id`),
FOREIGN KEY (`profesor_id`) REFERENCES `usuarios`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Tabla de alumnos
CREATE TABLE `alumnos` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`nombre` VARCHAR(100) NOT NULL,
`email` VARCHAR(100) UNIQUE NOT NULL,
`telefono` VARCHAR(15) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `usuarios` (`id`, `username`, `password`, `nombre`, `email`, `rol`, `fecha_registro`) VALUES
(1, 'admin', '$2y$10$H3tCRUt444g0jo996uiKXenINy2d84FfuwQhoDBfa3tNblZLtNZpK', 'Administrador', 'admin@diplomaster.com', 'admin', '2025-05-05 01:27:58'),
(2, 'usuario1', '$2y$10$SjyU29E200ax73/m0NTjqe0sMLmpsPBThlIUucGKyxvqh/znHiwh.', 'Juan Pérez', 'juan@example.com', 'user', '2025-05-05 01:27:58');
-- Tabla para vincular alumnos con cursos
CREATE TABLE `alumnos_cursos` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`alumno_id` INT(11) NOT NULL,
`curso_id` INT(11) NOT NULL,
`estado` ENUM('cursando', 'aprobado', 'reprobado') NOT NULL DEFAULT 'cursando',
PRIMARY KEY (`id`),
FOREIGN KEY (`alumno_id`) REFERENCES `alumnos`(`id`) ON DELETE CASCADE,
FOREIGN KEY (`curso_id`) REFERENCES `cursos`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Tabla de diplomas
CREATE TABLE `diplomas` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`alumno_curso_id` INT(11) NOT NULL,
`codigo_unico` VARCHAR(20) NOT NULL UNIQUE,
`fecha_emision` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
FOREIGN KEY (`alumno_curso_id`) REFERENCES `alumnos_cursos`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Datos iniciales
INSERT INTO `usuarios` (`nombre`, `email`, `password`, `aprobado`) VALUES
('Profesor Demo', 'profesor@demo.com', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 1);
CREATE TABLE `usuario_cursos` (
`id` int(11) NOT NULL,
`usuario_id` int(11) NOT NULL,
`curso_id` int(11) NOT NULL,
`estado` enum('En progreso','Aprobado','Completado') NOT NULL DEFAULT 'En progreso',
`fecha_inicio` date DEFAULT NULL,
`fecha_fin` date DEFAULT NULL,
`profesor` varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
INSERT INTO `cursos` (`nombre`, `descripcion`, `estado`, `tipo`, `profesor_id`) VALUES
('Curso Básico', 'Curso introductorio', 'activo', 'inyeccion', 1),
('Curso Avanzado', 'Para alumnos avanzados', 'activo', 'tratamiento', 1);
INSERT INTO `alumnos` (`nombre`, `email`, `telefono`) VALUES
('Alumno Uno', 'alumno1@demo.com', '123456789'),
('Alumno Dos', 'alumno2@demo.com', '987654321');
INSERT INTO `alumnos_cursos` (`alumno_id`, `curso_id`, `estado`) VALUES
(1, 1, 'aprobado'),
(2, 1, 'cursando'),
(1, 2, 'cursando');
INSERT INTO `usuario_cursos` (`id`, `usuario_id`, `curso_id`, `estado`, `fecha_inicio`, `fecha_fin`, `profesor`) VALUES
(1, 2, 1, 'Aprobado', '2023-01-15', '2023-04-20', 'Dra. Ana López'),
(2, 2, 2, 'En progreso', '2023-05-10', NULL, 'Prof. Carlos Ruiz');
ALTER TABLE `cursos`
ADD PRIMARY KEY (`id`);
ALTER TABLE `usuarios`
ADD PRIMARY KEY (`id`),
ADD UNIQUE KEY `username` (`username`),
ADD UNIQUE KEY `email` (`email`);
ALTER TABLE `usuario_cursos`
ADD PRIMARY KEY (`id`),
ADD KEY `usuario_id` (`usuario_id`),
ADD KEY `curso_id` (`curso_id`);
ALTER TABLE `cursos`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4;
ALTER TABLE `usuarios`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;
ALTER TABLE `usuario_cursos`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;
ALTER TABLE `usuario_cursos`
ADD CONSTRAINT `usuario_cursos_ibfk_1` FOREIGN KEY (`usuario_id`) REFERENCES `usuarios` (`id`),
ADD CONSTRAINT `usuario_cursos_ibfk_2` FOREIGN KEY (`curso_id`) REFERENCES `cursos` (`id`);
COMMIT;
INSERT INTO `diplomas` (`alumno_curso_id`, `codigo_unico`) VALUES
(1, 'DIPL-000001');