Resuelve conflictos después de git pull
This commit is contained in:
parent
29e8458d42
commit
ee46d9fcf9
|
@ -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()]);
|
||||
}
|
||||
?>
|
|
@ -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()]);
|
||||
}
|
||||
?>
|
119
api/cursos.php
119
api/cursos.php
|
@ -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']);
|
||||
}
|
||||
}
|
||||
?>
|
|
@ -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()]);
|
||||
}
|
||||
?>
|
|
@ -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.'
|
||||
|
|
|
@ -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
1649
assets/js/main.js
1649
assets/js/main.js
File diff suppressed because it is too large
Load Diff
|
@ -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>
|
||||
|
|
|
@ -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";
|
||||
}
|
||||
?>
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
?>
|
||||
}
|
|
@ -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>
|
||||
|
|
|
@ -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');
|
Loading…
Reference in New Issue